TimeAccounting
1.0.7
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Fixed bug# 3028 Wrong translation of month july for german users.
Make TimeAccounting executable on OTRS 2.3. It also runs on 2.2 and 2.1.
Fixed the problem with available year-values in the reporting pulldownmenue.
Fixed a translation bug which costs 10 percent performance in the edit mode.
A new release with the improvements of Torsten Thau. Thank you Torsten.
Fixed the problem if the agent has ro-permissions and try to see old time accounting overviews.
Make the TimeAccounting module fit for OTRS 2.2.
first version build with OPMS
A TimeAccounting Modul.
Ein Zeiterfassungsmodul.
2.1.x
2.2.x
2.3.x
# add groups
$Self->{GroupObject}->GroupAdd(
Name => 'time_accounting',
Comment => '',
ValidID => 1,
UserID => 1,
);
2008-07-08 10:00:05
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFRpbWVBY2NvdW50aW5nLnhtbCx2IDEuNyAyMDA3LzA1LzExIDE0OjM3OjA1IHRyIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRUaW1lQWNjb3VudGluZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kTW9kdWxlUmVnaXN0cmF0aW9uIGZvciBUaW1lQWNjb3VudGluZ01vZHVsZSAgdG8gZGVmaW5lIHRoZSByZWdpc3RyYXRpb24gc2V0dGluZ3MgaW4gdGhlIHByb2dyYW0gYW5kIHRvIHNldCByaWdodHMgYW5kIHBvc2l0aW9ucyBvZiBpY29ucyBpbiB0aGUgbmF2aWdhdGlvbiBiYXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kTW9kdWxSZWdpc3RyYXRpb24gZvxyIGRhcyBaZWl0ZXJmYXNzdW5nc01vZHVsLiAgSGllcgpr9m5uZW4gU2llIGRpZSBBbmdhYmVuIGb8ciBkaWUgUmVnaXN0cmllcnVuZyBkZXMgTW9kdWxzIGltIFByb2dyYW1tIHTkdGlnZW4uIEZlcm5lcgpr9m5uZW4gZGllIFJlY2h0ZSB1bmQgZGllIFBvc2l0aW9uZW4gZGVyIEljb25zIGluIGRlciBOYXZpZ2F0aW9uc2xlaXN0ZSBnZXNldHp0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPnRpbWVfYWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz50aW1lX2FjY291bnRpbmc8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+VGltZUFjY291bnRpbmc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+VGltZUFjY291bnRpbmc8L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8VGl0bGU+VGltZUFjY291bnRpbmc8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+VGltZUFjY291bnRpbmc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlRpbWVBY2NvdW50aW5nPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT50aW1lX2FjY291bnRpbmcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRUaW1lQWNjb3VudGluZyZhbXA7U3ViYWN0aW9uPUVkaXQ8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5UaW1lQWNjb3VudGluZzwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPk1lbnU8L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NjAwMDwvUHJpbz4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz50aW1lX2FjY291bnRpbmc8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPk92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5PdmVydmlldzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+b3ZlcnZpZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRUaW1lQWNjb3VudGluZyZhbXA7U3ViYWN0aW9uPU92ZXJ2aWV3PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPlRpbWVBY2NvdW50aW5nPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT5vPC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MTAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+dGltZV9hY2NvdW50aW5nPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5UaW1lUmVjb3JkLUVkaXQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkVkaXQ8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPm5ldy5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudFRpbWVBY2NvdW50aW5nJmFtcDtTdWJhY3Rpb249RWRpdDwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5UaW1lQWNjb3VudGluZzwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+bjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjIwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgIDxHcm91cD50aW1lX2FjY291bnRpbmc8L0dyb3VwPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5SZXBvcnRpbmc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlJlcG9ydGluZzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+cmVwb3J0aW5nLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmYW1wO1N1YmFjdGlvbj1SZXBvcnRpbmc8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+VGltZUFjY291bnRpbmc8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjUwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8R3JvdXA+dGltZV9hY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+U2V0dGluZzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+U2V0dGluZzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+bW9kdWxlX3NldHRpbmcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRUaW1lQWNjb3VudGluZyZhbXA7U3ViYWN0aW9uPVNldHRpbmc8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+VGltZUFjY291bnRpbmc8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjkwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0UHJvamVjdE5hbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IG5hbWUgZm9yIG5ldyBwcm9qZWN0cy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SW5pdGlhbGVyIFByb2plY3RuYW1lIGJlaW0gZXJzdGVsbGVuIGVpbmVzIG5ldWVuIFByb2pla3QgaW4gZGVyIFplaXRlcmZhc3N1bmcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0UHJvamVjdFN0YXR1cyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc3RhdHVzIG9mIGFuIG5ldyBwcm9qZWN0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmZhbmdzc3RhdHVzIGVpbmVzIG5ldWVuIFByb2pla3RzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+aW52YWxpZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+dmFsaWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0QWN0aW9uTmFtZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgbmFtZSBmb3IgbmV3IGFjdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkluaXRpYWxlciBOYW1lIGVpbmVyIG5ldWVuIFTkdGlna2VpdCBpbiBkZXIgWmVpdGVyZmFzc3VuZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRBY3Rpb25TdGF0dXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IHN0YXR1cyBvZiBhbiBuZXcgYWN0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmZhbmdzc3RhdHVzIGVpbmVyIG5ldWVuIFTkdGlna2VpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPmludmFsaWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPnZhbGlkPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJXZWVrbHlIb3VycyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc2V0dGluZyBmb3IgdGhlIHN0YW5kYXJkIHdlZWtseSBob3Vycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQgV29jaGVuYXJiZWl0c3plaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjQwPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyTGVhdmVEYXlzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzZXR0aW5nIGZvciBsZWF2ZSBkYXlzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZCBVcmxhdWJzdGFnZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MjM8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJPdmVydGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc2V0dGluZyBmb3Igb3ZlcnRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkV2ZW50dWVsbCB2b3JoYW5kZW5lciDcYmVyc3R1bmRlbvxiZXJ0cmFnLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4wPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyRGF0ZVN0YXJ0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzZXR0aW5nIGZvciBkYXRlIHN0YXJ0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFydGRhdHVtIGb8ciBkaWUgRWluZ2FiZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjIwMDgtMDEtMDE8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJEYXRlRW5kIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzZXR0aW5nIGZvciBkYXRlIGVuZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RW5kZGF0dW0gZvxyIGRpZSBFaW5nYWJlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MjAwOC0xMi0zMTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlclN0YXR1cyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc3RhdHVzIG9mIGFuIG5ldyB1c2VyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmZhbmdzc3RhdHVzIGVpbmVzIG5ldWVuIEJlbnV0emVycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPmludmFsaWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPnZhbGlkPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6TWF4SW50ZXJ2YWxPZkluY29tcGxldGVEYXlzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+V29ya2luZyBkYXlzIGFmdGVyIGF0IHRoZSBsYXRlc3Qgd29ya2luZyB1bml0cyBoYXZlIHRvIGluc2VydC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TGVndCBmZXN0LCBuYWNoIHdpZXZpZWxlbiBXZXJrdGFnZW4gc3DkdGVzdGVucyBkaWUgQXJiZWl0c3N0dW5kZW4gZWluZ2V0cmFnZW4gd2VyZGVuIG38c3Nlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+NDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpNYXhJbnRlcnZhbE9mSW5jb21wbGV0ZURheXNCZWZvcmVXYXJuaW5nIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyB3YXJuaW5nLCBpZiB0byBtdWNoIGluY29tcGxldGUgd29ya2luZyBkYXlzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5aZWlndCBlaW5lIFdhcm51bmcsIHdlbm4genV2aWVsZSBBcmJlaXRzdGFnZSBuaWNodCBlaW5nZXRyYWdlbiB3dXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjI8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6Tm90aWZ5TW9kdWxlIyMjODg4LVRpbWVBY2NvdW50aW5nIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBub3RpZmljYXRpb24gbW9kdWxlIGdpdmVzIGEgd2FybmluZyBpZiB0byBtdWNoIGluY29tcGxldGUgd29ya2luZyBkYXlzIGF2YWlsYWJsZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TW9kdWwsIGRhcyBkZW4gQWdlbnQgaW0gTm90aWZpY2F0aW9uLUJlcmVpY2ggZGVzIEFnZW50LUludGVyZmFjZXMgZGFy/GJlciBpbmZvcm1pZXJ0LCB3ZW5uIHNjaG9uIHp1IGxhbmdlIGtlaW5lIFN0dW5kZW4gbWVociBlaW5nZXRyYWdlbiB3dXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZU5vdGlmeTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOb3RpZmljYXRpb25UaW1lQWNjb3VudGluZzwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpNYXhBbGxvd2VkSW5zZXJ0RGF5cyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZvciBob3cgbWFueSBkYXlzIGFnbyB5b3UgY2FuIGluc2VydCB3b3JraW5nIHVuaXRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MZWd0IGZlc3QsIGJpcyB3YW5uIG1hbiBpbiDkbHRlcmUgWmVpdGVpbnRy5GdlIGJlYXJiZWl0ZW4ga2FubiAoei4gQi4gMTAgVGFnZSB6dXL8Y2tsaWVnZW5kKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MTA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6UmVkdWNlVGltZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRvIHVzZSwgaWYgc29tZSBhY3Rpb25zIGFjb3VudCByZWR1Y2VkIHdvcmtpbmcgaG91cnMoS2V5ID0mZ3Q7IHRyYXZlbGluZzsgQ29udGVudCA9Jmd0OyA1MCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIga2FubiBtYW4gZWluZ2ViZW4sIG9iIGb8ciBlaW5lIGJlc3RpbW10ZSBU5HRpZ2tlaXQsIGRpZSB6dSB2ZXJyZWNobmVuZGVuIFN0dW5kZW4gZ2Vr/HJ6dCB3ZXJkZW4uIFouIEIgd2VubiBSZWlzZXplaXRlbiBudXIgenVyIEjkbGZ0ZSB2ZXJn/HRldCB3ZXJkZW4gKEtleSA9Jmd0OyBqb3VybmV5OyBDb250ZW50ID0mZ3Q7IDUwKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJ0cmF2ZWxpbmciPjUwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OklucHV0SG91cnNXaXRob3V0U3RhcnRFbmRUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2V0dGluZywgaWYgd29ya2luZyBob3VycyBjYW4gaW5zZXJ0IHdpdGhvdXQgc3RhcnQtIGFuZCBlbmR0aW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MZWd0IGZlc3QsIG9iIG1hbiBBcmJlaXRzc3R1bmRlbiBhdWNoIG9obmUgQW5mYW5ncy0gdW5kIEVuZHplaXQgZWluZ2ViZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlByZUFwcGxpY2F0aW9uTW9kdWxlIyMjQWdlbnRUaW1lQWNjb3VudGluZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgbW9kdWxlIHlvdSBjYW4gZm9yY2UgaW5zZXJ0cyBpbiB0aGUgVGltZUFjY291bnRpbmcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1pdCBIaWxmZSBkaWVzZXMgTW9kdWxzIGv2bm5lbiBFaW50cuRnZSBpbiBkaWUgWmVpdGVyZmFzc3VuZyBlcnp3dW5nZW4gd2VyZGVuLCBpbiBkZW0gYmVpbSBFaW5sb2dnZW4gZGFzIFBvcnRhbCBnZWJsb2NrdCB3aXJkIHVuZCBudXIgZGFzIFplaXRlcmZhc3N1bmdzZmVuc3RlciBlcnNjaGVpbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPktlcm5lbDo6TW9kdWxlczo6QWdlbnRUaW1lQWNjb3VudGluZzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
Iy0tCiMgS2VybmVsL1N5c3RlbS9UaW1lQWNjb3VudGluZy5wbSAtIGFsbCB0aW1lIGFjY291bnRpbmcgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBUaW1lQWNjb3VudGluZy5wbSx2IDEuMTMgMjAwOC8wNy8wNyAwNjoyNjowOCB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMyAkKSBbMV07Cgp1c2UgRGF0ZTo6UGNhbGMgcXcoVG9kYXkgRGF5c19pbl9Nb250aCBEYXlfb2ZfV2Vlayk7CgojdXNlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhckV2ZW50OwoKPWhlYWQxIE5BTUUjCgpLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmcgLSB0aW1lYWNjb3VudGluZyBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHRpbWVhY2NvdW50aW5nIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UjCgo9b3ZlciA0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmc7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkVGltZUFjY291bnRpbmdPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgVXNlcklEIFRpbWVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBVc2VyQ3VycmVudFBlcmlvZEdldCgpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSB1c2VyIG9mIHRoZSBjdXJyZW50IHBlcmlvZCBkYXRhCgogICAgbXkgJVVzZXJEYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyQ3VycmVudFBlcmlvZEdldCgKICAgICAgICBZZWFyICA9PiAnMjAwNScsCiAgICAgICAgTW9udGggPT4gJzEyJzsKICAgICAgICBEYXkgICA9PiAnMjQnCiAgICApOwoKPWN1dAoKc3ViIFVzZXJDdXJyZW50UGVyaW9kR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJURhdGEgPSAoKTsKICAgIGZvciAocXcoWWVhciBNb250aCBEYXkpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApIHx8ICcnOwogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fQogICAgICAgICAgICAgICAgLT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIlVzZXJDdXJyZW50UGVyaW9kR2V0OiBOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkRGF0ZSA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCIsICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0gKSAuICIgMDA6MDA6MDAiOwoKICAgICMgZGIgc2VsZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+CiAgICAgICAgICAgICJTRUxFQ1QgdXNlcl9pZCwgcHJlZmVyZW5jZV9wZXJpb2QsIGRhdGVfc3RhcnQsIGRhdGVfZW5kLCB3ZWVrbHlfaG91cnMsIGxlYXZlX2RheXMsIG92ZXJ0aW1lLCBzdGF0dXMgRlJPTSB0aW1lX2FjY291bnRpbmdfdXNlcl9wZXJpb2QgIgogICAgICAgICAgICAuICJXSEVSRSBkYXRlX3N0YXJ0IDw9ICciCiAgICAgICAgICAgIC4gJERhdGUKICAgICAgICAgICAgLiAiJyBBTkQgZGF0ZV9lbmQgID49JyIKICAgICAgICAgICAgLiAkRGF0ZQogICAgICAgICAgICAuICInIiwgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICREYXRheyAkUm93WzBdIH17VXNlcklEfSAgICAgID0gJFJvd1swXTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e1BlcmlvZH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtEYXRlU3RhcnR9ICAgPSBzdWJzdHIoICRSb3dbMl0sIDAsIDEwICk7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtEYXRlRW5kfSAgICAgPSBzdWJzdHIoICRSb3dbM10sIDAsIDEwICk7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtXZWVrbHlIb3Vyc30gPSAkUm93WzRdOwogICAgICAgICREYXRheyAkUm93WzBdIH17TGVhdmVEYXlzfSAgID0gJFJvd1s1XTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e092ZXJ0aW1lfSAgICA9ICRSb3dbNl07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtVc2VyU3RhdHVzfSAgPSAkUm93WzddOwogICAgfQoKICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gVXNlclJlcG9ydGluZygpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGxlYXZlZGF5cywgb3ZlcnRpbWVzLAp3b3JraW5naG91cnMgZXRjLiBvZiBhbGwgdXNlcnMKCiAgICBteSAlRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+VXNlclJlcG9ydGluZygKICAgICAgICBZZWFyICA9PiAnMjAwNScsCiAgICAgICAgTW9udGggPT4gJzEyJywKICAgICAgICBEYXkgICA9PiAnMTInLCAgICAgICMgT3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgVXNlclJlcG9ydGluZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhID0gKCk7CiAgICBmb3IgKHF3KFllYXIgTW9udGggRGF5KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKSB8fCAnJzsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICYmICRfIG5lICdEYXknICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiVXNlclJlcG9ydGluZzogTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICEkUGFyYW17RGF5fSApIHsKICAgICAgICAkUGFyYW17RGF5fSA9IERheXNfaW5fTW9udGgoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSApOwogICAgfQoKICAgIG15ICVVc2VyQ3VycmVudFBlcmlvZCA9ICRTZWxmLT5Vc2VyQ3VycmVudFBlcmlvZEdldCglUGFyYW0pOwogICAgbXkgJFllYXJTdGFydCAgICAgICAgID0gMDsKICAgIG15ICRNb250aFN0YXJ0ICAgICAgICA9IDA7CiAgICBteSAkRGF5U3RhcnQgICAgICAgICAgPSAwOwogICAgbXkgJE1vbnRoU3RhcnRQb2ludCAgID0gMDsKICAgIG15ICREYXlTdGFydFBvaW50ICAgICA9IDA7CiAgICBteSAkTW9udGhFbmRQb2ludCAgICAgPSAwOwogICAgbXkgJERheUVuZFBvaW50ICAgICAgID0gMDsKICAgIG15ICRZZWFyRW5kICAgICAgICAgICA9ICRQYXJhbXtZZWFyfTsKICAgIG15ICRNb250aEVuZCAgICAgICAgICA9ICRQYXJhbXtNb250aH07CiAgICBteSAkRGF5RW5kICAgICAgICAgICAgPSAkUGFyYW17RGF5fTsKICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlVXNlckN1cnJlbnRQZXJpb2QgKSB7CgogICAgICAgIGlmICggJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e0RhdGVTdGFydH0gPX4gL14oXGQrKS0oXGQrKS0oXGQrKS8gKSB7CiAgICAgICAgICAgICRZZWFyU3RhcnQgID0gJDE7CiAgICAgICAgICAgICRNb250aFN0YXJ0ID0gJDI7CiAgICAgICAgICAgICREYXlTdGFydCAgID0gJDM7CiAgICAgICAgfQogICAgICAgICREYXRheyRVc2VySUR9e0xlYXZlRGF5fSAgICAgICAgID0gMDsKICAgICAgICAkRGF0YXskVXNlcklEfXtEaXNlYXNlZH0gICAgICAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17T3ZlcnRpbWV9ICAgICAgICAgPSAwOwogICAgICAgICREYXRheyRVc2VySUR9e1RhcmdldFN0YXRlfSAgICAgID0gMDsKICAgICAgICAkRGF0YXskVXNlcklEfXtMZWF2ZURheVRvdGFsfSAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17RGlzZWFzZWRUb3RhbH0gICAgPSAwOwogICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lVG90YWx9ICAgID0gMDsKICAgICAgICAkRGF0YXskVXNlcklEfXtUYXJnZXRTdGF0ZVRvdGFsfSA9IDA7CgogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBmb3IgKCBteSAkWWVhciA9ICRZZWFyU3RhcnQ7ICRZZWFyIDw9ICRZZWFyRW5kOyAkWWVhcisrICkgewogICAgICAgICAgICBpZiAoICRZZWFyID09ICRZZWFyU3RhcnQgKSB7CiAgICAgICAgICAgICAgICAkTW9udGhTdGFydFBvaW50ID0gJE1vbnRoU3RhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTW9udGhTdGFydFBvaW50ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRZZWFyID09ICRZZWFyRW5kICkgewogICAgICAgICAgICAgICAgJE1vbnRoRW5kUG9pbnQgPSAkTW9udGhFbmQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTW9udGhFbmRQb2ludCA9IDEyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoIG15ICRNb250aCA9ICRNb250aFN0YXJ0UG9pbnQ7ICRNb250aCA8PSAkTW9udGhFbmRQb2ludDsgJE1vbnRoKysgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRZZWFyID09ICRZZWFyU3RhcnQgJiYgJE1vbnRoID09ICRNb250aFN0YXJ0ICkgewogICAgICAgICAgICAgICAgICAgICREYXlTdGFydFBvaW50ID0gJERheVN0YXJ0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJERheVN0YXJ0UG9pbnQgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkWWVhciA9PSAkWWVhckVuZCAmJiAkTW9udGggPT0gJE1vbnRoRW5kICkgewogICAgICAgICAgICAgICAgICAgICREYXlFbmRQb2ludCA9ICREYXlFbmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkRGF5RW5kUG9pbnQgPSBEYXlzX2luX01vbnRoKCAkWWVhciwgJE1vbnRoICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKCBteSAkRGF5ID0gJERheVN0YXJ0UG9pbnQ7ICREYXkgPD0gJERheUVuZFBvaW50OyAkRGF5KysgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJVdvcmtpbmdVbml0ID0gJFNlbGYtPldvcmtpbmdVbml0c0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgWWVhciAgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gJERheSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSAkV29ya2luZ0hvdXJzID0gMDsKICAgICAgICAgICAgICAgICAgICBteSAkTGVhdmVEYXkgICAgID0gMDsKICAgICAgICAgICAgICAgICAgICBteSAkRGlzZWFzZWQgICAgID0gMDsKICAgICAgICAgICAgICAgICAgICBteSAkT3ZlcnRpbWUgICAgID0gMDsKICAgICAgICAgICAgICAgICAgICBteSAkVGFyZ2V0U3RhdGUgID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKCBrZXlzICVXb3JraW5nVW5pdCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFdvcmtpbmdIb3VycyArPSAkV29ya2luZ1VuaXR7JF99e1BlcmlvZH07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFdvcmtpbmdVbml0eyRffXtQcm9qZWN0SUR9ID09IC0xICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkV29ya2luZ1VuaXR7JF99e0FjdGlvbklEfSA9PSAtMiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtMZWF2ZURheVRvdGFsfSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMZWF2ZURheSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRXb3JraW5nVW5pdHskX317QWN0aW9uSUR9ID09IC0xICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e0Rpc2Vhc2VkVG90YWx9Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERpc2Vhc2VkID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFdvcmtpbmdVbml0eyRffXtBY3Rpb25JRH0gPT0gLTMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17T3ZlcnRpbWVUb3RhbH0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkT3ZlcnRpbWUgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtXb3JraW5nSG91cnNUb3RhbH0gKz0gJFdvcmtpbmdIb3VyczsKICAgICAgICAgICAgICAgICAgICBteSAkVmFjYXRpb25DaGVjayA9ICRTZWxmLT5WYWNhdGlvbkNoZWNrKAogICAgICAgICAgICAgICAgICAgICAgICBZZWFyICA9PiAkWWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgTW9udGggPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgICAgICAgICBEYXkgICA9PiAkRGF5LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJFdlZWtkYXkgPSBEYXlfb2ZfV2VlayggJFllYXIsICRNb250aCwgJERheSApOwogICAgICAgICAgICAgICAgICAgIGlmICggICAkV2Vla2RheSAhPSA2CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRXZWVrZGF5ICE9IDcKICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRWYWNhdGlvbkNoZWNrCiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkRGlzZWFzZWQKICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRMZWF2ZURheSApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtUYXJnZXRTdGF0ZVRvdGFsfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e1dlZWtseUhvdXJzfSAvIDU7CiAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRTdGF0ZSA9ICRVc2VyQ3VycmVudFBlcmlvZHskVXNlcklEfXtXZWVrbHlIb3Vyc30gLyA1OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTW9udGggPT0gJE1vbnRoRW5kICYmICRZZWFyID09ICRZZWFyRW5kICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtUYXJnZXRTdGF0ZX0gICs9ICRUYXJnZXRTdGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17V29ya2luZ0hvdXJzfSArPSAkV29ya2luZ0hvdXJzOwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtMZWF2ZURheX0gICAgICs9ICRMZWF2ZURheTsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17RGlzZWFzZWR9ICAgICArPSAkRGlzZWFzZWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lfSA9ICREYXRheyRVc2VySUR9e1dvcmtpbmdIb3Vyc30gLSAkRGF0YXskVXNlcklEfXtUYXJnZXRTdGF0ZX07CiAgICAgICAgJERhdGF7JFVzZXJJRH17T3ZlcnRpbWVUb3RhbH0KICAgICAgICAgICAgPSAkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17T3ZlcnRpbWV9CiAgICAgICAgICAgICsgJERhdGF7JFVzZXJJRH17V29ya2luZ0hvdXJzVG90YWx9CiAgICAgICAgICAgIC0gJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGVUb3RhbH07CiAgICAgICAgJERhdGF7JFVzZXJJRH17T3ZlcnRpbWVVbnRpbH0gPSAkRGF0YXskVXNlcklEfXtPdmVydGltZVRvdGFsfSAtICREYXRheyRVc2VySUR9e092ZXJ0aW1lfTsKICAgICAgICAkRGF0YXskVXNlcklEfXtMZWF2ZURheVJlbWFpbmluZ30KICAgICAgICAgICAgPSAkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17TGVhdmVEYXlzfSAtICREYXRheyRVc2VySUR9e0xlYXZlRGF5VG90YWx9OwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBQcm9qZWN0U2V0dGluZ3NHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgcHJvamVjdCBkYXRhCgogICAgbXkgJVByb2plY3REYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Qcm9qZWN0U2V0dGluZ3NHZXQoKTsKCj1jdXQKCnN1YiBQcm9qZWN0U2V0dGluZ3NHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAlRGF0YSA9ICgpOwoKICAgICMgZGIgc2VsZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgcHJvamVjdCwgZGVzY3JpcHRpb24sIHN0YXR1cyBGUk9NIHRpbWVfYWNjb3VudGluZ19wcm9qZWN0JywKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRhe1Byb2plY3R9eyAkUm93WzBdIH0gICAgICAgICAgICA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7UHJvamVjdERlc2NyaXB0aW9ufXsgJFJvd1swXSB9ID0gJFJvd1syXTsKICAgICAgICAkRGF0YXtQcm9qZWN0U3RhdHVzfXsgJFJvd1swXSB9ICAgICAgPSAkUm93WzNdOwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBQcm9qZWN0U2V0dGluZ3NJbnNlcnQoKQoKaW5zZXJ0IG5ldyBwcm9qZWN0IGRhdGEgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Qcm9qZWN0U2V0dGluZ3NJbnNlcnQoCiAgICAgICAgUHJvamVjdCAgICAgICA9PiAnaW50ZXJuYWwnLCAjIG9wdGlvbmFsCiAgICAgICAgUHJvamVjdFN0YXR1cyA9PiAxIHx8IDAsICAgICAjIG9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIFByb2plY3RTZXR0aW5nc0luc2VydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtQcm9qZWN0fSApIHsKICAgICAgICAkUGFyYW17UHJvamVjdH0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRQcm9qZWN0TmFtZScpIHx8ICcnOwogICAgfQogICAgaWYgKCAhJFBhcmFte1Byb2plY3RTdGF0dXN9ICkgewogICAgICAgICRQYXJhbXtQcm9qZWN0U3RhdHVzfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFByb2plY3RTdGF0dXMnKQogICAgICAgICAgICB8fCAnMCc7CiAgICB9CgogICAgaWYgKCAhJFBhcmFte1Byb2plY3REZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgJFBhcmFte1Byb2plY3REZXNjcmlwdGlvbn0gPSAnJzsKICAgIH0KCiAgICAjIGRiIHF1b3RlCiAgICBmb3IgKCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICkgfHwgJyc7CiAgICB9CgogICAgIyBidWlsZCBzcWwKCiAgICBteSAkU1FMCiAgICAgICAgPSAiSU5TRVJUIElOVE8gdGltZV9hY2NvdW50aW5nX3Byb2plY3QgKHByb2plY3QsIGRlc2NyaXB0aW9uLCBzdGF0dXMpICIKICAgICAgICAuICJWQUxVRVMgIiAuICIoJyIKICAgICAgICAuICRQYXJhbXtQcm9qZWN0fSAuICInLCAnIgogICAgICAgIC4gJFBhcmFte1Byb2plY3REZXNjcmlwdGlvbn0gLiAiJywgJyIKICAgICAgICAuICRQYXJhbXtQcm9qZWN0U3RhdHVzfSAuICInKSI7CgogICAgIyBkYiBpbnNlcnQKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCApOwogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFByb2plY3RTZXR0aW5nc1VwZGF0ZSgpCgp1cGRhdGUgcHJvamVjdCBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdFNldHRpbmdzVXBkYXRlKAogICAgICAgIDEgICAgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICMgZXF1YWwgUHJvamVjdElECiAgICAgICAgICAgIFByb2plY3QgICAgICAgPT4gJ2ludGVybmFsJywKICAgICAgICAgICAgUHJvamVjdFN0YXR1cyA9PiAxIHx8IDAsCiAgICAgICAgfSwKICAgICAgICAyICAgID0+IHsgICAgICAgICAgICAgICAgICAgICAgICAjIGVxdWFsIFByb2plY3RJRAogICAgICAgICAgICBQcm9qZWN0ICAgICAgID0+ICdwcm9qZWN0bmFtZScsCiAgICAgICAgICAgIFByb2plY3RTdGF0dXMgPT4gMSB8fCAwLAogICAgICAgIH0sCiAgICAgICAgMyAgICA9PiAuLi4uLi4KICAgICk7Cgo9Y3V0CgpzdWIgUHJvamVjdFNldHRpbmdzVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBmb3IgbXkgJFByb2plY3RJRCAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17JFByb2plY3RJRH17UHJvamVjdH0gKSB7CgogICAgICAgICAgICAjIGRiIHF1b3RlCiAgICAgICAgICAgIGZvciAoIGtleXMgJXsgJFBhcmFteyRQcm9qZWN0SUR9IH0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17JFByb2plY3RJRH17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JFByb2plY3RJRH17JF99ICkgfHwgJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYnVpbGQgc3FsCiAgICAgICAgICAgIG15ICRTUUwKICAgICAgICAgICAgICAgID0gIlVQREFURSB0aW1lX2FjY291bnRpbmdfcHJvamVjdCAiCiAgICAgICAgICAgICAgICAuICJTRVQgcHJvamVjdCA9ICciCiAgICAgICAgICAgICAgICAuICRQYXJhbXskUHJvamVjdElEfXtQcm9qZWN0fQogICAgICAgICAgICAgICAgLiAiJywgc3RhdHVzID0gJyIKICAgICAgICAgICAgICAgIC4gJFBhcmFteyRQcm9qZWN0SUR9e1Byb2plY3RTdGF0dXN9CiAgICAgICAgICAgICAgICAuICInLCBkZXNjcmlwdGlvbiA9ICciCiAgICAgICAgICAgICAgICAuICRQYXJhbXskUHJvamVjdElEfXtQcm9qZWN0RGVzY3JpcHRpb259IC4gIicgIgogICAgICAgICAgICAgICAgLiAiV0hFUkUgaWQgPSAnIgogICAgICAgICAgICAgICAgLiAkUHJvamVjdElEIC4gIiciOwoKICAgICAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFjdGlvblNldHRpbmdzR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIGFjdGlvbiBzZXR0aW5ncwoKICAgIG15ICVBY3Rpb25EYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5BY3Rpb25TZXR0aW5nc0dldCgpOwoKPWN1dAoKc3ViIEFjdGlvblNldHRpbmdzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJURhdGEgPSAoKTsKCiAgICAjIGRiIHNlbGVjdAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIGlkLCBhY3Rpb24sIHN0YXR1cyBGUk9NIHRpbWVfYWNjb3VudGluZ19hY3Rpb24iLCApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e0FjdGlvbn0gICAgICAgPSAkUm93WzFdOwogICAgICAgICREYXRheyAkUm93WzBdIH17QWN0aW9uU3RhdHVzfSA9ICRSb3dbMl07CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIEFjdGlvblNldHRpbmdzSW5zZXJ0KCkKCmluc2VydCBuZXcgYWN0aW9uIGRhdGEgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5BY3Rpb25TZXR0aW5nc0luc2VydCgKICAgICAgICBBY3Rpb24gICAgICAgPT4gJ21lZXRpbmcnLCAgICMgb3B0aW9uYWwKICAgICAgICBBY3Rpb25TdGF0dXMgPT4gMSB8fCAwLCAgICAgICMgb3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aW9uU2V0dGluZ3NJbnNlcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRiIHF1b3RlCiAgICBmb3IgKCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICkgfHwgJyc7CiAgICB9CgogICAgaWYgKCAhJFBhcmFte0FjdGlvbn0gKSB7CiAgICAgICAgJFBhcmFte0FjdGlvbn0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRBY3Rpb25OYW1lJykgfHwgJyc7CiAgICB9CiAgICBpZiAoICEkUGFyYW17QWN0aW9uU3RhdHVzfSApIHsKICAgICAgICAkUGFyYW17QWN0aW9uU3RhdHVzfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdEFjdGlvblN0YXR1cycpCiAgICAgICAgICAgIHx8ICcwJzsKICAgIH0KCiAgICAjIGJ1aWxkIHNxbAogICAgbXkgJFNRTAogICAgICAgID0gIklOU0VSVCBJTlRPIHRpbWVfYWNjb3VudGluZ19hY3Rpb24gKGFjdGlvbiwgc3RhdHVzKSIKICAgICAgICAuICIgVkFMVUVTIiAuICIgKCciCiAgICAgICAgLiAkUGFyYW17QWN0aW9ufSAuICInICwgJyIKICAgICAgICAuICRQYXJhbXtBY3Rpb25TdGF0dXN9IC4gIicpIjsKCiAgICAjIGRiIGluc2VydAogICAgcmV0dXJuICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMICk7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aW9uU2V0dGluZ3NVcGRhdGUoKQoKdXBkYXRlIGFjdGlvbiBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+QWN0aW9uU2V0dGluZ3NVcGRhdGUoCiAgICAgICAgMSAgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICMgZXF1YWwgQWN0aW9uSUQKICAgICAgICAgICAgQWN0aW9uICAgICAgID0+ICdtZWV0aW5nJywKICAgICAgICAgICAgQWN0aW9uU3RhdHVzID0+IDEgfHwgMCwKICAgICAgICB9LAogICAgICAgIDIgICAgPT4geyAgICAgICAgICAgICAgICAgICAgICAjIGVxdWFsIEFjdGlvbklECiAgICAgICAgICAgIEFjdGlvbiAgICAgICA9PiAnam91cm5leScsCiAgICAgICAgICAgIEFjdGlvblN0YXR1cyA9PiAxIHx8IDAsCiAgICAgICAgfSwKICAgICAgICAzICAgID0+IC4uLi4uLgogICAgKTsKCj1jdXQKCnN1YiBBY3Rpb25TZXR0aW5nc1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQWN0aW9uSUQgKCBzb3J0IGtleXMgJVBhcmFtICkgewogICAgICAgIGlmICggJFBhcmFteyRBY3Rpb25JRH17QWN0aW9ufSApIHsKCiAgICAgICAgICAgICMgZGIgcXVvdGUKICAgICAgICAgICAgZm9yICgga2V5cyAleyAkUGFyYW17JEFjdGlvbklEfSB9ICkgewogICAgICAgICAgICAgICAgJFBhcmFteyRBY3Rpb25JRH17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JEFjdGlvbklEfXskX30gKSB8fCAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBidWlsZCBzcWwKICAgICAgICAgICAgbXkgJFNRTAogICAgICAgICAgICAgICAgPSAiVVBEQVRFIHRpbWVfYWNjb3VudGluZ19hY3Rpb24gIgogICAgICAgICAgICAgICAgLiAiU0VUIGFjdGlvbiA9ICciCiAgICAgICAgICAgICAgICAuICRQYXJhbXskQWN0aW9uSUR9e0FjdGlvbn0KICAgICAgICAgICAgICAgIC4gIicsIHN0YXR1cyA9ICciCiAgICAgICAgICAgICAgICAuICRQYXJhbXskQWN0aW9uSUR9e0FjdGlvblN0YXR1c30gLiAiJyAiCiAgICAgICAgICAgICAgICAuICJXSEVSRSBpZCA9ICciCiAgICAgICAgICAgICAgICAuICRBY3Rpb25JRCAuICInIjsKCiAgICAgICAgICAgICMgZGIgaW5zZXJ0CiAgICAgICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBVc2VyR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHVzZXIgZGF0YQoKICAgIG15ICVVc2VyRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+VXNlckdldCgpOwoKPWN1dAoKc3ViIFVzZXJHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAlRGF0YSA9ICgpOwoKICAgICMgZGIgc2VsZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+CiAgICAgICAgICAgICJTRUxFQ1QgdXNlcl9pZCwgZGVzY3JpcHRpb24sIHNob3dfb3ZlcnRpbWUsIGNyZWF0ZV9wcm9qZWN0IEZST00gdGltZV9hY2NvdW50aW5nX3VzZXIiLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtVc2VySUR9ICAgICAgICA9ICRSb3dbMF07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtEZXNjcmlwdGlvbn0gICA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtTaG93T3ZlcnRpbWV9ICA9ICRSb3dbMl07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtDcmVhdGVQcm9qZWN0fSA9ICRSb3dbM107CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFVzZXJTZXR0aW5nc0dldCgpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSB1c2VyIHBlcmlvZCBkYXRhCgogICAgbXkgJVVzZXJEYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyU2V0dGluZ3NHZXQoKTsKCj1jdXQKCnN1YiBVc2VyU2V0dGluZ3NHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAlRGF0YSA9ICgpOwoKICAgICMgZGIgc2VsZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+CiAgICAgICAgICAgICJTRUxFQ1QgdXNlcl9pZCwgcHJlZmVyZW5jZV9wZXJpb2QsIGRhdGVfc3RhcnQsIGRhdGVfZW5kLCB3ZWVrbHlfaG91cnMsIGxlYXZlX2RheXMsIG92ZXJ0aW1lLCBzdGF0dXMgRlJPTSB0aW1lX2FjY291bnRpbmdfdXNlcl9wZXJpb2QiLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXsgJFJvd1sxXSB9e1VzZXJJRH0gICAgICA9ICRSb3dbMF07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXsgJFJvd1sxXSB9e1BlcmlvZH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXsgJFJvd1sxXSB9e0RhdGVTdGFydH0gICA9IHN1YnN0ciggJFJvd1syXSwgMCwgMTAgKTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9eyAkUm93WzFdIH17RGF0ZUVuZH0gICAgID0gc3Vic3RyKCAkUm93WzNdLCAwLCAxMCApOwogICAgICAgICREYXRheyAkUm93WzBdIH17ICRSb3dbMV0gfXtXZWVrbHlIb3Vyc30gPSAkUm93WzRdOwogICAgICAgICREYXRheyAkUm93WzBdIH17ICRSb3dbMV0gfXtMZWF2ZURheXN9ICAgPSAkUm93WzVdOwogICAgICAgICREYXRheyAkUm93WzBdIH17ICRSb3dbMV0gfXtPdmVydGltZX0gICAgPSAkUm93WzZdOwogICAgICAgICREYXRheyAkUm93WzBdIH17ICRSb3dbMV0gfXtVc2VyU3RhdHVzfSAgPSAkUm93WzddOwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBVc2VyU2V0dGluZ3NJbnNlcnQoKQoKaW5zZXJ0IG5ldyB1c2VyIGRhdGEgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyU2V0dGluZ3NJbnNlcnQoCiAgICAgICAgVXNlcklEICAgICAgID0+ICcyJywKICAgICAgICBQZXJpb2QgICAgICAgPT4gJzInLAogICAgKTsKCj1jdXQKCnN1YiBVc2VyU2V0dGluZ3NJbnNlcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkSUQgID0gJyc7CiAgICBteSAkU1FMID0gJyc7CgogICAgJFBhcmFte1dlZWtseUhvdXJzfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJXZWVrbHlIb3VycycpCiAgICAgICAgfHwgJzQwJzsKICAgICRQYXJhbXtMZWF2ZURheXN9ICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJMZWF2ZURheXMnKSB8fCAnMjUnOwogICAgJFBhcmFte1VzZXJTdGF0dXN9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlclN0YXR1cycpICAgIHx8ICcxJzsKICAgICRQYXJhbXtPdmVydGltZX0gICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJPdmVydGltZScpICB8fCAnMCc7CiAgICAkUGFyYW17RGF0ZUVuZH0gICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyRGF0ZUVuZCcpCiAgICAgICAgfHwgJzIwMDctMTItMzEnOwogICAgJFBhcmFte0RhdGVTdGFydH0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyRGF0ZVN0YXJ0JykKICAgICAgICB8fCAnMjAwNy0wMS0wMSc7CiAgICAkUGFyYW17RGVzY3JpcHRpb259ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlckRlc2NyaXB0aW9uJykKICAgICAgICB8fCAnJzsKCiAgICAjIGRiIHF1b3RlCiAgICBmb3IgKCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICk7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRffSApICkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJyc7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgc3FsCiAgICAkU1FMCiAgICAgICAgPSAiSU5TRVJUIElOVE8gdGltZV9hY2NvdW50aW5nX3VzZXJfcGVyaW9kICh1c2VyX2lkLCBwcmVmZXJlbmNlX3BlcmlvZCwgZGF0ZV9zdGFydCwgZGF0ZV9lbmQsIgogICAgICAgIC4gIiB3ZWVrbHlfaG91cnMsIGxlYXZlX2RheXMsIG92ZXJ0aW1lLCBzdGF0dXMpIgogICAgICAgIC4gIiBWQUxVRVMiCiAgICAgICAgLiAiICgnJFBhcmFte1VzZXJJRH0nLCAnJFBhcmFte1BlcmlvZH0nLCAnJFBhcmFte0RhdGVTdGFydH0gMDA6MDA6MDAnLCAnJFBhcmFte0RhdGVFbmR9IDAwOjAwOjAwJywiCiAgICAgICAgLiAiICckUGFyYW17V2Vla2x5SG91cnN9JywgJyRQYXJhbXtMZWF2ZURheXN9JywgJyRQYXJhbXtPdmVydGltZX0nLCAnJFBhcmFte1VzZXJTdGF0dXN9JykiOwoKICAgICMgZGIgaW5zZXJ0CiAgICBpZiAoICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMICkgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgU3BsaXQgdGhlIGZvbGxvd2luZyBjb2RlIGluIGEgc2VwZXJhdGUgZnVuY3Rpb24hCgogICAgI2NoZWNrIGlmIHRoZSB1c2VyIHN0aWxsIGV4aXN0cwogICAgbXkgJFVzZXJJRDsKCiAgICAjIGJ1aWxkIHNxbAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgdXNlcl9pZCBGUk9NIHRpbWVfYWNjb3VudGluZ191c2VyIFdIRVJFIHVzZXJfaWQgPSAnIiAuICRQYXJhbXtVc2VySUR9IC4gIiciLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFVzZXJJRCA9ICRSb3dbMF07CiAgICB9CiAgICBpZiAoICFkZWZpbmVkKCRVc2VySUQpICkgewogICAgICAgICRTUUwKICAgICAgICAgICAgPSAiSU5TRVJUIElOVE8gdGltZV9hY2NvdW50aW5nX3VzZXIgKHVzZXJfaWQsIGRlc2NyaXB0aW9uKSIKICAgICAgICAgICAgLiAiIFZBTFVFUyIKICAgICAgICAgICAgLiAiICgnJFBhcmFte1VzZXJJRH0nLCAnJFBhcmFte0Rlc2NyaXB0aW9ufScpIjsKCiAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwgKTsKICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBVc2VyU2V0dGluZ3NVcGRhdGUoKQoKdXBkYXRlIHVzZXIgZGF0YSBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJTZXR0aW5nc1VwZGF0ZSgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU29tZSBUZXh0JywKICAgICAgICBDcmVhdGVQcm9qZWN0ID0+IDEgfHwgMCwKICAgICAgICBTaG93T3ZlcnRpbWUgID0+IDEgfHwgMCwKICAgICAgICAxICAgID0+IHsKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdTb21lIFRleHQnLAogICAgICAgICAgICBDcmVhdGVQcm9qZWN0ID0+IDEgfHwgMCwKICAgICAgICAgICAgU2hvd092ZXJ0aW1lICA9PiAxIHx8IDAsCiAgICAgICAgICAgIDEgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQZXJpb2QgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgRGF0ZVN0YXJ0ICAgID0+ICcyMDA1LTEyLTEyJywKICAgICAgICAgICAgICAgIERhdGVFbmQgICAgICA9PiAnMjAwNS0xMi0zMScsCiAgICAgICAgICAgICAgICBXZWVrbHlIb3VycyAgPT4gJzM4JywKICAgICAgICAgICAgICAgIExlYXZlRGF5cyAgICA9PiAnMjUnLAogICAgICAgICAgICAgICAgT3ZlcnRpbWUgICAgID0+ICczOCcsCiAgICAgICAgICAgICAgICBVc2VyU3RhdHVzICAgPT4gMSB8fCAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgMiAgICA9PiB7CiAgICAgICAgICAgIDEgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDIsCiAgICAgICAgICAgICAgICBQZXJpb2QgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgRGF0ZVN0YXJ0ICAgID0+ICcyMDA1LTEyLTEyJywKICAgICAgICAgICAgICAgIERhdGVFbmQgICAgICA9PiAnMjAwNS0xMi0zMScsCiAgICAgICAgICAgICAgICBXZWVrbHlIb3VycyAgPT4gJzM4JywKICAgICAgICAgICAgICAgIExlYXZlRGF5cyAgICA9PiAnMjUnLAogICAgICAgICAgICAgICAgT3ZlcnRpbWUgICAgID0+ICczOCcsCiAgICAgICAgICAgICAgICBVc2VyU3RhdHVzICAgPT4gMSB8fCAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgMyAgICA9PiAuLi4uLi4KICAgICk7Cgo9Y3V0CgpzdWIgVXNlclNldHRpbmdzVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgZm9yIChxdyhVc2VySUQgRGVzY3JpcHRpb24pKSB7CiAgICAgICAgICAgICRQYXJhbXskVXNlcklEfXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskVXNlcklEfXskX30gKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICNzZXQgZGVmYXVsdCBmb3IgU2hvd092ZXJUaW1lLi4uCiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRVc2VySUR9e1Nob3dPdmVydGltZX0gKSApIHsKICAgICAgICAgICAgJFBhcmFteyRVc2VySUR9e1Nob3dPdmVydGltZX0gPSAwOwogICAgICAgIH0KCiAgICAgICAgI3NldCBkZWZhdWx0IGZvciBDcmVhdGVQcm9qZWN0Li4uCiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRVc2VySUR9e0NyZWF0ZVByb2plY3R9ICkgKSB7CiAgICAgICAgICAgICRQYXJhbXskVXNlcklEfXtDcmVhdGVQcm9qZWN0fSA9IDA7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHNxbAogICAgICAgIG15ICRTUUwKICAgICAgICAgICAgPSAiVVBEQVRFIHRpbWVfYWNjb3VudGluZ191c2VyICIKICAgICAgICAgICAgLiAiU0VUIGRlc2NyaXB0aW9uID0gJyIKICAgICAgICAgICAgLiAkUGFyYW17JFVzZXJJRH17RGVzY3JpcHRpb259CiAgICAgICAgICAgIC4gIicsIHNob3dfb3ZlcnRpbWUgPSAnIgogICAgICAgICAgICAuICRQYXJhbXskVXNlcklEfXtTaG93T3ZlcnRpbWV9CiAgICAgICAgICAgIC4gIicsIGNyZWF0ZV9wcm9qZWN0ID0gJyIKICAgICAgICAgICAgLiAkUGFyYW17JFVzZXJJRH17Q3JlYXRlUHJvamVjdH0gLiAiJyAiCiAgICAgICAgICAgIC4gIldIRVJFIHVzZXJfaWQgPSAnIgogICAgICAgICAgICAuICRQYXJhbXskVXNlcklEfXtVc2VySUR9IC4gIiciOwoKICAgICAgICAjIGRiIGluc2VydAogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCApOwoKICAgICAgICBmb3IgKHF3KFVzZXJJRCBEZXNjcmlwdGlvbiBTaG93T3ZlcnRpbWUgQ3JlYXRlUHJvamVjdCkpIHsKICAgICAgICAgICAgZGVsZXRlICRQYXJhbXskVXNlcklEfXskX307CiAgICAgICAgfQogICAgICAgIGZvciBteSAkUGVyaW9kICgga2V5cyAleyAkUGFyYW17JFVzZXJJRH0gfSApIHsKCiAgICAgICAgICAgICMgZGIgcXVvdGUKICAgICAgICAgICAgZm9yICgga2V5cyAleyAkUGFyYW17JFVzZXJJRH17JFBlcmlvZH0gfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXskVXNlcklEfXskUGVyaW9kfXskX30KICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRVc2VySUR9eyRQZXJpb2R9eyRffSApIHx8ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGJ1aWxkIHNxbAogICAgICAgICAgICBteSAkU1FMCiAgICAgICAgICAgICAgICA9ICJVUERBVEUgdGltZV9hY2NvdW50aW5nX3VzZXJfcGVyaW9kICIKICAgICAgICAgICAgICAgIC4gIlNFVCBsZWF2ZV9kYXlzID0gJyIKICAgICAgICAgICAgICAgIC4gJFBhcmFteyRVc2VySUR9eyRQZXJpb2R9e0xlYXZlRGF5c30KICAgICAgICAgICAgICAgIC4gIicsIGRhdGVfc3RhcnQgPSAnIgogICAgICAgICAgICAgICAgLiAkUGFyYW17JFVzZXJJRH17JFBlcmlvZH17RGF0ZVN0YXJ0fQogICAgICAgICAgICAgICAgLiAiJywgZGF0ZV9lbmQgPSAnIgogICAgICAgICAgICAgICAgLiAkUGFyYW17JFVzZXJJRH17JFBlcmlvZH17RGF0ZUVuZH0KICAgICAgICAgICAgICAgIC4gIicsIG92ZXJ0aW1lID0gJyIKICAgICAgICAgICAgICAgIC4gJFBhcmFteyRVc2VySUR9eyRQZXJpb2R9e092ZXJ0aW1lfQogICAgICAgICAgICAgICAgLiAiJywgd2Vla2x5X2hvdXJzID0gJyIKICAgICAgICAgICAgICAgIC4gJFBhcmFteyRVc2VySUR9eyRQZXJpb2R9e1dlZWtseUhvdXJzfQogICAgICAgICAgICAgICAgLiAiJywgc3RhdHVzID0gJyIKICAgICAgICAgICAgICAgIC4gJFBhcmFteyRVc2VySUR9eyRQZXJpb2R9e1VzZXJTdGF0dXN9IC4gIicgIgogICAgICAgICAgICAgICAgLiAiV0hFUkUgdXNlcl9pZCA9ICciCiAgICAgICAgICAgICAgICAuICRQYXJhbXskVXNlcklEfXskUGVyaW9kfXtVc2VySUR9CiAgICAgICAgICAgICAgICAuICInIEFORCBwcmVmZXJlbmNlX3BlcmlvZCA9ICciCiAgICAgICAgICAgICAgICAuICRQZXJpb2QgLiAiJyI7CgogICAgICAgICAgICAjIGRiIGluc2VydAogICAgICAgICAgICBpZiAoICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gV29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjaygpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSBpbmNvbXBsZXRlIHdvcmtpbmcgZGF5cyBhbmQKdGhlIGluZm9ybWF0aW9uIGlmIHRoZSBpbmNvbXBsZXRlIHdvcmtpbmcgZGF5IGFyZSBpbiB0aGUgYWxsb3dlZApyYW5nZS4KCiAgICBteSAlV29ya2luZ1VuaXRzQ2hlY2sgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPldvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2soCiAgICAgICAgVXNlcklEID0+ICcyJywgICAgIyBPcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBXb3JraW5nVW5pdHNDb21wbGV0bmVzc0NoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJURhdGEgICAgICAgICAgICAgICAgPSAoKTsKICAgIG15ICRXb3JraW5nVW5pdElEICAgICAgID0gMDsKICAgIG15ICVDb21wbGV0ZVdvcmtpbmdEYXlzID0gKCk7CiAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSggU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksICk7CgogICAgJFBhcmFte1VzZXJJRH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtVc2VySUR9ICkgfHwgJyc7CgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFBhcmFte1VzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CiAgICB9CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PgogICAgICAgICAgICAiU0VMRUNUIERJU1RJTkNUIHRpbWVfc3RhcnQgRlJPTSB0aW1lX2FjY291bnRpbmdfdGFibGUgV0hFUkUgdXNlcl9pZCA9ICckUGFyYW17VXNlcklEfSciLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUm93WzBdID1+IC9eKFxkKyktKFxkKyktKFxkKykoLis/KS8gKSB7CiAgICAgICAgICAgICRDb21wbGV0ZVdvcmtpbmdEYXlzeyQxfXskMn17JDN9ID0gMTsKICAgICAgICB9CiAgICB9CiAgICBteSAlVXNlckN1cnJlbnRQZXJpb2QgPSAkU2VsZi0+VXNlckN1cnJlbnRQZXJpb2RHZXQoCiAgICAgICAgWWVhciAgPT4gJFllYXIsCiAgICAgICAgTW9udGggPT4gJE1vbnRoLAogICAgICAgIERheSAgID0+ICREYXksCiAgICApOwogICAgbXkgJFdvcmtpbmdEYXlzICAgICA9IDA7CiAgICBteSAkWWVhclN0YXJ0ICAgICAgID0gMDsKICAgIG15ICRNb250aFN0YXJ0ICAgICAgPSAwOwogICAgbXkgJERheVN0YXJ0ICAgICAgICA9IDA7CiAgICBteSAkTW9udGhTdGFydFBvaW50ID0gMDsKICAgIG15ICREYXlTdGFydFBvaW50ICAgPSAwOwogICAgbXkgJE1vbnRoRW5kUG9pbnQgICA9IDA7CiAgICBteSAkRGF5RW5kUG9pbnQgICAgID0gMDsKICAgIG15ICRZZWFyRW5kICAgICAgICAgPSAkWWVhcjsKICAgIG15ICRNb250aEVuZCAgICAgICAgPSAkTW9udGg7CiAgICBteSAkRGF5RW5kICAgICAgICAgID0gJERheTsKCiAgICBpZiAoICRVc2VyQ3VycmVudFBlcmlvZHsgJFBhcmFte1VzZXJJRH0gfXtEYXRlU3RhcnR9ID1+IC9eKFxkKyktKFxkKyktKFxkKykvICkgewogICAgICAgICRZZWFyU3RhcnQgID0gJDE7CiAgICAgICAgJE1vbnRoU3RhcnQgPSAkMjsKICAgICAgICAkRGF5U3RhcnQgICA9ICQzOwogICAgfQoKICAgIGZvciAoIG15ICRZZWFyID0gJFllYXJTdGFydDsgJFllYXIgPD0gJFllYXJFbmQ7ICRZZWFyKysgKSB7CiAgICAgICAgaWYgKCAkWWVhciA9PSAkWWVhclN0YXJ0ICkgewogICAgICAgICAgICAkTW9udGhTdGFydFBvaW50ID0gJE1vbnRoU3RhcnQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTW9udGhTdGFydFBvaW50ID0gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkWWVhciA9PSAkWWVhckVuZCApIHsKICAgICAgICAgICAgJE1vbnRoRW5kUG9pbnQgPSAkTW9udGhFbmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTW9udGhFbmRQb2ludCA9IDEyOwogICAgICAgIH0KICAgICAgICBmb3IgKCBteSAkTW9udGggPSAkTW9udGhTdGFydFBvaW50OyAkTW9udGggPD0gJE1vbnRoRW5kUG9pbnQ7ICRNb250aCsrICkgewogICAgICAgICAgICBpZiAoICRZZWFyID09ICRZZWFyU3RhcnQgJiYgJE1vbnRoID09ICRNb250aFN0YXJ0ICkgewogICAgICAgICAgICAgICAgJERheVN0YXJ0UG9pbnQgPSAkRGF5U3RhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGF5U3RhcnRQb2ludCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkWWVhciA9PSAkWWVhckVuZCAmJiAkTW9udGggPT0gJE1vbnRoRW5kICkgewogICAgICAgICAgICAgICAgJERheUVuZFBvaW50ID0gJERheUVuZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREYXlFbmRQb2ludCA9IERheXNfaW5fTW9udGgoICRZZWFyLCAkTW9udGggKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkTW9udGhTdHJpbmcgPSBzcHJpbnRmKCAiJTAyZCIsICRNb250aCApOwogICAgICAgICAgICBmb3IgKCBteSAkRGF5ID0gJERheVN0YXJ0UG9pbnQ7ICREYXkgPD0gJERheUVuZFBvaW50OyAkRGF5KysgKSB7CiAgICAgICAgICAgICAgICBteSAkVmFjYXRpb25DaGVjayA9ICRTZWxmLT5WYWNhdGlvbkNoZWNrKAogICAgICAgICAgICAgICAgICAgIFllYXIgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoID0+ICRNb250aCwKICAgICAgICAgICAgICAgICAgICBEYXkgICA9PiAkRGF5LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkRGF5U3RyaW5nID0gc3ByaW50ZiggIiUwMmQiLCAkRGF5ICk7CiAgICAgICAgICAgICAgICBteSAkV2Vla2RheSA9IERheV9vZl9XZWVrKCAkWWVhciwgJE1vbnRoLCAkRGF5ICk7CiAgICAgICAgICAgICAgICBpZiAoICRXZWVrZGF5ICE9IDYgJiYgJFdlZWtkYXkgIT0gNyAmJiAhJFZhY2F0aW9uQ2hlY2sgKSB7CiAgICAgICAgICAgICAgICAgICAgJFdvcmtpbmdEYXlzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICAgJFdlZWtkYXkgIT0gNgogICAgICAgICAgICAgICAgICAgICYmICRXZWVrZGF5ICE9IDcKICAgICAgICAgICAgICAgICAgICAmJiAhJFZhY2F0aW9uQ2hlY2sKICAgICAgICAgICAgICAgICAgICAmJiAhJENvbXBsZXRlV29ya2luZ0RheXN7JFllYXJ9eyRNb250aFN0cmluZ317JERheVN0cmluZ30gKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICREYXRhe0luY29tcGxldGV9eyRZZWFyfXskTW9udGhTdHJpbmd9eyREYXlTdHJpbmd9ID0gJFdvcmtpbmdEYXlzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgbXkgJE1heEludGVydmFsbE9mSW5jb21wbGV0ZURheXMKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6TWF4SW50ZXJ2YWxPZkluY29tcGxldGVEYXlzJykgfHwgJzUnOwogICAgbXkgJE1heEludGVydmFsbE9mSW5jb21wbGV0ZURheXNCZWZvcmVXYXJuaW5nCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6Ok1heEludGVydmFsT2ZJbmNvbXBsZXRlRGF5c0JlZm9yZVdhcm5pbmcnKQogICAgICAgIHx8ICczJzsKICAgIGZvciBteSAkWWVhciAoIGtleXMgJXsgJERhdGF7SW5jb21wbGV0ZX0gfSApIHsKICAgICAgICBmb3IgbXkgJE1vbnRoICgga2V5cyAleyAkRGF0YXtJbmNvbXBsZXRlfXskWWVhcn0gfSApIHsKICAgICAgICAgICAgZm9yIG15ICREYXkgKCBrZXlzICV7ICREYXRhe0luY29tcGxldGV9eyRZZWFyfXskTW9udGh9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICREYXRhe0luY29tcGxldGV9eyRZZWFyfXskTW9udGh9eyREYXl9CiAgICAgICAgICAgICAgICAgICAgPCAkV29ya2luZ0RheXMgLSAkTWF4SW50ZXJ2YWxsT2ZJbmNvbXBsZXRlRGF5cyApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7RW5mb3JjZUluc2VydH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkRGF0YXtJbmNvbXBsZXRlfXskWWVhcn17JE1vbnRofXskRGF5fQogICAgICAgICAgICAgICAgICAgIDwgJFdvcmtpbmdEYXlzIC0gJE1heEludGVydmFsbE9mSW5jb21wbGV0ZURheXNCZWZvcmVXYXJuaW5nICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtXYXJuaW5nfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFdvcmtpbmdVbml0c0dldCgpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSB3b3JraW5nIHVuaXRzIGRhdGEKCiAgICBteSAlV29ya2luZ1VuaXRzRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+V29ya2luZ1VuaXRzR2V0KAogICAgICAgIFllYXIgICA9PiAnMjAwNScsCiAgICAgICAgTW9udGggID0+ICc3JywKICAgICAgICBEYXkgICAgPT4gJzEzJywKICAgICAgICBVc2VySUQgPT4gJzInLCAgICAjIE9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIFdvcmtpbmdVbml0c0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhICAgICAgICAgID0gKCk7CiAgICBteSAkV29ya2luZ1VuaXRJRCA9IDA7CiAgICBmb3IgKCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICkgfHwgJyc7CiAgICB9CiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRTZWxmLT57VXNlcklEfTsKICAgIH0KCiAgICBteSAkRGF0ZSA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCIsICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0gKTsKICAgICRTZWxmLT57REJPYmplY3R9CiAgICAgICAgLT5QcmVwYXJlKCBTUUwgPT4gIlNFTEVDVCB1c2VyX2lkLCBwcm9qZWN0X2lkLCBhY3Rpb25faWQsIHJlbWFyaywgdGltZV9zdGFydCwgdGltZV9lbmQsIgogICAgICAgICAgICAuICIgcGVyaW9kIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIFdIRVJFIHRpbWVfc3RhcnQgTElLRSAnJERhdGUlJyIKICAgICAgICAgICAgLiAiIEFORCB1c2VyX2lkID0gJyRQYXJhbXtVc2VySUR9JyBPUkRFUiBieSBpZCIsICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1s0XSA9fiAvXiguKz8pXHMoXGQrOlxkKyk6KFxkKykvICkgewogICAgICAgICAgICAkV29ya2luZ1VuaXRJRCsrOwogICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17VXNlcklEfSAgICA9ICRSb3dbMF07CiAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9ID0gJFJvd1sxXTsKICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfSAgPSAkUm93WzJdOwogICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UmVtYXJrfSAgICA9ICRSb3dbM107CiAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtTdGFydFRpbWV9ID0gJDI7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJFJvd1s2XSApICkgewogICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gPSBzcHJpbnRmKCAiJS4yZiIsICRSb3dbNl0gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ID0gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e0RhdGV9ID0gJDE7CiAgICAgICAgICAgIGlmICggJFJvd1s1XSA9fiAvXiguKz8pXHMoXGQrOlxkKyk6KFxkKykvICkgewogICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e0VuZFRpbWV9ID0gJDI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFdvcmtpbmdVbml0c0luc2VydCgpCgppbnNlcnQgd29ya2luZyB1bml0cyBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPldvcmtpbmdVbml0c0luc2VydCgKICAgICAgICBZZWFyICA9PiAnMjAwNScsCiAgICAgICAgTW9udGggPT4gJzA3JywKICAgICAgICBEYXkgICA9PiAnMDInLAogICAgICAgIDEgICAgPT4gewogICAgICAgICAgICBQcm9qZWN0SUQgPT4gMSwKICAgICAgICAgICAgQWN0aW9uSUQgID0+IDIzLAogICAgICAgICAgICBSZW1hcmsgICAgPT4gNCwKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICc3OjMwJywKICAgICAgICAgICAgRW5kVGltZSAgID0+ICcxMTowMCcsCiAgICAgICAgICAgIFBlcmlvZCAgICA9PiAnOC41JywKICAgICAgICB9LAogICAgICAgIDIgLi4uLi4uCiAgICApOwoKPWN1dAoKc3ViIFdvcmtpbmdVbml0c0luc2VydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTUUwgPSAnJzsKICAgIGZvciAocXcoWWVhciBNb250aCBEYXkpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApIHx8ICcnOwogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fQogICAgICAgICAgICAgICAgLT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIldvcmtpbmdVbml0c0luc2VydDogTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkRGF0ZSA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCIsICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0gKTsKCiAgICBpZiAoISRTZWxmLT5Xb3JraW5nVW5pdHNEZWxldGUoCiAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnQ2FuXCd0IGRlbGV0ZSBXb3JraW5nIFVuaXRzIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZGVsZXRlICRQYXJhbXtZZWFyfTsKICAgIGRlbGV0ZSAkUGFyYW17TW9udGh9OwogICAgZGVsZXRlICRQYXJhbXtEYXl9OwoKICAgICNpbnNlcnQgbmV3IHdvcmtpbmcgdW5pdHMKICAgIGZvciBteSAkV29ya2luZ1VuaXRJRCAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CgogICAgICAgICMgZGIgcXVvdGUKICAgICAgICBmb3IgKCBrZXlzICV7ICRQYXJhbXskV29ya2luZ1VuaXRJRH0gfSApIHsKICAgICAgICAgICAgJFBhcmFteyRXb3JraW5nVW5pdElEfXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskV29ya2luZ1VuaXRJRH17JF99ICkKICAgICAgICAgICAgICAgIHx8ICcnOwogICAgICAgIH0KICAgICAgICBteSAkU3RhcnRUaW1lID0gJERhdGUgLiAiICIgLiAkUGFyYW17JFdvcmtpbmdVbml0SUR9e1N0YXJ0VGltZX07CiAgICAgICAgbXkgJEVuZFRpbWUgICA9ICREYXRlIC4gIiAiIC4gJFBhcmFteyRXb3JraW5nVW5pdElEfXtFbmRUaW1lfTsKCiAgICAgICAgaWYgKCAgICggIWRlZmluZWQoICRQYXJhbXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSApICkKICAgICAgICAgICAgfHwgKCAkUGFyYW17JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gZXEgJycgKSApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gPSAnTlVMTCc7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHNxbAogICAgICAgICRTUUwKICAgICAgICAgICAgPSAiSU5TRVJUIElOVE8gdGltZV9hY2NvdW50aW5nX3RhYmxlICh1c2VyX2lkLCBwcm9qZWN0X2lkLCBhY3Rpb25faWQsIHJlbWFyaywiCiAgICAgICAgICAgIC4gIiB0aW1lX3N0YXJ0LCB0aW1lX2VuZCwgcGVyaW9kLCBjcmVhdGVkICkiCiAgICAgICAgICAgIC4gIiBWQUxVRVMiCiAgICAgICAgICAgIC4gIiAoJyRTZWxmLT57VXNlcklEfScsICckUGFyYW17JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0nLCAnJFBhcmFteyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0nLCIKICAgICAgICAgICAgLiAiICckUGFyYW17JFdvcmtpbmdVbml0SUR9e1JlbWFya30nLCAnJFN0YXJ0VGltZScsICckRW5kVGltZScsICRQYXJhbXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSwiCiAgICAgICAgICAgIC4gIiBjdXJyZW50X3RpbWVzdGFtcCkiOwoKICAgICAgICAjIGRiIGluc2VydAogICAgICAgIGlmICggISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwgKSApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBXb3JraW5nVW5pdHNEZWxldGUoKQoKZGVsZXRzIHdvcmtpbmcgdW5pdHMgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Xb3JraW5nVW5pdHNEZWxldGUoCiAgICAgICAgWWVhciAgPT4gJzIwMDUnLAogICAgICAgIE1vbnRoID0+ICc3JywKICAgICAgICBEYXkgICA9PiAnMTMnLAogICAgKTsKCj1jdXQKCnN1YiBXb3JraW5nVW5pdHNEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgKHF3KFllYXIgTW9udGggRGF5KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKSB8fCAnJzsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0KICAgICAgICAgICAgICAgIC0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJXb3JraW5nVW5pdHNJbnNlcnQ6IE5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJERhdGUgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQiLCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9ICk7CgogICAgIyBkZWxldGUgb2xkIHdvcmtpbmcgdW5pdHMKICAgIG15ICRTUUwgPSAiREVMRVRFIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlICIKICAgICAgICAuICJXSEVSRSB0aW1lX3N0YXJ0IExJS0UgJyREYXRlJScgQU5EIHVzZXJfaWQgPSAnJFNlbGYtPntVc2VySUR9JyI7CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwgKTsKICAgIHJldHVybiAxOwp9CgojIEZSQU1FV09SSy0yLjE6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSB0aW1lb2JqZWN0Cgo9aXRlbSBWYWNhdGlvbkNoZWNrKCkKCmNoZWNrIGlmIHRoZSBzZWxlY3RlZCBkYXkgaXMgYSB2YWNhdGlvbiAoaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91Cmluc2VydCAwMSBvciAxIGZvciBtb250aCBvciBkYXkgaW4gdGhlIGZ1bmN0aW9uIG9yIGluIHRoZSBTeXNDb25maWcpCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5WYWNhdGlvbkNoZWNrKAogICAgICAgIFllYXIgID0+ICcyMDA1JywKICAgICAgICBNb250aCA9PiAnNycsIHx8IDA3CiAgICAgICAgRGF5ICAgPT4gJzEzJywKICAgICk7Cgo9Y3V0CgpzdWIgVmFjYXRpb25DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWNhdGlvbk5hbWUgPSAnJzsKCiAgICAjIGNoZWNrIHJlcXVpcmVkIHBhcmFtcwogICAgZm9yIChxdyhZZWFyIE1vbnRoIERheSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVmFjYXRpb25DaGVjazogTmVlZCAkXyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAkUGFyYW17TW9udGh9ID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17TW9udGh9ICk7CiAgICAkUGFyYW17RGF5fSAgID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17RGF5fSApOwoKICAgIG15ICRUaW1lVmFjYXRpb25EYXlzICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lVmFjYXRpb25EYXlzJyk7CiAgICBteSAkVGltZVZhY2F0aW9uRGF5c09uZVRpbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZVZhY2F0aW9uRGF5c09uZVRpbWUnKTsKICAgIGlmICggZGVmaW5lZCggJFRpbWVWYWNhdGlvbkRheXMtPnsgJFBhcmFte01vbnRofSB9LT57ICRQYXJhbXtEYXl9IH0gKSApIHsKICAgICAgICByZXR1cm4gJFRpbWVWYWNhdGlvbkRheXMtPnsgJFBhcmFte01vbnRofSB9LT57ICRQYXJhbXtEYXl9IH07CiAgICB9CiAgICBlbHNpZiAoCiAgICAgICAgZGVmaW5lZCggJFRpbWVWYWNhdGlvbkRheXNPbmVUaW1lLT57ICRQYXJhbXtZZWFyfSB9LT57ICRQYXJhbXtNb250aH0gfS0+eyAkUGFyYW17RGF5fSB9ICkgKQogICAgewogICAgICAgIHJldHVybiAkVGltZVZhY2F0aW9uRGF5c09uZVRpbWUtPnsgJFBhcmFte1llYXJ9IH0tPnsgJFBhcmFte01vbnRofSB9LT57ICRQYXJhbXtEYXl9IH07CiAgICB9CiAgICBlbHNpZiAoIGRlZmluZWQoICRUaW1lVmFjYXRpb25EYXlzLT57IGludCggJFBhcmFte01vbnRofSApIH0tPnsgaW50KCAkUGFyYW17RGF5fSApIH0gKSApIHsKICAgICAgICByZXR1cm4gJFRpbWVWYWNhdGlvbkRheXMtPnsgaW50KCAkUGFyYW17TW9udGh9ICkgfS0+eyBpbnQoICRQYXJhbXtEYXl9ICkgfTsKICAgIH0KICAgIGVsc2lmICgKICAgICAgICBkZWZpbmVkKAogICAgICAgICAgICAkVGltZVZhY2F0aW9uRGF5c09uZVRpbWUtPnsgJFBhcmFte1llYXJ9IH0tPnsgaW50KCAkUGFyYW17TW9udGh9ICkgfQogICAgICAgICAgICAgICAgLT57IGludCggJFBhcmFte0RheX0gKSB9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm4gJFRpbWVWYWNhdGlvbkRheXNPbmVUaW1lLT57ICRQYXJhbXtZZWFyfSB9LT57IGludCggJFBhcmFte01vbnRofSApIH0KICAgICAgICAgICAgLT57IGludCggJFBhcmFte0RheX0gKSB9OwogICAgfQogICAgcmV0dXJuOwp9Cgo9aXRlbSBQcm9qZWN0QWN0aW9uUmVwb3J0aW5nKCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIGhvdXJzIGRlcGVuZGVudCBwcm9qZWN0IGFuZCBhY3Rpb24gZGF0YQoKICAgIG15ICVQcm9qZWN0RGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdEFjdGlvblJlcG9ydGluZygKICAgICAgICBZZWFyICA9PiAyMDA1LAogICAgICAgIE1vbnRoID0+IDcsCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgUHJvamVjdEFjdGlvblJlcG9ydGluZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhICAgICA9ICgpOwogICAgbXkgJElEU2VsZWN0ID0gJyc7CiAgICBmb3IgKHF3KFllYXIgTW9udGgpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApIHx8ICcnOwogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fQogICAgICAgICAgICAgICAgLT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIlByb2plY3RBY3Rpb25SZXBvcnRpbmc6IE5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1VzZXJJRH0gKSB8fCAnJzsKICAgICAgICAkSURTZWxlY3QgPSAiIEFORCB1c2VyX2lkID0gJyRQYXJhbXtVc2VySUR9JyI7CiAgICB9CgogICAgIyBob3VycyBwZXIgbW9udGgKICAgIG15ICREYXRlU3RyaW5nID0gJFBhcmFte1llYXJ9IC4gIi0iIC4gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17TW9udGh9ICk7CgogICAgbXkgJFNRTF9RdWVyeV9UaW1lU3RhcnQgPSAidGltZV9zdGFydCA8PSAnJERhdGVTdHJpbmctMzEgMjM6NTk6NTknJElEU2VsZWN0IjsKCiAgICAjdHRvOiB5ZXMsIEkga25vdyB0aGVyZSBhcmUgc29tZSBub24tbGVhcC15ZWFycywgLi4uCiAgICAjLi4uYnV0IGNvbSdvbiB0aGVzZSBmZXcgZW50cmllcyBpbiB0aGUgZXJyb3IgbG9nIHdvbid0IGJvdGhlciB0b28gbXVjaC4uLiA6LSkKICAgIGlmICggICAoICRQYXJhbXtNb250aH0gPT0gMiApCiAgICAgICAgfHwgKCAkUGFyYW17TW9udGh9ID09IDQgKQogICAgICAgIHx8ICggJFBhcmFte01vbnRofSA9PSA2ICkKICAgICAgICB8fCAoICRQYXJhbXtNb250aH0gPT0gOSApCiAgICAgICAgfHwgKCAkUGFyYW17TW9udGh9ID09IDExICkgKQogICAgewogICAgICAgICRTUUxfUXVlcnlfVGltZVN0YXJ0ID0gInRpbWVfc3RhcnQgPD0gJyREYXRlU3RyaW5nLTMwIDIzOjU5OjU5JyRJRFNlbGVjdCI7CiAgICB9CgogICAgIyBUb3RhbCBob3VycwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PgogICAgICAgICAgICAiU0VMRUNUIHByb2plY3RfaWQsIGFjdGlvbl9pZCwgcGVyaW9kIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIFdIRVJFICRTUUxfUXVlcnlfVGltZVN0YXJ0IiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRhe1RvdGFsfXsgJFJvd1swXSB9eyAkUm93WzFdIH17SG91cnN9ICs9ICRSb3dbMl07CiAgICB9CgogICAgJFNlbGYtPntEQk9iamVjdH0KICAgICAgICAtPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIHByb2plY3RfaWQsIGFjdGlvbl9pZCwgcGVyaW9kIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIgogICAgICAgICAgICAuICIgV0hFUkUgdGltZV9zdGFydCA+PSAnJERhdGVTdHJpbmctMDEgMDA6MDA6MDAnIEFORCAkU1FMX1F1ZXJ5X1RpbWVTdGFydCIsICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRhe1Blck1vbnRofXsgJFJvd1swXSB9eyAkUm93WzFdIH17SG91cnN9ICs9ICRSb3dbMl07CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cgp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEzICQgJERhdGU6IDIwMDgvMDcvMDcgMDY6MjY6MDggJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9BZ2VudFRpbWVBY2NvdW50aW5nLnBtIC0gdGhlIGRlIGxhbmd1YWdlIGZvciBBZ2VudFRpbWVBY2NvdW50aW5nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBkZV9BZ2VudFRpbWVBY2NvdW50aW5nLnBtLHYgMS43IDIwMDgvMDcvMDcgMDY6Mjg6MjggdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9BZ2VudFRpbWVBY2NvdW50aW5nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgKCRTZWxmKSA9IEBfOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259ID0gewogICAgICAgICV7ICRTZWxmLT57VHJhbnNsYXRpb259IH0sCgogICAgICAgICMgVGVtcGxhdGU6IEFnZW50VGltZUFjY291bnRpbmcKICAgICAgICAnU2V0dGluZycgICAgICAgID0+ICdLb25maWd1cmF0aW9uJywKICAgICAgICAnUHJvamVjdFNldHRpbmcnID0+ICdQcm9qZWt0a29uZmlndXJhdGlvbicsCgogICAgICAgICNuZXcgdHJhbnNsYXRpb25zLi4uCiAgICAgICAgJ0RhdGUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdEYXR1bScsCiAgICAgICAgJ3VudGlsJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdiaXMnLAogICAgICAgICdXb3JraW5nSG91cnMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJiZWl0c3N0dW5kZW4nLAogICAgICAgICdXb3JraW5nIEhvdXJzJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJiZWl0c3N0dW5kZW4nLAogICAgICAgICdXZWVrbHkgSG91cnMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnV29jaGVuc3R1bmRlbicsCiAgICAgICAgJ3RoaXMgbW9udGgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdkaWVzZXIgTW9uYXQnLAogICAgICAgICdPdmVydGltZSB0b3RhbCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU3VtbWUg3GJlcnN0dW5kZW4nLAogICAgICAgICdMZWF2ZSBEYXlzJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVGFnZSBhYndlc2VuZCcsCiAgICAgICAgJ0xlYXZlRGF5IHRoaXMgbW9udGgnICAgICAgICAgICAgICAgICAgICAgID0+ICdVcmxhdWJzdGFnZSAoZGllc2VyIE1vbmF0KScsCiAgICAgICAgJ0xlYXZlRGF5VG90YWwnICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcmxhdWJzdGFnZSAoU3VtbWUpJywKICAgICAgICAnTGVhdmVEYXkgcmVtYWluaW5nJyAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1VybGF1YnN0YWdlICh2ZXJibGVpYmVuZCknLAogICAgICAgICdEaXNlYXNlZCB0aGlzIG1vbnRoJyAgICAgICAgICAgICAgICAgICAgICA9PiAnRXJrcmFua3QgKGRpZXNlciBNb25hdCknLAogICAgICAgICdEaXNlYXNlZFRvdGFsJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRXJrcmFua3QgKFN1bW1lKScsCiAgICAgICAgJ1RpbWVBY2NvdW50aW5nJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdaZWl0ZXJmYXNzdW5nJywKICAgICAgICAnVGltZSBBY2NvdW50aW5nIE92ZXJ2aWV3IHBlciBNb250aCcgICAgICAgPT4gJ01vbmF0c/xiZXJzaWNodCBaZWl0ZXJmYXNzdW5nJywKICAgICAgICAnRWRpdCBUaW1lIEFjY291bnRpbmcnICAgICAgICAgICAgICAgICAgICAgPT4gJ1plaXRlcmZhc3N1bmcgYmVhcmJlaXRlbicsCiAgICAgICAgJ0VkaXQgVGltZSBBY2NvdW50aW5nIFByZWZlcmVuY2UnICAgICAgICAgID0+ICdaZWl0ZXJmYXNzdW5nc2VpbnN0ZWxsdW5nZW4gYmVhcmJlaXRlbicsCiAgICAgICAgJ1VzZXIgUmVwb3J0aW5nJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOdXR6ZXJiZXJpY2h0ZScsCiAgICAgICAgJ1Byb2plY3QgUmVwb3J0aW5nJyAgICAgICAgICAgICAgICAgICAgICAgID0+ICdQcm9qZWt0YmVyaWNodGUnLAogICAgICAgICdUaW1lIFByZXBvcnRpbmcnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnWmVpdGJlcmljaHRlJywKICAgICAgICAnTGVhdmVEYXkgUmVtYWluaW5nJyAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1ZlcmJsZWliZW5kZSBVcmxhdWJzdGFnZScsCiAgICAgICAgJ3BlciBNb250aCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdwcm8gTW9uYXQnLAogICAgICAgICdIb3VycycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU3R1bmRlbicsCiAgICAgICAgJ1RpbWUgc2VsZWN0aW9uJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBdXN3YWhsIERhdHVtJywKICAgICAgICAnSW5jb21wbGV0ZSBEYXlzJyAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25pY2h0IGF1c2dlZvxsbHRlIFRhZ2UnLAogICAgICAgICdQcm9qZWN0JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnUHJvamVrdCcsCiAgICAgICAgJ1Byb2plY3RzJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdQcm9qZWt0ZScsCiAgICAgICAgJ1RvdGFsJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTdW1tZScsCiAgICAgICAgJ1JlcG9ydGluZycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdCZXJpY2h0c3dlc2VuJywKICAgICAgICAnQWN0aW9uIFNldHRpbmcnICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FrdGlvbnNlaW5zdGVsbHVuZ2VuJywKICAgICAgICAnVXNlciBTZXR0aW5nJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ051dHplcmVpbnN0ZWxsdW5nZW4nLAogICAgICAgICdTaG93IE92ZXJ0aW1lJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAn3GJlcnN0dW5kZW4gYW56ZWlnZW4nLAogICAgICAgICdDcmVhdGUgUHJvamVjdCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnUHJvamVrdCBlcnN0ZWxsZW4nLAogICAgICAgICdOZXcgdXNlciBzZXR0aW5nJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTmV1ZSBOdXR6ZXJlaW5zdGVsbHVuZycsCiAgICAgICAgJ1JlbWFyaycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBbm1lcmt1bmcnLAogICAgICAgICdTdGFydHRpbWUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQmVnaW5uJywKICAgICAgICAnRW5kdGltZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0VuZGUnLAogICAgICAgICdTdGFydGRhdGUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRGF0dW0gQmVnaW5uJywKICAgICAgICAnRW5kZGF0ZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0RhdHVtIEVuZGUnLAogICAgICAgICdQZXJpb2QnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRGF1ZXInLAogICAgICAgICdMZWF2ZSBEYXknICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVXJsYXVic3RhZycsCiAgICAgICAgJ0xlYXZlRGF5JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcmxhdWInLAogICAgICAgICdEaXNlYXNlZCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRXJrcmFua3QnLAogICAgICAgICdPdmVydGltZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAn3GJlcnN0dW5kZW4nLAogICAgICAgICdUb3RhbCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU3VtbWUnLAogICAgICAgICdPdmVydmlldyBvZiAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAn3GJlcnNpY2h0IC0gJywKICAgICAgICAnVGltZUFjY291bnRpbmcgb2YnICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1plaXRlcmZhc3N1bmcgdm9tJywKICAgICAgICAnU3VjY2Vzc2Z1bCBpbnNlcnQhJyAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0VyZm9sZ3JlaWNoIGVpbmdlZvxndCEnLAogICAgICAgICdEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgT2JqZWN0JyA9PiAnV29sbGVuIFNpZSBkaWVzZW4gRWludHJhZyB3aXJrbGljaCBs9nNjaGVuJywKICAgICAgICAnQ2FuXCd0IGluc2VydCBXb3JraW5nIFVuaXRzIScgICAgICAgICAgICAgPT4gJ0thbm4gQXJiZWl0c3N0dW5kZW4gbmljaHQgZWluZvxnZW4hJywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBBY3Rpb24hJyA9PiAnTmljaHQgc3BlaWNoZXJiYXIgLSBBa3Rpb24gZmVobHQhJywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBQcm9qZWN0IScgPT4KICAgICAgICAgICAgJ05pY2h0IHNwZWljaGVyYmFyIC0gUHJvamVrdGFuZ2FiZSBmZWhsdCEnLAogICAgICAgICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSB0aGUgUGVyaW9kIGlzIGJpZ2dlciB0aGFuIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIFN0YXJ0dGltZSBhbmQgRW5kdGltZSEnCiAgICAgICAgICAgID0+ICdOaWNodCBzcGVpY2hlcmJhciAtIERhdWVyIGlzdCBncvbfZXIgYWxzIGRlciBaZWl0cmF1bSB6d2lzY2hlbiBCZWdpbm4gdW5kIEVuZGUhJywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgU3RhcnR0aW1lIGlzIG9sZGVyIHRoYW4gRW5kdGltZSEnID0+CiAgICAgICAgICAgICdOaWNodCBzcGVpY2hlcmJhciAtIEJlZ2lubiBsaWVndCBuYWNoIEVuZGUhJywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBwZXJpb2QhJyA9PgogICAgICAgICAgICAnTmljaHQgc3BlaWNoZXJiYXIgLSBEYXVlciAoZXJnaWJ0IHNpY2ggYXVzIFN0YXJ0LSB1bmQgRW5kemVpdCkgaXN0IG5pY2h0IGFuZ2VnZWJlbiEnLAogICAgICAgICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBQZXJpb2QgaXMgbm90IGdpdmVuIGdpdmVuIScgPT4KICAgICAgICAgICAgJ05pY2h0IHNwZWljaGVyYmFyIC0gRGF1ZXIgKGVyZ2lidCBzaWNoIGF1cyBTdGFydC0gdW5kIEVuZHplaXQpIGlzdCBuaWNodCBhbmdlZ2ViZW4hJywKICAgICAgICAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgd2hpbGUgeW91IGFyZSBEaXNlYXNlZD8nID0+CiAgICAgICAgICAgICdTaWUgd2FyZW4ga3JhbmsgdW5kIGhhYmVuIGdlYXJiZWl0ZXQ/IFdpciBicmF1Y2hlbiBtZWhyIHNvbGNoZSBNaXRhcmJlaXRlci4nLAogICAgICAgICdBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCB3aGlsZSB5b3UgaGF2ZSBhIGxlYXZlIGRheT8nID0+CiAgICAgICAgICAgICdTaWUgaGF0dGVuIFVybGF1YiB1bmQgaGFiZW4gZ2VhcmJlaXRldD8gV2lyIGJyYXVjaGVuIG1laHIgc29sY2hlIE1pdGFyYmVpdGVyLicsCiAgICAgICAgJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIHdoaWxlIHlvdSBoYXZlIG92ZXJ0aW1lPycgPT4KICAgICAgICAgICAgJ0hhYmVuIFNpZSB35GhyZW5kIGRlciDcYmVyc3R1bmRlbiBhdWNoIGdlYXJiZWl0ZXQ/JywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgYSBkYXkgaGFzIG9ubHkgMjQgaG91cnMhJyA9PiAnRWluIFRhZyBoYXQgbnVyIDI0IFN0dW5kZW4hJywKICAgICAgICAnQ2FuXCd0IGRlbGV0ZSBXb3JraW5nIFVuaXRzIScgICAgICA9PiAnS2FubiBBcmJlaXRzc3R1bmRlbiBuaWNodCBs9nNjaGVuIScsCiAgICAgICAgJ1BsZWFzZSBpbnNlcnQgeW91ciB3b3JraW5nIGhvdXJzIScgPT4gJ0JpdHRlIHRyYWdlbiBTaWUgSWhyZSBBcmJlaXRzemVpdGVuIGVpbiEnLAogICAgICAgICdZb3UgaGF2ZSB0byBpbnNlcnQgU3RhcnQtIGFuZCBFbmR0aW1lIG9yIGEgUGVyaW9kJyA9PgogICAgICAgICAgICAnU2llIG38c3NlbiBCZWdpbm4tIHVuZCBFbmRlemVpdCBhbmdlYmVuLicsCiAgICAgICAgJ1lvdSBjYW4gb25seSBzZWxlY3Qgb25lIGNoZWNrYm94IGVsZW1lbnQhJyA9PiAnU2llIGv2bm5lbiBudXIgZWluZSBDaGVja2JveCBtYXJraWVyZW4hJywKICAgICAgICAnRWRpdCBUaW1lIEFjY291bnRpbmcgUHJvamVjdCBQcmVmZXJlbmNlJyA9PgogICAgICAgICAgICAnWmVpdGVyZmFzc3VuZzogQmVhcmJlaXR1bmcgZGVyIFByb2pla3Rrb25maWd1cmF0aW9uJywKICAgICAgICAnUHJvamVjdCBTZXR0aW5nJyA9PiAnUHJvamVrdGtvbmZpZ3VyYXRpb24nLAogICAgICAgICcnICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICdJZiB5b3UgdXNlIGFjdGlvbiBtaXNjLCBwbGVhc2UgZ2l2ZSBhbiBleHBsYW5hdGlvbiBpbiB0aGUgZmllbGQgcmVtYXJrJyA9PgogICAgICAgICAgICAnV2VubiBTaWUgQWt0aW9uIFNvbnN0aWdlcyBhdXN35GhsZW4sIGdlYmVuIFNpZSBlaW5lIEJlc2NocmVpYnVuZyB1bSBGZWxkIEFubWVya3VuZyBhbi4nLAoKICAgICAgICAjIEZJWE1FIGFjdHVhbGx5IHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGZpbGUgZGUucG0sIGhvd2V2ZXIgdGhleSdyZSBub3Qgc28gSSBwdXQnZW0gaGVyZS4uLgogICAgICAgICdNb24nICAgICAgPT4gJ01vJywKICAgICAgICAnVHVlJyAgICAgID0+ICdEaScsCiAgICAgICAgJ1dlZCcgICAgICA9PiAnTWknLAogICAgICAgICdUaHUnICAgICAgPT4gJ0RvJywKICAgICAgICAnRnJpJyAgICAgID0+ICdGcicsCiAgICAgICAgJ1NhdCcgICAgICA9PiAnU2EnLAogICAgICAgICdTdW4nICAgICAgPT4gJ1NvJywKICAgICAgICAnSmFudWFyeScgID0+ICdKYW51YXInLAogICAgICAgICdGZWJydWFyeScgPT4gJ0ZlYnJ1YXInLAogICAgICAgICdNYXJjaCcgICAgPT4gJ03kcnonLAogICAgICAgICdNYXknICAgICAgPT4gJ01haScsCiAgICAgICAgJ0p1bmUnICAgICA9PiAnSnVuaScsCiAgICAgICAgJ0p1bHknICAgICA9PiAnSnVsaScsCiAgICAgICAgJ09jdG9iZXInICA9PiAnT2t0b2JlcicsCiAgICAgICAgJ0RlY2VtYmVyJyA9PiAnRGV6ZW1iZXInLAogICAgfTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGltZUFjY291bnRpbmcucG0gLSB0aW1lIGFjY291bnRpbmcgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nLnBtLHYgMS4yMCAyMDA4LzA2LzA0IDEzOjI1OjIwIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpbWVBY2NvdW50aW5nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZzsKdXNlIERhdGU6OlBjYWxjIHF3KFRvZGF5IERheXNfaW5fTW9udGggRGF5X29mX1dlZWsgQWRkX0RlbHRhX1lNRCk7CnVzZSBUaW1lOjpMb2NhbDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjAgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7ICVQYXJhbSB9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIE9iamVjdHMKICAgIGZvciAoCiAgICAgICAgcXcoUGFyYW1PYmplY3QgREJPYmplY3QgTW9kdWxlUmVnIExvZ09iamVjdAogICAgICAgIENvbmZpZ09iamVjdCBUaWNrZXRPYmplY3QgVGltZU9iamVjdCBHcm91cE9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApIGlmICEkU2VsZi0+eyRffTsKICAgIH0KCiAgICAjIGNyZWF0ZSByZXF1aXJlZCBvYmplY3RzLi4uCiAgICAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZy0+bmV3KCVQYXJhbSk7CiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBQcmVSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgIHJldHVybiAxIGlmICEkU2VsZi0+e0FjY2Vzc1JvfTsKCiAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSggU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksICk7CiAgICBteSAlVXNlciA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyQ3VycmVudFBlcmlvZEdldCgKICAgICAgICBZZWFyICA9PiAkWWVhciwKICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgRGF5ICAgPT4gJERheSwKICAgICk7CiAgICBpZiAoICRVc2VyeyAkU2VsZi0+e1VzZXJJRH0gfSApIHsKICAgICAgICBteSAlSW5jb21wbGV0ZVdvcmtpbmdEYXlzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2soKTsKCiAgICAgICAgIyByZWRpcmVjdCBpZiBpbmNvbXBsZXRlIHdvcmtpbmcgZGF5IGFyZSBvdXQgb2YgcmFuZ2UKICAgICAgICBpZiAoICAgJEluY29tcGxldGVXb3JraW5nRGF5c3tFbmZvcmNlSW5zZXJ0fQogICAgICAgICAgICAmJiAkU2VsZi0+e0FjdGlvbn0gbmUgJ0FnZW50VGltZUFjY291bnRpbmcnCiAgICAgICAgICAgICYmICRTZWxmLT57QWN0aW9ufSBuZSAnQWdlbnRDYWxlbmRhclNtYWxsJyApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9CiAgICAgICAgICAgICAgICAtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmU3ViYWN0aW9uPUVkaXQiICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQE1vbnRoQXJyYXkgPSAoCiAgICAgICAgJycsICAgICAnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICAgICAnQXByaWwnLCAgICdNYXknLAogICAgICAgICdKdW5lJywgJ0p1bHknLCAgICAnQXVndXN0JywgICAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLAogICAgICAgICdEZWNlbWJlcicsCiAgICApOwogICAgbXkgQFdlZWtkYXlBcnJheSA9ICggJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0JywgJ1N1bicsICk7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZWRpdCB0aGUgdGltZSBhY2NvdW50aW5nIGVsZW1lbnRzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0VkaXQnICkgewogICAgICAgIG15ICRPdXRwdXQgICAgICA9ICcnOwogICAgICAgIG15ICVGcm9udGVuZCAgICA9ICgpOwogICAgICAgIG15ICVQcm9qZWN0TGlzdCA9ICgpOwogICAgICAgIG15ICVBY3Rpb25MaXN0ICA9ICgpOwogICAgICAgIG15ICVEYXRhICAgICAgICA9ICgpOwogICAgICAgIG15ICVBY3Rpb24gICAgICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwogICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0KICAgICAgICAgICAgLT5TeXN0ZW1UaW1lMkRhdGUoIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLCApOwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBmb3IgKHF3KFN0YXR1cyBZZWFyIE1vbnRoIERheSBEZWxldGUpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgfQoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoICEkU2VsZi0+e0FjY2Vzc1JvfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIERhdGUKICAgICAgICBpZiAoICEkUGFyYW17WWVhcn0gfHwgISRQYXJhbXtNb250aH0gfHwgISRQYXJhbXtEYXl9ICkgewogICAgICAgICAgICAkUGFyYW17WWVhcn0gID0gJFllYXI7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSAkTW9udGg7CiAgICAgICAgICAgICRQYXJhbXtEYXl9ICAgPSAkRGF5OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1llYXJ9ICA9IHNwcmludGYoICIlMDJkIiwgJFBhcmFte1llYXJ9ICk7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtNb250aH0gKTsKICAgICAgICAgICAgJFBhcmFte0RheX0gICA9IHNwcmludGYoICIlMDJkIiwgJFBhcmFte0RheX0gKTsKICAgICAgICB9CgogICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJDdXJyZW50UGVyaW9kR2V0KAogICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICk7CgogICAgICAgICMgZm9yIGluaXRpYWwgdXNlaW5nLCB0aGUgZmlyc3QgYWdlbnQgd2l0aCBydy1yaWdodCB3aWxsIGJlIHJlZGlyZWN0ZWQKICAgICAgICAjIHRvICdTZXR0aW5nJy4gVGhlbiBoZSBjYW4gZG8gdGhlIGluaXRpYWwgc2V0dGluZ3MKICAgICAgICBpZiAoICEkVXNlcnsgJFNlbGYtPntVc2VySUR9IH0gKSB7CiAgICAgICAgICAgIG15ICVHcm91cExpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncncnLAogICAgICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yICggKCBrZXlzICVHcm91cExpc3QgKSApIHsKICAgICAgICAgICAgICAgIGlmICggJEdyb3VwTGlzdHskX30gZXEgJ3RpbWVfYWNjb3VudGluZycgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmIiAuICJTdWJhY3Rpb249U2V0dGluZyIgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICJObyBVc2VyUGVyaW9kIGF2YWlsYWJsZSwgcGxlYXNlIGNvbnRhY3QgdGhlIHRpbWUgYWNjb3VudGluZyBhZG1pbiB0byBpbnNlcnQgeW91ciBVc2VyUGVyaW9kISIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVJbmNvbXBsZXRlV29ya2luZ0RheXMgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjaygpOwogICAgICAgIG15ICRNYXhBbGxvd2VkSW5zZXJ0RGF5cwogICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6TWF4QWxsb3dlZEluc2VydERheXMnKSB8fCAnMTAnOwogICAgICAgICggJFBhcmFte1llYXJBbGxvd2VkfSwgJFBhcmFte01vbnRoQWxsb3dlZH0sICRQYXJhbXtEYXlBbGxvd2VkfSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFllYXIsICRNb250aCwgJERheSwgMCwgMCwgLSRNYXhBbGxvd2VkSW5zZXJ0RGF5cyApOwogICAgICAgIGlmICh0aW1lbG9jYWwoIDEsIDAsIDAsICRQYXJhbXtEYXl9LCAkUGFyYW17TW9udGh9IC0gMSwgJFBhcmFte1llYXJ9IC0gMTkwMCApIDwgdGltZWxvY2FsKAogICAgICAgICAgICAgICAgMSwgMCwgMCwgJFBhcmFte0RheUFsbG93ZWR9LAogICAgICAgICAgICAgICAgJFBhcmFte01vbnRoQWxsb3dlZH0gLSAxLAogICAgICAgICAgICAgICAgJFBhcmFte1llYXJBbGxvd2VkfSAtIDE5MDAKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBpZiAoICEkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0luY29tcGxldGV9eyAkUGFyYW17WWVhcn0gfXsgJFBhcmFte01vbnRofSB9CiAgICAgICAgICAgICAgICB7ICRQYXJhbXtEYXl9IH0gKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVZpZXcmWWVhcj0kUGFyYW17WWVhcn0mTW9udGg9JFBhcmFte01vbnRofSZEYXk9JFBhcmFte0RheX0iCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW4nLAogICAgICAgICAgICBWYWx1ZSA9PgogICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kUGFyYW17WWVhcn0mTW9udGg9JFBhcmFte01vbnRofSZEYXk9JFBhcmFte0RheX0iLAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtNb250aF90b19UZXh0fSA9ICRNb250aEFycmF5WyAkUGFyYW17TW9udGh9IF07CgogICAgICAgICggJFBhcmFte1llYXJCYWNrfSwgJFBhcmFte01vbnRoQmFja30sICRQYXJhbXtEYXlCYWNrfSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSwgMCwgMCwgLTEgKTsKICAgICAgICAoICRQYXJhbXtZZWFyTmV4dH0sICRQYXJhbXtNb250aE5leHR9LCAkUGFyYW17RGF5TmV4dH0gKQogICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0sIDAsIDAsIDEgKTsKCiAgICAgICAgIyBFZGl0IFdvcmtpbmcgVW5pdHMKICAgICAgICBpZiAoICRQYXJhbXtTdGF0dXN9ICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtEZWxldGV9ICkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gIkRlbGV0ZSIgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nRGVsZXRlJwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRXb3JraW5nVW5pdElEID0gMDsKICAgICAgICAgICAgZm9yICggJFdvcmtpbmdVbml0SUQgPSAxOyAkV29ya2luZ1VuaXRJRCA8IDEwOyAkV29ya2luZ1VuaXRJRCsrICkgewogICAgICAgICAgICAgICAgZm9yIChxdyhQcm9qZWN0SUQgQWN0aW9uSUQgUmVtYXJrIFN0YXJ0VGltZSBFbmRUaW1lIFBlcmlvZCkpIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gLiAnWycgLiAkV29ya2luZ1VuaXRJRCAuICddJyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17UHJvamVjdElEfSB8fCAkUGFyYW17QWN0aW9uSUR9ICkgewogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9ID0gJFBhcmFte1Byb2plY3RJRH07CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfSAgPSAkUGFyYW17QWN0aW9uSUR9OwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtSZW1hcmt9ICAgID0gJFBhcmFte1JlbWFya307CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1N0YXJ0VGltZX0gPSAkUGFyYW17U3RhcnRUaW1lfTsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17RW5kVGltZX0gICA9ICRQYXJhbXtFbmRUaW1lfTsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17RGF0ZX0gICAgICA9ICRQYXJhbXtEYXRlfTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtQZXJpb2R9ID1+IC9eKFxkKyksKFxkKykvICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSA9ICQxIC4gIi4iIC4gJDI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSA9ICRQYXJhbXtQZXJpb2R9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJVJlZHVjZVRpbWUgPSAoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6UmVkdWNlVGltZScpICkgewogICAgICAgICAgICAgICAgICAgICAgICAlUmVkdWNlVGltZSA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6UmVkdWNlVGltZScpIH07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjaWYgKCRQYXJhbXtTdGFydFRpbWV9ICYmICRQYXJhbXtFbmRUaW1lfSAmJiAhJFBhcmFte1BlcmlvZH0pIHsKICAgICAgICAgICAgICAgICAgICAjb3ZlcndyaXRlIFBlcmlvZCB3aGVuIFN0YXJ0IGFuZCBFbmR0aW1lIGlzIGdpdmVuLi4uCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17U3RhcnRUaW1lfSAmJiAkUGFyYW17RW5kVGltZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gPX4gL14oXGQrKTooXGQrKS8gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJDEgKiA2MCArICQyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17RW5kVGltZX0gPX4gL14oXGQrKTooXGQrKS8gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkMSAqIDYwICsgJDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVkdWNlVGltZXsgJEFjdGlvbnsgJFBhcmFte0FjdGlvbklEfSB9e0FjdGlvbn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gPSAoICRFbmRUaW1lIC0gJFN0YXJ0VGltZSApIC8gNjAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogJFJlZHVjZVRpbWV7ICRBY3Rpb257ICRQYXJhbXtBY3Rpb25JRH0gfXtBY3Rpb259IH0gLyAxMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSA9ICggJEVuZFRpbWUgLSAkU3RhcnRUaW1lICkgLyA2MDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJENoZWNrYm94Q2hlY2sgPSAwOwogICAgICAgICAgICBmb3IgKHF3KExlYXZlRGF5IERpc2Vhc2VkIE92ZXJ0aW1lKSkgewogICAgICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFteyRffSApIHsKICAgICAgICAgICAgICAgICAgICAkV29ya2luZ1VuaXRJRCsrOwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9ID0gJy0xJzsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ICA9ICRQYXJhbXskX307CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1JlbWFya30gICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17U3RhcnRUaW1lfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtFbmRUaW1lfSAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICAkQ2hlY2tib3hDaGVjaysrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJENoZWNrYm94Q2hlY2sgPiAxICkgewogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkRGVzY3JpcHRpb259ID0gIllvdSBjYW4gb25seSBzZWxlY3Qgb25lIGNoZWNrYm94IGVsZW1lbnQhIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YXtZZWFyfSAgPSAkUGFyYW17WWVhcn07CiAgICAgICAgICAgICREYXRhe01vbnRofSA9ICRQYXJhbXtNb250aH07CiAgICAgICAgICAgICREYXRhe0RheX0gICA9ICRQYXJhbXtEYXl9OwogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzSW5zZXJ0KCVEYXRhKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdDYW5cJ3QgaW5zZXJ0IFdvcmtpbmcgVW5pdHMhJyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte1N1Y2Nlc3NmdWxJbnNlcnR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBTaG93IFdvcmtpbmcgVW5pdHMKICAgICAgICAjIGdldCBleGlzdGluZyB3b3JraW5nIHVuaXRzCiAgICAgICAgJURhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzR2V0KAogICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpJbnB1dEhvdXJzV2l0aG91dFN0YXJ0RW5kVGltZScpICkgewogICAgICAgICAgICAkUGFyYW17VGV4dFBvc2l0aW9ufSAgPSAnbGVmdCc7CiAgICAgICAgICAgICRQYXJhbXtQZXJpb2RCbG9ja30gICA9ICdVbml0SW5wdXRQZXJpb2QnOwogICAgICAgICAgICAkRnJvbnRlbmR7Q2xhc3NUaW1lfSAgPSAnZm9vdG5vdGUnOwogICAgICAgICAgICAkRnJvbnRlbmR7UGVyaW9kTm90ZX0gPSAnKic7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGb290Tm90ZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtUZXh0UG9zaXRpb259ICA9ICdyaWdodCc7CiAgICAgICAgICAgICRQYXJhbXtQZXJpb2RCbG9ja30gICA9ICdVbml0UGVyaW9kV2l0aG91dElucHV0JzsKICAgICAgICAgICAgJEZyb250ZW5ke0NsYXNzVGltZX0gID0gJ3JlcXVpcmVkJzsKICAgICAgICAgICAgJEZyb250ZW5ke1BlcmlvZE5vdGV9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwcm9qZWN0IHNldHRpbmdzCiAgICAgICAgbXkgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgZm9yIG15ICRQcm9qZWN0SUQgKCBrZXlzICV7ICRQcm9qZWN0e1Byb2plY3R9IH0gKSB7CiAgICAgICAgICAgIGlmICggJFByb2plY3R7UHJvamVjdFN0YXR1c317JFByb2plY3RJRH0gKSB7CiAgICAgICAgICAgICAgICAkUHJvamVjdExpc3R7JFByb2plY3RJRH0gPSAkUHJvamVjdHtQcm9qZWN0fXskUHJvamVjdElEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkUHJvamVjdExpc3R7Jyd9ID0gJyc7CgogICAgICAgICMgZ2V0IGFjdGlvbiBzZXR0aW5ncwogICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBrZXlzICVBY3Rpb24gKSB7CiAgICAgICAgICAgIGlmICggJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvblN0YXR1c30gKSB7CiAgICAgICAgICAgICAgICAkQWN0aW9uTGlzdHskQWN0aW9uSUR9ID0gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvbn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJEFjdGlvbkxpc3R7Jyd9ID0gJyc7CgogICAgICAgIGlmICggdGltZSgpID4gdGltZWxvY2FsKCAxLCAwLCAwLCAkUGFyYW17RGF5fSwgJFBhcmFte01vbnRofSAtIDEsICRQYXJhbXtZZWFyfSAtIDE5MDAgKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXRCbG9jaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgdW5pdHMKICAgICAgICBteSAkV29ya2luZ1VuaXRJRE1heCA9IDEwOwogICAgICAgIG15ICRXb3JraW5nVW5pdElEICAgID0gMDsKICAgICAgICAkUGFyYW17VG90YWx9ID0gMDsKICAgICAgICBmb3IgKCAkV29ya2luZ1VuaXRJRCA9IDE7ICRXb3JraW5nVW5pdElEIDwgJFdvcmtpbmdVbml0SURNYXg7ICRXb3JraW5nVW5pdElEKysgKSB7CiAgICAgICAgICAgIGlmICggJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gPT0gLTEgKSB7CiAgICAgICAgICAgICAgICBpZiAoICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gPT0gLTEgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0Rpc2Vhc2VkfSA9ICdjaGVja2VkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfSA9PSAtMiApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17TGVhdmVEYXl9ID0gJ2NoZWNrZWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ID09IC0zICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtPdmVydGltZX0gPSAnY2hlY2tlZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkV29ya2luZ1VuaXRJRE1heCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte0lEfSA9ICRXb3JraW5nVW5pdElEOwoKICAgICAgICAgICAgICAgICMgZ2V0IG9wdGlvbiBmaWVsZHMKICAgICAgICAgICAgICAgICRGcm9udGVuZHsnQWN0aW9uT3B0aW9uJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICAgPT4gXCVBY3Rpb25MaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICAgICAgICAgPT4gJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICJBY3Rpb25JRFskV29ya2luZ1VuaXRJRF0iLAogICAgICAgICAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRnJvbnRlbmR7J1Byb2plY3RPcHRpb24nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICA9PiBcJVByb2plY3RMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICAgICAgICAgPT4gJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAiUHJvamVjdElEWyRXb3JraW5nVW5pdElEXSIsCiAgICAgICAgICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkUGFyYW17UmVtYXJrfSA9ICREYXRheyRXb3JraW5nVW5pdElEfXtSZW1hcmt9IHx8ICcnOwogICAgICAgICAgICAgICAgaWYgKCAkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gPiAwICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1BlcmlvZH0gPSAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtUb3RhbH0gKz0gJFBhcmFte1BlcmlvZH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSA9PSAwICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIFBlcmlvZCBpcyBub3QgZ2l2ZW4gZ2l2ZW4hJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgU3RhcnR0aW1lIGlzIG9sZGVyIHRoYW4gRW5kdGltZSEnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UGVyaW9kfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtaXNzaW5nIHBlcmlvZCEnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQZXJpb2R9ICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1N0YXJ0VGltZX0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17RW5kVGltZX0gICA9ICcnOwogICAgICAgICAgICAgICAgfQoKIyAgICAgICAgICAgICAgICBmb3JlYWNoIChxdyhTdGFydCBFbmQpKSB7CiMgICAgICAgICAgICAgICAgICAgIGlmICgkRGF0YXskV29ya2luZ1VuaXRJRH17JF8gLiAiVGltZSJ9ICYmICREYXRheyRXb3JraW5nVW5pdElEfXskXyAuICJUaW1lIn0gZXEgJzAwOjAwOjAwJykgewojICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFteyRfIC4gIkhvdXIifSA9ICcwMCc7CiMgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17JF8gLiAiTWludXRlIn0gPSAnMDAnOwojICAgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICAgIGVsc2lmICgkRGF0YXskV29ya2luZ1VuaXRJRH17JF8gLiAiVGltZSJ9KSB7CiMgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17JF8uICJIb3VyIn0gICA9IHN1YnN0cigkRGF0YXskV29ya2luZ1VuaXRJRH17JF99LCAwLCAyKSB8fCAnJzsKIyAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXskXy4gIk1pbnV0ZSJ9ID0gc3Vic3RyKCREYXRheyRXb3JraW5nVW5pdElEfXskX30sIDMsIDIpIHx8ICcnOwojICAgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICAgICRQYXJhbXskXyAuICJUaW1lIn0gPSBCdWlsZFRpbWVTZWxlY3Rpb24oCiMgICAgICAgICAgICAgICAgICAgICAgICBIb3VyICAgPT4gJFBhcmFteyRfLiAiSG91ciJ9LAojICAgICAgICAgICAgICAgICAgICAgICAgTWludXRlID0+ICRQYXJhbXskXy4gIk1pbnV0ZSJ9CiMgICAgICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJF8sCiMgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgPT4gJ1RpbWVJbnB1dEZvcm1hdCcsCiMgICAgICAgICAgICAgICAgICAgICk7CiMgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yIChxdyhTdGFydFRpbWUgRW5kVGltZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRheyRXb3JraW5nVW5pdElEfXskX30gJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9eyRffSBlcSAnMDA6MDAnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17JF99ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17JF99ID0gJERhdGF7JFdvcmtpbmdVbml0SUR9eyRffTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtQZXJpb2RCbG9ja30sCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgVmFsaWRpdHkgY2hlY2tzIHN0YXJ0CiAgICAgICAgICAgICAgICBpZiAoICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0KICAgICAgICAgICAgICAgICAgICAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9CiAgICAgICAgICAgICAgICAgICAgJiYgJFBhcmFte0Rpc2Vhc2VkfSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1JlYWRPbmx5RGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIHdoaWxlIHlvdSBhcmUgRGlzZWFzZWQ/JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfQogICAgICAgICAgICAgICAgICAgICYmICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0KICAgICAgICAgICAgICAgICAgICAmJiAkUGFyYW17TGVhdmVEYXl9ICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlEZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgPSAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgd2hpbGUgeW91IGhhdmUgYSBsZWF2ZSBkYXk/JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfQogICAgICAgICAgICAgICAgICAgICYmICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0KICAgICAgICAgICAgICAgICAgICAmJiAkUGFyYW17T3ZlcnRpbWV9ICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlEZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgPSAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgd2hpbGUgeW91IGhhdmUgb3ZlcnRpbWU/JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gJiYgISREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtaXNzaW5nIEFjdGlvbiEnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAhJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIG9mIG1pc3NpbmcgUHJvamVjdCEnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAgICREYXRheyRXb3JraW5nVW5pdElEfXtTdGFydFRpbWV9CiAgICAgICAgICAgICAgICAgICAgJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e1N0YXJ0VGltZX0gbmUgJzAwOjAwJwogICAgICAgICAgICAgICAgICAgICYmICREYXRheyRXb3JraW5nVW5pdElEfXtFbmRUaW1lfQogICAgICAgICAgICAgICAgICAgICYmICREYXRheyRXb3JraW5nVW5pdElEfXtFbmRUaW1lfSBuZSAnMDA6MDAnICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRheyRXb3JraW5nVW5pdElEfXtTdGFydFRpbWV9ID1+IC9eKFxkKyk6KFxkKykvICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJDEgKiA2MCArICQyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRheyRXb3JraW5nVW5pdElEfXtFbmRUaW1lfSA9fiAvXihcZCspOihcZCspLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJDEgKiA2MCArICQyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gKCAkRW5kVGltZSAtICRTdGFydFRpbWUgKSAvIDYwICsgMC4wMSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSB0aGUgUGVyaW9kIGlzIGJpZ2dlcicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnIHRoYW4gdGhlIGludGVydmFsIGJldHdlZW4gU3RhcnR0aW1lIGFuZCBFbmR0aW1lISc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRFbmRUaW1lID4gNjAgKiAyNCB8fCAkU3RhcnRUaW1lID4gNjAgKiAyNCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIGEgZGF5IGhhcyBvbmx5IDI0IGhvdXJzISc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259ICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXRSZXF1aXJlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyBEZXNjcmlwdGlvbiA9PiAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259IH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnQ2FuXCd0IGRlbGV0ZSBXb3JraW5nIFVuaXRzIScgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufSAgICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb25UcnVlfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtVbml0UmVhZE9ubHlEZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVW5pdFJlYWRvbmx5JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7IERlc2NyaXB0aW9uID0+ICRQYXJhbXtVbml0UmVhZE9ubHlEZXNjcmlwdGlvbn0gfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVhZE9ubHlEZXNjcmlwdGlvbn0gPSAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFZhbGlkaXR5IGNoZWNrcyBlbmQKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkKICAgICAgICAgICAgPiB0aW1lbG9jYWwoIDEsIDAsIDAsICRQYXJhbXtEYXl9LCAkUGFyYW17TW9udGh9IC0gMSwgJFBhcmFte1llYXJ9IC0gMTkwMCApICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbH0gPSBzcHJpbnRmKCAiJS4yZiIsICRQYXJhbXtUb3RhbH0gKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RvdGFsJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB2YWxpZGl0eSBjaGVja3Mgc3RhcnQKICAgICAgICBpZiAoICRQYXJhbXtUb3RhbH0gJiYgJFBhcmFte1RvdGFsfSA+IDI0ICkgewogICAgICAgICAgICAkUGFyYW17UmVxdWlyZWREZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIG9mIG1vcmUgdGhhbiAyNCB3b3JraW5nIGhvdXJzISc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte1RvdGFsfSAmJiAkUGFyYW17VG90YWx9ID4gMTYgKSB7CiAgICAgICAgICAgICRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufSA9ICdBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCBtb3JlIHRoYW4gMTYgaG91cnM/JzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkUGFyYW17UmVxdWlyZWREZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSZXF1aXJlZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgRGVzY3JpcHRpb24gPT4gJFBhcmFte1JlcXVpcmVkRGVzY3JpcHRpb259IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICghJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+RXJyb3JTY3JlZW4oIE1lc3NhZ2UgPT4gJ0NhblwndCBkZWxldGUgV29ya2luZyBVbml0cyEnICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkUGFyYW17UmVhZE9ubHlEZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWFkb25seScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgRGVzY3JpcHRpb24gPT4gJFBhcmFte1JlYWRPbmx5RGVzY3JpcHRpb259IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHZhbGlkaXR5IGNoZWNrcyBlbmQKCiAgICAgICAgJFBhcmFte0RhdGV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgUHJlZml4ID0+ICcnLAogICAgICAgICAgICBGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKHRpbWVsb2NhbCggMSwgMCwgMCwgJFBhcmFte0RheX0sICRQYXJhbXtNb250aH0gLSAxLCAkUGFyYW17WWVhcn0gLSAxOTAwICkgPCB0aW1lbG9jYWwoCiAgICAgICAgICAgICAgICAxLCAwLCAwLCAkUGFyYW17RGF5QWxsb3dlZH0sCiAgICAgICAgICAgICAgICAkUGFyYW17TW9udGhBbGxvd2VkfSAtIDEsCiAgICAgICAgICAgICAgICAkUGFyYW17WWVhckFsbG93ZWR9IC0gMTkwMAogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggJEluY29tcGxldGVXb3JraW5nRGF5c3tJbmNvbXBsZXRlfXsgJFBhcmFte1llYXJ9IH17ICRQYXJhbXtNb250aH0gfXsgJFBhcmFte0RheX0gfQogICAgICAgICAgICAgICAgJiYgISRQYXJhbXtTdWNjZXNzZnVsSW5zZXJ0fSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVxdWlyZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgRGF0ZSBpcyBvdXQgb2YgbGltaXQsIGJ1dCB5b3UgaGF2ZW5cJ3QgaW5zZXJ0IHRoaXMgZGF5IHlldCwgc28geW91IGdldCBvbmUoISkgY2hhbmNlIHRvIGluc2VydCcKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgbXkgJFllYXJJRCAoIHNvcnQga2V5cyAleyAkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0luY29tcGxldGV9IH0gKSB7CiAgICAgICAgICAgIGZvciBteSAkTW9udGhJRCAoIHNvcnQga2V5cyAleyAkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0luY29tcGxldGV9eyRZZWFySUR9IH0gKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJERheUlEICgKICAgICAgICAgICAgICAgICAgICBzb3J0IGtleXMgJXsgJEluY29tcGxldGVXb3JraW5nRGF5c3tJbmNvbXBsZXRlfXskWWVhcklEfXskTW9udGhJRH0gfSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFte0luY29tcGxldGV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdJbmNvbXBsZXRlVGV4dCcsICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICRCb2xkU3RhcnQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBteSAkQm9sZEVuZCAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAgICRZZWFySUQgZXEgJFBhcmFte1llYXJ9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRNb250aElEIGVxICRQYXJhbXtNb250aH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJERheUlEICAgZXEgJFBhcmFte0RheX0gKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEJvbGRTdGFydCA9ICc8Yj4nOwogICAgICAgICAgICAgICAgICAgICAgICAkQm9sZEVuZCAgID0gJzwvYj4nOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5jb21wbGV0ZVdvcmtpbmdEYXlzJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZWFyICAgICAgPT4gJFllYXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vbnRoICAgICA9PiAkTW9udGhJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERheSAgICAgICA9PiAkRGF5SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2xkU3RhcnQgPT4gJEJvbGRTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbGRFbmQgICA9PiAkQm9sZEVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtJbmNvbXBsZXRlfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRWYWNhdGlvbkNoZWNrID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlZhY2F0aW9uQ2hlY2soCiAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte1dlZWtkYXl9ID0gRGF5X29mX1dlZWsoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0gKTsKICAgICAgICBpZiAoICRQYXJhbXtXZWVrZGF5fSAhPSA2ICYmICRQYXJhbXtXZWVrZGF5fSAhPSA3ICYmICEkVmFjYXRpb25DaGVjayApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ090aGVyVGltZXMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17V2Vla2RheV90b19UZXh0fSA9ICRXZWVrZGF5QXJyYXlbICRQYXJhbXtXZWVrZGF5fSAtIDEgXTsKCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICJFZGl0IiApOwogICAgICAgIGlmICggISRJbmNvbXBsZXRlV29ya2luZ0RheXN7RW5mb3JjZUluc2VydH0gKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBjcmVhdGUgcHJvamVjdCBsaW5rLCBpZiBhbGxvd2VkCiAgICAgICAgICAgIG15ICVVc2VyQmFzaWNzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJHZXQoKTsKICAgICAgICAgICAgaWYgKCAkVXNlckJhc2ljc3sgJFNlbGYtPntVc2VySUR9IH17Q3JlYXRlUHJvamVjdH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdDcmVhdGVQcm9qZWN0JywgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICAgISRQYXJhbXtSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAmJiAhJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9uVHJ1ZX0KICAgICAgICAgICAgJiYgJFBhcmFte1N1Y2Nlc3NmdWxJbnNlcnR9ICkKICAgICAgICB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoIEluZm8gPT4gJ1N1Y2Nlc3NmdWwgaW5zZXJ0IScsICk7CiAgICAgICAgfQogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ0VkaXQnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdmlldyBvbGRlciBkYXkgaW5zdGVydHMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVmlldycgKSB7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICggISRTZWxmLT57QWNjZXNzUm99ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIGZvciAocXcoRGF5IE1vbnRoIFllYXIgVXNlcklEKSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICAgICAgZm9yIChxdyhEYXkgTW9udGggWWVhcikpIHsKICAgICAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICJWaWV3OiBOZWVkICRfIiApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlmIG5vIFVzZXJJRCBwb3N0ZWQgdXNlIHRoZSBjdXJyZW50IHVzZXIKICAgICAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAgICAgJFBhcmFte1VzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgdGhlIG5hbWluZyBvZiB0aGUgYWdlbnQgd2hpY2ggdGltZSBhY2NvdW50aW5nIGlzIHZpc2l0ZWQKICAgICAgICBpZiAoICRQYXJhbXtVc2VySUR9ICE9ICRTZWxmLT57VXNlcklEfSApIHsKICAgICAgICAgICAgbXkgJVNob3duVXNlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCggVHlwZSA9PiAnTG9uZycsIFZhbGlkID0+IDEgKTsKICAgICAgICAgICAgJFBhcmFte1VzZXJ9ID0gJFNob3duVXNlcnN7ICRQYXJhbXtVc2VySUR9IH07CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17V2Vla2RheX0gICAgICAgICA9IERheV9vZl9XZWVrKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9ICk7CiAgICAgICAgJFBhcmFte1dlZWtkYXlfdG9fVGV4dH0gPSAkV2Vla2RheUFycmF5WyAkUGFyYW17V2Vla2RheX0gLSAxIF07CiAgICAgICAgJFBhcmFte01vbnRoX3RvX1RleHR9ICAgPSAkTW9udGhBcnJheVsgJFBhcmFte01vbnRofSBdOwoKICAgICAgICAjIFZhbHVlcyBmb3IgdGhlIGxpbmsgaWNvbnMgPD4KICAgICAgICAoICRQYXJhbXtZZWFyQmFja30sICRQYXJhbXtNb250aEJhY2t9LCAkUGFyYW17RGF5QmFja30gKQogICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0sIDAsIDAsIC0xICk7CiAgICAgICAgKCAkUGFyYW17WWVhck5leHR9LCAkUGFyYW17TW9udGhOZXh0fSwgJFBhcmFte0RheU5leHR9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9LCAwLCAwLCAxICk7CgogICAgICAgICRQYXJhbXtEYXRlU2VsZWN0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFByZWZpeCA9PiAnJywKICAgICAgICAgICAgRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgICk7CgogICAgICAgICMgU2hvdyBXb3JraW5nIFVuaXRzCiAgICAgICAgIyBnZXQgZXhpc3Rpbmcgd29ya2luZyB1bml0cwogICAgICAgIG15ICVEYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0dldCgKICAgICAgICAgICAgWWVhciAgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIERheSAgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtEYXRlfSA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCIsICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0gKTsKCiAgICAgICAgIyBnZXQgcHJvamVjdCBhbmQgYWN0aW9uIHNldHRpbmdzCiAgICAgICAgbXkgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgJUFjdGlvbiAgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NHZXQoKTsKICAgICAgICBteSAkRmxhZyAgICA9IDA7CiAgICAgICAgZm9yIG15ICRJRCAoIGtleXMgJURhdGEgKSB7CiAgICAgICAgICAgIGlmICggJERhdGF7JElEfXtQcm9qZWN0SUR9ICYmICREYXRheyRJRH17UHJvamVjdElEfSA9PSAtMSApIHsKICAgICAgICAgICAgICAgIGlmICggJERhdGF7JElEfXtBY3Rpb25JRH0gPT0gLTEgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0Rpc2Vhc2VkfSA9ICdjaGVja2VkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJERhdGF7JElEfXtBY3Rpb25JRH0gPT0gLTIgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0xlYXZlRGF5fSA9ICdjaGVja2VkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJERhdGF7JElEfXtBY3Rpb25JRH0gPT0gLTMgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte092ZXJ0aW1lfSA9ICdjaGVja2VkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICggISRGbGFnICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1VuaXRCbG9jaycsICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdCAgID0+ICRQcm9qZWN0e1Byb2plY3R9eyAkRGF0YXskSUR9e1Byb2plY3RJRH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgID0+ICRBY3Rpb257ICREYXRheyRJRH17QWN0aW9uSUR9IH17QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgUmVtYXJrICAgID0+ICREYXRheyRJRH17UmVtYXJrfSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRUaW1lID0+ICREYXRheyRJRH17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRW5kVGltZSAgID0+ICREYXRheyRJRH17RW5kVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFBlcmlvZCAgICA9PiAkRGF0YXskSUR9e1BlcmlvZH0sCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRGbGFnID0gMTsKICAgICAgICAgICAgICAgICRQYXJhbXtUb3RhbH0gKz0gJERhdGF7JElEfXtQZXJpb2R9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkRmxhZykgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVG90YWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFRvdGFsID0+IHNwcmludGYoICIlLjJmIiwgJFBhcmFte1RvdGFsfSApIH0KICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkUGFyYW17RGlzZWFzZWR9IHx8ICRQYXJhbXtMZWF2ZURheX0gfHwgJFBhcmFte092ZXJ0aW1lfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ090aGVyVGltZXMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGlzZWFzZWQgPT4gJFBhcmFte0Rpc2Vhc2VkfSwKICAgICAgICAgICAgICAgICAgICBMZWF2ZURheSA9PiAkUGFyYW17TGVhdmVEYXl9LAogICAgICAgICAgICAgICAgICAgIE92ZXJ0aW1lID0+ICRQYXJhbXtPdmVydGltZX0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkVmFjYXRpb24gPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VmFjYXRpb25DaGVjaygKICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICApOwoKICAgICAgICBpZiAoJFZhY2F0aW9uKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWYWNhdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgVmFjYXRpb24gPT4gJFZhY2F0aW9uIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHByZXNlbnRhdGlvbgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gIlZpZXciICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nVmlldycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWxldGUgb2JqZWN0IGZyb20gZGF0YWJhc2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGVsZXRlJyApIHsKICAgICAgICBmb3IgKHF3KERheSBNb250aCBZZWFyKSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJFNlbGYtPntBY2Nlc3NSb30gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzRGVsZXRlKAogICAgICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PgogICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kUGFyYW17WWVhcn0mTW9udGg9JFBhcmFte01vbnRofSZEYXk9JFBhcmFte0RheX0iCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBvdmVydmlldyBhYm91dCB0aGUgdXNlcnMgdGltZSBhY2NvdW50aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ092ZXJ2aWV3JyApIHsKICAgICAgICBteSAkT3V0cHV0ICAgPSAnJzsKICAgICAgICBteSAlRnJvbnRlbmQgPSAoKTsKICAgICAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkQ3VycmVudERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fQogICAgICAgICAgICAtPlN5c3RlbVRpbWUyRGF0ZSggU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksICk7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICggISRTZWxmLT57QWNjZXNzUm99ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CiAgICAgICAgZm9yIChxdyhTdGF0dXMgRGF5IE1vbnRoIFllYXIgVXNlcklEIFByb2plY3RTdGF0dXNTaG93KSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U3ViYWN0aW9ufSA9ICdFZGl0JzsKCiAgICAgICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17VXNlcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0gJiYgISRTZWxmLT57QWNjZXNzUnd9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte1N1YmFjdGlvbn0gPSAnVmlldyc7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRQYXJhbXtVc2VySUR9ICE9ICRTZWxmLT57VXNlcklEfSApIHsKICAgICAgICAgICAgbXkgJVNob3duVXNlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCggVHlwZSA9PiAnTG9uZycsIFZhbGlkID0+IDEgKTsKICAgICAgICAgICAgJFBhcmFte1VzZXJ9ID0gJFNob3duVXNlcnN7ICRQYXJhbXtVc2VySUR9IH07CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIERhdGUKICAgICAgICBpZiAoICEkUGFyYW17WWVhcn0gfHwgISRQYXJhbXtNb250aH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtZZWFyfSAgPSAkWWVhcjsKICAgICAgICAgICAgJFBhcmFte01vbnRofSA9ICRNb250aDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtNb250aH0gKTsKICAgICAgICB9CgogICAgICAgICMgc3RvcmUgbGFzdCBzY3JlZW4KICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbicsCiAgICAgICAgICAgIFZhbHVlID0+CiAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249T3ZlcnZpZXcmWWVhcj0kUGFyYW17WWVhcn0mTW9udGg9JFBhcmFte01vbnRofSIsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte01vbnRoX3RvX1RleHR9ID0gJE1vbnRoQXJyYXlbICRQYXJhbXtNb250aH0gXTsKCiAgICAgICAgKCAkUGFyYW17WWVhckJhY2t9LCAkUGFyYW17TW9udGhCYWNrfSwgJFBhcmFte0RheUJhY2t9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sIDEsIDAsIC0xLCAwICk7CiAgICAgICAgKCAkUGFyYW17WWVhck5leHR9LCAkUGFyYW17TW9udGhOZXh0fSwgJFBhcmFte0RheU5leHR9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sIDEsIDAsIDEsIDAgKTsKCiAgICAgICAgIyBPdmVydmlldyBwZXIgZGF5CiAgICAgICAgbXkgJERheXNPZk1vbnRoID0gRGF5c19pbl9Nb250aCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9ICk7CgogICAgICAgIGZvciAoIG15ICREYXkgPSAxOyAkRGF5IDw9ICREYXlzT2ZNb250aDsgJERheSsrICkgewogICAgICAgICAgICAkUGFyYW17RGF5fSA9IHNwcmludGYoICIlMDJkIiwgJERheSApOwogICAgICAgICAgICAkUGFyYW17V2Vla2RheX0gPSBEYXlfb2ZfV2VlayggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkRGF5ICkgLSAxOwogICAgICAgICAgICBteSAkVmFjYXRpb25DaGVjayA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5WYWNhdGlvbkNoZWNrKAogICAgICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgICAgIERheSAgID0+ICREYXksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtZZWFyfSBlcSAkWWVhciAmJiAkUGFyYW17TW9udGh9IGVxICRNb250aCAmJiAkQ3VycmVudERheSBlcSAkRGF5ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1N0eWxlfSA9ICdiZ2NvbG9yPSJvcmFuZ2UiJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJFZhY2F0aW9uQ2hlY2spIHsKICAgICAgICAgICAgICAgICRQYXJhbXtTdHlsZX0gICA9ICdiZ2NvbG9yPSIjRUJDQ0NDIic7CiAgICAgICAgICAgICAgICAkUGFyYW17Q29tbWVudH0gPSAkVmFjYXRpb25DaGVjazsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtXZWVrZGF5fSA9PSA2IHx8ICRQYXJhbXtXZWVrZGF5fSA9PSA1ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1N0eWxlfSA9ICdiZ2NvbG9yPSIjRkZFMEUwIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17U3R5bGV9ID0gJ2JnY29sb3I9IiNFNUYwRkYiJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzR2V0KAogICAgICAgICAgICAgICAgWWVhciAgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgICAgIE1vbnRoICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICAgICAgRGF5ICAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFdvcmtpbmdIb3VycyA9IDA7CiAgICAgICAgICAgIG15ICVPdGhlclRpbWUgICAgPSAoKTsKICAgICAgICAgICAgJE90aGVyVGltZXsnLTEnfSA9ICdEaXNlYXNlZCc7CiAgICAgICAgICAgICRPdGhlclRpbWV7Jy0yJ30gPSAnTGVhdmVEYXknOwogICAgICAgICAgICAkT3RoZXJUaW1leyctMyd9ID0gJ092ZXJ0aW1lJzsKICAgICAgICAgICAgZm9yIG15ICRJRCAoIGtleXMgJURhdGEgKSB7CiAgICAgICAgICAgICAgICAkV29ya2luZ0hvdXJzICs9ICREYXRheyRJRH17UGVyaW9kfTsKICAgICAgICAgICAgICAgIGlmICggJERhdGF7JElEfXtQcm9qZWN0SUR9ID09IC0xICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtDb21tZW50fSA9ICRPdGhlclRpbWV7ICREYXRheyRJRH17QWN0aW9uSUR9IH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRXb3JraW5nSG91cnMpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtXb3JraW5nSG91cnN9ID0gc3ByaW50ZiggIiUuMmYiLCAkV29ya2luZ0hvdXJzICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17V29ya2luZ0hvdXJzfSA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW17V2Vla2RheV90b19UZXh0fSA9ICRXZWVrZGF5QXJyYXlbICRQYXJhbXtXZWVrZGF5fSBdOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtDb21tZW50fSA9ICcnOwogICAgICAgIH0KCiAgICAgICAgbXkgJVVzZXJSZXBvcnQgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclJlcG9ydGluZygKICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICk7CiAgICAgICAgZm9yICgKICAgICAgICAgICAgcXcoVGFyZ2V0U3RhdGUgVGFyZ2V0U3RhdGVUb3RhbCBXb3JraW5nSG91cnNUb3RhbCBXb3JraW5nSG91cnMKICAgICAgICAgICAgT3ZlcnRpbWUgT3ZlcnRpbWVUb3RhbCBPdmVydGltZVVudGlsIExlYXZlRGF5IExlYXZlRGF5VG90YWwKICAgICAgICAgICAgTGVhdmVEYXlSZW1haW5pbmcgRGlzZWFzZWQgRGlzZWFzZWRUb3RhbCBEaXNlYXNlZFJlbWFpbmluZykKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCAhJFVzZXJSZXBvcnR7ICRQYXJhbXtVc2VySUR9IH17JF99ICkgewogICAgICAgICAgICAgICAgJFVzZXJSZXBvcnR7ICRQYXJhbXtVc2VySUR9IH17JF99ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17JF99ID0gc3ByaW50ZiggIiUuMmYiLCAkVXNlclJlcG9ydHsgJFBhcmFte1VzZXJJRH0gfXskX30gKTsKICAgICAgICB9CgogICAgICAgICMgU2hvdyBPdmVydGltZSBpZiBhbGxvd2VkCiAgICAgICAgbXkgJVVzZXJCYXNpY3MgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckdldCgpOwogICAgICAgIGlmICggJFVzZXJCYXNpY3N7ICRQYXJhbXtVc2VySUR9IH17U2hvd092ZXJ0aW1lfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ0aW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBPdmVydmlldyBwZXIgcHJvamVjdCBhbmQgYWN0aW9uCiAgICAgICAgbXkgJVByb2plY3REYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RBY3Rpb25SZXBvcnRpbmcoCiAgICAgICAgICAgIFllYXIgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IHRoZSByZXBvcnQgc29ydCBieSBwcm9qZWN0cwogICAgICAgIGlmICggISRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gfHwgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAndmFsaWQnICkgewogICAgICAgICAgICAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9ID0gJ2FsbCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAnYWxsJyApIHsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSA9ICd2YWxpZCc7CiAgICAgICAgfQoKICAgICAgICBteSAlUHJvamVjdCA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NHZXQoKTsKICAgICAgICBteSAlQWN0aW9uICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwogICAgICAgIGZvciBteSAkUHJvamVjdElEICgKICAgICAgICAgICAgc29ydCB7ICRQcm9qZWN0e1Byb2plY3R9eyRhfSBjbXAgJFByb2plY3R7UHJvamVjdH17JGJ9IH0KICAgICAgICAgICAga2V5cyAleyAkUHJvamVjdHtQcm9qZWN0fSB9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggJFByb2plY3REYXRhe1RvdGFsfXskUHJvamVjdElEfSApIHsKICAgICAgICAgICAgICAgIGlmICggJFByb2plY3RJRCBuZSAnLTEnICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0fSA9ICcnOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtDbGFzc30gICA9ICdjb250ZW50dmFsdWUnOwogICAgICAgICAgICAgICAgICAgIGlmICggJFByb2plY3R7UHJvamVjdFN0YXR1c317JFByb2plY3RJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtTdGF0dXN9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17U3RhdHVzfSA9ICdwYXNzaXYnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBteSAkVG90YWwgICAgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJFRvdGFsVG90YWwgPSAwOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICggJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAnYWxsJyAmJiAhJFBhcmFte1N0YXR1c30gKQogICAgICAgICAgICAgICAgICAgICAgICB8fCAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IGVxICd2YWxpZCcgKQogICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWN0aW9uIHNvcnQgd3JhcHBlciAtIGJlIGNhcmVmdWwgaXRzIG5vdCBzaW11bGFyIHdpdGggcHJvamVjdCEhCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVTb3J0ZWRBY3Rpb25zID0gKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBrZXlzICV7ICRQcm9qZWN0RGF0YXtUb3RhbH17JFByb2plY3RJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTb3J0ZWRBY3Rpb25zeyRBY3Rpb25JRH0gPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtSb3dTcGFufSsrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkQWN0aW9uSUQgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydCB7ICRTb3J0ZWRBY3Rpb25zeyRhfSBjbXAgJFNvcnRlZEFjdGlvbnN7JGJ9IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJVNvcnRlZEFjdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmb3JlYWNoIG15ICRBY3Rpb25JRCAoa2V5cyAleyRQcm9qZWN0RGF0YXtUb3RhbH17JFByb2plY3RJRH19KSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0FjdGlvbn0gPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc30gID0gc3ByaW50ZiggIiUuMmYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQcm9qZWN0RGF0YXtQZXJNb250aH17JFByb2plY3RJRH17JEFjdGlvbklEfXtIb3Vyc30gfHwgMCApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzVG90YWx9ID0gc3ByaW50ZiggIiUuMmYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQcm9qZWN0RGF0YXtUb3RhbH17JFByb2plY3RJRH17JEFjdGlvbklEfXtIb3Vyc30gfHwgMCApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRvdGFsICAgICAgKz0gJFBhcmFte0hvdXJzfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUb3RhbFRvdGFsICs9ICRQYXJhbXtIb3Vyc1RvdGFsfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17UHJvamVjdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2plY3R9ICAgICAgICAgICAgPSAkUHJvamVjdHtQcm9qZWN0fXskUHJvamVjdElEfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvamVjdERlc2NyaXB0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFByb2plY3R7UHJvamVjdERlc2NyaXB0aW9ufXskUHJvamVjdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3TGluZSAgICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Um93U3Bhbn0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRVc2VyQmFzaWNzeyAkU2VsZi0+e1VzZXJJRH0gfXtDcmVhdGVQcm9qZWN0fSApIHsKCiAgICAjIHBlcnNvbnMgaG93IGFyZSBhbGxvd2VkIHRvIHNlZSB0aGUgY3JlYXRlIG9iamVjdCBsaW5rIGFyZSBhbGxvd2VkIHRvIHNlZSB0aGUgcHJvamVjdCByZXBvcnRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2plY3RMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QgICA9PiAkUGFyYW17UHJvamVjdH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdElEID0+ICRQcm9qZWN0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2plY3ROb0xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7IFByb2plY3QgPT4gJFBhcmFte1Byb2plY3R9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Um93U3Bhbn0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtDbGFzc30gICAgICA9ICdjb250ZW50a2V5JzsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0FjdGlvbn0gICAgID0gJ1RvdGFsJzsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzfSAgICAgID0gc3ByaW50ZiggIiUuMmYiLCAkVG90YWwgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzVG90YWx9ID0gc3ByaW50ZiggIiUuMmYiLCAkVG90YWxUb3RhbCApOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gICAgICArPSAkVG90YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ICs9ICRUb3RhbFRvdGFsOwogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Q2xhc3N9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggZGVmaW5lZCggJFBhcmFte1RvdGFsSG91cnN9ICkgKSB7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzfSA9IHNwcmludGYoICIlLjJmIiwgJFBhcmFte1RvdGFsSG91cnN9ICk7CiAgICAgICAgfQogICAgICAgIGlmICggZGVmaW5lZCggJFBhcmFte1RvdGFsSG91cnNUb3RhbH0gKSApIHsKICAgICAgICAgICAgJFBhcmFte1RvdGFsSG91cnNUb3RhbH0gPSBzcHJpbnRmKCAiJS4yZiIsICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gIk92ZXJ2aWV3IiApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nT3ZlcnZpZXcnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2V0dGluZ3MgZm9yIGhhbmRsaW5nIHRpbWUgYWNjb3VudGluZwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZXR0aW5nJyApIHsKICAgICAgICBteSAkT3V0cHV0ICAgICA9ICcnOwogICAgICAgIG15ICVGcm9udGVuZCAgID0gKCk7CiAgICAgICAgbXkgJUFjdGlvbiAgICAgPSAoKTsKICAgICAgICBteSAlU3RhdHVzTGlzdCA9ICgpOwogICAgICAgIG15ICVVc2VyICAgICAgID0gKCk7CiAgICAgICAgbXkgJURhdGEgICAgICAgPSAoKTsKICAgICAgICBteSAlVXNlckJhc2ljcyA9ICgpOwogICAgICAgIGZvciAocXcoQWN0aW9uQWN0aW9uIEFjdGlvblVzZXIgTmV3QWN0aW9uIE5ld1VzZXIpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgfQoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoICEkU2VsZi0+e0FjY2Vzc1J3fSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdTZXR0aW5nJywgKTsKCiAgICAgICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuJywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1TZXR0aW5nIiwKICAgICAgICApOwoKICAgICAgICBpZiAoICRQYXJhbXtBY3Rpb25BY3Rpb259IHx8ICRQYXJhbXtOZXdBY3Rpb259ICkgewogICAgICAgICAgICAlQWN0aW9uID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICAgICAgICAgIG15ICRBY3Rpb25FbXB0eSA9IDA7CiAgICAgICAgICAgIG15ICVBY3Rpb25DaGVjayA9ICgpOwogICAgICAgICAgICBmb3IgbXkgJEFjdGlvbklEICgga2V5cyAlQWN0aW9uICkgewogICAgICAgICAgICAgICAgZm9yIChxdyhBY3Rpb24gQWN0aW9uU3RhdHVzKSkgewogICAgICAgICAgICAgICAgICAgICREYXRheyRBY3Rpb25JRH17JF99CiAgICAgICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyAuICdbJyAuICRBY3Rpb25JRCAuICddJyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAhJERhdGF7JEFjdGlvbklEfXtBY3Rpb259ICkgewogICAgICAgICAgICAgICAgICAgICRBY3Rpb25FbXB0eSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICAgJERhdGF7JEFjdGlvbklEfXtBY3Rpb259CiAgICAgICAgICAgICAgICAgICAgJiYgJEFjdGlvbkNoZWNreyAkRGF0YXskQWN0aW9uSUR9e0FjdGlvbn0gfQogICAgICAgICAgICAgICAgICAgICYmICRBY3Rpb25DaGVja3sgJERhdGF7JEFjdGlvbklEfXtBY3Rpb259IH0gPT0gMSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAtPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdUaGUgYWN0aW9ubmFtaW5nIG11c3QgYmUgdW5pcXVlIScgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRBY3Rpb25DaGVja3sgJERhdGF7JEFjdGlvbklEfXtBY3Rpb259IH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc1VwZGF0ZSglRGF0YSkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnQ2FuXCd0IHVwZGF0ZSBhY3Rpb24gZGF0YSEnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUGFyYW17TmV3QWN0aW9ufSAmJiAhJEFjdGlvbkVtcHR5ICkgewogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzSW5zZXJ0KCkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAtPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdDYW5cJ3QgaW5zZXJ0IGFjdGlvbiBkYXRhIScgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJVVzZXIgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclNldHRpbmdzR2V0KCk7CiAgICAgICAgICAgIG15ICVMYXN0UGVyaW9kID0gKCk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlVXNlciApIHsKICAgICAgICAgICAgICAgICRMYXN0UGVyaW9keyRVc2VySUR9ID0gMDsKICAgICAgICAgICAgICAgIGZvciBteSAkUGVyaW9kICgga2V5cyAleyAkVXNlcnskVXNlcklEfSB9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJExhc3RQZXJpb2R7JFVzZXJJRH0gPCAkUGVyaW9kICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTGFzdFBlcmlvZHskVXNlcklEfSA9ICRQZXJpb2Q7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXdVc2VyU2V0dGluZ1snIC4gJFVzZXJJRCAuICddJyApICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAlSW5zZXJ0RGF0YSA9ICgpOwogICAgICAgICAgICAgICAgICAgICRJbnNlcnREYXRhe1VzZXJJRH0gPSAkVXNlcklEOwogICAgICAgICAgICAgICAgICAgICRJbnNlcnREYXRhe1BlcmlvZH0gPSAkTGFzdFBlcmlvZHskVXNlcklEfSArIDE7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0FjdGlvblVzZXJ9ICA9ICd0cnVlJzsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclNldHRpbmdzSW5zZXJ0KCVJbnNlcnREYXRhKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnQ2FuXCd0IGluc2VydCB1c2VyIGRhdGEhJyApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQYXJhbXtBY3Rpb25Vc2VyfSB8fCAkUGFyYW17TmV3VXNlcn0gKSB7CiAgICAgICAgICAgICAgICAlVXNlckJhc2ljcyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyR2V0KCk7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJVVzZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChxdyhTaG93T3ZlcnRpbWUgQ3JlYXRlUHJvamVjdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17JF99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gLiAnWycgLiAkVXNlcklEIC4gJ10nICk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAkQnJlYWsgPSAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoICAgJFVzZXJCYXNpY3N7JFVzZXJJRH17RGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc2NyaXB0aW9uWycgLiAkVXNlcklEIC4gJ10nICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEJyZWFrID0gIlxuIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJERlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzY3JpcHRpb25bJyAuICRVc2VySUQgLiAnXScgKTsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtEZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgPSAkVXNlckJhc2ljc3skVXNlcklEfXtEZXNjcmlwdGlvbn0gLiAkQnJlYWsgLiAkRGVzY3JpcHRpb247CgogICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e1VzZXJJRH0gPSAkVXNlcklEOwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGVyaW9kICgga2V5cyAleyAkVXNlcnskVXNlcklEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHF3KFdlZWtseUhvdXJzIExlYXZlRGF5cyBVc2VyU3RhdHVzIERhdGVTdGFydCBEYXRlRW5kIE92ZXJ0aW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17JFBlcmlvZH17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldFBhcmFtKCBQYXJhbSA9PiAkXyAuICdbJyAuICRVc2VySUQgLiAnXVsnIC4gJFBlcmlvZCAuICddJyApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9eyRQZXJpb2R9e1VzZXJJRH0gPSAkVXNlcklEOwogICAgICAgICAgICAgICAgICAgICAgICAkTGFzdFBlcmlvZHskVXNlcklEfSA9ICRQZXJpb2Q7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJTZXR0aW5nc1VwZGF0ZSglRGF0YSkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAtPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdDYW5cJ3QgdXBkYXRlIHVzZXIgZGF0YSEnICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17TmV3VXNlcn0gJiYgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV3VXNlcklEJyApICkgewogICAgICAgICAgICAgICAgICAgICVEYXRhID0gKCk7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7VXNlcklEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05ld1VzZXJJRCcgKTsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtQZXJpb2R9ID0gJzEnOwogICAgICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyU2V0dGluZ3NJbnNlcnQoJURhdGEpICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdDYW5cJ3QgaW5zZXJ0IHVzZXIgZGF0YSEnICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICVHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMaXN0KCBWYWxpZCA9PiAxICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJUdyb3VwRGF0YSA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkRGF0YXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGZvciAoIGtleXMgJUdyb3VwcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR3JvdXBzeyRffSBlcSAndGltZV9hY2NvdW50aW5nJyAmJiAhJEdyb3VwRGF0YXskX30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyQWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkRGF0YXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZV9pbnRvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lciAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ3ICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgU2hvdyBUaW1lQWNjb3VudGluZyBQcmVmZXJlbmNlcwogICAgICAgICRTdGF0dXNMaXN0ezF9ID0gJ3ZhbGlkJzsKICAgICAgICAkU3RhdHVzTGlzdHswfSA9ICdpbnZhbGlkJzsKCiAgICAgICAgIyBTaG93IGFjdGlvbiBkYXRhCiAgICAgICAgJUFjdGlvbiA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwogICAgICAgIG15ICRBY3Rpb25FbXB0eSA9IDA7CiAgICAgICAgbXkgJVNvcnRBY3Rpb24gID0gKCk7CiAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIGtleXMgJUFjdGlvbiApIHsKICAgICAgICAgICAgJFNvcnRBY3Rpb257JEFjdGlvbklEfSA9ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJEFjdGlvbklEICggc29ydCB7ICRTb3J0QWN0aW9ueyRhfSBjbXAgJFNvcnRBY3Rpb257JGJ9IH0ga2V5cyAlU29ydEFjdGlvbiApIHsKICAgICAgICAgICAgJFBhcmFte0FjdGlvbn0gICA9ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgICAgICAgICAkUGFyYW17QWN0aW9uSUR9ID0gJEFjdGlvbklEOwoKICAgICAgICAgICAgJEZyb250ZW5keydTdGF0dXNPcHRpb24nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU3RhdHVzTGlzdCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvblN0YXR1c30gfHwgJycsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICJBY3Rpb25TdGF0dXNbJFBhcmFte0FjdGlvbklEfV0iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgU2hvdyB1c2VyIGRhdGEKICAgICAgICAlVXNlciAgICAgICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyU2V0dGluZ3NHZXQoKTsKICAgICAgICAlVXNlckJhc2ljcyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyR2V0KCk7CiAgICAgICAgbXkgJVNob3duVXNlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCggVHlwZSA9PiAnTG9uZycsIFZhbGlkID0+IDEgKTsKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQgeyAkU2hvd25Vc2Vyc3skYX0gY21wICRTaG93blVzZXJzeyRifSB9IGtleXMgJVNob3duVXNlcnMgKSB7CiAgICAgICAgICAgIGlmICggJFVzZXJ7JFVzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17VXNlcn0gICA9ICRTaG93blVzZXJzeyRVc2VySUR9OwogICAgICAgICAgICAgICAgJFBhcmFte1VzZXJJRH0gPSAkVXNlcklEOwoKICAgICAgICAgICAgICAgIG15ICREZXNjcmlwdGlvbiA9ICcnOwogICAgICAgICAgICAgICAgaWYgKCAkVXNlckJhc2ljc3skVXNlcklEfXtEZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJERlc2NyaXB0aW9uID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkVXNlckJhc2ljc3skVXNlcklEfXtEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIE5ld0xpbmUgICAgICAgID0+IDUwLAogICAgICAgICAgICAgICAgICAgICkgLiAiPGJyPiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkVXNlckJhc2ljc3skVXNlcklEfXtTaG93T3ZlcnRpbWV9ICkgewogICAgICAgICAgICAgICAgICAgICRVc2VyQmFzaWNzeyRVc2VySUR9e1Nob3dPdmVydGltZX0gPSAiY2hlY2tlZCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRVc2VyQmFzaWNzeyRVc2VySUR9e0NyZWF0ZVByb2plY3R9ICkgewogICAgICAgICAgICAgICAgICAgICRVc2VyQmFzaWNzeyRVc2VySUR9e0NyZWF0ZVByb2plY3R9ID0gImNoZWNrZWQiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwgJUZyb250ZW5kLAogICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICREZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgU2hvd092ZXJ0aW1lICA9PiAkVXNlckJhc2ljc3skVXNlcklEfXtTaG93T3ZlcnRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVQcm9qZWN0ID0+ICRVc2VyQmFzaWNzeyRVc2VySUR9e0NyZWF0ZVByb2plY3R9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGRlbGV0ZSAkU2hvd25Vc2Vyc3skVXNlcklEfTsKICAgICAgICAgICAgICAgIGZvciBteSAkUGVyaW9kICggc29ydCBrZXlzICV7ICRVc2VyeyRVc2VySUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1dlZWtseUhvdXJzfSA9ICRVc2VyeyRVc2VySUR9eyRQZXJpb2R9e1dlZWtseUhvdXJzfTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17TGVhdmVEYXlzfSAgID0gJFVzZXJ7JFVzZXJJRH17JFBlcmlvZH17TGVhdmVEYXlzfTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17T3ZlcnRpbWV9ICAgID0gJFVzZXJ7JFVzZXJJRH17JFBlcmlvZH17T3ZlcnRpbWV9OwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRlU3RhcnR9ICAgPSAkVXNlcnskVXNlcklEfXskUGVyaW9kfXtEYXRlU3RhcnR9OwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRlRW5kfSAgICAgPSAkVXNlcnskVXNlcklEfXskUGVyaW9kfXtEYXRlRW5kfTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UGVyaW9kfSAgICAgID0gJFBlcmlvZDsKCiAgICAgICAgICAgICAgICAgICAgJEZyb250ZW5keydTdGF0dXNPcHRpb24nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTdGF0dXNMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRVc2VyeyRVc2VySUR9eyRQZXJpb2R9e1VzZXJTdGF0dXN9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICJVc2VyU3RhdHVzWyRVc2VySURdWyRQZXJpb2RdIiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQZXJpb2QnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJVNob3duVXNlcnMpIHsKICAgICAgICAgICAgJFNob3duVXNlcnN7Jyd9ICAgICAgICAgICAgPSAnJzsKICAgICAgICAgICAgJEZyb250ZW5keydOZXdVc2VyT3B0aW9uJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAiTmV3VXNlcklEIiwKICAgICAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ05ld1VzZXJPcHRpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gIlNldHRpbmciICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdTZXR0aW5nJwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNldHRpbmdzIGZvciBoYW5kbGluZyB0aW1lIGFjY291bnRpbmcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnUHJvamVjdFNldHRpbmcnICkgewogICAgICAgIG15ICRPdXRwdXQgICAgID0gJyc7CiAgICAgICAgbXkgJUZyb250ZW5kICAgPSAoKTsKICAgICAgICBteSAlUHJvamVjdCAgICA9ICgpOwogICAgICAgIG15ICVTdGF0dXNMaXN0ID0gKCk7CiAgICAgICAgbXkgJURhdGEgICAgICAgPSAoKTsKICAgICAgICBmb3IgKHF3KEFjdGlvblByb2plY3QgTmV3UHJvamVjdCkpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICB9CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICggISRTZWxmLT57QWNjZXNzUm99ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1Byb2plY3RTZXR0aW5nJywgKTsKCiAgICAgICAgIyBFZGl0IFRpbWVBY2NvdW50aW5nIFByZWZlcmVuY2VzCiAgICAgICAgaWYgKCAkUGFyYW17QWN0aW9uUHJvamVjdH0gfHwgJFBhcmFte05ld1Byb2plY3R9ICkgewogICAgICAgICAgICAlUHJvamVjdCA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NHZXQoKTsKICAgICAgICAgICAgbXkgJFByb2plY3RFbXB0eSA9IDA7CiAgICAgICAgICAgIG15ICVQcm9qZWN0Q2hlY2sgPSAoKTsKICAgICAgICAgICAgZm9yIG15ICRQcm9qZWN0SUQgKCBrZXlzICV7ICRQcm9qZWN0e1Byb2plY3R9IH0gKSB7CiAgICAgICAgICAgICAgICBmb3IgKHF3KFByb2plY3QgUHJvamVjdFN0YXR1cyBQcm9qZWN0RGVzY3JpcHRpb24pKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFByb2plY3RJRH17JF99CiAgICAgICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyAuICdbJyAuICRQcm9qZWN0SUQgLiAnXScgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggISREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9ICkgewogICAgICAgICAgICAgICAgICAgICRQcm9qZWN0RW1wdHkgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAgICREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9CiAgICAgICAgICAgICAgICAgICAgJiYgJFByb2plY3RDaGVja3sgJERhdGF7JFByb2plY3RJRH17UHJvamVjdH0gfQogICAgICAgICAgICAgICAgICAgICYmICRQcm9qZWN0Q2hlY2t7ICREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9IH0gPT0gMSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fQogICAgICAgICAgICAgICAgICAgICAgICAtPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdUaGUgcHJvamVjdG5hbWluZyBtdXN0IGJlIHVuaXF1ZSEnICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkUHJvamVjdENoZWNreyAkRGF0YXskUHJvamVjdElEfXtQcm9qZWN0fSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc1VwZGF0ZSglRGF0YSkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnQ2FuXCd0IHVwZGF0ZSBwcm9qZWN0IGRhdGEhJyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFBhcmFte05ld1Byb2plY3R9ICYmICEkUHJvamVjdEVtcHR5ICkgewogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0luc2VydCgpICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgLT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnQ2FuXCd0IGluc2VydCBwcm9qZWN0IGRhdGEhJyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIFNob3cgVGltZUFjY291bnRpbmcgUHJlZmVyZW5jZXMKICAgICAgICAkU3RhdHVzTGlzdHsxfSA9ICd2YWxpZCc7CiAgICAgICAgJFN0YXR1c0xpc3R7MH0gPSAnaW52YWxpZCc7CgogICAgICAgICMgU2hvdyBwcm9qZWN0IGRhdGEKICAgICAgICAlUHJvamVjdCA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NHZXQoKTsKICAgICAgICBteSAkUHJvamVjdEVtcHR5ID0gMDsKICAgICAgICBmb3IgbXkgJFByb2plY3RJRCAoCiAgICAgICAgICAgIHNvcnQgeyAkUHJvamVjdHtQcm9qZWN0fXskYX0gY21wICRQcm9qZWN0e1Byb2plY3R9eyRifSB9CiAgICAgICAgICAgIGtleXMgJXsgJFByb2plY3R7UHJvamVjdH0gfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgJFBhcmFte1Byb2plY3R9ICAgICAgICAgICAgPSAkUHJvamVjdHtQcm9qZWN0fXskUHJvamVjdElEfTsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3REZXNjcmlwdGlvbn0gPSAkUHJvamVjdHtQcm9qZWN0RGVzY3JpcHRpb259eyRQcm9qZWN0SUR9OwogICAgICAgICAgICAkUGFyYW17UHJvamVjdElEfSAgICAgICAgICA9ICRQcm9qZWN0SUQ7CgogICAgICAgICAgICAkRnJvbnRlbmR7J1N0YXR1c09wdGlvbid9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTdGF0dXNMaXN0LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUHJvamVjdHtQcm9qZWN0U3RhdHVzfXskUHJvamVjdElEfSB8fCAnJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gIlByb2plY3RTdGF0dXNbJFBhcmFte1Byb2plY3RJRH1dIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICJTZXR0aW5nIiApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nU2V0dGluZycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0aW1lIGFjY291bnRpbmcgcmVwb3J0aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1JlcG9ydGluZycgKSB7CiAgICAgICAgbXkgJE91dHB1dCAgICAgPSAnJzsKICAgICAgICBteSAlRnJvbnRlbmQgICA9ICgpOwogICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoIFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAwICk7CiAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJEN1cnJlbnREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0KICAgICAgICAgICAgLT5TeXN0ZW1UaW1lMkRhdGUoIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLCApOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoICEkU2VsZi0+e0FjY2Vzc1J3fSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQogICAgICAgIGZvciAocXcoU3RhdHVzIE1vbnRoIFllYXIgUHJvamVjdFN0YXR1c1Nob3cpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIERhdGUKICAgICAgICBpZiAoICEkUGFyYW17WWVhcn0gfHwgISRQYXJhbXtNb250aH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtZZWFyfSAgPSAkWWVhcjsKICAgICAgICAgICAgJFBhcmFte01vbnRofSA9ICRNb250aDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtNb250aH0gKTsKICAgICAgICB9CgogICAgICAgICMgc3RvcmUgbGFzdCBzY3JlZW4KICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbicsCiAgICAgICAgICAgIFZhbHVlID0+CiAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249UmVwb3J0aW5nJlllYXI9JFBhcmFte1llYXJ9Jk1vbnRoPSRQYXJhbXtNb250aH0iLAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtNb250aF90b19UZXh0fSA9ICRNb250aEFycmF5WyAkUGFyYW17TW9udGh9IF07CgogICAgICAgIG15ICVNb250aCA9ICgpOwogICAgICAgIGZvciAoIG15ICRJRCA9IDE7ICRJRCA8PSAxMjsgJElEKysgKSB7CiAgICAgICAgICAgICRNb250aHsgc3ByaW50ZiggIiUwMmQiLCAkSUQgKSB9eydWYWx1ZSd9ICAgID0gJE1vbnRoQXJyYXlbJElEXTsKICAgICAgICAgICAgJE1vbnRoeyBzcHJpbnRmKCAiJTAyZCIsICRJRCApIH17J1Bvc2l0aW9uJ30gPSAkSUQ7CiAgICAgICAgICAgIGlmICggJFBhcmFte01vbnRofSA9PSAkSUQgKSB7CiAgICAgICAgICAgICAgICAkTW9udGh7IHNwcmludGYoICIlMDJkIiwgJElEICkgfXsnU2VsZWN0ZWQnfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRGcm9udGVuZHsnTW9udGhPcHRpb24nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uRWxlbWVudCgKICAgICAgICAgICAgRGF0YSA9PiBcJU1vbnRoLAogICAgICAgICAgICBOYW1lID0+ICJNb250aCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVllYXIgPSAoKTsKCiAgICAgICAgIyBGSVhNRSB0aGUgcmFuZ2Ugc2hvdWxkIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseQogICAgICAgICMgRnVydGhlciwgaGVyZSBJIGNhbiB1c2UgdGhlIG1hcCBmdW5jdGlvbgogICAgICAgIGZvciAoIG15ICRJRCA9IDIwMDU7ICRJRCA8PSAyMDA4OyAkSUQrKyApIHsKICAgICAgICAgICAgJFllYXJ7JElEfSA9ICRJRDsKICAgICAgICB9CiAgICAgICAgJEZyb250ZW5keydZZWFyT3B0aW9uJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgID0+IFwlWWVhciwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgICAgICA9PiAkUGFyYW17WWVhcn0gfHwgJycsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gIlllYXIiLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgKCAkUGFyYW17WWVhckJhY2t9LCAkUGFyYW17TW9udGhCYWNrfSwgJFBhcmFte0RheUJhY2t9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sIDEsIDAsIC0xLCAwICk7CiAgICAgICAgKCAkUGFyYW17WWVhck5leHR9LCAkUGFyYW17TW9udGhOZXh0fSwgJFBhcmFte0RheU5leHR9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sIDEsIDAsIDEsIDAgKTsKCiAgICAgICAgbXkgJVVzZXJSZXBvcnQgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclJlcG9ydGluZygKICAgICAgICAgICAgWWVhciAgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAlVXNlckJhc2ljcyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyR2V0KCk7CiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IHsgJFNob3duVXNlcnN7JGF9IGNtcCAkU2hvd25Vc2Vyc3skYn0gfSBrZXlzICVTaG93blVzZXJzICkgewogICAgICAgICAgICBpZiAoICRVc2VyUmVwb3J0eyRVc2VySUR9ICkgewogICAgICAgICAgICAgICAgZm9yIChxdyhMZWF2ZURheSBPdmVydGltZSBXb3JraW5nSG91cnMgRGlzZWFzZWQgTGVhdmVEYXlSZW1haW5pbmcgT3ZlcnRpbWVUb3RhbCkpIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17JF99ID0gc3ByaW50ZiggIiUuMmYiLCAkVXNlclJlcG9ydHskVXNlcklEfXskX30gKTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17ICdUb3RhbCcgLiAkXyB9ICs9ICRQYXJhbXskX307CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBTaG93IE92ZXJ0aW1lIGlmIGFsbG93ZWQKICAgICAgICAgICAgICAgIGlmICggISRVc2VyQmFzaWNzeyRVc2VySUR9e1Nob3dPdmVydGltZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte092ZXJ0aW1lfSAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte092ZXJ0aW1lVG90YWx9ID0gJyc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFBhcmFte1VzZXJ9ICAgPSAkU2hvd25Vc2Vyc3skVXNlcklEfTsKICAgICAgICAgICAgICAgICRQYXJhbXtVc2VySUR9ID0gJFVzZXJJRDsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoCiAgICAgICAgICAgIHF3KFRvdGFsTGVhdmVEYXkgVG90YWxPdmVydGltZSBUb3RhbFdvcmtpbmdIb3VycwogICAgICAgICAgICBUb3RhbERpc2Vhc2VkIFRvdGFsTGVhdmVEYXlSZW1haW5pbmcgVG90YWxPdmVydGltZVRvdGFsKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17JF99ID0gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17JF99ICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgdGhlIHJlcG9ydCBzb3J0IGJ5IHByb2plY3RzCiAgICAgICAgaWYgKCAhJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSB8fCAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IGVxICd2YWxpZCcgKSB7CiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gPSAnYWxsJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IGVxICdhbGwnICkgewogICAgICAgICAgICAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9ID0gJ3ZhbGlkJzsKICAgICAgICB9CgogICAgICAgIG15ICVQcm9qZWN0RGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0QWN0aW9uUmVwb3J0aW5nKAogICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgJUFjdGlvbiAgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NHZXQoKTsKICAgICAgICBmb3IgbXkgJFByb2plY3RJRCAoCiAgICAgICAgICAgIHNvcnQgeyAkUHJvamVjdHtQcm9qZWN0fXskYX0gY21wICRQcm9qZWN0e1Byb2plY3R9eyRifSB9CiAgICAgICAgICAgIGtleXMgJXsgJFByb2plY3R7UHJvamVjdH0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBpZiAoICRQcm9qZWN0RGF0YXtUb3RhbH17JFByb2plY3RJRH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRQcm9qZWN0SUQgbmUgJy0xJyApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvamVjdH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17Q2xhc3N9ICAgPSAnY29udGVudHZhbHVlJzsKICAgICAgICAgICAgICAgICAgICBpZiAoICRQcm9qZWN0e1Byb2plY3RTdGF0dXN9eyRQcm9qZWN0SUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17U3RhdHVzfSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1N0YXR1c30gPSAncGFzc2l2JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJFRvdGFsICAgICAgPSAwOwogICAgICAgICAgICAgICAgICAgIG15ICRUb3RhbFRvdGFsID0gMDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAoICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ2FsbCcgJiYgISRQYXJhbXtTdGF0dXN9ICkKICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAndmFsaWQnICkKICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGFjdGlvbiBzb3J0IHdyYXBwZXIgLSBiZSBjYXJlZnVsIGl0cyBub3Qgc2ltdWxhciB3aXRoIHByb2plY3QhIQogICAgICAgICAgICAgICAgICAgICAgICBteSAlU29ydGVkQWN0aW9ucyA9ICgpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEFjdGlvbklEICgga2V5cyAleyAkUHJvamVjdERhdGF7VG90YWx9eyRQcm9qZWN0SUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU29ydGVkQWN0aW9uc3skQWN0aW9uSUR9ID0gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvbn07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Um93U3Bhbn0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEFjdGlvbklEICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQgeyAkU29ydGVkQWN0aW9uc3skYX0gY21wICRTb3J0ZWRBY3Rpb25zeyRifSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVTb3J0ZWRBY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZm9yZWFjaCBteSAkQWN0aW9uSUQgKGtleXMgJXskUHJvamVjdERhdGF7VG90YWx9eyRQcm9qZWN0SUR9fSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0FjdGlvbn0gPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc30gID0gc3ByaW50ZiggIiUuMmYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQcm9qZWN0RGF0YXtQZXJNb250aH17JFByb2plY3RJRH17JEFjdGlvbklEfXtIb3Vyc30gfHwgMCApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzVG90YWx9ID0gc3ByaW50ZiggIiUuMmYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQcm9qZWN0RGF0YXtUb3RhbH17JFByb2plY3RJRH17JEFjdGlvbklEfXtIb3Vyc30gfHwgMCApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRvdGFsICAgICAgKz0gJFBhcmFte0hvdXJzfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUb3RhbFRvdGFsICs9ICRQYXJhbXtIb3Vyc1RvdGFsfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFte1Byb2plY3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0fSAgICAgICAgICAgID0gJFByb2plY3R7UHJvamVjdH17JFByb2plY3RJRH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2plY3RJRH0gICAgICAgICAgPSAkUHJvamVjdElEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0RGVzY3JpcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkUHJvamVjdHtQcm9qZWN0RGVzY3JpcHRpb259eyRQcm9qZWN0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtSb3dTcGFufSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2plY3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtSb3dTcGFufSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtDbGFzc30gICAgICA9ICdjb250ZW50a2V5JzsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0FjdGlvbn0gICAgID0gJ1RvdGFsJzsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzfSAgICAgID0gc3ByaW50ZiggIiUuMmYiLCAkVG90YWwgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzVG90YWx9ID0gc3ByaW50ZiggIiUuMmYiLCAkVG90YWxUb3RhbCApOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gICAgICArPSAkVG90YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ICs9ICRUb3RhbFRvdGFsOwogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17VG90YWxIb3Vyc30gKSB7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzfSA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ICkgewogICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSA9IDA7CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gICAgICA9IHNwcmludGYoICIlLjJmIiwgJFBhcmFte1RvdGFsSG91cnN9ICk7CiAgICAgICAgJFBhcmFte1RvdGFsSG91cnNUb3RhbH0gPSBzcHJpbnRmKCAiJS4yZiIsICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ICk7CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gIlJlcG9ydGluZyIgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ1JlcG9ydGluZycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0aW1lIGFjY291bnRpbmcgcHJvamVjdCByZXBvcnRpbmcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnUHJvamVjdFJlcG9ydGluZycgKSB7CiAgICAgICAgbXkgJE91dHB1dCAgID0gJyc7CiAgICAgICAgbXkgJUZyb250ZW5kID0gKCk7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICggISRTZWxmLT57QWNjZXNzUm99ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIGZvciAocXcoUHJvamVjdElEKSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICAgICAgZm9yIChxdyhQcm9qZWN0SUQpKSB7CiAgICAgICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAiUHJvamVjdFJlcG9ydGluZzogTmVlZCAkXyIgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJUFjdGlvbiAgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NHZXQoKTsKICAgICAgICBteSAlUHJvamVjdCA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NHZXQoKTsKICAgICAgICAkUGFyYW17UHJvamVjdH0gPSAkUHJvamVjdHtQcm9qZWN0fXsgJFBhcmFte1Byb2plY3RJRH0gfTsKCiAgICAgICAgbXkgJVNob3duVXNlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCggVHlwZSA9PiAnTG9uZycsIFZhbGlkID0+IDAgKTsKCiAgICAgICAgIyBuZWNhc3NhcnkgYmVjYXVzZSB0aGUgUHJvamVjdEFjdGlvblJlcG9ydGluZyBpcyBub3QgcmV3b3JrZWQKICAgICAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkQ3VycmVudERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fQogICAgICAgICAgICAtPlN5c3RlbVRpbWUyRGF0ZSggU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksICk7CiAgICAgICAgbXkgJVByb2plY3REYXRhID0gKCk7CiAgICAgICAgbXkgJVByb2plY3RUaW1lID0gKCk7CgogICAgICAgICMgT25seSBvbmUgZnVuY3Rpb24gc2hvdWxkIGJlIGVub3VnaAogICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlU2hvd25Vc2VycyApIHsKCiAgICAgICAgICAgICMgT3ZlcnZpZXcgcGVyIHByb2plY3QgYW5kIGFjdGlvbgogICAgICAgICAgICAlUHJvamVjdERhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdEFjdGlvblJlcG9ydGluZygKICAgICAgICAgICAgICAgIFllYXIgICA9PiAkWWVhciwKICAgICAgICAgICAgICAgIE1vbnRoICA9PiAkTW9udGgsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkUHJvamVjdERhdGF7VG90YWx9eyAkUGFyYW17UHJvamVjdElEfSB9ICkgewogICAgICAgICAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIGtleXMgJXsgJFByb2plY3REYXRhe1RvdGFsfXsgJFBhcmFte1Byb2plY3RJRH0gfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRQcm9qZWN0VGltZXskQWN0aW9uSUR9eyRVc2VySUR9CiAgICAgICAgICAgICAgICAgICAgICAgID0gJFByb2plY3REYXRhe1RvdGFsfXsgJFBhcmFte1Byb2plY3RJRH0gfXskQWN0aW9uSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlKCAkU2hvd25Vc2Vyc3skVXNlcklEfSApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgdGhlIGhlYWRlcmxpbmUKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQgeyAkU2hvd25Vc2Vyc3skYX0gY21wICRTaG93blVzZXJzeyRifSB9IGtleXMgJVNob3duVXNlcnMgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyTmFtZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgVXNlciA9PiAkU2hvd25Vc2Vyc3skVXNlcklEfSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBiZXR0ZXIgc29sdXRpb24gZm9yIHNvcnQgYWN0aW9ucyBuZWNlc3NhcnkKICAgICAgICBteSAlTmV3QWN0aW9uID0gKCk7CiAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIGtleXMgJVByb2plY3RUaW1lICkgewogICAgICAgICAgICAkTmV3QWN0aW9ueyRBY3Rpb25JRH0gPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICB9CiAgICAgICAgJUFjdGlvbiA9ICVOZXdBY3Rpb247CgogICAgICAgICMgc2hvdyB0aGUgcmVzdWx0cwogICAgICAgIG15ICVUb3RhbCA9ICgpOwogICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBzb3J0IHsgJEFjdGlvbnskYX0gY21wICRBY3Rpb257JGJ9IH0ga2V5cyAlQWN0aW9uICkgewogICAgICAgICAgICBteSAkVG90YWxIb3VycyA9IDA7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IEFjdGlvbiA9PiAkQWN0aW9ueyRBY3Rpb25JRH0sIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCB7ICRTaG93blVzZXJzeyRhfSBjbXAgJFNob3duVXNlcnN7JGJ9IH0ga2V5cyAlU2hvd25Vc2VycyApIHsKICAgICAgICAgICAgICAgICRUb3RhbEhvdXJzICAgICArPSAkUHJvamVjdFRpbWV7JEFjdGlvbklEfXskVXNlcklEfXtIb3Vyc307CiAgICAgICAgICAgICAgICAkVG90YWx7JFVzZXJJRH0gKz0gJFByb2plY3RUaW1leyRBY3Rpb25JRH17JFVzZXJJRH17SG91cnN9OwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgSG91cnMgPT4gc3ByaW50ZiggIiUuMmYiLCAkUHJvamVjdFRpbWV7JEFjdGlvbklEfXskVXNlcklEfXtIb3Vyc30gfHwgMCApLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFRvdGFsCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBIb3VycyA9PiBzcHJpbnRmKCAiJS4yZiIsICRUb3RhbEhvdXJzICksIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtUb3RhbEFsbH0gPSAwOwogICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCB7ICRTaG93blVzZXJzeyRhfSBjbXAgJFNob3duVXNlcnN7JGJ9IH0ga2V5cyAlU2hvd25Vc2VycyApIHsKICAgICAgICAgICAgJFBhcmFte1RvdGFsQWxsfSArPSAkVG90YWx7JFVzZXJJRH07CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyVG90YWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFRvdGFsID0+IHNwcmludGYoICIlLjJmIiwgJFRvdGFseyRVc2VySUR9ICksIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17VG90YWxBbGx9ID0gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17VG90YWxBbGx9ICk7CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gIlByb2plY3RSZXBvcnRpbmciICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdQcm9qZWN0UmVwb3J0aW5nJwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNob3cgZXJyb3Igc2NyZWVuCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oIE1lc3NhZ2UgPT4gIkludmFsaWQgU3ViYWN0aW9uIHByb2Nlc3MhIiApOwp9CgoxOwo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdFZGl0LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIGVkaXQKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRUaW1lQWNjb3VudGluZ0VkaXQuZHRsLHYgMS43IDIwMDcvMDYvMDUgMTQ6MTg6MTIgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiRWRpdCBUaW1lIEFjY291bnRpbmcifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJPdmVydmlldyJ9PC9hPgo8IS0tIGR0bDpibG9jazpDcmVhdGVQcm9qZWN0IC0tPgogICAgICAtCiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVByb2plY3RTZXR0aW5nIiBjbGFzcz0ibWVudWl0ZW0iPgogICAgICAkVGV4dHsiUHJvamVjdFNldHRpbmcifQogICAgICA8L2E+CjwhLS0gZHRsOmJsb2NrOkNyZWF0ZVByb2plY3QgLS0+CiAgICA8L3RkPgogIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJFZGl0Ij4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlRpbWUgc2VsZWN0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICREYXRheyJEYXRlIn0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiWWVhciJ9LSRRRGF0YXsiTW9udGgifS0kUURhdGF7IkRheSJ9Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FZGl0JlllYXI9JExRRGF0YXsiWWVhckJhY2sifSZNb250aD0kTFFEYXRheyJNb250aEJhY2sifSZEYXk9JExRRGF0YXsiRGF5QmFjayJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWxlZnQtYmlnLnBuZyIgYWx0PSIkVGV4dHsiYmFjayJ9Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FZGl0JlllYXI9JExRRGF0YXsiWWVhck5leHQifSZNb250aD0kTFFEYXRheyJNb250aE5leHQifSZEYXk9JExRRGF0YXsiRGF5TmV4dCJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXJpZ2h0LWJpZy5wbmciIGFsdD0iJFRleHR7Im5leHQifSI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5jb21wbGV0ZVRleHQgLS0+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiSW5jb21wbGV0ZSBEYXlzIn06CjwhLS0gZHRsOmJsb2NrOkluY29tcGxldGVXb3JraW5nRGF5cyAtLT4KICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FZGl0JlllYXI9JExRRGF0YXsiWWVhciJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoIn0mRGF5PSRMUURhdGF7IkRheSJ9Ij4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQm9sZFN0YXJ0In0KICAgICAgICAgICAgICAgICAgICAkUURhdGF7IlllYXIifS0kUURhdGF7Ik1vbnRoIn0tJFFEYXRheyJEYXkifQogICAgICAgICAgICAgICAgICAgICREYXRheyJCb2xkRW5kIn0KICAgICAgICAgICAgICAgICAgICA8L2E+CjwhLS0gZHRsOmJsb2NrOkluY29tcGxldGVXb3JraW5nRGF5cyAtLT4KICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkluY29tcGxldGVUZXh0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPGJyPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iRWRpdCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdGF0dXMiICAgIHZhbHVlPSJBY3Rpb24iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iWWVhciIgICAgICB2YWx1ZT0iJERhdGF7IlllYXIifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJNb250aCIgICAgIHZhbHVlPSIkRGF0YXsiTW9udGgifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJEYXkiICAgICAgIHZhbHVlPSIkRGF0YXsiRGF5In0iPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRGF0ZSJ9OiAkVGV4dHsiJFFEYXRheyJXZWVrZGF5X3RvX1RleHQifSJ9ICRRRGF0YXsiWWVhciJ9LSRRRGF0YXsiTW9udGgifS0kUURhdGF7IkRheSJ9CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGFsaWduPSJjZW50ZXIiPgo8IS0tIGR0bDpibG9jazpVbml0QmxvY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlByb2plY3QifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkFjdGlvbiJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUmVtYXJrIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXJ0dGltZSJ9PHNwYW4gY2xhc3M9IiRRRGF0YXsiQ2xhc3NUaW1lIn0iPio8L3NwYW4+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJFbmR0aW1lIn08c3BhbiBjbGFzcz0iJFFEYXRheyJDbGFzc1RpbWUifSI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlBlcmlvZCJ9PHNwYW4gY2xhc3M9ImZvb3Rub3RlIj4kUURhdGF7IlBlcmlvZE5vdGUifTwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VW5pdCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiREYXRheyJQcm9qZWN0T3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IkFjdGlvbk9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJSZW1hcmtbJFFEYXRheyJJRCJ9XSIgICAgdmFsdWU9IiRRRGF0YXsiUmVtYXJrIn0iICAgIHNpemU9IjM1Ij48L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiREYXRheyJTdGFydFRpbWUifSI8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiREYXRheyJFbmRUaW1lIn0iPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdGFydFRpbWVbJFFEYXRheyJJRCJ9XSIgdmFsdWU9IiRRRGF0YXsiU3RhcnRUaW1lIn0iIHNpemU9IjciPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRW5kVGltZVskUURhdGF7IklEIn1dIiAgIHZhbHVlPSIkUURhdGF7IkVuZFRpbWUifSIgICBzaXplPSI3Ij48L3RkPgo8IS0tIGR0bDpibG9jazpVbml0SW5wdXRQZXJpb2QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iJFFEYXRheyJUZXh0UG9zaXRpb24ifSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlBlcmlvZFskUURhdGF7IklEIn1dIiAgICB2YWx1ZT0iJFFEYXRheyJQZXJpb2QifSIgICAgc2l6ZT0iNyI+PC90ZD4KPCEtLSBkdGw6YmxvY2s6VW5pdElucHV0UGVyaW9kIC0tPgo8IS0tIGR0bDpibG9jazpVbml0UGVyaW9kV2l0aG91dElucHV0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249IiRRRGF0YXsiVGV4dFBvc2l0aW9uIn0iPiRRRGF0YXsiUGVyaW9kIn08L3RkPgo8IS0tIGR0bDpibG9jazpVbml0UGVyaW9kV2l0aG91dElucHV0IC0tPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VW5pdFJlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJyZXF1aXJlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJEZXNjcmlwdGlvbiJ9In0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVuaXRSZXF1aXJlZCAtLT4KPCEtLSBkdGw6YmxvY2s6VW5pdFJlYWRvbmx5IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJyZWFkb25seSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJEZXNjcmlwdGlvbiJ9In0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVuaXRSZWFkb25seSAtLT4KPCEtLSBkdGw6YmxvY2s6VW5pdCAtLT4KPCEtLSBkdGw6YmxvY2s6VW5pdEJsb2NrIC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPgo8IS0tIGR0bDpibG9jazpPdGhlclRpbWVzIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9Ii0yIiBuYW1lPSJMZWF2ZURheSIgJERhdGF7IkxlYXZlRGF5In0+JFRleHR7IkxlYXZlIERheSJ9Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iLTEiIG5hbWU9IkRpc2Vhc2VkIiAkRGF0YXsiRGlzZWFzZWQifT4kVGV4dHsiRGlzZWFzZWQifSZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9Ii0zIiBuYW1lPSJPdmVydGltZSIgJERhdGF7Ik92ZXJ0aW1lIn0+JFRleHR7Ik92ZXJ0aW1lIn0KPCEtLSBkdGw6YmxvY2s6T3RoZXJUaW1lcyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6VG90YWwgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249IiRRRGF0YXsiVGV4dFBvc2l0aW9uIn0iPiRRRGF0YXsiVG90YWwifSZuYnNwOzwvdGQ+CjwhLS0gZHRsOmJsb2NrOlRvdGFsIC0tPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVxdWlyZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXF1aXJlZCI+JFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZCAtLT4KPCEtLSBkdGw6YmxvY2s6UmVhZG9ubHkgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZWFkb25seSI+JFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZWFkb25seSAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iIG5hbWU9IkRlbGV0ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXF1aXJlZCI+KiAkVGV4dHsiUmVxdWlyZWQgRmllbGQifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpGb290Tm90ZSAtLT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290bm90ZSI+KiAkVGV4dHsiWW91IGhhdmUgdG8gaW5zZXJ0IFN0YXJ0LSBhbmQgRW5kdGltZSBvciBhIFBlcmlvZCJ9PC9kaXY+CjwhLS0gZHRsOmJsb2NrOkZvb3ROb3RlIC0tPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rub3RlIj4qICRUZXh0eyJJZiB5b3UgdXNlIGFjdGlvbiBtaXNjLCBwbGVhc2UgZ2l2ZSBhbiBleHBsYW5hdGlvbiBpbiB0aGUgZmllbGQgcmVtYXJrIn08L2Rpdj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdWaWV3LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9yIHZpZXcgaW5zZXJ0cyBvZiBvbmUgZGF5CiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmdWaWV3LmR0bCx2IDEuMyAyMDA2LzEyLzA4IDE1OjA3OjIzIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlZpZXcgVGltZSBBY2NvdW50aW5nIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlbiJ9IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJWaWV3IG9mICJ9ICRRRGF0YXsiVXNlciJ9PGJyPjxicj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJWaWV3Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlVzZXJJRCIgICAgdmFsdWU9IiRRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4kVGV4dHsiVGltZSBzZWxlY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IkRhdGVTZWxlY3Rpb24ifQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkRhdGUifSZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249VmlldyZZZWFyPSRRRGF0YXsiWWVhckJhY2sifSZNb250aD0kUURhdGF7Ik1vbnRoQmFjayJ9JkRheT0kUURhdGF7IkRheUJhY2sifSZVc2VySUQ9JFFEYXRheyJVc2VySUQifSI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1sZWZ0LWJpZy5wbmciIGFsdD0iJFRleHR7ImJhY2sifSI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249VmlldyZZZWFyPSRRRGF0YXsiWWVhck5leHQifSZNb250aD0kUURhdGF7Ik1vbnRoTmV4dCJ9JkRheT0kUURhdGF7IkRheU5leHQifSZVc2VySUQ9JFFEYXRheyJVc2VySUQifSI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1yaWdodC1iaWcucG5nIiBhbHQ9IiRUZXh0eyJuZXh0In0iPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiRGF0ZSJ9OiAkUURhdGF7IldlZWtkYXlfdG9fVGV4dCJ9ICRRRGF0YXsiRGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI5MCUiPgo8IS0tIGR0bDpibG9jazpVbml0QmxvY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUHJvamVjdCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiQWN0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJSZW1hcmsifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXJ0dGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiRW5kdGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUGVyaW9kIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVuaXQgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiUHJvamVjdCJ9Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkFjdGlvbiJ9Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IlJlbWFyayJ9Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiU3RhcnRUaW1lIn0mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJFbmRUaW1lIn0mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJQZXJpb2QifSZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VW5pdCAtLT4KPCEtLSBkdGw6YmxvY2s6VW5pdEJsb2NrIC0tPgo8IS0tIGR0bDpibG9jazpUb3RhbCAtLT4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPgogICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlRvdGFsIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWwifSZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VG90YWwgLS0+CjwhLS0gZHRsOmJsb2NrOk90aGVyVGltZXMgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iLTIiIG5hbWU9IkxlYXZlRGF5IiAkRGF0YXsiTGVhdmVEYXkifSBkaXNhYmxlZD4kVGV4dHsiTGVhdmUgRGF5In0mbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iLTEiIG5hbWU9IkRpc2Vhc2VkIiAkRGF0YXsiRGlzZWFzZWQifSBkaXNhYmxlZD4kVGV4dHsiRGlzZWFzZWQifSZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSItMyIgbmFtZT0iT3ZlcnRpbWUiICREYXRheyJPdmVydGltZSJ9IGRpc2FibGVkPiRUZXh0eyJPdmVydGltZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdGhlclRpbWVzIC0tPgo8IS0tIGR0bDpibG9jazpWYWNhdGlvbiAtLT4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IlZhY2F0aW9uIn0KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlZhY2F0aW9uIC0tPgogICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+PC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdTZXR0aW5nLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIHNldHRpbmdzCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmdTZXR0aW5nLmR0bCx2IDEuNiAyMDA2LzEyLzA4IDE1OjA3OjIzIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8IS0tIGR0bDpibG9jazpQcm9qZWN0U2V0dGluZyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJFZGl0IFRpbWUgQWNjb3VudGluZyBQcm9qZWN0IFByZWZlcmVuY2UifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRW52eyJMYXN0U2NyZWVuIn0iIGNsYXNzPSJtZW51aXRlbSI+CiAgICAgICRUZXh0eyJCYWNrIn0KICAgICAgPC9hPgogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlByb2plY3RTZXR0aW5nIj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiUHJvamVjdCBTZXR0aW5nIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgIDx0ciAgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlByb2plY3QifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkRlc2NyaXB0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXR1cyJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlByb2plY3RbJFFEYXRheyJQcm9qZWN0SUQifV0iIHZhbHVlPSIkUURhdGF7IlByb2plY3QifSIgc2l6ZT0iMzAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHJvd3M9IjIiIG5hbWU9IlByb2plY3REZXNjcmlwdGlvblskUURhdGF7IlByb2plY3RJRCJ9XSIgY29scz0iNDAiPiRRRGF0YXsiUHJvamVjdERlc2NyaXB0aW9uIn08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IlN0YXR1c09wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlByb2plY3QgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiTmV3In0iIG5hbWU9Ik5ld1Byb2plY3QiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG5hbWU9IkFjdGlvblByb2plY3QiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyIGNsYXNzPSJyZXF1aXJlZCI+PHRkPiogJFRleHR7IlJlcXVpcmVkIEZpZWxkIn08L3RkPjwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UHJvamVjdFNldHRpbmcgLS0+CjwhLS0gZHRsOmJsb2NrOlNldHRpbmcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiRWRpdCBUaW1lIEFjY291bnRpbmcgUHJlZmVyZW5jZSJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UHJvamVjdFNldHRpbmciIGNsYXNzPSJtZW51aXRlbSI+CiAgICAgICRUZXh0eyJQcm9qZWN0U2V0dGluZyJ9CiAgICAgIDwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZXR0aW5nIj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQWN0aW9uIFNldHRpbmcifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBY3Rpb24ifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdGF0dXMifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkFjdGlvblskUURhdGF7IkFjdGlvbklEIn1dIiB2YWx1ZT0iJFFEYXRheyJBY3Rpb24ifSIgc2l6ZT0iNDAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlN0YXR1c09wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFjdGlvbiAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiTmV3In0iIG5hbWU9Ik5ld0FjdGlvbiI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgbmFtZT0iQWN0aW9uQWN0aW9uIj4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgICA8YnI+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlVzZXIgU2V0dGluZyJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgYWxpZ249ImNlbnRlciI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgY29sc3Bhbj0iMyI+JFFEYXRheyJVc2VyIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRGVzY3JpcHRpb24ifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IkRlc2NyaXB0aW9uIn0KICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgcm93cz0iMSIgbmFtZT0iRGVzY3JpcHRpb25bJFFEYXRheyJVc2VySUQifV0iIGNvbHM9IjQwIj48L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJDaGVja2JveCIgbmFtZT0iU2hvd092ZXJ0aW1lWyRRRGF0YXsiVXNlcklEIn1dIiB2YWx1ZT0iMSIgJERhdGF7IlNob3dPdmVydGltZSJ9PgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJTaG93IE92ZXJ0aW1lIn08YnI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9IkNoZWNrYm94IiBuYW1lPSJDcmVhdGVQcm9qZWN0WyRRRGF0YXsiVXNlcklEIn1dIiB2YWx1ZT0iMSIgJERhdGF7IkNyZWF0ZVByb2plY3QifT4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQ3JlYXRlIFByb2plY3QifQogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJTdGFydGRhdGUifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkVuZGRhdGUifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkxlYXZlIERheSJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiV2Vla2x5IEhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7Ik92ZXJ0aW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXR1cyJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpQZXJpb2QgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRGF0ZVN0YXJ0WyRRRGF0YXsiVXNlcklEIn1dWyRRRGF0YXsiUGVyaW9kIn1dIiB2YWx1ZT0iJFFEYXRheyJEYXRlU3RhcnQifSIgc2l6ZT0iMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkRhdGVFbmRbJFFEYXRheyJVc2VySUQifV1bJFFEYXRheyJQZXJpb2QifV0iIHZhbHVlPSIkUURhdGF7IkRhdGVFbmQifSIgc2l6ZT0iMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkxlYXZlRGF5c1skUURhdGF7IlVzZXJJRCJ9XVskUURhdGF7IlBlcmlvZCJ9XSIgdmFsdWU9IiRRRGF0YXsiTGVhdmVEYXlzIn0iIHNpemU9IjUiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IldlZWtseUhvdXJzWyRRRGF0YXsiVXNlcklEIn1dWyRRRGF0YXsiUGVyaW9kIn1dIiB2YWx1ZT0iJFFEYXRheyJXZWVrbHlIb3VycyJ9IiBzaXplPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJPdmVydGltZVskUURhdGF7IlVzZXJJRCJ9XVskUURhdGF7IlBlcmlvZCJ9XSIgdmFsdWU9IiRRRGF0YXsiT3ZlcnRpbWUifSIgc2l6ZT0iNSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kRGF0YXsiU3RhdHVzT3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UGVyaW9kIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJOZXcgdXNlciBzZXR0aW5nIn0iICBuYW1lPSJOZXdVc2VyU2V0dGluZ1skUURhdGF7IlVzZXJJRCJ9XSI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+PGhyPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVc2VyIC0tPgo8IS0tIGR0bDpibG9jazpOZXdVc2VyT3B0aW9uIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7Ik5ld1VzZXJPcHRpb24ifQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJOZXcifSIgIG5hbWU9Ik5ld1VzZXIiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TmV3VXNlck9wdGlvbiAtLT4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG5hbWU9IkFjdGlvblVzZXIiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyIGNsYXNzPSJyZXF1aXJlZCI+PHRkPiogJFRleHR7IlJlcXVpcmVkIEZpZWxkIn08L3RkPjwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U2V0dGluZyAtLT4K
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdPdmVydmlldy5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIHRpbWUgYWNjb3VudGluZyBvdmVydmlldwojIENvcHlyaWdodCAoQykgMjAwMy0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nT3ZlcnZpZXcuZHRsLHYgMS44IDIwMDcvMDYvMDUgMTQ6MTg6MzggdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiVGltZSBBY2NvdW50aW5nIE92ZXJ2aWV3IHBlciBNb250aCJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjMzJSIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIyIiBhbGlnbj0iY2VudGVyIj4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJPdmVydmlldyBvZiAifSAkUURhdGF7IlVzZXIifTxicj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjQiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXJCYWNrIn0mTW9udGg9JExRRGF0YXsiTW9udGhCYWNrIn0mVXNlcklEPSRMUURhdGF7IlVzZXJJRCJ9Ij4KICAgICAgICAgICAgJiMwNjA7JiMwNjA7CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgJm5ic3A7Jm5ic3A7CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPU92ZXJ2aWV3JlllYXI9JExRRGF0YXsiWWVhck5leHQifSZNb250aD0kTFFEYXRheyJNb250aE5leHQifSZVc2VySUQ9JExRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAmIzA2MjsmIzA2MjsKICAgICAgICAgICAgPC9hPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iY29udGVudGhlYWQiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJNb250aF90b19UZXh0In0ifSAkUURhdGF7IlllYXIifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiAgICAgICAgPHRyICREYXRheyJTdHlsZSJ9PgogICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj0kTFFEYXRheyJTdWJhY3Rpb24ifSZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9JkRheT0kTFFEYXRheyJEYXkifSZVc2VySUQ9JExRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAkUURhdGF7IkRheSJ9CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+JFRleHR7IiRRRGF0YXsiV2Vla2RheV90b19UZXh0In0ifTwvdGQ+CiAgICAgICAgICA8dGQ+JFRleHR7IiRRRGF0YXsiQ29tbWVudCJ9In08L3RkPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJXb3JraW5nSG91cnMifTwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0iY29udGVudGhlYWQiIGFsaWduPSJsZWZ0Ij4kVGV4dHsiV29ya2luZ0hvdXJzIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiIGFsaWduPSJyaWdodCI+JFFEYXRheyJXb3JraW5nSG91cnMifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMzMlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIGFsaWduPSJjZW50ZXIiPgo8IS0tIGR0bDpibG9jazpPdmVydGltZSAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4kVGV4dHsiT3ZlcnRpbWUifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOyRUZXh0eyJ0aGlzIG1vbnRoIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiT3ZlcnRpbWUifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7JFRleHR7InVudGlsIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiT3ZlcnRpbWVVbnRpbCJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkPiRUZXh0eyJPdmVydGltZSB0b3RhbCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7Ik92ZXJ0aW1lVG90YWwifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydGltZSAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4kVGV4dHsiTGVhdmUgRGF5cyJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7JFRleHR7IkxlYXZlRGF5IHRoaXMgbW9udGgifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGFsaWduPSJyaWdodCI+JFFEYXRheyJMZWF2ZURheSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDskVGV4dHsiTGVhdmVEYXlUb3RhbCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkxlYXZlRGF5VG90YWwifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZD4kVGV4dHsiTGVhdmVEYXkgcmVtYWluaW5nIn06PC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiTGVhdmVEYXlSZW1haW5pbmcifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiRUZXh0eyJEaXNlYXNlZCJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7JFRleHR7IkRpc2Vhc2VkIHRoaXMgbW9udGgifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGFsaWduPSJyaWdodCI+JFFEYXRheyJEaXNlYXNlZCJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDskVGV4dHsiRGlzZWFzZWRUb3RhbCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkRpc2Vhc2VkVG90YWwifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlByb2plY3QgUmVwb3J0aW5nIn06CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPU92ZXJ2aWV3JlllYXI9JExRRGF0YXsiWWVhciJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoIn0mUHJvamVjdFN0YXR1c1Nob3c9JExRRGF0YXsiUHJvamVjdFN0YXR1c1Nob3cifSZVc2VySUQ9JExRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAoJFRleHR7IlNob3cifSAkVGV4dHsiJFFEYXRheyJQcm9qZWN0U3RhdHVzU2hvdyJ9In0gJFRleHR7IlByb2plY3RzIn0pCiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7InBlciBNb250aCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQcm9qZWN0In08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBY3Rpb24gLS0+CiAgICAgICAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRkIHJvd3NwYW49IiREYXRheyJSb3dTcGFuIn0iIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRlbnRrZXkkUURhdGF7IlN0YXR1cyJ9Ij4KPCEtLSBkdGw6YmxvY2s6UHJvamVjdE5vTGluayAtLT4KICAgICAgICAgICAgICAgICAgJERhdGF7IlByb2plY3QifQo8IS0tIGR0bDpibG9jazpQcm9qZWN0Tm9MaW5rIC0tPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0TGluayAtLT4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UHJvamVjdFJlcG9ydGluZyZQcm9qZWN0SUQ9JFFEYXRheyJQcm9qZWN0SUQifSI+CiAgICAgICAgICAgICAgICAgICREYXRheyJQcm9qZWN0In0KICAgICAgICAgICAgICAgICAgPC9hPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0TGluayAtLT4KICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb250ZW50dmFsdWUkUURhdGF7IlN0YXR1cyJ9Ij4kRGF0YXsiUHJvamVjdERlc2NyaXB0aW9uIn08L3NwYW4+CiAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNsYXNzIn0kUURhdGF7IlN0YXR1cyJ9IiA+JFFEYXRheyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ2xhc3MifSRRRGF0YXsiU3RhdHVzIn0iIGFsaWduPSJyaWdodCI+JFFEYXRheyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9JFFEYXRheyJTdGF0dXMifSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkhvdXJzVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IlRvdGFsIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEhvdXJzVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdSZXBvcnRpbmcuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciB0aW1lIGFjY291bnRpbmcgcmVwb3J0aW5nCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmdSZXBvcnRpbmcuZHRsLHYgMS43IDIwMDcvMDUvMTEgMTQ6MzY6MzcgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlRpbWUgUHJlcG9ydGluZyJ9OiAkVGV4dHsiJFFEYXRheyJNb250aF90b19UZXh0In0ifSAkUURhdGF7IlllYXIifSAkRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCIgPiRUZXh0eyJUaW1lIHNlbGVjdGlvbiJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iUmVwb3J0aW5nIj4KICAgICAgICAgICAgICAkRGF0YXsiTW9udGhPcHRpb24ifQogICAgICAgICAgICAgICREYXRheyJZZWFyT3B0aW9uIn0KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJNb250aF90b19UZXh0In0ifSAkUURhdGF7IlllYXIifQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UmVwb3J0aW5nJlllYXI9JExRRGF0YXsiWWVhckJhY2sifSZNb250aD0kTFFEYXRheyJNb250aEJhY2sifSI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1sZWZ0LWJpZy5wbmciIGFsdD0iJFRleHR7Ik9uZSBkYXkgYmFjayJ9Ij48L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1SZXBvcnRpbmcmWWVhcj0kTFFEYXRheyJZZWFyTmV4dCJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoTmV4dCJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXJpZ2h0LWJpZy5wbmciIGFsdD0iJFRleHR7Ik5leHQgZGF5In0iPjwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlVzZXIgUmVwb3J0aW5nIn06PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMiI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPiRUZXh0eyJwZXIgTW9udGgifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IlRvdGFsIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVXNlciJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiV29ya2luZyBIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiT3ZlcnRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkxlYXZlIERheXMifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkRpc2Vhc2VkIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJPdmVydGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiTGVhdmVEYXkgUmVtYWluaW5nIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9JlVzZXJJRD0kTFFEYXRheyJVc2VySUQifSI+CiAgICAgICAgICAgICAgICAgICRRRGF0YXsiVXNlciJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IldvcmtpbmdIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiZuYnNwOyRRRGF0YXsiT3ZlcnRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkxlYXZlRGF5In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJEaXNlYXNlZCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiZuYnNwOyRRRGF0YXsiT3ZlcnRpbWVUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiTGVhdmVEYXlSZW1haW5pbmcifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxXb3JraW5nSG91cnMifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsT3ZlcnRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsTGVhdmVEYXkifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsRGlzZWFzZWQifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsT3ZlcnRpbWVUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxMZWF2ZURheVJlbWFpbmluZyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBjbGFzcz0iY29udGVudGJvZHkiIGJvcmRlcj0iMCIgd2lkdGg9IjUwJSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgJFRleHR7IlByb2plY3QgUmVwb3J0aW5nIn06CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVJlcG9ydGluZyZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9JlByb2plY3RTdGF0dXNTaG93PSRMUURhdGF7IlByb2plY3RTdGF0dXNTaG93In0iPgogICAgICAgICAgICAoJFRleHR7IlNob3cifSAkVGV4dHsiJFFEYXRheyJQcm9qZWN0U3RhdHVzU2hvdyJ9In0gJFRleHR7IlByb2plY3RzIn0pCiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7InBlciBNb250aCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQcm9qZWN0In08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBY3Rpb24gLS0+CiAgICAgICAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRkIHJvd3NwYW49IiREYXRheyJSb3dTcGFuIn0iIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRlbnRrZXkkUURhdGF7IlN0YXR1cyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UHJvamVjdFJlcG9ydGluZyZQcm9qZWN0SUQ9JFFEYXRheyJQcm9qZWN0SUQifSI+CiAgICAgICAgICAgICAgICAgICREYXRheyJQcm9qZWN0In0KICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRlbnR2YWx1ZSRRRGF0YXsiU3RhdHVzIn0iPiREYXRheyJQcm9qZWN0RGVzY3JpcHRpb24ifTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlByb2plY3QgLS0+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ2xhc3MifSRRRGF0YXsiU3RhdHVzIn0iID4kUURhdGF7IkFjdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9JFFEYXRheyJTdGF0dXMifSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNsYXNzIn0kUURhdGF7IlN0YXR1cyJ9IiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiSG91cnNUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBY3Rpb24gLS0+CiAgICAgICAgICAgICAgPHRyICBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IlRvdGFsIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEhvdXJzVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdQcm9qZWN0UmVwb3J0aW5nLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIHJlcG9ydGluZwojIENvcHlyaWdodCAoQykgMjAwMy0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nUHJvamVjdFJlcG9ydGluZy5kdGwsdiAxLjIgMjAwNi8xMi8wOCAxNTowNzoyMyB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiVGltZSBQcm9qZWN0IFByZXBvcnRpbmcifTogJFFEYXRheyJQcm9qZWN0In0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW4ifSIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiMgICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiMgICAgICAgIDx0cj4KIyAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIiA+JFRleHR7IlRpbWUgc2VsZWN0aW9uIn08L3RkPgojICAgICAgICA8L3RyPgojICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiMgICAgICAgICAgPHRkPgojICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KIyAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgojICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJSZXBvcnRpbmciPgojICAgICAgICAgICAgICAkRGF0YXsiTW9udGhPcHRpb24ifQojICAgICAgICAgICAgICAkRGF0YXsiWWVhck9wdGlvbiJ9CiMgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiMgICAgICAgICAgICA8L2Zvcm0+CiMgICAgICAgICAgPC90ZD4KIyAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICA8dGFibGU+CiMgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJNb250aF90b19UZXh0In0ifSAkUURhdGF7IlllYXIifQojICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICAgPHRkPgojICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UmVwb3J0aW5nJlllYXI9JFFEYXRheyJZZWFyQmFjayJ9Jk1vbnRoPSRRRGF0YXsiTW9udGhCYWNrIn0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9bGVmdC1iaWcucG5nIiBhbHQ9IiRUZXh0eyJPbmUgZGF5IGJhY2sifSI+PC9hPgojICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICAgPHRkPgojICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UmVwb3J0aW5nJlllYXI9JFFEYXRheyJZZWFyTmV4dCJ9Jk1vbnRoPSRRRGF0YXsiTW9udGhOZXh0In0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9cmlnaHQtYmlnLnBuZyIgYWx0PSIkVGV4dHsiTmV4dCBkYXkifSI+PC9hPgojICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgIDwvdHI+CiMgICAgICAgICAgICA8L3RhYmxlPgojICAgICAgICAgIDwvdGQ+CiMgICAgICAgIDwvdHI+CiMgICAgICAgIDx0cj4KIyAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiMgICAgICAgIDwvdHI+CiMgICAgICA8L3RhYmxlPgojICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICRUZXh0eyJQcm9qZWN0IFJlcG9ydGluZyJ9OiAkUURhdGF7IlByb2plY3QifQogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkFjdGlvbiJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VXNlck5hbWUgLS0+CiAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJVc2VyIn08L3RkPgo8IS0tIGR0bDpibG9jazpVc2VyTmFtZSAtLT4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkFjdGlvbiJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiSG91cnMifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRvdGFsIn08L3RkPgo8IS0tIGR0bDpibG9jazpVc2VyVG90YWwgLS0+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbCJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VXNlclRvdGFsIC0tPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxBbGwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdEZWxldGUuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBkZWxldGUgYSBkYXkgb2YgdGltZWFjY291bnRpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBPVFJTIEdtYkgsIGh0dHA6Ly93d3cub3Rycy5kZS8KIyAtLQojICRJZDogQWdlbnRUaW1lQWNjb3VudGluZ0RlbGV0ZS5kdGwsdiAxLjEuMS4xIDIwMDUvMDkvMDUgMTI6MTg6NDMgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjwhLS0gc3RhcnQgZm9ybSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJEZWxldGUifTogJFRleHR7IlRpbWVBY2NvdW50aW5nIG9mIn0gJFFEYXRheyJZZWFyIn0tJFFEYXRheyJNb250aCJ9LSRRRGF0YXsiRGF5In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KIyAgPHRyPgojICAgIDx0ZCBjbGFzcz0ibWVudSI+CiMgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlblZpZXcifSIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgojICAgIDwvdGQ+CiMgIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjM1MCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgID4kVGV4dHsiRGVsZXRlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IlRpbWVBY2NvdW50aW5nIG9mIn0gJFFEYXRheyJZZWFyIn0tJFFEYXRheyJNb250aCJ9LSRRRGF0YXsiRGF5In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgT2JqZWN0In0/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kUURhdGF7IlllYXIifSZNb250aD0kUURhdGF7Ik1vbnRoIn0mRGF5PSRRRGF0YXsiRGF5In0iIj4kVGV4dHsiTm8ifTwvYT4gPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RGVsZXRlJlllYXI9JFFEYXRheyJZZWFyIn0mTW9udGg9JFFEYXRheyJNb250aCJ9JkRheT0kUURhdGF7IkRheSJ9Ij4kVGV4dHsiWWVzIn08L2E+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBlbmQgZm9ybSAtLT4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9Ob3RpZmljYXRpb25UaW1lQWNjb3VudGluZy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBOb3RpZmljYXRpb25UaW1lQWNjb3VudGluZy5wbSx2IDEuNCAyMDA4LzAxLzIyIDA3OjQ4OjA2IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6Tm90aWZpY2F0aW9uVGltZUFjY291bnRpbmc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWVBY2NvdW50aW5nOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBVc2VySUQpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgJFNlbGYtPntUaW1lT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZy0+bmV3KCVQYXJhbSk7CiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSggU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksICk7CiAgICBteSAlVXNlciA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyQ3VycmVudFBlcmlvZEdldCgKICAgICAgICBZZWFyICA9PiAkWWVhciwKICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgRGF5ICAgPT4gJERheSwKICAgICk7CiAgICBpZiAoICRVc2VyeyAkU2VsZi0+e1VzZXJJRH0gfSApIHsKICAgICAgICBteSAlSW5jb21wbGV0ZVdvcmtpbmdEYXlzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2soKTsKCiAgICAgICAgIyByZWRpcmVjdCBpZiBpbmNvbXBsZXRlIHdvcmtpbmcgZGF5IGFyZSBvdXQgb2YgcmFuZ2UKICAgICAgICBpZiAoICRJbmNvbXBsZXRlV29ya2luZ0RheXN7V2FybmluZ30gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgIEluZm8gICAgID0+ICdQbGVhc2UgaW5zZXJ0IHlvdXIgd29ya2luZyBob3VycyEnLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJwogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAnJzsKfQoKMTsK
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAEo0lEQVQ4y42VW2yURRTHf99lu7tdSr/laoBCa28qERaRRChSUWKEYKhcEqMEKoIKIdbGEDHRaIhCMJK2MZHEB60aHlRCMEDkQSlGFC1Bti1eCoFuuZV7lwK97DdzxoduSxERTnIyk8nM7/wzc+YcyxjDnSxv0U7PaIkZpRGt4yd3LUze6Yx1O3Dh0u9jRusKUbrMKO2J0oivMEojSifFV9vFVzXn9y+L3xW4+MU6z4hUidblxsskK38Y9xVEKRwVIdO1ONDSwemjFzlZ34Lfch6jVK0oqbzcuCp5W3Dx8jrPiKkj6MTGlOTycslIysaFEAPraw+TEw0wd04xKQMHL/p8/kMr+z/dh7rYERelZ145UtkPt/uhK/Z6xpg6OysYm7ckxmfzx/JUToiUgG9g3NAMRkSDCCAGxkcDvLeggBUflOGOyI6Jr+sGjd3o3QI2IlV20I3NWjSeiknZBB2LlECPQErg6dlFTJmaiza94FOtCcTA3GKP8vXzcLMzY6J01U3gomV7YkZL+Zjpebw0IRtlelWmBFLp0Tc3/HBjnPklk9iw5lVSGqbneUxd9TjG1+WhIe/G+sFGpCI8PMKCKSMI2L1KB3pPH1zgcEOcJbNnIiLEZjxB8loX3RrufziXwcX3IEpX3ABrKRtaMIwJQzPw04CBavu8aQD0rc1fMGTiozRetdjdepXWjh5Glz6A+LoMwM1/breHMV5hwRC0segWCNhgG7Ct3vtqbopzujXB2ytfQIuwurqWzvxHaE8F6dGKoANiLEZNzKFBa8+yX/dsIxITpYlGw9R+9Se7vjvCNQVdGro1JBIJ1jz/DIn6H7l6JcmMxSu50K05+3cDgwI2gwI2l5rP0/ztIYaN9hClwRBzjdIYLbi2RfJckizCXEmlVVtw9HgCz/MoLS2lurqa3Zs39uf9up9PEMkehnO9E3O5g7BrQfpfuEYkLkrTmezkyaXTCNqQTIMdC+6dUkpR6WzWrtvAKxs+YvDQkWgDSgwR18Z1bWKlBRSW5NN2or0vZtwyxpAz55v20oUTvIem5ZHpWoRdi7BjEXYhaFu4NvjdXThuAByXlBh6tKFLGTqV4boyXPeFX7f9zo53tiWN2RS1AUTp7Ud+ayVoG8IORFzICsCggEVWhsXggM3wwRGimRlkBWyyAjYR175JRMixOLzzEMD2/nQTX9Wc+OssZ46eJ+iQVmsRcW0irkXE7Q0WSQeNuBaRgEXYtQk5FkHH4sTBBC0HWgBq+sFtdYvjxle1Wz/eh+7yCaYVhB0I25DppKFO7zzkQCi9J+hY+Ne72fLmVoBaYzbFb6oVoqXyUltH/MM3dpDqTJFhWwQsCKbBe/afpqmpjZDduxZIe8/Vbt5/9hMunmqPA5W3FKEL9cuTovTMRPO5+GtLttB48CSuBQELMmxobjxN27EL/dniAA2/HGP1rCoSf5yJAzON2ZS8baHPLqryjNJV4uvyyZNHs2jBgzxWMo6CXA9toPn4Zer2HuPrLw9Q/9MxgFqgciD0f1tTZNT6mPi6QnxVJkp7RinE1xgRgGT69Wv67vSue95Ac0Nrvb6vjyH+b3X/Zf8AFuFkUCNJ29gAAAAASUVORK5CYII=