Survey
1.0.11
OTRS GmbH
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
fixed timezone bug and some code cleanup
update package for OTRS 2.1 framework and small code cleanup
change charset to iso-8895-1 and code cleanup
fix bug in RequestSend() if $MasterID is null
fix problems with blank fields
rename colum "number" to "surveynumber" in survey-table
fix "not null" error on oracle dbs
New package
A customer survey tool.
Ein Kundenumfragen Werkzeug.
2.1.x
2006-12-09 01:54:27
lancelot.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFN1cnZleS54bWwsdiAxLjggMjAwNi8xMS8yMSAyMzoxMzo1MyBtaCBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50U3VydmV5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+QWxsIHBhcmFtZXRlcnMgZm9yIHRoZSBTdXJ2ZXkgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFsbGUgUGFyYW1ldGVyIGRlcyBCZWZyYWd1bmdzLU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cnZleTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkEgU3VydmV5IE1vZHVsZTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5TdXJ2ZXk8L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8VGl0bGU+U3VydmV5PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkEgU3VydmV5IE1vZHVsZTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+U3VydmV5PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPk1lbnU8L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkl0ZW1BcmVhPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+c3VydmV5LnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50U3VydmV5PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+U3VydmV5PC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT51PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+ODAwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+T3ZlcnZpZXc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPk92ZXJ2aWV3PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5vdmVydmlldy5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudFN1cnZleTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5TdXJ2ZXk8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5Pm88L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4xMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPk5ldzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+TmV3PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5uZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRTdXJ2ZXkmYW1wO1N1YmFjdGlvbj1TdXJ2ZXlBZGQ8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+U3VydmV5PC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT5uPC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MjAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iUHVibGljRnJvbnRlbmQ6Ok1vZHVsZSMjI1B1YmxpY1N1cnZleSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBQdWJsaWNTdXJ2ZXkgb2JqZWN0IGluIHRoZSBwdWJsaWMgU3VydmV5IGFyZWEuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGb8ciBkYXMgUHVibGljU3VydmV5LU9iamVrdCBpbSD2ZmZlbnRsaWNoZW4gVW1mcmFnZS1CZXJlaWNoLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cnZleTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpQdWJsaWM6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5QdWJsaWMgU3VydmV5PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlN1cnZleTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxUaXRsZT5TdXJ2ZXk8L1RpdGxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN1cnZleTo6U2VuZFBlcmlvZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRheXMgc3RhcnRpbmcgZnJvbSB0aGUgbGF0ZXN0IGN1c3RvbWVyIHN1cnZleSBlbWFpbCBiZXR3ZWVuIG5vIGN1c3RvbWVyIHN1cnZleSBlbWFpbCBpcyBzZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5UYWdlIHp3aXNjaGVuIGRlciBsZXR6dGVuIEt1bmRlbi1VbWZyYWdlIHVuZCBkZW4ga2VpbmUgS3VuZGVuLVVtZnJhZ2UgZ2VzZW5kZXQgd2lyZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXJ2ZXk8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4zMDA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXJ2ZXk6Ok5vdGlmaWNhdGlvblNlbmRlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNlbmRlciBmb3IgdGhlIG5vdGlmaWNhdGlvbiBlbWFpbCB0byBjdXN0b21lcnMgYWJvdXQgbmV3IHN1cnZleS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U2VuZGVyIGb8ciBkaWUgQmVuYWNocmljaHRpZ3VuZ3NtYWlsIGFuIEt1bmRlbiBiemdsLiBuZXVlIFVtZnJhZ2VuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cnZleTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPnF1YWxpdHlAZXhhbXBsZS5jb208L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXJ2ZXk6Ok5vdGlmaWNhdGlvblN1YmplY3QiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TdWJqZWN0IGZvciB0aGUgbm90aWZpY2F0aW9uIGVtYWlsIHRvIGN1c3RvbWVycyBhYm91dCBuZXcgc3VydmV5LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5CZXRyZWZmIGb8ciBkaWUgQmVuYWNocmljaHRpZ3VuZ3NtYWlsIGFuIEt1bmRlbiBiemdsLiBuZXVlIFVtZnJhZ2VuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cnZleTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPkhlbHAgdXMgd2l0aCB5b3VyIGZlZWRiYWNrITwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN1cnZleTo6Tm90aWZpY2F0aW9uQm9keSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkJvZHkgZm9yIHRoZSBub3RpZmljYXRpb24gZW1haWwgdG8gY3VzdG9tZXJzIGFib3V0IG5ldyBzdXJ2ZXkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkJvZHkgZvxyIGRpZSBCZW5hY2hyaWNodGlndW5nc21haWwgYW4gS3VuZGVuIGJ6Z2wuIG5ldWUgVW1mcmFnZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VydmV5PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxUZXh0QXJlYT5EZWFyIEN1c3RvbWVyLAoKdGhhbmtzIGZvciB1c2luZyBvdXIgc2VydmljZS4gSGVscCB1cyB0byBpbXByb3ZlIHVzIGFuZCBvdXIgc2VydmljZXMuCgpHaXZlIHVzIGZlZWRiYWNrIHdoYXQgd2UgY2FuIGRvOgoKJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7cHVibGljLnBsP0FjdGlvbj1QdWJsaWNTdXJ2ZXkmYW1wO1B1YmxpY1N1cnZleUtleT0mbHQ7T1RSU19QdWJsaWNTdXJ2ZXlLZXkmZ3Q7CgpUaGFua3MgZm9yIHlvdXIgaGVscCEKCllvdXIgT1RSUy1UZWFtCiAgICAgICAgICAgIDwvVGV4dEFyZWE+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VydmV5OjpTZW5kTm9TdXJ2ZXlSZWdFeHAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB0aGlzIHJlZ2V4IG1hdGNoZXMsIG5vIGN1c3RvbWVyIHN1cnZleSB3aWxsIGJlIHNlbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlRyaWZmdCBkaWVzZXIgcmVndWzkcmUgQXVzZHJ1Y2sgenUsIHdpcmQga2VpbmUgQmVuYWNocmljaHRpZ3VuZ3NtYWlsIGFuIEt1bmRlbiBiemdsLiBuZXVlIFVtZnJhZ2VuIGdlc2VuZGV0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cnZleTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPihNQUlMRVItREFFTU9OfHBvc3RtYXN0ZXJ8YWJ1c2UpQC4rP1wuLis/PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpFdmVudE1vZHVsZVBvc3QjIyM5OS1TdXJ2ZXlTZW5kUmVxdWVzdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRpY2tldCBldmVudCBtb2R1bGUgdG8gc2VuZCBhdXRvbWF0aWNhbGx5IHN1cnZleSBlbWFpbCByZXF1ZXN0cyB0byBjdXN0b21lcnMgaWYgYSB0aWNrZXQgZ2V0cyBjbG9zZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlRpY2tldCBFdmVudCBNb2R1bCB3ZWxjaGVzIGF1dG9tYXRpc2NoIFVtZnJhZ2VuLUVtYWlscyBhbiBLdW5kZW4gd2VubiBkZXJlbiBUaWNrZXQgZ2VzY2hsb3NzZW4gd2lyZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXJ2ZXk8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6OlN1cnZleVNlbmRSZXF1ZXN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KFRpY2tldFN0YXRlVXBkYXRlfFN0YXRlU2V0KTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VydmV5LnBtIC0gbWFuYWdlIGFsbCBzdXJ2ZXkgbW9kdWxlIGV2ZW50cwojIENvcHlyaWdodCAoQykgMjAwMy0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBTdXJ2ZXkucG0sdiAxLjI5IDIwMDYvMTIvMDkgMDA6MzU6MjYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXJ2ZXk7Cgp1c2Ugc3RyaWN0Owp1c2UgRGlnZXN0OjpNRDU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW1haWw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0Owp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMjkgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6U3VydmV5IC0gc3VydmV5IGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgc3VydmV5IGZ1bmN0aW9ucy4gRS4gZy4gdG8gYWRkIHN1cnZleSBvciBhbmQgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IFRpbWVPYmplY3QgVXNlck9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAkU2VsZi0+e1NlbmRtYWlsT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0LT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gU3VydmV5TGlzdCgpCgp0byBnZXQgYSBhcnJheSBsaXN0IG9mIGFsbCBzdXJ2ZXkgaXRlbXMKCiAgICBteSBATGlzdCA9ICRTdXJ2ZXlPYmplY3QtPlN1cnZleUxpc3QoKTsKCj1jdXQKCnN1YiBTdXJ2ZXlMaXN0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15IEBMaXN0ID0gKCk7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgYXNrIHRoZSBkYgogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQgRlJPTSBzdXJ2ZXkgT1JERVIgQlkgY3JlYXRlX3RpbWUgREVTQyI7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CiAgICAjIGZldGNoIGFsbCByZXN1bHRzCiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICBwdXNoKEBMaXN0LCAkUm93WzBdKTsKICAgIH0KICAgICMgcmV0dXJuIGFycmF5CiAgICByZXR1cm4gQExpc3Q7Cn0KCj1pdGVtIFN1cnZleUdldCgpCgp0byBnZXQgYWxsIGF0dHJpYnV0ZXMgb2YgYSBzdXJ2ZXkKCiAgICBteSAlU3VydmV5ID0gJFN1cnZleU9iamVjdC0+U3VydmV5R2V0KAogICAgICAgIFN1cnZleUlEID0+IDEyMwogICAgKTsKCj1jdXQKCnN1YiBTdXJ2ZXlHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgZ2V0IGFsbCBhdHRyaWJ1dGVzIG9mIGEgc3VydmV5CiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgc3VydmV5bnVtYmVyLCB0aXRsZSwgaW50cm9kdWN0aW9uLCBkZXNjcmlwdGlvbiwiLgogICAgICAgICIgc3RhdHVzLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5ICIuCiAgICAgICAgIiBGUk9NIHN1cnZleSBXSEVSRSBpZCA9ICRQYXJhbXtTdXJ2ZXlJRH0iOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlRGF0YSA9ICgpOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJERhdGF7U3VydmV5SUR9ID0gJFJvd1swXTsKICAgICAgICAkRGF0YXtTdXJ2ZXlOdW1iZXJ9ID0gJFJvd1sxXTsKICAgICAgICAkRGF0YXtUaXRsZX0gPSAkUm93WzJdOwogICAgICAgICREYXRhe0ludHJvZHVjdGlvbn0gPSAkUm93WzNdOwogICAgICAgICREYXRhe0Rlc2NyaXB0aW9ufSA9ICRSb3dbNF07CiAgICAgICAgJERhdGF7U3RhdHVzfSA9ICRSb3dbNV07CiAgICAgICAgJERhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzZdOwogICAgICAgICREYXRhe0NyZWF0ZUJ5fSA9ICRSb3dbN107CiAgICAgICAgJERhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzhdOwogICAgICAgICREYXRhe0NoYW5nZUJ5fSA9ICRSb3dbOV07CiAgICB9CiAgICBpZiAoJURhdGEpIHsKICAgICAgICAjIGFkZGVkIENyZWF0ZUJ5CiAgICAgICAgbXkgJUNyZWF0ZVVzZXJJbmZvID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkRGF0YXtDcmVhdGVCeX0sCiAgICAgICAgICAgIENhY2hlZCA9PiAxCiAgICAgICAgKTsKICAgICAgICAkRGF0YXtDcmVhdGVVc2VyTG9naW59ID0gJENyZWF0ZVVzZXJJbmZve1VzZXJMb2dpbn07CiAgICAgICAgJERhdGF7Q3JlYXRlVXNlckZpcnN0bmFtZX0gPSAkQ3JlYXRlVXNlckluZm97VXNlckZpcnN0bmFtZX07CiAgICAgICAgJERhdGF7Q3JlYXRlVXNlckxhc3RuYW1lfSA9ICRDcmVhdGVVc2VySW5mb3tVc2VyTGFzdG5hbWV9OwogICAgICAgICMgYWRkZWQgQ2hhbmdlQnkKICAgICAgICBteSAlQ2hhbmdlVXNlckluZm8gPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICREYXRhe0NoYW5nZUJ5fSwKICAgICAgICAgICAgQ2FjaGVkID0+IDEKICAgICAgICApOwogICAgICAgICREYXRhe0NoYW5nZVVzZXJMb2dpbn0gPSAkQ2hhbmdlVXNlckluZm97VXNlckxvZ2lufTsKICAgICAgICAkRGF0YXtDaGFuZ2VVc2VyRmlyc3RuYW1lfSA9ICRDaGFuZ2VVc2VySW5mb3tVc2VyRmlyc3RuYW1lfTsKICAgICAgICAkRGF0YXtDaGFuZ2VVc2VyTGFzdG5hbWV9ID0gJENoYW5nZVVzZXJJbmZve1VzZXJMYXN0bmFtZX07CiAgICAgICAgIyByZXR1cm4gaGFzaAogICAgICAgIHJldHVybiAlRGF0YTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5vIHN1Y2ggU3VydmV5SUQgJFBhcmFte1N1cnZleUlEfSEiKTsKICAgICAgICByZXR1cm4gKCk7CiAgICB9Cn0KCj1pdGVtIFN1cnZleVN0YXR1c1NldCgpCgp0byBzZXQgYSBuZXcgc3VydmV5IHN0YXR1cyAoVmFsaWQsIEludmFsaWQsIE1hc3RlcikKCiAgICAkU3RhdHVzU2V0ID0gJFN1cnZleU9iamVjdC0+U3VydmV5U3RhdHVzU2V0KAogICAgICAgIFN1cnZleUlEID0+IDEyMywKICAgICAgICBOZXdTdGF0dXMgPT4gJ01hc3RlcicKICAgICk7Cgo9Y3V0CgpzdWIgU3VydmV5U3RhdHVzU2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCBOZXdTdGF0dXMpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoTmV3U3RhdHVzKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIGdldCBjdXJyZW50IHN0YXR1cwogICAgbXkgJFNRTCA9ICJTRUxFQ1Qgc3RhdHVzIEZST00gc3VydmV5IFdIRVJFIGlkID0gJFBhcmFte1N1cnZleUlEfSI7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRTdGF0dXMgPSAnJzsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRTdGF0dXMgPSAkUm93WzBdOwogICAgfQogICAgIyB0aGUgY3VyZW50IHN0YXR1cwogICAgaWYgKCRTdGF0dXMgZXEgJ05ldycgfHwgJFN0YXR1cyBlcSAnSW52YWxpZCcpIHsKICAgICAgICAjIGdldCB0aGUgcXVlc3Rpb24gaWRzCiAgICAgICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQgRlJPTSBzdXJ2ZXlfcXVlc3Rpb24gV0hFUkUgc3VydmV5X2lkID0gJFBhcmFte1N1cnZleUlEfSI7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15ICRRdWVzdCA9ICcnOwogICAgICAgIHdoaWxlIChteSBAUm93MiA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJFF1ZXN0ID0gJFJvdzJbMF07CiAgICAgICAgfQogICAgICAgICMgaWYgbW9yZSB0aGVuIG9uZSBxdWVzdGlvbgogICAgICAgIGlmICgkUXVlc3QpIHsKICAgICAgICAgICAgIyBnZXQgYWxsIHF1ZXN0aW9ucyAodHlwZSByYWRpbyBhbmQgY2hlY2tib3gpCiAgICAgICAgICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkIEZST00gc3VydmV5X3F1ZXN0aW9uIi4KICAgICAgICAgICAgICAgICIgV0hFUkUgc3VydmV5X2lkID0gJFBhcmFte1N1cnZleUlEfSBBTkQgKHR5cGUgPSAnUmFkaW8nIE9SIHR5cGUgPSAnQ2hlY2tib3gnKSI7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgICAgICAgICAgIyBpbml0IHRocmVlIHZhcnMKICAgICAgICAgICAgbXkgJEFsbFF1ZXN0aW9uc0Fuc2VycyA9ICdZZXMnOwogICAgICAgICAgICBteSBAUXVlc3Rpb25JRHMgPSAoKTsKICAgICAgICAgICAgbXkgJENvdW50ZXIxID0gMDsKICAgICAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgICAgIHdoaWxlIChteSBAUm93MyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgICAgICRRdWVzdGlvbklEc1skQ291bnRlcjFdID0gJFJvdzNbMF07CiAgICAgICAgICAgICAgICAkQ291bnRlcjErKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3JlYWNoIG15ICRPbmVJRChAUXVlc3Rpb25JRHMpIHsKICAgICAgICAgICAgICAgICMgZ2V0IGFsbCBhbnN3ZXIgaWRzIG9mIGEgcXVlc3Rpb24KICAgICAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAiU0VMRUNUIGlkIEZST00gc3VydmV5X2Fuc3dlciBXSEVSRSBxdWVzdGlvbl9pZCA9ICRPbmVJRCIpOwogICAgICAgICAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgICAgICAgICBteSAkQ291bnRlcjIgPSAnMCc7CiAgICAgICAgICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgICAgICAgICAkQ291bnRlcjIrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgaXRzIG9rLCBpZiBtaW5pbXVtIHR3byBhbnN3ZXJzIGRlZmluaWVkCiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIyIDwgMikgewogICAgICAgICAgICAgICAgICAgICRBbGxRdWVzdGlvbnNBbnNlcnMgPSAnbm8nOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAnSW5jb21wbGV0ZVF1ZXN0aW9uJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAjIHNldCBuZXcgc3RhdHVzIGlmIHN1cnZleSBpcyBjb21wbGV0ZQogICAgICAgICAgICBpZiAoJEFsbFF1ZXN0aW9uc0Fuc2VycyBlcSAnWWVzJykgewogICAgICAgICAgICAgICAgIyBzZXQgc3RhdHVzIFZhbGlkCiAgICAgICAgICAgICAgICBpZiAoJFBhcmFte05ld1N0YXR1c30gZXEgJ1ZhbGlkJykgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5IFNFVCBzdGF0dXMgPSAnVmFsaWQnIFdIRVJFIGlkID0gJFBhcmFte1N1cnZleUlEfSIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1N0YXR1c1NldCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjIHNldCBzdGF0dXMgTWFzdGVyCiAgICAgICAgICAgICAgICBlbHNpZiAoJFBhcmFte05ld1N0YXR1c30gZXEgJ01hc3RlcicpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleSBTRVQgc3RhdHVzID0gJ01hc3RlcicgV0hFUkUgaWQgPSAkUGFyYW17U3VydmV5SUR9IiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAnU3RhdHVzU2V0JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICdOb1F1ZXN0aW9uJzsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoJFN0YXR1cyBlcSAnVmFsaWQnKSB7CiAgICAgICAgIyBzZXQgc3RhdHVzIE1hc3RlcgogICAgICAgIGlmICgkUGFyYW17TmV3U3RhdHVzfSBlcSAnTWFzdGVyJykgewogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXkgU0VUIHN0YXR1cyA9ICdWYWxpZCcgV0hFUkUgc3RhdHVzID0gJ01hc3RlciciLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXkgU0VUIHN0YXR1cyA9ICdNYXN0ZXInIFdIRVJFIGlkID0gJFBhcmFte1N1cnZleUlEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAnU3RhdHVzU2V0JzsKICAgICAgICB9CiAgICAgICAgIyBzZXQgc3RhdHVzIEludmFsaWQKICAgICAgICBlbHNpZiAoJFBhcmFte05ld1N0YXR1c30gZXEgJ0ludmFsaWQnKSB7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleSBTRVQgc3RhdHVzID0gJ0ludmFsaWQnIFdIRVJFIGlkID0gJFBhcmFte1N1cnZleUlEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAnU3RhdHVzU2V0JzsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoJFN0YXR1cyBlcSAnTWFzdGVyJykgewogICAgICAgICMgc2V0IHN0YXR1cyBWYWxpZAogICAgICAgIGlmICgkUGFyYW17TmV3U3RhdHVzfSBlcSAnVmFsaWQnKSB7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleSBTRVQgc3RhdHVzID0gJ1ZhbGlkJyBXSEVSRSBpZCA9ICRQYXJhbXtTdXJ2ZXlJRH0iLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJ1N0YXR1c1NldCc7CiAgICAgICAgfQogICAgICAgICMgc2V0IHN0YXR1cyBJbnZhbGlkCiAgICAgICAgZWxzaWYgKCRQYXJhbXtOZXdTdGF0dXN9IGVxICdJbnZhbGlkJykgewogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXkgU0VUIHN0YXR1cyA9ICdJbnZhbGlkJyBXSEVSRSBpZCA9ICRQYXJhbXtTdXJ2ZXlJRH0iLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJ1N0YXR1c1NldCc7CiAgICAgICAgfQogICAgfQp9Cgo9aXRlbSBTdXJ2ZXlTYXZlKCkKCnRvIHVwZGF0ZSBhbiBleGlzdGluZyBzdXJ2ZXkKCiAgICAkU3VydmV5T2JqZWN0LT5TdXJ2ZXlTYXZlKAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIFN1cnZleUlEID0+IDQsCiAgICAgICAgVGl0bGUgPT4gJ0EgVGl0bGUnLAogICAgICAgIEludHJvZHVjdGlvbiA9PiAnVGhlIGludHJvZHVjdGlvbiBvZiB0aGUgc3VydmV5JywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGhlIGludGVybmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBzdXJ2ZXknLAogICAgKTsKCj1jdXQKCnN1YiBTdXJ2ZXlTYXZlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhVc2VySUQgU3VydmV5SUQgVGl0bGUgSW50cm9kdWN0aW9uIERlc2NyaXB0aW9uKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFRpdGxlIEludHJvZHVjdGlvbiBEZXNjcmlwdGlvbikpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoVXNlcklEIFN1cnZleUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgIGlmICgkUGFyYW17VGl0bGV9ICYmICRQYXJhbXtJbnRyb2R1Y3Rpb259ICYmICRQYXJhbXtEZXNjcmlwdGlvbn0pIHsKICAgICAgICBteSAkQ3VycmVudFRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICAgICAgIyB1cGRhdGUgdGhlIHN1cnZleQogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5IFNFVCAiLgogICAgICAgICAgICAgICAgInRpdGxlID0gJyRQYXJhbXtUaXRsZX0nLCAiLgogICAgICAgICAgICAgICAgImludHJvZHVjdGlvbiA9ICckUGFyYW17SW50cm9kdWN0aW9ufScsICIuCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24gPSAnJFBhcmFte0Rlc2NyaXB0aW9ufScsICIuCiAgICAgICAgICAgICAgICAiY2hhbmdlX3RpbWUgPSAnJEN1cnJlbnRUaW1lJywgIi4KICAgICAgICAgICAgICAgICJjaGFuZ2VfYnkgPSAkUGFyYW17VXNlcklEfSAiLgogICAgICAgICAgICAgICAgIldIRVJFIGlkID0gJFBhcmFte1N1cnZleUlEfSIsCiAgICAgICAgKTsKICAgIH0KfQoKPWl0ZW0gU3VydmV5TmV3KCkKCnRvIGFkZCBhIG5ldyBzdXJ2ZXkKCiAgICBteSAkU3VydmV5SUQgPSAkU3VydmV5T2JqZWN0LT5TdXJ2ZXlOZXcoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgVGl0bGUgPT4gJ0EgVGl0bGUnLAogICAgICAgIEludHJvZHVjdGlvbiA9PiAnVGhlIGludHJvZHVjdGlvbiBvZiB0aGUgc3VydmV5JywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGhlIGludGVybmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBzdXJ2ZXknLAogICAgKTsKCj1jdXQKCnN1YiBTdXJ2ZXlOZXcgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFVzZXJJRCBUaXRsZSBJbnRyb2R1Y3Rpb24gRGVzY3JpcHRpb24pKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoVGl0bGUgSW50cm9kdWN0aW9uIERlc2NyaXB0aW9uKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICBmb3JlYWNoIChxdyhVc2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgaWYgKCRQYXJhbXtUaXRsZX0gJiYgJFBhcmFte0ludHJvZHVjdGlvbn0gJiYgJFBhcmFte0Rlc2NyaXB0aW9ufSkgewogICAgICAgIG15ICRDdXJyZW50VGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPkN1cnJlbnRUaW1lc3RhbXAoKTsKICAgICAgICAjIGluc2VydCBhIG5ldyBzdXJ2ZXkKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiSU5TRVJUIElOVE8gc3VydmV5ICh0aXRsZSwgaW50cm9kdWN0aW9uLCBkZXNjcmlwdGlvbiwiLgogICAgICAgICAgICAgICAgIiBzdGF0dXMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIFZBTFVFUyAoIi4KICAgICAgICAgICAgICAgICInJFBhcmFte1RpdGxlfScsICIuCiAgICAgICAgICAgICAgICAiJyRQYXJhbXtJbnRyb2R1Y3Rpb259JywgIi4KICAgICAgICAgICAgICAgICInJFBhcmFte0Rlc2NyaXB0aW9ufScsICIuCiAgICAgICAgICAgICAgICAiJ05ldycsICIuCiAgICAgICAgICAgICAgICAiJyRDdXJyZW50VGltZScsICIuCiAgICAgICAgICAgICAgICAiJFBhcmFte1VzZXJJRH0sICIuCiAgICAgICAgICAgICAgICAiJyRDdXJyZW50VGltZScsICIuCiAgICAgICAgICAgICAgICAiJFBhcmFte1VzZXJJRH0pIgogICAgICAgICk7CiAgICAgICAgIyBnZXQgdGhlIGlkIG9mIHRoZSBzdXJ2ZXkKICAgICAgICBteSAkU1FMID0gIlNFTEVDVCBpZCBGUk9NIHN1cnZleSBXSEVSRSAiLgogICAgICAgICAgICAidGl0bGUgPSAnJFBhcmFte1RpdGxlfScgQU5EICIuCiAgICAgICAgICAgICJpbnRyb2R1Y3Rpb24gPSAnJFBhcmFte0ludHJvZHVjdGlvbn0nIEFORCAiLgogICAgICAgICAgICAiZGVzY3JpcHRpb24gPSAnJFBhcmFte0Rlc2NyaXB0aW9ufScgIi4KICAgICAgICAgICAgIk9SREVSIEJZIGNyZWF0ZV90aW1lIERFU0MiOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkU3VydmV5SUQgPSAnJzsKICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJFN1cnZleUlEID0gJFJvd1swXTsKICAgICAgICB9CiAgICAgICAgIyBzZXQgdGhlIHN1cnZleSBudW1iZXIKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleSBTRVQgIi4KICAgICAgICAgICAgICAgICJzdXJ2ZXludW1iZXIgPSAnIiAuICgkU3VydmV5SUQgKyAxMDAwMCkgLiAiJyAiLgogICAgICAgICAgICAgICAgIldIRVJFIGlkID0gJFN1cnZleUlEIiwKICAgICAgICApOwogICAgICAgIHJldHVybiAkU3VydmV5SUQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm47CiAgICB9Cn0KCj1pdGVtIFF1ZXN0aW9uTGlzdCgpCgp0byBnZXQgYSBhcnJheSBsaXN0IG9mIGFsbCBxdWVzdGlvbiBpdGVtcwoKICAgIG15IEBMaXN0ID0gJFN1cnZleU9iamVjdC0+UXVlc3Rpb25MaXN0KAogICAgICAgIFN1cnZleUlEID0+IDEKICAgICk7Cgo9Y3V0CgpzdWIgUXVlc3Rpb25MaXN0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15IEBMaXN0ID0gKCk7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoU3VydmV5SUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoU3VydmV5SUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBnZXQgYWxsIHF1ZXN0aW9ucyBvZiBhIHN1cnZleQogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQsIHN1cnZleV9pZCwgcXVlc3Rpb24sIHR5cGUgIi4KICAgICAgICAiIEZST00gc3VydmV5X3F1ZXN0aW9uIFdIRVJFIHN1cnZleV9pZCA9ICRQYXJhbXtTdXJ2ZXlJRH0gT1JERVIgQlkgcG9zaXRpb24iOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgIyBmZXRjaCB0aCByZXN1bHQKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIG15ICVEYXRhID0gKCk7CiAgICAgICAgJERhdGF7UXVlc3Rpb25JRH0gPSAkUm93WzBdOwogICAgICAgICREYXRhe1N1cnZleUlEfSA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7UXVlc3Rpb259ID0gJFJvd1syXTsKICAgICAgICAkRGF0YXtUeXBlfSA9ICRSb3dbM107CiAgICAgICAgcHVzaChATGlzdCxcJURhdGEpOwogICAgfQogICAgcmV0dXJuIEBMaXN0Owp9Cgo9aXRlbSBRdWVzdGlvbkFkZCgpCgp0byBhZGQgYSBuZXcgcXVlc3Rpb24gdG8gYSBzdXJ2ZXkKCiAgICAkU3VydmV5T2JqZWN0LT5RdWVzdGlvbkFkZCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICBTdXJ2ZXlJRCA9PiAxMCwKICAgICAgICBRdWVzdGlvbiA9PiAnVGhlIFF1ZXN0aW9uJywKICAgICAgICBUeXBlID0+ICdSYWRpbycsCiAgICApOwoKPWN1dAoKc3ViIFF1ZXN0aW9uQWRkIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhVc2VySUQgU3VydmV5SUQgUXVlc3Rpb24gVHlwZSkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbiBUeXBlKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICBmb3JlYWNoIChxdyhVc2VySUQgU3VydmV5SUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQoKICAgIGlmICgkUGFyYW17UXVlc3Rpb259KSB7CiAgICAgICAgbXkgJEN1cnJlbnRUaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+Q3VycmVudFRpbWVzdGFtcCgpOwogICAgICAgICMgaW5zZXJ0IGEgbmV3IHF1ZXN0aW9uCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIHN1cnZleV9xdWVzdGlvbiAoc3VydmV5X2lkLCBxdWVzdGlvbiwgdHlwZSwgIi4KICAgICAgICAgICAgICAgICJwb3NpdGlvbiwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgVkFMVUVTICgiLgogICAgICAgICAgICAgICAgIiRQYXJhbXtTdXJ2ZXlJRH0sICIuCiAgICAgICAgICAgICAgICAiJyRQYXJhbXtRdWVzdGlvbn0nLCAiLgogICAgICAgICAgICAgICAgIickUGFyYW17VHlwZX0nLCAiLgogICAgICAgICAgICAgICAgIjI1NSwgIi4KICAgICAgICAgICAgICAgICInJEN1cnJlbnRUaW1lJywgIi4KICAgICAgICAgICAgICAgICIkUGFyYW17VXNlcklEfSwgIi4KICAgICAgICAgICAgICAgICInJEN1cnJlbnRUaW1lJywgIi4KICAgICAgICAgICAgICAgICIkUGFyYW17VXNlcklEfSkiCiAgICAgICAgKTsKICAgIH0KfQoKPWl0ZW0gUXVlc3Rpb25EZWxldGUoKQoKdG8gZGVsZXRlIGEgcXVlc3Rpb24gZnJvbSBhIHN1cnZleQoKICAgICRTdXJ2ZXlPYmplY3QtPlF1ZXN0aW9uRGVsZXRlKAogICAgICAgIFN1cnZleUlEID0+IDEsCiAgICAgICAgUXVlc3Rpb25JRCA9PiAxMCwKICAgICk7Cgo9Y3V0CgpzdWIgUXVlc3Rpb25EZWxldGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEIFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoU3VydmV5SUQgUXVlc3Rpb25JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIGRlbGV0ZSBhbGwgYW5zd2VycyBvZiBhIHF1ZXN0aW9uCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzdXJ2ZXlfYW5zd2VyIFdIRVJFICIuCiAgICAgICAgICAgICJxdWVzdGlvbl9pZCA9ICRQYXJhbXtRdWVzdGlvbklEfSIKICAgICk7CiAgICAjIGRlbGV0ZSB0aCBxdWVzdGlvbgogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc3VydmV5X3F1ZXN0aW9uIFdIRVJFICIuCiAgICAgICAgICAgICJpZCA9ICRQYXJhbXtRdWVzdGlvbklEfSBBTkQgIi4KICAgICAgICAgICAgInN1cnZleV9pZCA9ICRQYXJhbXtTdXJ2ZXlJRH0iCiAgICApOwp9Cgo9aXRlbSBRdWVzdGlvblNvcnQoKQoKdG8gc29ydCBhbGwgcXVlc3Rpb25zIGZyb20gYSBzdXJ2ZXkKCiAgICAkU3VydmV5T2JqZWN0LT5RdWVzdGlvblNvcnQoCiAgICAgICAgU3VydmV5SUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgUXVlc3Rpb25Tb3J0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIGdldCBhbGwgcXVlc3Rpb24gb2YgYSBzdXJ2ZXkgKHNvcnRlZCBieSBwb3NpdGlvbikKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkIEZST00gc3VydmV5X3F1ZXN0aW9uIi4KICAgICAgICAiIFdIRVJFIHN1cnZleV9pZCA9ICRQYXJhbXtTdXJ2ZXlJRH0gT1JERVIgQlkgcG9zaXRpb24iOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQ291bnRlciA9IDE7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAjIHVwZGF0ZSB0aGUgcG9zaXRpb24KICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9xdWVzdGlvbiBTRVQgcG9zaXRpb24gPSAkQ291bnRlciBXSEVSRSBpZCA9ICRSb3dbMF0iLAogICAgICAgICk7CiAgICAgICAgJENvdW50ZXIrKzsKICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBRdWVzdGlvblVwKCkKCnRvIG1vdmUgYSBxdWVzdGlvbiB1cAoKICAgICRTdXJ2ZXlPYmplY3QtPlF1ZXN0aW9uVXAoCiAgICAgICAgU3VydmV5SUQgPT4gMSwKICAgICAgICBRdWVzdGlvbklEID0+IDQsCiAgICApOwoKPWN1dAoKc3ViIFF1ZXN0aW9uVXAgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEIFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoU3VydmV5SUQgUXVlc3Rpb25JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAiU0VMRUNUIHBvc2l0aW9uIEZST00gc3VydmV5X3F1ZXN0aW9uIi4KICAgICAgICAiIFdIRVJFIGlkID0gJFBhcmFte1F1ZXN0aW9uSUR9IEFORCBzdXJ2ZXlfaWQgPSAkUGFyYW17U3VydmV5SUR9IgogICAgKTsKCiAgICBteSAkUG9zaXRpb24gPSAnJzsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRQb3NpdGlvbiA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCRQb3NpdGlvbiA+ICcxJykgewogICAgICAgIG15ICRQb3NpdGlvblVwID0gJFBvc2l0aW9uIC0gMTsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gIlNFTEVDVCBpZCBGUk9NIHN1cnZleV9xdWVzdGlvbiIuCiAgICAgICAgICAgICIgV0hFUkUgc3VydmV5X2lkID0gJFBhcmFte1N1cnZleUlEfSBBTkQgcG9zaXRpb24gPSAkUG9zaXRpb25VcCIKICAgICAgICApOwoKICAgICAgICBteSAkUXVlc3Rpb25JRERvd24gPSAnJzsKICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJFF1ZXN0aW9uSUREb3duID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgIGlmICgkUXVlc3Rpb25JRERvd24gbmUgJycpIHsKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5X3F1ZXN0aW9uIFNFVCAiLgogICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbiA9ICRQb3NpdGlvbiAiLgogICAgICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRRdWVzdGlvbklERG93biIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5X3F1ZXN0aW9uIFNFVCAiLgogICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbiA9ICRQb3NpdGlvblVwICIuCiAgICAgICAgICAgICAgICAgICAgIldIRVJFIGlkID0gJFBhcmFte1F1ZXN0aW9uSUR9IgogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQoKPWl0ZW0gUXVlc3Rpb25Eb3duKCkKCnRvIG1vdmUgYSBxdWVzdGlvbiBkb3duCgogICAgJFN1cnZleU9iamVjdC0+UXVlc3Rpb25Eb3duKAogICAgICAgIFN1cnZleUlEID0+IDEsCiAgICAgICAgUXVlc3Rpb25JRCA9PiA0LAogICAgKTsKCj1jdXQKCnN1YiBRdWVzdGlvbkRvd24gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEIFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoU3VydmV5SUQgUXVlc3Rpb25JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAiU0VMRUNUIHBvc2l0aW9uIEZST00gc3VydmV5X3F1ZXN0aW9uIi4KICAgICAgICAiIFdIRVJFIGlkID0gJFBhcmFte1F1ZXN0aW9uSUR9IEFORCBzdXJ2ZXlfaWQgPSAkUGFyYW17U3VydmV5SUR9IgogICAgKTsKCiAgICBteSAkUG9zaXRpb24gPSAnJzsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRQb3NpdGlvbiA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCRQb3NpdGlvbikgewogICAgICAgIG15ICRQb3NpdGlvbkRvd24gPSAkUG9zaXRpb24gKyAxOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAiU0VMRUNUIGlkIEZST00gc3VydmV5X3F1ZXN0aW9uIi4KICAgICAgICAgICAgIiBXSEVSRSBzdXJ2ZXlfaWQgPSAkUGFyYW17U3VydmV5SUR9IEFORCBwb3NpdGlvbiA9ICRQb3NpdGlvbkRvd24iCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFF1ZXN0aW9uSURVcCA9ICcnOwogICAgICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICAgICAkUXVlc3Rpb25JRFVwID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgIGlmICgkUXVlc3Rpb25JRFVwIG5lICcnKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5X3F1ZXN0aW9uIFNFVCAiLgogICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbiA9ICRQb3NpdGlvbiAiLgogICAgICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRRdWVzdGlvbklEVXAiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9xdWVzdGlvbiBTRVQgIi4KICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24gPSAkUG9zaXRpb25Eb3duICIuCiAgICAgICAgICAgICAgICAgICAgIldIRVJFIGlkID0gJFBhcmFte1F1ZXN0aW9uSUR9IgogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQoKPWl0ZW0gUXVlc3Rpb25HZXQoKQoKdG8gZ2V0IGFsbCBhdHRyaWJ1dGVzIG9mIGEgcXVlc3Rpb24KCiAgICBteSAlUXVlc3Rpb24gPSAkU3VydmV5T2JqZWN0LT5RdWVzdGlvbkdldCgKICAgICAgICBRdWVzdGlvbklEID0+IDEyMwogICAgKTsKCj1jdXQKCnN1YiBRdWVzdGlvbkdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsIGZvciBldmVudAogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQsIHN1cnZleV9pZCwgcXVlc3Rpb24sIHR5cGUsIHBvc2l0aW9uLCAiLgogICAgICAgICJjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5ICIuCiAgICAgICAgIkZST00gc3VydmV5X3F1ZXN0aW9uIFdIRVJFIGlkID0gJFBhcmFte1F1ZXN0aW9uSUR9IjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKCiAgICBteSAlRGF0YSA9ICgpOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJERhdGF7UXVlc3Rpb25JRH0gPSAkUm93WzBdOwogICAgICAgICREYXRhe1N1cnZleUlEfSA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7UXVlc3Rpb259ID0gJFJvd1syXTsKICAgICAgICAkRGF0YXtUeXBlfSA9ICRSb3dbM107CiAgICAgICAgJERhdGF7UG9zaXRpb259ID0gJFJvd1s0XTsKICAgICAgICAkRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNV07CiAgICAgICAgJERhdGF7Q3JlYXRlQnl9ID0gJFJvd1s2XTsKICAgICAgICAkRGF0YXtDaGFuZ2VUaW1lfSA9ICRSb3dbN107CiAgICAgICAgJERhdGF7Q2hhbmdlQnl9ID0gJFJvd1s4XTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gUXVlc3Rpb25TYXZlKCkKCnRvIHVwZGF0ZSBhbiBleGlzdGluZyBxdWVzdGlvbgoKICAgICRTdXJ2ZXlPYmplY3QtPlF1ZXN0aW9uU2F2ZSgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICBRdWVzdGlvbklEID0+IDQsCiAgICAgICAgU3VydmV5SUQgPT4gMywKICAgICAgICBRdWVzdGlvbiA9PiAnVGhlIFF1ZXN0aW9uJywKICAgICk7Cgo9Y3V0CgpzdWIgUXVlc3Rpb25TYXZlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhVc2VySUQgUXVlc3Rpb25JRCBTdXJ2ZXlJRCBRdWVzdGlvbikpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbikpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoVXNlcklEIFF1ZXN0aW9uSUQgU3VydmV5SUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQoKICAgIGlmICgkUGFyYW17UXVlc3Rpb259KSB7CiAgICAgICAgbXkgJEN1cnJlbnRUaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+Q3VycmVudFRpbWVzdGFtcCgpOwogICAgICAgICMgc3FsIGZvciBldmVudAogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5X3F1ZXN0aW9uIFNFVCAiLgogICAgICAgICAgICAgICAgInF1ZXN0aW9uID0gJyRQYXJhbXtRdWVzdGlvbn0nLCAiLgogICAgICAgICAgICAgICAgImNoYW5nZV90aW1lID0gJyRDdXJyZW50VGltZScsICIuCiAgICAgICAgICAgICAgICAiY2hhbmdlX2J5ID0gJFBhcmFte1VzZXJJRH0gIi4KICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRQYXJhbXtRdWVzdGlvbklEfSAiLAogICAgICAgICAgICAgICAgIkFORCBzdXJ2ZXlfaWQgPSAkUGFyYW17U3VydmV5SUR9IiwKICAgICAgICApOwogICAgfQp9Cgo9aXRlbSBRdWVzdGlvbkNvdW50KCkKCnRvIGNvdW50IGFsbCBxdWVzdGlvbnMgb2YgYSBzdXJ2ZXkKCiAgICBteSAkQ291bnRRdWVzdGlvbiA9ICRTdXJ2ZXlPYmplY3QtPlF1ZXN0aW9uQ291bnQoCiAgICAgICAgU3VydmV5SUQgPT4gMTIzCiAgICApOwoKPWN1dAoKc3ViIFF1ZXN0aW9uQ291bnQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsIGZvciBldmVudAogICAgbXkgJFNRTCA9ICJTRUxFQ1QgQ09VTlQoaWQpIEZST00gc3VydmV5X3F1ZXN0aW9uIFdIRVJFIHN1cnZleV9pZCA9ICRQYXJhbXtTdXJ2ZXlJRH0iOwoKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKCiAgICBteSAkQ291bnRRdWVzdGlvbiA9ICcnOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJENvdW50UXVlc3Rpb24gPSAkUm93WzBdOwogICAgfQogICAgcmV0dXJuICRDb3VudFF1ZXN0aW9uOwp9Cgo9aXRlbSBBbnN3ZXJMaXN0KCkKCnRvIGdldCBhIGFycmF5IGxpc3Qgb2YgYWxsIGFuc3dlciBpdGVtcwoKICAgIG15IEBMaXN0ID0gJFN1cnZleU9iamVjdC0+QW5zd2VyTGlzdCgKICAgICAgICBRdWVzdGlvbklEID0+IDEKICAgICk7Cgo9Y3V0CgpzdWIgQW5zd2VyTGlzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSBATGlzdCA9ICgpOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkLCBxdWVzdGlvbl9pZCwgYW5zd2VyICIuCiAgICAgICAgIiBGUk9NIHN1cnZleV9hbnN3ZXIgV0hFUkUgcXVlc3Rpb25faWQgPSAkUGFyYW17UXVlc3Rpb25JRH0gT1JERVIgQlkgcG9zaXRpb24iOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgbXkgJURhdGEgPSAoKTsKCiAgICAgICAgJERhdGF7QW5zd2VySUR9ID0gJFJvd1swXTsKICAgICAgICAkRGF0YXtRdWVzdGlvbklEfSA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7QW5zd2VyfSA9ICRSb3dbMl07CgogICAgICAgIHB1c2goQExpc3QsXCVEYXRhKTsKICAgIH0KICAgIHJldHVybiBATGlzdDsKfQoKPWl0ZW0gQW5zd2VyQWRkKCkKCnRvIGFkZCBhIG5ldyBhbnN3ZXIgdG8gYSBxdWVzdGlvbgoKICAgICRTdXJ2ZXlPYmplY3QtPkFuc3dlckFkZCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICBRdWVzdGlvbklEID0+IDEwLAogICAgICAgIEFuc3dlciA9PiAnVGhlIEFuc3dlcicsCiAgICApOwoKPWN1dAoKc3ViIEFuc3dlckFkZCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoVXNlcklEIFF1ZXN0aW9uSUQgQW5zd2VyKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KEFuc3dlcikpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoVXNlcklEIFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQoKICAgIGlmICgkUGFyYW17QW5zd2VyfSkgewogICAgICAgIG15ICRDdXJyZW50VGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPkN1cnJlbnRUaW1lc3RhbXAoKTsKICAgICAgICAjIHNxbCBmb3IgZXZlbnQKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiSU5TRVJUIElOVE8gc3VydmV5X2Fuc3dlciAocXVlc3Rpb25faWQsIGFuc3dlciwgcG9zaXRpb24sICIuCiAgICAgICAgICAgICAgICAiY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgVkFMVUVTICgiLgogICAgICAgICAgICAgICAgIiRQYXJhbXtRdWVzdGlvbklEfSwgIi4KICAgICAgICAgICAgICAgICInJFBhcmFte0Fuc3dlcn0nLCAiLgogICAgICAgICAgICAgICAgIjI1NSwgIi4KICAgICAgICAgICAgICAgICInJEN1cnJlbnRUaW1lJywgIi4KICAgICAgICAgICAgICAgICIkUGFyYW17VXNlcklEfSwgIi4KICAgICAgICAgICAgICAgICInJEN1cnJlbnRUaW1lJywgIi4KICAgICAgICAgICAgICAgICIkUGFyYW17VXNlcklEfSkiCiAgICAgICAgKTsKICAgIH0KfQoKPWl0ZW0gQW5zd2VyRGVsZXRlKCkKCnRvIGRlbGV0ZSBhIGFuc3dlciBmcm9tIGEgcXVlc3Rpb24KCiAgICAkU3VydmV5T2JqZWN0LT5BbnN3ZXJEZWxldGUoCiAgICAgICAgUXVlc3Rpb25JRCA9PiAxMCwKICAgICAgICBBbnN3ZXJJRCA9PiA0LAogICAgKTsKCj1jdXQKCnN1YiBBbnN3ZXJEZWxldGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uSUQgQW5zd2VySUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCBBbnN3ZXJJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CgogICAgIyBzcWwgZm9yIGV2ZW50CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzdXJ2ZXlfYW5zd2VyIFdIRVJFICIuCiAgICAgICAgICAgICJpZCA9ICRQYXJhbXtBbnN3ZXJJRH0gQU5EICIuCiAgICAgICAgICAgICJxdWVzdGlvbl9pZCA9ICRQYXJhbXtRdWVzdGlvbklEfSIKICAgICk7Cn0KCj1pdGVtIEFuc3dlclNvcnQoKQoKdG8gc29ydCBhbGwgYW5zd2VycyBmcm9tIGEgcXVlc3Rpb24KCiAgICAkU3VydmV5T2JqZWN0LT5BbnN3ZXJTb3J0KAogICAgICAgIFF1ZXN0aW9uSUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQW5zd2VyU29ydCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsIGZvciBldmVudAogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQgRlJPTSBzdXJ2ZXlfYW5zd2VyIi4KICAgICAgICAiIFdIRVJFIHF1ZXN0aW9uX2lkID0gJFBhcmFte1F1ZXN0aW9uSUR9IE9SREVSIEJZIHBvc2l0aW9uIjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKCiAgICBteSAkY291bnRlciA9IDE7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9hbnN3ZXIgU0VUIHBvc2l0aW9uID0gJGNvdW50ZXIgV0hFUkUgaWQgPSAkUm93WzBdIiwKICAgICAgICApOwogICAgICAgICRjb3VudGVyKys7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQW5zd2VyVXAoKQoKdG8gbW92ZSBhIGFuc3dlciB1cAoKICAgICRTdXJ2ZXlPYmplY3QtPkFuc3dlclVwKAogICAgICAgIFF1ZXN0aW9uSUQgPT4gNCwKICAgICAgICBBbnN3ZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBBbnN3ZXJVcCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCBBbnN3ZXJJRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEIEFuc3dlcklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsIGZvciBldmVudAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICJTRUxFQ1QgcG9zaXRpb24gRlJPTSBzdXJ2ZXlfYW5zd2VyIi4KICAgICAgICAiIFdIRVJFIGlkID0gJFBhcmFte0Fuc3dlcklEfSBBTkQgcXVlc3Rpb25faWQgPSAkUGFyYW17UXVlc3Rpb25JRH0iCiAgICApOwoKICAgIG15ICRQb3NpdGlvbiA9ICcnOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJFBvc2l0aW9uID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoJFBvc2l0aW9uID4gJzEnKSB7CiAgICAgICAgbXkgJFBvc2l0aW9uVXAgPSAkUG9zaXRpb24gLSAxOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAiU0VMRUNUIGlkIEZST00gc3VydmV5X2Fuc3dlciIuCiAgICAgICAgICAgICIgV0hFUkUgcXVlc3Rpb25faWQgPSAkUGFyYW17UXVlc3Rpb25JRH0gQU5EIHBvc2l0aW9uID0gJFBvc2l0aW9uVXAiCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEFuc3dlcklERG93biA9ICcnOwogICAgICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICAgICAkQW5zd2VySUREb3duID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgIGlmICgkQW5zd2VySUREb3duIG5lICcnKSB7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9hbnN3ZXIgU0VUICIuCiAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uID0gJFBvc2l0aW9uICIuCiAgICAgICAgICAgICAgICAgICAgIldIRVJFIGlkID0gJEFuc3dlcklERG93biIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5X2Fuc3dlciBTRVQgIi4KICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24gPSAkUG9zaXRpb25VcCAiLgogICAgICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRQYXJhbXtBbnN3ZXJJRH0iCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQp9Cgo9aXRlbSBBbnN3ZXJEb3duKCkKCnRvIG1vdmUgYSBhbnN3ZXIgZG93bgoKICAgICRTdXJ2ZXlPYmplY3QtPkFuc3dlckRvd24oCiAgICAgICAgUXVlc3Rpb25JRCA9PiA0LAogICAgICAgIEFuc3dlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEFuc3dlckRvd24gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uSUQgQW5zd2VySUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCBBbnN3ZXJJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAiU0VMRUNUIHBvc2l0aW9uIEZST00gc3VydmV5X2Fuc3dlciIuCiAgICAgICAgIiBXSEVSRSBpZCA9ICRQYXJhbXtBbnN3ZXJJRH0gQU5EIHF1ZXN0aW9uX2lkID0gJFBhcmFte1F1ZXN0aW9uSUR9IgogICAgKTsKCiAgICBteSAkUG9zaXRpb24gPSAnJzsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRQb3NpdGlvbiA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCRQb3NpdGlvbikgewogICAgICAgIG15ICRQb3NpdGlvbkRvd24gPSAkUG9zaXRpb24gKyAxOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAiU0VMRUNUIGlkIEZST00gc3VydmV5X2Fuc3dlciIuCiAgICAgICAgICAgICIgV0hFUkUgcXVlc3Rpb25faWQgPSAkUGFyYW17UXVlc3Rpb25JRH0gQU5EIHBvc2l0aW9uID0gJFBvc2l0aW9uRG93biIKICAgICAgICApOwoKICAgICAgICBteSAkQW5zd2VySURVcCA9ICcnOwogICAgICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICAgICAkQW5zd2VySURVcCA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICBpZiAoJEFuc3dlcklEVXAgbmUgJycpIHsKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5X2Fuc3dlciBTRVQgIi4KICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24gPSAkUG9zaXRpb24gIi4KICAgICAgICAgICAgICAgICAgICAiV0hFUkUgaWQgPSAkQW5zd2VySURVcCIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5X2Fuc3dlciBTRVQgIi4KICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24gPSAkUG9zaXRpb25Eb3duICIuCiAgICAgICAgICAgICAgICAgICAgIldIRVJFIGlkID0gJFBhcmFte0Fuc3dlcklEfSIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KCj1pdGVtIEFuc3dlckdldCgpCgp0byBnZXQgYWxsIGF0dHJpYnV0ZXMgb2YgYSBhbnN3ZXIKCiAgICBteSAlQW5zd2VyID0gJFN1cnZleU9iamVjdC0+QW5zd2VyR2V0KAogICAgICAgIEFuc3dlcklEID0+IDEyMwogICAgKTsKCj1jdXQKCnN1YiBBbnN3ZXJHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEFuc3dlcklEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KEFuc3dlcklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsIGZvciBldmVudAogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQsIHF1ZXN0aW9uX2lkLCBhbnN3ZXIsIHBvc2l0aW9uLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5ICIuCiAgICAgICAgIkZST00gc3VydmV5X2Fuc3dlciBXSEVSRSBpZCA9ICRQYXJhbXtBbnN3ZXJJRH0iOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwoKICAgIG15ICVEYXRhID0gKCk7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkRGF0YXtBbnN3ZXJJRH0gPSAkUm93WzBdOwogICAgICAgICREYXRhe1F1ZXN0aW9uSUR9ID0gJFJvd1sxXTsKICAgICAgICAkRGF0YXtBbnN3ZXJ9ID0gJFJvd1syXTsKICAgICAgICAkRGF0YXtQb3NpdGlvbn0gPSAkUm93WzNdOwogICAgICAgICREYXRhe0NyZWF0ZVRpbWV9ID0gJFJvd1s0XTsKICAgICAgICAkRGF0YXtDcmVhdGVCeX0gPSAkUm93WzVdOwogICAgICAgICREYXRhe0NoYW5nZVRpbWV9ID0gJFJvd1s2XTsKICAgICAgICAkRGF0YXtDaGFuZ2VCeX0gPSAkUm93WzddOwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBBbnN3ZXJTYXZlKCkKCnRvIHVwZGF0ZSBhbiBleGlzdGluZyBhbnN3ZXIKCiAgICAkU3VydmV5T2JqZWN0LT5BbnN3ZXJTYXZlKAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIEFuc3dlcklEID0+IDYsCiAgICAgICAgUXVlc3Rpb25JRCA9PiA0LAogICAgICAgIEFuc3dlciA9PiAnVGhlIEFuc3dlcicsCiAgICApOwoKPWN1dAoKc3ViIEFuc3dlclNhdmUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFVzZXJJRCBBbnN3ZXJJRCBRdWVzdGlvbklEIEFuc3dlcikpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhBbnN3ZXIpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KTsKICAgIH0KICAgIGZvcmVhY2ggKHF3KFVzZXJJRCBBbnN3ZXJJRCBRdWVzdGlvbklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KCiAgICBpZiAoJFBhcmFte0Fuc3dlcn0pIHsKICAgICAgICBteSAkQ3VycmVudFRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICAgICAgIyBzcWwgZm9yIGV2ZW50CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXlfYW5zd2VyIFNFVCAiLgogICAgICAgICAgICAgICAgImFuc3dlciA9ICckUGFyYW17QW5zd2VyfScsICIuCiAgICAgICAgICAgICAgICAiY2hhbmdlX3RpbWUgPSAnJEN1cnJlbnRUaW1lJywgIi4KICAgICAgICAgICAgICAgICJjaGFuZ2VfYnkgPSAkUGFyYW17VXNlcklEfSAiLgogICAgICAgICAgICAgICAgIldIRVJFIGlkID0gJFBhcmFte0Fuc3dlcklEfSAiLAogICAgICAgICAgICAgICAgIkFORCBxdWVzdGlvbl9pZCA9ICRQYXJhbXtRdWVzdGlvbklEfSIsCiAgICAgICAgKTsKICAgIH0KfQoKPWl0ZW0gQW5zd2VyQ291bnQoKQoKdG8gY291bnQgYWxsIGFuc3dlcnMgb2YgYSBxdWVzdGlvbgoKICAgIG15ICRDb3VudEFuc3dlciA9ICRTdXJ2ZXlPYmplY3QtPkFuc3dlckNvdW50KAogICAgICAgIFF1ZXN0aW9uSUQgPT4gMTIzCiAgICApOwoKPWN1dAoKc3ViIEFuc3dlckNvdW50IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICBteSAkU1FMID0gIlNFTEVDVCBDT1VOVChpZCkgRlJPTSBzdXJ2ZXlfYW5zd2VyIFdIRVJFIHF1ZXN0aW9uX2lkID0gJFBhcmFte1F1ZXN0aW9uSUR9IjsKCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CgogICAgbXkgJENvdW50QW5zd2VyID0gJyc7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkQ291bnRBbnN3ZXIgPSAkUm93WzBdOwogICAgfQogICAgcmV0dXJuICRDb3VudEFuc3dlcjsKfQoKPWl0ZW0gVm90ZUxpc3QoKQoKdG8gZ2V0IGEgYXJyYXkgbGlzdCBvZiBhbGwgdm90ZSBpdGVtcwoKICAgIG15IEBMaXN0ID0gJFN1cnZleU9iamVjdC0+Vm90ZUxpc3QoCiAgICAgICAgU3VydmV5SUQgPT4gMQogICAgKTsKCj1jdXQKCnN1YiBWb3RlTGlzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSBATGlzdCA9ICgpOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsIGZvciBldmVudAogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQsIHRpY2tldF9pZCwgc2VuZF90aW1lLCB2b3RlX3RpbWUgIi4KICAgICAgICAiRlJPTSBzdXJ2ZXlfcmVxdWVzdCBXSEVSRSBzdXJ2ZXlfaWQgPSAkUGFyYW17U3VydmV5SUR9ICIuCiAgICAgICAgIkFORCB2YWxpZF9pZCA9IDAgT1JERVIgQlkgdm90ZV90aW1lIERFU0MiOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwoKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIG15ICVEYXRhID0gKCk7CgogICAgICAgICREYXRhe1JlcXVlc3RJRH0gPSAkUm93WzBdOwogICAgICAgICREYXRhe1RpY2tldElEfSA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7U2VuZFRpbWV9ID0gJFJvd1syXTsKICAgICAgICAkRGF0YXtWb3RlVGltZX0gPSAkUm93WzNdOwoKICAgICAgICBwdXNoKEBMaXN0LFwlRGF0YSk7CiAgICB9CiAgICByZXR1cm4gQExpc3Q7Cn0KCj1pdGVtIFZvdGVHZXQoKQoKdG8gZ2V0IGFsbCBhdHRyaWJ1dGVzIG9mIGEgdm90ZQoKICAgIG15IEBWb3RlID0gJFN1cnZleU9iamVjdC0+Vm90ZUdldCgKICAgICAgICBSZXF1ZXN0SUQgPT4gMTMsCiAgICAgICAgUXVlc3Rpb25JRCA9PiAyMwogICAgKTsKCj1jdXQKCnN1YiBWb3RlR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15IEBMaXN0ID0gKCk7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoUmVxdWVzdElEIFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoUmVxdWVzdElEIFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgdm90ZV92YWx1ZSBGUk9NIHN1cnZleV92b3RlIi4KICAgICAgICAiIFdIRVJFIHJlcXVlc3RfaWQgPSAkUGFyYW17UmVxdWVzdElEfSBBTkQgcXVlc3Rpb25faWQgPSAkUGFyYW17UXVlc3Rpb25JRH0iOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwoKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIG15ICVEYXRhID0gKCk7CiAgICAgICAgJERhdGF7UmVxdWVzdElEfSA9ICRSb3dbMF07CiAgICAgICAgJERhdGF7Vm90ZVZhbHVlfSA9ICRSb3dbMV0gfHwgJy0nOwogICAgICAgIHB1c2goQExpc3QsIFwlRGF0YSk7CiAgICB9CiAgICByZXR1cm4gQExpc3Q7Cn0KCj1pdGVtIENvdW50Vm90ZSgpCgp0byBjb3VudCBhbGwgdm90ZXMgb2YgYSBzdXJ2ZXkKCiAgICBteSAkQ291bnRWb3RlID0gJFN1cnZleU9iamVjdC0+Q291bnRWb3RlKAogICAgICAgIFF1ZXN0aW9uSUQgPT4gMTIzLAogICAgICAgIFZvdGVWYWx1ZSA9PiAnVGhlIFZhbHVlJywKICAgICk7Cgo9Y3V0CgpzdWIgQ291bnRWb3RlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEIFZvdGVWYWx1ZSkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhWb3RlVmFsdWUpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KTsKICAgIH0KICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICBteSAkU1FMID0gIlNFTEVDVCBDT1VOVCh2b3RlX3ZhbHVlKSBGUk9NIHN1cnZleV92b3RlIFdIRVJFICIuCiAgICAgICAgInF1ZXN0aW9uX2lkID0gJFBhcmFte1F1ZXN0aW9uSUR9IEFORCB2b3RlX3ZhbHVlID0gJyRQYXJhbXtWb3RlVmFsdWV9JyI7CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwoKICAgIG15ICVEYXRhID0gKCk7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkRGF0YXtDb3VudFZvdGV9ID0gJFJvd1swXTsKICAgIH0KICAgIHJldHVybiAkRGF0YXtDb3VudFZvdGV9Owp9Cgo9aXRlbSBDb3VudFJlcXVlc3QoKQoKdG8gY291bnQgYWxsIHJlcXVlc3RzIG9mIGEgc3VydmV5CgogICAgbXkgJENvdW50UmVxdWVzdCA9ICRTdXJ2ZXlPYmplY3QtPkNvdW50UmVxdWVzdCgKICAgICAgICBRdWVzdGlvbklEID0+IDEyMywKICAgICAgICBWYWxpZElEID0+IDAsICAgICAgICMgKDB8MXxhbGwpCiAgICApOwoKPWN1dAoKc3ViIENvdW50UmVxdWVzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoU3VydmV5SUQgVmFsaWRJRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgIG15ICRTUUwgPSAiU0VMRUNUIENPVU5UKGlkKSBGUk9NIHN1cnZleV9yZXF1ZXN0IFdIRVJFIHN1cnZleV9pZCA9ICRQYXJhbXtTdXJ2ZXlJRH0iOwoKICAgIGlmICghJFBhcmFte1ZhbGlkSUR9KSB7CiAgICAgICAgJFNRTCAuPSAiIEFORCB2YWxpZF9pZCA9IDAiOwogICAgfQogICAgZWxzaWYgKCRQYXJhbXtWYWxpZElEfSBlcSAxKSB7CiAgICAgICAgJFNRTCAuPSAiIEFORCB2YWxpZF9pZCA9IDEiOwogICAgfQoKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKCiAgICBteSAlRGF0YSA9ICgpOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJERhdGF7Q291bnRSZXF1ZXN0fSA9ICRSb3dbMF07CiAgICB9CiAgICByZXR1cm4gJERhdGF7Q291bnRSZXF1ZXN0fTsKfQoKPWl0ZW0gRWxlbWVudEV4aXN0cygpCgpleGlzdHMgYW4gc3VydmV5LSwgcXVlc3Rpb24tLCBhbnN3ZXItIG9yIHJlcXVlc3QtZWxlbWVudAoKICAgIG15ICRDb3VudFJlcXVlc3QgPSAkU3VydmV5T2JqZWN0LT5FbGVtZW50RXhpc3RzKAogICAgICAgIElEID0+IDEyMywgICAgICAgICAgICMgU3VydmV5SUQsIFF1ZXN0aW9uSUQsIEFuc3dlcklELCBSZXF1ZXN0SUQKICAgICAgICBFbGVtZW50ID0+ICdTdXJ2ZXknICAjIFN1cnZleSwgUXVlc3Rpb24sIEFuc3dlciwgUmVxdWVzdAogICAgKTsKCj1jdXQKCnN1YiBFbGVtZW50RXhpc3RzIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhFbGVtZW50SUQgRWxlbWVudCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhFbGVtZW50KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICBmb3JlYWNoIChxdyhFbGVtZW50SUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQoKICAgIG15ICRFbGVtZW50RXhpc3RzID0gJ05vJzsKCiAgICBpZiAoJFBhcmFte0VsZW1lbnR9IGVxICdTdXJ2ZXknKSB7CiAgICAgICAgbXkgJFNRTCA9ICJTRUxFQ1QgQ09VTlQoaWQpIEZST00gc3VydmV5IFdIRVJFIGlkID0gJFBhcmFte0VsZW1lbnRJRH0iOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKCiAgICAgICAgbXkgJERhdGEgPSAnJzsKICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJERhdGEgPSAkUm93WzBdOwogICAgICAgIH0KICAgICAgICBpZiAoJERhdGEgPiAwKSB7CiAgICAgICAgICAgICRFbGVtZW50RXhpc3RzID0gJ1llcyc7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCRQYXJhbXtFbGVtZW50fSBlcSAnUXVlc3Rpb24nKSB7CiAgICAgICAgbXkgJFNRTCA9ICJTRUxFQ1QgQ09VTlQoaWQpIEZST00gc3VydmV5X3F1ZXN0aW9uIFdIRVJFIGlkID0gJFBhcmFte0VsZW1lbnRJRH0iOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKCiAgICAgICAgbXkgJERhdGEgPSAnJzsKICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJERhdGEgPSAkUm93WzBdOwogICAgICAgIH0KICAgICAgICBpZiAoJERhdGEgPiAwKSB7CiAgICAgICAgICAgICRFbGVtZW50RXhpc3RzID0gJ1llcyc7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCRQYXJhbXtFbGVtZW50fSBlcSAnQW5zd2VyJykgewogICAgICAgIG15ICRTUUwgPSAiU0VMRUNUIENPVU5UKGlkKSBGUk9NIHN1cnZleV9hbnN3ZXIgV0hFUkUgaWQgPSAkUGFyYW17RWxlbWVudElEfSI7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwoKICAgICAgICBteSAkRGF0YSA9ICcnOwogICAgICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICAgICAkRGF0YSA9ICRSb3dbMF07CiAgICAgICAgfQogICAgICAgIGlmICgkRGF0YSA+IDApIHsKICAgICAgICAgICAgJEVsZW1lbnRFeGlzdHMgPSAnWWVzJzsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoJFBhcmFte0VsZW1lbnR9IGVxICdSZXF1ZXN0JykgewogICAgICAgIG15ICRTUUwgPSAiU0VMRUNUIENPVU5UKGlkKSBGUk9NIHN1cnZleV9yZXF1ZXN0IFdIRVJFIGlkID0gJFBhcmFte0VsZW1lbnRJRH0iOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKCiAgICAgICAgbXkgJERhdGEgPSAnJzsKICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJERhdGEgPSAkUm93WzBdOwogICAgICAgIH0KICAgICAgICBpZiAoJERhdGEgPiAwKSB7CiAgICAgICAgICAgICRFbGVtZW50RXhpc3RzID0gJ1llcyc7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkRWxlbWVudEV4aXN0czsKfQoKPWl0ZW0gUmVxdWVzdFNlbmQoKQoKdG8gc2VuZCBhIHJlcXVlc3QgdG8gYSBjdXN0b21lcgoKICAgICRTdXJ2ZXlPYmplY3QtPlJlcXVlc3RTZW5kKAogICAgICAgIFRpY2tldElEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgUmVxdWVzdFNlbmQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJE1hc3RlcklEID0gJyc7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoVGlja2V0SUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBjcmVhdGUgUHVibGljU3VydmV5S2V5CiAgICBteSAkbWQ1ID0gRGlnZXN0OjpNRDUtPm5ldygpOwogICAgJG1kNS0+YWRkKCRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSAuIGludChyYW5kKDk5OTk5OTk5OSkpKTsKICAgIG15ICRQdWJsaWNTdXJ2ZXlLZXkgPSAkbWQ1LT5oZXhkaWdlc3Q7CgogICAgIyBmaW5kIG1hc3RlciBzdXJ2ZXkKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkIEZST00gc3VydmV5IFdIRVJFIHN0YXR1cyA9ICdNYXN0ZXInIgogICAgKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRNYXN0ZXJJRCA9ICRSb3dbMF07CiAgICB9CiAgICAjIGlmIG1hc3RlciBzdXJ2ZXkgZXhpc3RzCiAgICBpZiAoJE1hc3RlcklEICYmICRNYXN0ZXJJRCA+IDApIHsKICAgICAgICBteSAkU3ViamVjdCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXJ2ZXk6Ok5vdGlmaWNhdGlvblN1YmplY3QnKTsKICAgICAgICBteSAkQm9keSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXJ2ZXk6Ok5vdGlmaWNhdGlvbkJvZHknKTsKICAgICAgICAjIHRpY2tldCBkYXRhCiAgICAgICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0pOwogICAgICAgIGZvcmVhY2ggKGtleXMgJVRpY2tldCkgewogICAgICAgICAgICBpZiAoZGVmaW5lZCgkVGlja2V0eyRffSkpIHsKICAgICAgICAgICAgICAgICRTdWJqZWN0ID1+IHMvPE9UUlNfVElDS0VUXyRfPi8kVGlja2V0eyRffS9naTsKICAgICAgICAgICAgICAgICRCb2R5ID1+IHMvPE9UUlNfVElDS0VUXyRfPi8kVGlja2V0eyRffS9naTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIGNsZWFudXAKICAgICAgICAkU3ViamVjdCA9fiBzLzxPVFJTX1RJQ0tFVF8uKz8+Ly0vZ2k7CiAgICAgICAgJEJvZHkgPX4gcy88T1RSU19USUNLRVRfLis/Pi8tL2dpOwogICAgICAgICMgcmVwbGFjZSBjb25maWcgb3B0aW9ucwogICAgICAgICRTdWJqZWN0ID1+IHN7PE9UUlNfQ09ORklHXyguKz8pPn17JFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJDEpfWVneDsKICAgICAgICAkQm9keSA9fiBzezxPVFJTX0NPTkZJR18oLis/KT59eyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCQxKX1lZ3g7CiAgICAgICAgIyBjbGVhbnVwCiAgICAgICAgJFN1YmplY3QgPX4gcy88T1RSU19DT05GSUdfLis/Pi8tL2dpOwogICAgICAgICRCb2R5ID1+IHMvPE9UUlNfQ09ORklHXy4rPz4vLS9naTsKICAgICAgICAjIGdldCBjdXN0b21lciBkYXRhIGFuZCByZXBsYWNlIGl0IHdpdGggPE9UUlNfQ1VTVE9NRVJfREFUQV8uLi4KICAgICAgICBteSAlQ3VzdG9tZXJVc2VyID0gKCk7CiAgICAgICAgaWYgKCRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9KSB7CiAgICAgICAgICAgICVDdXN0b21lclVzZXIgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAjIHJlcGxhY2UgY3VzdG9tZXIgc3R1ZmYgd2l0aCB0YWdzCiAgICAgICAgICAgIGZvcmVhY2ggKGtleXMgJUN1c3RvbWVyVXNlcikgewogICAgICAgICAgICAgICAgaWYgKCRDdXN0b21lclVzZXJ7JF99KSB7CiAgICAgICAgICAgICAgICAgICAgJFN1YmplY3QgPX4gcy88T1RSU19DVVNUT01FUl9EQVRBXyRfPi8kQ3VzdG9tZXJVc2VyeyRffS9naTsKICAgICAgICAgICAgICAgICAgICAkQm9keSA9fiBzLzxPVFJTX0NVU1RPTUVSX0RBVEFfJF8+LyRDdXN0b21lclVzZXJ7JF99L2dpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgY2xlYW51cCBhbGwgbm90IG5lZWRlZCA8T1RSU19DVVNUT01FUl9EQVRBXyB0YWdzCiAgICAgICAgJFN1YmplY3QgPX4gcy88T1RSU19DVVNUT01FUl9EQVRBXy4rPz4vLS9naTsKICAgICAgICAkQm9keSA9fiBzLzxPVFJTX0NVU1RPTUVSX0RBVEFfLis/Pi8tL2dpOwogICAgICAgICMgcmVwbGFjZSBrZXkKICAgICAgICAkU3ViamVjdCA9fiBzLzxPVFJTX1B1YmxpY1N1cnZleUtleT4vJFB1YmxpY1N1cnZleUtleS9naTsKICAgICAgICAkQm9keSA9fiBzLzxPVFJTX1B1YmxpY1N1cnZleUtleT4vJFB1YmxpY1N1cnZleUtleS9naTsKICAgICAgICBteSAkVG8gPSAkQ3VzdG9tZXJVc2Vye1VzZXJFbWFpbH07CiAgICAgICAgaWYgKCEkVG8pIHsKICAgICAgICAgICAgbXkgJUFydGljbGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVMYXN0Q3VzdG9tZXJBcnRpY2xlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRvID0gJEFydGljbGV7RnJvbX07CiAgICAgICAgfQogICAgICAgIGlmICgkVG8pIHsKICAgICAgICAgICAgIyBjaGVjayBpZiBub3Qgc3VydmV5IHNob3VsZCBiZSBzZW5kCiAgICAgICAgICAgIGlmICgkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VydmV5OjpTZW5kTm9TdXJ2ZXlSZWdFeHAnKSkgewogICAgICAgICAgICAgICAgaWYgKCRUbyA9fiAvJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cnZleTo6U2VuZE5vU3VydmV5UmVnRXhwJykvaSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICMgY2hlY2sgaWYgYSBzdXJ2ZXkgaXMgc2VudCBpbiB0aGUgbGFzdCB0aW1lCiAgICAgICAgICAgIGlmICgkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VydmV5OjpTZW5kUGVyaW9kJykpIHsKICAgICAgICAgICAgICAgIG15ICRMYXN0U2VudFRpbWUgPSAwOwogICAgICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1Qgc2VuZF90aW1lIEZST00gIi4KICAgICAgICAgICAgICAgICAgICAgICAgInN1cnZleV9yZXF1ZXN0IFdIRVJFIHNlbmRfdG8gPSAnIi4kU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFRvKS4iJyIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgICAgICAgICAkTGFzdFNlbnRUaW1lID0gJFJvd1swXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkTGFzdFNlbnRUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgJExhc3RTZW50VGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJExhc3RTZW50VGltZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgoJExhc3RTZW50VGltZSsoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cnZleTo6U2VuZFBlcmlvZCcpKjYwKjYwKjI0KSkgPgogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICMgY3JlYXRlIGEgc3VydmV5X3JlcXVlc3QgZW50cnkKICAgICAgICAgICAgbXkgJEN1cnJlbnRUaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+Q3VycmVudFRpbWVzdGFtcCgpOwogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIHN1cnZleV9yZXF1ZXN0ICIuCiAgICAgICAgICAgICAgICAgICAgIiAodGlja2V0X2lkLCBzdXJ2ZXlfaWQsIHZhbGlkX2lkLCBwdWJsaWNfc3VydmV5X2tleSwgc2VuZF90bywgc2VuZF90aW1lKSAiLgogICAgICAgICAgICAgICAgICAgICIgVkFMVUVTICgiLgogICAgICAgICAgICAgICAgICAgICIkUGFyYW17VGlja2V0SUR9LCAiLgogICAgICAgICAgICAgICAgICAgICIkTWFzdGVySUQsICIuCiAgICAgICAgICAgICAgICAgICAgIjEsICIuCiAgICAgICAgICAgICAgICAgICAgIiciLiRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUHVibGljU3VydmV5S2V5KS4iJywgIi4KICAgICAgICAgICAgICAgICAgICAiJyIuJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRUbykuIicsICIuCiAgICAgICAgICAgICAgICAgICAgIickQ3VycmVudFRpbWUnKSIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyBsb2cgYWN0aW9uIG9uIHRpY2tldAogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkhpc3RvcnlBZGQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQ3JlYXRlVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAnTWlzYycsCiAgICAgICAgICAgICAgICBOYW1lID0+ICJTZW50IGN1c3RvbWVyIHN1cnZleSB0byAkVG8uIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyBzZW5kIHN1cnZleQogICAgICAgICAgICAkU2VsZi0+e1NlbmRtYWlsT2JqZWN0fS0+U2VuZCgKICAgICAgICAgICAgICAgIEZyb20gPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cnZleTo6Tm90aWZpY2F0aW9uU2VuZGVyJykgfHwgJycsCiAgICAgICAgICAgICAgICBUbyA9PiAkVG8sCiAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICRTdWJqZWN0LAogICAgICAgICAgICAgICAgVHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICBCb2R5ID0+ICRCb2R5CiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFB1YmxpY1N1cnZleUdldCgpCgp0byBnZXQgYWxsIHB1YmxpYyBhdHRyaWJ1dGVzIG9mIGEgc3VydmV5CgogICAgbXkgJVB1YmxpY1N1cnZleSA9ICRTdXJ2ZXlPYmplY3QtPlB1YmxpY1N1cnZleUdldCgKICAgICAgICBQdWJsaWNTdXJ2ZXlLZXkgPT4gJ0F3NWRlM1hmNXFBJywKICAgICk7Cgo9Y3V0CgpzdWIgUHVibGljU3VydmV5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhQdWJsaWNTdXJ2ZXlLZXkpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gIlNFTEVDVCBzdXJ2ZXlfaWQgIi4KICAgICAgICAiRlJPTSBzdXJ2ZXlfcmVxdWVzdCBXSEVSRSBwdWJsaWNfc3VydmV5X2tleSA9ICckUGFyYW17UHVibGljU3VydmV5S2V5fScgQU5EIHZhbGlkX2lkID0gMSIKICAgICk7CgogICAgbXkgJFN1cnZleUlEID0gKCk7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkU3VydmV5SUQgPSAkUm93WzBdOwogICAgfQoKICAgIGlmICgkU3VydmV5SUQpIHsKICAgICAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgc3VydmV5bnVtYmVyLCB0aXRsZSwgaW50cm9kdWN0aW9uICIuCiAgICAgICAgICAgICJGUk9NIHN1cnZleSBXSEVSRSBpZCA9ICRTdXJ2ZXlJRCBBTkQgKHN0YXR1cyA9ICdNYXN0ZXInIE9SIHN0YXR1cyA9ICdWYWxpZCcpIjsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CiAgICAgICAgbXkgQFN1cnZleSA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCk7CgogICAgICAgIG15ICVEYXRhID0gKCk7CiAgICAgICAgaWYgKCRTdXJ2ZXlbMF0pIHsKICAgICAgICAgICAgJERhdGF7U3VydmV5SUR9ID0gJFN1cnZleVswXTsKICAgICAgICAgICAgJERhdGF7U3VydmV5TnVtYmVyfSA9ICRTdXJ2ZXlbMV07CiAgICAgICAgICAgICREYXRhe1RpdGxlfSA9ICRTdXJ2ZXlbMl07CiAgICAgICAgICAgICREYXRhe0ludHJvZHVjdGlvbn0gPSAkU3VydmV5WzNdOwogICAgICAgICAgICByZXR1cm4gJURhdGE7CiAgICAgICAgfQogICAgfQp9Cgo9aXRlbSBQdWJsaWNBbnN3ZXJTYXZlKCkKCnRvIHNhdmUgYSBwdWJsaWMgdm90ZQoKICAgICRTdXJ2ZXlPYmplY3QtPlB1YmxpY0Fuc3dlclNhdmUoCiAgICAgICAgUHVibGljU3VydmV5S2V5ID0+ICdhVmtkRTgyRHcycXc2ZXJDZGEnLAogICAgICAgIFF1ZXN0aW9uSUQgPT4gNCwKICAgICAgICBWb3RlVmFsdWUgPT4gJ1RoZSBWYWx1ZScsCiAgICApOwoKPWN1dAoKc3ViIFB1YmxpY0Fuc3dlclNhdmV7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoUHVibGljU3VydmV5S2V5IFF1ZXN0aW9uSUQgVm90ZVZhbHVlKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFB1YmxpY1N1cnZleUtleSBWb3RlVmFsdWUpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KTsKICAgIH0KICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gIlNFTEVDVCBpZCAiLgogICAgICAgICIgRlJPTSBzdXJ2ZXlfcmVxdWVzdCBXSEVSRSBwdWJsaWNfc3VydmV5X2tleSA9ICckUGFyYW17UHVibGljU3VydmV5S2V5fScgQU5EIHZhbGlkX2lkID0gMSIKICAgICk7CgogICAgbXkgJFJlcXVlc3RJRCA9ICgpOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJFJlcXVlc3RJRCA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCRSZXF1ZXN0SUQpIHsKICAgICAgICBteSAkQ3VycmVudFRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIHN1cnZleV92b3RlIChyZXF1ZXN0X2lkLCBxdWVzdGlvbl9pZCwgdm90ZV92YWx1ZSwgY3JlYXRlX3RpbWUpIFZBTFVFUyAoIi4KICAgICAgICAgICAgICAgICIkUmVxdWVzdElELCAiLgogICAgICAgICAgICAgICAgIiRQYXJhbXtRdWVzdGlvbklEfSwgIi4KICAgICAgICAgICAgICAgICInJFBhcmFte1ZvdGVWYWx1ZX0nLCAiLgogICAgICAgICAgICAgICAgIickQ3VycmVudFRpbWUnKSIKICAgICAgICApOwogICAgfQp9Cgo9aXRlbSBQdWJsaWNTdXJ2ZXlJbnZhbGlkU2V0KCkKCnRvIHNldCBhIHJlcXVlc3QgaW52YWxpZAoKICAgICRTdXJ2ZXlPYmplY3QtPlB1YmxpY1N1cnZleUludmFsaWRTZXQoCiAgICAgICAgUHVibGljU3VydmV5S2V5ID0+ICdhVmtkRTgyRHcycXc2ZXJDZGEnLAogICAgKTsKCj1jdXQKCnN1YiBQdWJsaWNTdXJ2ZXlJbnZhbGlkU2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhQdWJsaWNTdXJ2ZXlLZXkpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoUHVibGljU3VydmV5S2V5KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAiU0VMRUNUIGlkICIuCiAgICAgICAgIiBGUk9NIHN1cnZleV9yZXF1ZXN0IFdIRVJFIHB1YmxpY19zdXJ2ZXlfa2V5ID0gJyRQYXJhbXtQdWJsaWNTdXJ2ZXlLZXl9JyIKICAgICk7CgogICAgbXkgJFJlcXVlc3RJRCA9ICgpOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJFJlcXVlc3RJRCA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCRSZXF1ZXN0SUQpIHsKICAgICAgICBteSAkQ3VycmVudFRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXlfcmVxdWVzdCBTRVQgIi4KICAgICAgICAgICAgICAgICJ2YWxpZF9pZCA9IDAsICIuCiAgICAgICAgICAgICAgICAidm90ZV90aW1lID0gJyRDdXJyZW50VGltZScgIi4KICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRSZXF1ZXN0SUQiCiAgICAgICAgKTsKICAgIH0KfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjI5ICQgJERhdGU6IDIwMDYvMTIvMDkgMDA6MzU6MjYgJAoKPWN1dA==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0L0V2ZW50L1N1cnZleVNlbmRSZXF1ZXN0LnBtIC0gc2VuZCBzdXJ2ZXkgcmVxdWVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNiBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogU3VydmV5U2VuZFJlcXVlc3QucG0sdiAxLjYgMjAwNi8xMS8yMSAyMzoyNTowMyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6OlN1cnZleVNlbmRSZXF1ZXN0OwoKdXNlIHN0cmljdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdXJ2ZXk7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS42ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IFRpY2tldE9iamVjdCBMb2dPYmplY3QgVXNlck9iamVjdCBDdXN0b21lclVzZXJPYmplY3QgU2VuZG1haWxPYmplY3QgVGltZU9iamVjdCBFbmNvZGVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlN1cnZleS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhUaWNrZXRJRCBFdmVudCBDb25maWcpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoJFBhcmFte0V2ZW50fSBlcSAnU3RhdGVTZXQnIHx8ICRQYXJhbXtFdmVudH0gZXEgJ1RpY2tldFN0YXRlVXBkYXRlJykgewogICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldChUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9KTsKICAgICAgICBpZiAoJFRpY2tldHtTdGF0ZVR5cGV9IGVxICdjbG9zZWQnKXsKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5SZXF1ZXN0U2VuZChUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9KTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKMTs=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50U3VydmV5LnBtIC0gYSBzdXJ2ZXkgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50U3VydmV5LnBtLHYgMS4yOCAyMDA2LzEyLzA5IDAwOjM2OjMyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50U3VydmV5OwoKdXNlIHN0cmljdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdXJ2ZXk7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4yOCAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX307CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgT3BqZWN0cwogICAgZm9yZWFjaCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCEkU2VsZi0+eyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiR290IG5vICRfISIpCiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlN1cnZleS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRPdXRwdXQ7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzdXJ2ZXkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdXJ2ZXknKSB7CiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJNZXNzYWdlIik7CiAgICAgICAgIyBjaGVjayBpZiBzdXJ2ZXkgZXhpc3RzCiAgICAgICAgaWYgKCRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFN1cnZleUlELCBFbGVtZW50ID0+ICdTdXJ2ZXknKSBuZSAnWWVzJykgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIpOwogICAgICAgIH0KICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gJ1N1cnZleScpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgIyBvdXRwdXQgbWVzYWdlcyBpZiBzdGF0dXMgd2FzIGNoYW5nZWQKICAgICAgICBpZiAoZGVmaW5lZCgkTWVzc2FnZSkgJiYgJE1lc3NhZ2UgZXEgJ05vUXVlc3Rpb24nKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgSW5mbyA9PiAnQ2FuXCd0IHNldCBuZXcgU3RhdHVzISBObyBRdWVzdGlvbiBkZWZpbmllZC4nLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoZGVmaW5lZCgkTWVzc2FnZSkgJiYgJE1lc3NhZ2UgZXEgJ0luY29tcGxldGVRdWVzdGlvbicpIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBJbmZvID0+ICdDYW5cJ3Qgc2V0IG5ldyBTdGF0dXMhIFF1ZXN0aW9uKHMpIGluY29tcGxldGUuJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKGRlZmluZWQoJE1lc3NhZ2UpICYmICRNZXNzYWdlIGVxICdTdGF0dXNTZXQnKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnTm90aWNlJywKICAgICAgICAgICAgICAgIEluZm8gPT4gJ05ldyBTdGF0dXMgYWt0aXYhJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgIyBnZXQgYWxsIGF0dHJpYnV0ZXMgb2YgdGhlIHN1cnZleQogICAgICAgIG15ICVTdXJ2ZXkgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlN1cnZleUdldChTdXJ2ZXlJRCA9PiAkU3VydmV5SUQpOwogICAgICAgICMga29udmVydCB0aGUgdGV4dGFyZWFzIGluIGh0bWwgKFxuIC0tPjxicj4pCiAgICAgICAgJFN1cnZleXtJbnRyb2R1Y3Rpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBUZXh0ID0+ICRTdXJ2ZXl7SW50cm9kdWN0aW9ufSwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICApOwogICAgICAgICRTdXJ2ZXl7RGVzY3JpcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBUZXh0ID0+ICRTdXJ2ZXl7RGVzY3JpcHRpb259LAogICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICk7CiAgICAgICAgIyBnZXQgbnVtYmVycyBvZiByZXF1ZXN0cyBhbmQgdm90ZXMKICAgICAgICBteSAkU2VuZFJlcXVlc3QgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkNvdW50UmVxdWVzdChTdXJ2ZXlJRCA9PiAkU3VydmV5SUQsIFZhbGlkSUQgPT4gJ2FsbCcpOwogICAgICAgIG15ICRSZXF1ZXN0Q29tcGxldGUgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkNvdW50UmVxdWVzdChTdXJ2ZXlJRCA9PiAkU3VydmV5SUQsIFZhbGlkSUQgPT4gMCk7CiAgICAgICAgJFN1cnZleXtTZW5kUmVxdWVzdH0gPSAkU2VuZFJlcXVlc3Q7CiAgICAgICAgJFN1cnZleXtSZXF1ZXN0Q29tcGxldGV9ID0gJFJlcXVlc3RDb21wbGV0ZTsKICAgICAgICAjIHByaW50IHRoZSBtYWluIHRhYmxlLgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleScsCiAgICAgICAgICAgIERhdGEgPT4geyVTdXJ2ZXl9LAogICAgICAgICk7CiAgICAgICAgIyBkaXNwbGF5IHN0YXRzIGlmIHN0YXR1cyBNYXN0ZXIsIFZhbGlkIG9yIEludmFsaWQKICAgICAgICBpZiAoJFN1cnZleXtTdGF0dXN9IGVxICdNYXN0ZXInIHx8ICRTdXJ2ZXl7U3RhdHVzfSBlcSAnVmFsaWQnIHx8ICRTdXJ2ZXl7U3RhdHVzfSBlcSAnSW52YWxpZCcpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleUVkaXRTdGF0cycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHtTdXJ2ZXlJRCA9PiAkU3VydmV5SUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAjIGdldCBhbGwgcXVlc3Rpb25zIG9mIHRoZSBzdXJ2ZXkKICAgICAgICAgICAgbXkgQFF1ZXN0aW9uTGlzdCA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+UXVlc3Rpb25MaXN0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCk7CgogICAgICAgICAgICBmb3JlYWNoIG15ICRRdWVzdGlvbihAUXVlc3Rpb25MaXN0KSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleUVkaXRTdGF0c1F1ZXN0aW9uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRRdWVzdGlvbiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgQEFuc3dlcnMgPSAoKTsKICAgICAgICAgICAgICAgICMgZ2VuZXJhdGUgdGhlIGFuc3dlcnMgb2YgdGhlIHF1ZXN0aW9uCiAgICAgICAgICAgICAgICBpZiAoJFF1ZXN0aW9uLT57VHlwZX0gZXEgJ1llc05vJyB8fCAkUXVlc3Rpb24tPntUeXBlfSBlcSAnUmFkaW8nIHx8ICRRdWVzdGlvbi0+e1R5cGV9IGVxICdDaGVja2JveCcgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQEFuc3dlckxpc3QgPSAoKTsKICAgICAgICAgICAgICAgICAgICAjIHNldCBhbnN3ZXJzIHRvIFllcyBhbmQgTm8gaWYgdHlwZSB3YXMgWWVzTm8KICAgICAgICAgICAgICAgICAgICBpZiAoJFF1ZXN0aW9uLT57VHlwZX0gZXEgJ1llc05vJykgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICgpOwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtBbnN3ZXJ9ID0gIlllcyI7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe0Fuc3dlcklEfSA9ICJZZXMiOwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKEBBbnN3ZXJMaXN0LFwlRGF0YSk7CgogICAgICAgICAgICAgICAgICAgICAgICBteSAlRGF0YTIgPSAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGEye0Fuc3dlcn0gPSAiTm8iOwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YTJ7QW5zd2VySUR9ID0gIk5vIjsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChAQW5zd2VyTGlzdCxcJURhdGEyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IGFsbCBhbnN3ZXJzIG9mIGEgcXVlc3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgQEFuc3dlckxpc3QgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlckxpc3QoUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb24tPntRdWVzdGlvbklEfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRSb3coQEFuc3dlckxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJENvdW50Vm90ZSA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+Q291bnRWb3RlKFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uLT57UXVlc3Rpb25JRH0sIFZvdGVWYWx1ZSA9PiAkUm93LT57QW5zd2VySUR9KTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFBlcmNlbnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAjIGNhbGN1bGF0ZSB0aGUgcGVyY2VudHMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRSZXF1ZXN0Q29tcGxldGUgbmUgJzAnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGVyY2VudCA9IDEwMCAvICRSZXF1ZXN0Q29tcGxldGUgKiAkQ291bnRWb3RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBlcmNlbnQgPSBzcHJpbnRmICgiJS4wZiIsICRQZXJjZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJURhdGEgPSAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7QW5zd2VyfSA9ICRSb3ctPntBbnN3ZXJ9OwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtBbnN3ZXJQZXJjZW50fSA9ICRQZXJjZW50OwoKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChAQW5zd2VycyxcJURhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkUXVlc3Rpb24tPntUeXBlfSBlcSAnVGV4dGFyZWEnICkgewogICAgICAgICAgICAgICAgICAgIG15ICRBbnN3ZXJObyA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+Q291bnRWb3RlKFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uLT57UXVlc3Rpb25JRH0sIFZvdGVWYWx1ZSA9PiAnJyk7CiAgICAgICAgICAgICAgICAgICAgbXkgJFBlcmNlbnQgPSAwOwogICAgICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIHRoZSBwZXJjZW50cwogICAgICAgICAgICAgICAgICAgIGlmICgkUmVxdWVzdENvbXBsZXRlIG5lICcwJykgewogICAgICAgICAgICAgICAgICAgICAgICAkUGVyY2VudCA9IDEwMCAvICRSZXF1ZXN0Q29tcGxldGUgKiAkQW5zd2VyTm87CiAgICAgICAgICAgICAgICAgICAgICAgICRQZXJjZW50ID0gc3ByaW50ZiAoIiUuMGYiLCAkUGVyY2VudCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICgpOwogICAgICAgICAgICAgICAgICAgICREYXRhe0Fuc3dlcn0gPSAiYW5zd2VyZWQiOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJFJlcXVlc3RDb21wbGV0ZSBlcSAnMCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7QW5zd2VyUGVyY2VudH0gPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7QW5zd2VyUGVyY2VudH0gPSAxMDAgLSAkUGVyY2VudDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHB1c2goQEFuc3dlcnMsXCVEYXRhKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJURhdGEyID0gKCk7CiAgICAgICAgICAgICAgICAgICAgJERhdGEye0Fuc3dlcn0gPSAibm90IGFuc3dlcmVkIjsKICAgICAgICAgICAgICAgICAgICAkRGF0YTJ7QW5zd2VyUGVyY2VudH0gPSAkUGVyY2VudDsKCiAgICAgICAgICAgICAgICAgICAgcHVzaChAQW5zd2VycywgXCVEYXRhMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjIG91dHB1dCBhbGwgYW5zd2VycyBvZiB0aGUgc3VydmV5CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRSb3cgKEBBbnN3ZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgJFJvdy0+e0Fuc3dlclBlcmNlbnRUYWJsZX0gPSAkUm93LT57QW5zd2VyUGVyY2VudH07CgogICAgICAgICAgICAgICAgICAgIGlmICgkUm93LT57QW5zd2VyUGVyY2VudH0gZXEgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkUm93LT57QW5zd2VyUGVyY2VudFRhYmxlfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlFZGl0U3RhdHNBbnN3ZXInLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRSb3csCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFJlcXVlc3RDb21wbGV0ZSA+IDApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU3VydmV5RWRpdFN0YXRzRGV0YWlscycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUlEID0+ICRTdXJ2ZXlJRCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIG91dHB1dCB0aGUgcG9zc2libGUgc3RhdHVzCiAgICAgICAgbXkgJU5ld1N0YXR1czsKICAgICAgICBpZiAoJFN1cnZleXtTdGF0dXN9IGVxICdOZXcnIHx8ICRTdXJ2ZXl7U3RhdHVzfSBlcSAnSW52YWxpZCcpIHsKICAgICAgICAgICAgJE5ld1N0YXR1c3snTWFzdGVyJ30gPSAnTWFzdGVyJzsKICAgICAgICAgICAgJE5ld1N0YXR1c3snVmFsaWQnfSA9ICdWYWxpZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkU3VydmV5e1N0YXR1c30gZXEgJ1ZhbGlkJykgewogICAgICAgICAgICAkTmV3U3RhdHVzeydNYXN0ZXInfSA9ICdNYXN0ZXInOwogICAgICAgICAgICAkTmV3U3RhdHVzeydJbnZhbGlkJ30gPSAnSW52YWxpZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkU3VydmV5e1N0YXR1c30gZXEgJ01hc3RlcicpIHsKICAgICAgICAgICAgJE5ld1N0YXR1c3snVmFsaWQnfSA9ICdWYWxpZCc7CiAgICAgICAgICAgICROZXdTdGF0dXN7J0ludmFsaWQnfSA9ICdJbnZhbGlkJzsKICAgICAgICB9CiAgICAgICAgbXkgJE5ld1N0YXR1c1N0ciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1N0YXR1cycsCiAgICAgICAgICAgIERhdGEgPT4gXCVOZXdTdGF0dXMsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlTdGF0dXMnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5ld1N0YXR1c1N0ciA9PiAkTmV3U3RhdHVzU3RyLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRTdXJ2ZXknLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzdXJ2ZXkgc3RhdHVzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3VydmV5U3RhdHVzJykgewogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICBteSAkTmV3U3RhdHVzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJOZXdTdGF0dXMiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQogICAgICAgICMgc2V0IGEgbmV3IHN0YXR1cwogICAgICAgIG15ICRTdGF0dXNTZXQgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlN1cnZleVN0YXR1c1NldCgKICAgICAgICAgICAgU3VydmV5SUQgPT4gJFN1cnZleUlELAogICAgICAgICAgICBOZXdTdGF0dXMgPT4gJE5ld1N0YXR1cwogICAgICAgICk7CgogICAgICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICAgICAgaWYgKGRlZmluZWQoJFN0YXR1c1NldCkgJiYgJFN0YXR1c1NldCBlcSAnTm9RdWVzdGlvbicpIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAnJk1lc3NhZ2U9Tm9RdWVzdGlvbic7CiAgICAgICAgfQogICAgICAgIGVsc2lmIChkZWZpbmVkKCRTdGF0dXNTZXQpICYmICRTdGF0dXNTZXQgZXEgJ0luY29tcGxldGVRdWVzdGlvbicpIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAnJk1lc3NhZ2U9SW5jb21wbGV0ZVF1ZXN0aW9uJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKGRlZmluZWQoJFN0YXR1c1NldCkgJiYgJFN0YXR1c1NldCBlcSAnU3RhdHVzU2V0JykgewogICAgICAgICAgICAkTWVzc2FnZSA9ICcmTWVzc2FnZT1TdGF0dXNTZXQnOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVN1cnZleSZTdXJ2ZXlJRD0kU3VydmV5SUQkTWVzc2FnZSIpOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc3VydmV5IGVkaXQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdXJ2ZXlFZGl0JykgewogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAnU3VydmV5Jyk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgbXkgJVN1cnZleSA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+U3VydmV5R2V0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCk7CgogICAgICAgICMgcHJpbnQgdGhlIG1haW4gdGFibGUuCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3VydmV5RWRpdCcsCiAgICAgICAgICAgIERhdGEgPT4geyVTdXJ2ZXl9LAogICAgICAgICk7CgogICAgICAgIG15IEBMaXN0ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvbkxpc3QoU3VydmV5SUQgPT4gJFN1cnZleUlEKTsKCiAgICAgICAgaWYgKCRTdXJ2ZXl7U3RhdHVzfSBlcSAnTmV3JykgewogICAgICAgICAgICBmb3JlYWNoIG15ICRRdWVzdGlvbihATGlzdCkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlFZGl0UXVlc3Rpb25zJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRRdWVzdGlvbiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJEFuc3dlckNvdW50ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5BbnN3ZXJDb3VudChRdWVzdGlvbklEID0+ICRRdWVzdGlvbi0+e1F1ZXN0aW9uSUR9KTsKCiAgICAgICAgICAgICAgICBpZiAoJFF1ZXN0aW9uLT57VHlwZX0gZXEgJ1JhZGlvJyB8fCAkUXVlc3Rpb24tPntUeXBlfSBlcSAnQ2hlY2tib3gnKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBbnN3ZXJDb3VudCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleUVkaXRRdWVzdGlvbnNJbmNvbXBsZXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFF1ZXN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleUVkaXRRdWVzdGlvbnNDb21wbGV0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRRdWVzdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlFZGl0UXVlc3Rpb25zQ29tcGxldGUnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRRdWVzdGlvbiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlFZGl0TmV3UXVlc3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3VydmV5SUQgPT4gJFN1cnZleUlELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJFF1ZXN0aW9uKEBMaXN0KSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleUVkaXRRdWVzdGlvbnNWYWxpZE9uY2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFF1ZXN0aW9uLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFN1cnZleScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHN1cnZleSBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3VydmV5U2F2ZScpIHsKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgbXkgJFRpdGxlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJUaXRsZSIpOwogICAgICAgIG15ICRJbnRyb2R1Y3Rpb24gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkludHJvZHVjdGlvbiIpOwogICAgICAgIG15ICREZXNjcmlwdGlvbiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiRGVzY3JpcHRpb24iKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQogICAgICAgIGlmICgkVGl0bGUgJiYgJEludHJvZHVjdGlvbiAmJiAkRGVzY3JpcHRpb24pIHsKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5TdXJ2ZXlTYXZlKAogICAgICAgICAgICAgICAgU3VydmV5SUQgPT4gJFN1cnZleUlELAogICAgICAgICAgICAgICAgVGl0bGUgPT4gJFRpdGxlLAogICAgICAgICAgICAgICAgSW50cm9kdWN0aW9uID0+ICRJbnRyb2R1Y3Rpb24sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkRGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVN1cnZleSZTdXJ2ZXlJRD0kU3VydmV5SUQjUXVlc3Rpb24iKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1TdXJ2ZXlFZGl0JlN1cnZleUlEPSRTdXJ2ZXlJRCIpOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHN1cnZleSBhZGQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdXJ2ZXlBZGQnKSB7CiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICdTdXJ2ZXkgQWRkJyk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBwcmludCB0aGUgbWFpbiB0YWJsZS4KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlBZGQnLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRTdXJ2ZXknLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzdXJ2ZXkgbmV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3VydmV5TmV3JykgewogICAgICAgIG15ICRUaXRsZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiVGl0bGUiKTsKICAgICAgICBteSAkSW50cm9kdWN0aW9uID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iKTsKICAgICAgICBteSAkRGVzY3JpcHRpb24gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkRlc2NyaXB0aW9uIik7CgogICAgICAgIGlmICgkVGl0bGUgJiYgJEludHJvZHVjdGlvbiAmJiAkRGVzY3JpcHRpb24pIHsKICAgICAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5TdXJ2ZXlOZXcoCiAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVGl0bGUsCiAgICAgICAgICAgICAgICBJbnRyb2R1Y3Rpb24gPT4gJEludHJvZHVjdGlvbiwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICREZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249U3VydmV5JlN1cnZleUlEPSRTdXJ2ZXlJRCIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVN1cnZleUFkZCIpOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHF1ZXN0aW9uIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1F1ZXN0aW9uQWRkJykgewogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICBteSAkUXVlc3Rpb24gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXN0aW9uIik7CiAgICAgICAgbXkgJFR5cGUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlR5cGUiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQoKICAgICAgICBpZiAoJFF1ZXN0aW9uKSB7CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+UXVlc3Rpb25BZGQoCiAgICAgICAgICAgICAgICBTdXJ2ZXlJRCA9PiAkU3VydmV5SUQsCiAgICAgICAgICAgICAgICBRdWVzdGlvbiA9PiAkUXVlc3Rpb24sCiAgICAgICAgICAgICAgICBUeXBlID0+ICRUeXBlLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+UXVlc3Rpb25Tb3J0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249U3VydmV5RWRpdCZTdXJ2ZXlJRD0kU3VydmV5SUQjTmV3UXVlc3Rpb24iKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHF1ZXN0aW9uIGRlbGV0ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1F1ZXN0aW9uRGVsZXRlJykgewogICAgICAgIG15ICRRdWVzdGlvbklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJRdWVzdGlvbklEIik7CiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5IGFuZCBxdWVzdGlvbiBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvbkRlbGV0ZSgKICAgICAgICAgICAgU3VydmV5SUQgPT4gJFN1cnZleUlELAogICAgICAgICAgICBRdWVzdGlvbklEID0+ICRRdWVzdGlvbklELAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+UXVlc3Rpb25Tb3J0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1TdXJ2ZXlFZGl0JlN1cnZleUlEPSRTdXJ2ZXlJRCNRdWVzdGlvbiIpOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgcXVlc3Rpb24gdXAKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdRdWVzdGlvblVwJykgewogICAgICAgIG15ICRRdWVzdGlvbklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJRdWVzdGlvbklEIik7CiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5IGFuZCBxdWVzdGlvbiBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvblNvcnQoU3VydmV5SUQgPT4gJFN1cnZleUlEKTsKCiAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvblVwKAogICAgICAgICAgICBTdXJ2ZXlJRCA9PiAkU3VydmV5SUQsCiAgICAgICAgICAgIFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uSUQsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVN1cnZleUVkaXQmU3VydmV5SUQ9JFN1cnZleUlEI1F1ZXN0aW9uIik7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBxdWVzdGlvbiBkb3duCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnUXVlc3Rpb25Eb3duJykgewogICAgICAgIG15ICRRdWVzdGlvbklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJRdWVzdGlvbklEIik7CiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5IGFuZCBxdWVzdGlvbiBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvblNvcnQoU3VydmV5SUQgPT4gJFN1cnZleUlEKTsKCiAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvbkRvd24oCiAgICAgICAgICAgIFN1cnZleUlEID0+ICRTdXJ2ZXlJRCwKICAgICAgICAgICAgUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249U3VydmV5RWRpdCZTdXJ2ZXlJRD0kU3VydmV5SUQjUXVlc3Rpb24iKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHF1ZXN0aW9uIGVkaXQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdRdWVzdGlvbkVkaXQnKSB7CiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgIG15ICRRdWVzdGlvbklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJRdWVzdGlvbklEIik7CiAgICAgICAgIyBjaGVjayBpZiBzdXJ2ZXkgYW5kIHF1ZXN0aW9uIGV4aXN0cwogICAgICAgIGlmICgkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRTdXJ2ZXlJRCwgRWxlbWVudCA9PiAnU3VydmV5JykgbmUgJ1llcycgfHwKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkUXVlc3Rpb25JRCwgRWxlbWVudCA9PiAnUXVlc3Rpb24nKSBuZSAnWWVzJykgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIpOwogICAgICAgIH0KICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gJ1F1ZXN0aW9uIEVkaXQnKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICBteSAlU3VydmV5ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5TdXJ2ZXlHZXQoU3VydmV5SUQgPT4gJFN1cnZleUlEKTsKICAgICAgICBteSAlUXVlc3Rpb24gPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlF1ZXN0aW9uR2V0KFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uSUQpOwoKICAgICAgICAjIHByaW50IHRoZSBtYWluIHRhYmxlLgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1F1ZXN0aW9uRWRpdCcsCiAgICAgICAgICAgIERhdGEgPT4geyVRdWVzdGlvbn0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRRdWVzdGlvbntUeXBlfSBlcSAnWWVzTm8nKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWVzdGlvbkVkaXQxJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCRRdWVzdGlvbntUeXBlfSBlcSAnUmFkaW8nKSB7CiAgICAgICAgICAgIG15IEBMaXN0ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5BbnN3ZXJMaXN0KFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uSUQpOwoKICAgICAgICAgICAgaWYgKCRTdXJ2ZXl7U3RhdHVzfSBlcSAnTmV3JykgewogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkQW5zd2VyMihATGlzdCkgewogICAgICAgICAgICAgICAgICAgICRBbnN3ZXIyLT57U3VydmV5SUR9ID0gJFN1cnZleUlEOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWVzdGlvbkVkaXQyJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkQW5zd2VyMiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWVzdGlvbkVkaXQyYicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7JVF1ZXN0aW9ufSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRBbnN3ZXIyKEBMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgJEFuc3dlcjItPntTdXJ2ZXlJRH0gPSAkU3VydmV5SUQ7CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1F1ZXN0aW9uRWRpdDJWYWxpZE9uY2UnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRBbnN3ZXIyLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCRRdWVzdGlvbntUeXBlfSBlcSAnQ2hlY2tib3gnKSB7CiAgICAgICAgICAgIG15IEBMaXN0ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5BbnN3ZXJMaXN0KFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uSUQpOwoKICAgICAgICAgICAgaWYgKCRTdXJ2ZXl7U3RhdHVzfSBlcSAnTmV3JykgewogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkQW5zd2VyMyhATGlzdCkgewogICAgICAgICAgICAgICAgICAgICRBbnN3ZXIzLT57U3VydmV5SUR9ID0gJFN1cnZleUlEOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWVzdGlvbkVkaXQzJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkQW5zd2VyMywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWVzdGlvbkVkaXQzYicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7JVF1ZXN0aW9ufSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRBbnN3ZXIzKEBMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgJEFuc3dlcjMtPntTdXJ2ZXlJRH0gPSAkU3VydmV5SUQ7CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1F1ZXN0aW9uRWRpdDNWYWxpZE9uY2UnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRBbnN3ZXIzLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCRRdWVzdGlvbntUeXBlfSBlcSAnVGV4dGFyZWEnKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWVzdGlvbkVkaXQ0JywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRTdXJ2ZXknLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19CiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHF1ZXN0aW9uIHNhdmUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdRdWVzdGlvblNhdmUnKSB7CiAgICAgICAgbXkgJFF1ZXN0aW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXN0aW9uSUQiKTsKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgbXkgJFF1ZXN0aW9uID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJRdWVzdGlvbiIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5IGFuZCBxdWVzdGlvbiBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CgogICAgICAgIGlmICgkUXVlc3Rpb24pIHsKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvblNhdmUoCiAgICAgICAgICAgICAgICBRdWVzdGlvbklEID0+ICRRdWVzdGlvbklELAogICAgICAgICAgICAgICAgU3VydmV5SUQgPT4gJFN1cnZleUlELAogICAgICAgICAgICAgICAgUXVlc3Rpb24gPT4gJFF1ZXN0aW9uLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1TdXJ2ZXlFZGl0JlN1cnZleUlEPSRTdXJ2ZXlJRCNRdWVzdGlvbiIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVF1ZXN0aW9uRWRpdCZTdXJ2ZXlJRD0kU3VydmV5SUQmUXVlc3Rpb25JRD0kUXVlc3Rpb25JRCIpOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFuc3dlciBhZGRkCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQW5zd2VyQWRkJykgewogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICBteSAkUXVlc3Rpb25JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVlc3Rpb25JRCIpOwogICAgICAgIG15ICRBbnN3ZXIgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkFuc3dlciIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5IGFuZCBxdWVzdGlvbiBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CgogICAgICAgIGlmICgkQW5zd2VyKSB7CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyQWRkKAogICAgICAgICAgICAgICAgU3VydmV5SUQgPT4gJFN1cnZleUlELAogICAgICAgICAgICAgICAgUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCwKICAgICAgICAgICAgICAgIEFuc3dlciA9PiAkQW5zd2VyLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyU29ydChRdWVzdGlvbklEID0+ICRRdWVzdGlvbklEKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1RdWVzdGlvbkVkaXQmU3VydmV5SUQ9JFN1cnZleUlEJlF1ZXN0aW9uSUQ9JFF1ZXN0aW9uSUQjTmV3QW5zd2VyIik7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBhbnN3ZXIgZGVsZXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQW5zd2VyRGVsZXRlJykgewogICAgICAgIG15ICRBbnN3ZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiQW5zd2VySUQiKTsKICAgICAgICBteSAkUXVlc3Rpb25JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVlc3Rpb25JRCIpOwogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSwgcXVlc3Rpb24gYW5kIGFuc3dlciBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycgfHwKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkQW5zd2VySUQsIEVsZW1lbnQgPT4gJ0Fuc3dlcicpIG5lICdZZXMnCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlckRlbGV0ZSgKICAgICAgICAgICAgUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCwKICAgICAgICAgICAgQW5zd2VySUQgPT4gJEFuc3dlcklELAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyU29ydChRdWVzdGlvbklEID0+ICRRdWVzdGlvbklEKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVF1ZXN0aW9uRWRpdCZTdXJ2ZXlJRD0kU3VydmV5SUQmUXVlc3Rpb25JRD0kUXVlc3Rpb25JRCNBbnN3ZXIiKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFuc3dlciB1cAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Fuc3dlclVwJykgewogICAgICAgIG15ICRBbnN3ZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiQW5zd2VySUQiKTsKICAgICAgICBteSAkUXVlc3Rpb25JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVlc3Rpb25JRCIpOwogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSwgcXVlc3Rpb24gYW5kIGFuc3dlciBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycgfHwKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkQW5zd2VySUQsIEVsZW1lbnQgPT4gJ0Fuc3dlcicpIG5lICdZZXMnCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlclNvcnQoUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCk7CgogICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyVXAoCiAgICAgICAgICAgIFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uSUQsCiAgICAgICAgICAgIEFuc3dlcklEID0+ICRBbnN3ZXJJRCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249UXVlc3Rpb25FZGl0JlN1cnZleUlEPSRTdXJ2ZXlJRCZRdWVzdGlvbklEPSRRdWVzdGlvbklEI0Fuc3dlciIpOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYW5zd2VyIGRvd24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdBbnN3ZXJEb3duJykgewogICAgICAgIG15ICRBbnN3ZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiQW5zd2VySUQiKTsKICAgICAgICBteSAkUXVlc3Rpb25JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVlc3Rpb25JRCIpOwogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSwgcXVlc3Rpb24gYW5kIGFuc3dlciBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycgfHwKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkQW5zd2VySUQsIEVsZW1lbnQgPT4gJ0Fuc3dlcicpIG5lICdZZXMnCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlclNvcnQoUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCk7CgogICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyRG93bigKICAgICAgICAgICAgUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCwKICAgICAgICAgICAgQW5zd2VySUQgPT4gJEFuc3dlcklELAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1RdWVzdGlvbkVkaXQmU3VydmV5SUQ9JFN1cnZleUlEJlF1ZXN0aW9uSUQ9JFF1ZXN0aW9uSUQjQW5zd2VyIik7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBhbnN3ZXIgZWRpdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Fuc3dlckVkaXQnKSB7CiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgIG15ICRRdWVzdGlvbklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJRdWVzdGlvbklEIik7CiAgICAgICAgbXkgJEFuc3dlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJBbnN3ZXJJRCIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5LCBxdWVzdGlvbiBhbmQgYW5zd2VyIGV4aXN0cwogICAgICAgIGlmICgkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRTdXJ2ZXlJRCwgRWxlbWVudCA9PiAnU3VydmV5JykgbmUgJ1llcycgfHwKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkUXVlc3Rpb25JRCwgRWxlbWVudCA9PiAnUXVlc3Rpb24nKSBuZSAnWWVzJyB8fAogICAgICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRBbnN3ZXJJRCwgRWxlbWVudCA9PiAnQW5zd2VyJykgbmUgJ1llcycKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CgogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAnQW5zd2VyIEVkaXQnKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICBteSAlQW5zd2VyID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5BbnN3ZXJHZXQoQW5zd2VySUQgPT4gJEFuc3dlcklEKTsKICAgICAgICAkQW5zd2Vye1N1cnZleUlEfSA9ICRTdXJ2ZXlJRDsKCiAgICAgICAgIyBwcmludCB0aGUgbWFpbiB0YWJsZS4KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBbnN3ZXJFZGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7JUFuc3dlcn0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFN1cnZleScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFuc3dlciBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQW5zd2VyU2F2ZScpIHsKICAgICAgICBteSAkQW5zd2VySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkFuc3dlcklEIik7CiAgICAgICAgbXkgJFF1ZXN0aW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXN0aW9uSUQiKTsKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgbXkgJEFuc3dlciA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiQW5zd2VyIik7CiAgICAgICAgIyBjaGVjayBpZiBzdXJ2ZXksIHF1ZXN0aW9uIGFuZCBhbnN3ZXIgZXhpc3RzCiAgICAgICAgaWYgKCRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFN1cnZleUlELCBFbGVtZW50ID0+ICdTdXJ2ZXknKSBuZSAnWWVzJyB8fAogICAgICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRRdWVzdGlvbklELCBFbGVtZW50ID0+ICdRdWVzdGlvbicpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJEFuc3dlcklELCBFbGVtZW50ID0+ICdBbnN3ZXInKSBuZSAnWWVzJwogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRBbnN3ZXIpIHsKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5BbnN3ZXJTYXZlKAogICAgICAgICAgICAgICAgQW5zd2VySUQgPT4gJEFuc3dlcklELAogICAgICAgICAgICAgICAgUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCwKICAgICAgICAgICAgICAgIEFuc3dlciA9PiAkQW5zd2VyLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVF1ZXN0aW9uRWRpdCZTdXJ2ZXlJRD0kU3VydmV5SUQmUXVlc3Rpb25JRD0kUXVlc3Rpb25JRCNBbnN3ZXIiCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1BbnN3ZXJFZGl0JlN1cnZleUlEPSRTdXJ2ZXlJRCZRdWVzdGlvbklEPSRRdWVzdGlvbklEJkFuc3dlcklEPSRBbnN3ZXJJRCIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzdGF0cwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0YXRzJykgewogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQoKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gJ1N0YXRzIE92ZXJ2aWV3Jyk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBwcmludCB0aGUgbWFpbiB0YWJsZS4KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGF0cycsCiAgICAgICAgICAgIERhdGEgPT4ge1N1cnZleUlEID0+ICRTdXJ2ZXlJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgQExpc3QgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlZvdGVMaXN0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCk7CgogICAgICAgIGZvcmVhY2ggbXkgJFZvdGUoQExpc3QpIHsKICAgICAgICAgICAgJFZvdGUtPntTdXJ2ZXlJRH0gPSAkU3VydmV5SUQ7CiAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldChUaWNrZXRJRCA9PiAkVm90ZS0+e1RpY2tldElEfSk7CiAgICAgICAgICAgICRWb3RlLT57VGlja2V0TnVtYmVyfSA9ICRUaWNrZXR7VGlja2V0TnVtYmVyfTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGF0c1ZvdGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkVm90ZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRTdXJ2ZXknLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzdGF0ZSBkZXRhaWwKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdGF0c0RldGFpbCcpIHsKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgbXkgJFJlcXVlc3RJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUmVxdWVzdElEIik7CiAgICAgICAgIyBjaGVjayBpZiBzdXJ2ZXkgZXhpc3RzCiAgICAgICAgaWYgKCRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFN1cnZleUlELCBFbGVtZW50ID0+ICdTdXJ2ZXknKSBuZSAnWWVzJyB8fAogICAgICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRSZXF1ZXN0SUQsIEVsZW1lbnQgPT4gJ1JlcXVlc3QnKSBuZSAnWWVzJwogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIpOwogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICdTdGF0cyBEZXRhaWwnKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHByaW50IHRoZSBtYWluIHRhYmxlLgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRzRGV0YWlsJywKICAgICAgICAgICAgRGF0YSA9PiB7U3VydmV5SUQgPT4gJFN1cnZleUlEfSwKICAgICAgICApOwoKICAgICAgICBteSBAUXVlc3Rpb25MaXN0ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvbkxpc3QoU3VydmV5SUQgPT4gJFN1cnZleUlEKTsKCiAgICAgICAgZm9yZWFjaCBteSAkUXVlc3Rpb24oQFF1ZXN0aW9uTGlzdCkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdHNEZXRhaWxRdWVzdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRRdWVzdGlvbiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15IEBBbnN3ZXJzID0gKCk7CgogICAgICAgICAgICBpZiAoJFF1ZXN0aW9uLT57VHlwZX0gZXEgJ1JhZGlvJyB8fCAkUXVlc3Rpb24tPntUeXBlfSBlcSAnQ2hlY2tib3gnKSB7CiAgICAgICAgICAgICAgICBteSBAQW5zd2VyTGlzdCA9ICgpOwoKICAgICAgICAgICAgICAgIEBBbnN3ZXJMaXN0ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5Wb3RlR2V0KFJlcXVlc3RJRCA9PiAkUmVxdWVzdElELCBRdWVzdGlvbklEID0+ICRRdWVzdGlvbi0+e1F1ZXN0aW9uSUR9KTsKCiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRSb3cgKEBBbnN3ZXJMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUFuc3dlciA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyR2V0KEFuc3dlcklEID0+ICRSb3ctPntWb3RlVmFsdWV9KTsKICAgICAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICgpOwogICAgICAgICAgICAgICAgICAgICREYXRhe0Fuc3dlcn0gPSAkQW5zd2Vye0Fuc3dlcn07CgogICAgICAgICAgICAgICAgICAgIHB1c2goQEFuc3dlcnMsXCVEYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJFF1ZXN0aW9uLT57VHlwZX0gZXEgJ1llc05vJyB8fCAkUXVlc3Rpb24tPntUeXBlfSBlcSAnVGV4dGFyZWEnKSB7CiAgICAgICAgICAgICAgICBteSBATGlzdCA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+Vm90ZUdldChSZXF1ZXN0SUQgPT4gJFJlcXVlc3RJRCwgUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb24tPntRdWVzdGlvbklEfSk7CiAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICgpOwoKICAgICAgICAgICAgICAgICREYXRhe0Fuc3dlcn0gPSAkTGlzdFswXS0+e1ZvdGVWYWx1ZX07CgogICAgICAgICAgICAgICAgcHVzaChAQW5zd2VycyxcJURhdGEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3JlYWNoIG15ICRSb3cgKEBBbnN3ZXJzKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRzRGV0YWlsQW5zd2VyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRSb3csCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50U3VydmV5JywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2hvdyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAnT3ZlcnZpZXcnKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBwcmludCB0aGUgbWFpbiB0YWJsZS4KICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4ge30sCiAgICApOwogICAgbXkgQExpc3QgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlN1cnZleUxpc3QoKTsKCiAgICBmb3JlYWNoIG15ICRTdXJ2ZXlJRCAoQExpc3QpIHsKICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICBpZiAoJFBhcmFte0NsYXNzfSAmJiAkUGFyYW17Q2xhc3N9IGVxICdzZWFyY2hwYXNzaXZlJykgewogIC