ZGlmZiAtLWdpdCBhL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vcG9tLnhtbCBiL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWU1NjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9wb20ueG1sCkBAIC0wLDAgKzEsMTA5IEBACis8IS0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSBjb250cmlidXRvciAKKyAgICBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgCisgICAgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIAorICAgIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIAorICAgIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgCisgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCAKKyAgICBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIAorICAgIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgCisgICAgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIAorICAgIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisKKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+ZmVsaXgtcGFyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vLi4vcG9tL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPm9yZy5hcGFjaGUuZmVsaXgud2ViY29uc29sZS5wbHVnaW5zLnVzZXJhZG1pbjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmJ1bmRsZTwvcGFja2FnaW5nPgorICAgIDx2ZXJzaW9uPjAuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorCisgICAgPG5hbWU+QXBhY2hlIEZlbGl4IFdlYiBDb25zb2xlIFVzZXIgQWRtaW4gUGx1Z2luPC9uYW1lPgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgVGhpcyBpcyBhIHBsdWdpbiBmb3IgdGhlIEFwYWNoZSBGZWxpeCBPU0dpIHdlYiBjb25zb2xlIGZvciBkaXNwbGF5aW5nL21hbmFnaW5nIE9TR2kgVXNlcnMgYW5kIEdyb3Vwcy4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPHNjbT4KKyAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2ZlbGl4L3RydW5rL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW48L2Nvbm5lY3Rpb24+CisgICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvZmVsaXgvdHJ1bmsvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2ZlbGl4L3RydW5rL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW48L3VybD4KKyAgICA8L3NjbT4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8IS0tIHRyYW5zbGF0ZSBVVEYtOCBlbmNvZGVkIHByb3BlcnRpZXMgZmlsZXMgdG8gSVNPLTg4NTktMSAtLT4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmF0aXZlMmFzY2lpLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAtYmV0YS0xPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPm5hdGl2ZTJhc2NpaTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW5jb2Rpbmc+VVRGLTg8L2VuY29kaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zLjQ8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGluc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtU3ltYm9saWNOYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7cHJvamVjdC5hcnRpZmFjdElkfQorICAgICAgICAgICAgICAgICAgICAgICAgPC9CdW5kbGUtU3ltYm9saWNOYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1BY3RpdmF0b3I+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5mZWxpeC53ZWJjb25zb2xlLnBsdWdpbnMudXNlcmFkbWluLmludGVybmFsLkFjdGl2YXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgPC9CdW5kbGUtQWN0aXZhdG9yPgorICAgICAgICAgICAgICAgICAgICAgICAgPEluY2x1ZGUtUmVzb3VyY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdmVuLXJlc291cmNlc30sT1NHSS1JTkY9dGFyZ2V0L2NsYXNzZXMvT1NHSS1JTkYKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvSW5jbHVkZS1SZXNvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9zZ2k8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcub3NnaS5jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+NC4wLjA8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9zZ2k8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcub3NnaS5jb21wZW5kaXVtPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+NC4xLjA8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5hcGFjaGUuZmVsaXgud2ViY29uc29sZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjQuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5qc29uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIwMDcwODI5PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvTUVUQS1JTkYvREVQRU5ERU5DSUVTIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvTUVUQS1JTkYvREVQRU5ERU5DSUVTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNzNjOGQKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9NRVRBLUlORi9ERVBFTkRFTkNJRVMKQEAgLTAsMCArMSwyOSBAQAorCitJLiBJbmNsdWRlZCBTb2Z0d2FyZQorCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0CitUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgorTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIDIuMC4KKworCitJSS4gVXNlZCBTb2Z0d2FyZQorCitUaGlzIHByb2R1Y3QgdXNlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQKK2pzVHJlZSAoaHR0cDovL2pzdHJlZS5jb20vKS4KK0NvcHlyaWdodCAoYykgMjAwOSBJdmFuIEJvemhhbm92ICh2YWthdGEuY29tKQorTGljZW5zZWQgdW5kZXIgVGhlIE1JVCBMaWNlbnNlIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocCkKKworVGhpcyBwcm9kdWN0IHVzZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0CitDcnlwdG9KUyAoaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy8pLgorQ29weXJpZ2h0IKkgMjAwOZYyMDEyIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KK0xpY2Vuc2VkIHVuZGVyIE5ldyBCU0QgTGljZW5zZQorCitUaGlzIHByb2R1Y3QgdXNlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQKK0pTT04uanMgKGh0dHBzOi8vZ2l0aHViLmNvbS9kb3VnbGFzY3JvY2tmb3JkL0pTT04tanMpLgorQXZhaWxhYmxlIGFzIFB1YmxpYyBEb21haW4gY29kZQorCitJSUkuIExpY2Vuc2UgU3VtbWFyeQorLSBBcGFjaGUgTGljZW5zZSAyLjAKKy0gVGhlIE1JVCBMaWNlbnNlCistIE5ldyBCU0QgTGljZW5zZQorLSBQdWJsaWMgRG9tYWluCmRpZmYgLS1naXQgYS93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9mZWxpeC93ZWJjb25zb2xlL3BsdWdpbnMvdXNlcmFkbWluL2ludGVybmFsL0FjdGl2YXRvci5qYXZhIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZmVsaXgvd2ViY29uc29sZS9wbHVnaW5zL3VzZXJhZG1pbi9pbnRlcm5hbC9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDI4NDI4Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZmVsaXgvd2ViY29uc29sZS9wbHVnaW5zL3VzZXJhZG1pbi9pbnRlcm5hbC9BY3RpdmF0b3IuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5mZWxpeC53ZWJjb25zb2xlLnBsdWdpbnMudXNlcmFkbWluLmludGVybmFsOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmZlbGl4LndlYmNvbnNvbGUuU2ltcGxlV2ViQ29uc29sZVBsdWdpbjsNCitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsNCitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQoraW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOw0KK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZ2lzdHJhdGlvbjsNCitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS51c2VyYWRtaW4uVXNlckFkbWluOw0KK2ltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7DQoraW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXI7DQorDQorLyoqDQorICogQWN0aXZhdG9yIGlzIHRoZSBtYWluIHN0YXJ0aW5nIGNsYXNzLg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IsIFNlcnZpY2VUcmFja2VyQ3VzdG9taXplcg0KK3sNCisNCisgICAgcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlciB0cmFja2VyOw0KKyAgICBwcml2YXRlIEJ1bmRsZUNvbnRleHQgY29udGV4dDsNCisNCisgICAgcHJpdmF0ZSBTaW1wbGVXZWJDb25zb2xlUGx1Z2luIHBsdWdpbjsNCisgICAgcHJpdmF0ZSBTZXJ2aWNlUmVnaXN0cmF0aW9uIHByaW50ZXJSZWdpc3RyYXRpb247DQorDQorICAgIC8qKg0KKyAgICAgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24NCisgICAgew0KKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsNCisgICAgICAgIHRoaXMudHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihjb250ZXh0LCBVc2VyQWRtaW4uY2xhc3MuZ2V0TmFtZSgpLCB0aGlzKTsNCisgICAgICAgIHRoaXMudHJhY2tlci5vcGVuKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQ0KKyAgICAgKi8NCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24NCisgICAgew0KKyAgICAgICAgaWYgKHRyYWNrZXIgIT0gbnVsbCkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0cmFja2VyLmNsb3NlKCk7DQorICAgICAgICAgICAgdHJhY2tlciA9IG51bGw7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLy8gLSBiZWdpbiB0cmFja2VyDQorICAgIC8qKg0KKyAgICAgKiBAc2VlIG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXIjbW9kaWZpZWRTZXJ2aWNlKG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlLA0KKyAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QpDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtb2RpZmllZFNlcnZpY2UoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UsIE9iamVjdCBzZXJ2aWNlKQ0KKyAgICB7LyogdW51c2VkICovDQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEBzZWUgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyQ3VzdG9taXplciNhZGRpbmdTZXJ2aWNlKG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlKQ0KKyAgICAgKi8NCisgICAgcHVibGljIGZpbmFsIE9iamVjdCBhZGRpbmdTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlKQ0KKyAgICB7DQorICAgICAgICBTaW1wbGVXZWJDb25zb2xlUGx1Z2luIHBsdWdpbiA9IHRoaXMucGx1Z2luOw0KKyAgICAgICAgaWYgKHBsdWdpbiA9PSBudWxsKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZpbmFsIFVzZXJBZG1pbiBzZXJ2aWNlID0gKFVzZXJBZG1pbikgY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7DQorICAgICAgICAgICAgdGhpcy5wbHVnaW4gPSBuZXcgV2ViQ29uc29sZVBsdWdpbihzZXJ2aWNlKS5yZWdpc3Rlcihjb250ZXh0KTsNCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHByaW50ZXJSZWdpc3RyYXRpb24gPSBjb250ZXh0LnJlZ2lzdGVyU2VydmljZShDb25maWd1cmF0aW9uUHJpbnRlci5TRVJWSUNFLA0KKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnRDb25maWd1cmF0aW9uUHJpbnRlcihzZXJ2aWNlKSwgbnVsbCk7DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEBzZWUgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyQ3VzdG9taXplciNyZW1vdmVkU2VydmljZShvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZSwNCisgICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQ0KKyAgICAgKi8NCisgICAgcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlZFNlcnZpY2UoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UsIE9iamVjdCBzZXJ2aWNlKQ0KKyAgICB7DQorICAgICAgICBTaW1wbGVXZWJDb25zb2xlUGx1Z2luIHBsdWdpbiA9IHRoaXMucGx1Z2luOw0KKw0KKyAgICAgICAgaWYgKHRyYWNrZXIuc2l6ZSgpIDw9IDEgJiYgcGx1Z2luICE9IG51bGwpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gcmVtb3ZlIHNlcnZpY2UNCisgICAgICAgICAgICBwbHVnaW4udW5yZWdpc3RlcigpOw0KKyAgICAgICAgICAgIHRoaXMucGx1Z2luID0gbnVsbDsNCisgICAgICAgICAgICAvLyB1bnJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gcHJpbnRlciB0b28NCisgICAgICAgICAgICBTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZyA9IHByaW50ZXJSZWdpc3RyYXRpb247DQorICAgICAgICAgICAgaWYgKHJlZyAhPSBudWxsKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmVnLnVucmVnaXN0ZXIoKTsNCisgICAgICAgICAgICAgICAgcHJpbnRlclJlZ2lzdHJhdGlvbiA9IG51bGw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2ZlbGl4L3dlYmNvbnNvbGUvcGx1Z2lucy91c2VyYWRtaW4vaW50ZXJuYWwvV2ViQ29uc29sZVBsdWdpbi5qYXZhIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZmVsaXgvd2ViY29uc29sZS9wbHVnaW5zL3VzZXJhZG1pbi9pbnRlcm5hbC9XZWJDb25zb2xlUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0YmMyZAotLS0gL2Rldi9udWxsCisrKyBiL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2ZlbGl4L3dlYmNvbnNvbGUvcGx1Z2lucy91c2VyYWRtaW4vaW50ZXJuYWwvV2ViQ29uc29sZVBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLmZlbGl4LndlYmNvbnNvbGUucGx1Z2lucy51c2VyYWRtaW4uaW50ZXJuYWw7DQorDQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7DQoraW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5Ow0KK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0Ow0KK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5mZWxpeC53ZWJjb25zb2xlLlNpbXBsZVdlYkNvbnNvbGVQbHVnaW47DQoraW1wb3J0IG9yZy5qc29uLkpTT05BcnJheTsNCitpbXBvcnQgb3JnLmpzb24uSlNPTkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmpzb24uSlNPTk9iamVjdDsNCitpbXBvcnQgb3JnLmpzb24uSlNPTldyaXRlcjsNCitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS51c2VyYWRtaW4uR3JvdXA7DQoraW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UudXNlcmFkbWluLlJvbGU7DQoraW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UudXNlcmFkbWluLlVzZXI7DQoraW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UudXNlcmFkbWluLlVzZXJBZG1pbjsNCisNCitjbGFzcyBXZWJDb25zb2xlUGx1Z2luIGV4dGVuZHMgU2ltcGxlV2ViQ29uc29sZVBsdWdpbg0KK3sNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM1NTEwODc5NTg1OTc4MjQ1OTNMOw0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSAidXNlcnMiOyAvLyROT04tTkxTLTEkDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRSA9ICIlcm9sZS5wbHVnaW5UaXRsZSI7IC8vJE5PTi1OTFMtMSQNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENTU1tdID0geyAiLyIgKyBMQUJFTCArICIvcmVzL3BsdWdpbi5jc3MiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKw0KKyAgICBwcml2YXRlIGZpbmFsIFVzZXJBZG1pbiB1c2VyQWRtaW47DQorDQorICAgIC8vIHRlbXBsYXRlcw0KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBURU1QTEFURTsNCisNCisgICAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IgKi8NCisgICAgV2ViQ29uc29sZVBsdWdpbihVc2VyQWRtaW4gdXNlckFkbWluKQ0KKyAgICB7DQorICAgICAgICBzdXBlcihMQUJFTCwgVElUTEUsIENTUyk7DQorICAgICAgICB0aGlzLnVzZXJBZG1pbiA9IHVzZXJBZG1pbjsNCisNCisgICAgICAgIC8vIGxvYWQgdGVtcGxhdGVzDQorICAgICAgICBURU1QTEFURSA9IHJlYWRUZW1wbGF0ZUZpbGUoIi9yZXMvcGx1Z2luLmh0bWwiKTsgLy8kTk9OLU5MUy0xJA0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuZmVsaXgud2ViY29uc29sZS5BYnN0cmFjdFdlYkNvbnNvbGVQbHVnaW4jcmVuZGVyQ29udGVudChIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCByZW5kZXJDb250ZW50KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsDQorICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24NCisgICAgew0KKyAgICAgICAgcmVzcG9uc2UuZ2V0V3JpdGVyKCkucHJpbnQoVEVNUExBVEUpOw0KKyAgICB9DQorDQorICAgIHByb3RlY3RlZCB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApDQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24NCisgICAgew0KKw0KKyAgICAgICAgcmVzcC5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vanNvbiIpOyAvLyROT04tTkxTLTEkDQorICAgICAgICByZXNwLnNldENoYXJhY3RlckVuY29kaW5nKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkDQorICAgICAgICBmaW5hbCBQcmludFdyaXRlciBvdXQgPSByZXNwLmdldFdyaXRlcigpOw0KKyAgICAgICAgZmluYWwgSlNPTldyaXRlciBqdyA9IG5ldyBKU09OV3JpdGVyKG91dCk7DQorICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gcmVxLmdldFBhcmFtZXRlcigiYWN0aW9uIik7IC8vJE5PTi1OTFMtMSQNCisNCisgICAgICAgIGZpbmFsIFN0cmluZyByb2xlID0gcmVxLmdldFBhcmFtZXRlcigicm9sZSIpOyAvLyROT04tTkxTLTEkDQorICAgICAgICBmaW5hbCBTdHJpbmcgZ3JvdXAgPSByZXEuZ2V0UGFyYW1ldGVyKCJncm91cCIpOyAvLyROT04tTkxTLTEkDQorDQorICAgICAgICB0cnkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoImFkZE1lbWJlciIuZXF1YWxzKGFjdGlvbikpIHsgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICAgICBmaW5hbCBSb2xlIHhyb2xlID0gdXNlckFkbWluLmdldFJvbGUocm9sZSk7DQorICAgICAgICAgICAgICAgIGZpbmFsIEdyb3VwIHhncm91cCA9IChHcm91cCkgdXNlckFkbWluLmdldFJvbGUoZ3JvdXApOw0KKyAgICAgICAgICAgICAgICB4Z3JvdXAuYWRkTWVtYmVyKHhyb2xlKTsNCisgICAgICAgICAgICAgICAgdG9KU09OKGp3LCB4Z3JvdXAsIGZhbHNlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZiAoImFkZFJlcXVpcmVkTWVtYmVyIi5lcXVhbHMoYWN0aW9uKSkgeyAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgICAgIGZpbmFsIFJvbGUgeHJvbGUgPSB1c2VyQWRtaW4uZ2V0Um9sZShyb2xlKTsNCisgICAgICAgICAgICAgICAgZmluYWwgR3JvdXAgeGdyb3VwID0gKEdyb3VwKSB1c2VyQWRtaW4uZ2V0Um9sZShncm91cCk7DQorICAgICAgICAgICAgICAgIHhncm91cC5hZGRSZXF1aXJlZE1lbWJlcih4cm9sZSk7DQorICAgICAgICAgICAgICAgIHRvSlNPTihqdywgeGdyb3VwLCBmYWxzZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UgaWYgKCJyZW1vdmVNZW1iZXIiLmVxdWFscyhhY3Rpb24pKSB7IC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAgICAgZmluYWwgUm9sZSB4cm9sZSA9IHVzZXJBZG1pbi5nZXRSb2xlKHJvbGUpOw0KKyAgICAgICAgICAgICAgICBmaW5hbCBHcm91cCB4Z3JvdXAgPSAoR3JvdXApIHVzZXJBZG1pbi5nZXRSb2xlKGdyb3VwKTsNCisgICAgICAgICAgICAgICAgeGdyb3VwLnJlbW92ZU1lbWJlcih4cm9sZSk7DQorICAgICAgICAgICAgICAgIHRvSlNPTihqdywgeGdyb3VwLCBmYWxzZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UgaWYgKCJkZWwiLmVxdWFscyhhY3Rpb24pKSB7IC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAgICAgb3V0LnByaW50KHVzZXJBZG1pbi5yZW1vdmVSb2xlKHJvbGUpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZiAoImdldCIuZXF1YWxzKGFjdGlvbikpIHsgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICAgICBmaW5hbCBSb2xlIHhyb2xlID0gdXNlckFkbWluLmdldFJvbGUocm9sZSk7DQorICAgICAgICAgICAgICAgIHRvSlNPTihqdywgeHJvbGUsIHRydWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIGlmICgic2V0Ii5lcXVhbHMoYWN0aW9uKSkgeyAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkYXRhUmF3ID0gcmVxLmdldFBhcmFtZXRlcigiZGF0YSIpOyAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgICAgIGZpbmFsIEpTT05PYmplY3QgZGF0YSA9IG5ldyBKU09OT2JqZWN0KGRhdGFSYXcpOw0KKyAgICAgICAgICAgICAgICBSb2xlIHhyb2xlID0gdXNlckFkbWluLmdldFJvbGUoZGF0YS5nZXRTdHJpbmcoIm5hbWUiKSk7IC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0geHJvbGUpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHhyb2xlID0gdXNlckFkbWluLmNyZWF0ZVJvbGUoLy8NCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZygibmFtZSIpLCAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRJbnQoInR5cGUiKSk7IC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBkb1NldERhdGEoeHJvbGUsIGRhdGEpOw0KKyAgICAgICAgICAgICAgICBvdXQucHJpbnQodHJ1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAvLyBsaXN0IGFsbCByb2xlcyB3aXRob3V0IGRldGFpbHMNCisgICAgICAgICAgICB7DQorDQorICAgICAgICAgICAgICAgIFJvbGVbXSByb2xlcyA9IHVzZXJBZG1pbi5nZXRSb2xlcyhudWxsKTsNCisgICAgICAgICAgICAgICAgdG9KU09OKGp3LCByb2xlcywgZmFsc2UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGRvU2V0RGF0YShSb2xlIHJvbGUsIEpTT05PYmplY3QgZGF0YSkgdGhyb3dzIEpTT05FeGNlcHRpb24NCisgICAgew0KKyAgICAgICAgcHV0UHJvcHMocm9sZS5nZXRQcm9wZXJ0aWVzKCksIGRhdGEub3B0SlNPTk9iamVjdCgicHJvcGVydGllcyIpKTsgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgaWYgKHJvbGUgaW5zdGFuY2VvZiBVc2VyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHB1dFByb3BzKCgoVXNlcikgcm9sZSkuZ2V0Q3JlZGVudGlhbHMoKSwgZGF0YS5vcHRKU09OT2JqZWN0KCJjcmVkZW50aWFscyIpKTsgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgcHV0UHJvcHMoRGljdGlvbmFyeSBkZXN0LCBKU09OT2JqZWN0IHByb3BzKQ0KKyAgICAgICAgdGhyb3dzIEpTT05FeGNlcHRpb24NCisgICAgew0KKyAgICAgICAgLy8gY2xlYXIgdGhlIG9sZCBwcm9wZXJ0aWVzDQorICAgICAgICBpZiAoIWRlc3QuaXNFbXB0eSgpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGRlc3Qua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGRlc3QucmVtb3ZlKGUubmV4dEVsZW1lbnQoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgLy8gaXQncyBlbXB0eSAtIGRvbid0IHByb2Nlc3MgaXQgYXQgYWxsDQorICAgICAgICBpZiAocHJvcHMgPT0gbnVsbCB8fCBwcm9wcy5sZW5ndGgoKSA9PSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIC8vIGFwcGVuZCB0aGUgbmV3IG9uZQ0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcHJvcHMua2V5cygpOyBpLmhhc05leHQoKTspDQorICAgICAgICB7DQorICAgICAgICAgICAgT2JqZWN0IGtleSA9IGkubmV4dCgpOw0KKyAgICAgICAgICAgIE9iamVjdCB2YWwgPSBwcm9wcy5nZXQoKFN0cmluZykga2V5KTsNCisNCisgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgSlNPTkFycmF5KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFsID0gdG9BcnJheSgoSlNPTkFycmF5KSB2YWwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZXN0LnB1dChrZXksIHZhbCk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIHRvQXJyYXkoSlNPTkFycmF5IGFycmF5KSB0aHJvd3MgSlNPTkV4Y2VwdGlvbg0KKyAgICB7DQorICAgICAgICBmaW5hbCBieXRlW10gcmV0ID0gbmV3IGJ5dGVbYXJyYXkubGVuZ3RoKCldOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyBpKyspDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0W2ldID0gKGJ5dGUpIChhcnJheS5nZXRJbnQoaSkgJiAweGZmKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXQ7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCB0b0pTT04oSlNPTldyaXRlciBqdywgUm9sZSByb2xlLCBib29sZWFuIGRldGFpbHMpDQorICAgICAgICB0aHJvd3MgSlNPTkV4Y2VwdGlvbg0KKyAgICB7DQorICAgICAgICBqdy5vYmplY3QoKTsNCisgICAgICAgIGp3LmtleSgidHlwZSIpOyAvLyROT04tTkxTLTEkDQorICAgICAgICBqdy52YWx1ZShyb2xlLmdldFR5cGUoKSk7DQorICAgICAgICBqdy5rZXkoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgancudmFsdWUocm9sZS5nZXROYW1lKCkpOw0KKw0KKyAgICAgICAgaWYgKHJvbGUgaW5zdGFuY2VvZiBHcm91cCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmaW5hbCBHcm91cCBncm91cCA9IChHcm91cCkgcm9sZTsNCisgICAgICAgICAgICBSb2xlW10gcm9sZXM7DQorDQorICAgICAgICAgICAgcm9sZXMgPSBncm91cC5nZXRNZW1iZXJzKCk7DQorICAgICAgICAgICAgaWYgKG51bGwgIT0gcm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGp3LmtleSgibWVtYmVycyIpOyAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgICAgIHRvSlNPTihqdywgcm9sZXMsIGRldGFpbHMpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICByb2xlcyA9IGdyb3VwLmdldFJlcXVpcmVkTWVtYmVycygpOw0KKyAgICAgICAgICAgIGlmIChudWxsICE9IHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBqdy5rZXkoInJtZW1iZXJzIik7IC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAgICAgdG9KU09OKGp3LCByb2xlcywgZGV0YWlscyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKGRldGFpbHMpDQorICAgICAgICB7DQorICAgICAgICAgICAgRGljdGlvbmFyeSBwOw0KKyAgICAgICAgICAgIHAgPSByb2xlLmdldFByb3BlcnRpZXMoKTsNCisgICAgICAgICAgICBpZiAobnVsbCAhPSBwICYmICFwLmlzRW1wdHkoKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGp3LmtleSgicHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkDQorICAgICAgICAgICAgICAgIHRvSlNPTihqdywgcCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChyb2xlIGluc3RhbmNlb2YgVXNlcikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHAgPSAoKFVzZXIpIHJvbGUpLmdldENyZWRlbnRpYWxzKCk7DQorICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHAgJiYgIXAuaXNFbXB0eSgpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBqdy5rZXkoImNyZWRlbnRpYWxzIik7IC8vJE5PTi1OTFMtMSQNCisgICAgICAgICAgICAgICAgICAgIHRvSlNPTihqdywgcCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBqdy5lbmRPYmplY3QoKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHRvSlNPTihKU09OV3JpdGVyIGp3LCBEaWN0aW9uYXJ5IHByb3BzKQ0KKyAgICAgICAgdGhyb3dzIEpTT05FeGNlcHRpb24NCisgICAgew0KKyAgICAgICAgancub2JqZWN0KCk7DQorICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBwcm9wcy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBrZXkgPSBlLm5leHRFbGVtZW50KCk7DQorICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbCA9IHByb3BzLmdldChrZXkpOw0KKyAgICAgICAgICAgIGp3LmtleSgoU3RyaW5nKSBrZXkpOw0KKyAgICAgICAgICAgIGp3LnZhbHVlKHZhbCk7DQorICAgICAgICB9DQorICAgICAgICBqdy5lbmRPYmplY3QoKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHRvSlNPTihKU09OV3JpdGVyIGp3LCBSb2xlW10gcm9sZXMsIGJvb2xlYW4gZGV0YWlscykNCisgICAgICAgIHRocm93cyBKU09ORXhjZXB0aW9uDQorICAgIHsNCisgICAgICAgIGp3LmFycmF5KCk7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgcm9sZXMgIT0gbnVsbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyBpKyspDQorICAgICAgICB7DQorICAgICAgICAgICAgdG9KU09OKGp3LCByb2xlc1tpXSwgZGV0YWlscyk7DQorICAgICAgICB9DQorICAgICAgICBqdy5lbmRBcnJheSgpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL09TR0ktSU5GL2wxMG4vYnVuZGxlLnByb3BlcnRpZXMgYi93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9PU0dJLUlORi9sMTBuL2J1bmRsZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZmUwMDgKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9PU0dJLUlORi9sMTBuL2J1bmRsZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTQgQEAKK++7vyNMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyMNCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorIw0KKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorDQorIw0KKyMgV2ViIENvbnNvbGUgc3RyaW5ncyBmb3IgcmVmZXJlbmNlIGFsbCBzdHJpbmdzIGhlcmUgYXJlIGNvbW1lbnRlZC4NCisjIFRoaXMgZmlsZSBtYXkgYmUgdXNlZCB0byBwcm9kdWNlIGEgdHJhbnNsYXRpb24gb2YgdGhlIHN0cmluZ3MNCisjDQorIyBOb3RlIHRoYXQgcHJvcGVydGllcyBmaWxlcyBhcmUgSVNPLTg4NTktMSBlbmNvZGVkLiBUbyBwcm92aWRlIHRyYW5zbGF0aW9ucw0KKyMgZm9yIGxhbmd1YWdlcyByZXF1aXJpbmcgZGlmZmVyZW50IGNoYXJhY3RlciBlbmNvZGluZ3MsIHlvdSBtYXkgdXNlIHRoZQ0KKyMgbmF0aXZlMmFzY2lpIE1hdmVuIFBsdWdpbiBmcm9tIGh0dHA6Ly9tb2pvLmNvZGVoYXVzLm9yZy9uYXRpdmUyYXNjaWktbWF2ZW4tcGx1Z2luLw0KKyMgdG8gdHJhbnNsYXRlIHRoZSBuYXRpdmVseSBlbmNvZGVkIGZpbGVzIHRvIElTTy04ODU5LTEgZHVyaW5nIGJ1bmRsZSBidWlsZA0KKyMNCisjIFRyYW5zbGF0aW9ucyByZXF1aXJpbmcgbm9uLUlTTy04ODU5LTEgZW5jb2RpbmcgYXJlIHBsYWNlZCBpbiB0aGUNCisjIHNyYy9tYWluL25hdGl2ZTJhc2NpaS9PU0dJLUlORi9sMTBuIGZvbGRlciBhbmQgYXJlIGNvbnZlcnRlZCB1c2luZyBzYWlkDQorIyBwbHVnaW4gd2hpbGUgYnVpbGRpbmcgdGhlIGJ1bmRsZQ0KKyMNCityb2xlLnBsdWdpblRpdGxlPVVzZXJzDQorcm9sZS50cmVlLnJvb3Q9VXNlcnMgYW5kIEdyb3Vwcw0KK3JvbGUubmV3PU5ldyBSb2xlDQorcm9sZS5rZXk9S2V5DQorcm9sZS52YWx1ZT1WYWx1ZQ0KK3JvbGUucHJvcGVydGllcz1Qcm9wZXJ0aWVzDQorcm9sZS5jcmVkZW50aWFscz1DcmVkZW50aWFscw0KK3JvbGUubmV3LnRpdGxlPU5ldyByb2xlDQorcm9sZS5uYW1lPU5hbWUNCityb2xlLnR5cGUuMT1Vc2VyDQorcm9sZS50eXBlLjI9R3JvdXANCit0eXBlLnN0cmluZz1TdHJpbmcNCit0eXBlLmJ5dGVzPUJ5dGVbXQ0KK3R5cGUucGFzc3dvcmQtTUQ1PVBhc3N3b3JkIEhhc2ggKE1ENSkNCit0eXBlLnBhc3N3b3JkLVNIQTE9UGFzc3dvcmQgSGFzaCAoU0hBLTEpDQordHlwZS5wYXNzd29yZC1TSEEyNTY9UGFzc3dvcmQgSGFzaCAoU0hBMjU2KQ0KK3R5cGUucGFzc3dvcmQtU0hBNTEyPVBhc3N3b3JkIEhhc2ggKFNIQTUxMikNCityb2xlLnN0YXRsaW5lPVRoZXJlIGFyZSB7MX0gdXNlcihzKSBhbmQgezJ9IHJvbGUocykgYXJyYW5nZWQgaW4gezB9IGdyb3Vwcy4NCityb2xlLmhlbHAuaW5pdGlhbD1cDQorLSBTZWxlY3QgYSByb2xlIG9uIHRoZSBsZWZ0IHNpZGUgdG8gb3BlbiBpdCBhbmQgZWRpdCBpdCdzIHByb3BlcnRpZXMgYW5kIGNyZWRlbnRpYWxzPGJyLz5cDQorLSBZb3UgY2FuIGRyYWcgZ3JvdXBzLCByb2xlcyBhbmQgdXNlcnMgaW4gdGhlIHRyZWUgdG8gYXJyYW5nZSB0aGVtIGFuZCBkZWNsYXJlIG1lbWJlcnNoaXA8YnIvPlwNCistIFdoaWxlIGRyYWdnaW5nLCBob2xkIEN0cmwgYnV0dG9uIHRvIGNvcHksIGluc3RlYWQgb2YgbW92ZTxici8+XA0KKy0gVG8gcmVtb3ZlIGEgcm9sZSBmcm9tIGEgZ3JvdXAgLSBkcmFnIGl0IHRvIHRoZSByb290IG5vZGU8YnIvPlwNCistIFRoZSByb2xlcyB3aGljaCBhcmUgaW4gPGk+aXRhbGljPC9pPiBhcmUgJ3JlcXVpcmVkJyBtZW1iZXJzIG9mIHRoZSBjdXJyZW50IGdyb3VwPGJyLz5cDQorLSBUbyB0b2dnbGUgYSByb2xlIGZyb20gcmVxdWlyZWQgdG8gYmFzaWMgbWVtYmVyc2hpcCAoYW5kIHZpY2UtdmVyc2EpLCBkb3VibGUgY2xpY2sgb24gaXQNCisNCmRpZmYgLS1naXQgYS93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9PU0dJLUlORi9sMTBuL2J1bmRsZV9iZy5wcm9wZXJ0aWVzIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvT1NHSS1JTkYvbDEwbi9idW5kbGVfYmcucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDY4ODdiCi0tLSAvZGV2L251bGwKKysrIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvT1NHSS1JTkYvbDEwbi9idW5kbGVfYmcucHJvcGVydGllcwpAQCAtMCwwICsxLDU0IEBACivvu78jTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisjDQorIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyMNCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKw0KKyMNCisjIFdlYiBDb25zb2xlIHN0cmluZ3MgZm9yIHJlZmVyZW5jZSBhbGwgc3RyaW5ncyBoZXJlIGFyZSBjb21tZW50ZWQuDQorIyBUaGlzIGZpbGUgbWF5IGJlIHVzZWQgdG8gcHJvZHVjZSBhIHRyYW5zbGF0aW9uIG9mIHRoZSBzdHJpbmdzDQorIw0KKyMgTm90ZSB0aGF0IHByb3BlcnRpZXMgZmlsZXMgYXJlIElTTy04ODU5LTEgZW5jb2RlZC4gVG8gcHJvdmlkZSB0cmFuc2xhdGlvbnMNCisjIGZvciBsYW5ndWFnZXMgcmVxdWlyaW5nIGRpZmZlcmVudCBjaGFyYWN0ZXIgZW5jb2RpbmdzLCB5b3UgbWF5IHVzZSB0aGUNCisjIG5hdGl2ZTJhc2NpaSBNYXZlbiBQbHVnaW4gZnJvbSBodHRwOi8vbW9qby5jb2RlaGF1cy5vcmcvbmF0aXZlMmFzY2lpLW1hdmVuLXBsdWdpbi8NCisjIHRvIHRyYW5zbGF0ZSB0aGUgbmF0aXZlbHkgZW5jb2RlZCBmaWxlcyB0byBJU08tODg1OS0xIGR1cmluZyBidW5kbGUgYnVpbGQNCisjDQorIyBUcmFuc2xhdGlvbnMgcmVxdWlyaW5nIG5vbi1JU08tODg1OS0xIGVuY29kaW5nIGFyZSBwbGFjZWQgaW4gdGhlDQorIyBzcmMvbWFpbi9uYXRpdmUyYXNjaWkvT1NHSS1JTkYvbDEwbiBmb2xkZXIgYW5kIGFyZSBjb252ZXJ0ZWQgdXNpbmcgc2FpZA0KKyMgcGx1Z2luIHdoaWxlIGJ1aWxkaW5nIHRoZSBidW5kbGUNCisjDQorcm9sZS5wbHVnaW5UaXRsZT3Qn9C+0YLRgNC10LHQuNGC0LXQu9C4DQorcm9sZS50cmVlLnJvb3Q90JPRgNGD0L/QuCDQuCDQv9C+0YLRgNC10LHQuNGC0LXQu9C4DQorcm9sZS5uZXc90J3QvtCy0LAg0YDQvtC70Y8NCityb2xlLmtleT3QmtC70Y7Rhw0KK3JvbGUudmFsdWU90KHRgtC+0LnQvdC+0YHRgg0KK3JvbGUucHJvcGVydGllcz3QkNGC0YDQuNCx0YPRgtC4DQorcm9sZS5jcmVkZW50aWFscz3QkNC60YDQtdC00LjRgtC40LLQuA0KK3JvbGUubmV3LnRpdGxlPdCh0YrQt9C00LDQstCw0L3QtSDQvdCwINC90L7QstCwINGA0L7Qu9GPDQorcm9sZS5uYW1lPdCY0LzQtQ0KK3JvbGUudHlwZS4xPdCf0L7RgtGA0LXQsdC40YLQtdC7DQorcm9sZS50eXBlLjI90JPRgNGD0L/QsA0KK3R5cGUuc3RyaW5nPdCd0LjQtw0KK3R5cGUuYnl0ZXM90JTQsNC90L3QuA0KK3R5cGUucGFzc3dvcmQtTUQ1PdCf0LDRgNC+0LvQsCAoTUQ1KQ0KK3R5cGUucGFzc3dvcmQtU0hBMT3Qn9Cw0YDQvtC70LAgKFNIQS0xKQ0KK3R5cGUucGFzc3dvcmQtU0hBMjU2PdCf0LDRgNC+0LvQsCAoU0hBMjU2KQ0KK3R5cGUucGFzc3dvcmQtU0hBNTEyPdCf0LDRgNC+0LvQsCAoU0hBNTEyKQ0KK3JvbGUuc3RhdGxpbmU90JjQvNCwIHsxfSDQv9C+0YLRgNC10LHQuNGC0LXQuyjRjykg0LggezJ9INGA0L7Qu9C4INC+0YDQs9Cw0L3QuNC30LjRgNCw0L3QuCDQsiB7MH0g0LPRgNGD0L/QuC4NCityb2xlLmhlbHAuaW5pdGlhbD1cDQorLSDQmNC30LHQtdGA0LXRgtC1INGA0L7Qu9GPINC+0YIg0LvRj9Cy0L4sINC30LAg0LTQsCDRjyDQvtGC0LLQvtGA0LjRgtC1INC4INC/0YDQvtC80LXQvdC40YLQtSDQvdC10LnQvdC40YLQtSDQsNGC0YDQuNCx0YPRgtC4PGJyLz5cDQorLSDQnNC+0LbQtdGC0LUg0LTQsCDQt9Cw0LLQu9Cw0YfQstCw0YLQtSDRgSDQvNC40YjQutCw0YLQsCDRgNC+0LvQuNGC0LUg0LfQsCDQtNCwINCz0Lgg0LDRgNCw0L3QttC40YDQsNGC0LUuINCf0L4g0YLQvtC30Lgg0L3QsNGH0LjQvSDQtNC10LrQu9Cw0YDQuNGA0LDRgtC1INGC0Y/RhdC90L7RgtC+INGH0LvQtdC90YHRgtCy0L4g0LIg0L7Qv9GA0LXQtNC10LvQtdC90LAg0LPRgNGD0L/QsDxici8+XA0KKy0g0JDQutC+INC/0YDQuCDQt9Cw0LLQu9Cw0YfQstCw0L3QtdGC0L4g0L3QsNGC0LjRgdC90LXRgtC1INC60LvQsNCy0LjRiNCwIEN0cmwsINGJ0LUg0LrQvtC/0LjRgNCw0YLQtSDQuNC30LHRgNCw0L3QsNGC0LAg0YDQvtC70Y8sINCy0LzQtdGB0YLQviDQtNCwINGPINC/0YDQtdC80LXRgdGC0LjRgtC1PGJyLz5cDQorLSDQl9CwINC00LAg0L/RgNC10LzQsNGF0L3QtdGC0LUg0YDQvtC70Y8g0L7RgiDQs9GA0YPQv9CwIC0g0LfQsNCy0LvQsNGH0LXRgtC1INGPINCyINC+0YHQvdC+0LLQsNGC0LAg0L3QsCDQtNGK0YDQstC+0YLQvjxici8+XA0KKy0g0KDQvtC70LjRgtC1LCDQutC+0LjRgtC+INGB0LAg0LIgPGk+0LrRg9GA0YHQuNCyPC9pPiDRgdCwINC30LDQtNGK0LvQttC40YLQtdC70L3QuCDRh9C70LXQvdC+0LLQtSDQvdCwINCz0YDRg9C/0LDRgtCwPGJyLz5cDQorLSDQl9CwINC00LAg0L3QsNC/0YDQsNCy0LjRgtC1INGA0L7Qu9GPINC30LDQtNGK0LvQttC40YLQtdC70L3QsCDQt9CwINCz0YDRg9C/0LDRgtCwLCAo0LjQu9C4INC+0LHQuNC60L3QvtCy0LXQvdCwKSDQutC70LjQutC90LXRgtC1INC00LLQvtC50L3QviDQstGK0YDRhdGDINC90LXRjw0KKw0KZGlmZiAtLWdpdCBhL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL3Jlcy9jcnlwdG8tanMtMy4wLjIvY29yZS1taW4uanMgYi93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvY3J5cHRvLWpzLTMuMC4yL2NvcmUtbWluLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTU3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvY3J5cHRvLWpzLTMuMC4yL2NvcmUtbWluLmpzCkBAIC0wLDAgKzEsMTIgQEAKKy8qCitDcnlwdG9KUyB2My4wLjIKK2NvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcworKGMpIDIwMDktMjAxMiBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCitjb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlCisqLwordmFyIENyeXB0b0pTPUNyeXB0b0pTfHxmdW5jdGlvbihoLG8pe3ZhciBmPXt9LGo9Zi5saWI9e30saz1qLkJhc2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7fXJldHVybntleHRlbmQ6ZnVuY3Rpb24oYil7YS5wcm90b3R5cGU9dGhpczt2YXIgYz1uZXcgYTtiJiZjLm1peEluKGIpO2MuJHN1cGVyPXRoaXM7cmV0dXJuIGN9LGNyZWF0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZXh0ZW5kKCk7YS5pbml0LmFwcGx5KGEsYXJndW1lbnRzKTtyZXR1cm4gYX0saW5pdDpmdW5jdGlvbigpe30sbWl4SW46ZnVuY3Rpb24oYSl7Zm9yKHZhciBjIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShjKSYmKHRoaXNbY109YVtjXSk7YS5oYXNPd25Qcm9wZXJ0eSgidG9TdHJpbmciKSYmKHRoaXMudG9TdHJpbmc9YS50b1N0cmluZyl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHN1cGVyLmV4dGVuZCh0aGlzKX19fSgpLGk9ai5Xb3JkQXJyYXk9ay5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYSxiKXthPQordGhpcy53b3Jkcz1hfHxbXTt0aGlzLnNpZ0J5dGVzPWIhPW8/Yjo0KmEubGVuZ3RofSx0b1N0cmluZzpmdW5jdGlvbihhKXtyZXR1cm4oYXx8cCkuc3RyaW5naWZ5KHRoaXMpfSxjb25jYXQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53b3JkcyxjPWEud29yZHMsZD10aGlzLnNpZ0J5dGVzLGE9YS5zaWdCeXRlczt0aGlzLmNsYW1wKCk7aWYoZCU0KWZvcih2YXIgZT0wO2U8YTtlKyspYltkK2U+Pj4yXXw9KGNbZT4+PjJdPj4+MjQtOCooZSU0KSYyNTUpPDwyNC04KigoZCtlKSU0KTtlbHNlIGlmKDY1NTM1PGMubGVuZ3RoKWZvcihlPTA7ZTxhO2UrPTQpYltkK2U+Pj4yXT1jW2U+Pj4yXTtlbHNlIGIucHVzaC5hcHBseShiLGMpO3RoaXMuc2lnQnl0ZXMrPWE7cmV0dXJuIHRoaXN9LGNsYW1wOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy53b3JkcyxiPXRoaXMuc2lnQnl0ZXM7YVtiPj4+Ml0mPTQyOTQ5NjcyOTU8PDMyLTgqKGIlNCk7YS5sZW5ndGg9aC5jZWlsKGIvNCl9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGE9CitrLmNsb25lLmNhbGwodGhpcyk7YS53b3Jkcz10aGlzLndvcmRzLnNsaWNlKDApO3JldHVybiBhfSxyYW5kb206ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGE7Yys9NCliLnB1c2goNDI5NDk2NzI5NipoLnJhbmRvbSgpfDApO3JldHVybiBpLmNyZWF0ZShiLGEpfX0pLGw9Zi5lbmM9e30scD1sLkhleD17c3RyaW5naWZ5OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1hLndvcmRzLGE9YS5zaWdCeXRlcyxjPVtdLGQ9MDtkPGE7ZCsrKXt2YXIgZT1iW2Q+Pj4yXT4+PjI0LTgqKGQlNCkmMjU1O2MucHVzaCgoZT4+PjQpLnRvU3RyaW5nKDE2KSk7Yy5wdXNoKChlJjE1KS50b1N0cmluZygxNikpfXJldHVybiBjLmpvaW4oIiIpfSxwYXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9YS5sZW5ndGgsYz1bXSxkPTA7ZDxiO2QrPTIpY1tkPj4+M118PXBhcnNlSW50KGEuc3Vic3RyKGQsMiksMTYpPDwyNC00KihkJTgpO3JldHVybiBpLmNyZWF0ZShjLGIvMil9fSxuPWwuTGF0aW4xPXtzdHJpbmdpZnk6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQorYS53b3JkcyxhPWEuc2lnQnl0ZXMsYz1bXSxkPTA7ZDxhO2QrKyljLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShiW2Q+Pj4yXT4+PjI0LTgqKGQlNCkmMjU1KSk7cmV0dXJuIGMuam9pbigiIil9LHBhcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1hLmxlbmd0aCxjPVtdLGQ9MDtkPGI7ZCsrKWNbZD4+PjJdfD0oYS5jaGFyQ29kZUF0KGQpJjI1NSk8PDI0LTgqKGQlNCk7cmV0dXJuIGkuY3JlYXRlKGMsYil9fSxxPWwuVXRmOD17c3RyaW5naWZ5OmZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShuLnN0cmluZ2lmeShhKSkpfWNhdGNoKGIpe3Rocm93IEVycm9yKCJNYWxmb3JtZWQgVVRGLTggZGF0YSIpO319LHBhcnNlOmZ1bmN0aW9uKGEpe3JldHVybiBuLnBhcnNlKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChhKSkpfX0sbT1qLkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG09ay5leHRlbmQoe3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fZGF0YT1pLmNyZWF0ZSgpOwordGhpcy5fbkRhdGFCeXRlcz0wfSxfYXBwZW5kOmZ1bmN0aW9uKGEpeyJzdHJpbmciPT10eXBlb2YgYSYmKGE9cS5wYXJzZShhKSk7dGhpcy5fZGF0YS5jb25jYXQoYSk7dGhpcy5fbkRhdGFCeXRlcys9YS5zaWdCeXRlc30sX3Byb2Nlc3M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZGF0YSxjPWIud29yZHMsZD1iLnNpZ0J5dGVzLGU9dGhpcy5ibG9ja1NpemUsZj1kLyg0KmUpLGY9YT9oLmNlaWwoZik6aC5tYXgoKGZ8MCktdGhpcy5fbWluQnVmZmVyU2l6ZSwwKSxhPWYqZSxkPWgubWluKDQqYSxkKTtpZihhKXtmb3IodmFyIGc9MDtnPGE7Zys9ZSl0aGlzLl9kb1Byb2Nlc3NCbG9jayhjLGcpO2c9Yy5zcGxpY2UoMCxhKTtiLnNpZ0J5dGVzLT1kfXJldHVybiBpLmNyZWF0ZShnLGQpfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBhPWsuY2xvbmUuY2FsbCh0aGlzKTthLl9kYXRhPXRoaXMuX2RhdGEuY2xvbmUoKTtyZXR1cm4gYX0sX21pbkJ1ZmZlclNpemU6MH0pO2ouSGFzaGVyPW0uZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKCl7dGhpcy5yZXNldCgpfSwKK3Jlc2V0OmZ1bmN0aW9uKCl7bS5yZXNldC5jYWxsKHRoaXMpO3RoaXMuX2RvUmVzZXQoKX0sdXBkYXRlOmZ1bmN0aW9uKGEpe3RoaXMuX2FwcGVuZChhKTt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXN9LGZpbmFsaXplOmZ1bmN0aW9uKGEpe2EmJnRoaXMuX2FwcGVuZChhKTt0aGlzLl9kb0ZpbmFsaXplKCk7cmV0dXJuIHRoaXMuX2hhc2h9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGE9bS5jbG9uZS5jYWxsKHRoaXMpO2EuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBhfSxibG9ja1NpemU6MTYsX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jcmVhdGUoYykuZmluYWxpemUoYil9fSxfY3JlYXRlSG1hY0hlbHBlcjpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtyZXR1cm4gci5ITUFDLmNyZWF0ZShhLGMpLmZpbmFsaXplKGIpfX19KTt2YXIgcj1mLmFsZ289e307cmV0dXJuIGZ9KE1hdGgpOwpkaWZmIC0tZ2l0IGEvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvcmVzL2NyeXB0by1qcy0zLjAuMi9saWNlbnNlLnR4dCBiL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL3Jlcy9jcnlwdG8tanMtMy4wLjIvbGljZW5zZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0ZWFhNgotLS0gL2Rldi9udWxsCisrKyBiL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL3Jlcy9jcnlwdG8tanMtMy4wLjIvbGljZW5zZS50eHQKQEAgLTAsMCArMSw5IEBACiupIDIwMDmWMjAxMiBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgIE5laXRoZXIgdGhlIG5hbWUgQ3J5cHRvSlMgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTLCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KZGlmZiAtLWdpdCBhL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL3Jlcy9jcnlwdG8tanMtMy4wLjIvbWQ1LW1pbi5qcyBiL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL3Jlcy9jcnlwdG8tanMtMy4wLjIvbWQ1LW1pbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWJhNzdjCi0tLSAvZGV2L251bGwKKysrIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvcmVzL2NyeXB0by1qcy0zLjAuMi9tZDUtbWluLmpzCkBAIC0wLDAgKzEsMTAgQEAKKy8qCitDcnlwdG9KUyB2My4wLjIKK2NvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcworKGMpIDIwMDktMjAxMiBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCitjb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlCisqLworKGZ1bmN0aW9uKHEpe2Z1bmN0aW9uIGsoYixjLGEsZixkLGUsZyl7Yj1iKyhjJmF8fmMmZikrZCtnO3JldHVybihiPDxlfGI+Pj4zMi1lKStjfWZ1bmN0aW9uIGwoYixjLGEsZixkLGUsZyl7Yj1iKyhjJmZ8YSZ+ZikrZCtnO3JldHVybihiPDxlfGI+Pj4zMi1lKStjfWZ1bmN0aW9uIG0oYixjLGEsZixkLGUsZyl7Yj1iKyhjXmFeZikrZCtnO3JldHVybihiPDxlfGI+Pj4zMi1lKStjfWZ1bmN0aW9uIG4oYixjLGEsZixkLGUsZyl7Yj1iKyhhXihjfH5mKSkrZCtnO3JldHVybihiPDxlfGI+Pj4zMi1lKStjfXZhciBvPUNyeXB0b0pTLGo9by5saWIscj1qLldvcmRBcnJheSxqPWouSGFzaGVyLHA9by5hbGdvLGk9W107KGZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7NjQ+YjtiKyspaVtiXT00Mjk0OTY3Mjk2KnEuYWJzKHEuc2luKGIrMSkpfDB9KSgpO3A9cC5NRDU9ai5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1yLmNyZWF0ZShbMTczMjU4NDE5Myw0MDIzMjMzNDE3LAorMjU2MjM4MzEwMiwyNzE3MzM4NzhdKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBhPTA7MTY+YTthKyspe3ZhciBmPWMrYSxkPWJbZl07YltmXT0oZDw8OHxkPj4+MjQpJjE2NzExOTM1fChkPDwyNHxkPj4+OCkmNDI3ODI1NTM2MH1mb3IodmFyIGY9dGhpcy5faGFzaC53b3JkcyxkPWZbMF0sZT1mWzFdLGc9ZlsyXSxoPWZbM10sYT0wOzY0PmE7YSs9NCkxNj5hPyhkPWsoZCxlLGcsaCxiW2MrYV0sNyxpW2FdKSxoPWsoaCxkLGUsZyxiW2MrYSsxXSwxMixpW2ErMV0pLGc9ayhnLGgsZCxlLGJbYythKzJdLDE3LGlbYSsyXSksZT1rKGUsZyxoLGQsYltjK2ErM10sMjIsaVthKzNdKSk6MzI+YT8oZD1sKGQsZSxnLGgsYltjKyhhKzEpJTE2XSw1LGlbYV0pLGg9bChoLGQsZSxnLGJbYysoYSs2KSUxNl0sOSxpW2ErMV0pLGc9bChnLGgsZCxlLGJbYysoYSsxMSklMTZdLDE0LGlbYSsyXSksZT1sKGUsZyxoLGQsYltjK2ElMTZdLDIwLGlbYSszXSkpOjQ4PmE/KGQ9CittKGQsZSxnLGgsYltjKygzKmErNSklMTZdLDQsaVthXSksaD1tKGgsZCxlLGcsYltjKygzKmErOCklMTZdLDExLGlbYSsxXSksZz1tKGcsaCxkLGUsYltjKygzKmErMTEpJTE2XSwxNixpW2ErMl0pLGU9bShlLGcsaCxkLGJbYysoMyphKzE0KSUxNl0sMjMsaVthKzNdKSk6KGQ9bihkLGUsZyxoLGJbYyszKmElMTZdLDYsaVthXSksaD1uKGgsZCxlLGcsYltjKygzKmErNyklMTZdLDEwLGlbYSsxXSksZz1uKGcsaCxkLGUsYltjKygzKmErMTQpJTE2XSwxNSxpW2ErMl0pLGU9bihlLGcsaCxkLGJbYysoMyphKzUpJTE2XSwyMSxpW2ErM10pKTtmWzBdPWZbMF0rZHwwO2ZbMV09ZlsxXStlfDA7ZlsyXT1mWzJdK2d8MDtmWzNdPWZbM10raHwwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2RhdGEsYz1iLndvcmRzLGE9OCp0aGlzLl9uRGF0YUJ5dGVzLGY9OCpiLnNpZ0J5dGVzO2NbZj4+PjVdfD0xMjg8PDI0LWYlMzI7Y1soZis2ND4+Pjk8PDQpKzE0XT0oYTw8OHxhPj4+CisyNCkmMTY3MTE5MzV8KGE8PDI0fGE+Pj44KSY0Mjc4MjU1MzYwO2Iuc2lnQnl0ZXM9NCooYy5sZW5ndGgrMSk7dGhpcy5fcHJvY2VzcygpO2I9dGhpcy5faGFzaC53b3Jkcztmb3IoYz0wOzQ+YztjKyspYT1iW2NdLGJbY109KGE8PDh8YT4+PjI0KSYxNjcxMTkzNXwoYTw8MjR8YT4+PjgpJjQyNzgyNTUzNjB9fSk7by5NRDU9ai5fY3JlYXRlSGVscGVyKHApO28uSG1hY01ENT1qLl9jcmVhdGVIbWFjSGVscGVyKHApfSkoTWF0aCk7CmRpZmYgLS1naXQgYS93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvY3J5cHRvLWpzLTMuMC4yL3NoYTEtbWluLmpzIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvcmVzL2NyeXB0by1qcy0zLjAuMi9zaGExLW1pbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWFjNTYyCi0tLSAvZGV2L251bGwKKysrIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvcmVzL2NyeXB0by1qcy0zLjAuMi9zaGExLW1pbi5qcwpAQCAtMCwwICsxLDggQEAKKy8qCitDcnlwdG9KUyB2My4wLjIKK2NvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcworKGMpIDIwMDktMjAxMiBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCitjb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlCisqLworKGZ1bmN0aW9uKCl7dmFyIGQ9Q3J5cHRvSlMsYz1kLmxpYixsPWMuV29yZEFycmF5LGM9Yy5IYXNoZXIsaj1bXSxrPWQuYWxnby5TSEExPWMuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bC5jcmVhdGUoWzE3MzI1ODQxOTMsNDAyMzIzMzQxNywyNTYyMzgzMTAyLDI3MTczMzg3OCwzMjg1Mzc3NTIwXSl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihjLG0pe2Zvcih2YXIgYT10aGlzLl9oYXNoLndvcmRzLGU9YVswXSxmPWFbMV0saD1hWzJdLGk9YVszXSxkPWFbNF0sYj0wOzgwPmI7YisrKXtpZigxNj5iKWpbYl09Y1ttK2JdfDA7ZWxzZXt2YXIgZz1qW2ItM11ealtiLThdXmpbYi0xNF1ealtiLTE2XTtqW2JdPWc8PDF8Zz4+PjMxfWc9KGU8PDV8ZT4+PjI3KStkK2pbYl07Zz0yMD5iP2crKChmJmh8fmYmaSkrMTUxODUwMDI0OSk6NDA+Yj9nKygoZl5oXmkpKzE4NTk3NzUzOTMpOjYwPmI/ZysoKGYmaHxmJml8aCZpKS0xODk0MDA3NTg4KTpnKygoZl5oXmkpLQorODk5NDk3NTE0KTtkPWk7aT1oO2g9Zjw8MzB8Zj4+PjI7Zj1lO2U9Z31hWzBdPWFbMF0rZXwwO2FbMV09YVsxXStmfDA7YVsyXT1hWzJdK2h8MDthWzNdPWFbM10raXwwO2FbNF09YVs0XStkfDB9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5fZGF0YSxjPWQud29yZHMsYT04KnRoaXMuX25EYXRhQnl0ZXMsZT04KmQuc2lnQnl0ZXM7Y1tlPj4+NV18PTEyODw8MjQtZSUzMjtjWyhlKzY0Pj4+OTw8NCkrMTVdPWE7ZC5zaWdCeXRlcz00KmMubGVuZ3RoO3RoaXMuX3Byb2Nlc3MoKX19KTtkLlNIQTE9Yy5fY3JlYXRlSGVscGVyKGspO2QuSG1hY1NIQTE9Yy5fY3JlYXRlSG1hY0hlbHBlcihrKX0pKCk7CmRpZmYgLS1naXQgYS93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvY3J5cHRvLWpzLTMuMC4yL3NoYTI1Ni1taW4uanMgYi93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvY3J5cHRvLWpzLTMuMC4yL3NoYTI1Ni1taW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5ZGM0MgotLS0gL2Rldi9udWxsCisrKyBiL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL3Jlcy9jcnlwdG8tanMtMy4wLjIvc2hhMjU2LW1pbi5qcwpAQCAtMCwwICsxLDkgQEAKKy8qCitDcnlwdG9KUyB2My4wLjIKK2NvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcworKGMpIDIwMDktMjAxMiBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCitjb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlCisqLworKGZ1bmN0aW9uKGspe3ZhciBoPUNyeXB0b0pTLGk9aC5saWIscj1pLldvcmRBcnJheSxpPWkuSGFzaGVyLGM9aC5hbGdvLHA9W10scT1bXTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBnKGEpe2Zvcih2YXIgYj1rLnNxcnQoYSksZD0yO2Q8PWI7ZCsrKWlmKCEoYSVkKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBkKGEpe3JldHVybiA0Mjk0OTY3Mjk2KihhLShhfDApKXwwfWZvcih2YXIgYT0yLGI9MDs2ND5iOylnKGEpJiYoOD5iJiYocFtiXT1kKGsucG93KGEsMC41KSkpLHFbYl09ZChrLnBvdyhhLDEvMykpLGIrKyksYSsrfSkoKTt2YXIgZz1bXSxjPWMuU0hBMjU2PWkuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9ci5jcmVhdGUocC5zbGljZSgwKSl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihpLGQpe2Zvcih2YXIgYT10aGlzLl9oYXNoLndvcmRzLGI9YVswXSxtPWFbMV0sbj1hWzJdLGg9YVszXSxmPWFbNF0sYz1hWzVdLG89YVs2XSxrPWFbN10sZT0wOzY0PgorZTtlKyspe2lmKDE2PmUpZ1tlXT1pW2QrZV18MDtlbHNle3ZhciBqPWdbZS0xNV0sbD1nW2UtMl07Z1tlXT0oKGo8PDI1fGo+Pj43KV4oajw8MTR8aj4+PjE4KV5qPj4+MykrZ1tlLTddKygobDw8MTV8bD4+PjE3KV4obDw8MTN8bD4+PjE5KV5sPj4+MTApK2dbZS0xNl19aj1rKygoZjw8MjZ8Zj4+PjYpXihmPDwyMXxmPj4+MTEpXihmPDw3fGY+Pj4yNSkpKyhmJmNefmYmbykrcVtlXStnW2VdO2w9KChiPDwzMHxiPj4+MileKGI8PDE5fGI+Pj4xMyleKGI8PDEwfGI+Pj4yMikpKyhiJm1eYiZuXm0mbik7az1vO289YztjPWY7Zj1oK2p8MDtoPW47bj1tO209YjtiPWorbHwwfWFbMF09YVswXStifDA7YVsxXT1hWzFdK218MDthWzJdPWFbMl0rbnwwO2FbM109YVszXStofDA7YVs0XT1hWzRdK2Z8MDthWzVdPWFbNV0rY3wwO2FbNl09YVs2XStvfDA7YVs3XT1hWzddK2t8MH0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgYz10aGlzLl9kYXRhLGQ9Yy53b3JkcyxhPTgqdGhpcy5fbkRhdGFCeXRlcywKK2I9OCpjLnNpZ0J5dGVzO2RbYj4+PjVdfD0xMjg8PDI0LWIlMzI7ZFsoYis2ND4+Pjk8PDQpKzE1XT1hO2Muc2lnQnl0ZXM9NCpkLmxlbmd0aDt0aGlzLl9wcm9jZXNzKCl9fSk7aC5TSEEyNTY9aS5fY3JlYXRlSGVscGVyKGMpO2guSG1hY1NIQTI1Nj1pLl9jcmVhdGVIbWFjSGVscGVyKGMpfSkoTWF0aCk7CmRpZmYgLS1naXQgYS93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvY3J5cHRvLWpzLTMuMC4yL3NoYTUxMi1taW4uanMgYi93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvY3J5cHRvLWpzLTMuMC4yL3NoYTUxMi1taW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNiOGFkOAotLS0gL2Rldi9udWxsCisrKyBiL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL3Jlcy9jcnlwdG8tanMtMy4wLjIvc2hhNTEyLW1pbi5qcwpAQCAtMCwwICsxLDE1IEBACisvKgorQ3J5cHRvSlMgdjMuMC4yCitjb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMKKyhjKSAyMDA5LTIwMTIgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZQorKi8KKyhmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtyZXR1cm4gdi5jcmVhdGUuYXBwbHkodixhcmd1bWVudHMpfXZhciBkPUNyeXB0b0pTLHI9ZC5saWIuSGFzaGVyLGU9ZC54NjQsdj1lLldvcmQsUz1lLldvcmRBcnJheSxlPWQuYWxnbyxkYT1bYSgxMTE2MzUyNDA4LDM2MDk3Njc0NTgpLGEoMTg5OTQ0NzQ0MSw2MDI4OTE3MjUpLGEoMzA0OTMyMzQ3MSwzOTY0NDg0Mzk5KSxhKDM5MjEwMDk1NzMsMjE3MzI5NTU0OCksYSg5NjE5ODcxNjMsNDA4MTYyODQ3MiksYSgxNTA4OTcwOTkzLDMwNTM4MzQyNjUpLGEoMjQ1MzYzNTc0OCwyOTM3NjcxNTc5KSxhKDI4NzA3NjMyMjEsMzY2NDYwOTU2MCksYSgzNjI0MzgxMDgwLDI3MzQ4ODMzOTQpLGEoMzEwNTk4NDAxLDExNjQ5OTY1NDIpLGEoNjA3MjI1Mjc4LDEzMjM2MTA3NjQpLGEoMTQyNjg4MTk4NywzNTkwMzA0OTk0KSxhKDE5MjUwNzgzODgsNDA2ODE4MjM4MyksYSgyMTYyMDc4MjA2LDk5MTMzNjExMyksYSgyNjE0ODg4MTAzLDYzMzgwMzMxNyksCithKDMyNDgyMjI1ODAsMzQ3OTc3NDg2OCksYSgzODM1MzkwNDAxLDI2NjY2MTM0NTgpLGEoNDAyMjIyNDc3NCw5NDQ3MTExMzkpLGEoMjY0MzQ3MDc4LDIzNDEyNjI3NzMpLGEoNjA0ODA3NjI4LDIwMDc4MDA5MzMpLGEoNzcwMjU1OTgzLDE0OTU5OTA5MDEpLGEoMTI0OTE1MDEyMiwxODU2NDMxMjM1KSxhKDE1NTUwODE2OTIsMzE3NTIxODEzMiksYSgxOTk2MDY0OTg2LDIxOTg5NTA4MzcpLGEoMjU1NDIyMDg4MiwzOTk5NzE5MzM5KSxhKDI4MjE4MzQzNDksNzY2Nzg0MDE2KSxhKDI5NTI5OTY4MDgsMjU2NjU5NDg3OSksYSgzMjEwMzEzNjcxLDMyMDMzMzc5NTYpLGEoMzMzNjU3MTg5MSwxMDM0NDU3MDI2KSxhKDM1ODQ1Mjg3MTEsMjQ2Njk0ODkwMSksYSgxMTM5MjY5OTMsMzc1ODMyNjM4MyksYSgzMzgyNDE4OTUsMTY4NzE3OTM2KSxhKDY2NjMwNzIwNSwxMTg4MTc5OTY0KSxhKDc3MzUyOTkxMiwxNTQ2MDQ1NzM0KSxhKDEyOTQ3NTczNzIsMTUyMjgwNTQ4NSksYSgxMzk2MTgyMjkxLAorMjY0MzgzMzgyMyksYSgxNjk1MTgzNzAwLDIzNDM1MjczOTApLGEoMTk4NjY2MTA1MSwxMDE0NDc3NDgwKSxhKDIxNzcwMjYzNTAsMTIwNjc1OTE0MiksYSgyNDU2OTU2MDM3LDM0NDA3NzYyNyksYSgyNzMwNDg1OTIxLDEyOTA4NjM0NjApLGEoMjgyMDMwMjQxMSwzMTU4NDU0MjczKSxhKDMyNTk3MzA4MDAsMzUwNTk1MjY1NyksYSgzMzQ1NzY0NzcxLDEwNjIxNzAwOCksYSgzNTE2MDY1ODE3LDM2MDYwMDgzNDQpLGEoMzYwMDM1MjgwNCwxNDMyNzI1Nzc2KSxhKDQwOTQ1NzE5MDksMTQ2NzAzMTU5NCksYSgyNzU0MjMzNDQsODUxMTY5NzIwKSxhKDQzMDIyNzczNCwzMTAwODIzNzUyKSxhKDUwNjk0ODYxNiwxMzYzMjU4MTk1KSxhKDY1OTA2MDU1NiwzNzUwNjg1NTkzKSxhKDg4Mzk5Nzg3NywzNzg1MDUwMjgwKSxhKDk1ODEzOTU3MSwzMzE4MzA3NDI3KSxhKDEzMjI4MjIyMTgsMzgxMjcyMzQwMyksYSgxNTM3MDAyMDYzLDIwMDMwMzQ5OTUpLGEoMTc0Nzg3Mzc3OSwzNjAyMDM2ODk5KSwKK2EoMTk1NTU2MjIyMiwxNTc1OTkwMDEyKSxhKDIwMjQxMDQ4MTUsMTEyNTU5MjkyOCksYSgyMjI3NzMwNDUyLDI3MTY5MDQzMDYpLGEoMjM2MTg1MjQyNCw0NDI3NzYwNDQpLGEoMjQyODQzNjQ3NCw1OTM2OTgzNDQpLGEoMjc1NjczNDE4NywzNzMzMTEwMjQ5KSxhKDMyMDQwMzE0NzksMjk5OTM1MTU3MyksYSgzMzI5MzI1Mjk4LDM4MTU5MjA0MjcpLGEoMzM5MTU2OTYxNCwzOTI4MzgzOTAwKSxhKDM1MTUyNjcyNzEsNTY2MjgwNzExKSxhKDM5NDAxODc2MDYsMzQ1NDA2OTUzNCksYSg0MTE4NjMwMjcxLDQwMDAyMzk5OTIpLGEoMTE2NDE4NDc0LDE5MTQxMzg1NTQpLGEoMTc0MjkyNDIxLDI3MzEwNTUyNzApLGEoMjg5MzgwMzU2LDMyMDM5OTMwMDYpLGEoNDYwMzkzMjY5LDMyMDYyMDMxNSksYSg2ODU0NzE3MzMsNTg3NDk2ODM2KSxhKDg1MjE0Mjk3MSwxMDg2NzkyODUxKSxhKDEwMTcwMzYyOTgsMzY1NTQzMTAwKSxhKDExMjYwMDA1ODAsMjYxODI5NzY3NiksYSgxMjg4MDMzNDcwLAorMzQwOTg1NTE1OCksYSgxNTAxNTA1OTQ4LDQyMzQ1MDk4NjYpLGEoMTYwNzE2NzkxNSw5ODcxNjc0NjgpLGEoMTgxNjQwMjMxNiwxMjQ2MTg5NTkxKV0scz1bXTsoZnVuY3Rpb24oKXtmb3IodmFyIFQ9MDs4MD5UO1QrKylzW1RdPWEoKX0pKCk7ZT1lLlNIQTUxMj1yLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPVMuY3JlYXRlKFthKDE3NzkwMzM3MDMsNDA4OTIzNTcyMCksYSgzMTQ0MTM0Mjc3LDIyMjc4NzM1OTUpLGEoMTAxMzkwNDI0Miw0MjcxMTc1NzIzKSxhKDI3NzM0ODA3NjIsMTU5NTc1MDEyOSksYSgxMzU5ODkzMTE5LDI5MTc1NjUxMzcpLGEoMjYwMDgyMjkyNCw3MjU1MTExOTkpLGEoNTI4NzM0NjM1LDQyMTUzODk1NDcpLGEoMTU0MTQ1OTIyNSwzMjcwMzMyMDkpXSl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihhLGUpe2Zvcih2YXIgZj10aGlzLl9oYXNoLndvcmRzLEM9ZlswXSxkPWZbMV0sRD1mWzJdLEU9ZlszXSxGPWZbNF0sRz1mWzVdLEg9CitmWzZdLGY9Zls3XSxyPUMuaGlnaCxJPUMubG93LHY9ZC5oaWdoLEo9ZC5sb3csWD1ELmhpZ2gsSz1ELmxvdyxZPUUuaGlnaCxMPUUubG93LFo9Ri5oaWdoLE09Ri5sb3csJD1HLmhpZ2gsTj1HLmxvdyxhYT1ILmhpZ2gsTz1ILmxvdyxiYT1mLmhpZ2gsUD1mLmxvdyxqPXIsZz1JLHc9dix0PUoseD1YLHU9SyxVPVkseT1MLGs9WixoPU0sUT0kLHo9TixSPWFhLEE9TyxWPWJhLEI9UCxsPTA7ODA+bDtsKyspe3ZhciBvPXNbbF07aWYoMTY+bCl2YXIgaT1vLmhpZ2g9YVtlKzIqbF18MCxiPW8ubG93PWFbZSsyKmwrMV18MDtlbHNle3ZhciBpPXNbbC0xNV0sYj1pLmhpZ2gsbT1pLmxvdyxpPShtPDwzMXxiPj4+MSleKG08PDI0fGI+Pj44KV5iPj4+NyxtPShiPDwzMXxtPj4+MSleKGI8PDI0fG0+Pj44KV4oYjw8MjV8bT4+PjcpLHE9c1tsLTJdLGI9cS5oaWdoLGM9cS5sb3cscT0oYzw8MTN8Yj4+PjE5KV4oYjw8M3xjPj4+MjkpXmI+Pj42LGM9KGI8PDEzfGM+Pj4xOSleKGM8PDN8Yj4+PjI5KV4KKyhiPDwyNnxjPj4+NiksYj1zW2wtN10sVz1iLmhpZ2gscD1zW2wtMTZdLG49cC5oaWdoLHA9cC5sb3csYj1tK2IubG93LGk9aStXKyhiPj4+MDxtPj4+MD8xOjApLGI9YitjLGk9aStxKyhiPj4+MDxjPj4+MD8xOjApLGI9YitwLGk9aStuKyhiPj4+MDxwPj4+MD8xOjApO28uaGlnaD1pO28ubG93PWJ9dmFyIFc9ayZRXn5rJlIscD1oJnpefmgmQSxvPWomd15qJnhedyZ4LFM9ZyZ0XmcmdV50JnUsbT0oZzw8NHxqPj4+MjgpXihqPDwzMHxnPj4+MileKGo8PDI1fGc+Pj43KSxxPShqPDw0fGc+Pj4yOCleKGc8PDMwfGo+Pj4yKV4oZzw8MjV8aj4+PjcpLGM9ZGFbbF0sZWE9Yy5oaWdoLGNhPWMubG93LGM9QisoKGs8PDE4fGg+Pj4xNCleKGs8PDE0fGg+Pj4xOCleKGg8PDIzfGs+Pj45KSksbj1WKygoaDw8MTh8az4+PjE0KV4oaDw8MTR8az4+PjE4KV4oazw8MjN8aD4+PjkpKSsoYz4+PjA8Qj4+PjA/MTowKSxjPWMrcCxuPW4rVysoYz4+PjA8cD4+PjA/MTowKSxjPWMrY2Esbj1uK2VhKworKGM+Pj4wPGNhPj4+MD8xOjApLGM9YytiLG49bitpKyhjPj4+MDxiPj4+MD8xOjApLGI9cStTLG89bStvKyhiPj4+MDxxPj4+MD8xOjApLFY9UixCPUEsUj1RLEE9eixRPWssej1oLGg9eStjfDAsaz1VK24rKGg+Pj4wPHk+Pj4wPzE6MCl8MCxVPXgseT11LHg9dyx1PXQsdz1qLHQ9ZyxnPWMrYnwwLGo9bitvKyhnPj4+MDxjPj4+MD8xOjApfDB9ST1DLmxvdz1JK2d8MDtDLmhpZ2g9citqKyhJPj4+MDxnPj4+MD8xOjApfDA7Sj1kLmxvdz1KK3R8MDtkLmhpZ2g9dit3KyhKPj4+MDx0Pj4+MD8xOjApfDA7Sz1ELmxvdz1LK3V8MDtELmhpZ2g9WCt4KyhLPj4+MDx1Pj4+MD8xOjApfDA7TD1FLmxvdz1MK3l8MDtFLmhpZ2g9WStVKyhMPj4+MDx5Pj4+MD8xOjApfDA7TT1GLmxvdz1NK2h8MDtGLmhpZ2g9WitrKyhNPj4+MDxoPj4+MD8xOjApfDA7Tj1HLmxvdz1OK3p8MDtHLmhpZ2g9JCtRKyhOPj4+MDx6Pj4+MD8xOjApfDA7Tz1ILmxvdz1PK0F8MDtILmhpZ2g9YWErUisoTz4+PjA8QT4+PgorMD8xOjApfDA7UD1mLmxvdz1QK0J8MDtmLmhpZ2g9YmErVisoUD4+PjA8Qj4+PjA/MTowKXwwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2RhdGEsZD1hLndvcmRzLGY9OCp0aGlzLl9uRGF0YUJ5dGVzLGU9OCphLnNpZ0J5dGVzO2RbZT4+PjVdfD0xMjg8PDI0LWUlMzI7ZFsoZSsxMjg+Pj4xMDw8NSkrMzFdPWY7YS5zaWdCeXRlcz00KmQubGVuZ3RoO3RoaXMuX3Byb2Nlc3MoKTt0aGlzLl9oYXNoPXRoaXMuX2hhc2gudG9YMzIoKX0sYmxvY2tTaXplOjMyfSk7ZC5TSEE1MTI9ci5fY3JlYXRlSGVscGVyKGUpO2QuSG1hY1NIQTUxMj1yLl9jcmVhdGVIbWFjSGVscGVyKGUpfSkoKTsKZGlmZiAtLWdpdCBhL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL3Jlcy9jcnlwdG8tanMtMy4wLjIveDY0LWNvcmUtbWluLmpzIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvcmVzL2NyeXB0by1qcy0zLjAuMi94NjQtY29yZS1taW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1NGJmZQotLS0gL2Rldi9udWxsCisrKyBiL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL3Jlcy9jcnlwdG8tanMtMy4wLjIveDY0LWNvcmUtbWluLmpzCkBAIC0wLDAgKzEsNyBAQAorLyoKK0NyeXB0b0pTIHYzLjAuMgorY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzCisoYykgMjAwOS0yMDEyIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KK2NvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2UKKyovCisoZnVuY3Rpb24oZyl7dmFyIGE9Q3J5cHRvSlMsZj1hLmxpYixlPWYuQmFzZSxoPWYuV29yZEFycmF5LGE9YS54NjQ9e307YS5Xb3JkPWUuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGIsYyl7dGhpcy5oaWdoPWI7dGhpcy5sb3c9Y319KTthLldvcmRBcnJheT1lLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihiLGMpe2I9dGhpcy53b3Jkcz1ifHxbXTt0aGlzLnNpZ0J5dGVzPWMhPWc/Yzo4KmIubGVuZ3RofSx0b1gzMjpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLndvcmRzLGM9Yi5sZW5ndGgsYT1bXSxkPTA7ZDxjO2QrKyl7dmFyIGU9YltkXTthLnB1c2goZS5oaWdoKTthLnB1c2goZS5sb3cpfXJldHVybiBoLmNyZWF0ZShhLHRoaXMuc2lnQnl0ZXMpfSxjbG9uZTpmdW5jdGlvbigpe2Zvcih2YXIgYj1lLmNsb25lLmNhbGwodGhpcyksYz1iLndvcmRzPXRoaXMud29yZHMuc2xpY2UoMCksYT1jLmxlbmd0aCxkPTA7ZDxhO2QrKyljW2RdPWNbZF0uY2xvbmUoKTtyZXR1cm4gYn19KX0pKCk7CmRpZmYgLS1naXQgYS93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvanNUcmVlLnYuMC45LjlhL2pxdWVyeS50cmVlLm1pbi5qcyBiL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL3Jlcy9qc1RyZWUudi4wLjkuOWEvanF1ZXJ5LnRyZWUubWluLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ODI5MWIKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvanNUcmVlLnYuMC45LjlhL2pxdWVyeS50cmVlLm1pbi5qcwpAQCAtMCwwICsxIEBACisoZnVuY3Rpb24oJCl7JC50cmVlPXtkYXRhc3RvcmVzOnt9LHBsdWdpbnM6e30sZGVmYXVsdHM6e2RhdGE6e2FzeW5jOmZhbHNlLHR5cGU6Imh0bWwiLG9wdHM6e21ldGhvZDoiR0VUIix1cmw6ZmFsc2V9fSxzZWxlY3RlZDpmYWxzZSxvcGVuZWQ6W10sbGFuZ3VhZ2VzOltdLHVpOntkb3RzOnRydWUsYW5pbWF0aW9uOjAsc2Nyb2xsX3NwZDo0LHRoZW1lX3BhdGg6ZmFsc2UsdGhlbWVfbmFtZToiZGVmYXVsdCIsc2VsZWN0ZWRfcGFyZW50X2Nsb3NlOiJzZWxlY3RfcGFyZW50IixzZWxlY3RlZF9kZWxldGU6InNlbGVjdF9wcmV2aW91cyJ9LHR5cGVzOnsiZGVmYXVsdCI6e2NsaWNrYWJsZTp0cnVlLHJlbmFtZWFibGU6dHJ1ZSxkZWxldGFibGU6dHJ1ZSxjcmVhdGFibGU6dHJ1ZSxkcmFnZ2FibGU6dHJ1ZSxtYXhfY2hpbGRyZW46LTEsbWF4X2RlcHRoOi0xLHZhbGlkX2NoaWxkcmVuOiJhbGwiLGljb246e2ltYWdlOmZhbHNlLHBvc2l0aW9uOmZhbHNlfX19LHJ1bGVzOnttdWx0aXBsZTpmYWxzZSxtdWx0aXRyZWU6Im5vbmUiLHR5cGVfYXR0cjoicmVsIixjcmVhdGVhdDoiYm90dG9tIixkcmFnX2NvcHk6ImN0cmwiLGRyYWdfYnV0dG9uOiJsZWZ0Iix1c2VfbWF4X2NoaWxkcmVuOnRydWUsdXNlX21heF9kZXB0aDp0cnVlLG1heF9jaGlsZHJlbjotMSxtYXhfZGVwdGg6LTEsdmFsaWRfY2hpbGRyZW46ImFsbCJ9LGxhbmc6e25ld19ub2RlOiJOZXcgZm9sZGVyIixsb2FkaW5nOiJMb2FkaW5nIC4uLiJ9LGNhbGxiYWNrOntiZWZvcmVjaGFuZ2U6ZnVuY3Rpb24oTk9ERSxUUkVFX09CSil7cmV0dXJuIHRydWV9LGJlZm9yZW9wZW46ZnVuY3Rpb24oTk9ERSxUUkVFX09CSil7cmV0dXJuIHRydWV9LGJlZm9yZWNsb3NlOmZ1bmN0aW9uKE5PREUsVFJFRV9PQkope3JldHVybiB0cnVlfSxiZWZvcmVtb3ZlOmZ1bmN0aW9uKE5PREUsUkVGX05PREUsVFlQRSxUUkVFX09CSil7cmV0dXJuIHRydWV9LGJlZm9yZWNyZWF0ZTpmdW5jdGlvbihOT0RFLFJFRl9OT0RFLFRZUEUsVFJFRV9PQkope3JldHVybiB0cnVlfSxiZWZvcmVyZW5hbWU6ZnVuY3Rpb24oTk9ERSxMQU5HLFRSRUVfT0JKKXtyZXR1cm4gdHJ1ZX0sYmVmb3JlZGVsZXRlOmZ1bmN0aW9uKE5PREUsVFJFRV9PQkope3JldHVybiB0cnVlfSxiZWZvcmVkYXRhOmZ1bmN0aW9uKE5PREUsVFJFRV9PQkope3JldHVybntpZDokKE5PREUpLmF0dHIoImlkIil8fDB9fSxvbmRhdGE6ZnVuY3Rpb24oREFUQSxUUkVFX09CSil7cmV0dXJuIERBVEF9LG9ucGFyc2U6ZnVuY3Rpb24oU1RSLFRSRUVfT0JKKXtyZXR1cm4gU1RSfSxvbmhvdmVyOmZ1bmN0aW9uKE5PREUsVFJFRV9PQkope30sb25zZWxlY3Q6ZnVuY3Rpb24oTk9ERSxUUkVFX09CSil7fSxvbmRlc2VsZWN0OmZ1bmN0aW9uKE5PREUsVFJFRV9PQkope30sb25jaGFuZ2U6ZnVuY3Rpb24oTk9ERSxUUkVFX09CSil7fSxvbnJlbmFtZTpmdW5jdGlvbihOT0RFLFRSRUVfT0JKLFJCKXt9LG9ubW92ZTpmdW5jdGlvbihOT0RFLFJFRl9OT0RFLFRZUEUsVFJFRV9PQkosUkIpe30sb25jb3B5OmZ1bmN0aW9uKE5PREUsUkVGX05PREUsVFlQRSxUUkVFX09CSixSQil7fSxvbmNyZWF0ZTpmdW5jdGlvbihOT0RFLFJFRl9OT0RFLFRZUEUsVFJFRV9PQkosUkIpe30sb25kZWxldGU6ZnVuY3Rpb24oTk9ERSxUUkVFX09CSixSQil7fSxvbm9wZW46ZnVuY3Rpb24oTk9ERSxUUkVFX09CSil7fSxvbm9wZW5fYWxsOmZ1bmN0aW9uKFRSRUVfT0JKKXt9LG9uY2xvc2VfYWxsOmZ1bmN0aW9uKFRSRUVfT0JKKXt9LG9uY2xvc2U6ZnVuY3Rpb24oTk9ERSxUUkVFX09CSil7fSxlcnJvcjpmdW5jdGlvbihURVhULFRSRUVfT0JKKXt9LG9uZGJsY2xrOmZ1bmN0aW9uKE5PREUsVFJFRV9PQkope1RSRUVfT0JKLnRvZ2dsZV9icmFuY2guY2FsbChUUkVFX09CSixOT0RFKTtUUkVFX09CSi5zZWxlY3RfYnJhbmNoLmNhbGwoVFJFRV9PQkosTk9ERSl9LG9ucmd0Y2xrOmZ1bmN0aW9uKE5PREUsVFJFRV9PQkosRVYpe30sb25sb2FkOmZ1bmN0aW9uKFRSRUVfT0JKKXt9LG9uaW5pdDpmdW5jdGlvbihUUkVFX09CSil7fSxvbmZvY3VzOmZ1bmN0aW9uKFRSRUVfT0JKKXt9LG9uZGVzdHJveTpmdW5jdGlvbihUUkVFX09CSil7fSxvbnNlYXJjaDpmdW5jdGlvbihOT0RFUyxUUkVFX09CSil7Tk9ERVMuYWRkQ2xhc3MoInNlYXJjaCIpfSxvbmRyb3A6ZnVuY3Rpb24oTk9ERSxSRUZfTk9ERSxUWVBFLFRSRUVfT0JKKXt9LGNoZWNrOmZ1bmN0aW9uKFJVTEUsTk9ERSxWQUxVRSxUUkVFX09CSil7cmV0dXJuIFZBTFVFfSxjaGVja19tb3ZlOmZ1bmN0aW9uKE5PREUsUkVGX05PREUsVFlQRSxUUkVFX09CSil7cmV0dXJuIHRydWV9fSxwbHVnaW5zOnt9fSxjcmVhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRyZWVfY29tcG9uZW50KCl9LGZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdHJlZV9jb21wb25lbnQuaW5zdFt0cmVlX2NvbXBvbmVudC5mb2N1c2VkXX0scmVmZXJlbmNlOmZ1bmN0aW9uKG9iail7dmFyIG89JChvYmopO2lmKCFvLnNpemUoKSlvPSQoIiMiK29iaik7aWYoIW8uc2l6ZSgpKXJldHVybiBudWxsO289KG8uaXMoIi50cmVlIikpP28uYXR0cigiaWQiKTpvLnBhcmVudHMoIi50cmVlOmVxKDApIikuYXR0cigiaWQiKTtyZXR1cm4gdHJlZV9jb21wb25lbnQuaW5zdFtvXXx8bnVsbH0scm9sbGJhY2s6ZnVuY3Rpb24oZGF0YSl7Zm9yKHZhciBpIGluIGRhdGEpe2lmKCFkYXRhLmhhc093blByb3BlcnR5KGkpKWNvbnRpbnVlO3ZhciB0bXA9dHJlZV9jb21wb25lbnQuaW5zdFtpXTt2YXIgbG9jaz0hdG1wLmxvY2tlZDtpZihsb2NrKXRtcC5sb2NrKHRydWUpO3RtcC5pbnA9ZmFsc2U7dG1wLmNvbnRhaW5lci5odG1sKGRhdGFbaV0uaHRtbCkuZmluZCgiLmRyYWdnZWQiKS5yZW1vdmVDbGFzcygiZHJhZ2dlZCIpLmVuZCgpLmZpbmQoIi5ob3ZlciIpLnJlbW92ZUNsYXNzKCJob3ZlciIpO2lmKGRhdGFbaV0uc2VsZWN0ZWQpe3RtcC5zZWxlY3RlZD0kKCIjIitkYXRhW2ldLnNlbGVjdGVkKTt0bXAuc2VsZWN0ZWRfYXJyPVtdO3RtcC5jb250YWluZXIuZmluZCgiYS5jbGlja2VkIikuZWFjaChmdW5jdGlvbigpe3RtcC5zZWxlY3RlZF9hcnIucHVzaCh0bXAuZ2V0X25vZGUodGhpcykpfSl9aWYobG9jayl0bXAubG9jayhmYWxzZSk7ZGVsZXRlIGxvY2s7ZGVsZXRlIHRtcH19LGRyb3BfbW9kZTpmdW5jdGlvbihvcHRzKXtvcHRzPSQuZXh0ZW5kKG9wdHMse3Nob3c6ZmFsc2UsdHlwZToiZGVmYXVsdCIsc3RyOiJGb3JlaWduIG5vZGUifSk7dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLmZvcmVpZ249dHJ1ZTt0cmVlX2NvbXBvbmVudC5kcmFnX2Ryb3AuaXNkb3duPXRydWU7dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLm1vdmluZz10cnVlO3RyZWVfY29tcG9uZW50LmRyYWdfZHJvcC5hcHBlbmRlZD1mYWxzZTt0cmVlX2NvbXBvbmVudC5kcmFnX2Ryb3AuZl90eXBlPW9wdHMudHlwZTt0cmVlX2NvbXBvbmVudC5kcmFnX2Ryb3AuZl9kYXRhPW9wdHM7aWYoIW9wdHMuc2hvdyl7dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLmRyYWdfaGVscD1mYWxzZTt0cmVlX2NvbXBvbmVudC5kcmFnX2Ryb3AuZHJhZ19ub2RlPWZhbHNlfWVsc2V7dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLmRyYWdfaGVscD0kKCI8ZGl2IGlkPSdqc3RyZWUtZHJhZ2dlZCcgY2xhc3M9J3RyZWUgdHJlZS1kZWZhdWx0Jz48dWw+PGxpIGNsYXNzPSdsYXN0IGRyYWdnZWQgZm9yZWlnbic+PGEgaHJlZj0nIyc+PGlucz4mbmJzcDs8L2lucz4iK29wdHMuc3RyKyI8L2E+PC9saT48L3VsPjwvZGl2PiIpO3RyZWVfY29tcG9uZW50LmRyYWdfZHJvcC5kcmFnX25vZGU9dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLmRyYWdfaGVscC5maW5kKCJsaTplcSgwKSIpfWlmKCQudHJlZS5kcmFnX3N0YXJ0IT09ZmFsc2UpJC50cmVlLmRyYWdfc3RhcnQuY2FsbChudWxsLGZhbHNlKX0sZHJhZ19zdGFydDpmYWxzZSxkcmFnOmZhbHNlLGRyYWdfZW5kOmZhbHNlfTskLmZuLnRyZWU9ZnVuY3Rpb24ob3B0cyl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjb25mPSQuZXh0ZW5kKHt9LG9wdHMpO2lmKHRyZWVfY29tcG9uZW50Lmluc3QmJnRyZWVfY29tcG9uZW50Lmluc3RbJCh0aGlzKS5hdHRyKCdpZCcpXSl0cmVlX2NvbXBvbmVudC5pbnN0WyQodGhpcykuYXR0cignaWQnKV0uZGVzdHJveSgpO2lmKGNvbmYhPT1mYWxzZSluZXcgdHJlZV9jb21wb25lbnQoKS5pbml0KHRoaXMsY29uZil9KX07ZnVuY3Rpb24gdHJlZV9jb21wb25lbnQoKXtyZXR1cm57Y250cjorK3RyZWVfY29tcG9uZW50LmNudHIsc2V0dGluZ3M6JC5leHRlbmQoe30sJC50cmVlLmRlZmF1bHRzKSxpbml0OmZ1bmN0aW9uKGVsZW0sY29uZil7dmFyIF90aGlzPXRoaXM7dGhpcy5jb250YWluZXI9JChlbGVtKTtpZih0aGlzLmNvbnRhaW5lci5zaXplPT0wKXJldHVybiBmYWxzZTt0cmVlX2NvbXBvbmVudC5pbnN0W3RoaXMuY250cl09dGhpcztpZighdGhpcy5jb250YWluZXIuYXR0cigiaWQiKSl0aGlzLmNvbnRhaW5lci5hdHRyKCJpZCIsImpzdHJlZV8iK3RoaXMuY250cik7dHJlZV9jb21wb25lbnQuaW5zdFt0aGlzLmNvbnRhaW5lci5hdHRyKCJpZCIpXT10cmVlX2NvbXBvbmVudC5pbnN0W3RoaXMuY250cl07dHJlZV9jb21wb25lbnQuZm9jdXNlZD10aGlzLmNudHI7dGhpcy5zZXR0aW5ncz0kLmV4dGVuZCh0cnVlLHt9LHRoaXMuc2V0dGluZ3MsY29uZik7aWYodGhpcy5zZXR0aW5ncy5sYW5ndWFnZXMmJnRoaXMuc2V0dGluZ3MubGFuZ3VhZ2VzLmxlbmd0aCl7dGhpcy5jdXJyZW50X2xhbmc9dGhpcy5zZXR0aW5ncy5sYW5ndWFnZXNbMF07dmFyIHN0PWZhbHNlO3ZhciBpZD0iIyIrdGhpcy5jb250YWluZXIuYXR0cigiaWQiKTtmb3IodmFyIGxuPTA7bG48dGhpcy5zZXR0aW5ncy5sYW5ndWFnZXMubGVuZ3RoO2xuKyspe3N0PXRyZWVfY29tcG9uZW50LmFkZF9jc3MoaWQrIiAuIit0aGlzLnNldHRpbmdzLmxhbmd1YWdlc1tsbl0pO2lmKHN0IT09ZmFsc2Upc3Quc3R5bGUuZGlzcGxheT0odGhpcy5zZXR0aW5ncy5sYW5ndWFnZXNbbG5dPT10aGlzLmN1cnJlbnRfbGFuZyk/IiI6Im5vbmUifX1lbHNlIHRoaXMuY3VycmVudF9sYW5nPWZhbHNlO3RoaXMuY29udGFpbmVyLmFkZENsYXNzKCJ0cmVlIik7aWYodGhpcy5zZXR0aW5ncy51aS50aGVtZV9uYW1lIT09ZmFsc2Upe2lmKHRoaXMuc2V0dGluZ3MudWkudGhlbWVfcGF0aD09PWZhbHNlKXskKCJzY3JpcHQiKS5lYWNoKGZ1bmN0aW9uKCl7aWYodGhpcy5zcmMudG9TdHJpbmcoKS5tYXRjaCgvanF1ZXJ5XC50cmVlLio/anMkLykpe190aGlzLnNldHRpbmdzLnVpLnRoZW1lX3BhdGg9dGhpcy5zcmMudG9TdHJpbmcoKS5yZXBsYWNlKC9qcXVlcnlcLnRyZWUuKj9qcyQvLCIiKSsidGhlbWVzLyIrX3RoaXMuc2V0dGluZ3MudWkudGhlbWVfbmFtZSsiL3N0eWxlLmNzcyI7cmV0dXJuIGZhbHNlfX0pfWlmKHRoaXMuc2V0dGluZ3MudWkudGhlbWVfcGF0aCE9IiImJiQuaW5BcnJheSh0aGlzLnNldHRpbmdzLnVpLnRoZW1lX3BhdGgsdHJlZV9jb21wb25lbnQudGhlbWVzKT09LTEpe3RyZWVfY29tcG9uZW50LmFkZF9zaGVldCh7dXJsOnRoaXMuc2V0dGluZ3MudWkudGhlbWVfcGF0aH0pO3RyZWVfY29tcG9uZW50LnRoZW1lcy5wdXNoKHRoaXMuc2V0dGluZ3MudWkudGhlbWVfcGF0aCl9dGhpcy5jb250YWluZXIuYWRkQ2xhc3MoInRyZWUtIit0aGlzLnNldHRpbmdzLnVpLnRoZW1lX25hbWUpfXZhciB0eXBlX2ljb25zPSIiO2Zvcih2YXIgdCBpbiB0aGlzLnNldHRpbmdzLnR5cGVzKXtpZighdGhpcy5zZXR0aW5ncy50eXBlcy5oYXNPd25Qcm9wZXJ0eSh0KSljb250aW51ZTtpZighdGhpcy5zZXR0aW5ncy50eXBlc1t0XS5pY29uKWNvbnRpbnVlO2lmKHRoaXMuc2V0dGluZ3MudHlwZXNbdF0uaWNvbi5pbWFnZXx8dGhpcy5zZXR0aW5ncy50eXBlc1t0XS5pY29uLnBvc2l0aW9uKXtpZih0PT0iZGVmYXVsdCIpdHlwZV9pY29ucys9IiMiK3RoaXMuY29udGFpbmVyLmF0dHIoImlkIikrIiBsaSA+IGEgaW5zIHsgIjtlbHNlIHR5cGVfaWNvbnMrPSIjIit0aGlzLmNvbnRhaW5lci5hdHRyKCJpZCIpKyIgbGlbcmVsPSIrdCsiXSA+IGEgaW5zIHsgIjtpZih0aGlzLnNldHRpbmdzLnR5cGVzW3RdLmljb24uaW1hZ2UpdHlwZV9pY29ucys9IiBiYWNrZ3JvdW5kLWltYWdlOnVybCgiK3RoaXMuc2V0dGluZ3MudHlwZXNbdF0uaWNvbi5pbWFnZSsiKTsgIjtpZih0aGlzLnNldHRpbmdzLnR5cGVzW3RdLmljb24ucG9zaXRpb24pdHlwZV9pY29ucys9IiBiYWNrZ3JvdW5kLXBvc2l0aW9uOiIrdGhpcy5zZXR0aW5ncy50eXBlc1t0XS5pY29uLnBvc2l0aW9uKyI7ICI7dHlwZV9pY29ucys9In0gIn19aWYodHlwZV9pY29ucyE9IiIpdHJlZV9jb21wb25lbnQuYWRkX3NoZWV0KHtzdHI6dHlwZV9pY29uc30pO2lmKHRoaXMuc2V0dGluZ3MucnVsZXMubXVsdGlwbGUpdGhpcy5zZWxlY3RlZF9hcnI9W107dGhpcy5vZmZzZXQ9ZmFsc2U7dGhpcy5ob3ZlcmVkPWZhbHNlO3RoaXMubG9ja2VkPWZhbHNlO2lmKHRyZWVfY29tcG9uZW50LmRyYWdfZHJvcC5tYXJrZXI9PT1mYWxzZSl0cmVlX2NvbXBvbmVudC5kcmFnX2Ryb3AubWFya2VyPSQoIjxkaXY+IikuYXR0cih7aWQ6ImpzdHJlZS1tYXJrZXIifSkuaGlkZSgpLmFwcGVuZFRvKCJib2R5Iik7dGhpcy5jYWxsYmFjaygib25pbml0IixbdGhpc10pO3RoaXMucmVmcmVzaCgpO3RoaXMuYXR0YWNoX2V2ZW50cygpO3RoaXMuZm9jdXMoKX0scmVmcmVzaDpmdW5jdGlvbihvYmope2lmKHRoaXMubG9ja2VkKXJldHVybiB0aGlzLmVycm9yKCJMT0NLRUQiKTt2YXIgX3RoaXM9dGhpcztpZihvYmomJiF0aGlzLnNldHRpbmdzLmRhdGEuYXN5bmMpb2JqPWZhbHNlO3RoaXMuaXNfcGFydGlhbF9yZWZyZXNoPW9iaj90cnVlOmZhbHNlO3RoaXMub3BlbmVkPUFycmF5KCk7aWYodGhpcy5zZXR0aW5ncy5vcGVuZWQhPWZhbHNlKXskLmVhY2godGhpcy5zZXR0aW5ncy5vcGVuZWQsZnVuY3Rpb24oaSxpdGVtKXtpZih0aGlzLnJlcGxhY2UoL14jLywiIikubGVuZ3RoPjApe190aGlzLm9wZW5lZC5wdXNoKCIjIit0aGlzLnJlcGxhY2UoL14jLywiIikpfX0pO3RoaXMuc2V0dGluZ3Mub3BlbmVkPWZhbHNlfWVsc2V7dGhpcy5jb250YWluZXIuZmluZCgibGkub3BlbiIpLmVhY2goZnVuY3Rpb24oaSl7aWYodGhpcy5pZCl7X3RoaXMub3BlbmVkLnB1c2goIiMiK3RoaXMuaWQpfX0pfWlmKHRoaXMuc2VsZWN0ZWQpe3RoaXMuc2V0dGluZ3Muc2VsZWN0ZWQ9QXJyYXkoKTtpZihvYmopeyQob2JqKS5maW5kKCJsaTpoYXMoYS5jbGlja2VkKSIpLmVhY2goZnVuY3Rpb24oKXtpZih0aGlzLmlkKV90aGlzLnNldHRpbmdzLnNlbGVjdGVkLnB1c2goIiMiK3RoaXMuaWQpfSl9ZWxzZXtpZih0aGlzLnNlbGVjdGVkX2Fycil7JC5lYWNoKHRoaXMuc2VsZWN0ZWRfYXJyLGZ1bmN0aW9uKCl7aWYodGhpcy5hdHRyKCJpZCIpKV90aGlzLnNldHRpbmdzLnNlbGVjdGVkLnB1c2goIiMiK3RoaXMuYXR0cigiaWQiKSl9KX1lbHNle2lmKHRoaXMuc2VsZWN0ZWQuYXR0cigiaWQiKSl0aGlzLnNldHRpbmdzLnNlbGVjdGVkLnB1c2goIiMiK3RoaXMuc2VsZWN0ZWQuYXR0cigiaWQiKSl9fX1lbHNlIGlmKHRoaXMuc2V0dGluZ3Muc2VsZWN0ZWQhPT1mYWxzZSl7dmFyIHRtcD1BcnJheSgpO2lmKCh0eXBlb2YgdGhpcy5zZXR0aW5ncy5zZWxlY3RlZCkudG9Mb3dlckNhc2UoKT09Im9iamVjdCIpeyQuZWFjaCh0aGlzLnNldHRpbmdzLnNlbGVjdGVkLGZ1bmN0aW9uKCl7aWYodGhpcy5yZXBsYWNlKC9eIy8sIiIpLmxlbmd0aD4wKXRtcC5wdXNoKCIjIit0aGlzLnJlcGxhY2UoL14jLywiIikpfSl9ZWxzZXtpZih0aGlzLnNldHRpbmdzLnNlbGVjdGVkLnJlcGxhY2UoL14jLywiIikubGVuZ3RoPjApdG1wLnB1c2goIiMiK3RoaXMuc2V0dGluZ3Muc2VsZWN0ZWQucmVwbGFjZSgvXiMvLCIiKSl9dGhpcy5zZXR0aW5ncy5zZWxlY3RlZD10bXB9aWYob2JqJiZ0aGlzLnNldHRpbmdzLmRhdGEuYXN5bmMpe3RoaXMub3BlbmVkPUFycmF5KCk7b2JqPXRoaXMuZ2V0X25vZGUob2JqKTtvYmouZmluZCgibGkub3BlbiIpLmVhY2goZnVuY3Rpb24oaSl7X3RoaXMub3BlbmVkLnB1c2goIiMiK3RoaXMuaWQpfSk7aWYob2JqLmhhc0NsYXNzKCJvcGVuIikpb2JqLnJlbW92ZUNsYXNzKCJvcGVuIikuYWRkQ2xhc3MoImNsb3NlZCIpO2lmKG9iai5oYXNDbGFzcygibGVhZiIpKW9iai5yZW1vdmVDbGFzcygibGVhZiIpO29iai5jaGlsZHJlbigidWw6ZXEoMCkiKS5odG1sKCIiKTtyZXR1cm4gdGhpcy5vcGVuX2JyYW5jaChvYmosdHJ1ZSxmdW5jdGlvbigpe190aGlzLnJlc2VsZWN0LmFwcGx5KF90aGlzKX0pfXZhciBfdGhpcz10aGlzO3ZhciBfZGF0YXN0b3JlPW5ldyAkLnRyZWUuZGF0YXN0b3Jlc1t0aGlzLnNldHRpbmdzLmRhdGEudHlwZV0oKTtpZih0aGlzLmNvbnRhaW5lci5jaGlsZHJlbigidWwiKS5zaXplKCk9PTApe3RoaXMuY29udGFpbmVyLmh0bWwoIjx1bCBjbGFzcz0nbHRyJyBzdHlsZT0nZGlyZWN0aW9uOmx0cjsnPjxsaSBjbGFzcz0nbGFzdCc+PGEgY2xhc3M9J2xvYWRpbmcnIGhyZWY9JyMnPjxpbnM+Jm5ic3A7PC9pbnM+IisodGhpcy5zZXR0aW5ncy5sYW5nLmxvYWRpbmd8fCJMb2FkaW5nIC4uLiIpKyI8L2E+PC9saT48L3VsPiIpfV9kYXRhc3RvcmUubG9hZCh0aGlzLmNhbGxiYWNrKCJiZWZvcmVkYXRhIixbZmFsc2UsdGhpc10pLHRoaXMsdGhpcy5zZXR0aW5ncy5kYXRhLm9wdHMsZnVuY3Rpb24oZGF0YSl7ZGF0YT1fdGhpcy5jYWxsYmFjaygib25kYXRhIixbZGF0YSxfdGhpc10pO19kYXRhc3RvcmUucGFyc2UoZGF0YSxfdGhpcyxfdGhpcy5zZXR0aW5ncy5kYXRhLm9wdHMsZnVuY3Rpb24oc3RyKXtzdHI9X3RoaXMuY2FsbGJhY2soIm9ucGFyc2UiLFtzdHIsX3RoaXNdKTtfdGhpcy5jb250YWluZXIuZW1wdHkoKS5hcHBlbmQoJCgiPHVsIGNsYXNzPSdsdHInPiIpLmh0bWwoc3RyKSk7X3RoaXMuY29udGFpbmVyLmZpbmQoImxpOmxhc3QtY2hpbGQiKS5hZGRDbGFzcygibGFzdCIpLmVuZCgpLmZpbmQoImxpOmhhcyh1bCkiKS5ub3QoIi5vcGVuIikuYWRkQ2xhc3MoImNsb3NlZCIpO190aGlzLmNvbnRhaW5lci5maW5kKCJsaSIpLm5vdCgiLm9wZW4iKS5ub3QoIi5jbG9zZWQiKS5hZGRDbGFzcygibGVhZiIpO190aGlzLnJlc2VsZWN0KCl9KX0pfSxyZXNlbGVjdDpmdW5jdGlvbihpc19jYWxsYmFjayl7dmFyIF90aGlzPXRoaXM7aWYoIWlzX2NhbGxiYWNrKXRoaXMuY2xfY291bnQ9MDtlbHNlIHRoaXMuY2xfY291bnQtLTtpZih0aGlzLm9wZW5lZCYmdGhpcy5vcGVuZWQubGVuZ3RoKXt2YXIgb3BuPWZhbHNlO2Zvcih2YXIgaj0wO3RoaXMub3BlbmVkJiZqPHRoaXMub3BlbmVkLmxlbmd0aDtqKyspe2lmKHRoaXMuc2V0dGluZ3MuZGF0YS5hc3luYyl7dmFyIHRtcD10aGlzLmdldF9ub2RlKHRoaXMub3BlbmVkW2pdKTtpZih0bXAuc2l6ZSgpJiZ0bXAuaGFzQ2xhc3MoImNsb3NlZCIpPjApe29wbj10cnVlO3ZhciB0bXA9dGhpcy5vcGVuZWRbal0udG9TdHJpbmcoKS5yZXBsYWNlKCcvJywnXFwvJyk7ZGVsZXRlIHRoaXMub3BlbmVkW2pdO3RoaXMub3Blbl9icmFuY2godG1wLHRydWUsZnVuY3Rpb24oKXtfdGhpcy5yZXNlbGVjdC5hcHBseShfdGhpcyxbdHJ1ZV0pfSk7dGhpcy5jbF9jb3VudCsrfX1lbHNlIHRoaXMub3Blbl9icmFuY2godGhpcy5vcGVuZWRbal0sdHJ1ZSl9aWYodGhpcy5zZXR0aW5ncy5kYXRhLmFzeW5jJiZvcG4pcmV0dXJuO2lmKHRoaXMuY2xfY291bnQ+MClyZXR1cm47ZGVsZXRlIHRoaXMub3BlbmVkfWlmKHRoaXMuY2xfY291bnQ+MClyZXR1cm47dGhpcy5jb250YWluZXIuY3NzKCJkaXJlY3Rpb24iLCJsdHIiKS5jaGlsZHJlbigidWw6ZXEoMCkiKS5hZGRDbGFzcygibHRyIik7aWYodGhpcy5zZXR0aW5ncy51aS5kb3RzPT1mYWxzZSl0aGlzLmNvbnRhaW5lci5jaGlsZHJlbigidWw6ZXEoMCkiKS5hZGRDbGFzcygibm9fZG90cyIpO2lmKHRoaXMuc2NydG9wKXt0aGlzLmNvbnRhaW5lci5zY3JvbGxUb3AoX3RoaXMuc2NydG9wKTtkZWxldGUgdGhpcy5zY3J0b3B9aWYodGhpcy5zZXR0aW5ncy5zZWxlY3RlZCE9PWZhbHNlKXskLmVhY2godGhpcy5zZXR0aW5ncy5zZWxlY3RlZCxmdW5jdGlvbihpKXtpZihfdGhpcy5pc19wYXJ0aWFsX3JlZnJlc2gpX3RoaXMuc2VsZWN0X2JyYW5jaCgkKF90aGlzLnNldHRpbmdzLnNlbGVjdGVkW2ldLnRvU3RyaW5nKCkucmVwbGFjZSgnLycsJ1xcLycpLF90aGlzLmNvbnRhaW5lciksKF90aGlzLnNldHRpbmdzLnJ1bGVzLm11bHRpcGxlIT09ZmFsc2UpKTtlbHNlIF90aGlzLnNlbGVjdF9icmFuY2goJChfdGhpcy5zZXR0aW5ncy5zZWxlY3RlZFtpXS50b1N0cmluZygpLnJlcGxhY2UoJy8nLCdcXC8nKSxfdGhpcy5jb250YWluZXIpLChfdGhpcy5zZXR0aW5ncy5ydWxlcy5tdWx0aXBsZSE9PWZhbHNlJiZpPjApKX0pO3RoaXMuc2V0dGluZ3Muc2VsZWN0ZWQ9ZmFsc2V9dGhpcy5jYWxsYmFjaygib25sb2FkIixbX3RoaXNdKX0sZ2V0OmZ1bmN0aW9uKG9iaixmb3JtYXQsb3B0cyl7aWYoIWZvcm1hdClmb3JtYXQ9dGhpcy5zZXR0aW5ncy5kYXRhLnR5cGU7aWYoIW9wdHMpb3B0cz10aGlzLnNldHRpbmdzLmRhdGEub3B0cztyZXR1cm4gbmV3ICQudHJlZS5kYXRhc3RvcmVzW2Zvcm1hdF0oKS5nZXQob2JqLHRoaXMsb3B0cyl9LGF0dGFjaF9ldmVudHM6ZnVuY3Rpb24oKXt2YXIgX3RoaXM9dGhpczt0aGlzLmNvbnRhaW5lci5iaW5kKCJtb3VzZWRvd24uanN0cmVlIixmdW5jdGlvbihldmVudCl7aWYodHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLmlzZG93bil7dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLm1vdmVfdHlwZT1mYWxzZTtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2V2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO3JldHVybiBmYWxzZX19KS5iaW5kKCJtb3VzZXVwLmpzdHJlZSIsZnVuY3Rpb24oZXZlbnQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtfdGhpcy5mb2N1cy5hcHBseShfdGhpcyl9LDUpfSkuYmluZCgiY2xpY2suanN0cmVlIixmdW5jdGlvbihldmVudCl7cmV0dXJuIHRydWV9KTskKCIjIit0aGlzLmNvbnRhaW5lci5hdHRyKCJpZCIpKyIgbGkiKS5saXZlKCJjbGljayIsZnVuY3Rpb24oZXZlbnQpe2lmKGV2ZW50LnRhcmdldC50YWdOYW1lIT0iTEkiKXJldHVybiB0cnVlO190aGlzLm9mZl9oZWlnaHQoKTtpZihldmVudC5wYWdlWS0kKGV2ZW50LnRhcmdldCkub2Zmc2V0KCkudG9wPl90aGlzLmxpX2hlaWdodClyZXR1cm4gdHJ1ZTtfdGhpcy50b2dnbGVfYnJhbmNoLmFwcGx5KF90aGlzLFtldmVudC50YXJnZXRdKTtldmVudC5zdG9wUHJvcGFnYXRpb24oKTtyZXR1cm4gZmFsc2V9KTskKCIjIit0aGlzLmNvbnRhaW5lci5hdHRyKCJpZCIpKyIgbGkgYSIpLmxpdmUoImNsaWNrLmpzdHJlZSIsZnVuY3Rpb24oZXZlbnQpe2lmKGV2ZW50LndoaWNoJiZldmVudC53aGljaD09MylyZXR1cm4gdHJ1ZTtpZihfdGhpcy5sb2NrZWQpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQudGFyZ2V0LmJsdXIoKTtyZXR1cm4gX3RoaXMuZXJyb3IoIkxPQ0tFRCIpfV90aGlzLnNlbGVjdF9icmFuY2guYXBwbHkoX3RoaXMsW2V2ZW50LnRhcmdldCxldmVudC5jdHJsS2V5fHxfdGhpcy5zZXR0aW5ncy5ydWxlcy5tdWx0aXBsZT09Im9uIl0pO2lmKF90aGlzLmlucCl7X3RoaXMuaW5wLmJsdXIoKX1ldmVudC5wcmV2ZW50RGVmYXVsdCgpO2V2ZW50LnRhcmdldC5ibHVyKCk7cmV0dXJuIGZhbHNlfSkubGl2ZSgiZGJsY2xpY2suanN0cmVlIixmdW5jdGlvbihldmVudCl7aWYoX3RoaXMubG9ja2VkKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2V2ZW50LnRhcmdldC5ibHVyKCk7cmV0dXJuIF90aGlzLmVycm9yKCJMT0NLRUQiKX1fdGhpcy5jYWxsYmFjaygib25kYmxjbGsiLFtfdGhpcy5nZXRfbm9kZShldmVudC50YXJnZXQpLmdldCgwKSxfdGhpc10pO2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ZXZlbnQudGFyZ2V0LmJsdXIoKX0pLmxpdmUoImNvbnRleHRtZW51LmpzdHJlZSIsZnVuY3Rpb24oZXZlbnQpe2lmKF90aGlzLmxvY2tlZCl7ZXZlbnQudGFyZ2V0LmJsdXIoKTtyZXR1cm4gX3RoaXMuZXJyb3IoIkxPQ0tFRCIpfXJldHVybiBfdGhpcy5jYWxsYmFjaygib25yZ3RjbGsiLFtfdGhpcy5nZXRfbm9kZShldmVudC50YXJnZXQpLmdldCgwKSxfdGhpcyxldmVudF0pfSkubGl2ZSgibW91c2VvdmVyLmpzdHJlZSIsZnVuY3Rpb24oZXZlbnQpe2lmKF90aGlzLmxvY2tlZCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtldmVudC5zdG9wUHJvcGFnYXRpb24oKTtyZXR1cm4gX3RoaXMuZXJyb3IoIkxPQ0tFRCIpfWlmKF90aGlzLmhvdmVyZWQhPT1mYWxzZSYmKGV2ZW50LnRhcmdldC50YWdOYW1lPT0iQSJ8fGV2ZW50LnRhcmdldC50YWdOYW1lPT0iSU5TIikpe190aGlzLmhvdmVyZWQuY2hpbGRyZW4oImEiKS5yZW1vdmVDbGFzcygiaG92ZXIiKTtfdGhpcy5ob3ZlcmVkPWZhbHNlfV90aGlzLmNhbGxiYWNrKCJvbmhvdmVyIixbX3RoaXMuZ2V0X25vZGUoZXZlbnQudGFyZ2V0KS5nZXQoMCksX3RoaXNdKX0pLmxpdmUoIm1vdXNlZG93bi5qc3RyZWUiLGZ1bmN0aW9uKGV2ZW50KXtpZihfdGhpcy5zZXR0aW5ncy5ydWxlcy5kcmFnX2J1dHRvbj09ImxlZnQiJiZldmVudC53aGljaCYmZXZlbnQud2hpY2ghPTEpcmV0dXJuIHRydWU7aWYoX3RoaXMuc2V0dGluZ3MucnVsZXMuZHJhZ19idXR0b249PSJyaWdodCImJmV2ZW50LndoaWNoJiZldmVudC53aGljaCE9MylyZXR1cm4gdHJ1ZTtfdGhpcy5mb2N1cy5hcHBseShfdGhpcyk7aWYoX3RoaXMubG9ja2VkKXJldHVybiBfdGhpcy5lcnJvcigiTE9DS0VEIik7dmFyIG9iaj1fdGhpcy5nZXRfbm9kZShldmVudC50YXJnZXQpO2lmKF90aGlzLnNldHRpbmdzLnJ1bGVzLm11bHRpcGxlIT1mYWxzZSYmX3RoaXMuc2VsZWN0ZWRfYXJyLmxlbmd0aD4xJiZvYmouY2hpbGRyZW4oImE6ZXEoMCkiKS5oYXNDbGFzcygiY2xpY2tlZCIpKXt2YXIgY291bnRlcj0wO2Zvcih2YXIgaSBpbiBfdGhpcy5zZWxlY3RlZF9hcnIpe2lmKCFfdGhpcy5zZWxlY3RlZF9hcnIuaGFzT3duUHJvcGVydHkoaSkpY29udGludWU7aWYoX3RoaXMuY2hlY2soImRyYWdnYWJsZSIsX3RoaXMuc2VsZWN0ZWRfYXJyW2ldKSl7X3RoaXMuc2VsZWN0ZWRfYXJyW2ldLmFkZENsYXNzKCJkcmFnZ2VkIik7dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLm9yaWdpbl90cmVlPV90aGlzO2NvdW50ZXIrK319aWYoY291bnRlcj4wKXtpZihfdGhpcy5jaGVjaygiZHJhZ2dhYmxlIixvYmopKXRyZWVfY29tcG9uZW50LmRyYWdfZHJvcC5kcmFnX25vZGU9b2JqO2Vsc2UgdHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLmRyYWdfbm9kZT1fdGhpcy5jb250YWluZXIuZmluZCgibGkuZHJhZ2dlZDplcSgwKSIpO3RyZWVfY29tcG9uZW50LmRyYWdfZHJvcC5pc2Rvd249dHJ1ZTt0cmVlX2NvbXBvbmVudC5kcmFnX2Ryb3AuZHJhZ19oZWxwPSQoIjxkaXYgaWQ9J2pzdHJlZS1kcmFnZ2VkJyBjbGFzcz0ndHJlZSAiKyhfdGhpcy5zZXR0aW5ncy51aS50aGVtZV9uYW1lIT0iIj8iIHRyZWUtIitfdGhpcy5zZXR0aW5ncy51aS50aGVtZV9uYW1lOiIiKSsiJyAvPiIpLmFwcGVuZCgiPHVsIGNsYXNzPSciK190aGlzLmNvbnRhaW5lci5jaGlsZHJlbigidWw6ZXEoMCkiKS5nZXQoMCkuY2xhc3NOYW1lKyInIC8+Iik7dmFyIHRtcD10cmVlX2NvbXBvbmVudC5kcmFnX2Ryb3AuZHJhZ19ub2RlLmNsb25lKCk7aWYoX3RoaXMuc2V0dGluZ3MubGFuZ3VhZ2VzLmxlbmd0aD4wKXRtcC5maW5kKCJhIikubm90KCIuIitfdGhpcy5jdXJyZW50X2xhbmcpLmhpZGUoKTt0cmVlX2NvbXBvbmVudC5kcmFnX2Ryb3AuZHJhZ19oZWxwLmNoaWxkcmVuKCJ1bDplcSgwKSIpLmFwcGVuZCh0bXApO3RyZWVfY29tcG9uZW50LmRyYWdfZHJvcC5kcmFnX2hlbHAuZmluZCgibGk6ZXEoMCkiKS5yZW1vdmVDbGFzcygibGFzdCIpLmFkZENsYXNzKCJsYXN0IikuY2hpbGRyZW4oImEiKS5odG1sKCI8aW5zPiZuYnNwOzwvaW5zPk11bHRpcGxlIHNlbGVjdGlvbiIpLmVuZCgpLmNoaWxkcmVuKCJ1bCIpLnJlbW92ZSgpO3RyZWVfY29tcG9uZW50LmRyYWdfZHJvcC5kcmFnZ2VkPV90aGlzLmNvbnRhaW5lci5maW5kKCJsaS5kcmFnZ2VkIil9fWVsc2V7aWYoX3RoaXMuY2hlY2soImRyYWdnYWJsZSIsb2JqKSl7dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLmRyYWdfbm9kZT1vYmo7dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLmRyYWdfaGVscD0kKCI8ZGl2IGlkPSdqc3RyZWUtZHJhZ2dlZCcgY2xhc3M9J3RyZWUgIisoX3RoaXMuc2V0dGluZ3MudWkudGhlbWVfbmFtZSE9IiI/IiB0cmVlLSIrX3RoaXMuc2V0dGluZ3MudWkudGhlbWVfbmFtZToiIikrIicgLz4iKS5hcHBlbmQoIjx1bCBjbGFzcz0nIitfdGhpcy5jb250YWluZXIuY2hpbGRyZW4oInVsOmVxKDApIikuZ2V0KDApLmNsYXNzTmFtZSsiJyAvPiIpO3ZhciB0bXA9b2JqLmNsb25lKCk7aWYoX3RoaXMuc2V0dGluZ3MubGFuZ3VhZ2VzLmxlbmd0aD4wKXRtcC5maW5kKCJhIikubm90KCIuIitfdGhpcy5jdXJyZW50X2xhbmcpLmhpZGUoKTt0cmVlX2NvbXBvbmVudC5kcmFnX2Ryb3AuZHJhZ19oZWxwLmNoaWxkcmVuKCJ1bDplcSgwKSIpLmFwcGVuZCh0bXApO3RyZWVfY29tcG9uZW50LmRyYWdfZHJvcC5kcmFnX2hlbHAuZmluZCgibGk6ZXEoMCkiKS5yZW1vdmVDbGFzcygibGFzdCIpLmFkZENsYXNzKCJsYXN0Iik7dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLmlzZG93bj10cnVlO3RyZWVfY29tcG9uZW50LmRyYWdfZHJvcC5mb3JlaWduPWZhbHNlO3RyZWVfY29tcG9uZW50LmRyYWdfZHJvcC5vcmlnaW5fdHJlZT1fdGhpcztvYmouYWRkQ2xhc3MoImRyYWdnZWQiKTt0cmVlX2NvbXBvbmVudC5kcmFnX2Ryb3AuZHJhZ2dlZD1fdGhpcy5jb250YWluZXIuZmluZCgibGkuZHJhZ2dlZCIpfX10cmVlX2NvbXBvbmVudC5kcmFnX2Ryb3AuaW5pdF94PWV2ZW50LnBhZ2VYO3RyZWVfY29tcG9uZW50LmRyYWdfZHJvcC5pbml0X3k9ZXZlbnQucGFnZVk7b2JqLmJsdXIoKTtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3JldHVybiBmYWxzZX0pfSxmb2N1czpmdW5jdGlvbigpe2lmKHRoaXMubG9ja2VkKXJldHVybiBmYWxzZTtpZih0cmVlX2NvbXBvbmVudC5mb2N1c2VkIT10aGlzLmNudHIpe3RyZWVfY29tcG9uZW50LmZvY3VzZWQ9dGhpcy5jbnRyO3RoaXMuY2FsbGJhY2soIm9uZm9jdXMiLFt0aGlzXSl9fSxvZmZfaGVpZ2h0OmZ1bmN0aW9uKCl7aWYodGhpcy5vZmZzZXQ9PT1mYWxzZSl7dGhpcy5jb250YWluZXIuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUifSk7dGhpcy5vZmZzZXQ9dGhpcy5jb250YWluZXIub2Zmc2V0KCk7dmFyIHRtcD0wO3RtcD1wYXJzZUludCgkLmN1ckNTUyh0aGlzLmNvbnRhaW5lci5nZXQoMCksInBhZGRpbmdUb3AiLHRydWUpLDEwKTtpZih0bXApdGhpcy5vZmZzZXQudG9wKz10bXA7dG1wPXBhcnNlSW50KCQuY3VyQ1NTKHRoaXMuY29udGFpbmVyLmdldCgwKSwiYm9yZGVyVG9wV2lkdGgiLHRydWUpLDEwKTtpZih0bXApdGhpcy5vZmZzZXQudG9wKz10bXA7dGhpcy5jb250YWluZXIuY3NzKHtwb3NpdGlvbjoiIn0pfWlmKCF0aGlzLmxpX2hlaWdodCl7dmFyIHRtcD10aGlzLmNvbnRhaW5lci5maW5kKCJ1bCBsaS5jbG9zZWQsIHVsIGxpLmxlYWYiKS5lcSgwKTt0aGlzLmxpX2hlaWdodD10bXAuaGVpZ2h0KCk7aWYodG1wLmNoaWxkcmVuKCJ1bDplcSgwKSIpLnNpemUoKSl0aGlzLmxpX2hlaWdodC09dG1wLmNoaWxkcmVuKCJ1bDplcSgwKSIpLmhlaWdodCgpO2lmKCF0aGlzLmxpX2hlaWdodCl0aGlzLmxpX2hlaWdodD0xOH19LHNjcm9sbF9jaGVjazpmdW5jdGlvbih4LHkpe3ZhciBfdGhpcz10aGlzO3ZhciBjbnQ9X3RoaXMuY29udGFpbmVyO3ZhciBvZmY9X3RoaXMuY29udGFpbmVyLm9mZnNldCgpO3ZhciBzdD1jbnQuc2Nyb2xsVG9wKCk7dmFyIHNsPWNudC5zY3JvbGxMZWZ0KCk7dmFyIGhfY29yPShjbnQuZ2V0KDApLnNjcm9sbFdpZHRoPmNudC53aWR0aCgpKT80MDoyMDtpZih5LW9mZi50b3A8MjApY250LnNjcm9sbFRvcChNYXRoLm1heCgoc3QtX3RoaXMuc2V0dGluZ3MudWkuc2Nyb2xsX3NwZCksMCkpO2lmKGNudC5oZWlnaHQoKS0oeS1vZmYudG9wKTxoX2NvciljbnQuc2Nyb2xsVG9wKHN0K190aGlzLnNldHRpbmdzLnVpLnNjcm9sbF9zcGQpO2lmKHgtb2ZmLmxlZnQ8MjApY250LnNjcm9sbExlZnQoTWF0aC5tYXgoKHNsLV90aGlzLnNldHRpbmdzLnVpLnNjcm9sbF9zcGQpLDApKTtpZihjbnQud2lkdGgoKS0oeC1vZmYubGVmdCk8NDApY250LnNjcm9sbExlZnQoc2wrX3RoaXMuc2V0dGluZ3MudWkuc2Nyb2xsX3NwZCk7aWYoY250LnNjcm9sbExlZnQoKSE9c2x8fGNudC5zY3JvbGxUb3AoKSE9c3Qpe3RyZWVfY29tcG9uZW50LmRyYWdfZHJvcC5tb3ZlX3R5cGU9ZmFsc2U7dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLnJlZl9ub2RlPWZhbHNlO3RyZWVfY29tcG9uZW50LmRyYWdfZHJvcC5tYXJrZXIuaGlkZSgpfXRyZWVfY29tcG9uZW50LmRyYWdfZHJvcC5zY3JvbGxfdGltZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7X3RoaXMuc2Nyb2xsX2NoZWNrKHgseSl9LDUwKX0sc2Nyb2xsX2ludG9fdmlldzpmdW5jdGlvbihvYmope29iaj1vYmo/dGhpcy5nZXRfbm9kZShvYmopOnRoaXMuc2VsZWN0ZWQ7aWYoIW9iailyZXR1cm4gZmFsc2U7dmFyIG9mZl90PW9iai5vZmZzZXQoKS50b3A7dmFyIGJlZ190PXRoaXMuY29udGFpbmVyLm9mZnNldCgpLnRvcDt2YXIgZW5kX3Q9YmVnX3QrdGhpcy5jb250YWluZXIuaGVpZ2h0KCk7dmFyIGhfY29yPSh0aGlzLmNvbnRhaW5lci5nZXQoMCkuc2Nyb2xsV2lkdGg+dGhpcy5jb250YWluZXIud2lkdGgoKSk/NDA6MjA7aWYob2ZmX3QrNTxiZWdfdCl0aGlzLmNvbnRhaW5lci5zY3JvbGxUb3AodGhpcy5jb250YWluZXIuc2Nyb2xsVG9wKCktKGJlZ190LW9mZl90KzUpKTtpZihvZmZfdCtoX2Nvcj5lbmRfdCl0aGlzLmNvbnRhaW5lci5zY3JvbGxUb3AodGhpcy5jb250YWluZXIuc2Nyb2xsVG9wKCkrKG9mZl90K2hfY29yLWVuZF90KSl9LGdldF9ub2RlOmZ1bmN0aW9uKG9iail7cmV0dXJuICQob2JqKS5jbG9zZXN0KCJsaSIpfSxnZXRfdHlwZTpmdW5jdGlvbihvYmope29iaj0hb2JqP3RoaXMuc2VsZWN0ZWQ6dGhpcy5nZXRfbm9kZShvYmopO2lmKCFvYmopcmV0dXJuO3ZhciB0bXA9b2JqLmF0dHIodGhpcy5zZXR0aW5ncy5ydWxlcy50eXBlX2F0dHIpO3JldHVybiB0bXB8fCJkZWZhdWx0In0sc2V0X3R5cGU6ZnVuY3Rpb24oc3RyLG9iail7b2JqPSFvYmo/dGhpcy5zZWxlY3RlZDp0aGlzLmdldF9ub2RlKG9iaik7aWYoIW9ianx8IXN0cilyZXR1cm47b2JqLmF0dHIodGhpcy5zZXR0aW5ncy5ydWxlcy50eXBlX2F0dHIsc3RyKX0sZ2V0X3RleHQ6ZnVuY3Rpb24ob2JqLGxhbmcpe29iaj10aGlzLmdldF9ub2RlKG9iaik7aWYoIW9ianx8b2JqLnNpemUoKT09MClyZXR1cm4iIjtpZih0aGlzLnNldHRpbmdzLmxhbmd1YWdlcyYmdGhpcy5zZXR0aW5ncy5sYW5ndWFnZXMubGVuZ3RoKXtsYW5nPWxhbmc/bGFuZzp0aGlzLmN1cnJlbnRfbGFuZztvYmo9b2JqLmNoaWxkcmVuKCJhLiIrbGFuZyl9ZWxzZSBvYmo9b2JqLmNoaWxkcmVuKCJhOnZpc2libGUiKTt2YXIgdmFsPSIiO29iai5jb250ZW50cygpLmVhY2goZnVuY3Rpb24oKXtpZih0aGlzLm5vZGVUeXBlPT0zKXt2YWw9dGhpcy5kYXRhO3JldHVybiBmYWxzZX19KTtyZXR1cm4gdmFsfSxjaGVjazpmdW5jdGlvbihydWxlLG9iail7aWYodGhpcy5sb2NrZWQpcmV0dXJuIGZhbHNlO3ZhciB2PWZhbHNlO2lmKG9iaj09PS0xKXtpZih0eXBlb2YgdGhpcy5zZXR0aW5ncy5ydWxlc1tydWxlXSE9InVuZGVmaW5lZCIpdj10aGlzLnNldHRpbmdzLnJ1bGVzW3J1bGVdfWVsc2V7b2JqPSFvYmo/dGhpcy5zZWxlY3RlZDp0aGlzLmdldF9ub2RlKG9iaik7aWYoIW9iailyZXR1cm47dmFyIHQ9dGhpcy5nZXRfdHlwZShvYmopO2lmKHR5cGVvZiB0aGlzLnNldHRpbmdzLnR5cGVzW3RdIT0idW5kZWZpbmVkIiYmdHlwZW9mIHRoaXMuc2V0dGluZ3MudHlwZXNbdF1bcnVsZV0hPSJ1bmRlZmluZWQiKXY9dGhpcy5zZXR0aW5ncy50eXBlc1t0XVtydWxlXTtlbHNlIGlmKHR5cGVvZiB0aGlzLnNldHRpbmdzLnR5cGVzWyJkZWZhdWx0Il0hPSJ1bmRlZmluZWQiJiZ0eXBlb2YgdGhpcy5zZXR0aW5ncy50eXBlc1siZGVmYXVsdCJdW3J1bGVdIT0idW5kZWZpbmVkIil2PXRoaXMuc2V0dGluZ3MudHlwZXNbImRlZmF1bHQiXVtydWxlXX1pZih0eXBlb2Ygdj09ImZ1bmN0aW9uIil2PXYuY2FsbChudWxsLG9iaix0aGlzKTt2PXRoaXMuY2FsbGJhY2soImNoZWNrIixbcnVsZSxvYmosdix0aGlzXSk7cmV0dXJuIHZ9LGNoZWNrX21vdmU6ZnVuY3Rpb24obm9kLHJlZl9ub2RlLGhvdyl7aWYodGhpcy5sb2NrZWQpcmV0dXJuIGZhbHNlO2lmKCQocmVmX25vZGUpLmNsb3Nlc3QoImxpLmRyYWdnZWQiKS5zaXplKCkpcmV0dXJuIGZhbHNlO3ZhciB0cmVlMT1ub2QucGFyZW50cygiLnRyZWU6ZXEoMCkiKS5nZXQoMCk7dmFyIHRyZWUyPXJlZl9ub2RlLnBhcmVudHMoIi50cmVlOmVxKDApIikuZ2V0KDApO2lmKHRyZWUxJiZ0cmVlMSE9dHJlZTIpe3ZhciBtPSQudHJlZS5yZWZlcmVuY2UodHJlZTIuaWQpLnNldHRpbmdzLnJ1bGVzLm11bHRpdHJlZTtpZihtPT0ibm9uZSJ8fCgkLmlzQXJyYXkobSkmJiQuaW5BcnJheSh0cmVlMS5pZCxtKT09LTEpKXJldHVybiBmYWxzZX12YXIgcD0oaG93IT0iaW5zaWRlIik/dGhpcy5wYXJlbnQocmVmX25vZGUpOnRoaXMuZ2V0X25vZGUocmVmX25vZGUpO25vZD10aGlzLmdldF9ub2RlKG5vZCk7aWYocD09ZmFsc2UpcmV0dXJuIGZhbHNlO3ZhciByPXttYXhfZGVwdGg6dGhpcy5zZXR0aW5ncy5ydWxlcy51c2VfbWF4X2RlcHRoP3RoaXMuY2hlY2soIm1heF9kZXB0aCIscCk6LTEsbWF4X2NoaWxkcmVuOnRoaXMuc2V0dGluZ3MucnVsZXMudXNlX21heF9jaGlsZHJlbj90aGlzLmNoZWNrKCJtYXhfY2hpbGRyZW4iLHApOi0xLHZhbGlkX2NoaWxkcmVuOnRoaXMuY2hlY2soInZhbGlkX2NoaWxkcmVuIixwKX07dmFyIG5vZF90eXBlPSh0eXBlb2Ygbm9kPT0ic3RyaW5nIik/bm9kOnRoaXMuZ2V0X3R5cGUobm9kKTtpZih0eXBlb2Ygci52YWxpZF9jaGlsZHJlbiE9InVuZGVmaW5lZCImJihyLnZhbGlkX2NoaWxkcmVuPT0ibm9uZSJ8fCh0eXBlb2Ygci52YWxpZF9jaGlsZHJlbj09Im9iamVjdCImJiQuaW5BcnJheShub2RfdHlwZSwkLm1ha2VBcnJheShyLnZhbGlkX2NoaWxkcmVuKSk9PS0xKSkpcmV0dXJuIGZhbHNlO2lmKHRoaXMuc2V0dGluZ3MucnVsZXMudXNlX21heF9jaGlsZHJlbil7aWYodHlwZW9mIHIubWF4X2NoaWxkcmVuIT0idW5kZWZpbmVkIiYmci5tYXhfY2hpbGRyZW4hPS0xKXtpZihyLm1heF9jaGlsZHJlbj09MClyZXR1cm4gZmFsc2U7dmFyIGNfY291bnQ9MTtpZih0cmVlX2NvbXBvbmVudC5kcmFnX2Ryb3AubW92aW5nPT10cnVlJiZ0cmVlX2NvbXBvbmVudC5kcmFnX2Ryb3AuZm9yZWlnbj09ZmFsc2Upe2NfY291bnQ9dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLmRyYWdnZWQuc2l6ZSgpO2NfY291bnQ9Y19jb3VudC1wLmZpbmQoJz4gdWwgPiBsaS5kcmFnZ2VkJykuc2l6ZSgpfWlmKHIubWF4X2NoaWxkcmVuPHAuZmluZCgnPiB1bCA+IGxpJykuc2l6ZSgpK2NfY291bnQpcmV0dXJuIGZhbHNlfX1pZih0aGlzLnNldHRpbmdzLnJ1bGVzLnVzZV9tYXhfZGVwdGgpe2lmKHR5cGVvZiByLm1heF9kZXB0aCE9InVuZGVmaW5lZCImJnIubWF4X2RlcHRoPT09MClyZXR1cm4gdGhpcy5lcnJvcigiTU9WRTogTUFYLURFUFRIIFJFQUNIRUQiKTt2YXIgbXg9KHIubWF4X2RlcHRoPjApP3IubWF4X2RlcHRoOmZhbHNlO3ZhciBpPTA7dmFyIHQ9cDt3aGlsZSh0IT09LTEpe3Q9dGhpcy5wYXJlbnQodCk7aSsrO3ZhciBtPXRoaXMuY2hlY2soIm1heF9kZXB0aCIsdCk7aWYobT49MCl7bXg9KG14PT09ZmFsc2UpPyhtLWkpOk1hdGgubWluKG14LG0taSl9aWYobXghPT1mYWxzZSYmbXg8PTApcmV0dXJuIHRoaXMuZXJyb3IoIk1PVkU6IE1BWC1ERVBUSCBSRUFDSEVEIil9aWYobXghPT1mYWxzZSYmbXg8PTApcmV0dXJuIHRoaXMuZXJyb3IoIk1PVkU6IE1BWC1ERVBUSCBSRUFDSEVEIik7aWYobXghPT1mYWxzZSl7dmFyIGluY3I9MTtpZih0eXBlb2Ygbm9kIT0ic3RyaW5nIil7dmFyIHQ9bm9kO3doaWxlKHQuc2l6ZSgpPjApe2lmKG14LWluY3I8MClyZXR1cm4gdGhpcy5lcnJvcigiTU9WRTogTUFYLURFUFRIIFJFQUNIRUQiKTt0PXQuY2hpbGRyZW4oInVsIikuY2hpbGRyZW4oImxpIik7aW5jcisrfX19fWlmKHRoaXMuY2FsbGJhY2soImNoZWNrX21vdmUiLFtub2QscmVmX25vZGUsaG93LHRoaXNdKT09ZmFsc2UpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfSxob3Zlcl9icmFuY2g6ZnVuY3Rpb24ob2JqKXtpZih0aGlzLmxvY2tlZClyZXR1cm4gdGhpcy5lcnJvcigiTE9DS0VEIik7dmFyIF90aGlzPXRoaXM7dmFyIG9iaj1fdGhpcy5nZXRfbm9kZShvYmopO2lmKCFvYmouc2l6ZSgpKXJldHVybiB0aGlzLmVycm9yKCJIT1ZFUjogTk9UIEEgVkFMSUQgTk9ERSIpO2lmKCFfdGhpcy5jaGVjaygiY2xpY2thYmxlIixvYmopKXJldHVybiB0aGlzLmVycm9yKCJTRUxFQ1Q6IE5PREUgTk9UIFNFTEVDVEFCTEUiKTtpZih0aGlzLmhvdmVyZWQpdGhpcy5ob3ZlcmVkLmNoaWxkcmVuKCJBIikucmVtb3ZlQ2xhc3MoImhvdmVyIik7dGhpcy5ob3ZlcmVkPW9iajt0aGlzLmhvdmVyZWQuY2hpbGRyZW4oImEiKS5hZGRDbGFzcygiaG92ZXIiKTt0aGlzLnNjcm9sbF9pbnRvX3ZpZXcodGhpcy5ob3ZlcmVkKX0sc2VsZWN0X2JyYW5jaDpmdW5jdGlvbihvYmosbXVsdGlwbGUpe2lmKHRoaXMubG9ja2VkKXJldHVybiB0aGlzLmVycm9yKCJMT0NLRUQiKTtpZighb2JqJiZ0aGlzLmhvdmVyZWQhPT1mYWxzZSlvYmo9dGhpcy5ob3ZlcmVkO3ZhciBfdGhpcz10aGlzO29iaj1fdGhpcy5nZXRfbm9kZShvYmopO2lmKCFvYmouc2l6ZSgpKXJldHVybiB0aGlzLmVycm9yKCJTRUxFQ1Q6IE5PVCBBIFZBTElEIE5PREUiKTtvYmouY2hpbGRyZW4oImEiKS5yZW1vdmVDbGFzcygiaG92ZXIiKTtpZighX3RoaXMuY2hlY2soImNsaWNrYWJsZSIsb2JqKSlyZXR1cm4gdGhpcy5lcnJvcigiU0VMRUNUOiBOT0RFIE5PVCBTRUxFQ1RBQkxFIik7aWYoX3RoaXMuY2FsbGJhY2soImJlZm9yZWNoYW5nZSIsW29iai5nZXQoMCksX3RoaXNdKT09PWZhbHNlKXJldHVybiB0aGlzLmVycm9yKCJTRUxFQ1Q6IFNUT1BQRUQgQlkgVVNFUiIpO2lmKHRoaXMuc2V0dGluZ3MucnVsZXMubXVsdGlwbGUhPWZhbHNlJiZtdWx0aXBsZSYmb2JqLmNoaWxkcmVuKCJhLmNsaWNrZWQiKS5zaXplKCk+MCl7cmV0dXJuIHRoaXMuZGVzZWxlY3RfYnJhbmNoKG9iail9aWYodGhpcy5zZXR0aW5ncy5ydWxlcy5tdWx0aXBsZSE9ZmFsc2UmJm11bHRpcGxlKXt0aGlzLnNlbGVjdGVkX2Fyci5wdXNoKG9iail9aWYodGhpcy5zZXR0aW5ncy5ydWxlcy5tdWx0aXBsZSE9ZmFsc2UmJiFtdWx0aXBsZSl7Zm9yKHZhciBpIGluIHRoaXMuc2VsZWN0ZWRfYXJyKXtpZighdGhpcy5zZWxlY3RlZF9hcnIuaGFzT3duUHJvcGVydHkoaSkpY29udGludWU7dGhpcy5zZWxlY3RlZF9hcnJbaV0uY2hpbGRyZW4oIkEiKS5yZW1vdmVDbGFzcygiY2xpY2tlZCIpO3RoaXMuY2FsbGJhY2soIm9uZGVzZWxlY3QiLFt0aGlzLnNlbGVjdGVkX2FycltpXS5nZXQoMCksX3RoaXNdKX10aGlzLnNlbGVjdGVkX2Fycj1bXTt0aGlzLnNlbGVjdGVkX2Fyci5wdXNoKG9iaik7aWYodGhpcy5zZWxlY3RlZCYmdGhpcy5zZWxlY3RlZC5jaGlsZHJlbigiQSIpLmhhc0NsYXNzKCJjbGlja2VkIikpe3RoaXMuc2VsZWN0ZWQuY2hpbGRyZW4oIkEiKS5yZW1vdmVDbGFzcygiY2xpY2tlZCIpO3RoaXMuY2FsbGJhY2soIm9uZGVzZWxlY3QiLFt0aGlzLnNlbGVjdGVkLmdldCgwKSxfdGhpc10pfX1pZighdGhpcy5zZXR0aW5ncy5ydWxlcy5tdWx0aXBsZSl7aWYodGhpcy5zZWxlY3RlZCl7dGhpcy5zZWxlY3RlZC5jaGlsZHJlbigiQSIpLnJlbW92ZUNsYXNzKCJjbGlja2VkIik7dGhpcy5jYWxsYmFjaygib25kZXNlbGVjdCIsW3RoaXMuc2VsZWN0ZWQuZ2V0KDApLF90aGlzXSl9fXRoaXMuc2VsZWN0ZWQ9b2JqO2lmKHRoaXMuaG92ZXJlZCE9PWZhbHNlKXt0aGlzLmhvdmVyZWQuY2hpbGRyZW4oIkEiKS5yZW1vdmVDbGFzcygiaG92ZXIiKTt0aGlzLmhvdmVyZWQ9b2JqfXRoaXMuc2VsZWN0ZWQuY2hpbGRyZW4oImEiKS5hZGRDbGFzcygiY2xpY2tlZCIpLmVuZCgpLnBhcmVudHMoImxpLmNsb3NlZCIpLmVhY2goZnVuY3Rpb24oKXtfdGhpcy5vcGVuX2JyYW5jaCh0aGlzLHRydWUpfSk7dGhpcy5zY3JvbGxfaW50b192aWV3KHRoaXMuc2VsZWN0ZWQpO3RoaXMuY2FsbGJhY2soIm9uc2VsZWN0IixbdGhpcy5zZWxlY3RlZC5nZXQoMCksX3RoaXNdKTt0aGlzLmNhbGxiYWNrKCJvbmNoYW5nZSIsW3RoaXMuc2VsZWN0ZWQuZ2V0KDApLF90aGlzXSl9LGRlc2VsZWN0X2JyYW5jaDpmdW5jdGlvbihvYmope2lmKHRoaXMubG9ja2VkKXJldHVybiB0aGlzLmVycm9yKCJMT0NLRUQiKTt2YXIgX3RoaXM9dGhpczt2YXIgb2JqPXRoaXMuZ2V0X25vZGUob2JqKTtpZihvYmouY2hpbGRyZW4oImEuY2xpY2tlZCIpLnNpemUoKT09MClyZXR1cm4gdGhpcy5lcnJvcigiREVTRUxFQ1Q6IE5PREUgTk9UIFNFTEVDVEVEIik7b2JqLmNoaWxkcmVuKCJhIikucmVtb3ZlQ2xhc3MoImNsaWNrZWQiKTt0aGlzLmNhbGxiYWNrKCJvbmRlc2VsZWN0Iixbb2JqLmdldCgwKSxfdGhpc10pO2lmKHRoaXMuc2V0dGluZ3MucnVsZXMubXVsdGlwbGUhPWZhbHNlJiZ0aGlzLnNlbGVjdGVkX2Fyci5sZW5ndGg+MSl7dGhpcy5zZWxlY3RlZF9hcnI9W107dGhpcy5jb250YWluZXIuZmluZCgiYS5jbGlja2VkIikuZmlsdGVyKCI6Zmlyc3QtY2hpbGQiKS5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7X3RoaXMuc2VsZWN0ZWRfYXJyLnB1c2goJCh0aGlzKSl9KTtpZihvYmouZ2V0KDApPT10aGlzLnNlbGVjdGVkLmdldCgwKSl7dGhpcy5zZWxlY3RlZD10aGlzLnNlbGVjdGVkX2FyclswXX19ZWxzZXtpZih0aGlzLnNldHRpbmdzLnJ1bGVzLm11bHRpcGxlIT1mYWxzZSl0aGlzLnNlbGVjdGVkX2Fycj1bXTt0aGlzLnNlbGVjdGVkPWZhbHNlfXRoaXMuY2FsbGJhY2soIm9uY2hhbmdlIixbb2JqLmdldCgwKSxfdGhpc10pfSx0b2dnbGVfYnJhbmNoOmZ1bmN0aW9uKG9iail7aWYodGhpcy5sb2NrZWQpcmV0dXJuIHRoaXMuZXJyb3IoIkxPQ0tFRCIpO3ZhciBvYmo9dGhpcy5nZXRfbm9kZShvYmopO2lmKG9iai5oYXNDbGFzcygiY2xvc2VkIikpcmV0dXJuIHRoaXMub3Blbl9icmFuY2gob2JqKTtpZihvYmouaGFzQ2xhc3MoIm9wZW4iKSlyZXR1cm4gdGhpcy5jbG9zZV9icmFuY2gob2JqKX0sb3Blbl9icmFuY2g6ZnVuY3Rpb24ob2JqLGRpc2FibGVfYW5pbWF0aW9uLGNhbGxiYWNrKXt2YXIgX3RoaXM9dGhpcztpZih0aGlzLmxvY2tlZClyZXR1cm4gdGhpcy5lcnJvcigiTE9DS0VEIik7dmFyIG9iaj10aGlzLmdldF9ub2RlKG9iaik7aWYoIW9iai5zaXplKCkpcmV0dXJuIHRoaXMuZXJyb3IoIk9QRU46IE5PIFNVQ0ggTk9ERSIpO2lmKG9iai5oYXNDbGFzcygibGVhZiIpKXJldHVybiB0aGlzLmVycm9yKCJPUEVOOiBPUEVOSU5HIExFQUYgTk9ERSIpO2lmKHRoaXMuc2V0dGluZ3MuZGF0YS5hc3luYyYmb2JqLmZpbmQoImxpIikuc2l6ZSgpPT0wKXtpZih0aGlzLmNhbGxiYWNrKCJiZWZvcmVvcGVuIixbb2JqLmdldCgwKSx0aGlzXSk9PT1mYWxzZSlyZXR1cm4gdGhpcy5lcnJvcigiT1BFTjogU1RPUFBFRCBCWSBVU0VSIik7b2JqLmNoaWxkcmVuKCJ1bDplcSgwKSIpLnJlbW92ZSgpLmVuZCgpLmFwcGVuZCgiPHVsPjxsaSBjbGFzcz0nbGFzdCc+PGEgY2xhc3M9J2xvYWRpbmcnIGhyZWY9JyMnPjxpbnM+Jm5ic3A7PC9pbnM+IisoX3RoaXMuc2V0dGluZ3MubGFuZy5sb2FkaW5nfHwiTG9hZGluZyAuLi4iKSsiPC9hPjwvbGk+PC91bD4iKTtvYmoucmVtb3ZlQ2xhc3MoImNsb3NlZCIpLmFkZENsYXNzKCJvcGVuIik7dmFyIF9kYXRhc3RvcmU9bmV3ICQudHJlZS5kYXRhc3RvcmVzW3RoaXMuc2V0dGluZ3MuZGF0YS50eXBlXSgpO19kYXRhc3RvcmUubG9hZCh0aGlzLmNhbGxiYWNrKCJiZWZvcmVkYXRhIixbb2JqLHRoaXNdKSx0aGlzLHRoaXMuc2V0dGluZ3MuZGF0YS5vcHRzLGZ1bmN0aW9uKGRhdGEpe2RhdGE9X3RoaXMuY2FsbGJhY2soIm9uZGF0YSIsW2RhdGEsX3RoaXNdKTtpZighZGF0YXx8ZGF0YS5sZW5ndGg9PTApe29iai5yZW1vdmVDbGFzcygiY2xvc2VkIikucmVtb3ZlQ2xhc3MoIm9wZW4iKS5hZGRDbGFzcygibGVhZiIpLmNoaWxkcmVuKCJ1bCIpLnJlbW92ZSgpO2lmKGNhbGxiYWNrKWNhbGxiYWNrLmNhbGwoKTtyZXR1cm59X2RhdGFzdG9yZS5wYXJzZShkYXRhLF90aGlzLF90aGlzLnNldHRpbmdzLmRhdGEub3B0cyxmdW5jdGlvbihzdHIpe3N0cj1fdGhpcy5jYWxsYmFjaygib25wYXJzZSIsW3N0cixfdGhpc10pO29iai5jaGlsZHJlbigidWw6ZXEoMCkiKS5yZXBsYWNlV2l0aCgkKCI8dWw+IikuaHRtbChzdHIpKTtvYmouZmluZCgibGk6bGFzdC1jaGlsZCIpLmFkZENsYXNzKCJsYXN0IikuZW5kKCkuZmluZCgibGk6aGFzKHVsKSIpLm5vdCgiLm9wZW4iKS5hZGRDbGFzcygiY2xvc2VkIik7b2JqLmZpbmQoImxpIikubm90KCIub3BlbiIpLm5vdCgiLmNsb3NlZCIpLmFkZENsYXNzKCJsZWFmIik7X3RoaXMub3Blbl9icmFuY2guYXBwbHkoX3RoaXMsW29ial0pO2lmKGNhbGxiYWNrKWNhbGxiYWNrLmNhbGwoKX0pfSk7cmV0dXJuIHRydWV9ZWxzZXtpZighdGhpcy5zZXR0aW5ncy5kYXRhLmFzeW5jKXtpZih0aGlzLmNhbGxiYWNrKCJiZWZvcmVvcGVuIixbb2JqLmdldCgwKSx0aGlzXSk9PT1mYWxzZSlyZXR1cm4gdGhpcy5lcnJvcigiT1BFTjogU1RPUFBFRCBCWSBVU0VSIil9aWYocGFyc2VJbnQodGhpcy5zZXR0aW5ncy51aS5hbmltYXRpb24pPjAmJiFkaXNhYmxlX2FuaW1hdGlvbil7b2JqLmNoaWxkcmVuKCJ1bDplcSgwKSIpLmNzcygiZGlzcGxheSIsIm5vbmUiKTtvYmoucmVtb3ZlQ2xhc3MoImNsb3NlZCIpLmFkZENsYXNzKCJvcGVuIik7b2JqLmNoaWxkcmVuKCJ1bDplcSgwKSIpLnNsaWRlRG93bihwYXJzZUludCh0aGlzLnNldHRpbmdzLnVpLmFuaW1hdGlvbiksZnVuY3Rpb24oKXskKHRoaXMpLmNzcygiZGlzcGxheSIsIiIpO2lmKGNhbGxiYWNrKWNhbGxiYWNrLmNhbGwoKX0pfWVsc2V7b2JqLnJlbW92ZUNsYXNzKCJjbG9zZWQiKS5hZGRDbGFzcygib3BlbiIpO2lmKGNhbGxiYWNrKWNhbGxiYWNrLmNhbGwoKX10aGlzLmNhbGxiYWNrKCJvbm9wZW4iLFtvYmouZ2V0KDApLHRoaXNdKTtyZXR1cm4gdHJ1ZX19LGNsb3NlX2JyYW5jaDpmdW5jdGlvbihvYmosZGlzYWJsZV9hbmltYXRpb24pe2lmKHRoaXMubG9ja2VkKXJldHVybiB0aGlzLmVycm9yKCJMT0NLRUQiKTt2YXIgX3RoaXM9dGhpczt2YXIgb2JqPXRoaXMuZ2V0X25vZGUob2JqKTtpZighb2JqLnNpemUoKSlyZXR1cm4gdGhpcy5lcnJvcigiQ0xPU0U6IE5PIFNVQ0ggTk9ERSIpO2lmKF90aGlzLmNhbGxiYWNrKCJiZWZvcmVjbG9zZSIsW29iai5nZXQoMCksX3RoaXNdKT09PWZhbHNlKXJldHVybiB0aGlzLmVycm9yKCJDTE9TRTogU1RPUFBFRCBCWSBVU0VSIik7aWYocGFyc2VJbnQodGhpcy5zZXR0aW5ncy51aS5hbmltYXRpb24pPjAmJiFkaXNhYmxlX2FuaW1hdGlvbiYmb2JqLmNoaWxkcmVuKCJ1bDplcSgwKSIpLnNpemUoKT09MSl7b2JqLmNoaWxkcmVuKCJ1bDplcSgwKSIpLnNsaWRlVXAocGFyc2VJbnQodGhpcy5zZXR0aW5ncy51aS5hbmltYXRpb24pLGZ1bmN0aW9uKCl7aWYob2JqLmhhc0NsYXNzKCJvcGVuIikpb2JqLnJlbW92ZUNsYXNzKCJvcGVuIikuYWRkQ2xhc3MoImNsb3NlZCIpOyQodGhpcykuY3NzKCJkaXNwbGF5IiwiIil9KX1lbHNle2lmKG9iai5oYXNDbGFzcygib3BlbiIpKW9iai5yZW1vdmVDbGFzcygib3BlbiIpLmFkZENsYXNzKCJjbG9zZWQiKX1pZih0aGlzLnNlbGVjdGVkJiZ0aGlzLnNldHRpbmdzLnVpLnNlbGVjdGVkX3BhcmVudF9jbG9zZSE9PWZhbHNlJiZvYmouY2hpbGRyZW4oInVsOmVxKDApIikuZmluZCgiYS5jbGlja2VkIikuc2l6ZSgpPjApe29iai5maW5kKCJsaTpoYXMoYS5jbGlja2VkKSIpLmVhY2goZnVuY3Rpb24oKXtfdGhpcy5kZXNlbGVjdF9icmFuY2godGhpcyl9KTtpZih0aGlzLnNldHRpbmdzLnVpLnNlbGVjdGVkX3BhcmVudF9jbG9zZT09InNlbGVjdF9wYXJlbnQiJiZvYmouY2hpbGRyZW4oImEuY2xpY2tlZCIpLnNpemUoKT09MCl0aGlzLnNlbGVjdF9icmFuY2gob2JqLCh0aGlzLnNldHRpbmdzLnJ1bGVzLm11bHRpcGxlIT1mYWxzZSYmdGhpcy5zZWxlY3RlZF9hcnIubGVuZ3RoPjApKX10aGlzLmNhbGxiYWNrKCJvbmNsb3NlIixbb2JqLmdldCgwKSx0aGlzXSl9LG9wZW5fYWxsOmZ1bmN0aW9uKG9iaixjYWxsYmFjayl7aWYodGhpcy5sb2NrZWQpcmV0dXJuIHRoaXMuZXJyb3IoIkxPQ0tFRCIpO3ZhciBfdGhpcz10aGlzO29iaj1vYmo/dGhpcy5nZXRfbm9kZShvYmopOnRoaXMuY29udGFpbmVyO3ZhciBzPW9iai5maW5kKCJsaS5jbG9zZWQiKS5zaXplKCk7aWYoIWNhbGxiYWNrKXRoaXMuY2xfY291bnQ9MDtlbHNlIHRoaXMuY2xfY291bnQtLTtpZihzPjApe3RoaXMuY2xfY291bnQrPXM7b2JqLmZpbmQoImxpLmNsb3NlZCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgX190aGlzPXRoaXM7X3RoaXMub3Blbl9icmFuY2guYXBwbHkoX3RoaXMsW3RoaXMsdHJ1ZSxmdW5jdGlvbigpe190aGlzLm9wZW5fYWxsLmFwcGx5KF90aGlzLFtfX3RoaXMsdHJ1ZV0pfV0pfSl9ZWxzZSBpZih0aGlzLmNsX2NvdW50PT0wKXRoaXMuY2FsbGJhY2soIm9ub3Blbl9hbGwiLFt0aGlzXSl9LGNsb3NlX2FsbDpmdW5jdGlvbihvYmope2lmKHRoaXMubG9ja2VkKXJldHVybiB0aGlzLmVycm9yKCJMT0NLRUQiKTt2YXIgX3RoaXM9dGhpcztvYmo9b2JqP3RoaXMuZ2V0X25vZGUob2JqKTp0aGlzLmNvbnRhaW5lcjtvYmouZmluZCgibGkub3BlbiIpLmVhY2goZnVuY3Rpb24oKXtfdGhpcy5jbG9zZV9icmFuY2godGhpcyx0cnVlKX0pO3RoaXMuY2FsbGJhY2soIm9uY2xvc2VfYWxsIixbdGhpc10pfSxzZXRfbGFuZzpmdW5jdGlvbihpKXtpZighJC5pc0FycmF5KHRoaXMuc2V0dGluZ3MubGFuZ3VhZ2VzKXx8dGhpcy5zZXR0aW5ncy5sYW5ndWFnZXMubGVuZ3RoPT0wKXJldHVybiBmYWxzZTtpZih0aGlzLmxvY2tlZClyZXR1cm4gdGhpcy5lcnJvcigiTE9DS0VEIik7aWYoISQuaW5BcnJheShpLHRoaXMuc2V0dGluZ3MubGFuZ3VhZ2VzKSYmdHlwZW9mIHRoaXMuc2V0dGluZ3MubGFuZ3VhZ2VzW2ldIT0idW5kZWZpbmVkIilpPXRoaXMuc2V0dGluZ3MubGFuZ3VhZ2VzW2ldO2lmKHR5cGVvZiBpPT0idW5kZWZpbmVkIilyZXR1cm4gZmFsc2U7aWYoaT09dGhpcy5jdXJyZW50X2xhbmcpcmV0dXJuIHRydWU7dmFyIHN0PWZhbHNlO3ZhciBpZD0iIyIrdGhpcy5jb250YWluZXIuYXR0cigiaWQiKTtzdD10cmVlX2NvbXBvbmVudC5nZXRfY3NzKGlkKyIgLiIrdGhpcy5jdXJyZW50X2xhbmcpO2lmKHN0IT09ZmFsc2Upc3Quc3R5bGUuZGlzcGxheT0ibm9uZSI7c3Q9dHJlZV9jb21wb25lbnQuZ2V0X2NzcyhpZCsiIC4iK2kpO2lmKHN0IT09ZmFsc2Upc3Quc3R5bGUuZGlzcGxheT0iIjt0aGlzLmN1cnJlbnRfbGFuZz1pO3JldHVybiB0cnVlfSxnZXRfbGFuZzpmdW5jdGlvbigpe2lmKCEkLmlzQXJyYXkodGhpcy5zZXR0aW5ncy5sYW5ndWFnZXMpfHx0aGlzLnNldHRpbmdzLmxhbmd1YWdlcy5sZW5ndGg9PTApcmV0dXJuIGZhbHNlO3JldHVybiB0aGlzLmN1cnJlbnRfbGFuZ30sY3JlYXRlOmZ1bmN0aW9uKG9iaixyZWZfbm9kZSxwb3NpdGlvbil7aWYodGhpcy5sb2NrZWQpcmV0dXJuIHRoaXMuZXJyb3IoIkxPQ0tFRCIpO3ZhciByb290PWZhbHNlO2lmKHJlZl9ub2RlPT0tMSl7cm9vdD10cnVlO3JlZl9ub2RlPXRoaXMuY29udGFpbmVyfWVsc2UgcmVmX25vZGU9cmVmX25vZGU/dGhpcy5nZXRfbm9kZShyZWZfbm9kZSk6dGhpcy5zZWxlY3RlZDtpZighcm9vdCYmKCFyZWZfbm9kZXx8IXJlZl9ub2RlLnNpemUoKSkpcmV0dXJuIHRoaXMuZXJyb3IoIkNSRUFURTogTk8gTk9ERSBTRUxFQ1RFRCIpO3ZhciBwb3M9cG9zaXRpb247dmFyIHRtcD1yZWZfbm9kZTtpZihwb3NpdGlvbj09ImJlZm9yZSIpe3Bvc2l0aW9uPXJlZl9ub2RlLnBhcmVudCgpLmNoaWxkcmVuKCkuaW5kZXgocmVmX25vZGUpO3JlZl9ub2RlPXJlZl9ub2RlLnBhcmVudHMoImxpOmVxKDApIil9aWYocG9zaXRpb249PSJhZnRlciIpe3Bvc2l0aW9uPXJlZl9ub2RlLnBhcmVudCgpLmNoaWxkcmVuKCkuaW5kZXgocmVmX25vZGUpKzE7cmVmX25vZGU9cmVmX25vZGUucGFyZW50cygibGk6ZXEoMCkiKX1pZighcm9vdCYmcmVmX25vZGUuc2l6ZSgpPT0wKXtyb290PXRydWU7cmVmX25vZGU9dGhpcy5jb250YWluZXJ9aWYoIXJvb3Qpe2lmKCF0aGlzLmNoZWNrKCJjcmVhdGFibGUiLHJlZl9ub2RlKSlyZXR1cm4gdGhpcy5lcnJvcigiQ1JFQVRFOiBDQU5OT1QgQ1JFQVRFIElOIE5PREUiKTtpZihyZWZfbm9kZS5oYXNDbGFzcygiY2xvc2VkIikpe2lmKHRoaXMuc2V0dGluZ3MuZGF0YS5hc3luYyYmcmVmX25vZGUuY2hpbGRyZW4oInVsIikuc2l6ZSgpPT0wKXt2YXIgX3RoaXM9dGhpcztyZXR1cm4gdGhpcy5vcGVuX2JyYW5jaChyZWZfbm9kZSx0cnVlLGZ1bmN0aW9uKCl7X3RoaXMuY3JlYXRlLmFwcGx5KF90aGlzLFtvYmoscmVmX25vZGUscG9zaXRpb25dKX0pfWVsc2UgdGhpcy5vcGVuX2JyYW5jaChyZWZfbm9kZSx0cnVlKX19dmFyIHRvcmVuYW1lPWZhbHNlO2lmKCFvYmopb2JqPXt9O2Vsc2Ugb2JqPSQuZXh0ZW5kKHRydWUse30sb2JqKTtpZighb2JqLmF0dHJpYnV0ZXMpb2JqLmF0dHJpYnV0ZXM9e307aWYoIW9iai5hdHRyaWJ1dGVzW3RoaXMuc2V0dGluZ3MucnVsZXMudHlwZV9hdHRyXSlvYmouYXR0cmlidXRlc1t0aGlzLnNldHRpbmdzLnJ1bGVzLnR5cGVfYXR0cl09dGhpcy5nZXRfdHlwZSh0bXApfHwiZGVmYXVsdCI7aWYodGhpcy5zZXR0aW5ncy5sYW5ndWFnZXMubGVuZ3RoKXtpZighb2JqLmRhdGEpe29iai5kYXRhPXt9O3RvcmVuYW1lPXRydWV9Zm9yKHZhciBpPTA7aTx0aGlzLnNldHRpbmdzLmxhbmd1YWdlcy5sZW5ndGg7aSsrKXtpZighb2JqLmRhdGFbdGhpcy5zZXR0aW5ncy5sYW5ndWFnZXNbaV1dKW9iai5kYXRhW3RoaXMuc2V0dGluZ3MubGFuZ3VhZ2VzW2ldXT0oKHR5cGVvZiB0aGlzLnNldHRpbmdzLmxhbmcubmV3X25vZGUpLnRvTG93ZXJDYXNlKCkhPSJzdHJpbmciJiZ0aGlzLnNldHRpbmdzLmxhbmcubmV3X25vZGVbaV0pP3RoaXMuc2V0dGluZ3MubGFuZy5uZXdfbm9kZVtpXTp0aGlzLnNldHRpbmdzLmxhbmcubmV3X25vZGV9fWVsc2V7aWYoIW9iai5kYXRhKXtvYmouZGF0YT10aGlzLnNldHRpbmdzLmxhbmcubmV3X25vZGU7dG9yZW5hbWU9dHJ1ZX19b2JqPXRoaXMuY2FsbGJhY2soIm9uZGF0YSIsW29iaix0aGlzXSk7dmFyIG9ial9zPSQudHJlZS5kYXRhc3RvcmVzLmpzb24oKS5wYXJzZShvYmosdGhpcyk7b2JqX3M9dGhpcy5jYWxsYmFjaygib25wYXJzZSIsW29ial9zLHRoaXNdKTt2YXIgJGxpPSQob2JqX3MpO2lmKCRsaS5jaGlsZHJlbigidWwiKS5zaXplKCkpe2lmKCEkbGkuaXMoIi5vcGVuIikpJGxpLmFkZENsYXNzKCJjbG9zZWQiKX1lbHNlICRsaS5hZGRDbGFzcygibGVhZiIpOyRsaS5maW5kKCJsaTpsYXN0LWNoaWxkIikuYWRkQ2xhc3MoImxhc3QiKS5lbmQoKS5maW5kKCJsaTpoYXModWwpIikubm90KCIub3BlbiIpLmFkZENsYXNzKCJjbG9zZWQiKTskbGkuZmluZCgibGkiKS5ub3QoIi5vcGVuIikubm90KCIuY2xvc2VkIikuYWRkQ2xhc3MoImxlYWYiKTt2YXIgcj17bWF4X2RlcHRoOnRoaXMuc2V0dGluZ3MucnVsZXMudXNlX21heF9kZXB0aD90aGlzLmNoZWNrKCJtYXhfZGVwdGgiLChyb290Py0xOnJlZl9ub2RlKSk6LTEsbWF4X2NoaWxkcmVuOnRoaXMuc2V0dGluZ3MucnVsZXMudXNlX21heF9jaGlsZHJlbj90aGlzLmNoZWNrKCJtYXhfY2hpbGRyZW4iLChyb290Py0xOnJlZl9ub2RlKSk6LTEsdmFsaWRfY2hpbGRyZW46dGhpcy5jaGVjaygidmFsaWRfY2hpbGRyZW4iLChyb290Py0xOnJlZl9ub2RlKSl9O3ZhciBub2RfdHlwZT10aGlzLmdldF90eXBlKCRsaSk7aWYodHlwZW9mIHIudmFsaWRfY2hpbGRyZW4hPSJ1bmRlZmluZWQiJiYoci52YWxpZF9jaGlsZHJlbj09Im5vbmUifHwoJC5pc0FycmF5KHIudmFsaWRfY2hpbGRyZW4pJiYkLmluQXJyYXkobm9kX3R5cGUsci52YWxpZF9jaGlsZHJlbik9PS0xKSkpcmV0dXJuIHRoaXMuZXJyb3IoIkNSRUFURTogTk9ERSBOT1QgQSBWQUxJRCBDSElMRCIpO2lmKHRoaXMuc2V0dGluZ3MucnVsZXMudXNlX21heF9jaGlsZHJlbil7aWYodHlwZW9mIHIubWF4X2NoaWxkcmVuIT0idW5kZWZpbmVkIiYmci5tYXhfY2hpbGRyZW4hPS0xJiZyLm1heF9jaGlsZHJlbj49dGhpcy5jaGlsZHJlbihyZWZfbm9kZSkuc2l6ZSgpKXJldHVybiB0aGlzLmVycm9yKCJDUkVBVEU6IE1BWF9DSElMRFJFTiBSRUFDSEVEIil9aWYodGhpcy5zZXR0aW5ncy5ydWxlcy51c2VfbWF4X2RlcHRoKXtpZih0eXBlb2Ygci5tYXhfZGVwdGghPSJ1bmRlZmluZWQiJiZyLm1heF9kZXB0aD09PTApcmV0dXJuIHRoaXMuZXJyb3IoIkNSRUFURTogTUFYLURFUFRIIFJFQUNIRUQiKTt2YXIgbXg9KHIubWF4X2RlcHRoPjApP3IubWF4X2RlcHRoOmZhbHNlO3ZhciBpPTA7dmFyIHQ9cmVmX25vZGU7d2hpbGUodCE9PS0xJiYhcm9vdCl7dD10aGlzLnBhcmVudCh0KTtpKys7dmFyIG09dGhpcy5jaGVjaygibWF4X2RlcHRoIix0KTtpZihtPj0wKXtteD0obXg9PT1mYWxzZSk/KG0taSk6TWF0aC5taW4obXgsbS1pKX1pZihteCE9PWZhbHNlJiZteDw9MClyZXR1cm4gdGhpcy5lcnJvcigiQ1JFQVRFOiBNQVgtREVQVEggUkVBQ0hFRCIpfWlmKG14IT09ZmFsc2UmJm14PD0wKXJldHVybiB0aGlzLmVycm9yKCJDUkVBVEU6IE1BWC1ERVBUSCBSRUFDSEVEIik7aWYobXghPT1mYWxzZSl7dmFyIGluY3I9MTt2YXIgdD0kbGk7d2hpbGUodC5zaXplKCk+MCl7aWYobXgtaW5jcjwwKXJldHVybiB0aGlzLmVycm9yKCJDUkVBVEU6IE1BWC1ERVBUSCBSRUFDSEVEIik7dD10LmNoaWxkcmVuKCJ1bCIpLmNoaWxkcmVuKCJsaSIpO2luY3IrK319fWlmKCh0eXBlb2YgcG9zaXRpb24pLnRvTG93ZXJDYXNlKCk9PSJ1bmRlZmluZWQifHxwb3NpdGlvbj09Imluc2lkZSIpcG9zaXRpb249KHRoaXMuc2V0dGluZ3MucnVsZXMuY3JlYXRlYXQ9PSJ0b3AiKT8wOnJlZl9ub2RlLmNoaWxkcmVuKCJ1bDplcSgwKSIpLmNoaWxkcmVuKCJsaSIpLnNpemUoKTtpZihyZWZfbm9kZS5jaGlsZHJlbigidWwiKS5zaXplKCk9PTB8fChyb290PT10cnVlJiZyZWZfbm9kZS5jaGlsZHJlbigidWwiKS5jaGlsZHJlbigibGkiKS5zaXplKCk9PTApKXtpZighcm9vdCl2YXIgYT10aGlzLm1vdmVkKCRsaSxyZWZfbm9kZS5jaGlsZHJlbigiYTplcSgwKSIpLCJpbnNpZGUiLHRydWUpO2Vsc2UgdmFyIGE9dGhpcy5tb3ZlZCgkbGksdGhpcy5jb250YWluZXIuY2hpbGRyZW4oInVsOmVxKDApIiksImluc2lkZSIsdHJ1ZSl9ZWxzZSBpZihwb3M9PSJiZWZvcmUiJiZyZWZfbm9kZS5jaGlsZHJlbigidWw6ZXEoMCkiKS5jaGlsZHJlbigibGk6bnRoLWNoaWxkKCIrKHBvc2l0aW9uKzEpKyIpIikuc2l6ZSgpKXZhciBhPXRoaXMubW92ZWQoJGxpLHJlZl9ub2RlLmNoaWxkcmVuKCJ1bDplcSgwKSIpLmNoaWxkcmVuKCJsaTpudGgtY2hpbGQoIisocG9zaXRpb24rMSkrIikiKS5jaGlsZHJlbigiYTplcSgwKSIpLCJiZWZvcmUiLHRydWUpO2Vsc2UgaWYocG9zPT0iYWZ0ZXIiJiZyZWZfbm9kZS5jaGlsZHJlbigidWw6ZXEoMCkiKS5jaGlsZHJlbigibGk6bnRoLWNoaWxkKCIrKHBvc2l0aW9uKSsiKSIpLnNpemUoKSl2YXIgYT10aGlzLm1vdmVkKCRsaSxyZWZfbm9kZS5jaGlsZHJlbigidWw6ZXEoMCkiKS5jaGlsZHJlbigibGk6bnRoLWNoaWxkKCIrKHBvc2l0aW9uKSsiKSIpLmNoaWxkcmVuKCJhOmVxKDApIiksImFmdGVyIix0cnVlKTtlbHNlIGlmKHJlZl9ub2RlLmNoaWxkcmVuKCJ1bDplcSgwKSIpLmNoaWxkcmVuKCJsaTpudGgtY2hpbGQoIisocG9zaXRpb24rMSkrIikiKS5zaXplKCkpdmFyIGE9dGhpcy5tb3ZlZCgkbGkscmVmX25vZGUuY2hpbGRyZW4oInVsOmVxKDApIikuY2hpbGRyZW4oImxpOm50aC1jaGlsZCgiKyhwb3NpdGlvbisxKSsiKSIpLmNoaWxkcmVuKCJhOmVxKDApIiksImJlZm9yZSIsdHJ1ZSk7ZWxzZSB2YXIgYT10aGlzLm1vdmVkKCRsaSxyZWZfbm9kZS5jaGlsZHJlbigidWw6ZXEoMCkiKS5jaGlsZHJlbigibGk6bGFzdCIpLmNoaWxkcmVuKCJhOmVxKDApIiksImFmdGVyIix0cnVlKTtpZihhPT09ZmFsc2UpcmV0dXJuIHRoaXMuZXJyb3IoIkNSRUFURTogQUJPUlRFRCIpO2lmKHRvcmVuYW1lKXt0aGlzLnNlbGVjdF9icmFuY2goJGxpLmNoaWxkcmVuKCJhOmVxKDApIikpO3RoaXMucmVuYW1lKCl9cmV0dXJuICRsaX0scmVuYW1lOmZ1bmN0aW9uKG9iaixuZXdfbmFtZSl7aWYodGhpcy5sb2NrZWQpcmV0dXJuIHRoaXMuZXJyb3IoIkxPQ0tFRCIpO29iaj1vYmo/dGhpcy5nZXRfbm9kZShvYmopOnRoaXMuc2VsZWN0ZWQ7dmFyIF90aGlzPXRoaXM7aWYoIW9ianx8IW9iai5zaXplKCkpcmV0dXJuIHRoaXMuZXJyb3IoIlJFTkFNRTogTk8gTk9ERSBTRUxFQ1RFRCIpO2lmKCF0aGlzLmNoZWNrKCJyZW5hbWVhYmxlIixvYmopKXJldHVybiB0aGlzLmVycm9yKCJSRU5BTUU6IE5PREUgTk9UIFJFTkFNQUJMRSIpO2lmKCF0aGlzLmNhbGxiYWNrKCJiZWZvcmVyZW5hbWUiLFtvYmouZ2V0KDApLF90aGlzLmN1cnJlbnRfbGFuZyxfdGhpc10pKXJldHVybiB0aGlzLmVycm9yKCJSRU5BTUU6IFNUT1BQRUQgQlkgVVNFUiIpO29iai5wYXJlbnRzKCJsaS5jbG9zZWQiKS5lYWNoKGZ1bmN0aW9uKCl7X3RoaXMub3Blbl9icmFuY2godGhpcyl9KTtpZih0aGlzLmN1cnJlbnRfbGFuZylvYmo9b2JqLmZpbmQoImEuIit0aGlzLmN1cnJlbnRfbGFuZyk7ZWxzZSBvYmo9b2JqLmZpbmQoImE6Zmlyc3QiKTt2YXIgcmI9e307cmJbdGhpcy5jb250YWluZXIuYXR0cigiaWQiKV09dGhpcy5nZXRfcm9sbGJhY2soKTt2YXIgaWNuPW9iai5jaGlsZHJlbigiaW5zIikuY2xvbmUoKTtpZigodHlwZW9mIG5ld19uYW1lKS50b0xvd2VyQ2FzZSgpPT0ic3RyaW5nIil7b2JqLnRleHQobmV3X25hbWUpLnByZXBlbmQoaWNuKTtfdGhpcy5jYWxsYmFjaygib25yZW5hbWUiLFtfdGhpcy5nZXRfbm9kZShvYmopLmdldCgwKSxfdGhpcyxyYl0pfWVsc2V7dmFyIGxhc3RfdmFsdWU9IiI7b2JqLmNvbnRlbnRzKCkuZWFjaChmdW5jdGlvbigpe2lmKHRoaXMubm9kZVR5cGU9PTMpe2xhc3RfdmFsdWU9dGhpcy5kYXRhO3JldHVybiBmYWxzZX19KTtfdGhpcy5pbnA9JCgiPGlucHV0IHR5cGU9J3RleHQnIGF1dG9jb21wbGV0ZT0nb2ZmJyAvPiIpO190aGlzLmlucC52YWwobGFzdF92YWx1ZS5yZXBsYWNlKC8mYW1wOy9nLCImIikucmVwbGFjZSgvJmd0Oy9nLCI+IikucmVwbGFjZSgvJmx0Oy9nLCI8IikpLmJpbmQoIm1vdXNlZG93biIsZnVuY3Rpb24oZXZlbnQpe2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpfSkuYmluZCgibW91c2V1cCIsZnVuY3Rpb24oZXZlbnQpe2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpfSkuYmluZCgiY2xpY2siLGZ1bmN0aW9uKGV2ZW50KXtldmVudC5zdG9wUHJvcGFnYXRpb24oKX0pLmJpbmQoImtleXVwIixmdW5jdGlvbihldmVudCl7dmFyIGtleT1ldmVudC5rZXlDb2RlfHxldmVudC53aGljaDtpZihrZXk9PTI3KXt0aGlzLnZhbHVlPWxhc3RfdmFsdWU7dGhpcy5ibHVyKCk7cmV0dXJufWlmKGtleT09MTMpe3RoaXMuYmx1cigpO3JldHVybn19KTtfdGhpcy5pbnAuYmx1cihmdW5jdGlvbihldmVudCl7aWYodGhpcy52YWx1ZT09IiIpdGhpcy52YWx1ZT1sYXN0X3ZhbHVlO29iai50ZXh0KHRoaXMudmFsdWUpLnByZXBlbmQoaWNuKTtvYmouZ2V0KDApLnN0eWxlLmRpc3BsYXk9IiI7b2JqLnByZXZBbGwoInNwYW4iKS5yZW1vdmUoKTtfdGhpcy5pbnA9ZmFsc2U7X3RoaXMuY2FsbGJhY2soIm9ucmVuYW1lIixbX3RoaXMuZ2V0X25vZGUob2JqKS5nZXQoMCksX3RoaXMscmJdKX0pO3ZhciBzcG49JCgiPHNwYW4gLz4iKS5hZGRDbGFzcyhvYmouYXR0cigiY2xhc3MiKSkuYXBwZW5kKGljbikuYXBwZW5kKF90aGlzLmlucCk7b2JqLmdldCgwKS5zdHlsZS5kaXNwbGF5PSJub25lIjtvYmoucGFyZW50KCkucHJlcGVuZChzcG4pO190aGlzLmlucC5nZXQoMCkuZm9jdXMoKTtfdGhpcy5pbnAuZ2V0KDApLnNlbGVjdCgpfX0scmVtb3ZlOmZ1bmN0aW9uKG9iail7aWYodGhpcy5sb2NrZWQpcmV0dXJuIHRoaXMuZXJyb3IoIkxPQ0tFRCIpO3ZhciBfdGhpcz10aGlzO3ZhciByYj17fTtyYlt0aGlzLmNvbnRhaW5lci5hdHRyKCJpZCIpXT10aGlzLmdldF9yb2xsYmFjaygpO2lmKG9iaiYmKCF0aGlzLnNlbGVjdGVkfHx0aGlzLmdldF9ub2RlKG9iaikuZ2V0KDApIT10aGlzLnNlbGVjdGVkLmdldCgwKSkpe29iaj10aGlzLmdldF9ub2RlKG9iaik7aWYob2JqLnNpemUoKSl7aWYoIXRoaXMuY2hlY2soImRlbGV0YWJsZSIsb2JqKSlyZXR1cm4gdGhpcy5lcnJvcigiREVMRVRFOiBOT0RFIE5PVCBERUxFVEFCTEUiKTtpZighdGhpcy5jYWxsYmFjaygiYmVmb3JlZGVsZXRlIixbb2JqLmdldCgwKSxfdGhpc10pKXJldHVybiB0aGlzLmVycm9yKCJERUxFVEU6IFNUT1BQRUQgQlkgVVNFUiIpOyRwYXJlbnQ9b2JqLnBhcmVudCgpO2lmKG9iai5maW5kKCJhLmNsaWNrZWQiKS5zaXplKCkpe3ZhciByZXNldF9zZWxlY3RlZD1mYWxzZTtfdGhpcy5zZWxlY3RlZF9hcnI9W107dGhpcy5jb250YWluZXIuZmluZCgiYS5jbGlja2VkIikuZmlsdGVyKCI6Zmlyc3QtY2hpbGQiKS5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7aWYoIXJlc2V0X3NlbGVjdGVkJiZ0aGlzPT1fdGhpcy5zZWxlY3RlZC5nZXQoMCkpcmVzZXRfc2VsZWN0ZWQ9dHJ1ZTtpZigkKHRoaXMpLnBhcmVudHMoKS5pbmRleChvYmopIT0tMSlyZXR1cm4gdHJ1ZTtfdGhpcy5zZWxlY3RlZF9hcnIucHVzaCgkKHRoaXMpKX0pO2lmKHJlc2V0X3NlbGVjdGVkKXRoaXMuc2VsZWN0ZWQ9dGhpcy5zZWxlY3RlZF9hcnJbMF18fGZhbHNlfW9iaj1vYmoucmVtb3ZlKCk7JHBhcmVudC5jaGlsZHJlbigibGk6bGFzdCIpLmFkZENsYXNzKCJsYXN0Iik7aWYoJHBhcmVudC5jaGlsZHJlbigibGkiKS5zaXplKCk9PTApeyRsaT0kcGFyZW50LnBhcmVudHMoImxpOmVxKDApIik7JGxpLnJlbW92ZUNsYXNzKCJvcGVuIikucmVtb3ZlQ2xhc3MoImNsb3NlZCIpLmFkZENsYXNzKCJsZWFmIikuY2hpbGRyZW4oInVsIikucmVtb3ZlKCl9dGhpcy5jYWxsYmFjaygib25kZWxldGUiLFtvYmouZ2V0KDApLHRoaXMscmJdKX19ZWxzZSBpZih0aGlzLnNlbGVjdGVkKXtpZighdGhpcy5jaGVjaygiZGVsZXRhYmxlIix0aGlzLnNlbGVjdGVkKSlyZXR1cm4gdGhpcy5lcnJvcigiREVMRVRFOiBOT0RFIE5PVCBERUxFVEFCTEUiKTtpZighdGhpcy5jYWxsYmFjaygiYmVmb3JlZGVsZXRlIixbdGhpcy5zZWxlY3RlZC5nZXQoMCksX3RoaXNdKSlyZXR1cm4gdGhpcy5lcnJvcigiREVMRVRFOiBTVE9QUEVEIEJZIFVTRVIiKTskcGFyZW50PXRoaXMuc2VsZWN0ZWQucGFyZW50KCk7dmFyIG9iaj10aGlzLnNlbGVjdGVkO2lmKHRoaXMuc2V0dGluZ3MucnVsZXMubXVsdGlwbGU9PWZhbHNlfHx0aGlzLnNlbGVjdGVkX2Fyci5sZW5ndGg9PTEpe3ZhciBzdG9wPXRydWU7dmFyIHRtcD10aGlzLnNldHRpbmdzLnVpLnNlbGVjdGVkX2RlbGV0ZT09InNlbGVjdF9wcmV2aW91cyI/dGhpcy5wcmV2KHRoaXMuc2VsZWN0ZWQpOmZhbHNlfW9iaj1vYmoucmVtb3ZlKCk7JHBhcmVudC5jaGlsZHJlbigibGk6bGFzdCIpLmFkZENsYXNzKCJsYXN0Iik7aWYoJHBhcmVudC5jaGlsZHJlbigibGkiKS5zaXplKCk9PTApeyRsaT0kcGFyZW50LnBhcmVudHMoImxpOmVxKDApIik7JGxpLnJlbW92ZUNsYXNzKCJvcGVuIikucmVtb3ZlQ2xhc3MoImNsb3NlZCIpLmFkZENsYXNzKCJsZWFmIikuY2hpbGRyZW4oInVsIikucmVtb3ZlKCl9aWYoIXN0b3AmJnRoaXMuc2V0dGluZ3MucnVsZXMubXVsdGlwbGUhPWZhbHNlKXt2YXIgX3RoaXM9dGhpczt0aGlzLnNlbGVjdGVkX2Fycj1bXTt0aGlzLmNvbnRhaW5lci5maW5kKCJhLmNsaWNrZWQiKS5maWx0ZXIoIjpmaXJzdC1jaGlsZCIpLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKXtfdGhpcy5zZWxlY3RlZF9hcnIucHVzaCgkKHRoaXMpKX0pO2lmKHRoaXMuc2VsZWN0ZWRfYXJyLmxlbmd0aD4wKXt0aGlzLnNlbGVjdGVkPXRoaXMuc2VsZWN0ZWRfYXJyWzBdO3RoaXMucmVtb3ZlKCl9fWlmKHN0b3AmJnRtcCl0aGlzLnNlbGVjdF9icmFuY2godG1wKTt0aGlzLmNhbGxiYWNrKCJvbmRlbGV0ZSIsW29iai5nZXQoMCksdGhpcyxyYl0pfWVsc2UgcmV0dXJuIHRoaXMuZXJyb3IoIkRFTEVURTogTk8gTk9ERSBTRUxFQ1RFRCIpfSxuZXh0OmZ1bmN0aW9uKG9iaixzdHJpY3Qpe29iaj10aGlzLmdldF9ub2RlKG9iaik7aWYoIW9iai5zaXplKCkpcmV0dXJuIGZhbHNlO2lmKHN0cmljdClyZXR1cm4ob2JqLm5leHRBbGwoImxpIikuc2l6ZSgpPjApP29iai5uZXh0QWxsKCJsaTplcSgwKSIpOmZhbHNlO2lmKG9iai5oYXNDbGFzcygib3BlbiIpKXJldHVybiBvYmouZmluZCgibGk6ZXEoMCkiKTtlbHNlIGlmKG9iai5uZXh0QWxsKCJsaSIpLnNpemUoKT4wKXJldHVybiBvYmoubmV4dEFsbCgibGk6ZXEoMCkiKTtlbHNlIHJldHVybiBvYmoucGFyZW50cygibGkiKS5uZXh0KCJsaSIpLmVxKDApfSxwcmV2OmZ1bmN0aW9uKG9iaixzdHJpY3Qpe29iaj10aGlzLmdldF9ub2RlKG9iaik7aWYoIW9iai5zaXplKCkpcmV0dXJuIGZhbHNlO2lmKHN0cmljdClyZXR1cm4ob2JqLnByZXZBbGwoImxpIikuc2l6ZSgpPjApP29iai5wcmV2QWxsKCJsaTplcSgwKSIpOmZhbHNlO2lmKG9iai5wcmV2KCJsaSIpLnNpemUoKSl7dmFyIG9iaj1vYmoucHJldigibGkiKS5lcSgwKTt3aGlsZShvYmouaGFzQ2xhc3MoIm9wZW4iKSlvYmo9b2JqLmNoaWxkcmVuKCJ1bDplcSgwKSIpLmNoaWxkcmVuKCJsaTpsYXN0Iik7cmV0dXJuIG9ian1lbHNlIHJldHVybiBvYmoucGFyZW50cygibGk6ZXEoMCkiKS5zaXplKCk/b2JqLnBhcmVudHMoImxpOmVxKDApIik6ZmFsc2V9LHBhcmVudDpmdW5jdGlvbihvYmope29iaj10aGlzLmdldF9ub2RlKG9iaik7aWYoIW9iai5zaXplKCkpcmV0dXJuIGZhbHNlO3JldHVybiBvYmoucGFyZW50cygibGk6ZXEoMCkiKS5zaXplKCk/b2JqLnBhcmVudHMoImxpOmVxKDApIik6LTF9LGNoaWxkcmVuOmZ1bmN0aW9uKG9iail7aWYob2JqPT09LTEpcmV0dXJuIHRoaXMuY29udGFpbmVyLmNoaWxkcmVuKCJ1bDplcSgwKSIpLmNoaWxkcmVuKCJsaSIpO29iaj10aGlzLmdldF9ub2RlKG9iaik7aWYoIW9iai5zaXplKCkpcmV0dXJuIGZhbHNlO3JldHVybiBvYmouY2hpbGRyZW4oInVsOmVxKDApIikuY2hpbGRyZW4oImxpIil9LHRvZ2dsZV9kb3RzOmZ1bmN0aW9uKCl7aWYodGhpcy5zZXR0aW5ncy51aS5kb3RzKXt0aGlzLnNldHRpbmdzLnVpLmRvdHM9ZmFsc2U7dGhpcy5jb250YWluZXIuY2hpbGRyZW4oInVsOmVxKDApIikuYWRkQ2xhc3MoIm5vX2RvdHMiKX1lbHNle3RoaXMuc2V0dGluZ3MudWkuZG90cz10cnVlO3RoaXMuY29udGFpbmVyLmNoaWxkcmVuKCJ1bDplcSgwKSIpLnJlbW92ZUNsYXNzKCJub19kb3RzIil9fSxjYWxsYmFjazpmdW5jdGlvbihjYixhcmdzKXt2YXIgcD1mYWxzZTt2YXIgcj1udWxsO2Zvcih2YXIgaSBpbiB0aGlzLnNldHRpbmdzLnBsdWdpbnMpe2lmKHR5cGVvZiAkLnRyZWUucGx1Z2luc1tpXSE9Im9iamVjdCIpY29udGludWU7cD0kLnRyZWUucGx1Z2luc1tpXTtpZihwLmNhbGxiYWNrcyYmdHlwZW9mIHAuY2FsbGJhY2tzW2NiXT09ImZ1bmN0aW9uIilyPXAuY2FsbGJhY2tzW2NiXS5hcHBseSh0aGlzLGFyZ3MpO2lmKHR5cGVvZiByIT09InVuZGVmaW5lZCImJnIhPT1udWxsKXtpZihjYj09Im9uZGF0YSJ8fGNiPT0ib25wYXJzZSIpYXJnc1swXT1yO2Vsc2UgcmV0dXJuIHJ9fXA9dGhpcy5zZXR0aW5ncy5jYWxsYmFja1tjYl07aWYodHlwZW9mIHA9PSJmdW5jdGlvbiIpcmV0dXJuIHAuYXBwbHkobnVsbCxhcmdzKX0sZ2V0X3JvbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIHJiPXt9O3JiLmh0bWw9dGhpcy5jb250YWluZXIuaHRtbCgpO3JiLnNlbGVjdGVkPXRoaXMuc2VsZWN0ZWQ/dGhpcy5zZWxlY3RlZC5hdHRyKCJpZCIpOmZhbHNlO3JldHVybiByYn0sbW92ZWQ6ZnVuY3Rpb24od2hhdCx3aGVyZSxob3csaXNfbmV3LGlzX2NvcHkscmIpe3ZhciB3aGF0PSQod2hhdCk7dmFyICRwYXJlbnQ9JCh3aGF0KS5wYXJlbnRzKCJ1bDplcSgwKSIpO3ZhciAkd2hlcmU9JCh3aGVyZSk7aWYoJHdoZXJlLmlzKCJpbnMiKSkkd2hlcmU9JHdoZXJlLnBhcmVudCgpO2lmKCFyYil7dmFyIHJiPXt9O3JiW3RoaXMuY29udGFpbmVyLmF0dHIoImlkIildPXRoaXMuZ2V0X3JvbGxiYWNrKCk7aWYoIWlzX25ldyl7dmFyIHRtcD13aGF0LnNpemUoKT4xP3doYXQuZXEoMCkucGFyZW50cygiLnRyZWU6ZXEoMCkiKTp3aGF0LnBhcmVudHMoIi50cmVlOmVxKDApIik7aWYodG1wLmdldCgwKSE9dGhpcy5jb250YWluZXIuZ2V0KDApKXt0bXA9dHJlZV9jb21wb25lbnQuaW5zdFt0bXAuYXR0cigiaWQiKV07cmJbdG1wLmNvbnRhaW5lci5hdHRyKCJpZCIpXT10bXAuZ2V0X3JvbGxiYWNrKCl9ZGVsZXRlIHRtcH19aWYoaG93PT0iaW5zaWRlIiYmdGhpcy5zZXR0aW5ncy5kYXRhLmFzeW5jKXt2YXIgX3RoaXM9dGhpcztpZih0aGlzLmdldF9ub2RlKCR3aGVyZSkuaGFzQ2xhc3MoImNsb3NlZCIpKXtyZXR1cm4gdGhpcy5vcGVuX2JyYW5jaCh0aGlzLmdldF9ub2RlKCR3aGVyZSksdHJ1ZSxmdW5jdGlvbigpe190aGlzLm1vdmVkLmFwcGx5KF90aGlzLFt3aGF0LHdoZXJlLGhvdyxpc19uZXcsaXNfY29weSxyYl0pfSl9aWYodGhpcy5nZXRfbm9kZSgkd2hlcmUpLmZpbmQoIj4gdWwgPiBsaSA+IGEubG9hZGluZyIpLnNpemUoKT09MSl7c2V0VGltZW91dChmdW5jdGlvbigpe190aGlzLm1vdmVkLmFwcGx5KF90aGlzLFt3aGF0LHdoZXJlLGhvdyxpc19uZXcsaXNfY29weV0pfSwyMDApO3JldHVybn19aWYod2hhdC5zaXplKCk+MSl7dmFyIF90aGlzPXRoaXM7dmFyIHRtcD10aGlzLm1vdmVkKHdoYXQuZXEoMCksd2hlcmUsaG93LGZhbHNlLGlzX2NvcHkscmIpO3doYXQuZWFjaChmdW5jdGlvbihpKXtpZihpPT0wKXJldHVybjtpZih0bXApe3RtcD1fdGhpcy5tb3ZlZCh0aGlzLHRtcC5jaGlsZHJlbigiYTplcSgwKSIpLCJhZnRlciIsZmFsc2UsaXNfY29weSxyYil9fSk7cmV0dXJuIHdoYXR9aWYoaXNfY29weSl7X3doYXQ9d2hhdC5jbG9uZSgpO193aGF0LmVhY2goZnVuY3Rpb24oaSl7dGhpcy5pZD10aGlzLmlkKyJfY29weSI7JCh0aGlzKS5maW5kKCJsaSIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLmlkPXRoaXMuaWQrIl9jb3B5In0pOyQodGhpcykucmVtb3ZlQ2xhc3MoImRyYWdnZWQiKS5maW5kKCJhLmNsaWNrZWQiKS5yZW1vdmVDbGFzcygiY2xpY2tlZCIpLmVuZCgpLmZpbmQoImxpLmRyYWdnZWQiKS5yZW1vdmVDbGFzcygiZHJhZ2dlZCIpfSl9ZWxzZSBfd2hhdD13aGF0O2lmKGlzX25ldyl7aWYoIXRoaXMuY2FsbGJhY2soImJlZm9yZWNyZWF0ZSIsW3RoaXMuZ2V0X25vZGUod2hhdCkuZ2V0KDApLHRoaXMuZ2V0X25vZGUod2hlcmUpLmdldCgwKSxob3csdGhpc10pKXJldHVybiBmYWxzZX1lbHNle2lmKCF0aGlzLmNhbGxiYWNrKCJiZWZvcmVtb3ZlIixbdGhpcy5nZXRfbm9kZSh3aGF0KS5nZXQoMCksdGhpcy5nZXRfbm9kZSh3aGVyZSkuZ2V0KDApLGhvdyx0aGlzLGlzX2NvcHldKSlyZXR1cm4gZmFsc2V9aWYoIWlzX25ldyl7dmFyIHRtcD13aGF0LnBhcmVudHMoIi50cmVlOmVxKDApIik7aWYodG1wLmdldCgwKSE9dGhpcy5jb250YWluZXIuZ2V0KDApKXt0bXA9dHJlZV9jb21wb25lbnQuaW5zdFt0bXAuYXR0cigiaWQiKV07aWYodG1wLnNldHRpbmdzLmxhbmd1YWdlcy5sZW5ndGgpe3ZhciByZXM9W107aWYodGhpcy5zZXR0aW5ncy5sYW5ndWFnZXMubGVuZ3RoPT0wKXJlcy5wdXNoKCIuIit0bXAuY3VycmVudF9sYW5nKTtlbHNle2Zvcih2YXIgaSBpbiB0aGlzLnNldHRpbmdzLmxhbmd1YWdlcyl7aWYoIXRoaXMuc2V0dGluZ3MubGFuZ3VhZ2VzLmhhc093blByb3BlcnR5KGkpKWNvbnRpbnVlO2Zvcih2YXIgaiBpbiB0bXAuc2V0dGluZ3MubGFuZ3VhZ2VzKXtpZighdG1wLnNldHRpbmdzLmxhbmd1YWdlcy5oYXNPd25Qcm9wZXJ0eShqKSljb250aW51ZTtpZih0aGlzLnNldHRpbmdzLmxhbmd1YWdlc1tpXT09dG1wLnNldHRpbmdzLmxhbmd1YWdlc1tqXSlyZXMucHVzaCgiLiIrdGhpcy5zZXR0aW5ncy5sYW5ndWFnZXNbaV0pfX19aWYocmVzLmxlbmd0aD09MClyZXR1cm4gdGhpcy5lcnJvcigiTU9WRTogTk8gQ09NTU9OIExBTkdVQUdFUyIpO193aGF0LmZpbmQoImEiKS5ub3QocmVzLmpvaW4oIiwiKSkucmVtb3ZlKCl9X3doYXQuZmluZCgiYS5jbGlja2VkIikucmVtb3ZlQ2xhc3MoImNsaWNrZWQiKX19d2hhdD1fd2hhdDtzd2l0Y2goaG93KXtjYXNlImJlZm9yZSI6JHdoZXJlLnBhcmVudHMoInVsOmVxKDApIikuY2hpbGRyZW4oImxpLmxhc3QiKS5yZW1vdmVDbGFzcygibGFzdCIpOyR3aGVyZS5wYXJlbnQoKS5iZWZvcmUod2hhdC5yZW1vdmVDbGFzcygibGFzdCIpKTskd2hlcmUucGFyZW50cygidWw6ZXEoMCkiKS5jaGlsZHJlbigibGk6bGFzdCIpLmFkZENsYXNzKCJsYXN0Iik7YnJlYWs7Y2FzZSJhZnRlciI6JHdoZXJlLnBhcmVudHMoInVsOmVxKDApIikuY2hpbGRyZW4oImxpLmxhc3QiKS5yZW1vdmVDbGFzcygibGFzdCIpOyR3aGVyZS5wYXJlbnQoKS5hZnRlcih3aGF0LnJlbW92ZUNsYXNzKCJsYXN0IikpOyR3aGVyZS5wYXJlbnRzKCJ1bDplcSgwKSIpLmNoaWxkcmVuKCJsaTpsYXN0IikuYWRkQ2xhc3MoImxhc3QiKTticmVhaztjYXNlImluc2lkZSI6aWYoJHdoZXJlLnBhcmVudCgpLmNoaWxkcmVuKCJ1bDpmaXJzdCIpLnNpemUoKSl7aWYodGhpcy5zZXR0aW5ncy5ydWxlcy5jcmVhdGVhdD09InRvcCIpeyR3aGVyZS5wYXJlbnQoKS5jaGlsZHJlbigidWw6Zmlyc3QiKS5wcmVwZW5kKHdoYXQucmVtb3ZlQ2xhc3MoImxhc3QiKSkuY2hpbGRyZW4oImxpOmxhc3QiKS5hZGRDbGFzcygibGFzdCIpO3ZhciB0bXBfbm9kZT0kd2hlcmUucGFyZW50KCkuY2hpbGRyZW4oInVsOmZpcnN0IikuY2hpbGRyZW4oImxpOmZpcnN0Iik7aWYodG1wX25vZGUuc2l6ZSgpKXtob3c9ImJlZm9yZSI7d2hlcmU9dG1wX25vZGV9fWVsc2V7dmFyIHRtcF9ub2RlPSR3aGVyZS5wYXJlbnQoKS5jaGlsZHJlbigidWw6Zmlyc3QiKS5jaGlsZHJlbigiLmxhc3QiKTtpZih0bXBfbm9kZS5zaXplKCkpe2hvdz0iYWZ0ZXIiO3doZXJlPXRtcF9ub2RlfSR3aGVyZS5wYXJlbnQoKS5jaGlsZHJlbigidWw6Zmlyc3QiKS5jaGlsZHJlbigiLmxhc3QiKS5yZW1vdmVDbGFzcygibGFzdCIpLmVuZCgpLmFwcGVuZCh3aGF0LnJlbW92ZUNsYXNzKCJsYXN0IikpLmNoaWxkcmVuKCJsaTpsYXN0IikuYWRkQ2xhc3MoImxhc3QiKX19ZWxzZXt3aGF0LmFkZENsYXNzKCJsYXN0Iik7JHdoZXJlLnBhcmVudCgpLnJlbW92ZUNsYXNzKCJsZWFmIikuYXBwZW5kKCI8dWwvPiIpO2lmKCEkd2hlcmUucGFyZW50KCkuaGFzQ2xhc3MoIm9wZW4iKSkkd2hlcmUucGFyZW50KCkuYWRkQ2xhc3MoImNsb3NlZCIpOyR3aGVyZS5wYXJlbnQoKS5jaGlsZHJlbigidWw6Zmlyc3QiKS5wcmVwZW5kKHdoYXQpfWlmKCR3aGVyZS5wYXJlbnQoKS5oYXNDbGFzcygiY2xvc2VkIikpe3RoaXMub3Blbl9icmFuY2goJHdoZXJlKX1icmVhaztkZWZhdWx0OmJyZWFrfWlmKCRwYXJlbnQuZmluZCgibGkiKS5zaXplKCk9PTApe3ZhciAkbGk9JHBhcmVudC5wYXJlbnQoKTskbGkucmVtb3ZlQ2xhc3MoIm9wZW4iKS5yZW1vdmVDbGFzcygiY2xvc2VkIikuYWRkQ2xhc3MoImxlYWYiKTtpZighJGxpLmlzKCIudHJlZSIpKSRsaS5jaGlsZHJlbigidWwiKS5yZW1vdmUoKTskbGkucGFyZW50cygidWw6ZXEoMCkiKS5jaGlsZHJlbigibGkubGFzdCIpLnJlbW92ZUNsYXNzKCJsYXN0IikuZW5kKCkuY2hpbGRyZW4oImxpOmxhc3QiKS5hZGRDbGFzcygibGFzdCIpfWVsc2V7JHBhcmVudC5jaGlsZHJlbigibGkubGFzdCIpLnJlbW92ZUNsYXNzKCJsYXN0Iik7JHBhcmVudC5jaGlsZHJlbigibGk6bGFzdCIpLmFkZENsYXNzKCJsYXN0Iil9aWYoaXNfY29weSl0aGlzLmNhbGxiYWNrKCJvbmNvcHkiLFt0aGlzLmdldF9ub2RlKHdoYXQpLmdldCgwKSx0aGlzLmdldF9ub2RlKHdoZXJlKS5nZXQoMCksaG93LHRoaXMscmJdKTtlbHNlIGlmKGlzX25ldyl0aGlzLmNhbGxiYWNrKCJvbmNyZWF0ZSIsW3RoaXMuZ2V0X25vZGUod2hhdCkuZ2V0KDApLCgkd2hlcmUuaXMoInVsIik/LTE6dGhpcy5nZXRfbm9kZSh3aGVyZSkuZ2V0KDApKSxob3csdGhpcyxyYl0pO2Vsc2UgdGhpcy5jYWxsYmFjaygib25tb3ZlIixbdGhpcy5nZXRfbm9kZSh3aGF0KS5nZXQoMCksdGhpcy5nZXRfbm9kZSh3aGVyZSkuZ2V0KDApLGhvdyx0aGlzLHJiXSk7cmV0dXJuIHdoYXR9LGVycm9yOmZ1bmN0aW9uKGNvZGUpe3RoaXMuY2FsbGJhY2soImVycm9yIixbY29kZSx0aGlzXSk7cmV0dXJuIGZhbHNlfSxsb2NrOmZ1bmN0aW9uKHN0YXRlKXt0aGlzLmxvY2tlZD1zdGF0ZTtpZih0aGlzLmxvY2tlZCl0aGlzLmNvbnRhaW5lci5jaGlsZHJlbigidWw6ZXEoMCkiKS5hZGRDbGFzcygibG9ja2VkIik7ZWxzZSB0aGlzLmNvbnRhaW5lci5jaGlsZHJlbigidWw6ZXEoMCkiKS5yZW1vdmVDbGFzcygibG9ja2VkIil9LGN1dDpmdW5jdGlvbihvYmope2lmKHRoaXMubG9ja2VkKXJldHVybiB0aGlzLmVycm9yKCJMT0NLRUQiKTtvYmo9b2JqP3RoaXMuZ2V0X25vZGUob2JqKTp0aGlzLmNvbnRhaW5lci5maW5kKCJhLmNsaWNrZWQiKS5maWx0ZXIoIjpmaXJzdC1jaGlsZCIpLnBhcmVudCgpO2lmKCFvYmp8fCFvYmouc2l6ZSgpKXJldHVybiB0aGlzLmVycm9yKCJDVVQ6IE5PIE5PREUgU0VMRUNURUQiKTt0cmVlX2NvbXBvbmVudC5jdXRfY29weS5jb3B5X25vZGVzPWZhbHNlO3RyZWVfY29tcG9uZW50LmN1dF9jb3B5LmN1dF9ub2Rlcz1vYmp9LGNvcHk6ZnVuY3Rpb24ob2JqKXtpZih0aGlzLmxvY2tlZClyZXR1cm4gdGhpcy5lcnJvcigiTE9DS0VEIik7b2JqPW9iaj90aGlzLmdldF9ub2RlKG9iaik6dGhpcy5jb250YWluZXIuZmluZCgiYS5jbGlja2VkIikuZmlsdGVyKCI6Zmlyc3QtY2hpbGQiKS5wYXJlbnQoKTtpZighb2JqfHwhb2JqLnNpemUoKSlyZXR1cm4gdGhpcy5lcnJvcigiQ09QWTogTk8gTk9ERSBTRUxFQ1RFRCIpO3RyZWVfY29tcG9uZW50LmN1dF9jb3B5LmNvcHlfbm9kZXM9b2JqO3RyZWVfY29tcG9uZW50LmN1dF9jb3B5LmN1dF9ub2Rlcz1mYWxzZX0scGFzdGU6ZnVuY3Rpb24ob2JqLHBvc2l0aW9uKXtpZih0aGlzLmxvY2tlZClyZXR1cm4gdGhpcy5lcnJvcigiTE9DS0VEIik7dmFyIHJvb3Q9ZmFsc2U7aWYob2JqPT0tMSl7cm9vdD10cnVlO29iaj10aGlzLmNvbnRhaW5lcn1lbHNlIG9iaj1vYmo/dGhpcy5nZXRfbm9kZShvYmopOnRoaXMuc2VsZWN0ZWQ7aWYoIXJvb3QmJighb2JqfHwhb2JqLnNpemUoKSkpcmV0dXJuIHRoaXMuZXJyb3IoIlBBU1RFOiBOTyBOT0RFIFNFTEVDVEVEIik7aWYoIXRyZWVfY29tcG9uZW50LmN1dF9jb3B5LmNvcHlfbm9kZXMmJiF0cmVlX2NvbXBvbmVudC5jdXRfY29weS5jdXRfbm9kZXMpcmV0dXJuIHRoaXMuZXJyb3IoIlBBU1RFOiBOT1RISU5HIFRPIERPIik7dmFyIF90aGlzPXRoaXM7dmFyIHBvcz1wb3NpdGlvbjtpZihwb3NpdGlvbj09ImJlZm9yZSIpe3Bvc2l0aW9uPW9iai5wYXJlbnQoKS5jaGlsZHJlbigpLmluZGV4KG9iaik7b2JqPW9iai5wYXJlbnRzKCJsaTplcSgwKSIpfWVsc2UgaWYocG9zaXRpb249PSJhZnRlciIpe3Bvc2l0aW9uPW9iai5wYXJlbnQoKS5jaGlsZHJlbigpLmluZGV4KG9iaikrMTtvYmo9b2JqLnBhcmVudHMoImxpOmVxKDApIil9ZWxzZSBpZigodHlwZW9mIHBvc2l0aW9uKS50b0xvd2VyQ2FzZSgpPT0idW5kZWZpbmVkInx8cG9zaXRpb249PSJpbnNpZGUiKXtwb3NpdGlvbj0odGhpcy5zZXR0aW5ncy5ydWxlcy5jcmVhdGVhdD09InRvcCIpPzA6b2JqLmNoaWxkcmVuKCJ1bDplcSgwKSIpLmNoaWxkcmVuKCJsaSIpLnNpemUoKX1pZighcm9vdCYmb2JqLnNpemUoKT09MCl7cm9vdD10cnVlO29iaj10aGlzLmNvbnRhaW5lcn1pZih0cmVlX2NvbXBvbmVudC5jdXRfY29weS5jb3B5X25vZGVzJiZ0cmVlX2NvbXBvbmVudC5jdXRfY29weS5jb3B5X25vZGVzLnNpemUoKSl7dmFyIG9rPXRydWU7aWYoIXJvb3QmJiF0aGlzLmNoZWNrX21vdmUodHJlZV9jb21wb25lbnQuY3V0X2NvcHkuY29weV9ub2RlcyxvYmouY2hpbGRyZW4oImE6ZXEoMCkiKSwiaW5zaWRlIikpcmV0dXJuIGZhbHNlO2lmKG9iai5jaGlsZHJlbigidWwiKS5zaXplKCk9PTB8fChyb290PT10cnVlJiZvYmouY2hpbGRyZW4oInVsIikuY2hpbGRyZW4oImxpIikuc2l6ZSgpPT0wKSl7aWYoIXJvb3QpdmFyIGE9dGhpcy5tb3ZlZCh0cmVlX2NvbXBvbmVudC5jdXRfY29weS5jb3B5X25vZGVzLG9iai5jaGlsZHJlbigiYTplcSgwKSIpLCJpbnNpZGUiLGZhbHNlLHRydWUpO2Vsc2UgdmFyIGE9dGhpcy5tb3ZlZCh0cmVlX2NvbXBvbmVudC5jdXRfY29weS5jb3B5X25vZGVzLHRoaXMuY29udGFpbmVyLmNoaWxkcmVuKCJ1bDplcSgwKSIpLCJpbnNpZGUiLGZhbHNlLHRydWUpfWVsc2UgaWYocG9zPT0iYmVmb3JlIiYmb2JqLmNoaWxkcmVuKCJ1bDplcSgwKSIpLmNoaWxkcmVuKCJsaTpudGgtY2hpbGQoIisocG9zaXRpb24rMSkrIikiKS5zaXplKCkpdmFyIGE9dGhpcy5tb3ZlZCh0cmVlX2NvbXBvbmVudC5jdXRfY29weS5jb3B5X25vZGVzLG9iai5jaGlsZHJlbigidWw6ZXEoMCkiKS5jaGlsZHJlbigibGk6bnRoLWNoaWxkKCIrKHBvc2l0aW9uKzEpKyIpIikuY2hpbGRyZW4oImE6ZXEoMCkiKSwiYmVmb3JlIixmYWxzZSx0cnVlKTtlbHNlIGlmKHBvcz09ImFmdGVyIiYmb2JqLmNoaWxkcmVuKCJ1bDplcSgwKSIpLmNoaWxkcmVuKCJsaTpudGgtY2hpbGQoIisocG9zaXRpb24pKyIpIikuc2l6ZSgpKXZhciBhPXRoaXMubW92ZWQodHJlZV9jb21wb25lbnQuY3V0X2NvcHkuY29weV9ub2RlcyxvYmouY2hpbGRyZW4oInVsOmVxKDApIikuY2hpbGRyZW4oImxpOm50aC1jaGlsZCgiKyhwb3NpdGlvbikrIikiKS5jaGlsZHJlbigiYTplcSgwKSIpLCJhZnRlciIsZmFsc2UsdHJ1ZSk7ZWxzZSBpZihvYmouY2hpbGRyZW4oInVsOmVxKDApIikuY2hpbGRyZW4oImxpOm50aC1jaGlsZCgiKyhwb3NpdGlvbisxKSsiKSIpLnNpemUoKSl2YXIgYT10aGlzLm1vdmVkKHRyZWVfY29tcG9uZW50LmN1dF9jb3B5LmNvcHlfbm9kZXMsb2JqLmNoaWxkcmVuKCJ1bDplcSgwKSIpLmNoaWxkcmVuKCJsaTpudGgtY2hpbGQoIisocG9zaXRpb24rMSkrIikiKS5jaGlsZHJlbigiYTplcSgwKSIpLCJiZWZvcmUiLGZhbHNlLHRydWUpO2Vsc2UgdmFyIGE9dGhpcy5tb3ZlZCh0cmVlX2NvbXBvbmVudC5jdXRfY29weS5jb3B5X25vZGVzLG9iai5jaGlsZHJlbigidWw6ZXEoMCkiKS5jaGlsZHJlbigibGk6bGFzdCIpLmNoaWxkcmVuKCJhOmVxKDApIiksImFmdGVyIixmYWxzZSx0cnVlKTt0cmVlX2NvbXBvbmVudC5jdXRfY29weS5jb3B5X25vZGVzPWZhbHNlfWlmKHRyZWVfY29tcG9uZW50LmN1dF9jb3B5LmN1dF9ub2RlcyYmdHJlZV9jb21wb25lbnQuY3V0X2NvcHkuY3V0X25vZGVzLnNpemUoKSl7dmFyIG9rPXRydWU7b2JqLnBhcmVudHMoKS5hbmRTZWxmKCkuZWFjaChmdW5jdGlvbigpe2lmKHRyZWVfY29tcG9uZW50LmN1dF9jb3B5LmN1dF9ub2Rlcy5pbmRleCh0aGlzKSE9LTEpe29rPWZhbHNlO3JldHVybiBmYWxzZX19KTtpZighb2spcmV0dXJuIHRoaXMuZXJyb3IoIkludmFsaWQgcGFzdGUiKTtpZighcm9vdCYmIXRoaXMuY2hlY2tfbW92ZSh0cmVlX2NvbXBvbmVudC5jdXRfY29weS5jdXRfbm9kZXMsb2JqLmNoaWxkcmVuKCJhOmVxKDApIiksImluc2lkZSIpKXJldHVybiBmYWxzZTtpZihvYmouY2hpbGRyZW4oInVsIikuc2l6ZSgpPT0wfHwocm9vdD09dHJ1ZSYmb2JqLmNoaWxkcmVuKCJ1bCIpLmNoaWxkcmVuKCJsaSIpLnNpemUoKT09MCkpe2lmKCFyb290KXZhciBhPXRoaXMubW92ZWQodHJlZV9jb21wb25lbnQuY3V0X2NvcHkuY3V0X25vZGVzLG9iai5jaGlsZHJlbigiYTplcSgwKSIpLCJpbnNpZGUiKTtlbHNlIHZhciBhPXRoaXMubW92ZWQodHJlZV9jb21wb25lbnQuY3V0X2NvcHkuY3V0X25vZGVzLHRoaXMuY29udGFpbmVyLmNoaWxkcmVuKCJ1bDplcSgwKSIpLCJpbnNpZGUiKX1lbHNlIGlmKHBvcz09ImJlZm9yZSImJm9iai5jaGlsZHJlbigidWw6ZXEoMCkiKS5jaGlsZHJlbigibGk6bnRoLWNoaWxkKCIrKHBvc2l0aW9uKzEpKyIpIikuc2l6ZSgpKXZhciBhPXRoaXMubW92ZWQodHJlZV9jb21wb25lbnQuY3V0X2NvcHkuY3V0X25vZGVzLG9iai5jaGlsZHJlbigidWw6ZXEoMCkiKS5jaGlsZHJlbigibGk6bnRoLWNoaWxkKCIrKHBvc2l0aW9uKzEpKyIpIikuY2hpbGRyZW4oImE6ZXEoMCkiKSwiYmVmb3JlIik7ZWxzZSBpZihwb3M9PSJhZnRlciImJm9iai5jaGlsZHJlbigidWw6ZXEoMCkiKS5jaGlsZHJlbigibGk6bnRoLWNoaWxkKCIrKHBvc2l0aW9uKSsiKSIpLnNpemUoKSl2YXIgYT10aGlzLm1vdmVkKHRyZWVfY29tcG9uZW50LmN1dF9jb3B5LmN1dF9ub2RlcyxvYmouY2hpbGRyZW4oInVsOmVxKDApIikuY2hpbGRyZW4oImxpOm50aC1jaGlsZCgiKyhwb3NpdGlvbikrIikiKS5jaGlsZHJlbigiYTplcSgwKSIpLCJhZnRlciIpO2Vsc2UgaWYob2JqLmNoaWxkcmVuKCJ1bDplcSgwKSIpLmNoaWxkcmVuKCJsaTpudGgtY2hpbGQoIisocG9zaXRpb24rMSkrIikiKS5zaXplKCkpdmFyIGE9dGhpcy5tb3ZlZCh0cmVlX2NvbXBvbmVudC5jdXRfY29weS5jdXRfbm9kZXMsb2JqLmNoaWxkcmVuKCJ1bDplcSgwKSIpLmNoaWxkcmVuKCJsaTpudGgtY2hpbGQoIisocG9zaXRpb24rMSkrIikiKS5jaGlsZHJlbigiYTplcSgwKSIpLCJiZWZvcmUiKTtlbHNlIHZhciBhPXRoaXMubW92ZWQodHJlZV9jb21wb25lbnQuY3V0X2NvcHkuY3V0X25vZGVzLG9iai5jaGlsZHJlbigidWw6ZXEoMCkiKS5jaGlsZHJlbigibGk6bGFzdCIpLmNoaWxkcmVuKCJhOmVxKDApIiksImFmdGVyIik7dHJlZV9jb21wb25lbnQuY3V0X2NvcHkuY3V0X25vZGVzPWZhbHNlfX0sc2VhcmNoOmZ1bmN0aW9uKHN0cixmdW5jKXt2YXIgX3RoaXM9dGhpcztpZighc3RyfHwodGhpcy5zcmNoJiZzdHIhPXRoaXMuc3JjaCkpe3RoaXMuc3JjaD0iIjt0aGlzLnNyY2hfb3BuPWZhbHNlO3RoaXMuY29udGFpbmVyLmZpbmQoImEuc2VhcmNoIikucmVtb3ZlQ2xhc3MoInNlYXJjaCIpfXRoaXMuc3JjaD1zdHI7aWYoIXN0cilyZXR1cm47aWYoIWZ1bmMpZnVuYz0iY29udGFpbnMiO2lmKHRoaXMuc2V0dGluZ3MuZGF0YS5hc3luYyl7aWYoIXRoaXMuc3JjaF9vcG4pe3ZhciBkZD0kLmV4dGVuZCh7InNlYXJjaCI6c3RyfSx0aGlzLmNhbGxiYWNrKCJiZWZvcmVkYXRhIixbZmFsc2UsdGhpc10pKTskLmFqYXgoe3R5cGU6dGhpcy5zZXR0aW5ncy5kYXRhLm9wdHMubWV0aG9kLHVybDp0aGlzLnNldHRpbmdzLmRhdGEub3B0cy51cmwsZGF0YTpkZCxkYXRhVHlwZToidGV4dCIsc3VjY2VzczpmdW5jdGlvbihkYXRhKXtfdGhpcy5zcmNoX29wbj0kLnVuaXF1ZShkYXRhLnNwbGl0KCIsIikpO190aGlzLnNlYXJjaC5hcHBseShfdGhpcyxbc3RyLGZ1bmNdKX19KX1lbHNlIGlmKHRoaXMuc3JjaF9vcG4ubGVuZ3RoKXtpZih0aGlzLnNyY2hfb3BuJiZ0aGlzLnNyY2hfb3BuLmxlbmd0aCl7dmFyIG9wbj1mYWxzZTtmb3IodmFyIGo9MDtqPHRoaXMuc3JjaF9vcG4ubGVuZ3RoO2orKyl7aWYodGhpcy5nZXRfbm9kZSgiIyIrdGhpcy5zcmNoX29wbltqXSkuc2l6ZSgpPjApe29wbj10cnVlO3ZhciB0bXA9IiMiK3RoaXMuc3JjaF9vcG5bal07ZGVsZXRlIHRoaXMuc3JjaF9vcG5bal07dGhpcy5vcGVuX2JyYW5jaCh0bXAsdHJ1ZSxmdW5jdGlvbigpe190aGlzLnNlYXJjaC5hcHBseShfdGhpcyxbc3RyLGZ1bmNdKX0pfX1pZighb3BuKXt0aGlzLnNyY2hfb3BuPVtdO190aGlzLnNlYXJjaC5hcHBseShfdGhpcyxbc3RyLGZ1bmNdKX19fWVsc2V7dGhpcy5zcmNoX29wbj1mYWxzZTt2YXIgc2VsZWN0b3I9ImEiO2lmKHRoaXMuc2V0dGluZ3MubGFuZ3VhZ2VzLmxlbmd0aClzZWxlY3Rvcis9Ii4iK3RoaXMuY3VycmVudF9sYW5nO3RoaXMuY2FsbGJhY2soIm9uc2VhcmNoIixbdGhpcy5jb250YWluZXIuZmluZChzZWxlY3RvcisiOiIrZnVuYysiKCciK3N0cisiJykiKSx0aGlzXSl9fWVsc2V7dmFyIHNlbGVjdG9yPSJhIjtpZih0aGlzLnNldHRpbmdzLmxhbmd1YWdlcy5sZW5ndGgpc2VsZWN0b3IrPSIuIit0aGlzLmN1cnJlbnRfbGFuZzt2YXIgbm49dGhpcy5jb250YWluZXIuZmluZChzZWxlY3RvcisiOiIrZnVuYysiKCciK3N0cisiJykiKTtubi5wYXJlbnRzKCJsaS5jbG9zZWQiKS5lYWNoKGZ1bmN0aW9uKCl7X3RoaXMub3Blbl9icmFuY2godGhpcyx0cnVlKX0pO3RoaXMuY2FsbGJhY2soIm9uc2VhcmNoIixbbm4sdGhpc10pfX0sYWRkX3NoZWV0OnRyZWVfY29tcG9uZW50LmFkZF9zaGVldCxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5jYWxsYmFjaygib25kZXN0cm95IixbdGhpc10pO3RoaXMuY29udGFpbmVyLnVuYmluZCgiLmpzdHJlZSIpOyQoIiMiK3RoaXMuY29udGFpbmVyLmF0dHIoImlkIikpLmRpZSgiY2xpY2suanN0cmVlIikuZGllKCJkYmxjbGljay5qc3RyZWUiKS5kaWUoIm1vdXNlb3Zlci5qc3RyZWUiKS5kaWUoIm1vdXNlb3V0LmpzdHJlZSIpLmRpZSgibW91c2Vkb3duLmpzdHJlZSIpO3RoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKCJ0cmVlIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB0cmVlLWRlZmF1bHQgdHJlZS0iK3RoaXMuc2V0dGluZ3MudWkudGhlbWVfbmFtZSkuY2hpbGRyZW4oInVsIikucmVtb3ZlQ2xhc3MoIm5vX2RvdHMgbHRyIGxvY2tlZCIpLmZpbmQoImxpIikucmVtb3ZlQ2xhc3MoImxlYWYiKS5yZW1vdmVDbGFzcygib3BlbiIpLnJlbW92ZUNsYXNzKCJjbG9zZWQiKS5yZW1vdmVDbGFzcygibGFzdCIpLmNoaWxkcmVuKCJhIikucmVtb3ZlQ2xhc3MoImNsaWNrZWQgaG92ZXIgc2VhcmNoIik7aWYodGhpcy5jbnRyPT10cmVlX2NvbXBvbmVudC5mb2N1c2VkKXtmb3IodmFyIGkgaW4gdHJlZV9jb21wb25lbnQuaW5zdCl7aWYoaSE9dGhpcy5jbnRyJiZpIT10aGlzLmNvbnRhaW5lci5hdHRyKCJpZCIpKXt0cmVlX2NvbXBvbmVudC5pbnN0W2ldLmZvY3VzKCk7YnJlYWt9fX10cmVlX2NvbXBvbmVudC5pbnN0W3RoaXMuY250cl09ZmFsc2U7dHJlZV9jb21wb25lbnQuaW5zdFt0aGlzLmNvbnRhaW5lci5hdHRyKCJpZCIpXT1mYWxzZTtkZWxldGUgdHJlZV9jb21wb25lbnQuaW5zdFt0aGlzLmNudHJdO2RlbGV0ZSB0cmVlX2NvbXBvbmVudC5pbnN0W3RoaXMuY29udGFpbmVyLmF0dHIoImlkIildO3RyZWVfY29tcG9uZW50LmNudHItLX19fTt0cmVlX2NvbXBvbmVudC5jbnRyPTA7dHJlZV9jb21wb25lbnQuaW5zdD17fTt0cmVlX2NvbXBvbmVudC50aGVtZXM9W107dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wPXtpc2Rvd246ZmFsc2UsZHJhZ19ub2RlOmZhbHNlLGRyYWdfaGVscDpmYWxzZSxkcmFnZ2VkOmZhbHNlLGluaXRfeDpmYWxzZSxpbml0X3k6ZmFsc2UsbW92aW5nOmZhbHNlLG9yaWdpbl90cmVlOmZhbHNlLG1hcmtlcjpmYWxzZSxtb3ZlX3R5cGU6ZmFsc2UscmVmX25vZGU6ZmFsc2UsYXBwZW5kZWQ6ZmFsc2UsZm9yZWlnbjpmYWxzZSxkcm9wcGFibGU6W10sb3Blbl90aW1lOmZhbHNlLHNjcm9sbF90aW1lOmZhbHNlfTt0cmVlX2NvbXBvbmVudC5tb3VzZXVwPWZ1bmN0aW9uKGV2ZW50KXt2YXIgdG1wPXRyZWVfY29tcG9uZW50LmRyYWdfZHJvcDtpZih0bXAub3Blbl90aW1lKWNsZWFyVGltZW91dCh0bXAub3Blbl90aW1lKTtpZih0bXAuc2Nyb2xsX3RpbWUpY2xlYXJUaW1lb3V0KHRtcC5zY3JvbGxfdGltZSk7aWYodG1wLm1vdmluZyYmJC50cmVlLmRyYWdfZW5kIT09ZmFsc2UpJC50cmVlLmRyYWdfZW5kLmNhbGwobnVsbCxldmVudCx0bXApO2lmKHRtcC5mb3JlaWduPT09ZmFsc2UmJnRtcC5kcmFnX25vZGUmJnRtcC5kcmFnX25vZGUuc2l6ZSgpKXt0bXAuZHJhZ19oZWxwLnJlbW92ZSgpO2lmKHRtcC5tb3ZlX3R5cGUpe3ZhciB0cmVlMT10cmVlX2NvbXBvbmVudC5pbnN0W3RtcC5yZWZfbm9kZS5wYXJlbnRzKCIudHJlZTplcSgwKSIpLmF0dHIoImlkIildO2lmKHRyZWUxKXRyZWUxLm1vdmVkKHRtcC5kcmFnZ2VkLHRtcC5yZWZfbm9kZSx0bXAubW92ZV90eXBlLGZhbHNlLCh0bXAub3JpZ2luX3RyZWUuc2V0dGluZ3MucnVsZXMuZHJhZ19jb3B5PT0ib24ifHwodG1wLm9yaWdpbl90cmVlLnNldHRpbmdzLnJ1bGVzLmRyYWdfY29weT09ImN0cmwiJiZldmVudC5jdHJsS2V5KSkpfXRtcC5tb3ZlX3R5cGU9ZmFsc2U7dG1wLnJlZl9ub2RlPWZhbHNlfWlmKHRtcC5mb3JlaWduIT09ZmFsc2Upe2lmKHRtcC5kcmFnX2hlbHApdG1wLmRyYWdfaGVscC5yZW1vdmUoKTtpZih0bXAubW92ZV90eXBlKXt2YXIgdHJlZTE9dHJlZV9jb21wb25lbnQuaW5zdFt0bXAucmVmX25vZGUucGFyZW50cygiLnRyZWU6ZXEoMCkiKS5hdHRyKCJpZCIpXTtpZih0cmVlMSl0cmVlMS5jYWxsYmFjaygib25kcm9wIixbdG1wLmZfZGF0YSx0cmVlMS5nZXRfbm9kZSh0bXAucmVmX25vZGUpLmdldCgwKSx0bXAubW92ZV90eXBlLHRyZWUxXSl9dG1wLmZvcmVpZ249ZmFsc2U7dG1wLm1vdmVfdHlwZT1mYWxzZTt0bXAucmVmX25vZGU9ZmFsc2V9aWYodHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLm1hcmtlcil0cmVlX2NvbXBvbmVudC5kcmFnX2Ryb3AubWFya2VyLmhpZGUoKTtpZih0bXAuZHJhZ2dlZCYmdG1wLmRyYWdnZWQuc2l6ZSgpKXRtcC5kcmFnZ2VkLnJlbW92ZUNsYXNzKCJkcmFnZ2VkIik7dG1wLmRyYWdnZWQ9ZmFsc2U7dG1wLmRyYWdfaGVscD1mYWxzZTt0bXAuZHJhZ19ub2RlPWZhbHNlO3RtcC5mX3R5cGU9ZmFsc2U7dG1wLmZfZGF0YT1mYWxzZTt0bXAuaW5pdF94PWZhbHNlO3RtcC5pbml0X3k9ZmFsc2U7dG1wLm1vdmluZz1mYWxzZTt0bXAuYXBwZW5kZWQ9ZmFsc2U7dG1wLm9yaWdpbl90cmVlPWZhbHNlO2lmKHRtcC5pc2Rvd24pe3RtcC5pc2Rvd249ZmFsc2U7ZXZlbnQucHJldmVudERlZmF1bHQoKTtldmVudC5zdG9wUHJvcGFnYXRpb24oKTtyZXR1cm4gZmFsc2V9fTt0cmVlX2NvbXBvbmVudC5tb3VzZW1vdmU9ZnVuY3Rpb24oZXZlbnQpe3ZhciB0bXA9dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wO3ZhciBpc19zdGFydD1mYWxzZTtpZih0bXAuaXNkb3duKXtpZighdG1wLm1vdmluZyYmTWF0aC5hYnModG1wLmluaXRfeC1ldmVudC5wYWdlWCk8NSYmTWF0aC5hYnModG1wLmluaXRfeS1ldmVudC5wYWdlWSk8NSl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtldmVudC5zdG9wUHJvcGFnYXRpb24oKTtyZXR1cm4gZmFsc2V9ZWxzZXtpZighdG1wLm1vdmluZyl7dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLm1vdmluZz10cnVlO2lzX3N0YXJ0PXRydWV9fWlmKHRtcC5vcGVuX3RpbWUpY2xlYXJUaW1lb3V0KHRtcC5vcGVuX3RpbWUpO2lmKHRtcC5kcmFnX2hlbHAhPT1mYWxzZSl7aWYoIXRtcC5hcHBlbmRlZCl7aWYodG1wLmZvcmVpZ24hPT1mYWxzZSl0bXAub3JpZ2luX3RyZWU9JC50cmVlLmZvY3VzZWQoKTskKCJib2R5IikuYXBwZW5kKHRtcC5kcmFnX2hlbHApO3RtcC53PXRtcC5kcmFnX2hlbHAud2lkdGgoKTt0bXAuYXBwZW5kZWQ9dHJ1ZX10bXAuZHJhZ19oZWxwLmNzcyh7ImxlZnQiOihldmVudC5wYWdlWCs1KSwidG9wIjooZXZlbnQucGFnZVkrMTUpfSl9aWYoaXNfc3RhcnQmJiQudHJlZS5kcmFnX3N0YXJ0IT09ZmFsc2UpJC50cmVlLmRyYWdfc3RhcnQuY2FsbChudWxsLGV2ZW50LHRtcCk7aWYoJC50cmVlLmRyYWchPT1mYWxzZSkkLnRyZWUuZHJhZy5jYWxsKG51bGwsZXZlbnQsdG1wKTtpZihldmVudC50YXJnZXQudGFnTmFtZT09IkRJViImJmV2ZW50LnRhcmdldC5pZD09ImpzdHJlZS1tYXJrZXIiKXJldHVybiBmYWxzZTt2YXIgZXQ9JChldmVudC50YXJnZXQpO2lmKGV0LmlzKCJpbnMiKSlldD1ldC5wYXJlbnQoKTt2YXIgY250PWV0LmlzKCIudHJlZSIpP2V0OmV0LnBhcmVudHMoIi50cmVlOmVxKDApIik7aWYoY250LnNpemUoKT09MHx8IXRyZWVfY29tcG9uZW50Lmluc3RbY250LmF0dHIoImlkIildKXtpZih0bXAuc2Nyb2xsX3RpbWUpY2xlYXJUaW1lb3V0KHRtcC5zY3JvbGxfdGltZSk7aWYodG1wLmRyYWdfaGVscCE9PWZhbHNlKXRtcC5kcmFnX2hlbHAuZmluZCgibGk6ZXEoMCkgaW5zIikuYWRkQ2xhc3MoImZvcmJpZGRlbiIpO3RtcC5tb3ZlX3R5cGU9ZmFsc2U7dG1wLnJlZl9ub2RlPWZhbHNlO3RyZWVfY29tcG9uZW50LmRyYWdfZHJvcC5tYXJrZXIuaGlkZSgpO3JldHVybiBmYWxzZX12YXIgdHJlZTI9dHJlZV9jb21wb25lbnQuaW5zdFtjbnQuYXR0cigiaWQiKV07dHJlZTIub2ZmX2hlaWdodCgpO2lmKHRtcC5zY3JvbGxfdGltZSljbGVhclRpbWVvdXQodG1wLnNjcm9sbF90aW1lKTt0bXAuc2Nyb2xsX3RpbWU9c2V0VGltZW91dChmdW5jdGlvbigpe3RyZWUyLnNjcm9sbF9jaGVjayhldmVudC5wYWdlWCxldmVudC5wYWdlWSl9LDUwKTt2YXIgbW92PWZhbHNlO3ZhciBzdD1jbnQuc2Nyb2xsVG9wKCk7aWYoZXZlbnQudGFyZ2V0LnRhZ05hbWU9PSJBInx8ZXZlbnQudGFyZ2V0LnRhZ05hbWU9PSJJTlMiKXtpZihldC5pcygiI2pzdHJlZS1kcmFnZ2VkIikpcmV0dXJuIGZhbHNlO2lmKHRyZWUyLmdldF9ub2RlKGV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoImNsb3NlZCIpKXt0bXAub3Blbl90aW1lPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cmVlMi5vcGVuX2JyYW5jaChldCl9LDUwMCl9dmFyIGV0X29mZj1ldC5vZmZzZXQoKTt2YXIgZ29Ubz17eDooZXRfb2ZmLmxlZnQtMSkseTooZXZlbnQucGFnZVktZXRfb2ZmLnRvcCl9O3ZhciBhcnI9W107aWYoZ29Uby55PHRyZWUyLmxpX2hlaWdodC8zKzEpYXJyPVsiYmVmb3JlIiwiaW5zaWRlIiwiYWZ0ZXIiXTtlbHNlIGlmKGdvVG8ueT50cmVlMi5saV9oZWlnaHQqMi8zLTEpYXJyPVsiYWZ0ZXIiLCJpbnNpZGUiLCJiZWZvcmUiXTtlbHNle2lmKGdvVG8ueTx0cmVlMi5saV9oZWlnaHQvMilhcnI9WyJpbnNpZGUiLCJiZWZvcmUiLCJhZnRlciJdO2Vsc2UgYXJyPVsiaW5zaWRlIiwiYWZ0ZXIiLCJiZWZvcmUiXX12YXIgb2s9ZmFsc2U7dmFyIG5uPSh0bXAuZm9yZWlnbj09ZmFsc2UpP3RtcC5vcmlnaW5fdHJlZS5jb250YWluZXIuZmluZCgibGkuZHJhZ2dlZCIpOnRtcC5mX3R5cGU7JC5lYWNoKGFycixmdW5jdGlvbihpLHZhbCl7aWYodHJlZTIuY2hlY2tfbW92ZShubixldCx2YWwpKXttb3Y9dmFsO29rPXRydWU7cmV0dXJuIGZhbHNlfX0pO2lmKG9rKXtzd2l0Y2gobW92KXtjYXNlImJlZm9yZSI6Z29Uby55PWV0X29mZi50b3AtMjt0cmVlX2NvbXBvbmVudC5kcmFnX2Ryb3AubWFya2VyLmF0dHIoImNsYXNzIiwibWFya2VyIik7YnJlYWs7Y2FzZSJhZnRlciI6Z29Uby55PWV0X29mZi50b3AtMit0cmVlMi5saV9oZWlnaHQ7dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLm1hcmtlci5hdHRyKCJjbGFzcyIsIm1hcmtlciIpO2JyZWFrO2Nhc2UiaW5zaWRlIjpnb1RvLngtPTI7Z29Uby55PWV0X29mZi50b3AtMit0cmVlMi5saV9oZWlnaHQvMjt0cmVlX2NvbXBvbmVudC5kcmFnX2Ryb3AubWFya2VyLmF0dHIoImNsYXNzIiwibWFya2VyX3BsdXMiKTticmVha310bXAubW92ZV90eXBlPW1vdjt0bXAucmVmX25vZGU9JChldmVudC50YXJnZXQpO2lmKHRtcC5kcmFnX2hlbHAhPT1mYWxzZSl0bXAuZHJhZ19oZWxwLmZpbmQoIi5mb3JiaWRkZW4iKS5yZW1vdmVDbGFzcygiZm9yYmlkZGVuIik7dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLm1hcmtlci5jc3MoeyJsZWZ0Ijpnb1RvLngsInRvcCI6Z29Uby55fSkuc2hvdygpfX1pZigoZXQuaXMoIi50cmVlIil8fGV0LmlzKCJ1bCIpKSYmZXQuZmluZCgibGk6ZXEoMCkiKS5zaXplKCk9PTApe3ZhciBldF9vZmY9ZXQub2Zmc2V0KCk7dG1wLm1vdmVfdHlwZT0iaW5zaWRlIjt0bXAucmVmX25vZGU9Y250LmNoaWxkcmVuKCJ1bDplcSgwKSIpO2lmKHRtcC5kcmFnX2hlbHAhPT1mYWxzZSl0bXAuZHJhZ19oZWxwLmZpbmQoIi5mb3JiaWRkZW4iKS5yZW1vdmVDbGFzcygiZm9yYmlkZGVuIik7dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLm1hcmtlci5hdHRyKCJjbGFzcyIsIm1hcmtlcl9wbHVzIik7dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLm1hcmtlci5jc3MoeyJsZWZ0IjooZXRfb2ZmLmxlZnQrMTApLCJ0b3AiOmV0X29mZi50b3ArMTV9KS5zaG93KCl9ZWxzZSBpZigoZXZlbnQudGFyZ2V0LnRhZ05hbWUhPSJBIiYmZXZlbnQudGFyZ2V0LnRhZ05hbWUhPSJJTlMiKXx8IW9rKXtpZih0bXAuZHJhZ19oZWxwIT09ZmFsc2UpdG1wLmRyYWdfaGVscC5maW5kKCJsaTplcSgwKSBpbnMiKS5hZGRDbGFzcygiZm9yYmlkZGVuIik7dG1wLm1vdmVfdHlwZT1mYWxzZTt0bXAucmVmX25vZGU9ZmFsc2U7dHJlZV9jb21wb25lbnQuZHJhZ19kcm9wLm1hcmtlci5oaWRlKCl9ZXZlbnQucHJldmVudERlZmF1bHQoKTtldmVudC5zdG9wUHJvcGFnYXRpb24oKTtyZXR1cm4gZmFsc2V9cmV0dXJuIHRydWV9OyQoZnVuY3Rpb24oKXskKGRvY3VtZW50KS5iaW5kKCJtb3VzZW1vdmUuanN0cmVlIix0cmVlX2NvbXBvbmVudC5tb3VzZW1vdmUpOyQoZG9jdW1lbnQpLmJpbmQoIm1vdXNldXAuanN0cmVlIix0cmVlX2NvbXBvbmVudC5tb3VzZXVwKX0pO3RyZWVfY29tcG9uZW50LmN1dF9jb3B5PXtjb3B5X25vZGVzOmZhbHNlLGN1dF9ub2RlczpmYWxzZX07dHJlZV9jb21wb25lbnQuY3NzPWZhbHNlO3RyZWVfY29tcG9uZW50LmdldF9jc3M9ZnVuY3Rpb24ocnVsZV9uYW1lLGRlbGV0ZV9mbGFnKXtydWxlX25hbWU9cnVsZV9uYW1lLnRvTG93ZXJDYXNlKCk7dmFyIGNzc19ydWxlcz10cmVlX2NvbXBvbmVudC5jc3MuY3NzUnVsZXN8fHRyZWVfY29tcG9uZW50LmNzcy5ydWxlczt2YXIgaj0wO2Rve2lmKGNzc19ydWxlcy5sZW5ndGgmJmo+Y3NzX3J1bGVzLmxlbmd0aCs1KXJldHVybiBmYWxzZTtpZihjc3NfcnVsZXNbal0uc2VsZWN0b3JUZXh0JiZjc3NfcnVsZXNbal0uc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk9PXJ1bGVfbmFtZSl7aWYoZGVsZXRlX2ZsYWc9PXRydWUpe2lmKHRyZWVfY29tcG9uZW50LmNzcy5yZW1vdmVSdWxlKWRvY3VtZW50LnN0eWxlU2hlZXRzW2ldLnJlbW92ZVJ1bGUoaik7aWYodHJlZV9jb21wb25lbnQuY3NzLmRlbGV0ZVJ1bGUpZG9jdW1lbnQuc3R5bGVTaGVldHNbaV0uZGVsZXRlUnVsZShqKTtyZXR1cm4gdHJ1ZX1lbHNlIHJldHVybiBjc3NfcnVsZXNbal19fXdoaWxlKGNzc19ydWxlc1srK2pdKTtyZXR1cm4gZmFsc2V9O3RyZWVfY29tcG9uZW50LmFkZF9jc3M9ZnVuY3Rpb24ocnVsZV9uYW1lKXtpZih0cmVlX2NvbXBvbmVudC5nZXRfY3NzKHJ1bGVfbmFtZSkpcmV0dXJuIGZhbHNlOyh0cmVlX2NvbXBvbmVudC5jc3MuaW5zZXJ0UnVsZSk/dHJlZV9jb21wb25lbnQuY3NzLmluc2VydFJ1bGUocnVsZV9uYW1lKycgeyB9JywwKTp0cmVlX2NvbXBvbmVudC5jc3MuYWRkUnVsZShydWxlX25hbWUsbnVsbCwwKTtyZXR1cm4gdHJlZV9jb21wb25lbnQuZ2V0X2NzcyhydWxlX25hbWUpfTt0cmVlX2NvbXBvbmVudC5yZW1vdmVfY3NzPWZ1bmN0aW9uKHJ1bGVfbmFtZSl7cmV0dXJuIHRyZWVfY29tcG9uZW50LmdldF9jc3MocnVsZV9uYW1lLHRydWUpfTt0cmVlX2NvbXBvbmVudC5hZGRfc2hlZXQ9ZnVuY3Rpb24ob3B0cyl7aWYob3B0cy5zdHIpe3ZhciB0bXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt0bXAudHlwZT0idGV4dC9jc3MiO2lmKHRtcC5zdHlsZVNoZWV0KXRtcC5zdHlsZVNoZWV0LmNzc1RleHQ9b3B0cy5zdHI7ZWxzZSB0bXAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUob3B0cy5zdHIpKTtkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHRtcCk7cmV0dXJuIHRtcC5zaGVldH1pZihvcHRzLnVybCl7aWYoZG9jdW1lbnQuY3JlYXRlU3R5bGVTaGVldCl7dHJ5e2RvY3VtZW50LmNyZWF0ZVN0eWxlU2hlZXQob3B0cy51cmwpfWNhdGNoKGUpe319ZWxzZXt2YXIgbmV3U1M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO25ld1NTLnJlbD0nc3R5bGVzaGVldCc7bmV3U1MudHlwZT0ndGV4dC9jc3MnO25ld1NTLm1lZGlhPSJhbGwiO25ld1NTLmhyZWY9b3B0cy51cmw7ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChuZXdTUyk7cmV0dXJuIG5ld1NTLnN0eWxlU2hlZXR9fX07JChmdW5jdGlvbigpe3ZhciB1PW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTt2YXIgdj0odS5tYXRjaCgvLisoPzpydnxpdHxyYXxpZSlbXC86IF0oW1xkLl0rKS8pfHxbMCwnMCddKVsxXTt2YXIgY3NzPScvKiBUUkVFIExBWU9VVCAqLyAudHJlZSB1bCB7IG1hcmdpbjowIDAgMCA1cHg7IHBhZGRpbmc6MCAwIDAgMDsgbGlzdC1zdHlsZS10eXBlOm5vbmU7IH0gLnRyZWUgbGkgeyBkaXNwbGF5OmJsb2NrOyBtaW4taGVpZ2h0OjE4cHg7IGxpbmUtaGVpZ2h0OjE4cHg7IHBhZGRpbmc6MCAwIDAgMTVweDsgbWFyZ2luOjAgMCAwIDA7IC8qIEJhY2tncm91bmQgZml4ICovIGNsZWFyOmJvdGg7IH0gLnRyZWUgbGkgdWwgeyBkaXNwbGF5Om5vbmU7IH0gLnRyZWUgbGkgYSwgLnRyZWUgbGkgc3BhbiB7IGRpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjE2cHg7aGVpZ2h0OjE2cHg7Y29sb3I6YmxhY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3BhZGRpbmc6MXB4IDRweCAxcHggNHB4O21hcmdpbjowOyB9IC50cmVlIGxpIGE6Zm9jdXMgeyBvdXRsaW5lOiBub25lOyB9IC50cmVlIGxpIGEgaW5wdXQsIC50cmVlIGxpIHNwYW4gaW5wdXQgeyBtYXJnaW46MDtwYWRkaW5nOjAgMDtkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MTJweCAhaW1wb3J0YW50O2JvcmRlcjoxcHggc29saWQgd2hpdGU7YmFja2dyb3VuZDp3aGl0ZTtmb250LXNpemU6MTBweDtmb250LWZhbWlseTpWZXJkYW5hOyB9IC50cmVlIGxpIGEgaW5wdXQ6bm90KFtjbGFzcz0ieHh4Il0pLCAudHJlZSBsaSBzcGFuIGlucHV0Om5vdChbY2xhc3M9Inh4eCJdKSB7IHBhZGRpbmc6MXB4IDA7IH0gLyogRk9SIERPVFMgKi8gLnRyZWUgLmx0ciBsaS5sYXN0IHsgZmxvYXQ6bGVmdDsgfSAudHJlZSA+IHVsIGxpLmxhc3QgeyBvdmVyZmxvdzp2aXNpYmxlOyB9IC8qIE9QRU4gT1IgQ0xPU0UgKi8gLnRyZWUgbGkub3BlbiB1bCB7IGRpc3BsYXk6YmxvY2s7IH0gLnRyZWUgbGkuY2xvc2VkIHVsIHsgZGlzcGxheTpub25lICFpbXBvcnRhbnQ7IH0gLyogRk9SIERSQUdHSU5HICovICNqc3RyZWUtZHJhZ2dlZCB7IHBvc2l0aW9uOmFic29sdXRlOyB0b3A6LTEwcHg7IGxlZnQ6LTEwcHg7IG1hcmdpbjowOyBwYWRkaW5nOjA7IH0gI2pzdHJlZS1kcmFnZ2VkIHVsIHVsIHVsIHsgZGlzcGxheTpub25lOyB9ICNqc3RyZWUtbWFya2VyIHsgcGFkZGluZzowOyBtYXJnaW46MDsgbGluZS1oZWlnaHQ6NXB4OyBmb250LXNpemU6MXB4OyBvdmVyZmxvdzpoaWRkZW47IGhlaWdodDo1cHg7IHBvc2l0aW9uOmFic29sdXRlOyBsZWZ0Oi00NXB4OyB0b3A6LTMwcHg7IHotaW5kZXg6MTAwMDsgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDsgYmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0OyBkaXNwbGF5Om5vbmU7IH0gI2pzdHJlZS1tYXJrZXIubWFya2VyIHsgd2lkdGg6NDVweDsgYmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCB0b3A7IH0gI2pzdHJlZS1tYXJrZXIubWFya2VyX3BsdXMgeyB3aWR0aDo1cHg7IGJhY2tncm91bmQtcG9zaXRpb246cmlnaHQgdG9wOyB9IC8qIEJBQ0tHUk9VTkQgRE9UUyAqLyAudHJlZSBsaSBsaSB7IG92ZXJmbG93OmhpZGRlbjsgfSAudHJlZSA+IC5sdHIgPiBsaSB7IGRpc3BsYXk6dGFibGU7IH0gLyogSUNPTlMgKi8gLnRyZWUgdWwgaW5zIHsgZGlzcGxheTppbmxpbmUtYmxvY2s7IHRleHQtZGVjb3JhdGlvbjpub25lOyB3aWR0aDoxNnB4OyBoZWlnaHQ6MTZweDsgfSAudHJlZSAubHRyIGlucyB7IG1hcmdpbjowIDRweCAwIDBweDsgfSAnO2lmKC9tc2llLy50ZXN0KHUpJiYhL29wZXJhLy50ZXN0KHUpKXtpZihwYXJzZUludCh2KT09Niljc3MrPScudHJlZSBsaSB7IGhlaWdodDoxOHB4OyB6b29tOjE7IH0gLnRyZWUgbGkgbGkgeyBvdmVyZmxvdzp2aXNpYmxlOyB9IC50cmVlIC5sdHIgbGkubGFzdCB7IG1hcmdpbi10b3A6IGV4cHJlc3Npb24oICh0aGlzLnByZXZpb3VzU2libGluZyAmJiAvb3Blbi8udGVzdCh0aGlzLnByZXZpb3VzU2libGluZy5jbGFzc05hbWUpICkgPyAiLTJweCIgOiAiMCIpOyB9IC5tYXJrZXIgeyB3aWR0aDo0NXB4OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IHRvcDsgfSAubWFya2VyX3BsdXMgeyB3aWR0aDo1cHg7IGJhY2tncm91bmQtcG9zaXRpb246cmlnaHQgdG9wOyB9JztpZihwYXJzZUludCh2KT09Nyljc3MrPScudHJlZSBsaSBsaSB7IG92ZXJmbG93OnZpc2libGU7IH0gLnRyZWUgLmx0ciBsaS5sYXN0IHsgbWFyZ2luLXRvcDogZXhwcmVzc2lvbiggKHRoaXMucHJldmlvdXNTaWJsaW5nICYmIC9vcGVuLy50ZXN0KHRoaXMucHJldmlvdXNTaWJsaW5nLmNsYXNzTmFtZSkgKSA/ICItMnB4IiA6ICIwIik7IH0nfWlmKC9vcGVyYS8udGVzdCh1KSljc3MrPScudHJlZSA+IHVsID4gbGkubGFzdDphZnRlciB7IGNvbnRlbnQ6Ii4iOyBkaXNwbGF5OiBibG9jazsgaGVpZ2h0OjFweDsgY2xlYXI6Ym90aDsgdmlzaWJpbGl0eTpoaWRkZW47IH0nO2lmKC9tb3ppbGxhLy50ZXN0KHUpJiYhLyhjb21wYXRpYmxlfHdlYmtpdCkvLnRlc3QodSkmJnYuaW5kZXhPZigiMS44Iik9PTApY3NzKz0nLnRyZWUgLmx0ciBsaSBhIHsgZGlzcGxheTppbmxpbmU7IGZsb2F0OmxlZnQ7IH0gLnRyZWUgbGkgdWwgeyBjbGVhcjpib3RoOyB9Jzt0cmVlX2NvbXBvbmVudC5jc3M9dHJlZV9jb21wb25lbnQuYWRkX3NoZWV0KHtzdHI6Y3NzfSl9KX0pKGpRdWVyeSk7KGZ1bmN0aW9uKCQpeyQuZXh0ZW5kKCQudHJlZS5kYXRhc3RvcmVzLHsiaHRtbCI6ZnVuY3Rpb24oKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKG9iaix0cmVlLG9wdHMpe3JldHVybiBvYmomJiQob2JqKS5zaXplKCk/JCgnPGRpdj4nKS5hcHBlbmQodHJlZS5nZXRfbm9kZShvYmopLmNsb25lKCkpLmh0bWwoKTp0cmVlLmNvbnRhaW5lci5jaGlsZHJlbigidWw6ZXEoMCkiKS5odG1sKCl9LHBhcnNlOmZ1bmN0aW9uKGRhdGEsdHJlZSxvcHRzLGNhbGxiYWNrKXtpZihjYWxsYmFjayljYWxsYmFjay5jYWxsKG51bGwsZGF0YSk7cmV0dXJuIGRhdGF9LGxvYWQ6ZnVuY3Rpb24oZGF0YSx0cmVlLG9wdHMsY2FsbGJhY2spe2lmKG9wdHMudXJsKXskLmFqYXgoeyd0eXBlJzpvcHRzLm1ldGhvZCwndXJsJzpvcHRzLnVybCwnZGF0YSc6ZGF0YSwnZGF0YVR5cGUnOiJodG1sIiwnc3VjY2Vzcyc6ZnVuY3Rpb24oZCx0ZXh0U3RhdHVzKXtjYWxsYmFjay5jYWxsKG51bGwsZCl9LCdlcnJvcic6ZnVuY3Rpb24oeGh0dHAsdGV4dFN0YXR1cyxlcnJvclRocm93bil7Y2FsbGJhY2suY2FsbChudWxsLGZhbHNlKTt0cmVlLmVycm9yKGVycm9yVGhyb3duKyIgIit0ZXh0U3RhdHVzKX19KX1lbHNle2NhbGxiYWNrLmNhbGwobnVsbCxvcHRzLnN0YXRpY3x8dHJlZS5jb250YWluZXIuY2hpbGRyZW4oInVsOmVxKDApIikuaHRtbCgpKX19fX0sImpzb24iOmZ1bmN0aW9uKCl7cmV0dXJue2dldDpmdW5jdGlvbihvYmosdHJlZSxvcHRzKXt2YXIgX3RoaXM9dGhpcztpZighb2JqfHwkKG9iaikuc2l6ZSgpPT0wKW9iaj10cmVlLmNvbnRhaW5lci5jaGlsZHJlbigidWwiKS5jaGlsZHJlbigibGkiKTtlbHNlIG9iaj0kKG9iaik7aWYoIW9wdHMpb3B0cz17fTtpZighb3B0cy5vdXRlcl9hdHRyaWIpb3B0cy5vdXRlcl9hdHRyaWI9WyJpZCIsInJlbCIsImNsYXNzIl07aWYoIW9wdHMuaW5uZXJfYXR0cmliKW9wdHMuaW5uZXJfYXR0cmliPVtdO2lmKG9iai5zaXplKCk+MSl7dmFyIGFycj1bXTtvYmouZWFjaChmdW5jdGlvbigpe2Fyci5wdXNoKF90aGlzLmdldCh0aGlzLHRyZWUsb3B0cykpfSk7cmV0dXJuIGFycn1pZihvYmouc2l6ZSgpPT0wKXJldHVybltdO3ZhciBqc29uPXthdHRyaWJ1dGVzOnt9LGRhdGE6e319O2lmKG9iai5oYXNDbGFzcygib3BlbiIpKWpzb24uZGF0YS5zdGF0ZT0ib3BlbiI7aWYob2JqLmhhc0NsYXNzKCJjbG9zZWQiKSlqc29uLmRhdGEuc3RhdGU9ImNsb3NlZCI7Zm9yKHZhciBpIGluIG9wdHMub3V0ZXJfYXR0cmliKXtpZighb3B0cy5vdXRlcl9hdHRyaWIuaGFzT3duUHJvcGVydHkoaSkpY29udGludWU7dmFyIHZhbD0ob3B0cy5vdXRlcl9hdHRyaWJbaV09PSJjbGFzcyIpP29iai5hdHRyKG9wdHMub3V0ZXJfYXR0cmliW2ldKS5yZXBsYWNlKC8oXnwgKWxhc3QoIHwkKS9pZywiICIpLnJlcGxhY2UoLyhefCApKGxlYWZ8Y2xvc2VkfG9wZW4pKCB8JCkvaWcsIiAiKTpvYmouYXR0cihvcHRzLm91dGVyX2F0dHJpYltpXSk7aWYodHlwZW9mIHZhbCE9InVuZGVmaW5lZCImJnZhbC50b1N0cmluZygpLnJlcGxhY2UoIiAiLCIiKS5sZW5ndGg+MClqc29uLmF0dHJpYnV0ZXNbb3B0cy5vdXRlcl9hdHRyaWJbaV1dPXZhbDtkZWxldGUgdmFsfWlmKHRyZWUuc2V0dGluZ3MubGFuZ3VhZ2VzLmxlbmd0aCl7Zm9yKHZhciBpIGluIHRyZWUuc2V0dGluZ3MubGFuZ3VhZ2VzKXtpZighdHJlZS5zZXR0aW5ncy5sYW5ndWFnZXMuaGFzT3duUHJvcGVydHkoaSkpY29udGludWU7dmFyIGE9b2JqLmNoaWxkcmVuKCJhLiIrdHJlZS5zZXR0aW5ncy5sYW5ndWFnZXNbaV0pO2lmKG9wdHMuZm9yY2V8fG9wdHMuaW5uZXJfYXR0cmliLmxlbmd0aHx8YS5jaGlsZHJlbigiaW5zIikuZ2V0KDApLnN0eWxlLmJhY2tncm91bmRJbWFnZS50b1N0cmluZygpLmxlbmd0aHx8YS5jaGlsZHJlbigiaW5zIikuZ2V0KDApLmNsYXNzTmFtZS5sZW5ndGgpe2pzb24uZGF0YVt0cmVlLnNldHRpbmdzLmxhbmd1YWdlc1tpXV09e307anNvbi5kYXRhW3RyZWUuc2V0dGluZ3MubGFuZ3VhZ2VzW2ldXS50aXRsZT10cmVlLmdldF90ZXh0KG9iaix0cmVlLnNldHRpbmdzLmxhbmd1YWdlc1tpXSk7aWYoYS5jaGlsZHJlbigiaW5zIikuZ2V0KDApLnN0eWxlLmNsYXNzTmFtZS5sZW5ndGgpe2pzb24uZGF0YVt0cmVlLnNldHRpbmdzLmxhbmd1YWdlc1tpXV0uaWNvbj1hLmNoaWxkcmVuKCJpbnMiKS5nZXQoMCkuc3R5bGUuY2xhc3NOYW1lfWlmKGEuY2hpbGRyZW4oImlucyIpLmdldCgwKS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UubGVuZ3RoKXtqc29uLmRhdGFbdHJlZS5zZXR0aW5ncy5sYW5ndWFnZXNbaV1dLmljb249YS5jaGlsZHJlbigiaW5zIikuZ2V0KDApLnN0eWxlLmJhY2tncm91bmRJbWFnZS5yZXBsYWNlKCJ1cmwoIiwiIikucmVwbGFjZSgiKSIsIiIpfWlmKG9wdHMuaW5uZXJfYXR0cmliLmxlbmd0aCl7anNvbi5kYXRhW3RyZWUuc2V0dGluZ3MubGFuZ3VhZ2VzW2ldXS5hdHRyaWJ1dGVzPXt9O2Zvcih2YXIgaiBpbiBvcHRzLmlubmVyX2F0dHJpYil7aWYoIW9wdHMuaW5uZXJfYXR0cmliLmhhc093blByb3BlcnR5KGopKWNvbnRpbnVlO3ZhciB2YWw9YS5hdHRyKG9wdHMuaW5uZXJfYXR0cmliW2pdKTtpZih0eXBlb2YgdmFsIT0idW5kZWZpbmVkIiYmdmFsLnRvU3RyaW5nKCkucmVwbGFjZSgiICIsIiIpLmxlbmd0aD4wKWpzb24uZGF0YVt0cmVlLnNldHRpbmdzLmxhbmd1YWdlc1tpXV0uYXR0cmlidXRlc1tvcHRzLmlubmVyX2F0dHJpYltqXV09dmFsO2RlbGV0ZSB2YWx9fX1lbHNle2pzb24uZGF0YVt0cmVlLnNldHRpbmdzLmxhbmd1YWdlc1tpXV09dHJlZS5nZXRfdGV4dChvYmosdHJlZS5zZXR0aW5ncy5sYW5ndWFnZXNbaV0pfX19ZWxzZXt2YXIgYT1vYmouY2hpbGRyZW4oImEiKTtqc29uLmRhdGEudGl0bGU9dHJlZS5nZXRfdGV4dChvYmopO2lmKGEuY2hpbGRyZW4oImlucyIpLnNpemUoKSYmYS5jaGlsZHJlbigiaW5zIikuZ2V0KDApLmNsYXNzTmFtZS5sZW5ndGgpe2pzb24uZGF0YS5pY29uPWEuY2hpbGRyZW4oImlucyIpLmdldCgwKS5jbGFzc05hbWV9aWYoYS5jaGlsZHJlbigiaW5zIikuc2l6ZSgpJiZhLmNoaWxkcmVuKCJpbnMiKS5nZXQoMCkuc3R5bGUuYmFja2dyb3VuZEltYWdlLmxlbmd0aCl7anNvbi5kYXRhLmljb249YS5jaGlsZHJlbigiaW5zIikuZ2V0KDApLnN0eWxlLmJhY2tncm91bmRJbWFnZS5yZXBsYWNlKCJ1cmwoIiwiIikucmVwbGFjZSgiKSIsIiIpfWlmKG9wdHMuaW5uZXJfYXR0cmliLmxlbmd0aCl7anNvbi5kYXRhLmF0dHJpYnV0ZXM9e307Zm9yKHZhciBqIGluIG9wdHMuaW5uZXJfYXR0cmliKXtpZighb3B0cy5pbm5lcl9hdHRyaWIuaGFzT3duUHJvcGVydHkoaikpY29udGludWU7dmFyIHZhbD1hLmF0dHIob3B0cy5pbm5lcl9hdHRyaWJbal0pO2lmKHR5cGVvZiB2YWwhPSJ1bmRlZmluZWQiJiZ2YWwudG9TdHJpbmcoKS5yZXBsYWNlKCIgIiwiIikubGVuZ3RoPjApanNvbi5kYXRhLmF0dHJpYnV0ZXNbb3B0cy5pbm5lcl9hdHRyaWJbal1dPXZhbDtkZWxldGUgdmFsfX19aWYob2JqLmNoaWxkcmVuKCJ1bCIpLnNpemUoKT4wKXtqc29uLmNoaWxkcmVuPVtdO29iai5jaGlsZHJlbigidWwiKS5jaGlsZHJlbigibGkiKS5lYWNoKGZ1bmN0aW9uKCl7anNvbi5jaGlsZHJlbi5wdXNoKF90aGlzLmdldCh0aGlzLHRyZWUsb3B0cykpfSl9cmV0dXJuIGpzb259LHBhcnNlOmZ1bmN0aW9uKGRhdGEsdHJlZSxvcHRzLGNhbGxiYWNrKXtpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KGRhdGEpPT09IltvYmplY3QgQXJyYXldIil7dmFyIHN0cj0nJztmb3IodmFyIGk9MDtpPGRhdGEubGVuZ3RoO2krKyl7aWYodHlwZW9mIGRhdGFbaV09PSJmdW5jdGlvbiIpY29udGludWU7c3RyKz10aGlzLnBhcnNlKGRhdGFbaV0sdHJlZSxvcHRzKX1pZihjYWxsYmFjayljYWxsYmFjay5jYWxsKG51bGwsc3RyKTtyZXR1cm4gc3RyfWlmKCFkYXRhfHwhZGF0YS5kYXRhKXtpZihjYWxsYmFjayljYWxsYmFjay5jYWxsKG51bGwsZmFsc2UpO3JldHVybiIifXZhciBzdHI9Jyc7c3RyKz0iPGxpICI7dmFyIGNscz1mYWxzZTtpZihkYXRhLmF0dHJpYnV0ZXMpe2Zvcih2YXIgaSBpbiBkYXRhLmF0dHJpYnV0ZXMpe2lmKCFkYXRhLmF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoaSkpY29udGludWU7aWYoaT09ImNsYXNzIil7c3RyKz0iIGNsYXNzPSciK2RhdGEuYXR0cmlidXRlc1tpXSsiICI7aWYoZGF0YS5zdGF0ZT09ImNsb3NlZCJ8fGRhdGEuc3RhdGU9PSJvcGVuIilzdHIrPSIgIitkYXRhLnN0YXRlKyIgIjtzdHIrPSInICI7Y2xzPXRydWV9ZWxzZSBzdHIrPSIgIitpKyI9JyIrZGF0YS5hdHRyaWJ1dGVzW2ldKyInICJ9fWlmKCFjbHMmJihkYXRhLnN0YXRlPT0iY2xvc2VkInx8ZGF0YS5zdGF0ZT09Im9wZW4iKSlzdHIrPSIgY2xhc3M9JyIrZGF0YS5zdGF0ZSsiJyAiO3N0cis9Ij4iO2lmKHRyZWUuc2V0dGluZ3MubGFuZ3VhZ2VzLmxlbmd0aCl7Zm9yKHZhciBpPTA7aTx0cmVlLnNldHRpbmdzLmxhbmd1YWdlcy5sZW5ndGg7aSsrKXt2YXIgYXR0cj17fTthdHRyWyJocmVmIl09IiI7YXR0clsic3R5bGUiXT0iIjthdHRyWyJjbGFzcyJdPXRyZWUuc2V0dGluZ3MubGFuZ3VhZ2VzW2ldO2lmKGRhdGEuZGF0YVt0cmVlLnNldHRpbmdzLmxhbmd1YWdlc1tpXV0mJih0eXBlb2YgZGF0YS5kYXRhW3RyZWUuc2V0dGluZ3MubGFuZ3VhZ2VzW2ldXS5hdHRyaWJ1dGVzKS50b0xvd2VyQ2FzZSgpIT0idW5kZWZpbmVkIil7Zm9yKHZhciBqIGluIGRhdGEuZGF0YVt0cmVlLnNldHRpbmdzLmxhbmd1YWdlc1tpXV0uYXR0cmlidXRlcyl7aWYoIWRhdGEuZGF0YVt0cmVlLnNldHRpbmdzLmxhbmd1YWdlc1tpXV0uYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShqKSljb250aW51ZTtpZihqPT0ic3R5bGUifHxqPT0iY2xhc3MiKWF0dHJbal0rPSIgIitkYXRhLmRhdGFbdHJlZS5zZXR0aW5ncy5sYW5ndWFnZXNbaV1dLmF0dHJpYnV0ZXNbal07ZWxzZSBhdHRyW2pdPWRhdGEuZGF0YVt0cmVlLnNldHRpbmdzLmxhbmd1YWdlc1tpXV0uYXR0cmlidXRlc1tqXX19c3RyKz0iPGEiO2Zvcih2YXIgaiBpbiBhdHRyKXtpZighYXR0ci5oYXNPd25Qcm9wZXJ0eShqKSljb250aW51ZTtzdHIrPScgJytqKyc9IicrYXR0cltqXSsnIiAnfXN0cis9Ij4iO2lmKGRhdGEuZGF0YVt0cmVlLnNldHRpbmdzLmxhbmd1YWdlc1tpXV0mJmRhdGEuZGF0YVt0cmVlLnNldHRpbmdzLmxhbmd1YWdlc1tpXV0uaWNvbil7c3RyKz0iPGlucyAiKyhkYXRhLmRhdGFbdHJlZS5zZXR0aW5ncy5sYW5ndWFnZXNbaV1dLmljb24uaW5kZXhPZigiLyIpPT0tMT8iIGNsYXNzPSciK2RhdGEuZGF0YVt0cmVlLnNldHRpbmdzLmxhbmd1YWdlc1tpXV0uaWNvbisiJyAiOiIgc3R5bGU9J2JhY2tncm91bmQtaW1hZ2U6dXJsKFwiIitkYXRhLmRhdGFbdHJlZS5zZXR0aW5ncy5sYW5ndWFnZXNbaV1dLmljb24rIlwiKTsnICIpKyI+Jm5ic3A7PC9pbnM+In1lbHNlIHN0cis9IjxpbnM+Jm5ic3A7PC9pbnM+IjtzdHIrPSgodHlwZW9mIGRhdGEuZGF0YVt0cmVlLnNldHRpbmdzLmxhbmd1YWdlc1tpXV0udGl0bGUpLnRvTG93ZXJDYXNlKCkhPSJ1bmRlZmluZWQiP2RhdGEuZGF0YVt0cmVlLnNldHRpbmdzLmxhbmd1YWdlc1tpXV0udGl0bGU6ZGF0YS5kYXRhW3RyZWUuc2V0dGluZ3MubGFuZ3VhZ2VzW2ldXSkrIjwvYT4ifX1lbHNle3ZhciBhdHRyPXt9O2F0dHJbImhyZWYiXT0iIjthdHRyWyJzdHlsZSJdPSIiO2F0dHJbImNsYXNzIl09IiI7aWYoKHR5cGVvZiBkYXRhLmRhdGEuYXR0cmlidXRlcykudG9Mb3dlckNhc2UoKSE9InVuZGVmaW5lZCIpe2Zvcih2YXIgaSBpbiBkYXRhLmRhdGEuYXR0cmlidXRlcyl7aWYoIWRhdGEuZGF0YS5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KGkpKWNvbnRpbnVlO2lmKGk9PSJzdHlsZSJ8fGk9PSJjbGFzcyIpYXR0cltpXSs9IiAiK2RhdGEuZGF0YS5hdHRyaWJ1dGVzW2ldO2Vsc2UgYXR0cltpXT1kYXRhLmRhdGEuYXR0cmlidXRlc1tpXX19c3RyKz0iPGEiO2Zvcih2YXIgaSBpbiBhdHRyKXtpZighYXR0ci5oYXNPd25Qcm9wZXJ0eShpKSljb250aW51ZTtzdHIrPScgJytpKyc9IicrYXR0cltpXSsnIiAnfXN0cis9Ij4iO2lmKGRhdGEuZGF0YS5pY29uKXtzdHIrPSI8aW5zICIrKGRhdGEuZGF0YS5pY29uLmluZGV4T2YoIi8iKT09LTE/IiBjbGFzcz0nIitkYXRhLmRhdGEuaWNvbisiJyAiOiIgc3R5bGU9J2JhY2tncm91bmQtaW1hZ2U6dXJsKFwiIitkYXRhLmRhdGEuaWNvbisiXCIpOycgIikrIj4mbmJzcDs8L2lucz4ifWVsc2Ugc3RyKz0iPGlucz4mbmJzcDs8L2lucz4iO3N0cis9KCh0eXBlb2YgZGF0YS5kYXRhLnRpdGxlKS50b0xvd2VyQ2FzZSgpIT0idW5kZWZpbmVkIj9kYXRhLmRhdGEudGl0bGU6ZGF0YS5kYXRhKSsiPC9hPiJ9aWYoZGF0YS5jaGlsZHJlbiYmZGF0YS5jaGlsZHJlbi5sZW5ndGgpe3N0cis9Jzx1bD4nO2Zvcih2YXIgaT0wO2k8ZGF0YS5jaGlsZHJlbi5sZW5ndGg7aSsrKXtzdHIrPXRoaXMucGFyc2UoZGF0YS5jaGlsZHJlbltpXSx0cmVlLG9wdHMpfXN0cis9JzwvdWw+J31zdHIrPSI8L2xpPiI7aWYoY2FsbGJhY2spY2FsbGJhY2suY2FsbChudWxsLHN0cik7cmV0dXJuIHN0cn0sbG9hZDpmdW5jdGlvbihkYXRhLHRyZWUsb3B0cyxjYWxsYmFjayl7aWYob3B0cy5zdGF0aWMpe2NhbGxiYWNrLmNhbGwobnVsbCxvcHRzLnN0YXRpYyl9ZWxzZXskLmFqYXgoeyd0eXBlJzpvcHRzLm1ldGhvZCwndXJsJzpvcHRzLnVybCwnZGF0YSc6ZGF0YSwnZGF0YVR5cGUnOiJqc29uIiwnc3VjY2Vzcyc6ZnVuY3Rpb24oZCx0ZXh0U3RhdHVzKXtjYWxsYmFjay5jYWxsKG51bGwsZCl9LCdlcnJvcic6ZnVuY3Rpb24oeGh0dHAsdGV4dFN0YXR1cyxlcnJvclRocm93bil7Y2FsbGJhY2suY2FsbChudWxsLGZhbHNlKTt0cmVlLmVycm9yKGVycm9yVGhyb3duKyIgIit0ZXh0U3RhdHVzKX19KX19fX19KX0pKGpRdWVyeSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvcmVzL2pzVHJlZS52LjAuOS45YS90aGVtZXMvdGhlbWVyb2xsZXIvZG90X2Zvcl9pZS5naWYgYi93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvanNUcmVlLnYuMC45LjlhL3RoZW1lcy90aGVtZXJvbGxlci9kb3RfZm9yX2llLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGNjNWZkCi0tLSAvZGV2L251bGwKKysrIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvcmVzL2pzVHJlZS52LjAuOS45YS90aGVtZXMvdGhlbWVyb2xsZXIvZG90X2Zvcl9pZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvcmVzL2pzVHJlZS52LjAuOS45YS90aGVtZXMvdGhlbWVyb2xsZXIvaWNvbnMucG5nIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvcmVzL2pzVHJlZS52LjAuOS45YS90aGVtZXMvdGhlbWVyb2xsZXIvaWNvbnMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMjYxOGEKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvanNUcmVlLnYuMC45LjlhL3RoZW1lcy90aGVtZXJvbGxlci9pY29ucy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvcmVzL2pzVHJlZS52LjAuOS45YS90aGVtZXMvdGhlbWVyb2xsZXIvc3R5bGUuY3NzIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvcmVzL2pzVHJlZS52LjAuOS45YS90aGVtZXMvdGhlbWVyb2xsZXIvc3R5bGUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMmM2YTAKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvanNUcmVlLnYuMC45LjlhL3RoZW1lcy90aGVtZXJvbGxlci9zdHlsZS5jc3MKQEAgLTAsMCArMSwzOSBAQAorLyogTE9DS0VEICovDQorLnRyZWUtdGhlbWVyb2xsZXIgLmxvY2tlZCBsaSBhIHsgY29sb3I6Z3JheTsgfQ0KKy8qIERPVFMgKi8NCisudHJlZS10aGVtZXJvbGxlciB1bCB7IGJhY2tncm91bmQtcG9zaXRpb246NnB4IDFweDsgYmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXk7IGJhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFnQUNBSUFBQUI0ZEdmLy8veUg1QkFFQUFBRUFMQUFBQUFBQ0FBSUFBQUlDUkY0QU93PT0pOyBfYmFja2dyb3VuZC1pbWFnZTp1cmwoImRvdF9mb3JfaWUuZ2lmIik7ICpiYWNrZ3JvdW5kLWltYWdlOnVybCgiZG90X2Zvcl9pZS5naWYiKTsgfQ0KKy50cmVlLXRoZW1lcm9sbGVyIGxpIHsgYmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTZweDsgYmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0OyBiYWNrZ3JvdW5kLWltYWdlOnVybCgiaWNvbnMucG5nIik7IH0NCisvKiBOTyBET1RTICovDQorLnRyZWUtdGhlbWVyb2xsZXIgLm5vX2RvdHMsIC50cmVlLXRoZW1lcm9sbGVyIC5ub19kb3RzIHVsIHsgYmFja2dyb3VuZDp0cmFuc3BhcmVudDsgfQ0KKy50cmVlLXRoZW1lcm9sbGVyIC5ub19kb3RzIGxpLmxlYWYgeyBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7IGJhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7IH0NCisvKiBPUEVOIG9yIENMT1NFRCAqLw0KKy50cmVlLXRoZW1lcm9sbGVyIGxpLm9wZW4geyBiYWNrZ3JvdW5kOnVybCgiaWNvbnMucG5nIikgLTMycHggLTQ4cHggbm8tcmVwZWF0OyB9DQorLnRyZWUtdGhlbWVyb2xsZXIgbGkuY2xvc2VkLCAjanN0cmVlLWRyYWdnZWQudHJlZS10aGVtZXJvbGxlciBsaSBsaS5vcGVuIHsgYmFja2dyb3VuZDp1cmwoImljb25zLnBuZyIpIC00OHB4IC0zMnB4IG5vLXJlcGVhdDsgfQ0KKyNqc3RyZWUtbWFya2VyIHsgYmFja2dyb3VuZC1pbWFnZTp1cmwoImljb25zLnBuZyIpOyB9DQorDQorLnRyZWUtdGhlbWVyb2xsZXIgbGksIC50cmVlLXRoZW1lcm9sbGVyIGxpIGEsIC50cmVlLXRoZW1lcm9sbGVyIGxpIGEgaW5zIHsgbGluZS1oZWlnaHQ6MTZweCAhaW1wb3J0YW50OyB9DQorLnRyZWUtdGhlbWVyb2xsZXIgbGkgYSAudWktaWNvbiB7IG92ZXJmbG93OnZpc2libGU7IH0NCisNCisvKiBERUZBVUxULCBIT1ZFUiwgQ0xJQ0tFRCwgTE9BRElORyBTVEFURVMgDQorLnRyZWUtdGhlbWVyb2xsZXIgbGkgYSwgLnRyZWUtdGhlbWVyb2xsZXIgbGkgc3BhbiB7IGJvcmRlci1yYWRpdXM6M3B4OyAtbW96LWJvcmRlci1yYWRpdXM6M3B4OyAtd2Via2l0LWJvcmRlci1yYWRpdXM6M3B4OyB9DQorLnRyZWUtdGhlbWVyb2xsZXIgbGkgYTpob3ZlciwgLnRyZWUtdGhlbWVyb2xsZXIgbGkgYS5ob3ZlciwgLnRyZWUtdGhlbWVyb2xsZXIgbGkgc3BhbiB7IGJhY2tncm91bmQ6ICNlN2Y0Zjk7IGJvcmRlcjoxcHggc29saWQgI2Q4ZjBmYTsgcGFkZGluZzowcHggM3B4IDBweCAzcHg7IH0NCisudHJlZS10aGVtZXJvbGxlciBsaSBhLmNsaWNrZWQsIC50cmVlLXRoZW1lcm9sbGVyIGxpIGEuY2xpY2tlZDpob3ZlciwgLnRyZWUtdGhlbWVyb2xsZXIgbGkgc3Bhbi5jbGlja2VkIHsgYmFja2dyb3VuZDogI2JlZWJmZjsgYm9yZGVyOjFweCBzb2xpZCAjOTlkZWZkOyBwYWRkaW5nOjBweCAzcHggMHB4IDNweDsgfQ0KKyovDQorLyogSUNPTlMgKi8NCisudHJlZS10aGVtZXJvbGxlciB1bCBsaSBhLmxvYWRpbmcgaW5zIHsgYmFja2dyb3VuZC1pbWFnZTp1cmwoInRocm9iYmVyLmdpZiIpICFpbXBvcnRhbnQ7IGJhY2tncm91bmQtcG9zaXRpb246MCAwICFpbXBvcnRhbnQ7IH0gLyogVUwgaXMgYWRkZWQgdG8gbWFrZSBzZWxlY3RvciBzdHJvbmdlciAqLw0KKy8qDQorLnRyZWUtdGhlbWVyb2xsZXIgaW5zIHsgYmFja2dyb3VuZC1pbWFnZTp1cmwoImljb25zLnBuZyIpOyBiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMDsgYmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0OyB9DQorLnRyZWUtdGhlbWVyb2xsZXIgbGkgYSBpbnMuZm9yYmlkZGVuIHsgYmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTZweDsgfQ0KKy50cmVlLXRoZW1lcm9sbGVyIC5sb2NrZWQgbGkgYSBpbnMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTQ4cHg7IH0NCisudHJlZS10aGVtZXJvbGxlciBsaSBzcGFuIGlucyB7IGJhY2tncm91bmQtcG9zaXRpb246LTE2cHggMDsgfQ0KKyovDQorDQorI2pzdHJlZS1kcmFnZ2VkLnRyZWUtdGhlbWVyb2xsZXIgaW5zIHsgYmFja2dyb3VuZDp1cmwoImljb25zLnBuZyIpIC0xNnB4IC0zMnB4IG5vLXJlcGVhdDsgfQ0KKyNqc3RyZWUtZHJhZ2dlZC50cmVlLXRoZW1lcm9sbGVyIGlucy5mb3JiaWRkZW4geyBiYWNrZ3JvdW5kOnVybCgiaWNvbnMucG5nIikgLTE2cHggLTE2cHggbm8tcmVwZWF0OyB9DQorDQorLyogQ09OVEVYVCBNRU5VIA0KKy50cmVlLXRoZW1lcm9sbGVyLWNvbnRleHQgYSBpbnMgeyBiYWNrZ3JvdW5kLWltYWdlOnVybCgiaWNvbnMucG5nIik7IGJhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDsgYmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtNjRweDsgfQ0KKy50cmVlLXRoZW1lcm9sbGVyLWNvbnRleHQgYSBpbnMuY3JlYXRlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNnB4OyB9DQorLnRyZWUtdGhlbWVyb2xsZXItY29udGV4dCBhIGlucy5yZW5hbWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IDBweDsgfQ0KKy50cmVlLXRoZW1lcm9sbGVyLWNvbnRleHQgYSBpbnMucmVtb3ZlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjowIC0zMnB4OyB9DQorKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvanNUcmVlLnYuMC45LjlhL3RoZW1lcy90aGVtZXJvbGxlci90aHJvYmJlci5naWYgYi93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvanNUcmVlLnYuMC45LjlhL3RoZW1lcy90aGVtZXJvbGxlci90aHJvYmJlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmZjY0OQotLS0gL2Rldi9udWxsCisrKyBiL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL3Jlcy9qc1RyZWUudi4wLjkuOWEvdGhlbWVzL3RoZW1lcm9sbGVyL3Rocm9iYmVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvanNvbjIubWluLmpzIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvcmVzL2pzb24yLm1pbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzYwYzM0Ci0tLSAvZGV2L251bGwKKysrIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvcmVzL2pzb24yLm1pbi5qcwpAQCAtMCwwICsxLDI5IEBACisvKiBodHRwOi8vd3d3LkpTT04ub3JnL2pzb24yLmpzICovDQoraWYoIXRoaXMuSlNPTil7dGhpcy5KU09OPXt9O30NCisoZnVuY3Rpb24oKXtmdW5jdGlvbiBmKG4pe3JldHVybiBuPDEwPycwJytuOm47fQ0KK2lmKHR5cGVvZiBEYXRlLnByb3RvdHlwZS50b0pTT04hPT0nZnVuY3Rpb24nKXtEYXRlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXNGaW5pdGUodGhpcy52YWx1ZU9mKCkpP3RoaXMuZ2V0VVRDRnVsbFllYXIoKSsnLScrDQorZih0aGlzLmdldFVUQ01vbnRoKCkrMSkrJy0nKw0KK2YodGhpcy5nZXRVVENEYXRlKCkpKydUJysNCitmKHRoaXMuZ2V0VVRDSG91cnMoKSkrJzonKw0KK2YodGhpcy5nZXRVVENNaW51dGVzKCkpKyc6JysNCitmKHRoaXMuZ2V0VVRDU2Vjb25kcygpKSsnWic6bnVsbDt9O1N0cmluZy5wcm90b3R5cGUudG9KU09OPU51bWJlci5wcm90b3R5cGUudG9KU09OPUJvb2xlYW4ucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbihrZXkpe3JldHVybiB0aGlzLnZhbHVlT2YoKTt9O30NCit2YXIgY3g9L1tcdTAwMDBcdTAwYWRcdTA2MDAtXHUwNjA0XHUwNzBmXHUxN2I0XHUxN2I1XHUyMDBjLVx1MjAwZlx1MjAyOC1cdTIwMmZcdTIwNjAtXHUyMDZmXHVmZWZmXHVmZmYwLVx1ZmZmZl0vZyxlc2NhcGFibGU9L1tcXFwiXHgwMC1ceDFmXHg3Zi1ceDlmXHUwMGFkXHUwNjAwLVx1MDYwNFx1MDcwZlx1MTdiNFx1MTdiNVx1MjAwYy1cdTIwMGZcdTIwMjgtXHUyMDJmXHUyMDYwLVx1MjA2Zlx1ZmVmZlx1ZmZmMC1cdWZmZmZdL2csZ2FwLGluZGVudCxtZXRhPXsnXGInOidcXGInLCdcdCc6J1xcdCcsJ1xuJzonXFxuJywnXGYnOidcXGYnLCdccic6J1xccicsJyInOidcXCInLCdcXCc6J1xcXFwnfSxyZXA7ZnVuY3Rpb24gcXVvdGUoc3RyaW5nKXtlc2NhcGFibGUubGFzdEluZGV4PTA7cmV0dXJuIGVzY2FwYWJsZS50ZXN0KHN0cmluZyk/JyInK3N0cmluZy5yZXBsYWNlKGVzY2FwYWJsZSxmdW5jdGlvbihhKXt2YXIgYz1tZXRhW2FdO3JldHVybiB0eXBlb2YgYz09PSdzdHJpbmcnP2M6J1xcdScrKCcwMDAwJythLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNCk7fSkrJyInOiciJytzdHJpbmcrJyInO30NCitmdW5jdGlvbiBzdHIoa2V5LGhvbGRlcil7dmFyIGksayx2LGxlbmd0aCxtaW5kPWdhcCxwYXJ0aWFsLHZhbHVlPWhvbGRlcltrZXldO2lmKHZhbHVlJiZ0eXBlb2YgdmFsdWU9PT0nb2JqZWN0JyYmdHlwZW9mIHZhbHVlLnRvSlNPTj09PSdmdW5jdGlvbicpe3ZhbHVlPXZhbHVlLnRvSlNPTihrZXkpO30NCitpZih0eXBlb2YgcmVwPT09J2Z1bmN0aW9uJyl7dmFsdWU9cmVwLmNhbGwoaG9sZGVyLGtleSx2YWx1ZSk7fQ0KK3N3aXRjaCh0eXBlb2YgdmFsdWUpe2Nhc2Unc3RyaW5nJzpyZXR1cm4gcXVvdGUodmFsdWUpO2Nhc2UnbnVtYmVyJzpyZXR1cm4gaXNGaW5pdGUodmFsdWUpP1N0cmluZyh2YWx1ZSk6J251bGwnO2Nhc2UnYm9vbGVhbic6Y2FzZSdudWxsJzpyZXR1cm4gU3RyaW5nKHZhbHVlKTtjYXNlJ29iamVjdCc6aWYoIXZhbHVlKXtyZXR1cm4nbnVsbCc7fQ0KK2dhcCs9aW5kZW50O3BhcnRpYWw9W107aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseSh2YWx1ZSk9PT0nW29iamVjdCBBcnJheV0nKXtsZW5ndGg9dmFsdWUubGVuZ3RoO2ZvcihpPTA7aTxsZW5ndGg7aSs9MSl7cGFydGlhbFtpXT1zdHIoaSx2YWx1ZSl8fCdudWxsJzt9DQordj1wYXJ0aWFsLmxlbmd0aD09PTA/J1tdJzpnYXA/J1tcbicrZ2FwKw0KK3BhcnRpYWwuam9pbignLFxuJytnYXApKydcbicrDQorbWluZCsnXSc6J1snK3BhcnRpYWwuam9pbignLCcpKyddJztnYXA9bWluZDtyZXR1cm4gdjt9DQoraWYocmVwJiZ0eXBlb2YgcmVwPT09J29iamVjdCcpe2xlbmd0aD1yZXAubGVuZ3RoO2ZvcihpPTA7aTxsZW5ndGg7aSs9MSl7az1yZXBbaV07aWYodHlwZW9mIGs9PT0nc3RyaW5nJyl7dj1zdHIoayx2YWx1ZSk7aWYodil7cGFydGlhbC5wdXNoKHF1b3RlKGspKyhnYXA/JzogJzonOicpK3YpO319fX1lbHNle2ZvcihrIGluIHZhbHVlKXtpZihPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSxrKSl7dj1zdHIoayx2YWx1ZSk7aWYodil7cGFydGlhbC5wdXNoKHF1b3RlKGspKyhnYXA/JzogJzonOicpK3YpO319fX0NCit2PXBhcnRpYWwubGVuZ3RoPT09MD8ne30nOmdhcD8ne1xuJytnYXArcGFydGlhbC5qb2luKCcsXG4nK2dhcCkrJ1xuJysNCittaW5kKyd9JzoneycrcGFydGlhbC5qb2luKCcsJykrJ30nO2dhcD1taW5kO3JldHVybiB2O319DQoraWYodHlwZW9mIEpTT04uc3RyaW5naWZ5IT09J2Z1bmN0aW9uJyl7SlNPTi5zdHJpbmdpZnk9ZnVuY3Rpb24odmFsdWUscmVwbGFjZXIsc3BhY2Upe3ZhciBpO2dhcD0nJztpbmRlbnQ9Jyc7aWYodHlwZW9mIHNwYWNlPT09J251bWJlcicpe2ZvcihpPTA7aTxzcGFjZTtpKz0xKXtpbmRlbnQrPScgJzt9fWVsc2UgaWYodHlwZW9mIHNwYWNlPT09J3N0cmluZycpe2luZGVudD1zcGFjZTt9DQorcmVwPXJlcGxhY2VyO2lmKHJlcGxhY2VyJiZ0eXBlb2YgcmVwbGFjZXIhPT0nZnVuY3Rpb24nJiYodHlwZW9mIHJlcGxhY2VyIT09J29iamVjdCd8fHR5cGVvZiByZXBsYWNlci5sZW5ndGghPT0nbnVtYmVyJykpe3Rocm93IG5ldyBFcnJvcignSlNPTi5zdHJpbmdpZnknKTt9DQorcmV0dXJuIHN0cignJyx7Jyc6dmFsdWV9KTt9O30NCitpZih0eXBlb2YgSlNPTi5wYXJzZSE9PSdmdW5jdGlvbicpe0pTT04ucGFyc2U9ZnVuY3Rpb24odGV4dCxyZXZpdmVyKXt2YXIgajtmdW5jdGlvbiB3YWxrKGhvbGRlcixrZXkpe3ZhciBrLHYsdmFsdWU9aG9sZGVyW2tleV07aWYodmFsdWUmJnR5cGVvZiB2YWx1ZT09PSdvYmplY3QnKXtmb3IoayBpbiB2YWx1ZSl7aWYoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsaykpe3Y9d2Fsayh2YWx1ZSxrKTtpZih2IT09dW5kZWZpbmVkKXt2YWx1ZVtrXT12O31lbHNle2RlbGV0ZSB2YWx1ZVtrXTt9fX19DQorcmV0dXJuIHJldml2ZXIuY2FsbChob2xkZXIsa2V5LHZhbHVlKTt9DQordGV4dD1TdHJpbmcodGV4dCk7Y3gubGFzdEluZGV4PTA7aWYoY3gudGVzdCh0ZXh0KSl7dGV4dD10ZXh0LnJlcGxhY2UoY3gsZnVuY3Rpb24oYSl7cmV0dXJuJ1xcdScrDQorKCcwMDAwJythLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNCk7fSk7fQ0KK2lmKC9eW1xdLDp7fVxzXSokLy50ZXN0KHRleHQucmVwbGFjZSgvXFwoPzpbIlxcXC9iZm5ydF18dVswLTlhLWZBLUZdezR9KS9nLCdAJykucmVwbGFjZSgvIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2csJ10nKS5yZXBsYWNlKC8oPzpefDp8LCkoPzpccypcWykrL2csJycpKSl7aj1ldmFsKCcoJyt0ZXh0KycpJyk7cmV0dXJuIHR5cGVvZiByZXZpdmVyPT09J2Z1bmN0aW9uJz93YWxrKHsnJzpqfSwnJyk6ajt9DQordGhyb3cgbmV3IFN5bnRheEVycm9yKCdKU09OLnBhcnNlJyk7fTt9fSgpKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvcGx1Z2luLmNzcyBiL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL3Jlcy9wbHVnaW4uY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYzVkOTQKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvcGx1Z2luLmNzcwpAQCAtMCwwICsxLDEwIEBACisvKiB5b3VyIGNzcyBkZWZpbml0aW9ucyBoZXJlICovDQorI3VzZXJUcmVlIHsgd2lkdGg6IDIwJSB9DQorI3VzZXJUcmVlIGxpIGEgeyBwYWRkaW5nLWxlZnQ6IDEycHggISBpbXBvcnRhbnR9DQorLmhlYWRlciB1bCB7IGZsb2F0OiByaWdodCB9DQorI3JvbGVEZXRhaWxzIC5hY3Rpb25zIHsgd2lkdGg6IDMycHggfQ0KK2lucHV0LmssIGlucHV0LnYgeyB3aWR0aDogMTAwJSB9DQorI3JvbGVEZXRhaWxzIC5wcm9wZXJ0eS10eXBlIHt3aWR0aDogNWVtfQ0KKy5hY3Rpb25zIHVsIHsgZmxvYXQgOiByaWdodCB9DQorI25ld0RpYWxvZ1JvbGUgc2VsZWN0IHsgd2lkdGggOiAxMDAlIH0NCisucmVxdWlyZWQgeyBmb250LXN0eWxlOml0YWxpYyB9DQpkaWZmIC0tZ2l0IGEvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvcmVzL3BsdWdpbi5odG1sIGIvd2ViY29uc29sZS1wbHVnaW5zL3VzZXJhZG1pbi9zcmMvbWFpbi9yZXNvdXJjZXMvcmVzL3BsdWdpbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNTYzYTYKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvcGx1Z2luLmh0bWwKQEAgLTAsMCArMSwxMjUgQEAKK++7vzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiR7cGx1Z2luUm9vdH0vcmVzL2pzVHJlZS52LjAuOS45YS9qcXVlcnkudHJlZS5taW4uanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJHtwbHVnaW5Sb290fS9yZXMvY3J5cHRvLWpzLTMuMC4yL2NvcmUtbWluLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiR7cGx1Z2luUm9vdH0vcmVzL2NyeXB0by1qcy0zLjAuMi94NjQtY29yZS1taW4uanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJHtwbHVnaW5Sb290fS9yZXMvY3J5cHRvLWpzLTMuMC4yL21kNS1taW4uanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJHtwbHVnaW5Sb290fS9yZXMvY3J5cHRvLWpzLTMuMC4yL3NoYTEtbWluLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiR7cGx1Z2luUm9vdH0vcmVzL2NyeXB0by1qcy0zLjAuMi9zaGEyNTYtbWluLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiR7cGx1Z2luUm9vdH0vcmVzL2NyeXB0by1qcy0zLjAuMi9zaGE1MTItbWluLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiR7cGx1Z2luUm9vdH0vcmVzL2pzb24yLm1pbi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIke3BsdWdpblJvb3R9L3Jlcy9wbHVnaW4uanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorLy8gPCFbQ0RBVEFbCit2YXIgaTE4biA9IHsKKwlhYm9ydCA6ICcke2Fib3J0fScsCisJY2xvc2UgOiAnJHthYm9ydH0nLAorCWFkZCAgIDogJyR7c2F2ZX0nLAorCXJvb3QgIDogJyR7cm9sZS50cmVlLnJvb3R9JywKKwlzdGF0dXM6ICcke3JvbGUuc3RhdGxpbmV9JworfQorLy8gXV0+Cis8L3NjcmlwdD4KKworPCEtLSBzdGF0dXMgbGluZSAtLT4KKzxwIGNsYXNzPSJzdGF0bGluZSI+Jm5ic3A7PC9wPgorCis8IS0tIHRhYmxlIGNhcHRpb24gLS0+Cis8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iJHtwbHVnaW5Sb290fSI+CisJPGRpdiBjbGFzcz0idWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItdG9wIGJ1dHRvbkdyb3VwIj4KKwkJPGJ1dHRvbiBpZD0ibmV3Um9sZSI+JHtyb2xlLm5ld308L2J1dHRvbj4KKwkJPGJ1dHRvbiBpZD0icmVsb2FkIj4ke3JlbG9hZH08L2J1dHRvbj4KKwk8L2Rpdj4KKzwvZm9ybT4KKworPHRhYmxlIGNsYXNzPSJuaWNldGFibGUiPgorCTx0cj4KKwkJPHRkIGlkPSJ1c2VyVHJlZSI+LTwvdGQ+CisJCTx0ZCBpZD0icm9sZURldGFpbHMiPgorCQkJPHRhYmxlIGNsYXNzPSJuaWNldGFibGUgdWktaGVscGVyLWhpZGRlbiI+CisJCQkJPHRoZWFkIGNsYXNzPSJ1aS13aWRnZXQtaGVhZGVyICI+CisJCQkJCTx0cj4KKwkJCQkJCTx0ZCBjbGFzcz0icHJvcGVydHktbmFtZSI+JHtyb2xlLmtleX08L3RkPgorCQkJCQkJPHRkIGNsYXNzPSJwcm9wZXJ0eS12YWx1ZSI+JHtyb2xlLnZhbHVlfTwvdGQ+CisJCQkJCQk8dGQgY2xhc3M9InByb3BlcnR5LXR5cGUiPiR7dHlwZX08L3RkPgorCQkJCQkJPHRkIGNsYXNzPSJhY3Rpb25zIj4ke2J1bmRsZXMuYWN0aW9uc308L3RkPgorCQkJCQk8L3RyPgorCQkJCTwvdGhlYWQ+CisJCQkJPHRmb290IGNsYXNzPSJ1aS13aWRnZXQtaGVhZGVyIj4KKwkJCQkJPHRyPgorCQkJCQkJPHRkIGNvbHNwYW49IjQiPgorCQkJCQkJCTxidXR0b24gaWQ9ImRlbFJvbGUiPiR7ZGVsZXRlfTwvYnV0dG9uPiAKKwkJCQkJCQk8YnV0dG9uIGlkPSJzYXZSb2xlIj4ke3NhdmV9PC9idXR0b24+CisJCQkJCQk8L3RkPgorCQkJCQk8L3RyPgorCQkJCTwvdGZvb3Q+CisJCQkJPHRib2R5PgorCQkJCQk8dHIgY2xhc3M9InVpLXByaW9yaXR5LXByaW1hcnkgaGVhZGVyIGhlYWRlci1wcm9wcyI+CisJCQkJCQk8dGQgY29sc3Bhbj0iNCIgY2xhc3M9IiI+CisJCQkJCQkJJHtyb2xlLnByb3BlcnRpZXN9CisJCQkJCQkJPHVsIGNsYXNzPSJpY29ucyI+CisJCQkJCQkJCTxsaSBjbGFzcz0iZHluaG92ZXIiPgorCQkJCQkJCQkJPHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1wbHVzIj4mbmJzcDs8L3NwYW4+CisJCQkJCQkJCTwvbGk+CisJCQkJCQkJPC91bD4KKwkJCQkJCTwvdGQ+CisJCQkJCTwvdHI+CisJCQkJCTx0ciBjbGFzcz0idWktcHJpb3JpdHktcHJpbWFyeSBoZWFkZXIgaGVhZGVyLWNyZWQiPgorCQkJCQkJPHRkIGNvbHNwYW49IjQiPgorCQkJCQkJCSR7cm9sZS5jcmVkZW50aWFsc30KKwkJCQkJCQk8dWwgY2xhc3M9Imljb25zIj4KKwkJCQkJCQkJPGxpIGNsYXNzPSJkeW5ob3ZlciI+CisJCQkJCQkJCQk8c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLXBsdXMiPiZuYnNwOzwvc3Bhbj4KKwkJCQkJCQkJPC9saT4KKwkJCQkJCQk8L3VsPgorCQkJCQkJPC90ZD4KKwkJCQkJPC90cj4KKwkJCQkJPHRyPgorCQkJCQkJPHRkPjxpbnB1dCBjbGFzcz0iayIgLz48L3RkPgorCQkJCQkJPHRkPjxpbnB1dCBjbGFzcz0idiIgLz48L3RkPgorCQkJCQkJPHRkPgorCQkJCQkJCTxzZWxlY3QgY2xhc3M9ImR5bmhvdmVyIj4KKwkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0ic3RyaW5nIj4ke3R5cGUuc3RyaW5nfTwvb3B0aW9uPgorCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJieXRlW10iPiR7dHlwZS5ieXRlc308L29wdGlvbj4KKwkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0icGFzc3dvcmQtTUQ1Ij4ke3R5cGUucGFzc3dvcmQtTUQ1fTwvb3B0aW9uPgorCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJwYXNzd29yZC1TSEExIj4ke3R5cGUucGFzc3dvcmQtU0hBMX08L29wdGlvbj4KKwkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0icGFzc3dvcmQtU0hBMjU2Ij4ke3R5cGUucGFzc3dvcmQtU0hBMjU2fTwvb3B0aW9uPgorCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSJwYXNzd29yZC1TSEE1MTIiPiR7dHlwZS5wYXNzd29yZC1TSEE1MTJ9PC9vcHRpb24+CisJCQkJCQkJPC9zZWxlY3Q+CisJCQkJCQk8L3RkPgorCQkJCQkJPHRkIGNsYXNzPSJhY3Rpb25zIj4KKwkJCQkJCQk8dWwgY2xhc3M9Imljb25zIj4KKwkJCQkJCQkJPGxpIGNsYXNzPSJkeW5ob3ZlciI+CisJCQkJCQkJCQk8c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLXRyYXNoIj4mbmJzcDs8L3NwYW4+CisJCQkJCQkJCTwvbGk+CisJCQkJCQkJPC91bD4KKwkJCQkJCTwvdGQ+CisJCQkJCTwvdHI+CisJCQkJPC90Ym9keT4KKwkJCTwvdGFibGU+CisJCQk8ZGl2IGlkPSJyb2xlRGV0YWlsc0hlbHAiPiR7cm9sZS5oZWxwLmluaXRpYWx9PC9kaXY+CisJCTwvdGQ+CisJPC90cj4KKzwvdGFibGU+CisKKzxkaXYgY2xhc3M9InVpLWhlbHBlci1oaWRkZW4xIiB0aXRsZT0iJHtyb2xlLm5ldy50aXRsZX0iIGlkPSJuZXdEaWFsb2dSb2xlIj4KKwk8dGFibGUgY2xhc3M9Im5pY2V0YWJsZSI+CisJCTx0cj4KKwkJCTx0ZCBjbGFzcz0ibGFiZWwiPgorCQkJCSR7cm9sZS5uYW1lfQorCQkJPC90ZD4KKwkJCTx0ZD4KKwkJCQk8aW5wdXQvPgorCQkJPC90ZD4KKwkJPC90cj4KKwkJPHRyPgorCQkJPHRkIGNsYXNzPSJsYWJlbCI+CisJCQkJJHt0eXBlfQorCQkJPC90ZD4KKwkJCTx0ZD4KKwkJCQk8c2VsZWN0IGNsYXNzPSJkeW5ob3ZlciI+CisJCQkJCTxvcHRpb24gdmFsdWU9IjEiPiR7cm9sZS50eXBlLjF9PC9vcHRpb24+CisJCQkJCTxvcHRpb24gdmFsdWU9IjIiPiR7cm9sZS50eXBlLjJ9PC9vcHRpb24+CisJCQkJPC9zZWxlY3Q+CisJCQk8L3RkPgorCQk8L3RyPgorCTwvdGFibGU+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3dlYmNvbnNvbGUtcGx1Z2lucy91c2VyYWRtaW4vc3JjL21haW4vcmVzb3VyY2VzL3Jlcy9wbHVnaW4uanMgYi93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvcGx1Z2luLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NzQ0ODIKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJjb25zb2xlLXBsdWdpbnMvdXNlcmFkbWluL3NyYy9tYWluL3Jlc291cmNlcy9yZXMvcGx1Z2luLmpzCkBAIC0wLDAgKzEsMzcyIEBACisvKiB5b3VyIGphdmEgc2NyaXB0IGNvZGUgaGVyZSAqLw0KKw0KK3ZhciB1c2VyVHJlZSA9IGZhbHNlOw0KK3ZhciBzZWxlY3RlZFJvbGUgPSBmYWxzZTsNCit2YXIgbmV3RGlhbG9nUm9sZSA9IGZhbHNlOw0KK3ZhciByb2xlRGV0YWlscyA9IGZhbHNlOw0KK3ZhciByb2xlRGV0YWlsc0hlbHAgPSBmYWxzZTsNCit2YXIgcm9sZURldGFpbHNUYWJsZSA9IGZhbHNlOw0KK3ZhciByb2xlRGV0YWlsc0JvZHkgPSBmYWxzZTsNCit2YXIgcm9sZURldGFpbHNUZW1wbGF0ZSA9IGZhbHNlOw0KK3ZhciByb2xlRGV0YWlsc1RlbXBsYXRlUCA9IGZhbHNlOw0KK3ZhciByb2xlRGV0YWlsc1RlbXBsYXRlQyA9IGZhbHNlOw0KKw0KK2Z1bmN0aW9uIHJvbGVPYmoobm9kZSkgew0KKwlub2RlID0gbm9kZSAmJiBub2RlLmF0dHIgPyBub2RlLmF0dHIoJ3JvbGUnKSA6IGZhbHNlOw0KKwlyZXR1cm4gbm9kZSA/IEpTT04ucGFyc2Uobm9kZSkgOiBmYWxzZTsNCit9DQorDQordmFyIHRyZWVTZXR0aW5ncyA9IHsNCisJZGF0YSA6IHsNCisJCXR5cGUgOiAnanNvbicsDQorCQlvcHRzIDogeyAnc3RhdGljJyA6IFtdIH0NCisJfSwNCisJdWkgICAgICAgOiB7IHRoZW1lX25hbWUgOiAndGhlbWVyb2xsZXInIH0sDQorCXJ1bGVzICAgIDogeyBtdWx0aXBsZSA6IGZhbHNlLCB2YWxpZF9jaGlsZHJlbjogWydyb290J10gfSwNCisJdHlwZXMgICAgOiB7DQorCQlyb290IDogeyB2YWxpZF9jaGlsZHJlbjogWyd0MCcsICd0MScsICd0MiddIH0sDQorCQl0MiAgIDogeyB2YWxpZF9jaGlsZHJlbjogWyd0MCcsICd0MScsICd0MiddIH0sDQorCQl0MSAgIDogeyB2YWxpZF9jaGlsZHJlbjogJ25vbmUnIH0sDQorCQl0MCAgIDogeyB2YWxpZF9jaGlsZHJlbjogJ25vbmUnIH0NCisJfSwNCisJY2FsbGJhY2sgOiB7DQorCQlvbnNlbGVjdCA6IGZ1bmN0aW9uKG5vZGUpIHsNCisJCQl2YXIgX3JvbGUgPSAkKG5vZGUpLmF0dHIoJ3JvbGUnKTsNCisJCQlpZiAoX3JvbGUpIHsNCisJCQkJdmFyIHJvbGUgPSBKU09OLnBhcnNlKCBfcm9sZSApOw0KKwkJCQlvblNlbGVjdE5vZGUocm9sZS5uYW1lKTsNCisJCQkJJChub2RlKS5jaGlsZHJlbignYScpLmFkZENsYXNzKCd1aS1wcmlvcml0eS1wcmltYXJ5Jyk7DQorCQkJfSBlbHNlIHsNCisJCQkJcm9sZURldGFpbHNIZWxwLnJlbW92ZUNsYXNzKCd1aS1oZWxwZXItaGlkZGVuJyk7DQorCQkJCXJvbGVEZXRhaWxzVGFibGUuYWRkQ2xhc3MoJ3VpLWhlbHBlci1oaWRkZW4nKTsNCisJCQl9DQorCQl9LA0KKwkJb25wYXJzZSA6IGZ1bmN0aW9uIChzLCB0KSB7DQorCQkJcmV0dXJuICQocykNCisJCQkJCS5maW5kKCdsaVtyZWw9dDJdID4gYSA+IGlucycpLmFkZENsYXNzKCd1aS1pY29uIHVpLWljb24tY29udGFjdCcpLmVuZCgpDQorCQkJCQkuZmluZCgnbGlbcmVsPXQxXSA+IGEgPiBpbnMnKS5hZGRDbGFzcygndWktaWNvbiB1aS1pY29uLXBlcnNvbicpLmVuZCgpDQorCQkJCQkuZmluZCgnbGlbcmVsPXQwXSA+IGEgPiBpbnMnKS5hZGRDbGFzcygndWktaWNvbiB1aS1pY29uLWJ1bGxldCcpLmVuZCgpOw0KKwkJfSwNCisJCW9uZGVzZWxlY3QgOiBmdW5jdGlvbihub2RlKSB7ICQobm9kZSkuY2hpbGRyZW4oJ2EnKS5yZW1vdmVDbGFzcygndWktcHJpb3JpdHktcHJpbWFyeScpIH0sDQorCQlvbmRibGNsayAgIDogZnVuY3Rpb24obm9kZSwgdHJlZV9vYmopIHsNCisJCQl2YXIgbiA9ICQobm9kZSk7DQorCQkJdmFyIHBwID0gdHJlZV9vYmoucGFyZW50KG5vZGUpOw0KKwkJCXZhciByID0gcm9sZU9iaihuKTsNCisJCQl2YXIgZyA9IHJvbGVPYmoocHApOw0KKwkJCWNvbnNvbGUubG9nKHIsIGcpOw0KKwkJCWlmIChyICYmIGcpIHsNCisJCQkJaWYoIGlzSW5NZW1iZXJBcnJheShyLCBnLm1lbWJlcnMsIDEpICkgew0KKwkJCQkJJC5wb3N0KHBsdWdpblJvb3QsIHsgYWN0aW9uOiAncmVtb3ZlTWVtYmVyJywgcm9sZTogci5uYW1lLCBncm91cDogZy5uYW1lIH0pOw0KKwkJCQkJJC5wb3N0KHBsdWdpblJvb3QsIHsgYWN0aW9uOiAnYWRkUmVxdWlyZWRNZW1iZXInLCByb2xlOiByLm5hbWUsIGdyb3VwOiBnLm5hbWUgfSwgZnVuY3Rpb24oZGF0YSkgew0KKwkJCQkJCXBwLmF0dHIoJ3JvbGUnLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7DQorCQkJCQl9LCAnanNvbicpOw0KKwkJCQkJbi5hZGRDbGFzcygncmVxdWlyZWQnKTsNCisJCQkJfSBlbHNlIGlmKCBpc0luTWVtYmVyQXJyYXkociwgZy5ybWVtYmVycywgMSkgKSB7DQorCQkJCQkkLnBvc3QocGx1Z2luUm9vdCwgeyBhY3Rpb246ICdyZW1vdmVNZW1iZXInLCByb2xlOiByLm5hbWUsIGdyb3VwOiBnLm5hbWUgfSk7DQorCQkJCQkkLnBvc3QocGx1Z2luUm9vdCwgeyBhY3Rpb246ICdhZGRNZW1iZXInLCByb2xlOiByLm5hbWUsIGdyb3VwOiBnLm5hbWUgfSwgZnVuY3Rpb24oZGF0YSkgew0KKwkJCQkJCXBwLmF0dHIoJ3JvbGUnLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7DQorCQkJCQl9LCAnanNvbicpOw0KKwkJCQkJbi5yZW1vdmVDbGFzcygncmVxdWlyZWQnKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0sDQorCQliZWZvcmVtb3ZlIDogZnVuY3Rpb24obm9kZSwgcmVmX25vZGUsIHR5cGUsIHRyZWVfb2JqLCBpc19jb3B5KSB7DQorCQkJdmFyIF8gPSBkcmFnT2JqKG5vZGUsIHJlZl9ub2RlLCB0eXBlLCB0cmVlX29iaik7DQorCQkJLy8gLS0tIGNoZWNrIGlmIHRoZSBtb3ZlIGlzIHZhbGlkOg0KKwkJCS8vIGRvbid0IG1vdmUgdGhpbmdzIGFyb3VuZCB0aGUgc2FtZS9yb290IGxldmVsDQorCQkJaWYgKF8udG8gPT0gZmFsc2UgJiYgXy5mcm9tID09IGZhbHNlKSByZXR1cm4gZmFsc2U7DQorCQkJLy8gbm8gY29weSB0byB0aGUgcm9vdCBmb2xkZXINCisJCQlpZiAoaXNfY29weSAmJiBfLnRvID09IGZhbHNlKSByZXR1cm4gZmFsc2U7DQorCQkJLy8gbm8gcmVhcnJhbmdlIHdpdGhpbmcgdGhlIGZvbGRlcg0KKwkJCWlmIChfLnRvICE9IGZhbHNlICYmIF8uZnJvbSAhPSBmYWxzZSAmJiBfLnRvLm5hbWUgPT0gXy5mcm9tLm5hbWUpIHJldHVybiBmYWxzZTsNCisJCQkvLyBhbHJlYWR5IGNvbnRhaW5zIHN1Y2ggYSBtZW1iZXINCisJCQlpZiAoXy50byAhPSBmYWxzZSAmJiBpc01lbWJlcihfLm5vZGUsIF8udG8pKSByZXR1cm4gZmFsc2U7DQorDQorCQkJLy8gZG8gY29weS1tb3ZlDQorCQkJLy8gdW5hc3NpZ24gZnJvbSB0aGUgb2xkIGdyb3VwLCBpZiBpdCBpcyBtb3ZlDQorCQkJaWYgKCFpc19jb3B5ICYmIF8uZnJvbSkgJC5wb3N0KHBsdWdpblJvb3QsIHsnYWN0aW9uJzogJ3JlbW92ZU1lbWJlcicsICdyb2xlJyA6IF8ubm9kZS5uYW1lLCAnZ3JvdXAnIDogXy5mcm9tLm5hbWV9ICwgZnVuY3Rpb24oZGF0YSkge30sICdqc29uJyk7DQorCQkJLy8gYXNzaWduIHRvIHRoZSBuZXcgZ3JvdXANCisJCQlpZiAoXy50bykgJC5wb3N0KHBsdWdpblJvb3QsIHsnYWN0aW9uJzogJ2FkZE1lbWJlcicsICdyb2xlJyA6IF8ubm9kZS5uYW1lLCAnZ3JvdXAnIDogXy50by5uYW1lfSAsIGZ1bmN0aW9uKGRhdGEpIHt9LCAnanNvbicpOw0KKw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKyQoZnVuY3Rpb24oKSB7DQorCXVzZXJUcmVlID0gJCgnI3VzZXJUcmVlJyk7DQorCXJvbGVEZXRhaWxzID0gJCgnI3JvbGVEZXRhaWxzJyk7DQorCXJvbGVEZXRhaWxzVGFibGUgPSByb2xlRGV0YWlscy5maW5kKCd0YWJsZScpOw0KKwlyb2xlRGV0YWlsc0hlbHAgPSByb2xlRGV0YWlscy5maW5kKCcjcm9sZURldGFpbHNIZWxwJyk7DQorCXJvbGVEZXRhaWxzQm9keSA9IHJvbGVEZXRhaWxzVGFibGUuZmluZCgndGJvZHknKTsNCisJcm9sZURldGFpbHNUZW1wbGF0ZVAgPSByb2xlRGV0YWlsc0JvZHkuZmluZCgndHI6ZXEoMCknKTsNCisJcm9sZURldGFpbHNUZW1wbGF0ZUMgPSByb2xlRGV0YWlsc0JvZHkuZmluZCgndHI6ZXEoMSknKTsNCisJcm9sZURldGFpbHNUZW1wbGF0ZSA9IHJvbGVEZXRhaWxzQm9keS5maW5kKCd0cjplcSgyKScpLmNsb25lKCk7DQorCXJvbGVEZXRhaWxzQm9keS5maW5kKCd0cicpLm5vdCgnLmhlYWRlcicpLnJlbW92ZSgpOw0KKw0KKwkvLyBhZGQgbmV3IHByb3BlcnR5L2NyZWRlbnRpYWwgY29kZQ0KKwkkKCd0ci5oZWFkZXIgc3Bhbi51aS1pY29uLXBsdXMnKS5jbGljayhmdW5jdGlvbigpIHsNCisJCSQodGhpcykucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkuYWZ0ZXIobmV3UHJvcCgpKTsNCisJfSk7DQorDQorCS8vIG5ldyByb2xlIGRpYWxvZw0KKwl2YXIgX2J1dHRvbnMgPSB7fTsNCisJX2J1dHRvbnNbaTE4bi5jbG9zZV0gPSBmdW5jdGlvbigpIHsNCisJCSQodGhpcykuZGlhbG9nKCdjbG9zZScpOw0KKwl9DQorCV9idXR0b25zW2kxOG4uYWRkXSA9IGZ1bmN0aW9uKCkgew0KKwkJdmFyIF8gPSBuZXdEaWFsb2dSb2xlOw0KKwkJdmFyIG4gPSBfLmZpbmQoJ2lucHV0Jyk7DQorCQlpZiAoIW4udmFsKCkpIHsNCisJCQluLmFkZENsYXNzKCd1aS1zdGF0ZS1lcnJvcicpOw0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0gZWxzZSBuLnJlbW92ZUNsYXNzKCd1aS1zdGF0ZS1lcnJvcicpOw0KKwkJdmFyIHQgPSBfLmZpbmQoJ3NlbGVjdCcpLnZhbCgpOw0KKwkJJC5wb3N0KHBsdWdpblJvb3QsIHsnYWN0aW9uJzogJ3NldCcsICdkYXRhJyA6IEpTT04uc3RyaW5naWZ5KHsnbmFtZSc6IG4udmFsKCksICd0eXBlJzogbmV3IE51bWJlcih0KX0pfSAsIGZ1bmN0aW9uKGRhdGEpIHsNCisJCQlfLmRpYWxvZygnY2xvc2UnKTsNCisJCQkkKCcjcmVsb2FkJykuY2xpY2soKTsNCisJCX0sICdqc29uJyk7DQorCX0NCisJbmV3RGlhbG9nUm9sZSA9ICQoIiNuZXdEaWFsb2dSb2xlIikuZGlhbG9nKHsNCisJCWF1dG9PcGVuIDogZmFsc2UsDQorCQltb2RhbCAgICA6IHRydWUsDQorCQlvcGVuICAgICA6IGZ1bmN0aW9uKCkgeyAkKHRoaXMpLmZpbmQoJ2lucHV0JykudmFsKCcnKS5yZW1vdmVDbGFzcygndWktc3RhdGUtZXJyb3InKSB9LA0KKwkJY2xvc2VUZXh0OiBpMThuLmFib3J0LA0KKwkJYnV0dG9ucyAgOiBfYnV0dG9ucw0KKwl9KTsNCisNCisJLy8gcm9sZSBpbmZvIGJ1dHRvbnMNCisJJCgnI2RlbFJvbGUnKS5jbGljayggZnVuY3Rpb24oKSB7DQorCQlpZiAoc2VsZWN0ZWRSb2xlKSAkLnBvc3QocGx1Z2luUm9vdCwgeydhY3Rpb24nOiAnZGVsJywgJ3JvbGUnIDogc2VsZWN0ZWRSb2xlfSwgZnVuY3Rpb24oKSB7DQorCQkJJCgnI3JlbG9hZCcpLmNsaWNrKCk7DQorCQl9KTsNCisJfSk7DQorCSQoJyNzYXZSb2xlJykuY2xpY2soIGRvU2F2ZVJvbGUgKTsNCisNCisJLy8gdG9wLWZyYW1lIGJ1dHRvbnMNCisJJCgnI25ld1JvbGUnKS5jbGljayggZnVuY3Rpb24oKSB7DQorCQluZXdEaWFsb2dSb2xlLmRpYWxvZygnb3BlbicpOw0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9KTsNCisJJCgnI3JlbG9hZCcpLmNsaWNrKCBmdW5jdGlvbigpIHsNCisJCSQucG9zdChwbHVnaW5Sb290LCB7J2FjdGlvbic6ICdsaXN0J30gLCBmdW5jdGlvbihkYXRhKSB7DQorCQkJcm9sZURldGFpbHNIZWxwLnJlbW92ZUNsYXNzKCd1aS1oZWxwZXItaGlkZGVuJyk7DQorCQkJcm9sZURldGFpbHNUYWJsZS5hZGRDbGFzcygndWktaGVscGVyLWhpZGRlbicpOw0KKw0KKwkJCXZhciBzb3J0ZWRHcm91cHMgPSBzb3J0R3JvdXBzKGRhdGEpOw0KKwkJCXZhciB0cmVlUm9vdCA9IGJ1aWxkVHJlZShzb3J0ZWRHcm91cHMpOw0KKw0KKwkJCXRyZWVTZXR0aW5ncy5kYXRhLm9wdHNbJ3N0YXRpYyddID0gdHJlZVJvb3Q7DQorCQkJdXNlclRyZWUuZW1wdHkoKS50cmVlKHRyZWVTZXR0aW5ncyk7DQorCQl9LCAnanNvbicpOw0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9KS5jbGljaygpOw0KK30pOw0KKw0KK2Z1bmN0aW9uIG5ld1Byb3AoKSB7DQorCXZhciB0ciA9IHJvbGVEZXRhaWxzVGVtcGxhdGUuY2xvbmUoKQ0KKwkJLmZpbmQoJ2xpJykuY2xpY2soIGZ1bmN0aW9uKCkgew0KKwkJCXRyLnJlbW92ZSgpOw0KKwkJfSkuZW5kKCkNCisJCS5maW5kKCdzZWxlY3QnKS5jaGFuZ2UoIGZ1bmN0aW9uKGV2dCkgew0KKwkJCXRyLmZpbmQoJy52JykucmVwbGFjZVdpdGgoJzxpbnB1dCBjbGFzcz0idiIgJysgKCQodGhpcykudmFsKCkuaW5kZXhPZigncGFzc3dvcmQnKSA9PSAwID8gJ3R5cGU9InBhc3N3b3JkIicgOiAnJykgKyAnLz4nKTsNCisJCQlpbml0U3RhdGljV2lkZ2V0cyh0cik7DQorCQl9KS5lbmQoKQ0KKwlpbml0U3RhdGljV2lkZ2V0cyh0cik7DQorCXJldHVybiB0cjsNCit9DQorZnVuY3Rpb24gaGFzaFRvQXJyYXkocykgew0KKyAgICB2YXIgciA9IFtdOw0KKyAgICB3aGlsZShzLmxlbmd0aCA+IDApIHsNCisgICAgICAgIHIucHVzaChwYXJzZUludChzLnN1YnN0cmluZygwLCAyKSwgMTYpKTsNCisgICAgICAgIHMgPSBzLnN1YnN0cmluZygyKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcjsNCit9DQorZnVuY3Rpb24gc3RyVG9BcnJheShzKSB7DQorICAgIHZhciByID0gW107DQorICAgIHZhciBlbCA9IHMuc3BsaXQoJywnKTsNCisgICAgZm9yKHZhciBpPTA7aTxlbC5sZW5ndGg7aSsrKSByLnB1c2goIHBhcnNlSW50KGVsW2ldLCAxMCkgKTsNCisgICAgcmV0dXJuIHI7DQorfQ0KK2Z1bmN0aW9uIGRvU2F2ZVJvbGUoKSB7DQorCWlmICghc2VsZWN0ZWRSb2xlKSByZXR1cm47DQorCXZhciBkb1Byb3BzID0gdHJ1ZTsNCisJdmFyIGRhdGEgPSB7DQorCQluYW1lIDogc2VsZWN0ZWRSb2xlLA0KKwkJcHJvcGVydGllcyA6IHt9LA0KKwkJY3JlZGVudGlhbHMgOiB7fQ0KKwl9Ow0KKwlyb2xlRGV0YWlsc0JvZHkuZmluZCgndHInKS5lYWNoKCBmdW5jdGlvbigpIHsNCisJCXZhciBfID0gJCh0aGlzKTsNCisJCWlmIChfLmhhc0NsYXNzKCdoZWFkZXItcHJvcHMnKSkgZG9Qcm9wcyA9IHRydWU7DQorCQllbHNlIGlmIChfLmhhc0NsYXNzKCdoZWFkZXItY3JlZCcpKSBkb1Byb3BzID0gZmFsc2U7DQorCQllbHNlIHsNCisJCQl2YXIgayA9IF8uZmluZCgnLmsnKS52YWwoKTsNCisJCQl2YXIgdiA9IF8uZmluZCgnLnYnKS52YWwoKTsNCisJCQl2YXIgdCA9IF8uZmluZCgnc2VsZWN0JykudmFsKCk7DQorCQkJDQorCQkJaWYgKHQuaW5kZXhPZigncGFzc3dvcmQtJykgPT0gMCkgew0KKwkJCQl2YXIgaGFzaCA9ICBDcnlwdG9KU1t0LnN1YnN0cmluZyg5KV0odikudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLkhleCk7DQorCQkJCXYgPSBoYXNoVG9BcnJheShoYXNoKTsNCisJCQl9IGVsc2UgaWYgKHQgPT0gJ2J5dGVbXScpIHsNCisJCQkJdiA9IHN0clRvQXJyYXkodik7DQorCQkJfQ0KKwkJCQ0KKwkJCWlmIChkb1Byb3BzKSBkYXRhLnByb3BlcnRpZXNba10gPSB2Ow0KKwkJCWVsc2UgZGF0YS5jcmVkZW50aWFsc1trXSA9IHY7DQorCQl9DQorCX0pOw0KKwkkLnBvc3QocGx1Z2luUm9vdCwgeydhY3Rpb24nOiAnc2V0JywgJ2RhdGEnIDogSlNPTi5zdHJpbmdpZnkoZGF0YSl9KTsNCit9DQorDQorZnVuY3Rpb24gaXNJbk1lbWJlckFycmF5KHJvbGUsIGcpIHsNCisJaWYoZykgZm9yKHZhciBpIGluIGcpIGlmIChnW2ldLm5hbWUgPT0gcm9sZS5uYW1lKSByZXR1cm4gdHJ1ZTsNCisJcmV0dXJuIGZhbHNlOw0KK30NCisNCitmdW5jdGlvbiBpc01lbWJlcihyb2xlLCBncm91cCkgew0KKwlpZiAoIXJvbGUpIHJldHVybiBmYWxzZTsNCisJaWYgKCFncm91cCkgcmV0dXJuIGZhbHNlOw0KKwlpZiAoaXNJbk1lbWJlckFycmF5KHJvbGUsIGdyb3VwLm1lbWJlcnMpKSByZXR1cm4gdHJ1ZTsNCisJaWYgKGlzSW5NZW1iZXJBcnJheShyb2xlLCBncm91cC5ybWVtYmVycykpIHJldHVybiB0cnVlOw0KK30NCisNCitmdW5jdGlvbiBidWlsZFRyZWUoc29ydGVkR3JvdXBzKSB7DQorCXZhciB0cmVlUm9vdCA9IHsNCisJCWRhdGEgOiBpMThuLnJvb3QsDQorCQlzdGF0ZTogJ29wZW4nLA0KKwkJYXR0cmlidXRlcyA6IHsgJ3JlbCcgOiAncm9vdCcgfSwNCisJCWNoaWxkcmVuOiBbXQ0KKwl9Ow0KKwl2YXIgdHJlZU5vZGUgPSBmdW5jdGlvbihuYW1lLCByb2xlLCBwYXJlbnQsIHJlcSkgew0KKwkJaWYgKCFyb2xlKSByZXR1cm47DQorCQlpZiAoIXBhcmVudCkgcGFyZW50ID0gdHJlZVJvb3QuY2hpbGRyZW47DQorCQl2YXIgbm9kZSA9IHsNCisJCQlkYXRhICA6IHJvbGUubmFtZSwNCisJCQlhdHRyaWJ1dGVzIDogew0KKwkJCQkncmVsJyAgIDogJ3QnICsgcm9sZS50eXBlLA0KKwkJCQkncm9sZScgIDogSlNPTi5zdHJpbmdpZnkocm9sZSkNCisJCQl9DQorCQl9DQorCQlpZiAocmVxKSBub2RlLmF0dHJpYnV0ZXNbJ2NsYXNzJ10gPSAncmVxdWlyZWQnOw0KKwkJcGFyZW50LnB1c2gobm9kZSk7DQorCQlpZiAocm9sZS50eXBlID09IDIpIHsNCisJCQlub2RlWydjaGlsZHJlbiddID0gW107DQorCQkJbm9kZSA9IG5vZGVbJ2NoaWxkcmVuJ107DQorCQkJaWYgKHJvbGUubWVtYmVycykgJC5lYWNoKHJvbGUubWVtYmVycywgZnVuY3Rpb24oaWR4LCByb2xlKSB7DQorCQkJCXRyZWVOb2RlKHJvbGUubmFtZSwgcm9sZSwgbm9kZSwgMCk7DQorCQkJfSk7DQorCQkJaWYgKHJvbGUucm1lbWJlcnMpICQuZWFjaChyb2xlLnJtZW1iZXJzLCBmdW5jdGlvbihpZHgsIHJvbGUpIHsNCisJCQkJdHJlZU5vZGUocm9sZS5uYW1lLCByb2xlLCBub2RlLCAxKTsNCisJCQl9KTsNCisJCX0NCisJfQ0KKw0KKwkkLmVhY2goc29ydGVkR3JvdXBzLCB0cmVlTm9kZSk7DQorCXJldHVybiB0cmVlUm9vdDsNCit9DQorDQorZnVuY3Rpb24gc29ydEdyb3VwcyhkYXRhKSB7DQorCXZhciByb290R3JvdXBzID0ge307IC8vIG9ubHkgcm9vdCBncm91cHMgLSB3aXRob3V0IHBhcmVudHMNCisJdmFyIHVuYXNzaWduZWQgPSB7fTsgLy8gbm9uLWdyb3Vwcywgbm90IGFzc2lnbmVkIHRvIGFueSBncm91cA0KKwl2YXIgcHJvY2Vzc2VkID0ge307IC8vIGFsbCBwcm9jZXNzZWQgZW50cmllcw0KKwl2YXIgdSA9IDA7DQorCXZhciBnID0gMDsNCisJdmFyIHIgPSAwOw0KKw0KKwl2YXIgX3N0ID0gZnVuY3Rpb24obWFwLCBuLCByb2xlKSB7DQorCQlpZiAodHlwZW9mIG1hcFtuXSA9PSAndW5kZWZpbmVkJykgeyAvLyBub3QgYWRkZWQgLSBhZGQNCisJCQltYXBbbl0gPSByb2xlOw0KKwkJfSBlbHNlIGlmIChtYXBbbl0gIT0gZmFsc2UpIHsgLy8gYWxyZWFkeSBhZGRlZA0KKwkJCW1hcFtuXSA9IGZhbHNlOyAvLyBtYXJrIGZvciByZW1vdmFsDQorCQl9DQorCX0NCisNCisJdmFyIGdyb3VwRiA9IGZ1bmN0aW9uKGkxLCByb2xlKSB7DQorCQl2YXIgbiA9IHJvbGUubmFtZTsNCisJCXZhciB0ID0gcm9sZS50eXBlOw0KKw0KKwkJaWYgKHQgPT0gMikgeyAvLyBncm91cA0KKwkJCS8vIGRvbid0IHByb2Nlc3MgdHdpY2UNCisJCQlpZiAocHJvY2Vzc2VkW25dKSB7DQorCQkJCXJvb3RHcm91cHNbbl0gPSBmYWxzZTsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCXByb2Nlc3NlZFtuXT1yb2xlOw0KKw0KKwkJCV9zdChyb290R3JvdXBzLCBuLCByb2xlKTsNCisNCisJCQlpZiAocm9sZS5tZW1iZXJzKSAkLmVhY2gocm9sZS5tZW1iZXJzLCBncm91cEYpOw0KKwkJCWlmIChyb2xlLnJtZW1iZXJzKSAkLmVhY2gocm9sZS5ybWVtYmVycywgZ3JvdXBGKTsNCisJCQlnKys7DQorCQl9IGVsc2UgeyAvLyByb2xlIG9yIHVzZXINCisJCQlpZiAodCA9PSAxKSB1Kys7IGVsc2UgcisrOw0KKwkJCV9zdCh1bmFzc2lnbmVkLCBuLCByb2xlKTsNCisJCX0NCisJfQ0KKw0KKwkkLmVhY2goZGF0YSwgZ3JvdXBGKTsNCisJJCgnLnN0YXRsaW5lJykudGV4dCggaTE4bi5zdGF0dXMubXNnRm9ybWF0KGcsdSxyKSApOw0KKw0KKwlyZXR1cm4gJC5leHRlbmQocm9vdEdyb3VwcywgdW5hc3NpZ25lZCk7DQorfQ0KKw0KK2Z1bmN0aW9uIG9uU2VsZWN0Tm9kZShyb2xlKSB7DQorCSQucG9zdChwbHVnaW5Sb290LCB7J2FjdGlvbic6ICdnZXQnLCAncm9sZScgOiByb2xlfSAsIGZ1bmN0aW9uKGRhdGEpIHsNCisJCXNlbGVjdGVkUm9sZSA9IHJvbGU7DQorCQlyb2xlRGV0YWlsc0hlbHAuYWRkQ2xhc3MoJ3VpLWhlbHBlci1oaWRkZW4nKTsNCisJCXJvbGVEZXRhaWxzVGFibGUucmVtb3ZlQ2xhc3MoJ3VpLWhlbHBlci1oaWRkZW4nKTsNCisJCXJvbGVEZXRhaWxzQm9keS5maW5kKCd0cicpLm5vdCgnLmhlYWRlcicpLnJlbW92ZSgpOw0KKw0KKwkJdmFyIHRhcmdldCA9IGZhbHNlOw0KKwkJdmFyIF9hcHBlbmQgPSBmdW5jdGlvbihrLHYpIHsNCisJCQl2YXIgdCA9ICQuaXNBcnJheSh2KSA/ICdieXRlW10nIDogJ3N0cmluZyc7DQorCQkJdGFyZ2V0LmFmdGVyKG5ld1Byb3AoKQ0KKwkJCQkuZGF0YSgnaycsIGspDQorCQkJCS5maW5kKCdpbnB1dC5rJykudmFsKGspLmVuZCgpDQorCQkJCS5maW5kKCdpbnB1dC52JykudmFsKHYpLmVuZCgpDQorCQkJCS5maW5kKCdzZWxlY3QnKS52YWwodCkuZW5kKCkNCisJCQkpOw0KKwkJfQ0KKwkJdmFyIHggPSBkYXRhLnByb3BlcnRpZXM7DQorCQlpZiAoeCkgew0KKwkJCXRhcmdldCA9IHJvbGVEZXRhaWxzVGVtcGxhdGVQOw0KKwkJCSQuZWFjaCh4LCBfYXBwZW5kKTsNCisJCX0NCisJCXggPSBkYXRhLmNyZWRlbnRpYWxzOw0KKwkJaWYgKHgpIHsNCisJCQl0YXJnZXQgPSByb2xlRGV0YWlsc1RlbXBsYXRlQzsNCisJCQkkLmVhY2goeCwgX2FwcGVuZCk7DQorCQl9DQorCQkvLyBzaG93L3VzZXIgY3JlZGVudGlhbHMgdmlldyBpZiB1c2VyL29yIG5vdCAocmVzcGVjdGl2ZWx5KQ0KKwkJeCA9IHJvbGVEZXRhaWxzQm9keS5maW5kKCcuaGVhZGVyLWNyZWQnKTsNCisJCWlmIChkYXRhLnR5cGUgIT0gMSkgeC5hZGRDbGFzcygndWktaGVscGVyLWhpZGRlbicpOw0KKwkJZWxzZSB4LnJlbW92ZUNsYXNzKCd1aS1oZWxwZXItaGlkZGVuJyk7DQorCX0sICdqc29uJykNCisJcmV0dXJuIGZhbHNlOw0KK30NCisNCitmdW5jdGlvbiBkcmFnT2JqKG5vZGUsIHJlZl9ub2RlLCB0eXBlLCB0cmVlX29iaikgew0KKyAgICAvLyBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlcg0KKwl2YXIgX3JvbGUgPSBmYWxzZTsNCisJaWYgKCdpbnNpZGUnID09IHR5cGUpIHsNCisJCV9yb2xlID0gJChyZWZfbm9kZSkuYXR0cigncm9sZScpOw0KKwl9IGVsc2Ugew0KKwkJX3JvbGUgPSB0cmVlX29iai5wYXJlbnQocmVmX25vZGUpDQorCQlfcm9sZSA9IF9yb2xlLmF0dHIgPyBfcm9sZS5hdHRyKCdyb2xlJykgOiBmYWxzZTsNCisJfQ0KKwl2YXIgdG8gPSBfcm9sZSA/IEpTT04ucGFyc2UoX3JvbGUpIDogZmFsc2U7DQorCS8vIGRldGVybWluZSBvYmplY3QgdG8gbW92ZQ0KKwlfcm9sZSA9ICQobm9kZSkuYXR0cigncm9sZScpOw0KKwl2YXIgc291cmNlID0gIEpTT04ucGFyc2UoX3JvbGUpOw0KKwkvLyBkZXRlcm1pbmUgdGhlIHByZXZpb3VzIGxvY2F0aW9uIChpbiBjYXNlIGl0IGlzIG1vdmUsIG5vdCBjb3B5KQ0KKwlfcm9sZSA9IHRyZWVfb2JqLnBhcmVudChub2RlKTsNCisJdmFyIGZyb20gPSBfcm9sZS5hdHRyICYmIF9yb2xlLmF0dHIoJ3JvbGUnKSA/IEpTT04ucGFyc2UoX3JvbGUuYXR0cigncm9sZScpKSA6IGZhbHNlOw0KKw0KKwlyZXR1cm4gew0KKwkJJ3RvJyA6IHRvLA0KKwkJJ2Zyb20nIDogZnJvbSwNCisJCSdub2RlJyA6IHNvdXJjZQ0KKwl9DQorfQ0K