| 1 | InVzZSBzdHJpY3QiOwpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwp2YXIgYnVpbGRfMSA9IHJlcXVpcmUoIi4vYnVpbGQiKTsKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJCdWlsZENtZCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBidWlsZF8xLkJ1aWxkQ21kOyB9IH0pOwpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgImJ1aWxkQ21kQnVpbGRlciIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBidWlsZF8xLmJ1aWxkQ21kQnVpbGRlcjsgfSB9KTsKdmFyIGZtdF8xID0gcmVxdWlyZSgiLi9mbXQiKTsKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJGbXRDbWQiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZm10XzEuRm10Q21kOyB9IH0pOwpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgImluaXRDb25maWciLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZm10XzEuaW5pdENvbmZpZzsgfSB9KTsKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJmbXRDbWRCdWlsZGVyIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZtdF8xLmZtdENtZEJ1aWxkZXI7IH0gfSk7CnZhciB0ZXN0XzEgPSByZXF1aXJlKCIuL3Rlc3QiKTsKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJUZXN0Q21kIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRlc3RfMS5UZXN0Q21kOyB9IH0pOwp2YXIgaW5pdF8xID0gcmVxdWlyZSgiLi9pbml0Iik7Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiSW5pdENtZCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBpbml0XzEuSW5pdENtZDsgfSB9KTsKdmFyIHJ1bl8xID0gcmVxdWlyZSgiLi9ydW4iKTsKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJSdW5DbWQiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcnVuXzEuUnVuQ21kOyB9IH0pOwovLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lhVzVrWlhndWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGN5STZXeUl1TGk4dUxpOXpjbU12WTI5dGJXRnVaSE12YVc1a1pYZ3VkSE1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanM3UVVGQlFTeHBRMEZCYjBRN1FVRkJNME1zYVVkQlFVRXNVVUZCVVN4UFFVRkJPMEZCUVVVc2QwZEJRVUVzWlVGQlpTeFBRVUZCTzBGQlEyeERMRFpDUVVFd1JEdEJRVUZxUkN3MlJrRkJRU3hOUVVGTkxFOUJRVUU3UVVGQlJTeHBSMEZCUVN4VlFVRlZMRTlCUVVFN1FVRkJSU3h2UjBGQlFTeGhRVUZoTEU5QlFVRTdRVUZETVVNc0swSkJRV2xETzBGQlFYaENMQ3RHUVVGQkxFOUJRVThzVDBGQlFUdEJRVU5vUWl3clFrRkJhVU03UVVGQmVFSXNLMFpCUVVFc1QwRkJUeXhQUVVGQk8wRkJRMmhDTERaQ1FVRXJRanRCUVVGMFFpdzJSa0ZCUVN4TlFVRk5MRTlCUVVFaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SmxlSEJ2Y25RZ2V5QkNkV2xzWkVOdFpDd2dZblZwYkdSRGJXUkNkV2xzWkdWeUlIMGdabkp2YlNCY0lpNHZZblZwYkdSY0lqdGNibVY0Y0c5eWRDQjdJRVp0ZEVOdFpDd2dhVzVwZEVOdmJtWnBaeXdnWm0xMFEyMWtRblZwYkdSbGNpQjlJR1p5YjIwZ1hDSXVMMlp0ZEZ3aU8xeHVaWGh3YjNKMElIc2dWR1Z6ZEVOdFpDQjlJR1p5YjIwZ1hDSXVMM1JsYzNSY0lqdGNibVY0Y0c5eWRDQjdJRWx1YVhSRGJXUWdmU0JtY205dElGd2lMaTlwYm1sMFhDSTdYRzVsZUhCdmNuUWdleUJTZFc1RGJXUWdmU0JtY205dElGd2lMaTl5ZFc1Y0lqc2lYWDA9 |
| 1 | IyBjcm9zcy1zcGF3bgoKWyFbTlBNIHZlcnNpb25dW25wbS1pbWFnZV1dW25wbS11cmxdIFshW0Rvd25sb2Fkc11bZG93bmxvYWRzLWltYWdlXV1bbnBtLXVybF0gWyFbQnVpbGQgU3RhdHVzXVtjaS1pbWFnZV1dW2NpLXVybF0gWyFbQnVpbGQgc3RhdHVzXVthcHB2ZXlvci1pbWFnZV1dW2FwcHZleW9yLXVybF0KCltucG0tdXJsXTpodHRwczovL25wbWpzLm9yZy9wYWNrYWdlL2Nyb3NzLXNwYXduCltkb3dubG9hZHMtaW1hZ2VdOmh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL2RtL2Nyb3NzLXNwYXduLnN2ZwpbbnBtLWltYWdlXTpodHRwczovL2ltZy5zaGllbGRzLmlvL25wbS92L2Nyb3NzLXNwYXduLnN2ZwpbY2ktdXJsXTpodHRwczovL2dpdGh1Yi5jb20vbW94eXN0dWRpby9ub2RlLWNyb3NzLXNwYXduL2FjdGlvbnMvd29ya2Zsb3dzL2NpLnlhbWwKW2NpLWltYWdlXTpodHRwczovL2dpdGh1Yi5jb20vbW94eXN0dWRpby9ub2RlLWNyb3NzLXNwYXduL2FjdGlvbnMvd29ya2Zsb3dzL2NpLnlhbWwvYmFkZ2Uuc3ZnClthcHB2ZXlvci11cmxdOmh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3Qvc2F0YXpvci9ub2RlLWNyb3NzLXNwYXduClthcHB2ZXlvci1pbWFnZV06aHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9hcHB2ZXlvci9jaS9zYXRhem9yL25vZGUtY3Jvc3Mtc3Bhd24vbWFzdGVyLnN2ZwoKQSBjcm9zcyBwbGF0Zm9ybSBzb2x1dGlvbiB0byBub2RlJ3Mgc3Bhd24gYW5kIHNwYXduU3luYy4KCiMjIEluc3RhbGxhdGlvbgoKTm9kZS5qcyB2ZXJzaW9uIDggYW5kIHVwOgpgJCBucG0gaW5zdGFsbCBjcm9zcy1zcGF3bmAKCk5vZGUuanMgdmVyc2lvbiA3IGFuZCB1bmRlcjoKYCQgbnBtIGluc3RhbGwgY3Jvc3Mtc3Bhd25ANmAKCiMjIFdoeQoKTm9kZSBoYXMgaXNzdWVzIHdoZW4gdXNpbmcgc3Bhd24gb24gV2luZG93czoKCi0gSXQgaWdub3JlcyBbUEFUSEVYVF0oaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy8yMzE4KQotIEl0IGRvZXMgbm90IHN1cHBvcnQgW3NoZWJhbmdzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaGViYW5nXyhVbml4KSkKLSBIYXMgcHJvYmxlbXMgcnVubmluZyBjb21tYW5kcyB3aXRoIFtzcGFjZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNzM2NykKLSBIYXMgcHJvYmxlbXMgcnVubmluZyBjb21tYW5kcyB3aXRoIHBvc2l4IHJlbGF0aXZlIHBhdGhzIChlLmcuOiBgLi9teS1mb2xkZXIvbXktZXhlY3V0YWJsZWApCi0gSGFzIGFuIFtpc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL21veHlzdHVkaW8vbm9kZS1jcm9zcy1zcGF3bi9pc3N1ZXMvODIpIHdpdGggY29tbWFuZCBzaGltcyAoZmlsZXMgaW4gYG5vZGVfbW9kdWxlcy8uYmluL2ApLCB3aGVyZSBhcmd1bWVudHMgd2l0aCBxdW90ZXMgYW5kIHBhcmVudGhlc2lzIHdvdWxkIHJlc3VsdCBpbiBbaW52YWxpZCBzeW50YXggZXJyb3JdKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3h5c3R1ZGlvL25vZGUtY3Jvc3Mtc3Bhd24vYmxvYi9lNzdiOGYyMmE0MTZkYjQ2YjYxOTY3NjdiY2QzNTYwMWQ3ZTExZDU0L3Rlc3QvaW5kZXgudGVzdC5qcyNMMTQ5KQotIE5vIGBvcHRpb25zLnNoZWxsYCBzdXBwb3J0IG9uIG5vZGUgYDx2NC44YAoKQWxsIHRoZXNlIGlzc3VlcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgYGNyb3NzLXNwYXduYC4KVGhlcmUgYXJlIHNvbWUga25vd24gbW9kdWxlcywgc3VjaCBhcyBbd2luLXNwYXduXShodHRwczovL2dpdGh1Yi5jb20vRm9yYmVzTGluZGVzYXkvd2luLXNwYXduKSwgdGhhdCB0cnkgdG8gc29sdmUgdGhpcyBidXQgdGhleSBhcmUgZWl0aGVyIGJyb2tlbiBvciBwcm92aWRlIGZhdWx0eSBlc2NhcGluZyBvZiBzaGVsbCBhcmd1bWVudHMuCgoKIyMgVXNhZ2UKCkV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIG5vZGUncyBbYHNwYXduYF0oaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9jaGlsZF9wcm9jZXNzLmh0bWwjY2hpbGRfcHJvY2Vzc19jaGlsZF9wcm9jZXNzX3NwYXduX2NvbW1hbmRfYXJnc19vcHRpb25zKSBvciBbYHNwYXduU3luY2BdKGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvY2hpbGRfcHJvY2Vzcy5odG1sI2NoaWxkX3Byb2Nlc3NfY2hpbGRfcHJvY2Vzc19zcGF3bnN5bmNfY29tbWFuZF9hcmdzX29wdGlvbnMpLCBzbyBpdCdzIGEgZHJvcCBpbiByZXBsYWNlbWVudC4KCgpgYGBqcwpjb25zdCBzcGF3biA9IHJlcXVpcmUoJ2Nyb3NzLXNwYXduJyk7CgovLyBTcGF3biBOUE0gYXN5bmNocm9ub3VzbHkKY29uc3QgY2hpbGQgPSBzcGF3bignbnBtJywgWydsaXN0JywgJy1nJywgJy1kZXB0aCcsICcwJ10sIHsgc3RkaW86ICdpbmhlcml0JyB9KTsKCi8vIFNwYXduIE5QTSBzeW5jaHJvbm91c2x5CmNvbnN0IHJlc3VsdCA9IHNwYXduLnN5bmMoJ25wbScsIFsnbGlzdCcsICctZycsICctZGVwdGgnLCAnMCddLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7CmBgYAoKCiMjIENhdmVhdHMKCiMjIyBVc2luZyBgb3B0aW9ucy5zaGVsbGAgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gYGNyb3NzLXNwYXduYAoKU3RhcnRpbmcgZnJvbSBub2RlIGB2NC44YCwgYHNwYXduYCBoYXMgYSBgc2hlbGxgIG9wdGlvbiB0aGF0IGFsbG93cyB5b3UgcnVuIGNvbW1hbmRzIGZyb20gd2l0aGluIGEgc2hlbGwuIFRoaXMgbmV3IG9wdGlvbiBzb2x2ZXMKdGhlIFtQQVRIRVhUXShodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUvaXNzdWVzLzIzMTgpIGlzc3VlIGJ1dDoKCi0gSXQncyBub3Qgc3VwcG9ydGVkIGluIG5vZGUgYDx2NC44YAotIFlvdSBtdXN0IG1hbnVhbGx5IGVzY2FwZSB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHdoaWNoIGlzIHZlcnkgZXJyb3IgcHJvbmUsIHNwZWNpYWxseSB3aGVuIHBhc3NpbmcgdXNlciBpbnB1dAotIFRoZXJlIGFyZSBhIGxvdCBvZiBvdGhlciB1bnJlc29sdmVkIGlzc3VlcyBmcm9tIHRoZSBbV2h5XSgjd2h5KSBzZWN0aW9uIHRoYXQgeW91IG11c3QgdGFrZSBpbnRvIGFjY291bnQKCklmIHlvdSBhcmUgdXNpbmcgdGhlIGBzaGVsbGAgb3B0aW9uIHRvIHNwYXduIGEgY29tbWFuZCBpbiBhIGNyb3NzIHBsYXRmb3JtIHdheSwgY29uc2lkZXIgdXNpbmcgYGNyb3NzLXNwYXduYCBpbnN0ZWFkLiBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KCiMjIyBgb3B0aW9ucy5zaGVsbGAgc3VwcG9ydAoKV2hpbGUgYGNyb3NzLXNwYXduYCBhZGRzIHN1cHBvcnQgZm9yIGBvcHRpb25zLnNoZWxsYCBpbiBub2RlIGA8djQuOGAsIGFsbCBvZiBpdHMgZW5oYW5jZW1lbnRzIGFyZSBkaXNhYmxlZC4KClRoaXMgbWltaWNzIHRoZSBOb2RlLmpzIGJlaGF2aW9yLiBNb3JlIHNwZWNpZmljYWxseSwgdGhlIGNvbW1hbmQgYW5kIGl0cyBhcmd1bWVudHMgd2lsbCBub3QgYmUgYXV0b21hdGljYWxseSBlc2NhcGVkIG5vciBzaGViYW5nIHN1cHBvcnQgd2lsbCBiZSBvZmZlcmVkLiBUaGlzIGlzIGJ5IGRlc2lnbiBiZWNhdXNlIGlmIHlvdSBhcmUgdXNpbmcgYG9wdGlvbnMuc2hlbGxgIHlvdSBhcmUgcHJvYmFibHkgdGFyZ2V0aW5nIGEgc3BlY2lmaWMgcGxhdGZvcm0gYW55d2F5IGFuZCB5b3UgZG9uJ3Qgd2FudCB0aGluZ3MgdG8gZ2V0IGludG8geW91ciB3YXkuCgojIyMgU2hlYmFuZ3Mgc3VwcG9ydAoKV2hpbGUgYGNyb3NzLXNwYXduYCBoYW5kbGVzIHNoZWJhbmdzIG9uIFdpbmRvd3MsIGl0cyBzdXBwb3J0IGlzIGxpbWl0ZWQuIE1vcmUgc3BlY2lmaWNhbGx5LCBpdCBqdXN0IHN1cHBvcnRzIGAjIS91c3IvYmluL2VudiA8cHJvZ3JhbT5gIHdoZXJlIGA8cHJvZ3JhbT5gIG11c3Qgbm90IGNvbnRhaW4gYW55IGFyZ3VtZW50cy4gICAKSWYgeW91IHdvdWxkIGxpa2UgdG8gaGF2ZSB0aGUgc2hlYmFuZyBzdXBwb3J0IGltcHJvdmVkLCBmZWVsIGZyZWUgdG8gY29udHJpYnV0ZSB2aWEgYSBwdWxsLXJlcXVlc3QuCgpSZW1lbWJlciB0byBhbHdheXMgdGVzdCB5b3VyIGNvZGUgb24gV2luZG93cyEKCgojIyBUZXN0cwoKYCQgbnBtIHRlc3RgICAgCmAkIG5wbSB0ZXN0IC0tIC0td2F0Y2hgIGR1cmluZyBkZXZlbG9wbWVudAoKCiMjIExpY2Vuc2UKClJlbGVhc2VkIHVuZGVyIHRoZSBbTUlUIExpY2Vuc2VdKGh0dHBzOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocCkuCg== |
| 1 | InVzZSBzdHJpY3QiOwpleHBvcnRzWyJjb25maWcuanNvbiJdID0gdmFsaWRhdGU0MzsKY29uc3Qgc2NoZW1hMTMgPSB7CiAgICAiJGlkIjogImNvbmZpZy5qc29uIiwKICAgICIkc2NoZW1hIjogImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hIyIsCiAgICAidHlwZSI6ICJvYmplY3QiLAogICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgImJvcmRlciI6IHsKICAgICAgICAgICAgIiRyZWYiOiAic2hhcmVkLmpzb24jL2RlZmluaXRpb25zL2JvcmRlcnMiCiAgICAgICAgfSwKICAgICAgICAiaGVhZGVyIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJjb250ZW50IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYWxpZ25tZW50IjogewogICAgICAgICAgICAgICAgICAgICIkcmVmIjogInNoYXJlZC5qc29uIy9kZWZpbml0aW9ucy9hbGlnbm1lbnQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIndyYXBXb3JkIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRydW5jYXRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBhZGRpbmdMZWZ0IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBhZGRpbmdSaWdodCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZWQiOiBbImNvbnRlbnQiXSwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJjb2x1bW5zIjogewogICAgICAgICAgICAiJHJlZiI6ICJzaGFyZWQuanNvbiMvZGVmaW5pdGlvbnMvY29sdW1ucyIKICAgICAgICB9LAogICAgICAgICJjb2x1bW5EZWZhdWx0IjogewogICAgICAgICAgICAiJHJlZiI6ICJzaGFyZWQuanNvbiMvZGVmaW5pdGlvbnMvY29sdW1uIgogICAgICAgIH0sCiAgICAgICAgImRyYXdWZXJ0aWNhbExpbmUiOiB7CiAgICAgICAgICAgICJ0eXBlb2YiOiAiZnVuY3Rpb24iCiAgICAgICAgfSwKICAgICAgICAiZHJhd0hvcml6b250YWxMaW5lIjogewogICAgICAgICAgICAidHlwZW9mIjogImZ1bmN0aW9uIgogICAgICAgIH0sCiAgICAgICAgInNpbmdsZUxpbmUiOiB7CiAgICAgICAgICAgICJ0eXBlb2YiOiAiYm9vbGVhbiIKICAgICAgICB9LAogICAgICAgICJzcGFubmluZ0NlbGxzIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiY29sIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicm93IjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiY29sU3BhbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogMQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJvd1NwYW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGlnbm1lbnQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICIkcmVmIjogInNoYXJlZC5qc29uIy9kZWZpbml0aW9ucy9hbGlnbm1lbnQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVydGljYWxBbGlnbm1lbnQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICIkcmVmIjogInNoYXJlZC5qc29uIy9kZWZpbml0aW9ucy92ZXJ0aWNhbEFsaWdubWVudCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ3cmFwV29yZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ0cnVuY2F0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYWRkaW5nTGVmdCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJwYWRkaW5nUmlnaHQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsicm93IiwgImNvbCJdLAogICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sCiAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQp9Owpjb25zdCBzY2hlbWExNSA9IHsKICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAidG9wQm9keSI6IHsKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9ib3JkZXIiCiAgICAgICAgfSwKICAgICAgICAidG9wSm9pbiI6IHsKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9ib3JkZXIiCiAgICAgICAgfSwKICAgICAgICAidG9wTGVmdCI6IHsKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9ib3JkZXIiCiAgICAgICAgfSwKICAgICAgICAidG9wUmlnaHQiOiB7CiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYm9yZGVyIgogICAgICAgIH0sCiAgICAgICAgImJvdHRvbUJvZHkiOiB7CiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYm9yZGVyIgogICAgICAgIH0sCiAgICAgICAgImJvdHRvbUpvaW4iOiB7CiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYm9yZGVyIgogICAgICAgIH0sCiAgICAgICAgImJvdHRvbUxlZnQiOiB7CiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYm9yZGVyIgogICAgICAgIH0sCiAgICAgICAgImJvdHRvbVJpZ2h0IjogewogICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2JvcmRlciIKICAgICAgICB9LAogICAgICAgICJib2R5TGVmdCI6IHsKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9ib3JkZXIiCiAgICAgICAgfSwKICAgICAgICAiYm9keVJpZ2h0IjogewogICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2JvcmRlciIKICAgICAgICB9LAogICAgICAgICJib2R5Sm9pbiI6IHsKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9ib3JkZXIiCiAgICAgICAgfSwKICAgICAgICAiaGVhZGVySm9pbiI6IHsKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9ib3JkZXIiCiAgICAgICAgfSwKICAgICAgICAiam9pbkJvZHkiOiB7CiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYm9yZGVyIgogICAgICAgIH0sCiAgICAgICAgImpvaW5MZWZ0IjogewogICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2JvcmRlciIKICAgICAgICB9LAogICAgICAgICJqb2luUmlnaHQiOiB7CiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYm9yZGVyIgogICAgICAgIH0sCiAgICAgICAgImpvaW5Kb2luIjogewogICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2JvcmRlciIKICAgICAgICB9LAogICAgICAgICJqb2luTWlkZGxlVXAiOiB7CiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYm9yZGVyIgogICAgICAgIH0sCiAgICAgICAgImpvaW5NaWRkbGVEb3duIjogewogICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2JvcmRlciIKICAgICAgICB9LAogICAgICAgICJqb2luTWlkZGxlTGVmdCI6IHsKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9ib3JkZXIiCiAgICAgICAgfSwKICAgICAgICAiam9pbk1pZGRsZVJpZ2h0IjogewogICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2JvcmRlciIKICAgICAgICB9CiAgICB9LAogICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKfTsKY29uc3QgZnVuYzggPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5Owpjb25zdCBzY2hlbWExNiA9IHsKICAgICJ0eXBlIjogInN0cmluZyIKfTsKZnVuY3Rpb24gdmFsaWRhdGU0NihkYXRhLCB7IGluc3RhbmNlUGF0aCA9ICIiLCBwYXJlbnREYXRhLCBwYXJlbnREYXRhUHJvcGVydHksIHJvb3REYXRhID0gZGF0YSB9ID0ge30pIHsKICAgIGxldCB2RXJyb3JzID0gbnVsbDsKICAgIGxldCBlcnJvcnMgPSAwOwogICAgaWYgKHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIikgewogICAgICAgIGNvbnN0IGVycjAgPSB7CiAgICAgICAgICAgIGluc3RhbmNlUGF0aCwKICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvdHlwZSIsCiAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlIiwKICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICB0eXBlOiAic3RyaW5nIgogICAgICAgICAgICB9LAogICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSBzdHJpbmciCiAgICAgICAgfTsKICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICB2RXJyb3JzID0gW2VycjBdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjApOwogICAgICAgIH0KICAgICAgICBlcnJvcnMrKzsKICAgIH0KICAgIHZhbGlkYXRlNDYuZXJyb3JzID0gdkVycm9yczsKICAgIHJldHVybiBlcnJvcnMgPT09IDA7Cn0KZnVuY3Rpb24gdmFsaWRhdGU0NShkYXRhLCB7IGluc3RhbmNlUGF0aCA9ICIiLCBwYXJlbnREYXRhLCBwYXJlbnREYXRhUHJvcGVydHksIHJvb3REYXRhID0gZGF0YSB9ID0ge30pIHsKICAgIGxldCB2RXJyb3JzID0gbnVsbDsKICAgIGxldCBlcnJvcnMgPSAwOwogICAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT0gIm9iamVjdCIgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICBmb3IgKGNvbnN0IGtleTAgaW4gZGF0YSkgewogICAgICAgICAgICBpZiAoIShmdW5jOC5jYWxsKHNjaGVtYTE1LnByb3BlcnRpZXMsIGtleTApKSkgewogICAgICAgICAgICAgICAgY29uc3QgZXJyMCA9IHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvYWRkaXRpb25hbFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJhZGRpdGlvbmFsUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0eToga2V5MAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgTk9UIGhhdmUgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIwXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLnRvcEJvZHkgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTQ2KGRhdGEudG9wQm9keSwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3RvcEJvZHkiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogInRvcEJvZHkiLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNDYuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU0Ni5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEudG9wSm9pbiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNDYoZGF0YS50b3BKb2luLCB7CiAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvdG9wSm9pbiIsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAidG9wSm9pbiIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU0Ni5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTQ2LmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS50b3BMZWZ0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU0NihkYXRhLnRvcExlZnQsIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi90b3BMZWZ0IiwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJ0b3BMZWZ0IiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTQ2LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNDYuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLnRvcFJpZ2h0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU0NihkYXRhLnRvcFJpZ2h0LCB7CiAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvdG9wUmlnaHQiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogInRvcFJpZ2h0IiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTQ2LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNDYuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmJvdHRvbUJvZHkgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTQ2KGRhdGEuYm90dG9tQm9keSwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2JvdHRvbUJvZHkiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImJvdHRvbUJvZHkiLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNDYuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU0Ni5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuYm90dG9tSm9pbiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNDYoZGF0YS5ib3R0b21Kb2luLCB7CiAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvYm90dG9tSm9pbiIsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAiYm90dG9tSm9pbiIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU0Ni5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTQ2LmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS5ib3R0b21MZWZ0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU0NihkYXRhLmJvdHRvbUxlZnQsIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9ib3R0b21MZWZ0IiwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJib3R0b21MZWZ0IiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTQ2LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNDYuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmJvdHRvbVJpZ2h0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU0NihkYXRhLmJvdHRvbVJpZ2h0LCB7CiAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvYm90dG9tUmlnaHQiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImJvdHRvbVJpZ2h0IiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTQ2LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNDYuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmJvZHlMZWZ0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU0NihkYXRhLmJvZHlMZWZ0LCB7CiAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvYm9keUxlZnQiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImJvZHlMZWZ0IiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTQ2LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNDYuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmJvZHlSaWdodCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNDYoZGF0YS5ib2R5UmlnaHQsIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9ib2R5UmlnaHQiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImJvZHlSaWdodCIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU0Ni5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTQ2LmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS5ib2R5Sm9pbiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNDYoZGF0YS5ib2R5Sm9pbiwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2JvZHlKb2luIiwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJib2R5Sm9pbiIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU0Ni5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTQ2LmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS5oZWFkZXJKb2luICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU0NihkYXRhLmhlYWRlckpvaW4sIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9oZWFkZXJKb2luIiwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJoZWFkZXJKb2luIiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTQ2LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNDYuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmpvaW5Cb2R5ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU0NihkYXRhLmpvaW5Cb2R5LCB7CiAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvam9pbkJvZHkiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImpvaW5Cb2R5IiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTQ2LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNDYuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmpvaW5MZWZ0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU0NihkYXRhLmpvaW5MZWZ0LCB7CiAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvam9pbkxlZnQiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImpvaW5MZWZ0IiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTQ2LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNDYuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmpvaW5SaWdodCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNDYoZGF0YS5qb2luUmlnaHQsIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9qb2luUmlnaHQiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImpvaW5SaWdodCIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU0Ni5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTQ2LmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS5qb2luSm9pbiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNDYoZGF0YS5qb2luSm9pbiwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2pvaW5Kb2luIiwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJqb2luSm9pbiIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU0Ni5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTQ2LmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS5qb2luTWlkZGxlVXAgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTQ2KGRhdGEuam9pbk1pZGRsZVVwLCB7CiAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvam9pbk1pZGRsZVVwIiwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJqb2luTWlkZGxlVXAiLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNDYuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU0Ni5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuam9pbk1pZGRsZURvd24gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTQ2KGRhdGEuam9pbk1pZGRsZURvd24sIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9qb2luTWlkZGxlRG93biIsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAiam9pbk1pZGRsZURvd24iLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNDYuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU0Ni5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuam9pbk1pZGRsZUxlZnQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTQ2KGRhdGEuam9pbk1pZGRsZUxlZnQsIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9qb2luTWlkZGxlTGVmdCIsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAiam9pbk1pZGRsZUxlZnQiLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNDYuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU0Ni5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuam9pbk1pZGRsZVJpZ2h0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU0NihkYXRhLmpvaW5NaWRkbGVSaWdodCwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2pvaW5NaWRkbGVSaWdodCIsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAiam9pbk1pZGRsZVJpZ2h0IiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTQ2LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNDYuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgY29uc3QgZXJyMSA9IHsKICAgICAgICAgICAgaW5zdGFuY2VQYXRoLAogICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy90eXBlIiwKICAgICAgICAgICAga2V5d29yZDogInR5cGUiLAogICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgIHR5cGU6ICJvYmplY3QiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIG9iamVjdCIKICAgICAgICB9OwogICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyMV07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMSk7CiAgICAgICAgfQogICAgICAgIGVycm9ycysrOwogICAgfQogICAgdmFsaWRhdGU0NS5lcnJvcnMgPSB2RXJyb3JzOwogICAgcmV0dXJuIGVycm9ycyA9PT0gMDsKfQpjb25zdCBzY2hlbWExNyA9IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsibGVmdCIsICJyaWdodCIsICJjZW50ZXIiLCAianVzdGlmeSJdCn07CmNvbnN0IGZ1bmMwID0gcmVxdWlyZSgiYWp2L2Rpc3QvcnVudGltZS9lcXVhbCIpLmRlZmF1bHQ7CmZ1bmN0aW9uIHZhbGlkYXRlNjgoZGF0YSwgeyBpbnN0YW5jZVBhdGggPSAiIiwgcGFyZW50RGF0YSwgcGFyZW50RGF0YVByb3BlcnR5LCByb290RGF0YSA9IGRhdGEgfSA9IHt9KSB7CiAgICBsZXQgdkVycm9ycyA9IG51bGw7CiAgICBsZXQgZXJyb3JzID0gMDsKICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIpIHsKICAgICAgICBjb25zdCBlcnIwID0gewogICAgICAgICAgICBpbnN0YW5jZVBhdGgsCiAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3R5cGUiLAogICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgdHlwZTogInN0cmluZyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgc3RyaW5nIgogICAgICAgIH07CiAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIwXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIwKTsKICAgICAgICB9CiAgICAgICAgZXJyb3JzKys7CiAgICB9CiAgICBpZiAoISgoKChkYXRhID09PSAibGVmdCIpIHx8IChkYXRhID09PSAicmlnaHQiKSkgfHwgKGRhdGEgPT09ICJjZW50ZXIiKSkgfHwgKGRhdGEgPT09ICJqdXN0aWZ5IikpKSB7CiAgICAgICAgY29uc3QgZXJyMSA9IHsKICAgICAgICAgICAgaW5zdGFuY2VQYXRoLAogICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9lbnVtIiwKICAgICAgICAgICAga2V5d29yZDogImVudW0iLAogICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IHNjaGVtYTE3LmVudW0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgZXF1YWwgdG8gb25lIG9mIHRoZSBhbGxvd2VkIHZhbHVlcyIKICAgICAgICB9OwogICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyMV07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMSk7CiAgICAgICAgfQogICAgICAgIGVycm9ycysrOwogICAgfQogICAgdmFsaWRhdGU2OC5lcnJvcnMgPSB2RXJyb3JzOwogICAgcmV0dXJuIGVycm9ycyA9PT0gMDsKfQpjb25zdCBzY2hlbWExOCA9IHsKICAgICJvbmVPZiI6IFt7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJwYXR0ZXJuUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJeWzAtOV0rJCI6IHsKICAgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2NvbHVtbiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgICAgICB9LCB7CiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9jb2x1bW4iCiAgICAgICAgICAgIH0KICAgICAgICB9XQp9Owpjb25zdCBwYXR0ZXJuMCA9IG5ldyBSZWdFeHAoIl5bMC05XSskIiwgInUiKTsKY29uc3Qgc2NoZW1hMTkgPSB7CiAgICAidHlwZSI6ICJvYmplY3QiLAogICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgImFsaWdubWVudCI6IHsKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9hbGlnbm1lbnQiCiAgICAgICAgfSwKICAgICAgICAidmVydGljYWxBbGlnbm1lbnQiOiB7CiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdmVydGljYWxBbGlnbm1lbnQiCiAgICAgICAgfSwKICAgICAgICAid2lkdGgiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAogICAgICAgICAgICAibWluaW11bSI6IDEKICAgICAgICB9LAogICAgICAgICJ3cmFwV29yZCI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICB9LAogICAgICAgICJ0cnVuY2F0ZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICB9LAogICAgICAgICJwYWRkaW5nTGVmdCI6IHsKICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIKICAgICAgICB9LAogICAgICAgICJwYWRkaW5nUmlnaHQiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgfQogICAgfSwKICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCn07CmZ1bmN0aW9uIHZhbGlkYXRlNzIoZGF0YSwgeyBpbnN0YW5jZVBhdGggPSAiIiwgcGFyZW50RGF0YSwgcGFyZW50RGF0YVByb3BlcnR5LCByb290RGF0YSA9IGRhdGEgfSA9IHt9KSB7CiAgICBsZXQgdkVycm9ycyA9IG51bGw7CiAgICBsZXQgZXJyb3JzID0gMDsKICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIpIHsKICAgICAgICBjb25zdCBlcnIwID0gewogICAgICAgICAgICBpbnN0YW5jZVBhdGgsCiAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3R5cGUiLAogICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgdHlwZTogInN0cmluZyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgc3RyaW5nIgogICAgICAgIH07CiAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIwXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIwKTsKICAgICAgICB9CiAgICAgICAgZXJyb3JzKys7CiAgICB9CiAgICBpZiAoISgoKChkYXRhID09PSAibGVmdCIpIHx8IChkYXRhID09PSAicmlnaHQiKSkgfHwgKGRhdGEgPT09ICJjZW50ZXIiKSkgfHwgKGRhdGEgPT09ICJqdXN0aWZ5IikpKSB7CiAgICAgICAgY29uc3QgZXJyMSA9IHsKICAgICAgICAgICAgaW5zdGFuY2VQYXRoLAogICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9lbnVtIiwKICAgICAgICAgICAga2V5d29yZDogImVudW0iLAogICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IHNjaGVtYTE3LmVudW0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgZXF1YWwgdG8gb25lIG9mIHRoZSBhbGxvd2VkIHZhbHVlcyIKICAgICAgICB9OwogICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyMV07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMSk7CiAgICAgICAgfQogICAgICAgIGVycm9ycysrOwogICAgfQogICAgdmFsaWRhdGU3Mi5lcnJvcnMgPSB2RXJyb3JzOwogICAgcmV0dXJuIGVycm9ycyA9PT0gMDsKfQpjb25zdCBzY2hlbWEyMSA9IHsKICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAiZW51bSI6IFsidG9wIiwgIm1pZGRsZSIsICJib3R0b20iXQp9OwpmdW5jdGlvbiB2YWxpZGF0ZTc0KGRhdGEsIHsgaW5zdGFuY2VQYXRoID0gIiIsIHBhcmVudERhdGEsIHBhcmVudERhdGFQcm9wZXJ0eSwgcm9vdERhdGEgPSBkYXRhIH0gPSB7fSkgewogICAgbGV0IHZFcnJvcnMgPSBudWxsOwogICAgbGV0IGVycm9ycyA9IDA7CiAgICBpZiAodHlwZW9mIGRhdGEgIT09ICJzdHJpbmciKSB7CiAgICAgICAgY29uc3QgZXJyMCA9IHsKICAgICAgICAgICAgaW5zdGFuY2VQYXRoLAogICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy90eXBlIiwKICAgICAgICAgICAga2V5d29yZDogInR5cGUiLAogICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgIHR5cGU6ICJzdHJpbmciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIHN0cmluZyIKICAgICAgICB9OwogICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyMF07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMCk7CiAgICAgICAgfQogICAgICAgIGVycm9ycysrOwogICAgfQogICAgaWYgKCEoKChkYXRhID09PSAidG9wIikgfHwgKGRhdGEgPT09ICJtaWRkbGUiKSkgfHwgKGRhdGEgPT09ICJib3R0b20iKSkpIHsKICAgICAgICBjb25zdCBlcnIxID0gewogICAgICAgICAgICBpbnN0YW5jZVBhdGgsCiAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL2VudW0iLAogICAgICAgICAgICBrZXl3b3JkOiAiZW51bSIsCiAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogc2NoZW1hMjEuZW51bQogICAgICAgICAgICB9LAogICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSBlcXVhbCB0byBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzIgogICAgICAgIH07CiAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIxXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIxKTsKICAgICAgICB9CiAgICAgICAgZXJyb3JzKys7CiAgICB9CiAgICB2YWxpZGF0ZTc0LmVycm9ycyA9IHZFcnJvcnM7CiAgICByZXR1cm4gZXJyb3JzID09PSAwOwp9CmZ1bmN0aW9uIHZhbGlkYXRlNzEoZGF0YSwgeyBpbnN0YW5jZVBhdGggPSAiIiwgcGFyZW50RGF0YSwgcGFyZW50RGF0YVByb3BlcnR5LCByb290RGF0YSA9IGRhdGEgfSA9IHt9KSB7CiAgICBsZXQgdkVycm9ycyA9IG51bGw7CiAgICBsZXQgZXJyb3JzID0gMDsKICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhID09ICJvYmplY3QiICYmICFBcnJheS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXkwIGluIGRhdGEpIHsKICAgICAgICAgICAgaWYgKCEoKCgoKCgoa2V5MCA9PT0gImFsaWdubWVudCIpIHx8IChrZXkwID09PSAidmVydGljYWxBbGlnbm1lbnQiKSkgfHwgKGtleTAgPT09ICJ3aWR0aCIpKSB8fCAoa2V5MCA9PT0gIndyYXBXb3JkIikpIHx8IChrZXkwID09PSAidHJ1bmNhdGUiKSkgfHwgKGtleTAgPT09ICJwYWRkaW5nTGVmdCIpKSB8fCAoa2V5MCA9PT0gInBhZGRpbmdSaWdodCIpKSkgewogICAgICAgICAgICAgICAgY29uc3QgZXJyMCA9IHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvYWRkaXRpb25hbFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJhZGRpdGlvbmFsUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0eToga2V5MAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgTk9UIGhhdmUgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIwXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmFsaWdubWVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNzIoZGF0YS5hbGlnbm1lbnQsIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9hbGlnbm1lbnQiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImFsaWdubWVudCIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU3Mi5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTcyLmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS52ZXJ0aWNhbEFsaWdubWVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNzQoZGF0YS52ZXJ0aWNhbEFsaWdubWVudCwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3ZlcnRpY2FsQWxpZ25tZW50IiwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJ2ZXJ0aWNhbEFsaWdubWVudCIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU3NC5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTc0LmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS53aWR0aCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGxldCBkYXRhMiA9IGRhdGEud2lkdGg7CiAgICAgICAgICAgIGlmICghKCgodHlwZW9mIGRhdGEyID09ICJudW1iZXIiKSAmJiAoIShkYXRhMiAlIDEpICYmICFpc05hTihkYXRhMikpKSAmJiAoaXNGaW5pdGUoZGF0YTIpKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVycjEgPSB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3dpZHRoIiwKICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL3dpZHRoL3R5cGUiLAogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlIiwKICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSBpbnRlZ2VyIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgodHlwZW9mIGRhdGEyID09ICJudW1iZXIiKSAmJiAoaXNGaW5pdGUoZGF0YTIpKSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEyIDwgMSB8fCBpc05hTihkYXRhMikpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIyID0gewogICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvd2lkdGgiLAogICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL3dpZHRoL21pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAibWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbjogIj49IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OiAxCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlID49IDEiCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjJdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS53cmFwV29yZCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS53cmFwV29yZCAhPT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnIzID0gewogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi93cmFwV29yZCIsCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvcHJvcGVydGllcy93cmFwV29yZC90eXBlIiwKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgYm9vbGVhbiIKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyM107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS50cnVuY2F0ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGxldCBkYXRhNCA9IGRhdGEudHJ1bmNhdGU7CiAgICAgICAgICAgIGlmICghKCgodHlwZW9mIGRhdGE0ID09ICJudW1iZXIiKSAmJiAoIShkYXRhNCAlIDEpICYmICFpc05hTihkYXRhNCkpKSAmJiAoaXNGaW5pdGUoZGF0YTQpKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVycjQgPSB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3RydW5jYXRlIiwKICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL3RydW5jYXRlL3R5cGUiLAogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlIiwKICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSBpbnRlZ2VyIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnI0XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnI0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLnBhZGRpbmdMZWZ0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbGV0IGRhdGE1ID0gZGF0YS5wYWRkaW5nTGVmdDsKICAgICAgICAgICAgaWYgKCEoKCh0eXBlb2YgZGF0YTUgPT0gIm51bWJlciIpICYmICghKGRhdGE1ICUgMSkgJiYgIWlzTmFOKGRhdGE1KSkpICYmIChpc0Zpbml0ZShkYXRhNSkpKSkgewogICAgICAgICAgICAgICAgY29uc3QgZXJyNSA9IHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvcGFkZGluZ0xlZnQiLAogICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3Byb3BlcnRpZXMvcGFkZGluZ0xlZnQvdHlwZSIsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogInR5cGUiLAogICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIGludGVnZXIiCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEucGFkZGluZ1JpZ2h0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbGV0IGRhdGE2ID0gZGF0YS5wYWRkaW5nUmlnaHQ7CiAgICAgICAgICAgIGlmICghKCgodHlwZW9mIGRhdGE2ID09ICJudW1iZXIiKSAmJiAoIShkYXRhNiAlIDEpICYmICFpc05hTihkYXRhNikpKSAmJiAoaXNGaW5pdGUoZGF0YTYpKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVycjYgPSB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3BhZGRpbmdSaWdodCIsCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvcHJvcGVydGllcy9wYWRkaW5nUmlnaHQvdHlwZSIsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogInR5cGUiLAogICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIGludGVnZXIiCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjZdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBjb25zdCBlcnI3ID0gewogICAgICAgICAgICBpbnN0YW5jZVBhdGgsCiAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3R5cGUiLAogICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgdHlwZTogIm9iamVjdCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgb2JqZWN0IgogICAgICAgIH07CiAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgdkVycm9ycyA9IFtlcnI3XTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnI3KTsKICAgICAgICB9CiAgICAgICAgZXJyb3JzKys7CiAgICB9CiAgICB2YWxpZGF0ZTcxLmVycm9ycyA9IHZFcnJvcnM7CiAgICByZXR1cm4gZXJyb3JzID09PSAwOwp9CmZ1bmN0aW9uIHZhbGlkYXRlNzAoZGF0YSwgeyBpbnN0YW5jZVBhdGggPSAiIiwgcGFyZW50RGF0YSwgcGFyZW50RGF0YVByb3BlcnR5LCByb290RGF0YSA9IGRhdGEgfSA9IHt9KSB7CiAgICBsZXQgdkVycm9ycyA9IG51bGw7CiAgICBsZXQgZXJyb3JzID0gMDsKICAgIGNvbnN0IF9lcnJzMCA9IGVycm9yczsKICAgIGxldCB2YWxpZDAgPSBmYWxzZTsKICAgIGxldCBwYXNzaW5nMCA9IG51bGw7CiAgICBjb25zdCBfZXJyczEgPSBlcnJvcnM7CiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PSAib2JqZWN0IiAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSkgewogICAgICAgIGZvciAoY29uc3Qga2V5MCBpbiBkYXRhKSB7CiAgICAgICAgICAgIGlmICghKHBhdHRlcm4wLnRlc3Qoa2V5MCkpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnIwID0gewogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aCwKICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9vbmVPZi8wL2FkZGl0aW9uYWxQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAiYWRkaXRpb25hbFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydHk6IGtleTAKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IE5PVCBoYXZlIGFkZGl0aW9uYWwgcHJvcGVydGllcyIKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGNvbnN0IGtleTEgaW4gZGF0YSkgewogICAgICAgICAgICBpZiAocGF0dGVybjAudGVzdChrZXkxKSkgewogICAgICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU3MShkYXRhW2tleTFdLCB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiLyIgKyBrZXkxLnJlcGxhY2UoL34vZywgIn4wIikucmVwbGFjZSgvXC8vZywgIn4xIiksCiAgICAgICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6IGtleTEsCiAgICAgICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU3MS5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTcxLmVycm9ycyk7CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBjb25zdCBlcnIxID0gewogICAgICAgICAgICBpbnN0YW5jZVBhdGgsCiAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL29uZU9mLzAvdHlwZSIsCiAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlIiwKICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICB0eXBlOiAib2JqZWN0IgogICAgICAgICAgICB9LAogICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSBvYmplY3QiCiAgICAgICAgfTsKICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICB2RXJyb3JzID0gW2VycjFdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjEpOwogICAgICAgIH0KICAgICAgICBlcnJvcnMrKzsKICAgIH0KICAgIHZhciBfdmFsaWQwID0gX2VycnMxID09PSBlcnJvcnM7CiAgICBpZiAoX3ZhbGlkMCkgewogICAgICAgIHZhbGlkMCA9IHRydWU7CiAgICAgICAgcGFzc2luZzAgPSAwOwogICAgfQogICAgY29uc3QgX2VycnM1ID0gZXJyb3JzOwogICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICBjb25zdCBsZW4wID0gZGF0YS5sZW5ndGg7CiAgICAgICAgZm9yIChsZXQgaTAgPSAwOyBpMCA8IGxlbjA7IGkwKyspIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU3MShkYXRhW2kwXSwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiLyIgKyBpMCwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6IGkwLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNzEuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU3MS5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBjb25zdCBlcnIyID0gewogICAgICAgICAgICBpbnN0YW5jZVBhdGgsCiAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL29uZU9mLzEvdHlwZSIsCiAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlIiwKICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICB0eXBlOiAiYXJyYXkiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIGFycmF5IgogICAgICAgIH07CiAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIyXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIyKTsKICAgICAgICB9CiAgICAgICAgZXJyb3JzKys7CiAgICB9CiAgICB2YXIgX3ZhbGlkMCA9IF9lcnJzNSA9PT0gZXJyb3JzOwogICAgaWYgKF92YWxpZDAgJiYgdmFsaWQwKSB7CiAgICAgICAgdmFsaWQwID0gZmFsc2U7CiAgICAgICAgcGFzc2luZzAgPSBbcGFzc2luZzAsIDFdOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKF92YWxpZDApIHsKICAgICAgICAgICAgdmFsaWQwID0gdHJ1ZTsKICAgICAgICAgICAgcGFzc2luZzAgPSAxOwogICAgICAgIH0KICAgIH0KICAgIGlmICghdmFsaWQwKSB7CiAgICAgICAgY29uc3QgZXJyMyA9IHsKICAgICAgICAgICAgaW5zdGFuY2VQYXRoLAogICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9vbmVPZiIsCiAgICAgICAgICAgIGtleXdvcmQ6ICJvbmVPZiIsCiAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgcGFzc2luZ1NjaGVtYXM6IHBhc3NpbmcwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IG1hdGNoIGV4YWN0bHkgb25lIHNjaGVtYSBpbiBvbmVPZiIKICAgICAgICB9OwogICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyM107CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMyk7CiAgICAgICAgfQogICAgICAgIGVycm9ycysrOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgZXJyb3JzID0gX2VycnMwOwogICAgICAgIGlmICh2RXJyb3JzICE9PSBudWxsKSB7CiAgICAgICAgICAgIGlmIChfZXJyczApIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMubGVuZ3RoID0gX2VycnMwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICB2YWxpZGF0ZTcwLmVycm9ycyA9IHZFcnJvcnM7CiAgICByZXR1cm4gZXJyb3JzID09PSAwOwp9CmZ1bmN0aW9uIHZhbGlkYXRlNzkoZGF0YSwgeyBpbnN0YW5jZVBhdGggPSAiIiwgcGFyZW50RGF0YSwgcGFyZW50RGF0YVByb3BlcnR5LCByb290RGF0YSA9IGRhdGEgfSA9IHt9KSB7CiAgICBsZXQgdkVycm9ycyA9IG51bGw7CiAgICBsZXQgZXJyb3JzID0gMDsKICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhID09ICJvYmplY3QiICYmICFBcnJheS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXkwIGluIGRhdGEpIHsKICAgICAgICAgICAgaWYgKCEoKCgoKCgoa2V5MCA9PT0gImFsaWdubWVudCIpIHx8IChrZXkwID09PSAidmVydGljYWxBbGlnbm1lbnQiKSkgfHwgKGtleTAgPT09ICJ3aWR0aCIpKSB8fCAoa2V5MCA9PT0gIndyYXBXb3JkIikpIHx8IChrZXkwID09PSAidHJ1bmNhdGUiKSkgfHwgKGtleTAgPT09ICJwYWRkaW5nTGVmdCIpKSB8fCAoa2V5MCA9PT0gInBhZGRpbmdSaWdodCIpKSkgewogICAgICAgICAgICAgICAgY29uc3QgZXJyMCA9IHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvYWRkaXRpb25hbFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJhZGRpdGlvbmFsUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0eToga2V5MAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgTk9UIGhhdmUgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIwXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmFsaWdubWVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNzIoZGF0YS5hbGlnbm1lbnQsIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9hbGlnbm1lbnQiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImFsaWdubWVudCIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU3Mi5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTcyLmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS52ZXJ0aWNhbEFsaWdubWVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNzQoZGF0YS52ZXJ0aWNhbEFsaWdubWVudCwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3ZlcnRpY2FsQWxpZ25tZW50IiwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJ2ZXJ0aWNhbEFsaWdubWVudCIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU3NC5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTc0LmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS53aWR0aCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGxldCBkYXRhMiA9IGRhdGEud2lkdGg7CiAgICAgICAgICAgIGlmICghKCgodHlwZW9mIGRhdGEyID09ICJudW1iZXIiKSAmJiAoIShkYXRhMiAlIDEpICYmICFpc05hTihkYXRhMikpKSAmJiAoaXNGaW5pdGUoZGF0YTIpKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVycjEgPSB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3dpZHRoIiwKICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL3dpZHRoL3R5cGUiLAogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlIiwKICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSBpbnRlZ2VyIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgodHlwZW9mIGRhdGEyID09ICJudW1iZXIiKSAmJiAoaXNGaW5pdGUoZGF0YTIpKSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEyIDwgMSB8fCBpc05hTihkYXRhMikpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIyID0gewogICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvd2lkdGgiLAogICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL3dpZHRoL21pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAibWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbjogIj49IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OiAxCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlID49IDEiCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjJdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS53cmFwV29yZCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS53cmFwV29yZCAhPT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnIzID0gewogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi93cmFwV29yZCIsCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvcHJvcGVydGllcy93cmFwV29yZC90eXBlIiwKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgYm9vbGVhbiIKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyM107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS50cnVuY2F0ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGxldCBkYXRhNCA9IGRhdGEudHJ1bmNhdGU7CiAgICAgICAgICAgIGlmICghKCgodHlwZW9mIGRhdGE0ID09ICJudW1iZXIiKSAmJiAoIShkYXRhNCAlIDEpICYmICFpc05hTihkYXRhNCkpKSAmJiAoaXNGaW5pdGUoZGF0YTQpKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVycjQgPSB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3RydW5jYXRlIiwKICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL3RydW5jYXRlL3R5cGUiLAogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlIiwKICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSBpbnRlZ2VyIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnI0XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnI0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLnBhZGRpbmdMZWZ0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbGV0IGRhdGE1ID0gZGF0YS5wYWRkaW5nTGVmdDsKICAgICAgICAgICAgaWYgKCEoKCh0eXBlb2YgZGF0YTUgPT0gIm51bWJlciIpICYmICghKGRhdGE1ICUgMSkgJiYgIWlzTmFOKGRhdGE1KSkpICYmIChpc0Zpbml0ZShkYXRhNSkpKSkgewogICAgICAgICAgICAgICAgY29uc3QgZXJyNSA9IHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvcGFkZGluZ0xlZnQiLAogICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3Byb3BlcnRpZXMvcGFkZGluZ0xlZnQvdHlwZSIsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogInR5cGUiLAogICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIGludGVnZXIiCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEucGFkZGluZ1JpZ2h0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbGV0IGRhdGE2ID0gZGF0YS5wYWRkaW5nUmlnaHQ7CiAgICAgICAgICAgIGlmICghKCgodHlwZW9mIGRhdGE2ID09ICJudW1iZXIiKSAmJiAoIShkYXRhNiAlIDEpICYmICFpc05hTihkYXRhNikpKSAmJiAoaXNGaW5pdGUoZGF0YTYpKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVycjYgPSB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3BhZGRpbmdSaWdodCIsCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvcHJvcGVydGllcy9wYWRkaW5nUmlnaHQvdHlwZSIsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogInR5cGUiLAogICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIGludGVnZXIiCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjZdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBjb25zdCBlcnI3ID0gewogICAgICAgICAgICBpbnN0YW5jZVBhdGgsCiAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3R5cGUiLAogICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgdHlwZTogIm9iamVjdCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgb2JqZWN0IgogICAgICAgIH07CiAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgdkVycm9ycyA9IFtlcnI3XTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnI3KTsKICAgICAgICB9CiAgICAgICAgZXJyb3JzKys7CiAgICB9CiAgICB2YWxpZGF0ZTc5LmVycm9ycyA9IHZFcnJvcnM7CiAgICByZXR1cm4gZXJyb3JzID09PSAwOwp9CmZ1bmN0aW9uIHZhbGlkYXRlODQoZGF0YSwgeyBpbnN0YW5jZVBhdGggPSAiIiwgcGFyZW50RGF0YSwgcGFyZW50RGF0YVByb3BlcnR5LCByb290RGF0YSA9IGRhdGEgfSA9IHt9KSB7CiAgICBsZXQgdkVycm9ycyA9IG51bGw7CiAgICBsZXQgZXJyb3JzID0gMDsKICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIpIHsKICAgICAgICBjb25zdCBlcnIwID0gewogICAgICAgICAgICBpbnN0YW5jZVBhdGgsCiAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3R5cGUiLAogICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgdHlwZTogInN0cmluZyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgc3RyaW5nIgogICAgICAgIH07CiAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIwXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIwKTsKICAgICAgICB9CiAgICAgICAgZXJyb3JzKys7CiAgICB9CiAgICBpZiAoISgoKGRhdGEgPT09ICJ0b3AiKSB8fCAoZGF0YSA9PT0gIm1pZGRsZSIpKSB8fCAoZGF0YSA9PT0gImJvdHRvbSIpKSkgewogICAgICAgIGNvbnN0IGVycjEgPSB7CiAgICAgICAgICAgIGluc3RhbmNlUGF0aCwKICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvZW51bSIsCiAgICAgICAgICAgIGtleXdvcmQ6ICJlbnVtIiwKICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBzY2hlbWEyMS5lbnVtCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIGVxdWFsIHRvIG9uZSBvZiB0aGUgYWxsb3dlZCB2YWx1ZXMiCiAgICAgICAgfTsKICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICB2RXJyb3JzID0gW2VycjFdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjEpOwogICAgICAgIH0KICAgICAgICBlcnJvcnMrKzsKICAgIH0KICAgIHZhbGlkYXRlODQuZXJyb3JzID0gdkVycm9yczsKICAgIHJldHVybiBlcnJvcnMgPT09IDA7Cn0KZnVuY3Rpb24gdmFsaWRhdGU0MyhkYXRhLCB7IGluc3RhbmNlUGF0aCA9ICIiLCBwYXJlbnREYXRhLCBwYXJlbnREYXRhUHJvcGVydHksIHJvb3REYXRhID0gZGF0YSB9ID0ge30pIHsKICAgIC8qIyBzb3VyY2VVUkw9ImNvbmZpZy5qc29uIiAqLyA7CiAgICBsZXQgdkVycm9ycyA9IG51bGw7CiAgICBsZXQgZXJyb3JzID0gMDsKICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhID09ICJvYmplY3QiICYmICFBcnJheS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXkwIGluIGRhdGEpIHsKICAgICAgICAgICAgaWYgKCEoKCgoKCgoKGtleTAgPT09ICJib3JkZXIiKSB8fCAoa2V5MCA9PT0gImhlYWRlciIpKSB8fCAoa2V5MCA9PT0gImNvbHVtbnMiKSkgfHwgKGtleTAgPT09ICJjb2x1bW5EZWZhdWx0IikpIHx8IChrZXkwID09PSAiZHJhd1ZlcnRpY2FsTGluZSIpKSB8fCAoa2V5MCA9PT0gImRyYXdIb3Jpem9udGFsTGluZSIpKSB8fCAoa2V5MCA9PT0gInNpbmdsZUxpbmUiKSkgfHwgKGtleTAgPT09ICJzcGFubmluZ0NlbGxzIikpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnIwID0gewogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aCwKICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9hZGRpdGlvbmFsUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnR5OiBrZXkwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBOT1QgaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMiCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuYm9yZGVyICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU0NShkYXRhLmJvcmRlciwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2JvcmRlciIsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAiYm9yZGVyIiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTQ1LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNDUuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmhlYWRlciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGxldCBkYXRhMSA9IGRhdGEuaGVhZGVyOwogICAgICAgICAgICBpZiAoZGF0YTEgJiYgdHlwZW9mIGRhdGExID09ICJvYmplY3QiICYmICFBcnJheS5pc0FycmF5KGRhdGExKSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGExLmNvbnRlbnQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycjEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9oZWFkZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL2hlYWRlci9yZXF1aXJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJyZXF1aXJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ1Byb3BlcnR5OiAiY29udGVudCIKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgaGF2ZSByZXF1aXJlZCBwcm9wZXJ0eSAnIiArICJjb250ZW50IiArICInIgogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIxXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleTEgaW4gZGF0YTEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISgoKCgoKGtleTEgPT09ICJjb250ZW50IikgfHwgKGtleTEgPT09ICJhbGlnbm1lbnQiKSkgfHwgKGtleTEgPT09ICJ3cmFwV29yZCIpKSB8fCAoa2V5MSA9PT0gInRydW5jYXRlIikpIHx8IChrZXkxID09PSAicGFkZGluZ0xlZnQiKSkgfHwgKGtleTEgPT09ICJwYWRkaW5nUmlnaHQiKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyMiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9oZWFkZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvcHJvcGVydGllcy9oZWFkZXIvYWRkaXRpb25hbFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZDogImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0eToga2V5MQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IE5PVCBoYXZlIGFkZGl0aW9uYWwgcHJvcGVydGllcyIKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyMl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGRhdGExLmNvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YTEuY29udGVudCAhPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyMyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9oZWFkZXIvY29udGVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL2hlYWRlci9wcm9wZXJ0aWVzL2NvbnRlbnQvdHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIHN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyM107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGRhdGExLmFsaWdubWVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU2OChkYXRhMS5hbGlnbm1lbnQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2hlYWRlci9hbGlnbm1lbnQiLAogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhMSwKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAiYWxpZ25tZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTY4LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNjguZXJyb3JzKTsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGRhdGExLndyYXBXb3JkICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGExLndyYXBXb3JkICE9PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyNCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9oZWFkZXIvd3JhcFdvcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvcHJvcGVydGllcy9oZWFkZXIvcHJvcGVydGllcy93cmFwV29yZC90eXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIGJvb2xlYW4iCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjRdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChkYXRhMS50cnVuY2F0ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGE1ID0gZGF0YTEudHJ1bmNhdGU7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoKCh0eXBlb2YgZGF0YTUgPT0gIm51bWJlciIpICYmICghKGRhdGE1ICUgMSkgJiYgIWlzTmFOKGRhdGE1KSkpICYmIChpc0Zpbml0ZShkYXRhNSkpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnI1ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2hlYWRlci90cnVuY2F0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL2hlYWRlci9wcm9wZXJ0aWVzL3RydW5jYXRlL3R5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZDogInR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyNV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyNSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGRhdGExLnBhZGRpbmdMZWZ0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YTYgPSBkYXRhMS5wYWRkaW5nTGVmdDsKICAgICAgICAgICAgICAgICAgICBpZiAoISgoKHR5cGVvZiBkYXRhNiA9PSAibnVtYmVyIikgJiYgKCEoZGF0YTYgJSAxKSAmJiAhaXNOYU4oZGF0YTYpKSkgJiYgKGlzRmluaXRlKGRhdGE2KSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycjYgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvaGVhZGVyL3BhZGRpbmdMZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3Byb3BlcnRpZXMvaGVhZGVyL3Byb3BlcnRpZXMvcGFkZGluZ0xlZnQvdHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSBpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnI2XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnI2KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YTEucGFkZGluZ1JpZ2h0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YTcgPSBkYXRhMS5wYWRkaW5nUmlnaHQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoKCh0eXBlb2YgZGF0YTcgPT0gIm51bWJlciIpICYmICghKGRhdGE3ICUgMSkgJiYgIWlzTmFOKGRhdGE3KSkpICYmIChpc0Zpbml0ZShkYXRhNykpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnI3ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2hlYWRlci9wYWRkaW5nUmlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvcHJvcGVydGllcy9oZWFkZXIvcHJvcGVydGllcy9wYWRkaW5nUmlnaHQvdHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSBpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnI3XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnI3KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnI4ID0gewogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9oZWFkZXIiLAogICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3Byb3BlcnRpZXMvaGVhZGVyL3R5cGUiLAogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlIiwKICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIG9iamVjdCIKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyOF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyOCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS5jb2x1bW5zICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU3MChkYXRhLmNvbHVtbnMsIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9jb2x1bW5zIiwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJjb2x1bW5zIiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTcwLmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNzAuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmNvbHVtbkRlZmF1bHQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTc5KGRhdGEuY29sdW1uRGVmYXVsdCwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2NvbHVtbkRlZmF1bHQiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImNvbHVtbkRlZmF1bHQiLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNzkuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU3OS5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuZHJhd1ZlcnRpY2FsTGluZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5kcmF3VmVydGljYWxMaW5lICE9ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVycjkgPSB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2RyYXdWZXJ0aWNhbExpbmUiLAogICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3Byb3BlcnRpZXMvZHJhd1ZlcnRpY2FsTGluZS90eXBlb2YiLAogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlb2YiLAogICAgICAgICAgICAgICAgICAgIHBhcmFtczoge30sCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgcGFzcyBcInR5cGVvZlwiIGtleXdvcmQgdmFsaWRhdGlvbiIKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyOV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyOSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS5kcmF3SG9yaXpvbnRhbExpbmUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuZHJhd0hvcml6b250YWxMaW5lICE9ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVycjEwID0gewogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9kcmF3SG9yaXpvbnRhbExpbmUiLAogICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3Byb3BlcnRpZXMvZHJhd0hvcml6b250YWxMaW5lL3R5cGVvZiIsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogInR5cGVvZiIsCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7fSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBwYXNzIFwidHlwZW9mXCIga2V5d29yZCB2YWxpZGF0aW9uIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIxMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMTApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuc2luZ2xlTGluZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5zaW5nbGVMaW5lICE9ICJib29sZWFuIikgewogICAgICAgICAgICAgICAgY29uc3QgZXJyMTEgPSB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3NpbmdsZUxpbmUiLAogICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3Byb3BlcnRpZXMvc2luZ2xlTGluZS90eXBlb2YiLAogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlb2YiLAogICAgICAgICAgICAgICAgICAgIHBhcmFtczoge30sCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgcGFzcyBcInR5cGVvZlwiIGtleXdvcmQgdmFsaWRhdGlvbiIKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyMTFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjExKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLnNwYW5uaW5nQ2VsbHMgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBsZXQgZGF0YTEzID0gZGF0YS5zcGFubmluZ0NlbGxzOwogICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhMTMpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBsZW4wID0gZGF0YTEzLmxlbmd0aDsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkwID0gMDsgaTAgPCBsZW4wOyBpMCsrKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGExNCA9IGRhdGExM1tpMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGExNCAmJiB0eXBlb2YgZGF0YTE0ID09ICJvYmplY3QiICYmICFBcnJheS5pc0FycmF5KGRhdGExNCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGExNC5yb3cgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyMTIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3NwYW5uaW5nQ2VsbHMvIiArIGkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3Byb3BlcnRpZXMvc3Bhbm5pbmdDZWxscy9pdGVtcy9yZXF1aXJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZDogInJlcXVpcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ1Byb3BlcnR5OiAicm93IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgaGF2ZSByZXF1aXJlZCBwcm9wZXJ0eSAnIiArICJyb3ciICsgIiciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjEyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIxMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YTE0LmNvbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIxMyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvc3Bhbm5pbmdDZWxscy8iICsgaTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvcHJvcGVydGllcy9zcGFubmluZ0NlbGxzL2l0ZW1zL3JlcXVpcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAicmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nUHJvcGVydHk6ICJjb2wiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBoYXZlIHJlcXVpcmVkIHByb3BlcnR5ICciICsgImNvbCIgKyAiJyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyMTNdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjEzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5MiBpbiBkYXRhMTQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGZ1bmM4LmNhbGwoc2NoZW1hMTMucHJvcGVydGllcy5zcGFubmluZ0NlbGxzLml0ZW1zLnByb3BlcnRpZXMsIGtleTIpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycjE0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvc3Bhbm5pbmdDZWxscy8iICsgaTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3Byb3BlcnRpZXMvc3Bhbm5pbmdDZWxscy9pdGVtcy9hZGRpdGlvbmFsUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJhZGRpdGlvbmFsUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnR5OiBrZXkyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IE5PVCBoYXZlIGFkZGl0aW9uYWwgcHJvcGVydGllcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyMTRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjE0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGExNC5jb2wgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGExNSA9IGRhdGExNC5jb2w7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgoKHR5cGVvZiBkYXRhMTUgPT0gIm51bWJlciIpICYmICghKGRhdGExNSAlIDEpICYmICFpc05hTihkYXRhMTUpKSkgJiYgKGlzRmluaXRlKGRhdGExNSkpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycjE1ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvc3Bhbm5pbmdDZWxscy8iICsgaTAgKyAiL2NvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3Byb3BlcnRpZXMvc3Bhbm5pbmdDZWxscy9pdGVtcy9wcm9wZXJ0aWVzL2NvbC90eXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZDogInR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSBpbnRlZ2VyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIxNV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mIGRhdGExNSA9PSAibnVtYmVyIikgJiYgKGlzRmluaXRlKGRhdGExNSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGExNSA8IDAgfHwgaXNOYU4oZGF0YTE1KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIxNiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9zcGFubmluZ0NlbGxzLyIgKyBpMCArICIvY29sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3Byb3BlcnRpZXMvc3Bhbm5pbmdDZWxscy9pdGVtcy9wcm9wZXJ0aWVzL2NvbC9taW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJtaW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb246ICI+PSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQ6IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSA+PSAwIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIxNl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMTYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YTE0LnJvdyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YTE2ID0gZGF0YTE0LnJvdzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKCgodHlwZW9mIGRhdGExNiA9PSAibnVtYmVyIikgJiYgKCEoZGF0YTE2ICUgMSkgJiYgIWlzTmFOKGRhdGExNikpKSAmJiAoaXNGaW5pdGUoZGF0YTE2KSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyMTcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9zcGFubmluZ0NlbGxzLyIgKyBpMCArICIvcm93IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvcHJvcGVydGllcy9zcGFubmluZ0NlbGxzL2l0ZW1zL3Byb3BlcnRpZXMvcm93L3R5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIGludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjE3XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIxNyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YgZGF0YTE2ID09ICJudW1iZXIiKSAmJiAoaXNGaW5pdGUoZGF0YTE2KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YTE2IDwgMCB8fCBpc05hTihkYXRhMTYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycjE4ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3NwYW5uaW5nQ2VsbHMvIiArIGkwICsgIi9yb3ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvcHJvcGVydGllcy9zcGFubmluZ0NlbGxzL2l0ZW1zL3Byb3BlcnRpZXMvcm93L21pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZDogIm1pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbjogIj49IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdDogMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlID49IDAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjE4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIxOCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhMTQuY29sU3BhbiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YTE3ID0gZGF0YTE0LmNvbFNwYW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgoKHR5cGVvZiBkYXRhMTcgPT0gIm51bWJlciIpICYmICghKGRhdGExNyAlIDEpICYmICFpc05hTihkYXRhMTcpKSkgJiYgKGlzRmluaXRlKGRhdGExNykpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycjE5ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvc3Bhbm5pbmdDZWxscy8iICsgaTAgKyAiL2NvbFNwYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL3NwYW5uaW5nQ2VsbHMvaXRlbXMvcHJvcGVydGllcy9jb2xTcGFuL3R5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIGludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjE5XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIxOSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YgZGF0YTE3ID09ICJudW1iZXIiKSAmJiAoaXNGaW5pdGUoZGF0YTE3KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YTE3IDwgMSB8fCBpc05hTihkYXRhMTcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycjIwID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3NwYW5uaW5nQ2VsbHMvIiArIGkwICsgIi9jb2xTcGFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3Byb3BlcnRpZXMvc3Bhbm5pbmdDZWxscy9pdGVtcy9wcm9wZXJ0aWVzL2NvbFNwYW4vbWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAibWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uOiAiPj0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OiAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgPj0gMSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyMjBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjIwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGExNC5yb3dTcGFuICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhMTggPSBkYXRhMTQucm93U3BhbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKCgodHlwZW9mIGRhdGExOCA9PSAibnVtYmVyIikgJiYgKCEoZGF0YTE4ICUgMSkgJiYgIWlzTmFOKGRhdGExOCkpKSAmJiAoaXNGaW5pdGUoZGF0YTE4KSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyMjEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9zcGFubmluZ0NlbGxzLyIgKyBpMCArICIvcm93U3BhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3Byb3BlcnRpZXMvc3Bhbm5pbmdDZWxscy9pdGVtcy9wcm9wZXJ0aWVzL3Jvd1NwYW4vdHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyMjFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjIxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZiBkYXRhMTggPT0gIm51bWJlciIpICYmIChpc0Zpbml0ZShkYXRhMTgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhMTggPCAxIHx8IGlzTmFOKGRhdGExOCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyMjIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvc3Bhbm5pbmdDZWxscy8iICsgaTAgKyAiL3Jvd1NwYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvcHJvcGVydGllcy9zcGFubmluZ0NlbGxzL2l0ZW1zL3Byb3BlcnRpZXMvcm93U3Bhbi9taW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJtaW5pbXVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb246ICI+PSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQ6IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSA+PSAxIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIyMl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMjIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YTE0LmFsaWdubWVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTY4KGRhdGExNC5hbGlnbm1lbnQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvc3Bhbm5pbmdDZWxscy8iICsgaTAgKyAiL2FsaWdubWVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YTE0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImFsaWdubWVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU2OC5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTY4LmVycm9ycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGExNC52ZXJ0aWNhbEFsaWdubWVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTg0KGRhdGExNC52ZXJ0aWNhbEFsaWdubWVudCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9zcGFubmluZ0NlbGxzLyIgKyBpMCArICIvdmVydGljYWxBbGlnbm1lbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGExNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJ2ZXJ0aWNhbEFsaWdubWVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU4NC5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTg0LmVycm9ycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGExNC53cmFwV29yZCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGExNC53cmFwV29yZCAhPT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyMjMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9zcGFubmluZ0NlbGxzLyIgKyBpMCArICIvd3JhcFdvcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL3NwYW5uaW5nQ2VsbHMvaXRlbXMvcHJvcGVydGllcy93cmFwV29yZC90eXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZDogInR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSBib29sZWFuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIyM107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMjMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YTE0LnRydW5jYXRlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhMjIgPSBkYXRhMTQudHJ1bmNhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgoKHR5cGVvZiBkYXRhMjIgPT0gIm51bWJlciIpICYmICghKGRhdGEyMiAlIDEpICYmICFpc05hTihkYXRhMjIpKSkgJiYgKGlzRmluaXRlKGRhdGEyMikpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycjI0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvc3Bhbm5pbmdDZWxscy8iICsgaTAgKyAiL3RydW5jYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvcHJvcGVydGllcy9zcGFubmluZ0NlbGxzL2l0ZW1zL3Byb3BlcnRpZXMvdHJ1bmNhdGUvdHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyMjRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjI0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGExNC5wYWRkaW5nTGVmdCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YTIzID0gZGF0YTE0LnBhZGRpbmdMZWZ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoKCh0eXBlb2YgZGF0YTIzID09ICJudW1iZXIiKSAmJiAoIShkYXRhMjMgJSAxKSAmJiAhaXNOYU4oZGF0YTIzKSkpICYmIChpc0Zpbml0ZShkYXRhMjMpKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIyNSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3NwYW5uaW5nQ2VsbHMvIiArIGkwICsgIi9wYWRkaW5nTGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3Byb3BlcnRpZXMvc3Bhbm5pbmdDZWxscy9pdGVtcy9wcm9wZXJ0aWVzL3BhZGRpbmdMZWZ0L3R5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIGludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjI1XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIyNSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhMTQucGFkZGluZ1JpZ2h0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhMjQgPSBkYXRhMTQucGFkZGluZ1JpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoKCh0eXBlb2YgZGF0YTI0ID09ICJudW1iZXIiKSAmJiAoIShkYXRhMjQgJSAxKSAmJiAhaXNOYU4oZGF0YTI0KSkpICYmIChpc0Zpbml0ZShkYXRhMjQpKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIyNiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3NwYW5uaW5nQ2VsbHMvIiArIGkwICsgIi9wYWRkaW5nUmlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL3NwYW5uaW5nQ2VsbHMvaXRlbXMvcHJvcGVydGllcy9wYWRkaW5nUmlnaHQvdHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyMjZdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjI2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycjI3ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3NwYW5uaW5nQ2VsbHMvIiArIGkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvcHJvcGVydGllcy9zcGFubmluZ0NlbGxzL2l0ZW1zL3R5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZDogInR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogIm9iamVjdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSBvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjI3XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIyNyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgZXJyMjggPSB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3NwYW5uaW5nQ2VsbHMiLAogICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3Byb3BlcnRpZXMvc3Bhbm5pbmdDZWxscy90eXBlIiwKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJhcnJheSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIGFycmF5IgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIyOF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMjgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBjb25zdCBlcnIyOSA9IHsKICAgICAgICAgICAgaW5zdGFuY2VQYXRoLAogICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy90eXBlIiwKICAgICAgICAgICAga2V5d29yZDogInR5cGUiLAogICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgIHR5cGU6ICJvYmplY3QiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIG9iamVjdCIKICAgICAgICB9OwogICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyMjldOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjI5KTsKICAgICAgICB9CiAgICAgICAgZXJyb3JzKys7CiAgICB9CiAgICB2YWxpZGF0ZTQzLmVycm9ycyA9IHZFcnJvcnM7CiAgICByZXR1cm4gZXJyb3JzID09PSAwOwp9CmV4cG9ydHNbInN0cmVhbUNvbmZpZy5qc29uIl0gPSB2YWxpZGF0ZTg2Owpjb25zdCBzY2hlbWEyNCA9IHsKICAgICIkaWQiOiAic3RyZWFtQ29uZmlnLmpzb24iLAogICAgIiRzY2hlbWEiOiAiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEjIiwKICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAiYm9yZGVyIjogewogICAgICAgICAgICAiJHJlZiI6ICJzaGFyZWQuanNvbiMvZGVmaW5pdGlvbnMvYm9yZGVycyIKICAgICAgICB9LAogICAgICAgICJjb2x1bW5zIjogewogICAgICAgICAgICAiJHJlZiI6ICJzaGFyZWQuanNvbiMvZGVmaW5pdGlvbnMvY29sdW1ucyIKICAgICAgICB9LAogICAgICAgICJjb2x1bW5EZWZhdWx0IjogewogICAgICAgICAgICAiJHJlZiI6ICJzaGFyZWQuanNvbiMvZGVmaW5pdGlvbnMvY29sdW1uIgogICAgICAgIH0sCiAgICAgICAgImNvbHVtbkNvdW50IjogewogICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKICAgICAgICAgICAgIm1pbmltdW0iOiAxCiAgICAgICAgfSwKICAgICAgICAiZHJhd1ZlcnRpY2FsTGluZSI6IHsKICAgICAgICAgICAgInR5cGVvZiI6ICJmdW5jdGlvbiIKICAgICAgICB9CiAgICB9LAogICAgInJlcXVpcmVkIjogWyJjb2x1bW5EZWZhdWx0IiwgImNvbHVtbkNvdW50Il0sCiAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQp9OwpmdW5jdGlvbiB2YWxpZGF0ZTg3KGRhdGEsIHsgaW5zdGFuY2VQYXRoID0gIiIsIHBhcmVudERhdGEsIHBhcmVudERhdGFQcm9wZXJ0eSwgcm9vdERhdGEgPSBkYXRhIH0gPSB7fSkgewogICAgbGV0IHZFcnJvcnMgPSBudWxsOwogICAgbGV0IGVycm9ycyA9IDA7CiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PSAib2JqZWN0IiAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSkgewogICAgICAgIGZvciAoY29uc3Qga2V5MCBpbiBkYXRhKSB7CiAgICAgICAgICAgIGlmICghKGZ1bmM4LmNhbGwoc2NoZW1hMTUucHJvcGVydGllcywga2V5MCkpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnIwID0gewogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aCwKICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9hZGRpdGlvbmFsUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnR5OiBrZXkwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBOT1QgaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMiCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEudG9wQm9keSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNDYoZGF0YS50b3BCb2R5LCB7CiAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvdG9wQm9keSIsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAidG9wQm9keSIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU0Ni5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTQ2LmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS50b3BKb2luICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU0NihkYXRhLnRvcEpvaW4sIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi90b3BKb2luIiwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJ0b3BKb2luIiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTQ2LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNDYuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLnRvcExlZnQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTQ2KGRhdGEudG9wTGVmdCwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3RvcExlZnQiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogInRvcExlZnQiLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNDYuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU0Ni5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEudG9wUmlnaHQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTQ2KGRhdGEudG9wUmlnaHQsIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi90b3BSaWdodCIsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAidG9wUmlnaHQiLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNDYuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU0Ni5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuYm90dG9tQm9keSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNDYoZGF0YS5ib3R0b21Cb2R5LCB7CiAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvYm90dG9tQm9keSIsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAiYm90dG9tQm9keSIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU0Ni5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTQ2LmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS5ib3R0b21Kb2luICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU0NihkYXRhLmJvdHRvbUpvaW4sIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9ib3R0b21Kb2luIiwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJib3R0b21Kb2luIiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTQ2LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNDYuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmJvdHRvbUxlZnQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTQ2KGRhdGEuYm90dG9tTGVmdCwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2JvdHRvbUxlZnQiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImJvdHRvbUxlZnQiLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNDYuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU0Ni5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuYm90dG9tUmlnaHQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTQ2KGRhdGEuYm90dG9tUmlnaHQsIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9ib3R0b21SaWdodCIsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAiYm90dG9tUmlnaHQiLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNDYuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU0Ni5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuYm9keUxlZnQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTQ2KGRhdGEuYm9keUxlZnQsIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9ib2R5TGVmdCIsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAiYm9keUxlZnQiLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNDYuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU0Ni5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuYm9keVJpZ2h0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU0NihkYXRhLmJvZHlSaWdodCwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2JvZHlSaWdodCIsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAiYm9keVJpZ2h0IiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTQ2LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNDYuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmJvZHlKb2luICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU0NihkYXRhLmJvZHlKb2luLCB7CiAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvYm9keUpvaW4iLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImJvZHlKb2luIiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTQ2LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNDYuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmhlYWRlckpvaW4gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTQ2KGRhdGEuaGVhZGVySm9pbiwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2hlYWRlckpvaW4iLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImhlYWRlckpvaW4iLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNDYuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU0Ni5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuam9pbkJvZHkgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTQ2KGRhdGEuam9pbkJvZHksIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9qb2luQm9keSIsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAiam9pbkJvZHkiLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNDYuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU0Ni5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuam9pbkxlZnQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTQ2KGRhdGEuam9pbkxlZnQsIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9qb2luTGVmdCIsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAiam9pbkxlZnQiLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNDYuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU0Ni5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuam9pblJpZ2h0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU0NihkYXRhLmpvaW5SaWdodCwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2pvaW5SaWdodCIsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAiam9pblJpZ2h0IiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTQ2LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNDYuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmpvaW5Kb2luICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU0NihkYXRhLmpvaW5Kb2luLCB7CiAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvam9pbkpvaW4iLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImpvaW5Kb2luIiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTQ2LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNDYuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmpvaW5NaWRkbGVVcCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNDYoZGF0YS5qb2luTWlkZGxlVXAsIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9qb2luTWlkZGxlVXAiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImpvaW5NaWRkbGVVcCIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU0Ni5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTQ2LmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS5qb2luTWlkZGxlRG93biAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNDYoZGF0YS5qb2luTWlkZGxlRG93biwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2pvaW5NaWRkbGVEb3duIiwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJqb2luTWlkZGxlRG93biIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU0Ni5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTQ2LmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS5qb2luTWlkZGxlTGVmdCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNDYoZGF0YS5qb2luTWlkZGxlTGVmdCwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2pvaW5NaWRkbGVMZWZ0IiwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJqb2luTWlkZGxlTGVmdCIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU0Ni5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTQ2LmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS5qb2luTWlkZGxlUmlnaHQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTQ2KGRhdGEuam9pbk1pZGRsZVJpZ2h0LCB7CiAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvam9pbk1pZGRsZVJpZ2h0IiwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJqb2luTWlkZGxlUmlnaHQiLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNDYuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU0Ni5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBjb25zdCBlcnIxID0gewogICAgICAgICAgICBpbnN0YW5jZVBhdGgsCiAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3R5cGUiLAogICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgdHlwZTogIm9iamVjdCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgb2JqZWN0IgogICAgICAgIH07CiAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIxXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIxKTsKICAgICAgICB9CiAgICAgICAgZXJyb3JzKys7CiAgICB9CiAgICB2YWxpZGF0ZTg3LmVycm9ycyA9IHZFcnJvcnM7CiAgICByZXR1cm4gZXJyb3JzID09PSAwOwp9CmZ1bmN0aW9uIHZhbGlkYXRlMTA5KGRhdGEsIHsgaW5zdGFuY2VQYXRoID0gIiIsIHBhcmVudERhdGEsIHBhcmVudERhdGFQcm9wZXJ0eSwgcm9vdERhdGEgPSBkYXRhIH0gPSB7fSkgewogICAgbGV0IHZFcnJvcnMgPSBudWxsOwogICAgbGV0IGVycm9ycyA9IDA7CiAgICBjb25zdCBfZXJyczAgPSBlcnJvcnM7CiAgICBsZXQgdmFsaWQwID0gZmFsc2U7CiAgICBsZXQgcGFzc2luZzAgPSBudWxsOwogICAgY29uc3QgX2VycnMxID0gZXJyb3JzOwogICAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT0gIm9iamVjdCIgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICBmb3IgKGNvbnN0IGtleTAgaW4gZGF0YSkgewogICAgICAgICAgICBpZiAoIShwYXR0ZXJuMC50ZXN0KGtleTApKSkgewogICAgICAgICAgICAgICAgY29uc3QgZXJyMCA9IHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvb25lT2YvMC9hZGRpdGlvbmFsUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnR5OiBrZXkwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBOT1QgaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMiCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBrZXkxIGluIGRhdGEpIHsKICAgICAgICAgICAgaWYgKHBhdHRlcm4wLnRlc3Qoa2V5MSkpIHsKICAgICAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNzEoZGF0YVtrZXkxXSwgewogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi8iICsga2V5MS5yZXBsYWNlKC9+L2csICJ+MCIpLnJlcGxhY2UoL1wvL2csICJ+MSIpLAogICAgICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiBrZXkxLAogICAgICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlNzEuZXJyb3JzIDogdkVycm9ycy5jb25jYXQodmFsaWRhdGU3MS5lcnJvcnMpOwogICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgY29uc3QgZXJyMSA9IHsKICAgICAgICAgICAgaW5zdGFuY2VQYXRoLAogICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9vbmVPZi8wL3R5cGUiLAogICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgdHlwZTogIm9iamVjdCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgb2JqZWN0IgogICAgICAgIH07CiAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIxXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIxKTsKICAgICAgICB9CiAgICAgICAgZXJyb3JzKys7CiAgICB9CiAgICB2YXIgX3ZhbGlkMCA9IF9lcnJzMSA9PT0gZXJyb3JzOwogICAgaWYgKF92YWxpZDApIHsKICAgICAgICB2YWxpZDAgPSB0cnVlOwogICAgICAgIHBhc3NpbmcwID0gMDsKICAgIH0KICAgIGNvbnN0IF9lcnJzNSA9IGVycm9yczsKICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgY29uc3QgbGVuMCA9IGRhdGEubGVuZ3RoOwogICAgICAgIGZvciAobGV0IGkwID0gMDsgaTAgPCBsZW4wOyBpMCsrKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNzEoZGF0YVtpMF0sIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi8iICsgaTAsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiBpMCwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTcxLmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlNzEuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgY29uc3QgZXJyMiA9IHsKICAgICAgICAgICAgaW5zdGFuY2VQYXRoLAogICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9vbmVPZi8xL3R5cGUiLAogICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgdHlwZTogImFycmF5IgogICAgICAgICAgICB9LAogICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSBhcnJheSIKICAgICAgICB9OwogICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyMl07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMik7CiAgICAgICAgfQogICAgICAgIGVycm9ycysrOwogICAgfQogICAgdmFyIF92YWxpZDAgPSBfZXJyczUgPT09IGVycm9yczsKICAgIGlmIChfdmFsaWQwICYmIHZhbGlkMCkgewogICAgICAgIHZhbGlkMCA9IGZhbHNlOwogICAgICAgIHBhc3NpbmcwID0gW3Bhc3NpbmcwLCAxXTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmIChfdmFsaWQwKSB7CiAgICAgICAgICAgIHZhbGlkMCA9IHRydWU7CiAgICAgICAgICAgIHBhc3NpbmcwID0gMTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoIXZhbGlkMCkgewogICAgICAgIGNvbnN0IGVycjMgPSB7CiAgICAgICAgICAgIGluc3RhbmNlUGF0aCwKICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvb25lT2YiLAogICAgICAgICAgICBrZXl3b3JkOiAib25lT2YiLAogICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgIHBhc3NpbmdTY2hlbWFzOiBwYXNzaW5nMAogICAgICAgICAgICB9LAogICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBtYXRjaCBleGFjdGx5IG9uZSBzY2hlbWEgaW4gb25lT2YiCiAgICAgICAgfTsKICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICB2RXJyb3JzID0gW2VycjNdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjMpOwogICAgICAgIH0KICAgICAgICBlcnJvcnMrKzsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGVycm9ycyA9IF9lcnJzMDsKICAgICAgICBpZiAodkVycm9ycyAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoX2VycnMwKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzLmxlbmd0aCA9IF9lcnJzMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgdmFsaWRhdGUxMDkuZXJyb3JzID0gdkVycm9yczsKICAgIHJldHVybiBlcnJvcnMgPT09IDA7Cn0KZnVuY3Rpb24gdmFsaWRhdGUxMTMoZGF0YSwgeyBpbnN0YW5jZVBhdGggPSAiIiwgcGFyZW50RGF0YSwgcGFyZW50RGF0YVByb3BlcnR5LCByb290RGF0YSA9IGRhdGEgfSA9IHt9KSB7CiAgICBsZXQgdkVycm9ycyA9IG51bGw7CiAgICBsZXQgZXJyb3JzID0gMDsKICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhID09ICJvYmplY3QiICYmICFBcnJheS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXkwIGluIGRhdGEpIHsKICAgICAgICAgICAgaWYgKCEoKCgoKCgoa2V5MCA9PT0gImFsaWdubWVudCIpIHx8IChrZXkwID09PSAidmVydGljYWxBbGlnbm1lbnQiKSkgfHwgKGtleTAgPT09ICJ3aWR0aCIpKSB8fCAoa2V5MCA9PT0gIndyYXBXb3JkIikpIHx8IChrZXkwID09PSAidHJ1bmNhdGUiKSkgfHwgKGtleTAgPT09ICJwYWRkaW5nTGVmdCIpKSB8fCAoa2V5MCA9PT0gInBhZGRpbmdSaWdodCIpKSkgewogICAgICAgICAgICAgICAgY29uc3QgZXJyMCA9IHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvYWRkaXRpb25hbFByb3BlcnRpZXMiLAogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJhZGRpdGlvbmFsUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0eToga2V5MAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgTk9UIGhhdmUgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIwXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmFsaWdubWVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNzIoZGF0YS5hbGlnbm1lbnQsIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9hbGlnbm1lbnQiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImFsaWdubWVudCIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU3Mi5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTcyLmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS52ZXJ0aWNhbEFsaWdubWVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlNzQoZGF0YS52ZXJ0aWNhbEFsaWdubWVudCwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3ZlcnRpY2FsQWxpZ25tZW50IiwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJ2ZXJ0aWNhbEFsaWdubWVudCIsCiAgICAgICAgICAgICAgICByb290RGF0YQogICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSB2RXJyb3JzID09PSBudWxsID8gdmFsaWRhdGU3NC5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTc0LmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS53aWR0aCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGxldCBkYXRhMiA9IGRhdGEud2lkdGg7CiAgICAgICAgICAgIGlmICghKCgodHlwZW9mIGRhdGEyID09ICJudW1iZXIiKSAmJiAoIShkYXRhMiAlIDEpICYmICFpc05hTihkYXRhMikpKSAmJiAoaXNGaW5pdGUoZGF0YTIpKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVycjEgPSB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3dpZHRoIiwKICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL3dpZHRoL3R5cGUiLAogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlIiwKICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSBpbnRlZ2VyIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgodHlwZW9mIGRhdGEyID09ICJudW1iZXIiKSAmJiAoaXNGaW5pdGUoZGF0YTIpKSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEyIDwgMSB8fCBpc05hTihkYXRhMikpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIyID0gewogICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvd2lkdGgiLAogICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL3dpZHRoL21pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAibWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbjogIj49IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OiAxCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlID49IDEiCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjJdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS53cmFwV29yZCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS53cmFwV29yZCAhPT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnIzID0gewogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi93cmFwV29yZCIsCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvcHJvcGVydGllcy93cmFwV29yZC90eXBlIiwKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJib29sZWFuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgYm9vbGVhbiIKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyM107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS50cnVuY2F0ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGxldCBkYXRhNCA9IGRhdGEudHJ1bmNhdGU7CiAgICAgICAgICAgIGlmICghKCgodHlwZW9mIGRhdGE0ID09ICJudW1iZXIiKSAmJiAoIShkYXRhNCAlIDEpICYmICFpc05hTihkYXRhNCkpKSAmJiAoaXNGaW5pdGUoZGF0YTQpKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVycjQgPSB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3RydW5jYXRlIiwKICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL3RydW5jYXRlL3R5cGUiLAogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlIiwKICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSBpbnRlZ2VyIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnI0XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnI0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLnBhZGRpbmdMZWZ0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbGV0IGRhdGE1ID0gZGF0YS5wYWRkaW5nTGVmdDsKICAgICAgICAgICAgaWYgKCEoKCh0eXBlb2YgZGF0YTUgPT0gIm51bWJlciIpICYmICghKGRhdGE1ICUgMSkgJiYgIWlzTmFOKGRhdGE1KSkpICYmIChpc0Zpbml0ZShkYXRhNSkpKSkgewogICAgICAgICAgICAgICAgY29uc3QgZXJyNSA9IHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvcGFkZGluZ0xlZnQiLAogICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3Byb3BlcnRpZXMvcGFkZGluZ0xlZnQvdHlwZSIsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogInR5cGUiLAogICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIGludGVnZXIiCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEucGFkZGluZ1JpZ2h0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbGV0IGRhdGE2ID0gZGF0YS5wYWRkaW5nUmlnaHQ7CiAgICAgICAgICAgIGlmICghKCgodHlwZW9mIGRhdGE2ID09ICJudW1iZXIiKSAmJiAoIShkYXRhNiAlIDEpICYmICFpc05hTihkYXRhNikpKSAmJiAoaXNGaW5pdGUoZGF0YTYpKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVycjYgPSB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL3BhZGRpbmdSaWdodCIsCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvcHJvcGVydGllcy9wYWRkaW5nUmlnaHQvdHlwZSIsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogInR5cGUiLAogICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiaW50ZWdlciIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIGludGVnZXIiCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjZdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBjb25zdCBlcnI3ID0gewogICAgICAgICAgICBpbnN0YW5jZVBhdGgsCiAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3R5cGUiLAogICAgICAgICAgICBrZXl3b3JkOiAidHlwZSIsCiAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgdHlwZTogIm9iamVjdCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbWVzc2FnZTogIm11c3QgYmUgb2JqZWN0IgogICAgICAgIH07CiAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgdkVycm9ycyA9IFtlcnI3XTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnI3KTsKICAgICAgICB9CiAgICAgICAgZXJyb3JzKys7CiAgICB9CiAgICB2YWxpZGF0ZTExMy5lcnJvcnMgPSB2RXJyb3JzOwogICAgcmV0dXJuIGVycm9ycyA9PT0gMDsKfQpmdW5jdGlvbiB2YWxpZGF0ZTg2KGRhdGEsIHsgaW5zdGFuY2VQYXRoID0gIiIsIHBhcmVudERhdGEsIHBhcmVudERhdGFQcm9wZXJ0eSwgcm9vdERhdGEgPSBkYXRhIH0gPSB7fSkgewogICAgLyojIHNvdXJjZVVSTD0ic3RyZWFtQ29uZmlnLmpzb24iICovIDsKICAgIGxldCB2RXJyb3JzID0gbnVsbDsKICAgIGxldCBlcnJvcnMgPSAwOwogICAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT0gIm9iamVjdCIgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICBpZiAoZGF0YS5jb2x1bW5EZWZhdWx0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY29uc3QgZXJyMCA9IHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aCwKICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3JlcXVpcmVkIiwKICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJyZXF1aXJlZCIsCiAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICBtaXNzaW5nUHJvcGVydHk6ICJjb2x1bW5EZWZhdWx0IgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgJyIgKyAiY29sdW1uRGVmYXVsdCIgKyAiJyIKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyMF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmNvbHVtbkNvdW50ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY29uc3QgZXJyMSA9IHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aCwKICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICIjL3JlcXVpcmVkIiwKICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJyZXF1aXJlZCIsCiAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICBtaXNzaW5nUHJvcGVydHk6ICJjb2x1bW5Db3VudCIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBoYXZlIHJlcXVpcmVkIHByb3BlcnR5ICciICsgImNvbHVtbkNvdW50IiArICInIgogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBrZXkwIGluIGRhdGEpIHsKICAgICAgICAgICAgaWYgKCEoKCgoKGtleTAgPT09ICJib3JkZXIiKSB8fCAoa2V5MCA9PT0gImNvbHVtbnMiKSkgfHwgKGtleTAgPT09ICJjb2x1bW5EZWZhdWx0IikpIHx8IChrZXkwID09PSAiY29sdW1uQ291bnQiKSkgfHwgKGtleTAgPT09ICJkcmF3VmVydGljYWxMaW5lIikpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnIyID0gewogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aCwKICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9hZGRpdGlvbmFsUHJvcGVydGllcyIsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnR5OiBrZXkwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBOT1QgaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMiCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZXJyb3JzKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuYm9yZGVyICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCEodmFsaWRhdGU4NyhkYXRhLmJvcmRlciwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2JvcmRlciIsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhOiBkYXRhLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YVByb3BlcnR5OiAiYm9yZGVyIiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTg3LmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlODcuZXJyb3JzKTsKICAgICAgICAgICAgICAgIGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLmNvbHVtbnMgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoISh2YWxpZGF0ZTEwOShkYXRhLmNvbHVtbnMsIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogaW5zdGFuY2VQYXRoICsgIi9jb2x1bW5zIiwKICAgICAgICAgICAgICAgIHBhcmVudERhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBwYXJlbnREYXRhUHJvcGVydHk6ICJjb2x1bW5zIiwKICAgICAgICAgICAgICAgIHJvb3REYXRhCiAgICAgICAgICAgIH0pKSkgewogICAgICAgICAgICAgICAgdkVycm9ycyA9IHZFcnJvcnMgPT09IG51bGwgPyB2YWxpZGF0ZTEwOS5lcnJvcnMgOiB2RXJyb3JzLmNvbmNhdCh2YWxpZGF0ZTEwOS5lcnJvcnMpOwogICAgICAgICAgICAgICAgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEuY29sdW1uRGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghKHZhbGlkYXRlMTEzKGRhdGEuY29sdW1uRGVmYXVsdCwgewogICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2NvbHVtbkRlZmF1bHQiLAogICAgICAgICAgICAgICAgcGFyZW50RGF0YTogZGF0YSwKICAgICAgICAgICAgICAgIHBhcmVudERhdGFQcm9wZXJ0eTogImNvbHVtbkRlZmF1bHQiLAogICAgICAgICAgICAgICAgcm9vdERhdGEKICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICB2RXJyb3JzID0gdkVycm9ycyA9PT0gbnVsbCA/IHZhbGlkYXRlMTEzLmVycm9ycyA6IHZFcnJvcnMuY29uY2F0KHZhbGlkYXRlMTEzLmVycm9ycyk7CiAgICAgICAgICAgICAgICBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS5jb2x1bW5Db3VudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGxldCBkYXRhMyA9IGRhdGEuY29sdW1uQ291bnQ7CiAgICAgICAgICAgIGlmICghKCgodHlwZW9mIGRhdGEzID09ICJudW1iZXIiKSAmJiAoIShkYXRhMyAlIDEpICYmICFpc05hTihkYXRhMykpKSAmJiAoaXNGaW5pdGUoZGF0YTMpKSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVycjMgPSB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiBpbnN0YW5jZVBhdGggKyAiL2NvbHVtbkNvdW50IiwKICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL2NvbHVtbkNvdW50L3R5cGUiLAogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICJ0eXBlIiwKICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogImludGVnZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBiZSBpbnRlZ2VyIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnIzXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnIzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgodHlwZW9mIGRhdGEzID09ICJudW1iZXIiKSAmJiAoaXNGaW5pdGUoZGF0YTMpKSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEzIDwgMSB8fCBpc05hTihkYXRhMykpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnI0ID0gewogICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvY29sdW1uQ291bnQiLAogICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy9wcm9wZXJ0aWVzL2NvbHVtbkNvdW50L21pbmltdW0iLAogICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAibWluaW11bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbjogIj49IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OiAxCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlID49IDEiCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpZiAodkVycm9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2RXJyb3JzID0gW2VycjRdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdkVycm9ycy5wdXNoKGVycjQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGF0YS5kcmF3VmVydGljYWxMaW5lICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmRyYXdWZXJ0aWNhbExpbmUgIT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgY29uc3QgZXJyNSA9IHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6IGluc3RhbmNlUGF0aCArICIvZHJhd1ZlcnRpY2FsTGluZSIsCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aDogIiMvcHJvcGVydGllcy9kcmF3VmVydGljYWxMaW5lL3R5cGVvZiIsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogInR5cGVvZiIsCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7fSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAibXVzdCBwYXNzIFwidHlwZW9mXCIga2V5d29yZCB2YWxpZGF0aW9uIgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdkVycm9ycyA9IFtlcnI1XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZFcnJvcnMucHVzaChlcnI1KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgY29uc3QgZXJyNiA9IHsKICAgICAgICAgICAgaW5zdGFuY2VQYXRoLAogICAgICAgICAgICBzY2hlbWFQYXRoOiAiIy90eXBlIiwKICAgICAgICAgICAga2V5d29yZDogInR5cGUiLAogICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgIHR5cGU6ICJvYmplY3QiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG1lc3NhZ2U6ICJtdXN0IGJlIG9iamVjdCIKICAgICAgICB9OwogICAgICAgIGlmICh2RXJyb3JzID09PSBudWxsKSB7CiAgICAgICAgICAgIHZFcnJvcnMgPSBbZXJyNl07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2RXJyb3JzLnB1c2goZXJyNik7CiAgICAgICAgfQogICAgICAgIGVycm9ycysrOwogICAgfQogICAgdmFsaWRhdGU4Ni5lcnJvcnMgPSB2RXJyb3JzOwogICAgcmV0dXJuIGVycm9ycyA9PT0gMDsKfQovLyMgc291cmNlTWFwcGluZ1VSTD12YWxpZGF0b3JzLmpzLm1hcA== |
| 1 | { |
| 2 | "file": "index.js", |
| 3 | "names": [], |
| 4 | "sources": [ |
| 5 | "../../src/transform/index.ts" |
| 6 | ], |
| 7 | "version": 3, |
| 8 | "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4DAA4D;AAC5D,mDAQ0B;AAC1B,uEAAsE;AACtE,2GAA0G;AAoB1G,SAAS,kBAAkB,CAAC,UAAuB;;;QACjD,mCAAmC;QACnC,KAAwB,IAAA,eAAA,SAAA,UAAU,CAAA,sCAAA,8DAAE;YAA/B,IAAM,SAAS,uBAAA;YAClB,8BAA8B;YAC9B,IAAI,SAAS,CAAC,IAAI,KAAK,yBAAQ,CAAC,gBAAgB,EAAE;gBAChD,0CAA0C;gBAC1C,IAAM,gBAAgB,GAAqB,SAAS,CAAC;gBACrD,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,mDAAwB,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAC1E,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAC3B,uFAA0C,CAAC,gBAAgB,CAAC,CAC7D,CAAC;aACH;iBAAM,IAAI,SAAS,CAAC,IAAI,KAAK,yBAAQ,CAAC,oBAAoB,EAAE;gBAC3D,IAAM,oBAAoB,GAAyB,SAAS,CAAC;gBAC7D,kBAAkB,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;aAClD;SACF;;;;;;;;;AACH,CAAC;AAnCD;IAAuC,mCAAS;IAAvC;;IAiBT,CAAC;IAhBC;;;;;OAKG;IACH,oCAAU,GAAV,UAAW,MAAc;;QACvB,8BAA8B;QAC9B,IAAI,OAAO,GAAc,MAAc,CAAC,OAAO;YAC7C,CAAC,CAAE,MAAc,CAAC,OAAO,CAAC,OAAO;YACjC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;;YACnB,0BAA0B;YAC1B,KAAqB,IAAA,YAAA,SAAA,OAAO,CAAA,gCAAA,qDAAE;gBAAzB,IAAM,MAAM,oBAAA;gBACf,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;aACvC;;;;;;;;;IACH,CAAC;IACH,sBAAC;AAAD,CAAC,AAjBQ,CAA8B,0BAAS,GAiB9C", |
| 9 | "sourceRoot": "" |
| 10 | } |
| 1 | IWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24odCl7dmFyIHI9bmV3IGUuQnVpbGRlcjtyZXR1cm4gci5waXBlbGluZS5hZGQoZS50cmltbWVyLGUuc3RvcFdvcmRGaWx0ZXIsZS5zdGVtbWVyKSxyLnNlYXJjaFBpcGVsaW5lLmFkZChlLnN0ZW1tZXIpLHQuY2FsbChyLHIpLHIuYnVpbGQoKX07ZS52ZXJzaW9uPSIyLjMuNyIsZS51dGlscz17fSxlLnV0aWxzLndhcm49ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2UuY29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4odCl9fSh0aGlzKSxlLnV0aWxzLmFzU3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOmUudG9TdHJpbmcoKX0sZS51dGlscy5jbG9uZT1mdW5jdGlvbihlKXtpZihudWxsPT1lKXJldHVybiBlO2Zvcih2YXIgdD1PYmplY3QuY3JlYXRlKG51bGwpLHI9T2JqZWN0LmtleXMoZSksaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgbj1yW2ldLHM9ZVtuXTtpZihBcnJheS5pc0FycmF5KHMpKXRbbl09cy5zbGljZSgpO2Vsc2V7aWYoInN0cmluZyIhPXR5cGVvZiBzJiYibnVtYmVyIiE9dHlwZW9mIHMmJiJib29sZWFuIiE9dHlwZW9mIHMpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2xvbmUgaXMgbm90IGRlZXAgYW5kIGRvZXMgbm90IHN1cHBvcnQgbmVzdGVkIG9iamVjdHMiKTt0W25dPXN9fXJldHVybiB0fSxlLkZpZWxkUmVmPWZ1bmN0aW9uKGUsdCxyKXt0aGlzLmRvY1JlZj1lLHRoaXMuZmllbGROYW1lPXQsdGhpcy5fc3RyaW5nVmFsdWU9cn0sZS5GaWVsZFJlZi5qb2luZXI9Ii8iLGUuRmllbGRSZWYuZnJvbVN0cmluZz1mdW5jdGlvbih0KXt2YXIgcj10LmluZGV4T2YoZS5GaWVsZFJlZi5qb2luZXIpO2lmKC0xPT09cil0aHJvdyJtYWxmb3JtZWQgZmllbGQgcmVmIHN0cmluZyI7dmFyIGk9dC5zbGljZSgwLHIpLG49dC5zbGljZShyKzEpO3JldHVybiBuZXcgZS5GaWVsZFJlZihuLGksdCl9LGUuRmllbGRSZWYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXRoaXMuX3N0cmluZ1ZhbHVlJiYodGhpcy5fc3RyaW5nVmFsdWU9dGhpcy5maWVsZE5hbWUrZS5GaWVsZFJlZi5qb2luZXIrdGhpcy5kb2NSZWYpLHRoaXMuX3N0cmluZ1ZhbHVlfSxlLlNldD1mdW5jdGlvbihlKXtpZih0aGlzLmVsZW1lbnRzPU9iamVjdC5jcmVhdGUobnVsbCksZSl7dGhpcy5sZW5ndGg9ZS5sZW5ndGg7Zm9yKHZhciB0PTA7dDx0aGlzLmxlbmd0aDt0KyspdGhpcy5lbGVtZW50c1tlW3RdXT0hMH1lbHNlIHRoaXMubGVuZ3RoPTB9LGUuU2V0LmNvbXBsZXRlPXtpbnRlcnNlY3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHVuaW9uOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxjb250YWluczpmdW5jdGlvbigpe3JldHVybiEwfX0sZS5TZXQuZW1wdHk9e2ludGVyc2VjdDpmdW5jdGlvbigpe3JldHVybiB0aGlzfSx1bmlvbjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sY29udGFpbnM6ZnVuY3Rpb24oKXtyZXR1cm4hMX19LGUuU2V0LnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbihlKXtyZXR1cm4hIXRoaXMuZWxlbWVudHNbZV19LGUuU2V0LnByb3RvdHlwZS5pbnRlcnNlY3Q9ZnVuY3Rpb24odCl7dmFyIHIsaSxuLHM9W107aWYodD09PWUuU2V0LmNvbXBsZXRlKXJldHVybiB0aGlzO2lmKHQ9PT1lLlNldC5lbXB0eSlyZXR1cm4gdDtpPXRoaXMubGVuZ3RoPHQubGVuZ3RoPyhyPXRoaXMsdCk6KHI9dCx0aGlzKSxuPU9iamVjdC5rZXlzKHIuZWxlbWVudHMpO2Zvcih2YXIgbz0wO288bi5sZW5ndGg7bysrKXt2YXIgYT1uW29dO2EgaW4gaS5lbGVtZW50cyYmcy5wdXNoKGEpfXJldHVybiBuZXcgZS5TZXQocyl9LGUuU2V0LnByb3RvdHlwZS51bmlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdD09PWUuU2V0LmNvbXBsZXRlP2UuU2V0LmNvbXBsZXRlOnQ9PT1lLlNldC5lbXB0eT90aGlzOm5ldyBlLlNldChPYmplY3Qua2V5cyh0aGlzLmVsZW1lbnRzKS5jb25jYXQoT2JqZWN0LmtleXModC5lbGVtZW50cykpKX0sZS5pZGY9ZnVuY3Rpb24oZSx0KXt2YXIgcj0wO2Zvcih2YXIgaSBpbiBlKSJfaW5kZXgiIT1pJiYocis9T2JqZWN0LmtleXMoZVtpXSkubGVuZ3RoKTt2YXIgbj0odC1yKy41KS8ocisuNSk7cmV0dXJuIE1hdGgubG9nKDErTWF0aC5hYnMobikpfSxlLlRva2VuPWZ1bmN0aW9uKGUsdCl7dGhpcy5zdHI9ZXx8IiIsdGhpcy5tZXRhZGF0YT10fHx7fX0sZS5Ub2tlbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHJ9LGUuVG9rZW4ucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zdHI9ZSh0aGlzLnN0cix0aGlzLm1ldGFkYXRhKSx0aGlzfSxlLlRva2VuLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gdD10fHxmdW5jdGlvbihlKXtyZXR1cm4gZX0sbmV3IGUuVG9rZW4odCh0aGlzLnN0cix0aGlzLm1ldGFkYXRhKSx0aGlzLm1ldGFkYXRhKX0sZS50b2tlbml6ZXI9ZnVuY3Rpb24odCxyKXtpZihudWxsPT10fHxudWxsPT10KXJldHVybltdO2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZS5Ub2tlbihlLnV0aWxzLmFzU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCksZS51dGlscy5jbG9uZShyKSl9KTtmb3IodmFyIGk9dC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCksbj1pLmxlbmd0aCxzPVtdLG89MCxhPTA7bzw9bjtvKyspe3ZhciBsPW8tYTtpZihpLmNoYXJBdChvKS5tYXRjaChlLnRva2VuaXplci5zZXBhcmF0b3IpfHxvPT1uKXtpZigwPGwpe3ZhciBjPWUudXRpbHMuY2xvbmUocil8fHt9O2MucG9zaXRpb249W2EsbF0sYy5pbmRleD1zLmxlbmd0aCxzLnB1c2gobmV3IGUuVG9rZW4oaS5zbGljZShhLG8pLGMpKX1hPW8rMX19cmV0dXJuIHN9LGUudG9rZW5pemVyLnNlcGFyYXRvcj0vW1xzXC1dKy8sZS5QaXBlbGluZT1mdW5jdGlvbigpe3RoaXMuX3N0YWNrPVtdfSxlLlBpcGVsaW5lLnJlZ2lzdGVyZWRGdW5jdGlvbnM9T2JqZWN0LmNyZWF0ZShudWxsKSxlLlBpcGVsaW5lLnJlZ2lzdGVyRnVuY3Rpb249ZnVuY3Rpb24odCxyKXtyIGluIHRoaXMucmVnaXN0ZXJlZEZ1bmN0aW9ucyYmZS51dGlscy53YXJuKCJPdmVyd3JpdGluZyBleGlzdGluZyByZWdpc3RlcmVkIGZ1bmN0aW9uOiAiK3IpLHQubGFiZWw9cixlLlBpcGVsaW5lLnJlZ2lzdGVyZWRGdW5jdGlvbnNbdC5sYWJlbF09dH0sZS5QaXBlbGluZS53YXJuSWZGdW5jdGlvbk5vdFJlZ2lzdGVyZWQ9ZnVuY3Rpb24odCl7dC5sYWJlbCYmdC5sYWJlbCBpbiB0aGlzLnJlZ2lzdGVyZWRGdW5jdGlvbnN8fGUudXRpbHMud2FybigiRnVuY3Rpb24gaXMgbm90IHJlZ2lzdGVyZWQgd2l0aCBwaXBlbGluZS4gVGhpcyBtYXkgY2F1c2UgcHJvYmxlbXMgd2hlbiBzZXJpYWxpc2luZyB0aGUgaW5kZXguXG4iLHQpfSxlLlBpcGVsaW5lLmxvYWQ9ZnVuY3Rpb24odCl7dmFyIHI9bmV3IGUuUGlwZWxpbmU7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgaT1lLlBpcGVsaW5lLnJlZ2lzdGVyZWRGdW5jdGlvbnNbdF07aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgbG9hZCB1bnJlZ2lzdGVyZWQgZnVuY3Rpb246ICIrdCk7ci5hZGQoaSl9KSxyfSxlLlBpcGVsaW5lLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmZvckVhY2goZnVuY3Rpb24odCl7ZS5QaXBlbGluZS53YXJuSWZGdW5jdGlvbk5vdFJlZ2lzdGVyZWQodCksdGhpcy5fc3RhY2sucHVzaCh0KX0sdGhpcyl9LGUuUGlwZWxpbmUucHJvdG90eXBlLmFmdGVyPWZ1bmN0aW9uKHQscil7ZS5QaXBlbGluZS53YXJuSWZGdW5jdGlvbk5vdFJlZ2lzdGVyZWQocik7dmFyIGk9dGhpcy5fc3RhY2suaW5kZXhPZih0KTtpZigtMT09aSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIGV4aXN0aW5nRm4iKTtpKz0xLHRoaXMuX3N0YWNrLnNwbGljZShpLDAscil9LGUuUGlwZWxpbmUucHJvdG90eXBlLmJlZm9yZT1mdW5jdGlvbih0LHIpe2UuUGlwZWxpbmUud2FybklmRnVuY3Rpb25Ob3RSZWdpc3RlcmVkKHIpO3ZhciBpPXRoaXMuX3N0YWNrLmluZGV4T2YodCk7aWYoLTE9PWkpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBleGlzdGluZ0ZuIik7dGhpcy5fc3RhY2suc3BsaWNlKGksMCxyKX0sZS5QaXBlbGluZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3N0YWNrLmluZGV4T2YoZSk7LTEhPXQmJnRoaXMuX3N0YWNrLnNwbGljZSh0LDEpfSxlLlBpcGVsaW5lLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMuX3N0YWNrLmxlbmd0aCxyPTA7cjx0O3IrKyl7Zm9yKHZhciBpPXRoaXMuX3N0YWNrW3JdLG49W10scz0wO3M8ZS5sZW5ndGg7cysrKXt2YXIgbz1pKGVbc10scyxlKTtpZihudWxsIT1vJiYiIiE9PW8paWYoQXJyYXkuaXNBcnJheShvKSlmb3IodmFyIGE9MDthPG8ubGVuZ3RoO2ErKyluLnB1c2gob1thXSk7ZWxzZSBuLnB1c2gobyl9ZT1ufXJldHVybiBlfSxlLlBpcGVsaW5lLnByb3RvdHlwZS5ydW5TdHJpbmc9ZnVuY3Rpb24odCxyKXt2YXIgaT1uZXcgZS5Ub2tlbih0LHIpO3JldHVybiB0aGlzLnJ1bihbaV0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1N0cmluZygpfSl9LGUuUGlwZWxpbmUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5fc3RhY2s9W119LGUuUGlwZWxpbmUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGFjay5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGUuUGlwZWxpbmUud2FybklmRnVuY3Rpb25Ob3RSZWdpc3RlcmVkKHQpLHQubGFiZWx9KX0sZS5WZWN0b3I9ZnVuY3Rpb24oZSl7dGhpcy5fbWFnbml0dWRlPTAsdGhpcy5lbGVtZW50cz1lfHxbXX0sZS5WZWN0b3IucHJvdG90eXBlLnBvc2l0aW9uRm9ySW5kZXg9ZnVuY3Rpb24oZSl7aWYoMD09dGhpcy5lbGVtZW50cy5sZW5ndGgpcmV0dXJuIDA7Zm9yKHZhciB0PTAscj10aGlzLmVsZW1lbnRzLmxlbmd0aC8yLGk9ci10LG49TWF0aC5mbG9vcihpLzIpLHM9dGhpcy5lbGVtZW50c1syKm5dOzE8aSYmKHM8ZSYmKHQ9biksZTxzJiYocj1uKSxzIT1lKTspaT1yLXQsbj10K01hdGguZmxvb3IoaS8yKSxzPXRoaXMuZWxlbWVudHNbMipuXTtyZXR1cm4gcz09ZT8yKm46ZTxzPzIqbjpzPGU/MioobisxKTp2b2lkIDB9LGUuVmVjdG9yLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24oZSx0KXt0aGlzLnVwc2VydChlLHQsZnVuY3Rpb24oKXt0aHJvdyJkdXBsaWNhdGUgaW5kZXgifSl9LGUuVmVjdG9yLnByb3RvdHlwZS51cHNlcnQ9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuX21hZ25pdHVkZT0wO3ZhciBpPXRoaXMucG9zaXRpb25Gb3JJbmRleChlKTt0aGlzLmVsZW1lbnRzW2ldPT1lP3RoaXMuZWxlbWVudHNbaSsxXT1yKHRoaXMuZWxlbWVudHNbaSsxXSx0KTp0aGlzLmVsZW1lbnRzLnNwbGljZShpLDAsZSx0KX0sZS5WZWN0b3IucHJvdG90eXBlLm1hZ25pdHVkZT1mdW5jdGlvbigpe2lmKHRoaXMuX21hZ25pdHVkZSlyZXR1cm4gdGhpcy5fbWFnbml0dWRlO2Zvcih2YXIgZT0wLHQ9dGhpcy5lbGVtZW50cy5sZW5ndGgscj0xO3I8dDtyKz0yKXt2YXIgaT10aGlzLmVsZW1lbnRzW3JdO2UrPWkqaX1yZXR1cm4gdGhpcy5fbWFnbml0dWRlPU1hdGguc3FydChlKX0sZS5WZWN0b3IucHJvdG90eXBlLmRvdD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxyPXRoaXMuZWxlbWVudHMsaT1lLmVsZW1lbnRzLG49ci5sZW5ndGgscz1pLmxlbmd0aCxvPTAsYT0wLHU9MCxsPTA7dTxuJiZsPHM7KShvPXJbdV0pPChhPWlbbF0pP3UrPTI6YTxvP2wrPTI6bz09YSYmKHQrPXJbdSsxXSppW2wrMV0sdSs9MixsKz0yKTtyZXR1cm4gdH0sZS5WZWN0b3IucHJvdG90eXBlLnNpbWlsYXJpdHk9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZG90KGUpL3RoaXMubWFnbml0dWRlKCl8fDB9LGUuVmVjdG9yLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0aGlzLmVsZW1lbnRzLmxlbmd0aC8yKSx0PTEscj0wO3Q8dGhpcy5lbGVtZW50cy5sZW5ndGg7dCs9MixyKyspZVtyXT10aGlzLmVsZW1lbnRzW3RdO3JldHVybiBlfSxlLlZlY3Rvci5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHN9LGUuc3RlbW1lcj1mdW5jdGlvbigpe3ZhciBlPXthdGlvbmFsOiJhdGUiLHRpb25hbDoidGlvbiIsZW5jaToiZW5jZSIsYW5jaToiYW5jZSIsaXplcjoiaXplIixibGk6ImJsZSIsYWxsaToiYWwiLGVudGxpOiJlbnQiLGVsaToiZSIsb3VzbGk6Im91cyIsaXphdGlvbjoiaXplIixhdGlvbjoiYXRlIixhdG9yOiJhdGUiLGFsaXNtOiJhbCIsaXZlbmVzczoiaXZlIixmdWxuZXNzOiJmdWwiLG91c25lc3M6Im91cyIsYWxpdGk6ImFsIixpdml0aToiaXZlIixiaWxpdGk6ImJsZSIsbG9naToibG9nIn0sdD17aWNhdGU6ImljIixhdGl2ZToiIixhbGl6ZToiYWwiLGljaXRpOiJpYyIsaWNhbDoiaWMiLGZ1bDoiIixuZXNzOiIifSxpPSJbYWVpb3V5XSIsbj0iW15hZWlvdV1bXmFlaW91eV0qIixjPW5ldyBSZWdFeHAoIl4oW15hZWlvdV1bXmFlaW91eV0qKT9bYWVpb3V5XVthZWlvdV0qW15hZWlvdV1bXmFlaW91eV0qIiksaD1uZXcgUmVnRXhwKCJeKFteYWVpb3VdW15hZWlvdXldKik/W2FlaW91eV1bYWVpb3VdKlteYWVpb3VdW15hZWlvdXldKlthZWlvdXldW2FlaW91XSpbXmFlaW91XVteYWVpb3V5XSoiKSxkPW5ldyBSZWdFeHAoIl4oW15hZWlvdV1bXmFlaW91eV0qKT9bYWVpb3V5XVthZWlvdV0qW15hZWlvdV1bXmFlaW91eV0qKFthZWlvdXldW2FlaW91XSopPyQiKSxmPW5ldyBSZWdFeHAoIl4oW15hZWlvdV1bXmFlaW91eV0qKT9bYWVpb3V5XSIpLHA9L14oLis/KShzc3xpKWVzJC8seT0vXiguKz8pKFtec10pcyQvLG09L14oLis/KWVlZCQvLHY9L14oLis/KShlZHxpbmcpJC8sZz0vLiQvLHg9LyhhdHxibHxpeikkLyx3PW5ldyBSZWdFeHAoIihbXmFlaW91eWxzel0pXFwxJCIpLFE9bmV3IFJlZ0V4cCgiXiIrbitpKyJbXmFlaW91d3h5XSQiKSxrPS9eKC4rP1teYWVpb3VdKXkkLyxTPS9eKC4rPykoYXRpb25hbHx0aW9uYWx8ZW5jaXxhbmNpfGl6ZXJ8YmxpfGFsbGl8ZW50bGl8ZWxpfG91c2xpfGl6YXRpb258YXRpb258YXRvcnxhbGlzbXxpdmVuZXNzfGZ1bG5lc3N8b3VzbmVzc3xhbGl0aXxpdml0aXxiaWxpdGl8bG9naSkkLyxFPS9eKC4rPykoaWNhdGV8YXRpdmV8YWxpemV8aWNpdGl8aWNhbHxmdWx8bmVzcykkLyxMPS9eKC4rPykoYWx8YW5jZXxlbmNlfGVyfGljfGFibGV8aWJsZXxhbnR8ZW1lbnR8bWVudHxlbnR8b3V8aXNtfGF0ZXxpdGl8b3VzfGl2ZXxpemUpJC8sYj0vXiguKz8pKHN8dCkoaW9uKSQvLFA9L14oLis/KWUkLyxUPS9sbCQvLE89bmV3IFJlZ0V4cCgiXiIrbitpKyJbXmFlaW91d3h5XSQiKSxJPWZ1bmN0aW9uKHIpe3ZhciBpLG4scyxvLGEsdSxsO2lmKHIubGVuZ3RoPDMpcmV0dXJuIHI7aWYoInkiPT0ocz1yLnN1YnN0cigwLDEpKSYmKHI9cy50b1VwcGVyQ2FzZSgpK3Iuc3Vic3RyKDEpKSxhPXksKG89cCkudGVzdChyKT9yPXIucmVwbGFjZShvLCIkMSQyIik6YS50ZXN0KHIpJiYocj1yLnJlcGxhY2UoYSwiJDEkMiIpKSxhPXYsKG89bSkudGVzdChyKSl7dmFyIEk9by5leGVjKHIpOyhvPWMpLnRlc3QoSVsxXSkmJihvPWcscj1yLnJlcGxhY2UobywiIikpfWVsc2UgaWYoYS50ZXN0KHIpKXtpPShJPWEuZXhlYyhyKSlbMV0sKGE9ZikudGVzdChpKSYmKHU9dyxsPVEsKGE9eCkudGVzdChyPWkpP3IrPSJlIjp1LnRlc3Qocik/KG89ZyxyPXIucmVwbGFjZShvLCIiKSk6bC50ZXN0KHIpJiYocis9ImUiKSl9KG89aykudGVzdChyKSYmKHI9KGk9KEk9by5leGVjKHIpKVsxXSkrImkiKTsobz1TKS50ZXN0KHIpJiYoaT0oST1vLmV4ZWMocikpWzFdLG49SVsyXSwobz1jKS50ZXN0KGkpJiYocj1pK2Vbbl0pKTsobz1FKS50ZXN0KHIpJiYoaT0oST1vLmV4ZWMocikpWzFdLG49SVsyXSwobz1jKS50ZXN0KGkpJiYocj1pK3Rbbl0pKTtpZihhPWIsKG89TCkudGVzdChyKSlpPShJPW8uZXhlYyhyKSlbMV0sKG89aCkudGVzdChpKSYmKHI9aSk7ZWxzZSBpZihhLnRlc3Qocikpe2k9KEk9YS5leGVjKHIpKVsxXStJWzJdLChhPWgpLnRlc3QoaSkmJihyPWkpfShvPVApLnRlc3QocikmJihpPShJPW8uZXhlYyhyKSlbMV0sYT1kLHU9TywoKG89aCkudGVzdChpKXx8YS50ZXN0KGkpJiYhdS50ZXN0KGkpKSYmKHI9aSkpO3JldHVybiBhPWgsKG89VCkudGVzdChyKSYmYS50ZXN0KHIpJiYobz1nLHI9ci5yZXBsYWNlKG8sIiIpKSwieSI9PXMmJihyPXMudG9Mb3dlckNhc2UoKStyLnN1YnN0cigxKSkscn07cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLnVwZGF0ZShJKX19KCksZS5QaXBlbGluZS5yZWdpc3RlckZ1bmN0aW9uKGUuc3RlbW1lciwic3RlbW1lciIpLGUuZ2VuZXJhdGVTdG9wV29yZEZpbHRlcj1mdW5jdGlvbihlKXt2YXIgdD1lLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlW3RdPXQsZX0se30pO3JldHVybiBmdW5jdGlvbihlKXtpZihlJiZ0W2UudG9TdHJpbmcoKV0hPT1lLnRvU3RyaW5nKCkpcmV0dXJuIGV9fSxlLnN0b3BXb3JkRmlsdGVyPWUuZ2VuZXJhdGVTdG9wV29yZEZpbHRlcihbImEiLCJhYmxlIiwiYWJvdXQiLCJhY3Jvc3MiLCJhZnRlciIsImFsbCIsImFsbW9zdCIsImFsc28iLCJhbSIsImFtb25nIiwiYW4iLCJhbmQiLCJhbnkiLCJhcmUiLCJhcyIsImF0IiwiYmUiLCJiZWNhdXNlIiwiYmVlbiIsImJ1dCIsImJ5IiwiY2FuIiwiY2Fubm90IiwiY291bGQiLCJkZWFyIiwiZGlkIiwiZG8iLCJkb2VzIiwiZWl0aGVyIiwiZWxzZSIsImV2ZXIiLCJldmVyeSIsImZvciIsImZyb20iLCJnZXQiLCJnb3QiLCJoYWQiLCJoYXMiLCJoYXZlIiwiaGUiLCJoZXIiLCJoZXJzIiwiaGltIiwiaGlzIiwiaG93IiwiaG93ZXZlciIsImkiLCJpZiIsImluIiwiaW50byIsImlzIiwiaXQiLCJpdHMiLCJqdXN0IiwibGVhc3QiLCJsZXQiLCJsaWtlIiwibGlrZWx5IiwibWF5IiwibWUiLCJtaWdodCIsIm1vc3QiLCJtdXN0IiwibXkiLCJuZWl0aGVyIiwibm8iLCJub3IiLCJub3QiLCJvZiIsIm9mZiIsIm9mdGVuIiwib24iLCJvbmx5Iiwib3IiLCJvdGhlciIsIm91ciIsIm93biIsInJhdGhlciIsInNhaWQiLCJzYXkiLCJzYXlzIiwic2hlIiwic2hvdWxkIiwic2luY2UiLCJzbyIsInNvbWUiLCJ0aGFuIiwidGhhdCIsInRoZSIsInRoZWlyIiwidGhlbSIsInRoZW4iLCJ0aGVyZSIsInRoZXNlIiwidGhleSIsInRoaXMiLCJ0aXMiLCJ0byIsInRvbyIsInR3YXMiLCJ1cyIsIndhbnRzIiwid2FzIiwid2UiLCJ3ZXJlIiwid2hhdCIsIndoZW4iLCJ3aGVyZSIsIndoaWNoIiwid2hpbGUiLCJ3aG8iLCJ3aG9tIiwid2h5Iiwid2lsbCIsIndpdGgiLCJ3b3VsZCIsInlldCIsInlvdSIsInlvdXIiXSksZS5QaXBlbGluZS5yZWdpc3RlckZ1bmN0aW9uKGUuc3RvcFdvcmRGaWx0ZXIsInN0b3BXb3JkRmlsdGVyIiksZS50cmltbWVyPWZ1bmN0aW9uKGUpe3JldHVybiBlLnVwZGF0ZShmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9eXFcrLywiIikucmVwbGFjZSgvXFcrJC8sIiIpfSl9LGUuUGlwZWxpbmUucmVnaXN0ZXJGdW5jdGlvbihlLnRyaW1tZXIsInRyaW1tZXIiKSxlLlRva2VuU2V0PWZ1bmN0aW9uKCl7dGhpcy5maW5hbD0hMSx0aGlzLmVkZ2VzPXt9LHRoaXMuaWQ9ZS5Ub2tlblNldC5fbmV4dElkLGUuVG9rZW5TZXQuX25leHRJZCs9MX0sZS5Ub2tlblNldC5fbmV4dElkPTEsZS5Ub2tlblNldC5mcm9tQXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciByPW5ldyBlLlRva2VuU2V0LkJ1aWxkZXIsaT0wLG49dC5sZW5ndGg7aTxuO2krKylyLmluc2VydCh0W2ldKTtyZXR1cm4gci5maW5pc2goKSxyLnJvb3R9LGUuVG9rZW5TZXQuZnJvbUNsYXVzZT1mdW5jdGlvbih0KXtyZXR1cm4iZWRpdERpc3RhbmNlImluIHQ/ZS5Ub2tlblNldC5mcm9tRnV6enlTdHJpbmcodC50ZXJtLHQuZWRpdERpc3RhbmNlKTplLlRva2VuU2V0LmZyb21TdHJpbmcodC50ZXJtKX0sZS5Ub2tlblNldC5mcm9tRnV6enlTdHJpbmc9ZnVuY3Rpb24odCxyKXtmb3IodmFyIGk9bmV3IGUuVG9rZW5TZXQsbj1be25vZGU6aSxlZGl0c1JlbWFpbmluZzpyLHN0cjp0fV07bi5sZW5ndGg7KXt2YXIgcz1uLnBvcCgpO2lmKDA8cy5zdHIubGVuZ3RoKXt2YXIgbyxhPXMuc3RyLmNoYXJBdCgwKTthIGluIHMubm9kZS5lZGdlcz9vPXMubm9kZS5lZGdlc1thXToobz1uZXcgZS5Ub2tlblNldCxzLm5vZGUuZWRnZXNbYV09byksMT09cy5zdHIubGVuZ3RoJiYoby5maW5hbD0hMCksbi5wdXNoKHtub2RlOm8sZWRpdHNSZW1haW5pbmc6cy5lZGl0c1JlbWFpbmluZyxzdHI6cy5zdHIuc2xpY2UoMSl9KX1pZigwIT1zLmVkaXRzUmVtYWluaW5nKXtpZigiKiJpbiBzLm5vZGUuZWRnZXMpdmFyIHU9cy5ub2RlLmVkZ2VzWyIqIl07ZWxzZXt1PW5ldyBlLlRva2VuU2V0O3Mubm9kZS5lZGdlc1siKiJdPXV9aWYoMD09cy5zdHIubGVuZ3RoJiYodS5maW5hbD0hMCksbi5wdXNoKHtub2RlOnUsZWRpdHNSZW1haW5pbmc6cy5lZGl0c1JlbWFpbmluZy0xLHN0cjpzLnN0cn0pLDE8cy5zdHIubGVuZ3RoJiZuLnB1c2goe25vZGU6cy5ub2RlLGVkaXRzUmVtYWluaW5nOnMuZWRpdHNSZW1haW5pbmctMSxzdHI6cy5zdHIuc2xpY2UoMSl9KSwxPT1zLnN0ci5sZW5ndGgmJihzLm5vZGUuZmluYWw9ITApLDE8PXMuc3RyLmxlbmd0aCl7aWYoIioiaW4gcy5ub2RlLmVkZ2VzKXZhciBsPXMubm9kZS5lZGdlc1siKiJdO2Vsc2V7bD1uZXcgZS5Ub2tlblNldDtzLm5vZGUuZWRnZXNbIioiXT1sfTE9PXMuc3RyLmxlbmd0aCYmKGwuZmluYWw9ITApLG4ucHVzaCh7bm9kZTpsLGVkaXRzUmVtYWluaW5nOnMuZWRpdHNSZW1haW5pbmctMSxzdHI6cy5zdHIuc2xpY2UoMSl9KX1pZigxPHMuc3RyLmxlbmd0aCl7dmFyIGMsaD1zLnN0ci5jaGFyQXQoMCksZD1zLnN0ci5jaGFyQXQoMSk7ZCBpbiBzLm5vZGUuZWRnZXM/Yz1zLm5vZGUuZWRnZXNbZF06KGM9bmV3IGUuVG9rZW5TZXQscy5ub2RlLmVkZ2VzW2RdPWMpLDE9PXMuc3RyLmxlbmd0aCYmKGMuZmluYWw9ITApLG4ucHVzaCh7bm9kZTpjLGVkaXRzUmVtYWluaW5nOnMuZWRpdHNSZW1haW5pbmctMSxzdHI6aCtzLnN0ci5zbGljZSgyKX0pfX19cmV0dXJuIGl9LGUuVG9rZW5TZXQuZnJvbVN0cmluZz1mdW5jdGlvbih0KXtmb3IodmFyIHI9bmV3IGUuVG9rZW5TZXQsaT1yLG49MCxzPXQubGVuZ3RoO248cztuKyspe3ZhciBvPXRbbl0sYT1uPT1zLTE7aWYoIioiPT1vKShyLmVkZ2VzW29dPXIpLmZpbmFsPWE7ZWxzZXt2YXIgdT1uZXcgZS5Ub2tlblNldDt1LmZpbmFsPWEsci5lZGdlc1tvXT11LHI9dX19cmV0dXJuIGl9LGUuVG9rZW5TZXQucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1be3ByZWZpeDoiIixub2RlOnRoaXN9XTt0Lmxlbmd0aDspe3ZhciByPXQucG9wKCksaT1PYmplY3Qua2V5cyhyLm5vZGUuZWRnZXMpLG49aS5sZW5ndGg7ci5ub2RlLmZpbmFsJiYoci5wcmVmaXguY2hhckF0KDApLGUucHVzaChyLnByZWZpeCkpO2Zvcih2YXIgcz0wO3M8bjtzKyspe3ZhciBvPWlbc107dC5wdXNoKHtwcmVmaXg6ci5wcmVmaXguY29uY2F0KG8pLG5vZGU6ci5ub2RlLmVkZ2VzW29dfSl9fXJldHVybiBlfSxlLlRva2VuU2V0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2lmKHRoaXMuX3N0cilyZXR1cm4gdGhpcy5fc3RyO2Zvcih2YXIgZT10aGlzLmZpbmFsPyIxIjoiMCIsdD1PYmplY3Qua2V5cyh0aGlzLmVkZ2VzKS5zb3J0KCkscj10Lmxlbmd0aCxpPTA7aTxyO2krKyl7dmFyIG49dFtpXTtlPWUrbit0aGlzLmVkZ2VzW25dLmlkfXJldHVybiBlfSxlLlRva2VuU2V0LnByb3RvdHlwZS5pbnRlcnNlY3Q9ZnVuY3Rpb24odCl7Zm9yKHZhciByPW5ldyBlLlRva2VuU2V0LGk9dm9pZCAwLG49W3txTm9kZTp0LG91dHB1dDpyLG5vZGU6dGhpc31dO24ubGVuZ3RoOyl7aT1uLnBvcCgpO2Zvcih2YXIgcz1PYmplY3Qua2V5cyhpLnFOb2RlLmVkZ2VzKSxvPXMubGVuZ3RoLGE9T2JqZWN0LmtleXMoaS5ub2RlLmVkZ2VzKSx1PWEubGVuZ3RoLGw9MDtsPG87bCsrKWZvcih2YXIgYz1zW2xdLGg9MDtoPHU7aCsrKXt2YXIgZD1hW2hdO2lmKGQ9PWN8fCIqIj09Yyl7dmFyIGY9aS5ub2RlLmVkZ2VzW2RdLHA9aS5xTm9kZS5lZGdlc1tjXSx5PWYuZmluYWwmJnAuZmluYWwsbT12b2lkIDA7ZCBpbiBpLm91dHB1dC5lZGdlcz8obT1pLm91dHB1dC5lZGdlc1tkXSkuZmluYWw9bS5maW5hbHx8eTooKG09bmV3IGUuVG9rZW5TZXQpLmZpbmFsPXksaS5vdXRwdXQuZWRnZXNbZF09bSksbi5wdXNoKHtxTm9kZTpwLG91dHB1dDptLG5vZGU6Zn0pfX19cmV0dXJuIHJ9LGUuVG9rZW5TZXQuQnVpbGRlcj1mdW5jdGlvbigpe3RoaXMucHJldmlvdXNXb3JkPSIiLHRoaXMucm9vdD1uZXcgZS5Ub2tlblNldCx0aGlzLnVuY2hlY2tlZE5vZGVzPVtdLHRoaXMubWluaW1pemVkTm9kZXM9e319LGUuVG9rZW5TZXQuQnVpbGRlci5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQpe3ZhciByLGk9MDtpZih0PHRoaXMucHJldmlvdXNXb3JkKXRocm93IG5ldyBFcnJvcigiT3V0IG9mIG9yZGVyIHdvcmQgaW5zZXJ0aW9uIik7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aCYmbjx0aGlzLnByZXZpb3VzV29yZC5sZW5ndGgmJnRbbl09PXRoaXMucHJldmlvdXNXb3JkW25dO24rKylpKys7dGhpcy5taW5pbWl6ZShpKSxyPTA9PXRoaXMudW5jaGVja2VkTm9kZXMubGVuZ3RoP3RoaXMucm9vdDp0aGlzLnVuY2hlY2tlZE5vZGVzW3RoaXMudW5jaGVja2VkTm9kZXMubGVuZ3RoLTFdLmNoaWxkO2ZvcihuPWk7bjx0Lmxlbmd0aDtuKyspe3ZhciBzPW5ldyBlLlRva2VuU2V0LG89dFtuXTtyLmVkZ2VzW29dPXMsdGhpcy51bmNoZWNrZWROb2Rlcy5wdXNoKHtwYXJlbnQ6cixjaGFyOm8sY2hpbGQ6c30pLHI9c31yLmZpbmFsPSEwLHRoaXMucHJldmlvdXNXb3JkPXR9LGUuVG9rZW5TZXQuQnVpbGRlci5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKCl7dGhpcy5taW5pbWl6ZSgwKX0sZS5Ub2tlblNldC5CdWlsZGVyLnByb3RvdHlwZS5taW5pbWl6ZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy51bmNoZWNrZWROb2Rlcy5sZW5ndGgtMTtlPD10O3QtLSl7dmFyIHI9dGhpcy51bmNoZWNrZWROb2Rlc1t0XSxpPXIuY2hpbGQudG9TdHJpbmcoKTtpIGluIHRoaXMubWluaW1pemVkTm9kZXM/ci5wYXJlbnQuZWRnZXNbci5jaGFyXT10aGlzLm1pbmltaXplZE5vZGVzW2ldOihyLmNoaWxkLl9zdHI9aSx0aGlzLm1pbmltaXplZE5vZGVzW2ldPXIuY2hpbGQpLHRoaXMudW5jaGVja2VkTm9kZXMucG9wKCl9fSxlLkluZGV4PWZ1bmN0aW9uKGUpe3RoaXMuaW52ZXJ0ZWRJbmRleD1lLmludmVydGVkSW5kZXgsdGhpcy5maWVsZFZlY3RvcnM9ZS5maWVsZFZlY3RvcnMsdGhpcy50b2tlblNldD1lLnRva2VuU2V0LHRoaXMuZmllbGRzPWUuZmllbGRzLHRoaXMucGlwZWxpbmU9ZS5waXBlbGluZX0sZS5JbmRleC5wcm90b3R5cGUuc2VhcmNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKHIpe25ldyBlLlF1ZXJ5UGFyc2VyKHQscikucGFyc2UoKX0pfSxlLkluZGV4LnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbih0KXtmb3IodmFyIHI9bmV3IGUuUXVlcnkodGhpcy5maWVsZHMpLGk9T2JqZWN0LmNyZWF0ZShudWxsKSxuPU9iamVjdC5jcmVhdGUobnVsbCkscz1PYmplY3QuY3JlYXRlKG51bGwpLG89T2JqZWN0LmNyZWF0ZShudWxsKSxhPU9iamVjdC5jcmVhdGUobnVsbCksdT0wO3U8dGhpcy5maWVsZHMubGVuZ3RoO3UrKyluW3RoaXMuZmllbGRzW3VdXT1uZXcgZS5WZWN0b3I7dC5jYWxsKHIscik7Zm9yKHU9MDt1PHIuY2xhdXNlcy5sZW5ndGg7dSsrKXt2YXIgYyxsPXIuY2xhdXNlc1t1XSxoPWUuU2V0LmNvbXBsZXRlO2M9bC51c2VQaXBlbGluZT90aGlzLnBpcGVsaW5lLnJ1blN0cmluZyhsLnRlcm0se2ZpZWxkczpsLmZpZWxkc30pOltsLnRlcm1dO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZj1jW2RdO2wudGVybT1mO3ZhciBwPWUuVG9rZW5TZXQuZnJvbUNsYXVzZShsKSx5PXRoaXMudG9rZW5TZXQuaW50ZXJzZWN0KHApLnRvQXJyYXkoKTtpZigwPT09eS5sZW5ndGgmJmwucHJlc2VuY2U9PT1lLlF1ZXJ5LnByZXNlbmNlLlJFUVVJUkVEKXtmb3IodmFyIG09MDttPGwuZmllbGRzLmxlbmd0aDttKyspe29bdj1sLmZpZWxkc1ttXV09ZS5TZXQuZW1wdHl9YnJlYWt9Zm9yKHZhciBnPTA7Zzx5Lmxlbmd0aDtnKyspe3ZhciB4PXlbZ10sdz10aGlzLmludmVydGVkSW5kZXhbeF0sUT13Ll9pbmRleDtmb3IobT0wO208bC5maWVsZHMubGVuZ3RoO20rKyl7dmFyIGs9d1t2PWwuZmllbGRzW21dXSxTPU9iamVjdC5rZXlzKGspLEU9eCsiLyIrdixMPW5ldyBlLlNldChTKTtpZihsLnByZXNlbmNlPT1lLlF1ZXJ5LnByZXNlbmNlLlJFUVVJUkVEJiYoaD1oLnVuaW9uKEwpLHZvaWQgMD09PW9bdl0mJihvW3ZdPWUuU2V0LmNvbXBsZXRlKSksbC5wcmVzZW5jZSE9ZS5RdWVyeS5wcmVzZW5jZS5QUk9ISUJJVEVEKXtpZihuW3ZdLnVwc2VydChRLGwuYm9vc3QsZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSt0fSksIXNbRV0pe2Zvcih2YXIgYj0wO2I8Uy5sZW5ndGg7YisrKXt2YXIgUCxUPVNbYl0sTz1uZXcgZS5GaWVsZFJlZihULHYpLEk9a1tUXTt2b2lkIDA9PT0oUD1pW09dKT9pW09dPW5ldyBlLk1hdGNoRGF0YSh4LHYsSSk6UC5hZGQoeCx2LEkpfXNbRV09ITB9fWVsc2Ugdm9pZCAwPT09YVt2XSYmKGFbdl09ZS5TZXQuZW1wdHkpLGFbdl09YVt2XS51bmlvbihMKX19fWlmKGwucHJlc2VuY2U9PT1lLlF1ZXJ5LnByZXNlbmNlLlJFUVVJUkVEKWZvcihtPTA7bTxsLmZpZWxkcy5sZW5ndGg7bSsrKXtvW3Y9bC5maWVsZHNbbV1dPW9bdl0uaW50ZXJzZWN0KGgpfX12YXIgUj1lLlNldC5jb21wbGV0ZSxGPWUuU2V0LmVtcHR5O2Zvcih1PTA7dTx0aGlzLmZpZWxkcy5sZW5ndGg7dSsrKXt2YXIgdjtvW3Y9dGhpcy5maWVsZHNbdV1dJiYoUj1SLmludGVyc2VjdChvW3ZdKSksYVt2XSYmKEY9Ri51bmlvbihhW3ZdKSl9dmFyIEM9T2JqZWN0LmtleXMoaSksTj1bXSxfPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoci5pc05lZ2F0ZWQoKSl7Qz1PYmplY3Qua2V5cyh0aGlzLmZpZWxkVmVjdG9ycyk7Zm9yKHU9MDt1PEMubGVuZ3RoO3UrKyl7Tz1DW3VdO3ZhciBqPWUuRmllbGRSZWYuZnJvbVN0cmluZyhPKTtpW09dPW5ldyBlLk1hdGNoRGF0YX19Zm9yKHU9MDt1PEMubGVuZ3RoO3UrKyl7dmFyIEQ9KGo9ZS5GaWVsZFJlZi5mcm9tU3RyaW5nKENbdV0pKS5kb2NSZWY7aWYoUi5jb250YWlucyhEKSYmIUYuY29udGFpbnMoRCkpe3ZhciBBLEI9dGhpcy5maWVsZFZlY3RvcnNbal0sVj1uW2ouZmllbGROYW1lXS5zaW1pbGFyaXR5KEIpO2lmKHZvaWQgMCE9PShBPV9bRF0pKUEuc2NvcmUrPVYsQS5tYXRjaERhdGEuY29tYmluZShpW2pdKTtlbHNle3ZhciB6PXtyZWY6RCxzY29yZTpWLG1hdGNoRGF0YTppW2pdfTtfW0RdPXosTi5wdXNoKHopfX19cmV0dXJuIE4uc29ydChmdW5jdGlvbihlLHQpe3JldHVybiB0LnNjb3JlLWUuc2NvcmV9KX0sZS5JbmRleC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIHQ9T2JqZWN0LmtleXModGhpcy5pbnZlcnRlZEluZGV4KS5zb3J0KCkubWFwKGZ1bmN0aW9uKGUpe3JldHVybltlLHRoaXMuaW52ZXJ0ZWRJbmRleFtlXV19LHRoaXMpLHI9T2JqZWN0LmtleXModGhpcy5maWVsZFZlY3RvcnMpLm1hcChmdW5jdGlvbihlKXtyZXR1cm5bZSx0aGlzLmZpZWxkVmVjdG9yc1tlXS50b0pTT04oKV19LHRoaXMpO3JldHVybnt2ZXJzaW9uOmUudmVyc2lvbixmaWVsZHM6dGhpcy5maWVsZHMsZmllbGRWZWN0b3JzOnIsaW52ZXJ0ZWRJbmRleDp0LHBpcGVsaW5lOnRoaXMucGlwZWxpbmUudG9KU09OKCl9fSxlLkluZGV4LmxvYWQ9ZnVuY3Rpb24odCl7dmFyIHI9e30saT17fSxuPXQuZmllbGRWZWN0b3JzLHM9T2JqZWN0LmNyZWF0ZShudWxsKSxvPXQuaW52ZXJ0ZWRJbmRleCxhPW5ldyBlLlRva2VuU2V0LkJ1aWxkZXIsdT1lLlBpcGVsaW5lLmxvYWQodC5waXBlbGluZSk7dC52ZXJzaW9uIT1lLnZlcnNpb24mJmUudXRpbHMud2FybigiVmVyc2lvbiBtaXNtYXRjaCB3aGVuIGxvYWRpbmcgc2VyaWFsaXNlZCBpbmRleC4gQ3VycmVudCB2ZXJzaW9uIG9mIGx1bnIgJyIrZS52ZXJzaW9uKyInIGRvZXMgbm90IG1hdGNoIHNlcmlhbGl6ZWQgaW5kZXggJyIrdC52ZXJzaW9uKyInIik7Zm9yKHZhciBsPTA7bDxuLmxlbmd0aDtsKyspe3ZhciBoPShjPW5bbF0pWzBdLGQ9Y1sxXTtpW2hdPW5ldyBlLlZlY3RvcihkKX1mb3IobD0wO2w8by5sZW5ndGg7bCsrKXt2YXIgYyxmPShjPW9bbF0pWzBdLHA9Y1sxXTthLmluc2VydChmKSxzW2ZdPXB9cmV0dXJuIGEuZmluaXNoKCksci5maWVsZHM9dC5maWVsZHMsci5maWVsZFZlY3RvcnM9aSxyLmludmVydGVkSW5kZXg9cyxyLnRva2VuU2V0PWEucm9vdCxyLnBpcGVsaW5lPXUsbmV3IGUuSW5kZXgocil9LGUuQnVpbGRlcj1mdW5jdGlvbigpe3RoaXMuX3JlZj0iaWQiLHRoaXMuX2ZpZWxkcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2RvY3VtZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuaW52ZXJ0ZWRJbmRleD1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuZmllbGRUZXJtRnJlcXVlbmNpZXM9e30sdGhpcy5maWVsZExlbmd0aHM9e30sdGhpcy50b2tlbml6ZXI9ZS50b2tlbml6ZXIsdGhpcy5waXBlbGluZT1uZXcgZS5QaXBlbGluZSx0aGlzLnNlYXJjaFBpcGVsaW5lPW5ldyBlLlBpcGVsaW5lLHRoaXMuZG9jdW1lbnRDb3VudD0wLHRoaXMuX2I9Ljc1LHRoaXMuX2sxPTEuMix0aGlzLnRlcm1JbmRleD0wLHRoaXMubWV0YWRhdGFXaGl0ZWxpc3Q9W119LGUuQnVpbGRlci5wcm90b3R5cGUucmVmPWZ1bmN0aW9uKGUpe3RoaXMuX3JlZj1lfSxlLkJ1aWxkZXIucHJvdG90eXBlLmZpZWxkPWZ1bmN0aW9uKGUsdCl7aWYoL1wvLy50ZXN0KGUpKXRocm93IG5ldyBSYW5nZUVycm9yKCJGaWVsZCAnIitlKyInIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVyICcvJyIpO3RoaXMuX2ZpZWxkc1tlXT10fHx7fX0sZS5CdWlsZGVyLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGUpe3RoaXMuX2I9ZTwwPzA6MTxlPzE6ZX0sZS5CdWlsZGVyLnByb3RvdHlwZS5rMT1mdW5jdGlvbihlKXt0aGlzLl9rMT1lfSxlLkJ1aWxkZXIucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0LHIpe3ZhciBpPXRbdGhpcy5fcmVmXSxuPU9iamVjdC5rZXlzKHRoaXMuX2ZpZWxkcyk7dGhpcy5fZG9jdW1lbnRzW2ldPXJ8fHt9LHRoaXMuZG9jdW1lbnRDb3VudCs9MTtmb3IodmFyIHM9MDtzPG4ubGVuZ3RoO3MrKyl7dmFyIG89bltzXSxhPXRoaXMuX2ZpZWxkc1tvXS5leHRyYWN0b3IsdT1hP2EodCk6dFtvXSxsPXRoaXMudG9rZW5pemVyKHUse2ZpZWxkczpbb119KSxjPXRoaXMucGlwZWxpbmUucnVuKGwpLGg9bmV3IGUuRmllbGRSZWYoaSxvKSxkPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5maWVsZFRlcm1GcmVxdWVuY2llc1toXT1kLHRoaXMuZmllbGRMZW5ndGhzW2hdPTAsdGhpcy5maWVsZExlbmd0aHNbaF0rPWMubGVuZ3RoO2Zvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKXt2YXIgcD1jW2ZdO2lmKG51bGw9PWRbcF0mJihkW3BdPTApLGRbcF0rPTEsbnVsbD09dGhpcy5pbnZlcnRlZEluZGV4W3BdKXt2YXIgeT1PYmplY3QuY3JlYXRlKG51bGwpO3kuX2luZGV4PXRoaXMudGVybUluZGV4LHRoaXMudGVybUluZGV4Kz0xO2Zvcih2YXIgbT0wO208bi5sZW5ndGg7bSsrKXlbblttXV09T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLmludmVydGVkSW5kZXhbcF09eX1udWxsPT10aGlzLmludmVydGVkSW5kZXhbcF1bb11baV0mJih0aGlzLmludmVydGVkSW5kZXhbcF1bb11baV09T2JqZWN0LmNyZWF0ZShudWxsKSk7Zm9yKHZhciB2PTA7djx0aGlzLm1ldGFkYXRhV2hpdGVsaXN0Lmxlbmd0aDt2Kyspe3ZhciBnPXRoaXMubWV0YWRhdGFXaGl0ZWxpc3Rbdl0seD1wLm1ldGFkYXRhW2ddO251bGw9PXRoaXMuaW52ZXJ0ZWRJbmRleFtwXVtvXVtpXVtnXSYmKHRoaXMuaW52ZXJ0ZWRJbmRleFtwXVtvXVtpXVtnXT1bXSksdGhpcy5pbnZlcnRlZEluZGV4W3BdW29dW2ldW2ddLnB1c2goeCl9fX19LGUuQnVpbGRlci5wcm90b3R5cGUuY2FsY3VsYXRlQXZlcmFnZUZpZWxkTGVuZ3Rocz1mdW5jdGlvbigpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyh0aGlzLmZpZWxkTGVuZ3Rocykscj10Lmxlbmd0aCxpPXt9LG49e30scz0wO3M8cjtzKyspe3ZhciBvPWUuRmllbGRSZWYuZnJvbVN0cmluZyh0W3NdKSxhPW8uZmllbGROYW1lO25bYV18fChuW2FdPTApLG5bYV0rPTEsaVthXXx8KGlbYV09MCksaVthXSs9dGhpcy5maWVsZExlbmd0aHNbb119dmFyIHU9T2JqZWN0LmtleXModGhpcy5fZmllbGRzKTtmb3Iocz0wO3M8dS5sZW5ndGg7cysrKXt2YXIgbD11W3NdO2lbbF09aVtsXS9uW2xdfXRoaXMuYXZlcmFnZUZpZWxkTGVuZ3RoPWl9LGUuQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlRmllbGRWZWN0b3JzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXt9LHI9T2JqZWN0LmtleXModGhpcy5maWVsZFRlcm1GcmVxdWVuY2llcyksaT1yLmxlbmd0aCxuPU9iamVjdC5jcmVhdGUobnVsbCkscz0wO3M8aTtzKyspe2Zvcih2YXIgbz1lLkZpZWxkUmVmLmZyb21TdHJpbmcocltzXSksYT1vLmZpZWxkTmFtZSx1PXRoaXMuZmllbGRMZW5ndGhzW29dLGw9bmV3IGUuVmVjdG9yLGM9dGhpcy5maWVsZFRlcm1GcmVxdWVuY2llc1tvXSxoPU9iamVjdC5rZXlzKGMpLGQ9aC5sZW5ndGgsZj10aGlzLl9maWVsZHNbYV0uYm9vc3R8fDEscD10aGlzLl9kb2N1bWVudHNbby5kb2NSZWZdLmJvb3N0fHwxLHk9MDt5PGQ7eSsrKXt2YXIgbSx2LGcseD1oW3ldLHc9Y1t4XSxRPXRoaXMuaW52ZXJ0ZWRJbmRleFt4XS5faW5kZXg7dm9pZCAwPT09blt4XT8obT1lLmlkZih0aGlzLmludmVydGVkSW5kZXhbeF0sdGhpcy5kb2N1bWVudENvdW50KSxuW3hdPW0pOm09blt4XSx2PW0qKCh0aGlzLl9rMSsxKSp3KS8odGhpcy5fazEqKDEtdGhpcy5fYit0aGlzLl9iKih1L3RoaXMuYXZlcmFnZUZpZWxkTGVuZ3RoW2FdKSkrdyksdio9Zix2Kj1wLGc9TWF0aC5yb3VuZCgxZTMqdikvMWUzLGwuaW5zZXJ0KFEsZyl9dFtvXT1sfXRoaXMuZmllbGRWZWN0b3JzPXR9LGUuQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlVG9rZW5TZXQ9ZnVuY3Rpb24oKXt0aGlzLnRva2VuU2V0PWUuVG9rZW5TZXQuZnJvbUFycmF5KE9iamVjdC5rZXlzKHRoaXMuaW52ZXJ0ZWRJbmRleCkuc29ydCgpKX0sZS5CdWlsZGVyLnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbGN1bGF0ZUF2ZXJhZ2VGaWVsZExlbmd0aHMoKSx0aGlzLmNyZWF0ZUZpZWxkVmVjdG9ycygpLHRoaXMuY3JlYXRlVG9rZW5TZXQoKSxuZXcgZS5JbmRleCh7aW52ZXJ0ZWRJbmRleDp0aGlzLmludmVydGVkSW5kZXgsZmllbGRWZWN0b3JzOnRoaXMuZmllbGRWZWN0b3JzLHRva2VuU2V0OnRoaXMudG9rZW5TZXQsZmllbGRzOk9iamVjdC5rZXlzKHRoaXMuX2ZpZWxkcykscGlwZWxpbmU6dGhpcy5zZWFyY2hQaXBlbGluZX0pfSxlLkJ1aWxkZXIucHJvdG90eXBlLnVzZT1mdW5jdGlvbihlKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7dC51bnNoaWZ0KHRoaXMpLGUuYXBwbHkodGhpcyx0KX0sZS5NYXRjaERhdGE9ZnVuY3Rpb24oZSx0LHIpe2Zvcih2YXIgaT1PYmplY3QuY3JlYXRlKG51bGwpLG49T2JqZWN0LmtleXMocnx8e30pLHM9MDtzPG4ubGVuZ3RoO3MrKyl7dmFyIG89bltzXTtpW29dPXJbb10uc2xpY2UoKX10aGlzLm1ldGFkYXRhPU9iamVjdC5jcmVhdGUobnVsbCksdm9pZCAwIT09ZSYmKHRoaXMubWV0YWRhdGFbZV09T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLm1ldGFkYXRhW2VdW3RdPWkpfSxlLk1hdGNoRGF0YS5wcm90b3R5cGUuY29tYmluZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9T2JqZWN0LmtleXMoZS5tZXRhZGF0YSkscj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgaT10W3JdLG49T2JqZWN0LmtleXMoZS5tZXRhZGF0YVtpXSk7bnVsbD09dGhpcy5tZXRhZGF0YVtpXSYmKHRoaXMubWV0YWRhdGFbaV09T2JqZWN0LmNyZWF0ZShudWxsKSk7Zm9yKHZhciBzPTA7czxuLmxlbmd0aDtzKyspe3ZhciBvPW5bc10sYT1PYmplY3Qua2V5cyhlLm1ldGFkYXRhW2ldW29dKTtudWxsPT10aGlzLm1ldGFkYXRhW2ldW29dJiYodGhpcy5tZXRhZGF0YVtpXVtvXT1PYmplY3QuY3JlYXRlKG51bGwpKTtmb3IodmFyIHU9MDt1PGEubGVuZ3RoO3UrKyl7dmFyIGw9YVt1XTtudWxsPT10aGlzLm1ldGFkYXRhW2ldW29dW2xdP3RoaXMubWV0YWRhdGFbaV1bb11bbF09ZS5tZXRhZGF0YVtpXVtvXVtsXTp0aGlzLm1ldGFkYXRhW2ldW29dW2xdPXRoaXMubWV0YWRhdGFbaV1bb11bbF0uY29uY2F0KGUubWV0YWRhdGFbaV1bb11bbF0pfX19fSxlLk1hdGNoRGF0YS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUsdCxyKXtpZighKGUgaW4gdGhpcy5tZXRhZGF0YSkpcmV0dXJuIHRoaXMubWV0YWRhdGFbZV09T2JqZWN0LmNyZWF0ZShudWxsKSx2b2lkKHRoaXMubWV0YWRhdGFbZV1bdF09cik7aWYodCBpbiB0aGlzLm1ldGFkYXRhW2VdKWZvcih2YXIgaT1PYmplY3Qua2V5cyhyKSxuPTA7bjxpLmxlbmd0aDtuKyspe3ZhciBzPWlbbl07cyBpbiB0aGlzLm1ldGFkYXRhW2VdW3RdP3RoaXMubWV0YWRhdGFbZV1bdF1bc109dGhpcy5tZXRhZGF0YVtlXVt0XVtzXS5jb25jYXQocltzXSk6dGhpcy5tZXRhZGF0YVtlXVt0XVtzXT1yW3NdfWVsc2UgdGhpcy5tZXRhZGF0YVtlXVt0XT1yfSxlLlF1ZXJ5PWZ1bmN0aW9uKGUpe3RoaXMuY2xhdXNlcz1bXSx0aGlzLmFsbEZpZWxkcz1lfSxlLlF1ZXJ5LndpbGRjYXJkPW5ldyBTdHJpbmcoIioiKSxlLlF1ZXJ5LndpbGRjYXJkLk5PTkU9MCxlLlF1ZXJ5LndpbGRjYXJkLkxFQURJTkc9MSxlLlF1ZXJ5LndpbGRjYXJkLlRSQUlMSU5HPTIsZS5RdWVyeS5wcmVzZW5jZT17T1BUSU9OQUw6MSxSRVFVSVJFRDoyLFBST0hJQklURUQ6M30sZS5RdWVyeS5wcm90b3R5cGUuY2xhdXNlPWZ1bmN0aW9uKHQpe3JldHVybiJmaWVsZHMiaW4gdHx8KHQuZmllbGRzPXRoaXMuYWxsRmllbGRzKSwiYm9vc3QiaW4gdHx8KHQuYm9vc3Q9MSksInVzZVBpcGVsaW5lImluIHR8fCh0LnVzZVBpcGVsaW5lPSEwKSwid2lsZGNhcmQiaW4gdHx8KHQud2lsZGNhcmQ9ZS5RdWVyeS53aWxkY2FyZC5OT05FKSx0LndpbGRjYXJkJmUuUXVlcnkud2lsZGNhcmQuTEVBRElORyYmdC50ZXJtLmNoYXJBdCgwKSE9ZS5RdWVyeS53aWxkY2FyZCYmKHQudGVybT0iKiIrdC50ZXJtKSx0LndpbGRjYXJkJmUuUXVlcnkud2lsZGNhcmQuVFJBSUxJTkcmJnQudGVybS5zbGljZSgtMSkhPWUuUXVlcnkud2lsZGNhcmQmJih0LnRlcm09dC50ZXJtKyIqIiksInByZXNlbmNlImluIHR8fCh0LnByZXNlbmNlPWUuUXVlcnkucHJlc2VuY2UuT1BUSU9OQUwpLHRoaXMuY2xhdXNlcy5wdXNoKHQpLHRoaXN9LGUuUXVlcnkucHJvdG90eXBlLmlzTmVnYXRlZD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5jbGF1c2VzLmxlbmd0aDt0KyspaWYodGhpcy5jbGF1c2VzW3RdLnByZXNlbmNlIT1lLlF1ZXJ5LnByZXNlbmNlLlBST0hJQklURUQpcmV0dXJuITE7cmV0dXJuITB9LGUuUXVlcnkucHJvdG90eXBlLnRlcm09ZnVuY3Rpb24odCxyKXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0LmZvckVhY2goZnVuY3Rpb24odCl7dGhpcy50ZXJtKHQsZS51dGlscy5jbG9uZShyKSl9LHRoaXMpLHRoaXM7dmFyIGk9cnx8e307cmV0dXJuIGkudGVybT10LnRvU3RyaW5nKCksdGhpcy5jbGF1c2UoaSksdGhpc30sZS5RdWVyeVBhcnNlRXJyb3I9ZnVuY3Rpb24oZSx0LHIpe3RoaXMubmFtZT0iUXVlcnlQYXJzZUVycm9yIix0aGlzLm1lc3NhZ2U9ZSx0aGlzLnN0YXJ0PXQsdGhpcy5lbmQ9cn0sZS5RdWVyeVBhcnNlRXJyb3IucHJvdG90eXBlPW5ldyBFcnJvcixlLlF1ZXJ5TGV4ZXI9ZnVuY3Rpb24oZSl7dGhpcy5sZXhlbWVzPVtdLHRoaXMuc3RyPWUsdGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5wb3M9MCx0aGlzLnN0YXJ0PTAsdGhpcy5lc2NhcGVDaGFyUG9zaXRpb25zPVtdfSxlLlF1ZXJ5TGV4ZXIucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe2Zvcih2YXIgdD1lLlF1ZXJ5TGV4ZXIubGV4VGV4dDt0Oyl0PXQodGhpcyl9LGUuUXVlcnlMZXhlci5wcm90b3R5cGUuc2xpY2VTdHJpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD10aGlzLnN0YXJ0LHI9dGhpcy5wb3MsaT0wO2k8dGhpcy5lc2NhcGVDaGFyUG9zaXRpb25zLmxlbmd0aDtpKyspcj10aGlzLmVzY2FwZUNoYXJQb3NpdGlvbnNbaV0sZS5wdXNoKHRoaXMuc3RyLnNsaWNlKHQscikpLHQ9cisxO3JldHVybiBlLnB1c2godGhpcy5zdHIuc2xpY2UodCx0aGlzLnBvcykpLHRoaXMuZXNjYXBlQ2hhclBvc2l0aW9ucy5sZW5ndGg9MCxlLmpvaW4oIiIpfSxlLlF1ZXJ5TGV4ZXIucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7dGhpcy5sZXhlbWVzLnB1c2goe3R5cGU6ZSxzdHI6dGhpcy5zbGljZVN0cmluZygpLHN0YXJ0OnRoaXMuc3RhcnQsZW5kOnRoaXMucG9zfSksdGhpcy5zdGFydD10aGlzLnBvc30sZS5RdWVyeUxleGVyLnByb3RvdHlwZS5lc2NhcGVDaGFyYWN0ZXI9ZnVuY3Rpb24oKXt0aGlzLmVzY2FwZUNoYXJQb3NpdGlvbnMucHVzaCh0aGlzLnBvcy0xKSx0aGlzLnBvcys9MX0sZS5RdWVyeUxleGVyLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7aWYodGhpcy5wb3M+PXRoaXMubGVuZ3RoKXJldHVybiBlLlF1ZXJ5TGV4ZXIuRU9TO3ZhciB0PXRoaXMuc3RyLmNoYXJBdCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz0xLHR9LGUuUXVlcnlMZXhlci5wcm90b3R5cGUud2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wb3MtdGhpcy5zdGFydH0sZS5RdWVyeUxleGVyLnByb3RvdHlwZS5pZ25vcmU9ZnVuY3Rpb24oKXt0aGlzLnN0YXJ0PT10aGlzLnBvcyYmKHRoaXMucG9zKz0xKSx0aGlzLnN0YXJ0PXRoaXMucG9zfSxlLlF1ZXJ5TGV4ZXIucHJvdG90eXBlLmJhY2t1cD1mdW5jdGlvbigpe3RoaXMucG9zLT0xfSxlLlF1ZXJ5TGV4ZXIucHJvdG90eXBlLmFjY2VwdERpZ2l0UnVuPWZ1bmN0aW9uKCl7Zm9yKHZhciB0LHI7NDc8KHI9KHQ9dGhpcy5uZXh0KCkpLmNoYXJDb2RlQXQoMCkpJiZyPDU4Oyk7dCE9ZS5RdWVyeUxleGVyLkVPUyYmdGhpcy5iYWNrdXAoKX0sZS5RdWVyeUxleGVyLnByb3RvdHlwZS5tb3JlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zPHRoaXMubGVuZ3RofSxlLlF1ZXJ5TGV4ZXIuRU9TPSJFT1MiLGUuUXVlcnlMZXhlci5GSUVMRD0iRklFTEQiLGUuUXVlcnlMZXhlci5URVJNPSJURVJNIixlLlF1ZXJ5TGV4ZXIuRURJVF9ESVNUQU5DRT0iRURJVF9ESVNUQU5DRSIsZS5RdWVyeUxleGVyLkJPT1NUPSJCT09TVCIsZS5RdWVyeUxleGVyLlBSRVNFTkNFPSJQUkVTRU5DRSIsZS5RdWVyeUxleGVyLmxleEZpZWxkPWZ1bmN0aW9uKHQpe3JldHVybiB0LmJhY2t1cCgpLHQuZW1pdChlLlF1ZXJ5TGV4ZXIuRklFTEQpLHQuaWdub3JlKCksZS5RdWVyeUxleGVyLmxleFRleHR9LGUuUXVlcnlMZXhlci5sZXhUZXJtPWZ1bmN0aW9uKHQpe2lmKDE8dC53aWR0aCgpJiYodC5iYWNrdXAoKSx0LmVtaXQoZS5RdWVyeUxleGVyLlRFUk0pKSx0Lmlnbm9yZSgpLHQubW9yZSgpKXJldHVybiBlLlF1ZXJ5TGV4ZXIubGV4VGV4dH0sZS5RdWVyeUxleGVyLmxleEVkaXREaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5pZ25vcmUoKSx0LmFjY2VwdERpZ2l0UnVuKCksdC5lbWl0KGUuUXVlcnlMZXhlci5FRElUX0RJU1RBTkNFKSxlLlF1ZXJ5TGV4ZXIubGV4VGV4dH0sZS5RdWVyeUxleGVyLmxleEJvb3N0PWZ1bmN0aW9uKHQpe3JldHVybiB0Lmlnbm9yZSgpLHQuYWNjZXB0RGlnaXRSdW4oKSx0LmVtaXQoZS5RdWVyeUxleGVyLkJPT1NUKSxlLlF1ZXJ5TGV4ZXIubGV4VGV4dH0sZS5RdWVyeUxleGVyLmxleEVPUz1mdW5jdGlvbih0KXswPHQud2lkdGgoKSYmdC5lbWl0KGUuUXVlcnlMZXhlci5URVJNKX0sZS5RdWVyeUxleGVyLnRlcm1TZXBhcmF0b3I9ZS50b2tlbml6ZXIuc2VwYXJhdG9yLGUuUXVlcnlMZXhlci5sZXhUZXh0PWZ1bmN0aW9uKHQpe2Zvcig7Oyl7dmFyIHI9dC5uZXh0KCk7aWYocj09ZS5RdWVyeUxleGVyLkVPUylyZXR1cm4gZS5RdWVyeUxleGVyLmxleEVPUztpZig5MiE9ci5jaGFyQ29kZUF0KDApKXtpZigiOiI9PXIpcmV0dXJuIGUuUXVlcnlMZXhlci5sZXhGaWVsZDtpZigifiI9PXIpcmV0dXJuIHQuYmFja3VwKCksMDx0LndpZHRoKCkmJnQuZW1pdChlLlF1ZXJ5TGV4ZXIuVEVSTSksZS5RdWVyeUxleGVyLmxleEVkaXREaXN0YW5jZTtpZigiXiI9PXIpcmV0dXJuIHQuYmFja3VwKCksMDx0LndpZHRoKCkmJnQuZW1pdChlLlF1ZXJ5TGV4ZXIuVEVSTSksZS5RdWVyeUxleGVyLmxleEJvb3N0O2lmKCIrIj09ciYmMT09PXQud2lkdGgoKSlyZXR1cm4gdC5lbWl0KGUuUXVlcnlMZXhlci5QUkVTRU5DRSksZS5RdWVyeUxleGVyLmxleFRleHQ7aWYoIi0iPT1yJiYxPT09dC53aWR0aCgpKXJldHVybiB0LmVtaXQoZS5RdWVyeUxleGVyLlBSRVNFTkNFKSxlLlF1ZXJ5TGV4ZXIubGV4VGV4dDtpZihyLm1hdGNoKGUuUXVlcnlMZXhlci50ZXJtU2VwYXJhdG9yKSlyZXR1cm4gZS5RdWVyeUxleGVyLmxleFRlcm19ZWxzZSB0LmVzY2FwZUNoYXJhY3RlcigpfX0sZS5RdWVyeVBhcnNlcj1mdW5jdGlvbih0LHIpe3RoaXMubGV4ZXI9bmV3IGUuUXVlcnlMZXhlcih0KSx0aGlzLnF1ZXJ5PXIsdGhpcy5jdXJyZW50Q2xhdXNlPXt9LHRoaXMubGV4ZW1lSWR4PTB9LGUuUXVlcnlQYXJzZXIucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKCl7dGhpcy5sZXhlci5ydW4oKSx0aGlzLmxleGVtZXM9dGhpcy5sZXhlci5sZXhlbWVzO2Zvcih2YXIgdD1lLlF1ZXJ5UGFyc2VyLnBhcnNlQ2xhdXNlO3Q7KXQ9dCh0aGlzKTtyZXR1cm4gdGhpcy5xdWVyeX0sZS5RdWVyeVBhcnNlci5wcm90b3R5cGUucGVla0xleGVtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxleGVtZXNbdGhpcy5sZXhlbWVJZHhdfSxlLlF1ZXJ5UGFyc2VyLnByb3RvdHlwZS5jb25zdW1lTGV4ZW1lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wZWVrTGV4ZW1lKCk7cmV0dXJuIHRoaXMubGV4ZW1lSWR4Kz0xLGV9LGUuUXVlcnlQYXJzZXIucHJvdG90eXBlLm5leHRDbGF1c2U9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmN1cnJlbnRDbGF1c2U7dGhpcy5xdWVyeS5jbGF1c2UoZSksdGhpcy5jdXJyZW50Q2xhdXNlPXt9fSxlLlF1ZXJ5UGFyc2VyLnBhcnNlQ2xhdXNlPWZ1bmN0aW9uKHQpe3ZhciByPXQucGVla0xleGVtZSgpO2lmKG51bGwhPXIpc3dpdGNoKHIudHlwZSl7Y2FzZSBlLlF1ZXJ5TGV4ZXIuUFJFU0VOQ0U6cmV0dXJuIGUuUXVlcnlQYXJzZXIucGFyc2VQcmVzZW5jZTtjYXNlIGUuUXVlcnlMZXhlci5GSUVMRDpyZXR1cm4gZS5RdWVyeVBhcnNlci5wYXJzZUZpZWxkO2Nhc2UgZS5RdWVyeUxleGVyLlRFUk06cmV0dXJuIGUuUXVlcnlQYXJzZXIucGFyc2VUZXJtO2RlZmF1bHQ6dmFyIGk9ImV4cGVjdGVkIGVpdGhlciBhIGZpZWxkIG9yIGEgdGVybSwgZm91bmQgIityLnR5cGU7dGhyb3cgMTw9ci5zdHIubGVuZ3RoJiYoaSs9IiB3aXRoIHZhbHVlICciK3Iuc3RyKyInIiksbmV3IGUuUXVlcnlQYXJzZUVycm9yKGksci5zdGFydCxyLmVuZCl9fSxlLlF1ZXJ5UGFyc2VyLnBhcnNlUHJlc2VuY2U9ZnVuY3Rpb24odCl7dmFyIHI9dC5jb25zdW1lTGV4ZW1lKCk7aWYobnVsbCE9cil7c3dpdGNoKHIuc3RyKXtjYXNlIi0iOnQuY3VycmVudENsYXVzZS5wcmVzZW5jZT1lLlF1ZXJ5LnByZXNlbmNlLlBST0hJQklURUQ7YnJlYWs7Y2FzZSIrIjp0LmN1cnJlbnRDbGF1c2UucHJlc2VuY2U9ZS5RdWVyeS5wcmVzZW5jZS5SRVFVSVJFRDticmVhaztkZWZhdWx0OnZhciBpPSJ1bnJlY29nbmlzZWQgcHJlc2VuY2Ugb3BlcmF0b3InIityLnN0cisiJyI7dGhyb3cgbmV3IGUuUXVlcnlQYXJzZUVycm9yKGksci5zdGFydCxyLmVuZCl9dmFyIG49dC5wZWVrTGV4ZW1lKCk7aWYobnVsbD09bil7aT0iZXhwZWN0aW5nIHRlcm0gb3IgZmllbGQsIGZvdW5kIG5vdGhpbmciO3Rocm93IG5ldyBlLlF1ZXJ5UGFyc2VFcnJvcihpLHIuc3RhcnQsci5lbmQpfXN3aXRjaChuLnR5cGUpe2Nhc2UgZS5RdWVyeUxleGVyLkZJRUxEOnJldHVybiBlLlF1ZXJ5UGFyc2VyLnBhcnNlRmllbGQ7Y2FzZSBlLlF1ZXJ5TGV4ZXIuVEVSTTpyZXR1cm4gZS5RdWVyeVBhcnNlci5wYXJzZVRlcm07ZGVmYXVsdDppPSJleHBlY3RpbmcgdGVybSBvciBmaWVsZCwgZm91bmQgJyIrbi50eXBlKyInIjt0aHJvdyBuZXcgZS5RdWVyeVBhcnNlRXJyb3IoaSxuLnN0YXJ0LG4uZW5kKX19fSxlLlF1ZXJ5UGFyc2VyLnBhcnNlRmllbGQ9ZnVuY3Rpb24odCl7dmFyIHI9dC5jb25zdW1lTGV4ZW1lKCk7aWYobnVsbCE9cil7aWYoLTE9PXQucXVlcnkuYWxsRmllbGRzLmluZGV4T2Yoci5zdHIpKXt2YXIgaT10LnF1ZXJ5LmFsbEZpZWxkcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIiciK2UrIicifSkuam9pbigiLCAiKSxuPSJ1bnJlY29nbmlzZWQgZmllbGQgJyIrci5zdHIrIicsIHBvc3NpYmxlIGZpZWxkczogIitpO3Rocm93IG5ldyBlLlF1ZXJ5UGFyc2VFcnJvcihuLHIuc3RhcnQsci5lbmQpfXQuY3VycmVudENsYXVzZS5maWVsZHM9W3Iuc3RyXTt2YXIgcz10LnBlZWtMZXhlbWUoKTtpZihudWxsPT1zKXtuPSJleHBlY3RpbmcgdGVybSwgZm91bmQgbm90aGluZyI7dGhyb3cgbmV3IGUuUXVlcnlQYXJzZUVycm9yKG4sci5zdGFydCxyLmVuZCl9c3dpdGNoKHMudHlwZSl7Y2FzZSBlLlF1ZXJ5TGV4ZXIuVEVSTTpyZXR1cm4gZS5RdWVyeVBhcnNlci5wYXJzZVRlcm07ZGVmYXVsdDpuPSJleHBlY3RpbmcgdGVybSwgZm91bmQgJyIrcy50eXBlKyInIjt0aHJvdyBuZXcgZS5RdWVyeVBhcnNlRXJyb3IobixzLnN0YXJ0LHMuZW5kKX19fSxlLlF1ZXJ5UGFyc2VyLnBhcnNlVGVybT1mdW5jdGlvbih0KXt2YXIgcj10LmNvbnN1bWVMZXhlbWUoKTtpZihudWxsIT1yKXt0LmN1cnJlbnRDbGF1c2UudGVybT1yLnN0ci50b0xvd2VyQ2FzZSgpLC0xIT1yLnN0ci5pbmRleE9mKCIqIikmJih0LmN1cnJlbnRDbGF1c2UudXNlUGlwZWxpbmU9ITEpO3ZhciBpPXQucGVla0xleGVtZSgpO2lmKG51bGw9PWkpcmV0dXJuIHZvaWQgdC5uZXh0Q2xhdXNlKCk7c3dpdGNoKGkudHlwZSl7Y2FzZSBlLlF1ZXJ5TGV4ZXIuVEVSTTpyZXR1cm4gdC5uZXh0Q2xhdXNlKCksZS5RdWVyeVBhcnNlci5wYXJzZVRlcm07Y2FzZSBlLlF1ZXJ5TGV4ZXIuRklFTEQ6cmV0dXJuIHQubmV4dENsYXVzZSgpLGUuUXVlcnlQYXJzZXIucGFyc2VGaWVsZDtjYXNlIGUuUXVlcnlMZXhlci5FRElUX0RJU1RBTkNFOnJldHVybiBlLlF1ZXJ5UGFyc2VyLnBhcnNlRWRpdERpc3RhbmNlO2Nhc2UgZS5RdWVyeUxleGVyLkJPT1NUOnJldHVybiBlLlF1ZXJ5UGFyc2VyLnBhcnNlQm9vc3Q7Y2FzZSBlLlF1ZXJ5TGV4ZXIuUFJFU0VOQ0U6cmV0dXJuIHQubmV4dENsYXVzZSgpLGUuUXVlcnlQYXJzZXIucGFyc2VQcmVzZW5jZTtkZWZhdWx0OnZhciBuPSJVbmV4cGVjdGVkIGxleGVtZSB0eXBlICciK2kudHlwZSsiJyI7dGhyb3cgbmV3IGUuUXVlcnlQYXJzZUVycm9yKG4saS5zdGFydCxpLmVuZCl9fX0sZS5RdWVyeVBhcnNlci5wYXJzZUVkaXREaXN0YW5jZT1mdW5jdGlvbih0KXt2YXIgcj10LmNvbnN1bWVMZXhlbWUoKTtpZihudWxsIT1yKXt2YXIgaT1wYXJzZUludChyLnN0ciwxMCk7aWYoaXNOYU4oaSkpe3ZhciBuPSJlZGl0IGRpc3RhbmNlIG11c3QgYmUgbnVtZXJpYyI7dGhyb3cgbmV3IGUuUXVlcnlQYXJzZUVycm9yKG4sci5zdGFydCxyLmVuZCl9dC5jdXJyZW50Q2xhdXNlLmVkaXREaXN0YW5jZT1pO3ZhciBzPXQucGVla0xleGVtZSgpO2lmKG51bGw9PXMpcmV0dXJuIHZvaWQgdC5uZXh0Q2xhdXNlKCk7c3dpdGNoKHMudHlwZSl7Y2FzZSBlLlF1ZXJ5TGV4ZXIuVEVSTTpyZXR1cm4gdC5uZXh0Q2xhdXNlKCksZS5RdWVyeVBhcnNlci5wYXJzZVRlcm07Y2FzZSBlLlF1ZXJ5TGV4ZXIuRklFTEQ6cmV0dXJuIHQubmV4dENsYXVzZSgpLGUuUXVlcnlQYXJzZXIucGFyc2VGaWVsZDtjYXNlIGUuUXVlcnlMZXhlci5FRElUX0RJU1RBTkNFOnJldHVybiBlLlF1ZXJ5UGFyc2VyLnBhcnNlRWRpdERpc3RhbmNlO2Nhc2UgZS5RdWVyeUxleGVyLkJPT1NUOnJldHVybiBlLlF1ZXJ5UGFyc2VyLnBhcnNlQm9vc3Q7Y2FzZSBlLlF1ZXJ5TGV4ZXIuUFJFU0VOQ0U6cmV0dXJuIHQubmV4dENsYXVzZSgpLGUuUXVlcnlQYXJzZXIucGFyc2VQcmVzZW5jZTtkZWZhdWx0Om49IlVuZXhwZWN0ZWQgbGV4ZW1lIHR5cGUgJyIrcy50eXBlKyInIjt0aHJvdyBuZXcgZS5RdWVyeVBhcnNlRXJyb3IobixzLnN0YXJ0LHMuZW5kKX19fSxlLlF1ZXJ5UGFyc2VyLnBhcnNlQm9vc3Q9ZnVuY3Rpb24odCl7dmFyIHI9dC5jb25zdW1lTGV4ZW1lKCk7aWYobnVsbCE9cil7dmFyIGk9cGFyc2VJbnQoci5zdHIsMTApO2lmKGlzTmFOKGkpKXt2YXIgbj0iYm9vc3QgbXVzdCBiZSBudW1lcmljIjt0aHJvdyBuZXcgZS5RdWVyeVBhcnNlRXJyb3IobixyLnN0YXJ0LHIuZW5kKX10LmN1cnJlbnRDbGF1c2UuYm9vc3Q9aTt2YXIgcz10LnBlZWtMZXhlbWUoKTtpZihudWxsPT1zKXJldHVybiB2b2lkIHQubmV4dENsYXVzZSgpO3N3aXRjaChzLnR5cGUpe2Nhc2UgZS5RdWVyeUxleGVyLlRFUk06cmV0dXJuIHQubmV4dENsYXVzZSgpLGUuUXVlcnlQYXJzZXIucGFyc2VUZXJtO2Nhc2UgZS5RdWVyeUxleGVyLkZJRUxEOnJldHVybiB0Lm5leHRDbGF1c2UoKSxlLlF1ZXJ5UGFyc2VyLnBhcnNlRmllbGQ7Y2FzZSBlLlF1ZXJ5TGV4ZXIuRURJVF9ESVNUQU5DRTpyZXR1cm4gZS5RdWVyeVBhcnNlci5wYXJzZUVkaXREaXN0YW5jZTtjYXNlIGUuUXVlcnlMZXhlci5CT09TVDpyZXR1cm4gZS5RdWVyeVBhcnNlci5wYXJzZUJvb3N0O2Nhc2UgZS5RdWVyeUxleGVyLlBSRVNFTkNFOnJldHVybiB0Lm5leHRDbGF1c2UoKSxlLlF1ZXJ5UGFyc2VyLnBhcnNlUHJlc2VuY2U7ZGVmYXVsdDpuPSJVbmV4cGVjdGVkIGxleGVtZSB0eXBlICciK3MudHlwZSsiJyI7dGhyb3cgbmV3IGUuUXVlcnlQYXJzZUVycm9yKG4scy5zdGFydCxzLmVuZCl9fX0sZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0KToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9dCgpOmUubHVucj10KCl9KHRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gZX0pfSgpO3ZhciB0eXBlZG9jLF9fZXh0ZW5kcz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgZXh0ZW5kU3RhdGljcz1mdW5jdGlvbihkLGIpe3JldHVybihleHRlbmRTdGF0aWNzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihkLGIpe2QuX19wcm90b19fPWJ9fHxmdW5jdGlvbihkLGIpe2Zvcih2YXIgcCBpbiBiKWIuaGFzT3duUHJvcGVydHkocCkmJihkW3BdPWJbcF0pfSkoZCxiKX07cmV0dXJuIGZ1bmN0aW9uKGQsYil7ZnVuY3Rpb24gX18oKXt0aGlzLmNvbnN0cnVjdG9yPWR9ZXh0ZW5kU3RhdGljcyhkLGIpLGQucHJvdG90eXBlPW51bGw9PT1iP09iamVjdC5jcmVhdGUoYik6KF9fLnByb3RvdHlwZT1iLnByb3RvdHlwZSxuZXcgX18pfX0oKTshZnVuY3Rpb24odHlwZWRvYyl7dmFyIHNlcnZpY2VzPVtdLGNvbXBvbmVudHM9W107dHlwZWRvYy5yZWdpc3RlclNlcnZpY2U9ZnVuY3Rpb24oY29uc3RydWN0b3IsbmFtZSxwcmlvcml0eSl7dm9pZCAwPT09cHJpb3JpdHkmJihwcmlvcml0eT0wKSxzZXJ2aWNlcy5wdXNoKHtjb25zdHJ1Y3Rvcjpjb25zdHJ1Y3RvcixuYW1lOm5hbWUscHJpb3JpdHk6cHJpb3JpdHksaW5zdGFuY2U6bnVsbH0pLHNlcnZpY2VzLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5wcmlvcml0eS1iLnByaW9yaXR5fSl9LHR5cGVkb2MucmVnaXN0ZXJDb21wb25lbnQ9ZnVuY3Rpb24oY29uc3RydWN0b3Isc2VsZWN0b3IscHJpb3JpdHksbmFtZXNwYWNlKXt2b2lkIDA9PT1wcmlvcml0eSYmKHByaW9yaXR5PTApLHZvaWQgMD09PW5hbWVzcGFjZSYmKG5hbWVzcGFjZT0iKiIpLGNvbXBvbmVudHMucHVzaCh7c2VsZWN0b3I6c2VsZWN0b3IsY29uc3RydWN0b3I6Y29uc3RydWN0b3IscHJpb3JpdHk6cHJpb3JpdHksbmFtZXNwYWNlOm5hbWVzcGFjZX0pLGNvbXBvbmVudHMuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLnByaW9yaXR5LWIucHJpb3JpdHl9KX07dmFyIEFwcGxpY2F0aW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQXBwbGljYXRpb24oKXt0aGlzLmNyZWF0ZVNlcnZpY2VzKCksdGhpcy5jcmVhdGVDb21wb25lbnRzKGRvY3VtZW50LmJvZHkpfXJldHVybiBBcHBsaWNhdGlvbi5wcm90b3R5cGUuY3JlYXRlU2VydmljZXM9ZnVuY3Rpb24oKXtzZXJ2aWNlcy5mb3JFYWNoKGZ1bmN0aW9uKGMpe2MuaW5zdGFuY2U9bmV3IGMuY29uc3RydWN0b3IsdHlwZWRvY1tjLm5hbWVdPWMuaW5zdGFuY2V9KX0sQXBwbGljYXRpb24ucHJvdG90eXBlLmNyZWF0ZUNvbXBvbmVudHM9ZnVuY3Rpb24oY29udGV4dCxuYW1lc3BhY2Upe3ZvaWQgMD09PW5hbWVzcGFjZSYmKG5hbWVzcGFjZT0iZGVmYXVsdCIpLGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbihjKXtjLm5hbWVzcGFjZSE9bmFtZXNwYWNlJiYiKiIhPWMubmFtZXNwYWNlfHxjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoYy5zZWxlY3RvcikuZm9yRWFjaChmdW5jdGlvbihlbCl7ZWwuZGF0YXNldC5oYXNJbnN0YW5jZXx8KG5ldyBjLmNvbnN0cnVjdG9yKHtlbDplbH0pLGVsLmRhdGFzZXQuaGFzSW5zdGFuY2U9U3RyaW5nKCEwKSl9KX0pfSxBcHBsaWNhdGlvbn0oKTt0eXBlZG9jLkFwcGxpY2F0aW9uPUFwcGxpY2F0aW9ufSh0eXBlZG9jfHwodHlwZWRvYz17fSkpLGZ1bmN0aW9uKHR5cGVkb2Mpe3ZhciBFdmVudFRhcmdldD1mdW5jdGlvbigpe2Z1bmN0aW9uIEV2ZW50VGFyZ2V0KCl7dGhpcy5saXN0ZW5lcnM9e319cmV0dXJuIEV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHR5cGUsY2FsbGJhY2spe3R5cGUgaW4gdGhpcy5saXN0ZW5lcnN8fCh0aGlzLmxpc3RlbmVyc1t0eXBlXT1bXSksdGhpcy5saXN0ZW5lcnNbdHlwZV0ucHVzaChjYWxsYmFjayl9LEV2ZW50VGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHR5cGUsY2FsbGJhY2spe2lmKHR5cGUgaW4gdGhpcy5saXN0ZW5lcnMpZm9yKHZhciBzdGFjaz10aGlzLmxpc3RlbmVyc1t0eXBlXSxpPTAsbD1zdGFjay5sZW5ndGg7aTxsO2krKylpZihzdGFja1tpXT09PWNhbGxiYWNrKXJldHVybiB2b2lkIHN0YWNrLnNwbGljZShpLDEpfSxFdmVudFRhcmdldC5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihldmVudCl7aWYoIShldmVudC50eXBlIGluIHRoaXMubGlzdGVuZXJzKSlyZXR1cm4hMDtmb3IodmFyIHN0YWNrPXRoaXMubGlzdGVuZXJzW2V2ZW50LnR5cGVdLnNsaWNlKCksaT0wLGw9c3RhY2subGVuZ3RoO2k8bDtpKyspc3RhY2tbaV0uY2FsbCh0aGlzLGV2ZW50KTtyZXR1cm4hZXZlbnQuZGVmYXVsdFByZXZlbnRlZH0sRXZlbnRUYXJnZXR9KCk7dHlwZWRvYy5FdmVudFRhcmdldD1FdmVudFRhcmdldH0odHlwZWRvY3x8KHR5cGVkb2M9e30pKSxmdW5jdGlvbih0eXBlZG9jKXt0eXBlZG9jLnRocm90dGxlPWZ1bmN0aW9uKGZuLHdhaXQpe3ZvaWQgMD09PXdhaXQmJih3YWl0PTEwMCk7dmFyIHRpbWU9RGF0ZS5ub3coKTtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGFyZ3M9W10sX2k9MDtfaTxhcmd1bWVudHMubGVuZ3RoO19pKyspYXJnc1tfaV09YXJndW1lbnRzW19pXTt0aW1lK3dhaXQtRGF0ZS5ub3coKTwwJiYoZm4uYXBwbHkodm9pZCAwLGFyZ3MpLHRpbWU9RGF0ZS5ub3coKSl9fX0odHlwZWRvY3x8KHR5cGVkb2M9e30pKSxmdW5jdGlvbih0eXBlZG9jKXt2YXIgVmlld3BvcnQ9ZnVuY3Rpb24oX3N1cGVyKXtmdW5jdGlvbiBWaWV3cG9ydCgpe3ZhciBfdGhpcz1fc3VwZXIuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gX3RoaXMuc2Nyb2xsVG9wPTAsX3RoaXMubGFzdFk9MCxfdGhpcy53aWR0aD0wLF90aGlzLmhlaWdodD0wLF90aGlzLnNob3dUb29sYmFyPSEwLF90aGlzLnRvb2xiYXI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnRzZC1wYWdlLXRvb2xiYXIiKSxfdGhpcy5zZWNvbmRhcnlOYXY9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnRzZC1uYXZpZ2F0aW9uLnNlY29uZGFyeSIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHR5cGVkb2MudGhyb3R0bGUoZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXMub25TY3JvbGwoKX0sMTApKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0eXBlZG9jLnRocm90dGxlKGZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzLm9uUmVzaXplKCl9LDEwKSksX3RoaXMub25SZXNpemUoKSxfdGhpcy5vblNjcm9sbCgpLF90aGlzfXJldHVybiBfX2V4dGVuZHMoVmlld3BvcnQsX3N1cGVyKSxWaWV3cG9ydC5wcm90b3R5cGUudHJpZ2dlclJlc2l6ZT1mdW5jdGlvbigpe3ZhciBldmVudD1uZXcgQ3VzdG9tRXZlbnQoInJlc2l6ZSIse2RldGFpbDp7d2lkdGg6dGhpcy53aWR0aCxoZWlnaHQ6dGhpcy5oZWlnaHR9fSk7dGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KX0sVmlld3BvcnQucHJvdG90eXBlLm9uUmVzaXplPWZ1bmN0aW9uKCl7dGhpcy53aWR0aD13aW5kb3cuaW5uZXJXaWR0aHx8MCx0aGlzLmhlaWdodD13aW5kb3cuaW5uZXJIZWlnaHR8fDA7dmFyIGV2ZW50PW5ldyBDdXN0b21FdmVudCgicmVzaXplIix7ZGV0YWlsOnt3aWR0aDp0aGlzLndpZHRoLGhlaWdodDp0aGlzLmhlaWdodH19KTt0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpfSxWaWV3cG9ydC5wcm90b3R5cGUub25TY3JvbGw9ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbFRvcD13aW5kb3cuc2Nyb2xsWXx8MDt2YXIgZXZlbnQ9bmV3IEN1c3RvbUV2ZW50KCJzY3JvbGwiLHtkZXRhaWw6e3Njcm9sbFRvcDp0aGlzLnNjcm9sbFRvcH19KTt0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpLHRoaXMuaGlkZVNob3dUb29sYmFyKCl9LFZpZXdwb3J0LnByb3RvdHlwZS5oaWRlU2hvd1Rvb2xiYXI9ZnVuY3Rpb24oKXt2YXIgaXNTaG93bj10aGlzLnNob3dUb29sYmFyO3RoaXMuc2hvd1Rvb2xiYXI9dGhpcy5sYXN0WT49dGhpcy5zY3JvbGxUb3B8fDA9PT10aGlzLnNjcm9sbFRvcCxpc1Nob3duIT09dGhpcy5zaG93VG9vbGJhciYmKHRoaXMudG9vbGJhci5jbGFzc0xpc3QudG9nZ2xlKCJ0c2QtcGFnZS10b29sYmFyLS1oaWRlIiksdGhpcy5zZWNvbmRhcnlOYXYuY2xhc3NMaXN0LnRvZ2dsZSgidHNkLW5hdmlnYXRpb24tLXRvb2xiYXItaGlkZSIpKSx0aGlzLmxhc3RZPXRoaXMuc2Nyb2xsVG9wfSxWaWV3cG9ydH0odHlwZWRvYy5FdmVudFRhcmdldCk7dHlwZWRvYy5WaWV3cG9ydD1WaWV3cG9ydCx0eXBlZG9jLnJlZ2lzdGVyU2VydmljZShWaWV3cG9ydCwidmlld3BvcnQiKX0odHlwZWRvY3x8KHR5cGVkb2M9e30pKSxmdW5jdGlvbih0eXBlZG9jKXtmdW5jdGlvbiBDb21wb25lbnQob3B0aW9ucyl7dGhpcy5lbD1vcHRpb25zLmVsfXR5cGVkb2MuQ29tcG9uZW50PUNvbXBvbmVudH0odHlwZWRvY3x8KHR5cGVkb2M9e30pKSxmdW5jdGlvbih0eXBlZG9jKXt0eXBlZG9jLnBvaW50ZXJEb3duPSJtb3VzZWRvd24iLHR5cGVkb2MucG9pbnRlck1vdmU9Im1vdXNlbW92ZSIsdHlwZWRvYy5wb2ludGVyVXA9Im1vdXNldXAiLHR5cGVkb2MucG9pbnRlckRvd25Qb3NpdGlvbj17eDowLHk6MH0sdHlwZWRvYy5wcmV2ZW50TmV4dENsaWNrPSExLHR5cGVkb2MuaXNQb2ludGVyRG93bj0hMSx0eXBlZG9jLmlzUG9pbnRlclRvdWNoPSExLHR5cGVkb2MuaGFzUG9pbnRlck1vdmVkPSExLHR5cGVkb2MuaXNNb2JpbGU9L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKHR5cGVkb2MuaXNNb2JpbGU/ImlzLW1vYmlsZSI6Im5vdC1tb2JpbGUiKSx0eXBlZG9jLmlzTW9iaWxlJiYib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmKHR5cGVkb2MuaXNQb2ludGVyVG91Y2g9ITAsdHlwZWRvYy5wb2ludGVyRG93bj0idG91Y2hzdGFydCIsdHlwZWRvYy5wb2ludGVyTW92ZT0idG91Y2htb3ZlIix0eXBlZG9jLnBvaW50ZXJVcD0idG91Y2hlbmQiKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGVkb2MucG9pbnRlckRvd24sZnVuY3Rpb24oZSl7dHlwZWRvYy5pc1BvaW50ZXJEb3duPSEwLHR5cGVkb2MuaGFzUG9pbnRlck1vdmVkPSExO3ZhciB0PSJ0b3VjaHN0YXJ0Ij09dHlwZWRvYy5wb2ludGVyRG93bj9lLnRhcmdldFRvdWNoZXNbMF06ZTt0eXBlZG9jLnBvaW50ZXJEb3duUG9zaXRpb24ueT10LnBhZ2VZfHwwLHR5cGVkb2MucG9pbnRlckRvd25Qb3NpdGlvbi54PXQucGFnZVh8fDB9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGVkb2MucG9pbnRlck1vdmUsZnVuY3Rpb24oZSl7aWYodHlwZWRvYy5pc1BvaW50ZXJEb3duJiYhdHlwZWRvYy5oYXNQb2ludGVyTW92ZWQpe3ZhciB0PSJ0b3VjaHN0YXJ0Ij09dHlwZWRvYy5wb2ludGVyRG93bj9lLnRhcmdldFRvdWNoZXNbMF06ZSx4PXR5cGVkb2MucG9pbnRlckRvd25Qb3NpdGlvbi54LSh0LnBhZ2VYfHwwKSx5PXR5cGVkb2MucG9pbnRlckRvd25Qb3NpdGlvbi55LSh0LnBhZ2VZfHwwKTt0eXBlZG9jLmhhc1BvaW50ZXJNb3ZlZD0xMDxNYXRoLnNxcnQoeCp4K3kqeSl9fSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlZG9jLnBvaW50ZXJVcCxmdW5jdGlvbigpe3R5cGVkb2MuaXNQb2ludGVyRG93bj0hMX0pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXt0eXBlZG9jLnByZXZlbnROZXh0Q2xpY2smJihlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0eXBlZG9jLnByZXZlbnROZXh0Q2xpY2s9ITEpfSl9KHR5cGVkb2N8fCh0eXBlZG9jPXt9KSksZnVuY3Rpb24odHlwZWRvYyl7dmFyIEZpbHRlckl0ZW09ZnVuY3Rpb24oKXtmdW5jdGlvbiBGaWx0ZXJJdGVtKGtleSx2YWx1ZSl7dGhpcy5rZXk9a2V5LHRoaXMudmFsdWU9dmFsdWUsdGhpcy5kZWZhdWx0VmFsdWU9dmFsdWUsdGhpcy5pbml0aWFsaXplKCksd2luZG93LmxvY2FsU3RvcmFnZVt0aGlzLmtleV0mJnRoaXMuc2V0VmFsdWUodGhpcy5mcm9tTG9jYWxTdG9yYWdlKHdpbmRvdy5sb2NhbFN0b3JhZ2VbdGhpcy5rZXldKSl9cmV0dXJuIEZpbHRlckl0ZW0ucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXt9LEZpbHRlckl0ZW0ucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKHZhbHVlKXtpZih0aGlzLnZhbHVlIT12YWx1ZSl7dmFyIG9sZFZhbHVlPXRoaXMudmFsdWU7dGhpcy52YWx1ZT12YWx1ZSx3aW5kb3cubG9jYWxTdG9yYWdlW3RoaXMua2V5XT10aGlzLnRvTG9jYWxTdG9yYWdlKHZhbHVlKSx0aGlzLmhhbmRsZVZhbHVlQ2hhbmdlKG9sZFZhbHVlLHZhbHVlKX19LEZpbHRlckl0ZW19KCksRmlsdGVySXRlbUNoZWNrYm94PWZ1bmN0aW9uKF9zdXBlcil7ZnVuY3Rpb24gRmlsdGVySXRlbUNoZWNrYm94KCl7cmV0dXJuIG51bGwhPT1fc3VwZXImJl9zdXBlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIF9fZXh0ZW5kcyhGaWx0ZXJJdGVtQ2hlY2tib3gsX3N1cGVyKSxGaWx0ZXJJdGVtQ2hlY2tib3gucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXt2YXIgX3RoaXM9dGhpcyxjaGVja2JveD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjdHNkLWZpbHRlci0iK3RoaXMua2V5KTtjaGVja2JveCYmKHRoaXMuY2hlY2tib3g9Y2hlY2tib3gsdGhpcy5jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7X3RoaXMuc2V0VmFsdWUoX3RoaXMuY2hlY2tib3guY2hlY2tlZCl9KSl9LEZpbHRlckl0ZW1DaGVja2JveC5wcm90b3R5cGUuaGFuZGxlVmFsdWVDaGFuZ2U9ZnVuY3Rpb24ob2xkVmFsdWUsbmV3VmFsdWUpe3RoaXMuY2hlY2tib3gmJih0aGlzLmNoZWNrYm94LmNoZWNrZWQ9dGhpcy52YWx1ZSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgidG9nZ2xlLSIrdGhpcy5rZXksdGhpcy52YWx1ZSE9dGhpcy5kZWZhdWx0VmFsdWUpKX0sRmlsdGVySXRlbUNoZWNrYm94LnByb3RvdHlwZS5mcm9tTG9jYWxTdG9yYWdlPWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4idHJ1ZSI9PXZhbHVlfSxGaWx0ZXJJdGVtQ2hlY2tib3gucHJvdG90eXBlLnRvTG9jYWxTdG9yYWdlPWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWU/InRydWUiOiJmYWxzZSJ9LEZpbHRlckl0ZW1DaGVja2JveH0oRmlsdGVySXRlbSksRmlsdGVySXRlbVNlbGVjdD1mdW5jdGlvbihfc3VwZXIpe2Z1bmN0aW9uIEZpbHRlckl0ZW1TZWxlY3QoKXtyZXR1cm4gbnVsbCE9PV9zdXBlciYmX3N1cGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gX19leHRlbmRzKEZpbHRlckl0ZW1TZWxlY3QsX3N1cGVyKSxGaWx0ZXJJdGVtU2VsZWN0LnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKCl7dmFyIF90aGlzPXRoaXM7ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoInRvZ2dsZS0iK3RoaXMua2V5K3RoaXMudmFsdWUpO3ZhciBzZWxlY3Q9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3RzZC1maWx0ZXItIit0aGlzLmtleSk7aWYoc2VsZWN0KXt0aGlzLnNlbGVjdD1zZWxlY3Q7ZnVuY3Rpb24gb25BY3RpdmF0ZSgpe190aGlzLnNlbGVjdC5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKX10aGlzLnNlbGVjdC5hZGRFdmVudExpc3RlbmVyKHR5cGVkb2MucG9pbnRlckRvd24sb25BY3RpdmF0ZSksdGhpcy5zZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixvbkFjdGl2YXRlKSx0aGlzLnNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe190aGlzLnNlbGVjdC5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKX0pLHRoaXMuc2VsZWN0LnF1ZXJ5U2VsZWN0b3JBbGwoImxpIikuZm9yRWFjaChmdW5jdGlvbihlbCl7ZWwuYWRkRXZlbnRMaXN0ZW5lcih0eXBlZG9jLnBvaW50ZXJVcCxmdW5jdGlvbihlKXtzZWxlY3QuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIiksX3RoaXMuc2V0VmFsdWUoZS50YXJnZXQuZGF0YXNldC52YWx1ZXx8IiIpfSl9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGVkb2MucG9pbnRlckRvd24sZnVuY3Rpb24oZSl7X3RoaXMuc2VsZWN0LmNvbnRhaW5zKGUudGFyZ2V0KXx8X3RoaXMuc2VsZWN0LmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpfSl9fSxGaWx0ZXJJdGVtU2VsZWN0LnByb3RvdHlwZS5oYW5kbGVWYWx1ZUNoYW5nZT1mdW5jdGlvbihvbGRWYWx1ZSxuZXdWYWx1ZSl7dGhpcy5zZWxlY3QucXVlcnlTZWxlY3RvckFsbCgibGkuc2VsZWN0ZWQiKS5mb3JFYWNoKGZ1bmN0aW9uKGVsKXtlbC5jbGFzc0xpc3QucmVtb3ZlKCJzZWxlY3RlZCIpfSk7dmFyIHNlbGVjdGVkPXRoaXMuc2VsZWN0LnF1ZXJ5U2VsZWN0b3IoJ2xpW2RhdGEtdmFsdWU9IicrbmV3VmFsdWUrJyJdJyksbGFiZWw9dGhpcy5zZWxlY3QucXVlcnlTZWxlY3RvcigiLnRzZC1zZWxlY3QtbGFiZWwiKTtzZWxlY3RlZCYmbGFiZWwmJihzZWxlY3RlZC5jbGFzc0xpc3QuYWRkKCJzZWxlY3RlZCIpLGxhYmVsLnRleHRDb250ZW50PXNlbGVjdGVkLnRleHRDb250ZW50KSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgidG9nZ2xlLSIrb2xkVmFsdWUpLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCJ0b2dnbGUtIituZXdWYWx1ZSl9LEZpbHRlckl0ZW1TZWxlY3QucHJvdG90eXBlLmZyb21Mb2NhbFN0b3JhZ2U9ZnVuY3Rpb24odmFsdWUpe3JldHVybiB2YWx1ZX0sRmlsdGVySXRlbVNlbGVjdC5wcm90b3R5cGUudG9Mb2NhbFN0b3JhZ2U9ZnVuY3Rpb24odmFsdWUpe3JldHVybiB2YWx1ZX0sRmlsdGVySXRlbVNlbGVjdH0oRmlsdGVySXRlbSksRmlsdGVyPWZ1bmN0aW9uKF9zdXBlcil7ZnVuY3Rpb24gRmlsdGVyKG9wdGlvbnMpe3ZhciBfdGhpcz1fc3VwZXIuY2FsbCh0aGlzLG9wdGlvbnMpfHx0aGlzO3JldHVybiBfdGhpcy5vcHRpb25WaXNpYmlsaXR5PW5ldyBGaWx0ZXJJdGVtU2VsZWN0KCJ2aXNpYmlsaXR5IiwicHJpdmF0ZSIpLF90aGlzLm9wdGlvbkluaGVyaXRlZD1uZXcgRmlsdGVySXRlbUNoZWNrYm94KCJpbmhlcml0ZWQiLCEwKSxfdGhpcy5vcHRpb25FeHRlcm5hbHM9bmV3IEZpbHRlckl0ZW1DaGVja2JveCgiZXh0ZXJuYWxzIiwhMCksX3RoaXMub3B0aW9uT25seUV4cG9ydGVkPW5ldyBGaWx0ZXJJdGVtQ2hlY2tib3goIm9ubHktZXhwb3J0ZWQiLCExKSxfdGhpc31yZXR1cm4gX19leHRlbmRzKEZpbHRlcixfc3VwZXIpLEZpbHRlci5pc1N1cHBvcnRlZD1mdW5jdGlvbigpe3RyeXtyZXR1cm4gdm9pZCAwIT09d2luZG93LmxvY2FsU3RvcmFnZX1jYXRjaChlKXtyZXR1cm4hMX19LEZpbHRlcn0odHlwZWRvYy5Db21wb25lbnQpO0ZpbHRlci5pc1N1cHBvcnRlZCgpP3R5cGVkb2MucmVnaXN0ZXJDb21wb25lbnQoRmlsdGVyLCIjdHNkLWZpbHRlciIpOmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCJuby1maWx0ZXIiKX0odHlwZWRvY3x8KHR5cGVkb2M9e30pKSxmdW5jdGlvbih0eXBlZG9jKXt2YXIgTWVudUhpZ2hsaWdodD1mdW5jdGlvbihfc3VwZXIpe2Z1bmN0aW9uIE1lbnVIaWdobGlnaHQob3B0aW9ucyl7dmFyIF90aGlzPV9zdXBlci5jYWxsKHRoaXMsb3B0aW9ucyl8fHRoaXM7cmV0dXJuIF90aGlzLmFuY2hvcnM9W10sX3RoaXMuaW5kZXg9LTEsdHlwZWRvYy52aWV3cG9ydC5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLGZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzLm9uUmVzaXplKCl9KSx0eXBlZG9jLnZpZXdwb3J0LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZnVuY3Rpb24oZSl7cmV0dXJuIF90aGlzLm9uU2Nyb2xsKGUpfSksX3RoaXMuY3JlYXRlQW5jaG9ycygpLF90aGlzfXJldHVybiBfX2V4dGVuZHMoTWVudUhpZ2hsaWdodCxfc3VwZXIpLE1lbnVIaWdobGlnaHQucHJvdG90eXBlLmNyZWF0ZUFuY2hvcnM9ZnVuY3Rpb24oKXt2YXIgX3RoaXM9dGhpcyxiYXNlPXdpbmRvdy5sb2NhdGlvbi5ocmVmOy0xIT1iYXNlLmluZGV4T2YoIiMiKSYmKGJhc2U9YmFzZS5zdWJzdHIoMCxiYXNlLmluZGV4T2YoIiMiKSkpLHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgiYSIpLmZvckVhY2goZnVuY3Rpb24oZWwpe3ZhciBocmVmPWVsLmhyZWY7aWYoLTEhPWhyZWYuaW5kZXhPZigiIyIpJiZocmVmLnN1YnN0cigwLGJhc2UubGVuZ3RoKT09YmFzZSl7dmFyIGhhc2g9aHJlZi5zdWJzdHIoaHJlZi5pbmRleE9mKCIjIikrMSksYW5jaG9yPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImEudHNkLWFuY2hvcltuYW1lPSIraGFzaCsiXSIpLGxpbms9ZWwucGFyZW50Tm9kZTthbmNob3ImJmxpbmsmJl90aGlzLmFuY2hvcnMucHVzaCh7bGluazpsaW5rLGFuY2hvcjphbmNob3IscG9zaXRpb246MH0pfX0pLHRoaXMub25SZXNpemUoKX0sTWVudUhpZ2hsaWdodC5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24oKXtmb3IodmFyIGFuY2hvcixpbmRleD0wLGNvdW50PXRoaXMuYW5jaG9ycy5sZW5ndGg7aW5kZXg8Y291bnQ7aW5kZXgrKyl7dmFyIHJlY3Q9KGFuY2hvcj10aGlzLmFuY2hvcnNbaW5kZXhdKS5hbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7YW5jaG9yLnBvc2l0aW9uPXJlY3QudG9wK2RvY3VtZW50LmJvZHkuc2Nyb2xsVG9wfXRoaXMuYW5jaG9ycy5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEucG9zaXRpb24tYi5wb3NpdGlvbn0pO3ZhciBldmVudD1uZXcgQ3VzdG9tRXZlbnQoInNjcm9sbCIse2RldGFpbDp7c2Nyb2xsVG9wOnR5cGVkb2Mudmlld3BvcnQuc2Nyb2xsVG9wfX0pO3RoaXMub25TY3JvbGwoZXZlbnQpfSxNZW51SGlnaGxpZ2h0LnByb3RvdHlwZS5vblNjcm9sbD1mdW5jdGlvbihldmVudCl7Zm9yKHZhciBzY3JvbGxUb3A9ZXZlbnQuZGV0YWlsLnNjcm9sbFRvcCs1LGFuY2hvcnM9dGhpcy5hbmNob3JzLGNvdW50PWFuY2hvcnMubGVuZ3RoLTEsaW5kZXg9dGhpcy5pbmRleDstMTxpbmRleCYmYW5jaG9yc1tpbmRleF0ucG9zaXRpb24+c2Nyb2xsVG9wOylpbmRleC09MTtmb3IoO2luZGV4PGNvdW50JiZhbmNob3JzW2luZGV4KzFdLnBvc2l0aW9uPHNjcm9sbFRvcDspaW5kZXgrPTE7dGhpcy5pbmRleCE9aW5kZXgmJigtMTx0aGlzLmluZGV4JiZ0aGlzLmFuY2hvcnNbdGhpcy5pbmRleF0ubGluay5jbGFzc0xpc3QucmVtb3ZlKCJmb2N1cyIpLHRoaXMuaW5kZXg9aW5kZXgsLTE8dGhpcy5pbmRleCYmdGhpcy5hbmNob3JzW3RoaXMuaW5kZXhdLmxpbmsuY2xhc3NMaXN0LmFkZCgiZm9jdXMiKSl9LE1lbnVIaWdobGlnaHR9KHR5cGVkb2MuQ29tcG9uZW50KTt0eXBlZG9jLk1lbnVIaWdobGlnaHQ9TWVudUhpZ2hsaWdodCx0eXBlZG9jLnJlZ2lzdGVyQ29tcG9uZW50KE1lbnVIaWdobGlnaHQsIi5tZW51LWhpZ2hsaWdodCIpfSh0eXBlZG9jfHwodHlwZWRvYz17fSkpLGZ1bmN0aW9uKHR5cGVkb2MpeyFmdW5jdGlvbihzZWFyY2gpe3ZhciBTZWFyY2hMb2FkaW5nU3RhdGU7IWZ1bmN0aW9uKFNlYXJjaExvYWRpbmdTdGF0ZSl7U2VhcmNoTG9hZGluZ1N0YXRlW1NlYXJjaExvYWRpbmdTdGF0ZS5JZGxlPTBdPSJJZGxlIixTZWFyY2hMb2FkaW5nU3RhdGVbU2VhcmNoTG9hZGluZ1N0YXRlLkxvYWRpbmc9MV09IkxvYWRpbmciLFNlYXJjaExvYWRpbmdTdGF0ZVtTZWFyY2hMb2FkaW5nU3RhdGUuUmVhZHk9Ml09IlJlYWR5IixTZWFyY2hMb2FkaW5nU3RhdGVbU2VhcmNoTG9hZGluZ1N0YXRlLkZhaWx1cmU9M109IkZhaWx1cmUifShTZWFyY2hMb2FkaW5nU3RhdGV8fChTZWFyY2hMb2FkaW5nU3RhdGU9e30pKTt2YXIgU2VhcmNoPWZ1bmN0aW9uKF9zdXBlcil7ZnVuY3Rpb24gU2VhcmNoKG9wdGlvbnMpe3ZhciBfdGhpcz1fc3VwZXIuY2FsbCh0aGlzLG9wdGlvbnMpfHx0aGlzO190aGlzLnF1ZXJ5PSIiLF90aGlzLmxvYWRpbmdTdGF0ZT1TZWFyY2hMb2FkaW5nU3RhdGUuSWRsZSxfdGhpcy5oYXNGb2N1cz0hMSxfdGhpcy5wcmV2ZW50UHJlc3M9ITEsX3RoaXMuZGF0YT1udWxsLF90aGlzLmluZGV4PW51bGwsX3RoaXMucmVzdWx0Q2xpY2tlZD0hMTt2YXIgZmllbGQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3RzZC1zZWFyY2gtZmllbGQiKSxyZXN1bHRzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5yZXN1bHRzIik7aWYoIWZpZWxkfHwhcmVzdWx0cyl0aHJvdyBuZXcgRXJyb3IoIlRoZSBpbnB1dCBmaWVsZCBvciB0aGUgcmVzdWx0IGxpc3Qgd3JhcHBlciBhcmUgbm90IGZvdW5kIik7cmV0dXJuIF90aGlzLmZpZWxkPWZpZWxkLF90aGlzLnJlc3VsdHM9cmVzdWx0cyxfdGhpcy5iYXNlPV90aGlzLmVsLmRhdGFzZXQuYmFzZSsiLyIsX3RoaXMuYmluZEV2ZW50cygpLF90aGlzfXJldHVybiBfX2V4dGVuZHMoU2VhcmNoLF9zdXBlciksU2VhcmNoLnByb3RvdHlwZS5sb2FkSW5kZXg9ZnVuY3Rpb24oKXt2YXIgX3RoaXM9dGhpcztpZih0aGlzLmxvYWRpbmdTdGF0ZT09U2VhcmNoTG9hZGluZ1N0YXRlLklkbGUmJiF0aGlzLmRhdGEpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtfdGhpcy5sb2FkaW5nU3RhdGU9PVNlYXJjaExvYWRpbmdTdGF0ZS5JZGxlJiZfdGhpcy5zZXRMb2FkaW5nU3RhdGUoU2VhcmNoTG9hZGluZ1N0YXRlLkxvYWRpbmcpfSw1MDApO3ZhciB1cmw9dGhpcy5lbC5kYXRhc2V0LmluZGV4O3VybD9mZXRjaCh1cmwpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2Upe2lmKCFyZXNwb25zZS5vayl0aHJvdyBuZXcgRXJyb3IoIlRoZSBzZWFyY2ggaW5kZXggaXMgbWlzc2luZyIpO3JldHVybiByZXNwb25zZS5qc29uKCl9KS50aGVuKGZ1bmN0aW9uKHNvdXJjZSl7X3RoaXMuZGF0YT1zb3VyY2UsX3RoaXMuaW5kZXg9bHVuci5JbmRleC5sb2FkKHNvdXJjZS5pbmRleCksX3RoaXMuc2V0TG9hZGluZ1N0YXRlKFNlYXJjaExvYWRpbmdTdGF0ZS5SZWFkeSl9KS5jYXRjaChmdW5jdGlvbihlcnJvcil7Y29uc29sZS5lcnJvcihlcnJvciksX3RoaXMuc2V0TG9hZGluZ1N0YXRlKFNlYXJjaExvYWRpbmdTdGF0ZS5GYWlsdXJlKX0pOnRoaXMuc2V0TG9hZGluZ1N0YXRlKFNlYXJjaExvYWRpbmdTdGF0ZS5GYWlsdXJlKX19LFNlYXJjaC5wcm90b3R5cGUudXBkYXRlUmVzdWx0cz1mdW5jdGlvbigpe2lmKHRoaXMubG9hZGluZ1N0YXRlPT1TZWFyY2hMb2FkaW5nU3RhdGUuUmVhZHkmJih0aGlzLnJlc3VsdHMudGV4dENvbnRlbnQ9IiIsdGhpcy5xdWVyeSYmdGhpcy5pbmRleCYmdGhpcy5kYXRhKSl7dmFyIHJlcz10aGlzLmluZGV4LnNlYXJjaCgiKiIrdGhpcy5xdWVyeSsiKiIpOzA9PT1yZXMubGVuZ3RoJiYocmVzPXRoaXMuaW5kZXguc2VhcmNoKCIqIit0aGlzLnF1ZXJ5KyJ+MSoiKSk7Zm9yKHZhciBpPTAsYz1NYXRoLm1pbigxMCxyZXMubGVuZ3RoKTtpPGM7aSsrKXt2YXIgcm93PXRoaXMuZGF0YS5yb3dzW051bWJlcihyZXNbaV0ucmVmKV0sbmFtZT1yb3cubmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAodGhpcy5xdWVyeSwiaSIpLGZ1bmN0aW9uKG1hdGNoKXtyZXR1cm4iPGI+IittYXRjaCsiPC9iPiJ9KSxwYXJlbnQ9cm93LnBhcmVudHx8IiI7KHBhcmVudD1wYXJlbnQucmVwbGFjZShuZXcgUmVnRXhwKHRoaXMucXVlcnksImkiKSxmdW5jdGlvbihtYXRjaCl7cmV0dXJuIjxiPiIrbWF0Y2grIjwvYj4ifSkpJiYobmFtZT0nPHNwYW4gY2xhc3M9InBhcmVudCI+JytwYXJlbnQrIi48L3NwYW4+IituYW1lKTt2YXIgaXRlbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaSIpO2l0ZW0uY2xhc3NMaXN0LnZhbHVlPXJvdy5jbGFzc2VzLGl0ZW0uaW5uZXJIVE1MPSdcbiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJysodGhpcy5iYXNlK3Jvdy51cmwpKyciIGNsYXNzPSJ0c2Qta2luZC1pY29uIj4nK25hbWUrIjwvYT5cbiAgICAgICAgICAgICAgICAiLHRoaXMucmVzdWx0cy5hcHBlbmRDaGlsZChpdGVtKX19fSxTZWFyY2gucHJvdG90eXBlLnNldExvYWRpbmdTdGF0ZT1mdW5jdGlvbih2YWx1ZSl7dGhpcy5sb2FkaW5nU3RhdGUhPXZhbHVlJiYodGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKFNlYXJjaExvYWRpbmdTdGF0ZVt0aGlzLmxvYWRpbmdTdGF0ZV0udG9Mb3dlckNhc2UoKSksdGhpcy5sb2FkaW5nU3RhdGU9dmFsdWUsdGhpcy5lbC5jbGFzc0xpc3QuYWRkKFNlYXJjaExvYWRpbmdTdGF0ZVt0aGlzLmxvYWRpbmdTdGF0ZV0udG9Mb3dlckNhc2UoKSksdGhpcy51cGRhdGVSZXN1bHRzKCkpfSxTZWFyY2gucHJvdG90eXBlLnNldEhhc0ZvY3VzPWZ1bmN0aW9uKHZhbHVlKXt0aGlzLmhhc0ZvY3VzIT12YWx1ZSYmKHRoaXMuaGFzRm9jdXM9dmFsdWUsdGhpcy5lbC5jbGFzc0xpc3QudG9nZ2xlKCJoYXMtZm9jdXMiKSx2YWx1ZT8odGhpcy5zZXRRdWVyeSgiIiksdGhpcy5maWVsZC52YWx1ZT0iIik6dGhpcy5maWVsZC52YWx1ZT10aGlzLnF1ZXJ5KX0sU2VhcmNoLnByb3RvdHlwZS5zZXRRdWVyeT1mdW5jdGlvbih2YWx1ZSl7dGhpcy5xdWVyeT12YWx1ZS50cmltKCksdGhpcy51cGRhdGVSZXN1bHRzKCl9LFNlYXJjaC5wcm90b3R5cGUuc2V0Q3VycmVudFJlc3VsdD1mdW5jdGlvbihkaXIpe3ZhciBjdXJyZW50PXRoaXMucmVzdWx0cy5xdWVyeVNlbGVjdG9yKCIuY3VycmVudCIpO2lmKGN1cnJlbnQpe3ZhciByZWw9MT09ZGlyP2N1cnJlbnQubmV4dEVsZW1lbnRTaWJsaW5nOmN1cnJlbnQucHJldmlvdXNFbGVtZW50U2libGluZztyZWwmJihjdXJyZW50LmNsYXNzTGlzdC5yZW1vdmUoImN1cnJlbnQiKSxyZWwuY2xhc3NMaXN0LmFkZCgiY3VycmVudCIpKX1lbHNlKGN1cnJlbnQ9dGhpcy5yZXN1bHRzLnF1ZXJ5U2VsZWN0b3IoMT09ZGlyPyJsaTpmaXJzdC1jaGlsZCI6ImxpOmxhc3QtY2hpbGQiKSkmJmN1cnJlbnQuY2xhc3NMaXN0LmFkZCgiY3VycmVudCIpfSxTZWFyY2gucHJvdG90eXBlLmdvdG9DdXJyZW50UmVzdWx0PWZ1bmN0aW9uKCl7dmFyIGN1cnJlbnQ9dGhpcy5yZXN1bHRzLnF1ZXJ5U2VsZWN0b3IoIi5jdXJyZW50Iik7aWYoY3VycmVudHx8KGN1cnJlbnQ9dGhpcy5yZXN1bHRzLnF1ZXJ5U2VsZWN0b3IoImxpOmZpcnN0LWNoaWxkIikpLGN1cnJlbnQpe3ZhciBsaW5rPWN1cnJlbnQucXVlcnlTZWxlY3RvcigiYSIpO2xpbmsmJih3aW5kb3cubG9jYXRpb24uaHJlZj1saW5rLmhyZWYpLHRoaXMuZmllbGQuYmx1cigpfX0sU2VhcmNoLnByb3RvdHlwZS5iaW5kRXZlbnRzPWZ1bmN0aW9uKCl7dmFyIF90aGlzPXRoaXM7dGhpcy5yZXN1bHRzLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsZnVuY3Rpb24oKXtfdGhpcy5yZXN1bHRDbGlja2VkPSEwfSksdGhpcy5yZXN1bHRzLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGZ1bmN0aW9uKCl7X3RoaXMucmVzdWx0Q2xpY2tlZD0hMSxfdGhpcy5zZXRIYXNGb2N1cyghMSl9KSx0aGlzLmZpZWxkLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzaW4iLGZ1bmN0aW9uKCl7X3RoaXMuc2V0SGFzRm9jdXMoITApLF90aGlzLmxvYWRJbmRleCgpfSksdGhpcy5maWVsZC5hZGRFdmVudExpc3RlbmVyKCJmb2N1c291dCIsZnVuY3Rpb24oKXtfdGhpcy5yZXN1bHRDbGlja2VkP190aGlzLnJlc3VsdENsaWNrZWQ9ITE6c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBfdGhpcy5zZXRIYXNGb2N1cyghMSl9LDEwMCl9KSx0aGlzLmZpZWxkLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IixmdW5jdGlvbigpe190aGlzLnNldFF1ZXJ5KF90aGlzLmZpZWxkLnZhbHVlKX0pLHRoaXMuZmllbGQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7MTM9PWUua2V5Q29kZXx8Mjc9PWUua2V5Q29kZXx8Mzg9PWUua2V5Q29kZXx8NDA9PWUua2V5Q29kZT8oX3RoaXMucHJldmVudFByZXNzPSEwLGUucHJldmVudERlZmF1bHQoKSwxMz09ZS5rZXlDb2RlP190aGlzLmdvdG9DdXJyZW50UmVzdWx0KCk6Mjc9PWUua2V5Q29kZT9fdGhpcy5maWVsZC5ibHVyKCk6Mzg9PWUua2V5Q29kZT9fdGhpcy5zZXRDdXJyZW50UmVzdWx0KC0xKTo0MD09ZS5rZXlDb2RlJiZfdGhpcy5zZXRDdXJyZW50UmVzdWx0KDEpKTpfdGhpcy5wcmV2ZW50UHJlc3M9ITF9KSx0aGlzLmZpZWxkLmFkZEV2ZW50TGlzdGVuZXIoImtleXByZXNzIixmdW5jdGlvbihlKXtfdGhpcy5wcmV2ZW50UHJlc3MmJmUucHJldmVudERlZmF1bHQoKX0pLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7ZS5hbHRLZXl8fGUuY3RybEtleXx8ZS5tZXRhS2V5fHwhX3RoaXMuaGFzRm9jdXMmJjQ3PGUua2V5Q29kZSYmZS5rZXlDb2RlPDExMiYmX3RoaXMuZmllbGQuZm9jdXMoKX0pfSxTZWFyY2h9KHR5cGVkb2MuQ29tcG9uZW50KTtzZWFyY2guU2VhcmNoPVNlYXJjaCx0eXBlZG9jLnJlZ2lzdGVyQ29tcG9uZW50KFNlYXJjaCwiI3RzZC1zZWFyY2giKX0odHlwZWRvYy5zZWFyY2h8fCh0eXBlZG9jLnNlYXJjaD17fSkpfSh0eXBlZG9jfHwodHlwZWRvYz17fSkpLGZ1bmN0aW9uKHR5cGVkb2Mpe3ZhciBTaWduYXR1cmVHcm91cD1mdW5jdGlvbigpe2Z1bmN0aW9uIFNpZ25hdHVyZUdyb3VwKHNpZ25hdHVyZSxkZXNjcmlwdGlvbil7dGhpcy5zaWduYXR1cmU9c2lnbmF0dXJlLHRoaXMuZGVzY3JpcHRpb249ZGVzY3JpcHRpb259cmV0dXJuIFNpZ25hdHVyZUdyb3VwLnByb3RvdHlwZS5hZGRDbGFzcz1mdW5jdGlvbihjbGFzc05hbWUpe3JldHVybiB0aGlzLnNpZ25hdHVyZS5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSksdGhpcy5kZXNjcmlwdGlvbi5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSksdGhpc30sU2lnbmF0dXJlR3JvdXAucHJvdG90eXBlLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKGNsYXNzTmFtZSl7cmV0dXJuIHRoaXMuc2lnbmF0dXJlLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKSx0aGlzLmRlc2NyaXB0aW9uLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKSx0aGlzfSxTaWduYXR1cmVHcm91cH0oKSxTaWduYXR1cmU9ZnVuY3Rpb24oX3N1cGVyKXtmdW5jdGlvbiBTaWduYXR1cmUob3B0aW9ucyl7dmFyIF90aGlzPV9zdXBlci5jYWxsKHRoaXMsb3B0aW9ucyl8fHRoaXM7cmV0dXJuIF90aGlzLmdyb3Vwcz1bXSxfdGhpcy5pbmRleD0tMSxfdGhpcy5jcmVhdGVHcm91cHMoKSxfdGhpcy5jb250YWluZXImJihfdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKSxBcnJheS5mcm9tKF90aGlzLmVsLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKHNpZ25hdHVyZSl7c2lnbmF0dXJlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLGZ1bmN0aW9uKGV2ZW50KXtyZXR1cm4gX3RoaXMub25DbGljayhldmVudCl9KSxzaWduYXR1cmUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGV2ZW50KXtyZXR1cm4gX3RoaXMub25DbGljayhldmVudCl9KX0pLF90aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKSxfdGhpcy5zZXRJbmRleCgwKSksX3RoaXN9cmV0dXJuIF9fZXh0ZW5kcyhTaWduYXR1cmUsX3N1cGVyKSxTaWduYXR1cmUucHJvdG90eXBlLnNldEluZGV4PWZ1bmN0aW9uKGluZGV4KXtpZihpbmRleDwwJiYoaW5kZXg9MCksaW5kZXg+dGhpcy5ncm91cHMubGVuZ3RoLTEmJihpbmRleD10aGlzLmdyb3Vwcy5sZW5ndGgtMSksdGhpcy5pbmRleCE9aW5kZXgpe3ZhciB0bz10aGlzLmdyb3Vwc1tpbmRleF07aWYoLTE8dGhpcy5pbmRleCl7dmFyIGZyb21fMT10aGlzLmdyb3Vwc1t0aGlzLmluZGV4XTtmcm9tXzEucmVtb3ZlQ2xhc3MoImN1cnJlbnQiKS5hZGRDbGFzcygiZmFkZS1vdXQiKSx0by5hZGRDbGFzcygiY3VycmVudCIpLHRvLmFkZENsYXNzKCJmYWRlLWluIiksdHlwZWRvYy52aWV3cG9ydC50cmlnZ2VyUmVzaXplKCksc2V0VGltZW91dChmdW5jdGlvbigpe2Zyb21fMS5yZW1vdmVDbGFzcygiZmFkZS1vdXQiKSx0by5yZW1vdmVDbGFzcygiZmFkZS1pbiIpfSwzMDApfWVsc2UgdG8uYWRkQ2xhc3MoImN1cnJlbnQiKSx0eXBlZG9jLnZpZXdwb3J0LnRyaWdnZXJSZXNpemUoKTt0aGlzLmluZGV4PWluZGV4fX0sU2lnbmF0dXJlLnByb3RvdHlwZS5jcmVhdGVHcm91cHM9ZnVuY3Rpb24oKXt2YXIgc2lnbmF0dXJlcz10aGlzLmVsLmNoaWxkcmVuO2lmKCEoc2lnbmF0dXJlcy5sZW5ndGg8Mikpe3RoaXMuY29udGFpbmVyPXRoaXMuZWwubmV4dEVsZW1lbnRTaWJsaW5nO3ZhciBkZXNjcmlwdGlvbnM9dGhpcy5jb250YWluZXIuY2hpbGRyZW47dGhpcy5ncm91cHM9W107Zm9yKHZhciBpbmRleD0wO2luZGV4PHNpZ25hdHVyZXMubGVuZ3RoO2luZGV4KyspdGhpcy5ncm91cHMucHVzaChuZXcgU2lnbmF0dXJlR3JvdXAoc2lnbmF0dXJlc1tpbmRleF0sZGVzY3JpcHRpb25zW2luZGV4XSkpfX0sU2lnbmF0dXJlLnByb3RvdHlwZS5vbkNsaWNrPWZ1bmN0aW9uKGUpe3ZhciBfdGhpcz10aGlzO3RoaXMuZ3JvdXBzLmZvckVhY2goZnVuY3Rpb24oZ3JvdXAsaW5kZXgpe2dyb3VwLnNpZ25hdHVyZT09PWUuY3VycmVudFRhcmdldCYmX3RoaXMuc2V0SW5kZXgoaW5kZXgpfSl9LFNpZ25hdHVyZX0odHlwZWRvYy5Db21wb25lbnQpO3R5cGVkb2MucmVnaXN0ZXJDb21wb25lbnQoU2lnbmF0dXJlLCIudHNkLXNpZ25hdHVyZXMiKX0odHlwZWRvY3x8KHR5cGVkb2M9e30pKSxmdW5jdGlvbih0eXBlZG9jKXt2YXIgVG9nZ2xlPWZ1bmN0aW9uKF9zdXBlcil7ZnVuY3Rpb24gVG9nZ2xlKG9wdGlvbnMpe3ZhciBfdGhpcz1fc3VwZXIuY2FsbCh0aGlzLG9wdGlvbnMpfHx0aGlzO3JldHVybiBfdGhpcy5jbGFzc05hbWU9X3RoaXMuZWwuZGF0YXNldC50b2dnbGV8fCIiLF90aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIodHlwZWRvYy5wb2ludGVyVXAsZnVuY3Rpb24oZSl7cmV0dXJuIF90aGlzLm9uUG9pbnRlclVwKGUpfSksX3RoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGUpe3JldHVybiBlLnByZXZlbnREZWZhdWx0KCl9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGVkb2MucG9pbnRlckRvd24sZnVuY3Rpb24oZSl7cmV0dXJuIF90aGlzLm9uRG9jdW1lbnRQb2ludGVyRG93bihlKX0pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZWRvYy5wb2ludGVyVXAsZnVuY3Rpb24oZSl7cmV0dXJuIF90aGlzLm9uRG9jdW1lbnRQb2ludGVyVXAoZSl9KSxfdGhpc31yZXR1cm4gX19leHRlbmRzKFRvZ2dsZSxfc3VwZXIpLFRvZ2dsZS5wcm90b3R5cGUuc2V0QWN0aXZlPWZ1bmN0aW9uKHZhbHVlKXtpZih0aGlzLmFjdGl2ZSE9dmFsdWUpe3RoaXMuYWN0aXZlPXZhbHVlLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCJoYXMtIit0aGlzLmNsYXNzTmFtZSx2YWx1ZSksdGhpcy5lbC5jbGFzc0xpc3QudG9nZ2xlKCJhY3RpdmUiLHZhbHVlKTt2YXIgdHJhbnNpdGlvbj0odGhpcy5hY3RpdmU/InRvLWhhcy0iOiJmcm9tLWhhcy0iKSt0aGlzLmNsYXNzTmFtZTtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0cmFuc2l0aW9uKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHRyYW5zaXRpb24pfSw1MDApfX0sVG9nZ2xlLnByb3RvdHlwZS5vblBvaW50ZXJVcD1mdW5jdGlvbihldmVudCl7dHlwZWRvYy5oYXNQb2ludGVyTW92ZWR8fCh0aGlzLnNldEFjdGl2ZSghMCksZXZlbnQucHJldmVudERlZmF1bHQoKSl9LFRvZ2dsZS5wcm90b3R5cGUub25Eb2N1bWVudFBvaW50ZXJEb3duPWZ1bmN0aW9uKGUpe2lmKHRoaXMuYWN0aXZlKXtpZihlLnRhcmdldC5jbG9zZXN0KCIuY29sLW1lbnUsIC50c2QtZmlsdGVyLWdyb3VwIikpcmV0dXJuO3RoaXMuc2V0QWN0aXZlKCExKX19LFRvZ2dsZS5wcm90b3R5cGUub25Eb2N1bWVudFBvaW50ZXJVcD1mdW5jdGlvbihlKXt2YXIgX3RoaXM9dGhpcztpZighdHlwZWRvYy5oYXNQb2ludGVyTW92ZWQmJnRoaXMuYWN0aXZlJiZlLnRhcmdldC5jbG9zZXN0KCIuY29sLW1lbnUiKSl7dmFyIGxpbms9ZS50YXJnZXQuY2xvc2VzdCgiYSIpO2lmKGxpbmspe3ZhciBocmVmPXdpbmRvdy5sb2NhdGlvbi5ocmVmOy0xIT1ocmVmLmluZGV4T2YoIiMiKSYmKGhyZWY9aHJlZi5zdWJzdHIoMCxocmVmLmluZGV4T2YoIiMiKSkpLGxpbmsuaHJlZi5zdWJzdHIoMCxocmVmLmxlbmd0aCk9PWhyZWYmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXMuc2V0QWN0aXZlKCExKX0sMjUwKX19fSxUb2dnbGV9KHR5cGVkb2MuQ29tcG9uZW50KTt0eXBlZG9jLnJlZ2lzdGVyQ29tcG9uZW50KFRvZ2dsZSwiYVtkYXRhLXRvZ2dsZV0iKX0odHlwZWRvY3x8KHR5cGVkb2M9e30pKSxmdW5jdGlvbih0eXBlZG9jKXt0eXBlZG9jLmFwcD1uZXcgdHlwZWRvYy5BcHBsaWNhdGlvbn0odHlwZWRvY3x8KHR5cGVkb2M9e30pKTs= |
| 1 | LyoqCiAqIEBmaWxlb3ZlcnZpZXcgUnVsZSB0byBjaGVjayBlbXB0eSBuZXdsaW5lIGFmdGVyICJ2YXIiIHN0YXRlbWVudAogKiBAYXV0aG9yIEdvcGFsIFZlbmthdGVzYW4KICogQGRlcHJlY2F0ZWQKICovCgoidXNlIHN0cmljdCI7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBSZXF1aXJlbWVudHMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmNvbnN0IGFzdFV0aWxzID0gcmVxdWlyZSgiLi91dGlscy9hc3QtdXRpbHMiKTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFJ1bGUgRGVmaW5pdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgICBtZXRhOiB7CiAgICAgICAgdHlwZTogImxheW91dCIsCgogICAgICAgIGRvY3M6IHsKICAgICAgICAgICAgZGVzY3JpcHRpb246ICJyZXF1aXJlIG9yIGRpc2FsbG93IGFuIGVtcHR5IGxpbmUgYWZ0ZXIgdmFyaWFibGUgZGVjbGFyYXRpb25zIiwKICAgICAgICAgICAgY2F0ZWdvcnk6ICJTdHlsaXN0aWMgSXNzdWVzIiwKICAgICAgICAgICAgcmVjb21tZW5kZWQ6IGZhbHNlLAogICAgICAgICAgICB1cmw6ICJodHRwczovL2VzbGludC5vcmcvZG9jcy9ydWxlcy9uZXdsaW5lLWFmdGVyLXZhciIKICAgICAgICB9LAogICAgICAgIHNjaGVtYTogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlbnVtOiBbIm5ldmVyIiwgImFsd2F5cyJdCiAgICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgIGZpeGFibGU6ICJ3aGl0ZXNwYWNlIiwKICAgICAgICBtZXNzYWdlczogewogICAgICAgICAgICBleHBlY3RlZDogIkV4cGVjdGVkIGJsYW5rIGxpbmUgYWZ0ZXIgdmFyaWFibGUgZGVjbGFyYXRpb25zLiIsCiAgICAgICAgICAgIHVuZXhwZWN0ZWQ6ICJVbmV4cGVjdGVkIGJsYW5rIGxpbmUgYWZ0ZXIgdmFyaWFibGUgZGVjbGFyYXRpb25zLiIKICAgICAgICB9LAoKICAgICAgICBkZXByZWNhdGVkOiB0cnVlLAoKICAgICAgICByZXBsYWNlZEJ5OiBbInBhZGRpbmctbGluZS1iZXR3ZWVuLXN0YXRlbWVudHMiXQogICAgfSwKCiAgICBjcmVhdGUoY29udGV4dCkgewogICAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBjb250ZXh0LmdldFNvdXJjZUNvZGUoKTsKCiAgICAgICAgLy8gRGVmYXVsdCBgbW9kZWAgdG8gImFsd2F5cyIuCiAgICAgICAgY29uc3QgbW9kZSA9IGNvbnRleHQub3B0aW9uc1swXSA9PT0gIm5ldmVyIiA/ICJuZXZlciIgOiAiYWx3YXlzIjsKCiAgICAgICAgLy8gQ2FjaGUgc3RhcnRpbmcgYW5kIGVuZGluZyBsaW5lIG51bWJlcnMgb2YgY29tbWVudHMgZm9yIGZhc3RlciBsb29rdXAKICAgICAgICBjb25zdCBjb21tZW50RW5kTGluZSA9IHNvdXJjZUNvZGUuZ2V0QWxsQ29tbWVudHMoKS5yZWR1Y2UoKHJlc3VsdCwgdG9rZW4pID0+IHsKICAgICAgICAgICAgcmVzdWx0W3Rva2VuLmxvYy5zdGFydC5saW5lXSA9IHRva2VuLmxvYy5lbmQubGluZTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LCB7fSk7CgoKICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgLy8gSGVscGVycwogICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBhIHRva2VuIGZyb20gdGhlIGdpdmVuIG5vZGUgdG8gY29tcGFyZSBsaW5lIHRvIHRoZSBuZXh0IHN0YXRlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEluIGdlbmVyYWwsIHRoZSB0b2tlbiBpcyB0aGUgbGFzdCB0b2tlbiBvZiB0aGUgbm9kZS4gSG93ZXZlciwgdGhlIHRva2VuIGlzIHRoZSBzZWNvbmQgbGFzdCB0b2tlbiBpZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgc2F0aXNmeS4KICAgICAgICAgKgogICAgICAgICAqIC0gVGhlIGxhc3QgdG9rZW4gaXMgc2VtaWNvbG9uLgogICAgICAgICAqIC0gVGhlIHNlbWljb2xvbiBpcyBvbiBhIGRpZmZlcmVudCBsaW5lIGZyb20gdGhlIHByZXZpb3VzIHRva2VuIG9mIHRoZSBzZW1pY29sb24uCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIGJlaGF2aW9yIHdvdWxkIGFkZHJlc3Mgc2VtaWNvbG9uLWxlc3Mgc3R5bGUgY29kZS4gZS5nLjoKICAgICAgICAgKgogICAgICAgICAqICAgICB2YXIgZm9vID0gMQogICAgICAgICAqCiAgICAgICAgICogICAgIDsoYSB8fCBiKS5kb1NvbWV0aGluZygpCiAgICAgICAgICogQHBhcmFtIHtBU1ROb2RlfSBub2RlIFRoZSBub2RlIHRvIGdldC4KICAgICAgICAgKiBAcmV0dXJucyB7VG9rZW59IFRoZSB0b2tlbiB0byBjb21wYXJlIGxpbmUgdG8gdGhlIG5leHQgc3RhdGVtZW50LgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldExhc3RUb2tlbihub2RlKSB7CiAgICAgICAgICAgIGNvbnN0IGxhc3RUb2tlbiA9IHNvdXJjZUNvZGUuZ2V0TGFzdFRva2VuKG5vZGUpOwoKICAgICAgICAgICAgaWYgKGxhc3RUb2tlbi50eXBlID09PSAiUHVuY3R1YXRvciIgJiYgbGFzdFRva2VuLnZhbHVlID09PSAiOyIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHByZXZUb2tlbiA9IHNvdXJjZUNvZGUuZ2V0VG9rZW5CZWZvcmUobGFzdFRva2VuKTsKCiAgICAgICAgICAgICAgICBpZiAocHJldlRva2VuLmxvYy5lbmQubGluZSAhPT0gbGFzdFRva2VuLmxvYy5zdGFydC5saW5lKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZUb2tlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGxhc3RUb2tlbjsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZSBpZiBwcm92aWRlZCBrZXl3b3JkIGlzIGEgdmFyaWFibGUgZGVjbGFyYXRpb24KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXl3b3JkIGtleXdvcmQgdG8gdGVzdAogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGBrZXl3b3JkYCBpcyBhIHR5cGUgb2YgdmFyCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaXNWYXIoa2V5d29yZCkgewogICAgICAgICAgICByZXR1cm4ga2V5d29yZCA9PT0gInZhciIgfHwga2V5d29yZCA9PT0gImxldCIgfHwga2V5d29yZCA9PT0gImNvbnN0IjsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZSBpZiBwcm92aWRlZCBrZXl3b3JkIGlzIGEgdmFyaWFudCBvZiBmb3Igc3BlY2lmaWVycwogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleXdvcmQga2V5d29yZCB0byB0ZXN0CiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYGtleXdvcmRgIGlzIGEgdmFyaWFudCBvZiBmb3Igc3BlY2lmaWVyCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaXNGb3JUeXBlU3BlY2lmaWVyKGtleXdvcmQpIHsKICAgICAgICAgICAgcmV0dXJuIGtleXdvcmQgPT09ICJGb3JTdGF0ZW1lbnQiIHx8IGtleXdvcmQgPT09ICJGb3JJblN0YXRlbWVudCIgfHwga2V5d29yZCA9PT0gIkZvck9mU3RhdGVtZW50IjsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZSBpZiBwcm92aWRlZCBrZXl3b3JkIGlzIGFuIGV4cG9ydCBzcGVjaWZpZXJzCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbm9kZVR5cGUgbm9kZVR5cGUgdG8gdGVzdAogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGBub2RlVHlwZWAgaXMgYW4gZXhwb3J0IHNwZWNpZmllcgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGlzRXhwb3J0U3BlY2lmaWVyKG5vZGVUeXBlKSB7CiAgICAgICAgICAgIHJldHVybiBub2RlVHlwZSA9PT0gIkV4cG9ydE5hbWVkRGVjbGFyYXRpb24iIHx8IG5vZGVUeXBlID09PSAiRXhwb3J0U3BlY2lmaWVyIiB8fAogICAgICAgICAgICAgICAgbm9kZVR5cGUgPT09ICJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24iIHx8IG5vZGVUeXBlID09PSAiRXhwb3J0QWxsRGVjbGFyYXRpb24iOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lIGlmIHByb3ZpZGVkIG5vZGUgaXMgdGhlIGxhc3Qgb2YgdGhlaXIgcGFyZW50IGJsb2NrLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBU1ROb2RlfSBub2RlIG5vZGUgdG8gdGVzdAogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGBub2RlYCBpcyBsYXN0IG9mIHRoZWlyIHBhcmVudCBibG9jay4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBpc0xhc3ROb2RlKG5vZGUpIHsKICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBzb3VyY2VDb2RlLmdldFRva2VuQWZ0ZXIobm9kZSk7CgogICAgICAgICAgICByZXR1cm4gIXRva2VuIHx8ICh0b2tlbi50eXBlID09PSAiUHVuY3R1YXRvciIgJiYgdG9rZW4udmFsdWUgPT09ICJ9Iik7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBsYXN0IGxpbmUgb2YgYSBncm91cCBvZiBjb25zZWN1dGl2ZSBjb21tZW50cwogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb21tZW50U3RhcnRMaW5lIFRoZSBzdGFydGluZyBsaW5lIG9mIHRoZSBncm91cAogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgdGhlIGxhc3QgY29tbWVudCBsaW5lIG9mIHRoZSBncm91cAogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldExhc3RDb21tZW50TGluZU9mQmxvY2soY29tbWVudFN0YXJ0TGluZSkgewogICAgICAgICAgICBjb25zdCBjdXJyZW50Q29tbWVudEVuZCA9IGNvbW1lbnRFbmRMaW5lW2NvbW1lbnRTdGFydExpbmVdOwoKICAgICAgICAgICAgcmV0dXJuIGNvbW1lbnRFbmRMaW5lW2N1cnJlbnRDb21tZW50RW5kICsgMV0gPyBnZXRMYXN0Q29tbWVudExpbmVPZkJsb2NrKGN1cnJlbnRDb21tZW50RW5kICsgMSkgOiBjdXJyZW50Q29tbWVudEVuZDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZSBpZiBhIHRva2VuIHN0YXJ0cyBtb3JlIHRoYW4gb25lIGxpbmUgYWZ0ZXIgYSBjb21tZW50IGVuZHMKICAgICAgICAgKiBAcGFyYW0gIHt0b2tlbn0gICB0b2tlbiAgICAgICAgICAgIFRoZSB0b2tlbiBiZWluZyBjaGVja2VkCiAgICAgICAgICogQHBhcmFtIHtpbnRlZ2VyfSAgY29tbWVudFN0YXJ0TGluZSBUaGUgbGluZSBudW1iZXIgb24gd2hpY2ggdGhlIGNvbW1lbnQgc3RhcnRzCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59ICAgICAgICAgICAgICAgICBUcnVlIGlmIGB0b2tlbmAgZG9lcyBub3Qgc3RhcnQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjb21tZW50CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaGFzQmxhbmtMaW5lQWZ0ZXJDb21tZW50KHRva2VuLCBjb21tZW50U3RhcnRMaW5lKSB7CiAgICAgICAgICAgIHJldHVybiB0b2tlbi5sb2Muc3RhcnQubGluZSA+IGdldExhc3RDb21tZW50TGluZU9mQmxvY2soY29tbWVudFN0YXJ0TGluZSkgKyAxOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIHRoYXQgYSBibGFuayBsaW5lIGV4aXN0cyBhZnRlciBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHdoZW4gbW9kZSBpcwogICAgICAgICAqIHNldCB0byAiYWx3YXlzIiwgb3IgY2hlY2tzIHRoYXQgdGhlcmUgaXMgbm8gYmxhbmsgbGluZSB3aGVuIG1vZGUgaXMgc2V0CiAgICAgICAgICogdG8gIm5ldmVyIgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBU1ROb2RlfSBub2RlIGBWYXJpYWJsZURlY2xhcmF0aW9uYCBub2RlIHRvIHRlc3QKICAgICAgICAgKiBAcmV0dXJucyB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjaGVja0ZvckJsYW5rTGluZShub2RlKSB7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBsYXN0VG9rZW4gaXMgdGhlIGxhc3QgdG9rZW4gb24gdGhlIG5vZGUncyBsaW5lLiBJdCB3aWxsIHVzdWFsbHkgYWxzbyBiZSB0aGUgbGFzdCB0b2tlbiBvZiB0aGUgbm9kZSwgYnV0IGl0IHdpbGwKICAgICAgICAgICAgICogc29tZXRpbWVzIGJlIHNlY29uZC1sYXN0IGlmIHRoZXJlIGlzIGEgc2VtaWNvbG9uIG9uIGEgZGlmZmVyZW50IGxpbmUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSBnZXRMYXN0VG9rZW4obm9kZSksCgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIElmIGxhc3RUb2tlbiBpcyB0aGUgbGFzdCB0b2tlbiBvZiB0aGUgbm9kZSwgbmV4dFRva2VuIHNob3VsZCBiZSB0aGUgdG9rZW4gYWZ0ZXIgdGhlIG5vZGUuIE90aGVyd2lzZSwgbmV4dFRva2VuCiAgICAgICAgICAgICAgICAgKiBpcyB0aGUgbGFzdCB0b2tlbiBvZiB0aGUgbm9kZS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbmV4dFRva2VuID0gbGFzdFRva2VuID09PSBzb3VyY2VDb2RlLmdldExhc3RUb2tlbihub2RlKSA/IHNvdXJjZUNvZGUuZ2V0VG9rZW5BZnRlcihub2RlKSA6IHNvdXJjZUNvZGUuZ2V0TGFzdFRva2VuKG5vZGUpLAogICAgICAgICAgICAgICAgbmV4dExpbmVOdW0gPSBsYXN0VG9rZW4ubG9jLmVuZC5saW5lICsgMTsKCiAgICAgICAgICAgIC8vIElnbm9yZSBpZiB0aGVyZSBpcyBubyBmb2xsb3dpbmcgc3RhdGVtZW50CiAgICAgICAgICAgIGlmICghbmV4dFRva2VuKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElnbm9yZSBpZiBwYXJlbnQgb2Ygbm9kZSBpcyBhIGZvciB2YXJpYW50CiAgICAgICAgICAgIGlmIChpc0ZvclR5cGVTcGVjaWZpZXIobm9kZS5wYXJlbnQudHlwZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSWdub3JlIGlmIHBhcmVudCBvZiBub2RlIGlzIGFuIGV4cG9ydCBzcGVjaWZpZXIKICAgICAgICAgICAgaWYgKGlzRXhwb3J0U3BlY2lmaWVyKG5vZGUucGFyZW50LnR5cGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFNvbWUgY29kaW5nIHN0eWxlcyB1c2UgbXVsdGlwbGUgYHZhcmAgc3RhdGVtZW50cywgc28gZG8gbm90aGluZyBpZgogICAgICAgICAgICAgKiB0aGUgbmV4dCB0b2tlbiBpcyBhIGB2YXJgIHN0YXRlbWVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChuZXh0VG9rZW4udHlwZSA9PT0gIktleXdvcmQiICYmIGlzVmFyKG5leHRUb2tlbi52YWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSWdub3JlIGlmIGl0IGlzIGxhc3Qgc3RhdGVtZW50IGluIGEgYmxvY2sKICAgICAgICAgICAgaWYgKGlzTGFzdE5vZGUobm9kZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gTmV4dCBzdGF0ZW1lbnQgaXMgbm90IGEgYHZhcmAuLi4KICAgICAgICAgICAgY29uc3Qgbm9OZXh0TGluZVRva2VuID0gbmV4dFRva2VuLmxvYy5zdGFydC5saW5lID4gbmV4dExpbmVOdW07CiAgICAgICAgICAgIGNvbnN0IGhhc05leHRMaW5lQ29tbWVudCA9ICh0eXBlb2YgY29tbWVudEVuZExpbmVbbmV4dExpbmVOdW1dICE9PSAidW5kZWZpbmVkIik7CgogICAgICAgICAgICBpZiAobW9kZSA9PT0gIm5ldmVyIiAmJiBub05leHRMaW5lVG9rZW4gJiYgIWhhc05leHRMaW5lQ29tbWVudCkgewogICAgICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoewogICAgICAgICAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkOiAidW5leHBlY3RlZCIsCiAgICAgICAgICAgICAgICAgICAgZGF0YTogeyBpZGVudGlmaWVyOiBub2RlLm5hbWUgfSwKICAgICAgICAgICAgICAgICAgICBmaXgoZml4ZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZXNCZXR3ZWVuID0gc291cmNlQ29kZS5nZXRUZXh0KCkuc2xpY2UobGFzdFRva2VuLnJhbmdlWzFdLCBuZXh0VG9rZW4ucmFuZ2VbMF0pLnNwbGl0KGFzdFV0aWxzLkxJTkVCUkVBS19NQVRDSEVSKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXhlci5yZXBsYWNlVGV4dFJhbmdlKFtsYXN0VG9rZW4ucmFuZ2VbMV0sIG5leHRUb2tlbi5yYW5nZVswXV0sIGAke2xpbmVzQmV0d2Vlbi5zbGljZSgwLCAtMSkuam9pbigiIil9XG4ke2xpbmVzQmV0d2VlbltsaW5lc0JldHdlZW4ubGVuZ3RoIC0gMV19YCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRva2VuIG9uIHRoZSBuZXh0IGxpbmUsIG9yIGNvbW1lbnQgd2l0aG91dCBibGFuayBsaW5lCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIG1vZGUgPT09ICJhbHdheXMiICYmICgKICAgICAgICAgICAgICAgICAgICAhbm9OZXh0TGluZVRva2VuIHx8CiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dExpbmVDb21tZW50ICYmICFoYXNCbGFua0xpbmVBZnRlckNvbW1lbnQobmV4dFRva2VuLCBuZXh0TGluZU51bSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7CiAgICAgICAgICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6ICJleHBlY3RlZCIsCiAgICAgICAgICAgICAgICAgICAgZGF0YTogeyBpZGVudGlmaWVyOiBub2RlLm5hbWUgfSwKICAgICAgICAgICAgICAgICAgICBmaXgoZml4ZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChub05leHRMaW5lVG9rZW4gPyBnZXRMYXN0Q29tbWVudExpbmVPZkJsb2NrKG5leHRMaW5lTnVtKSA6IGxhc3RUb2tlbi5sb2MuZW5kLmxpbmUpID09PSBuZXh0VG9rZW4ubG9jLnN0YXJ0LmxpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXhlci5pbnNlcnRUZXh0QmVmb3JlKG5leHRUb2tlbiwgIlxuXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpeGVyLmluc2VydFRleHRCZWZvcmVSYW5nZShbbmV4dFRva2VuLnJhbmdlWzBdIC0gbmV4dFRva2VuLmxvYy5zdGFydC5jb2x1bW4sIG5leHRUb2tlbi5yYW5nZVsxXV0sICJcbiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgLy8gUHVibGljCiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uOiBjaGVja0ZvckJsYW5rTGluZQogICAgICAgIH07CgogICAgfQp9Owo= |
| 1 | InVzZSBzdHJpY3QiOw0KdmFyIF9fbWFrZVRlbXBsYXRlT2JqZWN0ID0gKHRoaXMgJiYgdGhpcy5fX21ha2VUZW1wbGF0ZU9iamVjdCkgfHwgZnVuY3Rpb24gKGNvb2tlZCwgcmF3KSB7DQogICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCAicmF3IiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9DQogICAgcmV0dXJuIGNvb2tlZDsNCn07DQp2YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHsNCiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7ICJkZWZhdWx0IjogbW9kIH07DQp9Ow0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsNCmV4cG9ydHMuaGVscCA9IHZvaWQgMDsNCnZhciBjaGFsa18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoImNoYWxrIikpOw0KLyoqDQogKiBAaWdub3JlDQogKg0KICogVGhpcyBtZXRob2QgcHJpbnRzIHRoZSBoZWxwIHRleHQuDQogKi8NCmZ1bmN0aW9uIGhlbHAoKSB7DQogICAgY29uc29sZS5sb2coY2hhbGtfMS5kZWZhdWx0KHRlbXBsYXRlT2JqZWN0XzEgfHwgKHRlbXBsYXRlT2JqZWN0XzEgPSBfX21ha2VUZW1wbGF0ZU9iamVjdChbIlxuICB7Ym9sZC5ibHVlQnJpZ2h0IFNZTlRBWH1cbiAgICB7Ym9sZC5ncmVlbiBhc3B9IC0taW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlIGEgdGVzdCBjb25maWcsIGFuIGFzc2VtYmx5L19fdGVzdHNfXyBmb2xkZXIgYW5kIGV4aXQuXG4gICAge2JvbGQuZ3JlZW4gYXNwfSAtaVxuICAgIHtib2xkLmdyZWVuIGFzcH0gLS1jb25maWc9YXMtcGVjdC5jb25maWcuanMgICAgICBVc2UgYSBzcGVjaWZpZWQgY29uZmlndXJhdGlvblxuICAgIHtib2xkLmdyZWVuIGFzcH0gLWMgYXMtcGVjdC5jb25maWcuanNcbiAgICB7Ym9sZC5ncmVlbiBhc3B9IC0tdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgVmlldyB0aGUgdmVyc2lvbi5cbiAgICB7Ym9sZC5ncmVlbiBhc3B9IC12XG4gICAge2JvbGQuZ3JlZW4gYXNwfSAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgdGhpcyBoZWxwIHNjcmVlbi5cbiAgICB7Ym9sZC5ncmVlbiBhc3B9IC1oXG4gICAge2JvbGQuZ3JlZW4gYXNwfSAtLXR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgIENvcHkgdGhlIHR5cGVzIGZpbGUgdG8gYXNzZW1ibHkvX190ZXN0c19fL2FzLXBlY3QuZC50c1xuICAgIHtib2xkLmdyZWVuIGFzcH0gLXRcbiAgICB7Ym9sZC5ncmVlbiBhc3B9IC0tbm9sb2dvICAgICAgICAgICAgICAgICAgICAgICAgU3VwcHJlc3MgQVNDSUkgYXJ0IGZyb20gcHJpbnRpbmcuXG4gICAge2JvbGQuZ3JlZW4gYXNwfSAtLWNvbXBpbGVyICAgICAgICAgICAgICAgICAgICAgIFBhdGggdG8gZm9sZGVyIHJlbGF0aXZlIHRvIHByb2plY3Qgcm9vdCB3aGljaCBjb250YWluc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpdGFsaWMubWFnZW50YSBmb2xkZXJ9L2Rpc3QvYXNjIGZvciB0aGUgY29tcGlsZXIgYW5kIHtpdGFsaWMubWFnZW50YSBmb2xkZXJ9L2xpYi9sb2FkZXIgZm9yIGxvYWRlci4ge3llbGxvdyAoRGVmYXVsdDogYXNzZW1ibHlzY3JpcHQpfVxuXG4gIHtib2xkLmJsdWVCcmlnaHQgTU9EVUxFIE9QVElPTlN9XG4gICAge2JvbGQuZ3JlZW4gLS1tZW1vcnktc2l6ZT1baW50ZWdlcl19ICAgICAgICAgICAgICBJbml0aWFsIHNpemUgb2YgaW1wb3J0ZWQgbWVtb3J5IGluIHBhZ2VzIG9mIDY0a2IuIHt5ZWxsb3cgKERlZmF1bHQ6IDEwIHBhZ2VzKX1cbiAgICB7Ym9sZC5ncmVlbiAtLW1lbW9yeS1tYXg9W2ludGVnZXJdfSAgICAgICAgICAgICAgIFNldCB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHBhZ2VzIHRoZSB3YXNtIHRlc3QgbW9kdWxlcyBjYW4gdXNlLiB7eWVsbG93IChEZWZhdWx0OiAtMSl9XG5cbiAge2JvbGQuYmx1ZUJyaWdodCBURVNUIE9QVElPTlN9XG4gICAge2JvbGQuZ3JlZW4gLS1maWxlPVtyZWdleF19ICAgICAgICAgICAgICAgICAgICAgICBSdW4gdGhlIHRlc3RzIG9mIGVhY2ggZmlsZSB0aGF0IG1hdGNoZXMgdGhpcyByZWdleC4ge3llbGxvdyAoRGVmYXVsdDogLy4vKX1cbiAgICAgIHtib2xkLmdyZWVuIC0tZmlsZXM9W3JlZ2V4XX1cbiAgICAgIHtib2xkLmdyZWVuIC1mPVtyZWdleF19XG5cbiAgICB7Ym9sZC5ncmVlbiAtLWdyb3VwPVtyZWdleF19ICAgICAgICAgICAgICAgICAgICAgIFJ1biBlYWNoIGRlc2NyaWJlIGJsb2NrIHRoYXQgbWF0Y2hlcyB0aGlzIHJlZ2V4IHt5ZWxsb3cgKERlZmF1bHQ6IC8oOj8pLyl9XG4gICAgICB7Ym9sZC5ncmVlbiAtLWdyb3Vwcz1bcmVnZXhdfVxuICAgICAge2JvbGQuZ3JlZW4gLWc9W3JlZ2V4XX1cblxuICAgIHtib2xkLmdyZWVuIC0tdGVzdD1bcmVnZXhdfSAgICAgICAgICAgICAgICAgICAgICAgUnVuIGVhY2ggdGVzdCB0aGF0IG1hdGNoZXMgdGhpcyByZWdleCB7eWVsbG93IChEZWZhdWx0OiAvKDo/KS8pfVxuICAgICAge2JvbGQuZ3JlZW4gLS10ZXN0cz1bcmVnZXhdfVxuICAgICAge2JvbGQuZ3JlZW4gLXQ9W3JlZ2V4XX1cblxuICAgIHtib2xkLmdyZWVuIC0tb3V0cHV0LWJpbmFyeX0gICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlIGEgKC53YXNtKSBmaWxlIGNhbiBjb250YWlucyBhbGwgdGhlIHRlc3RzIHRvIGJlIHJ1biBsYXRlci5cbiAgICAgIHtib2xkLmdyZWVuIC1vfVxuXG4gICAge2JvbGQuZ3JlZW4gLS1ub3J1bn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwIHJ1bm5pbmcgdGVzdHMgYW5kIG91dHB1dCB0aGUgY29tcGlsZXIgZmlsZXMuXG4gICAgICB7Ym9sZC5ncmVlbiAtbn1cblxuICAgIHtib2xkLmdyZWVuIC0tbm9ydHJhY2V9ICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcCBydHJhY2UgcmVmZXJlbmNlIGNvdW50aW5nIGNhbGN1bGF0aW9ucy5cbiAgICAgIHtib2xkLmdyZWVuIC1ucn1cblxuICAgIHtib2xkLmdyZWVuIGFzcCAtLXdvcmtlcnN9IDMgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlIHRoZSBleHBlcmltZW50YWwgd29ya2VyIHdvcmtsZXRzIHt5ZWxsb3cgKGRlZmF1bHQ6IDAge2dyYXkgW2Rpc2FibGVkXX0pfVxuICAgICAge2JvbGQuZ3JlZW4gYXNwfSAtd1xuXG4gICAge2JvbGQuZ3JlZW4gLS11cGRhdGV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGUgdGhlIHNuYXBzaG90cyBmb3IgZWFjaCB0ZXN0ZWQgbW9kdWxlLlxuICAgICAge2JvbGQuZ3JlZW4gYXNwfSAtdVxuXG4gIHtib2xkLmJsdWVCcmlnaHQgUkVQT1JURVIgT1BUSU9OU31cbiAgICAtLXN1bW1hcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoZSBzdW1tYXJ5IHJlcG9ydGVyLiB7eWVsbG93IChUaGlzIGlzIHRoZSBkZWZhdWx0IGlmIG5vIHJlcG9ydGVyIGlzIHNwZWNpZmllZC4pfVxuICAgIC0tdmVyYm9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgYSBtb3JlIHZlcmJvc2UgcmVwb3J0ZXIuXG4gICAgLS1jc3YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGUgY3N2IHJlcG9ydGVyIChvdXRwdXQgcmVzdWx0cyB0byBjc3YgZmlsZXMuKVxuICAgIC0tanNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhlIGpzb24gcmVwb3J0ZXIgKG91dHB1dCByZXN1bHRzIHRvIGpzb24gZmlsZXMuKVxuICAgIC0tcmVwb3J0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgYSBjdXN0b20gcmVwb3J0ZXIgKHBhdGggb3IgbW9kdWxlKVxuICAiXSwgWyJcbiAge2JvbGQuYmx1ZUJyaWdodCBTWU5UQVh9XG4gICAge2JvbGQuZ3JlZW4gYXNwfSAtLWluaXQgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBhIHRlc3QgY29uZmlnLCBhbiBhc3NlbWJseS9fX3Rlc3RzX18gZm9sZGVyIGFuZCBleGl0LlxuICAgIHtib2xkLmdyZWVuIGFzcH0gLWlcbiAgICB7Ym9sZC5ncmVlbiBhc3B9IC0tY29uZmlnPWFzLXBlY3QuY29uZmlnLmpzICAgICAgVXNlIGEgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb25cbiAgICB7Ym9sZC5ncmVlbiBhc3B9IC1jIGFzLXBlY3QuY29uZmlnLmpzXG4gICAge2JvbGQuZ3JlZW4gYXNwfSAtLXZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgIFZpZXcgdGhlIHZlcnNpb24uXG4gICAge2JvbGQuZ3JlZW4gYXNwfSAtdlxuICAgIHtib2xkLmdyZWVuIGFzcH0gLS1oZWxwICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93IHRoaXMgaGVscCBzY3JlZW4uXG4gICAge2JvbGQuZ3JlZW4gYXNwfSAtaFxuICAgIHtib2xkLmdyZWVuIGFzcH0gLS10eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICBDb3B5IHRoZSB0eXBlcyBmaWxlIHRvIGFzc2VtYmx5L19fdGVzdHNfXy9hcy1wZWN0LmQudHNcbiAgICB7Ym9sZC5ncmVlbiBhc3B9IC10XG4gICAge2JvbGQuZ3JlZW4gYXNwfSAtLW5vbG9nbyAgICAgICAgICAgICAgICAgICAgICAgIFN1cHByZXNzIEFTQ0lJIGFydCBmcm9tIHByaW50aW5nLlxuICAgIHtib2xkLmdyZWVuIGFzcH0gLS1jb21waWxlciAgICAgICAgICAgICAgICAgICAgICBQYXRoIHRvIGZvbGRlciByZWxhdGl2ZSB0byBwcm9qZWN0IHJvb3Qgd2hpY2ggY29udGFpbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aXRhbGljLm1hZ2VudGEgZm9sZGVyfS9kaXN0L2FzYyBmb3IgdGhlIGNvbXBpbGVyIGFuZCB7aXRhbGljLm1hZ2VudGEgZm9sZGVyfS9saWIvbG9hZGVyIGZvciBsb2FkZXIuIHt5ZWxsb3cgKERlZmF1bHQ6IGFzc2VtYmx5c2NyaXB0KX1cblxuICB7Ym9sZC5ibHVlQnJpZ2h0IE1PRFVMRSBPUFRJT05TfVxuICAgIHtib2xkLmdyZWVuIC0tbWVtb3J5LXNpemU9W2ludGVnZXJdfSAgICAgICAgICAgICAgSW5pdGlhbCBzaXplIG9mIGltcG9ydGVkIG1lbW9yeSBpbiBwYWdlcyBvZiA2NGtiLiB7eWVsbG93IChEZWZhdWx0OiAxMCBwYWdlcyl9XG4gICAge2JvbGQuZ3JlZW4gLS1tZW1vcnktbWF4PVtpbnRlZ2VyXX0gICAgICAgICAgICAgICBTZXQgdGhlIG1heGltdW0gYW1vdW50IG9mIG1lbW9yeSBwYWdlcyB0aGUgd2FzbSB0ZXN0IG1vZHVsZXMgY2FuIHVzZS4ge3llbGxvdyAoRGVmYXVsdDogLTEpfVxuXG4gIHtib2xkLmJsdWVCcmlnaHQgVEVTVCBPUFRJT05TfVxuICAgIHtib2xkLmdyZWVuIC0tZmlsZT1bcmVnZXhdfSAgICAgICAgICAgICAgICAgICAgICAgUnVuIHRoZSB0ZXN0cyBvZiBlYWNoIGZpbGUgdGhhdCBtYXRjaGVzIHRoaXMgcmVnZXguIHt5ZWxsb3cgKERlZmF1bHQ6IC8uLyl9XG4gICAgICB7Ym9sZC5ncmVlbiAtLWZpbGVzPVtyZWdleF19XG4gICAgICB7Ym9sZC5ncmVlbiAtZj1bcmVnZXhdfVxuXG4gICAge2JvbGQuZ3JlZW4gLS1ncm91cD1bcmVnZXhdfSAgICAgICAgICAgICAgICAgICAgICBSdW4gZWFjaCBkZXNjcmliZSBibG9jayB0aGF0IG1hdGNoZXMgdGhpcyByZWdleCB7eWVsbG93IChEZWZhdWx0OiAvKDo/KS8pfVxuICAgICAge2JvbGQuZ3JlZW4gLS1ncm91cHM9W3JlZ2V4XX1cbiAgICAgIHtib2xkLmdyZWVuIC1nPVtyZWdleF19XG5cbiAgICB7Ym9sZC5ncmVlbiAtLXRlc3Q9W3JlZ2V4XX0gICAgICAgICAgICAgICAgICAgICAgIFJ1biBlYWNoIHRlc3QgdGhhdCBtYXRjaGVzIHRoaXMgcmVnZXgge3llbGxvdyAoRGVmYXVsdDogLyg6PykvKX1cbiAgICAgIHtib2xkLmdyZWVuIC0tdGVzdHM9W3JlZ2V4XX1cbiAgICAgIHtib2xkLmdyZWVuIC10PVtyZWdleF19XG5cbiAgICB7Ym9sZC5ncmVlbiAtLW91dHB1dC1iaW5hcnl9ICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBhICgud2FzbSkgZmlsZSBjYW4gY29udGFpbnMgYWxsIHRoZSB0ZXN0cyB0byBiZSBydW4gbGF0ZXIuXG4gICAgICB7Ym9sZC5ncmVlbiAtb31cblxuICAgIHtib2xkLmdyZWVuIC0tbm9ydW59ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcCBydW5uaW5nIHRlc3RzIGFuZCBvdXRwdXQgdGhlIGNvbXBpbGVyIGZpbGVzLlxuICAgICAge2JvbGQuZ3JlZW4gLW59XG5cbiAgICB7Ym9sZC5ncmVlbiAtLW5vcnRyYWNlfSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXAgcnRyYWNlIHJlZmVyZW5jZSBjb3VudGluZyBjYWxjdWxhdGlvbnMuXG4gICAgICB7Ym9sZC5ncmVlbiAtbnJ9XG5cbiAgICB7Ym9sZC5ncmVlbiBhc3AgLS13b3JrZXJzfSAzICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZSB0aGUgZXhwZXJpbWVudGFsIHdvcmtlciB3b3JrbGV0cyB7eWVsbG93IChkZWZhdWx0OiAwIHtncmF5IFtkaXNhYmxlZF19KX1cbiAgICAgIHtib2xkLmdyZWVuIGFzcH0gLXdcblxuICAgIHtib2xkLmdyZWVuIC0tdXBkYXRlfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlIHRoZSBzbmFwc2hvdHMgZm9yIGVhY2ggdGVzdGVkIG1vZHVsZS5cbiAgICAgIHtib2xkLmdyZWVuIGFzcH0gLXVcblxuICB7Ym9sZC5ibHVlQnJpZ2h0IFJFUE9SVEVSIE9QVElPTlN9XG4gICAgLS1zdW1tYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGUgc3VtbWFyeSByZXBvcnRlci4ge3llbGxvdyAoVGhpcyBpcyB0aGUgZGVmYXVsdCBpZiBubyByZXBvcnRlciBpcyBzcGVjaWZpZWQuKX1cbiAgICAtLXZlcmJvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIGEgbW9yZSB2ZXJib3NlIHJlcG9ydGVyLlxuICAgIC0tY3N2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhlIGNzdiByZXBvcnRlciAob3V0cHV0IHJlc3VsdHMgdG8gY3N2IGZpbGVzLilcbiAgICAtLWpzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoZSBqc29uIHJlcG9ydGVyIChvdXRwdXQgcmVzdWx0cyB0byBqc29uIGZpbGVzLilcbiAgICAtLXJlcG9ydGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIGEgY3VzdG9tIHJlcG9ydGVyIChwYXRoIG9yIG1vZHVsZSlcbiAgIl0pKSkpOw0KfQ0KZXhwb3J0cy5oZWxwID0gaGVscDsNCnZhciB0ZW1wbGF0ZU9iamVjdF8xOw0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGVscC5qcy5tYXA= |
| 1 | { |
| 2 | "ActionError": { |
| 3 | "kind": { |
| 4 | "FunctionCallError": { |
| 5 | "MethodResolveError": "MethodNotFound" |
| 6 | } |
| 7 | }, |
| 8 | "index": 0 |
| 9 | } |
| 10 | } |
| 1 | |
| 1 | { |
| 2 | "deposit": "21506432351559000000000" |
| 3 | } |
Empty Result
| 1 | |