TimeAccounting
1.0.3
OTRS GmbH
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
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
2006-05-23 insert a ProjectReporting page
2006-05-16 fixed action new bug in setting
2006-04-24 insert the delete dtl
2006-04-18 fixed vacation bug
2006-04-11 fixed Show all bug
2006-04-11 fixed typo
2006-04-10 include new functions
2005-08-10 fixed initial bugs
2005-08-08 first package
A TimeAccounting Modul.
Ein Zeiterfassungsmodul.
2.1.x
2.2.x
# add groups
$Self->{GroupObject}->GroupAdd(
Name => 'time_accounting',
Comment => '',
ValidID => 1,
UserID => 1,
);
2007-06-05 16:22:39
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
Iy0tCiMgS2VybmVsL1N5c3RlbS9UaW1lQWNjb3VudGluZy5wbSAtIGFsbCB0aW1lIGFjY291bnRpbmcgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IFRpbWVBY2NvdW50aW5nLnBtLHYgMS4xMCAyMDA3LzA2LzA1IDE0OjE5OjQ5IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmc7Cgp1c2Ugc3RyaWN0Owp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEwICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgp1c2UgRGF0ZTo6UGNhbGMgcXcoVG9kYXkgRGF5c19pbl9Nb250aCBEYXlfb2ZfV2Vlayk7CiN1c2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyRXZlbnQ7Cgo9aGVhZDEgTkFNRSMKCktlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZyAtIHRpbWVhY2NvdW50aW5nIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgdGltZWFjY291bnRpbmcgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRSMKCj1vdmVyIDQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWVBY2NvdW50aW5nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lQWNjb3VudGluZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ID0+ICREQk9iamVjdCwKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgVXNlcklEIFRpbWVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBVc2VyQ3VycmVudFBlcmlvZEdldCgpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSB1c2VyIG9mIHRoZSBjdXJyZW50IHBlcmlvZCBkYXRhCgogICAgbXkgJVVzZXJEYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyQ3VycmVudFBlcmlvZEdldCgKICAgICAgICBZZWFyICA9PiAnMjAwNScsCiAgICAgICAgTW9udGggPT4gJzEyJzsKICAgICAgICBEYXkgICA9PiAnMjQnCiAgICApOwoKPWN1dAoKc3ViIFVzZXJDdXJyZW50UGVyaW9kR2V0IHsKICAgIG15ICRTZWxmICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICA9IEBfOwogICAgbXkgJURhdGEgICAgPSAoKTsKICAgIGZvcmVhY2ggKHF3KFllYXIgTW9udGggRGF5KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSkgfHwgJyc7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIlVzZXJDdXJyZW50UGVyaW9kR2V0OiBOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICREYXRlID0gc3ByaW50ZigiJTA0ZC0lMDJkLSUwMmQiLCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9KSAuICIgMDA6MDA6MDAiOwoKICAgICMgZGIgc2VsZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSAoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgdXNlcl9pZCwgcHJlZmVyZW5jZV9wZXJpb2QsIGRhdGVfc3RhcnQsIGRhdGVfZW5kLCB3ZWVrbHlfaG91cnMsIGxlYXZlX2RheXMsIG92ZXJ0aW1lLCBzdGF0dXMgRlJPTSB0aW1lX2FjY291bnRpbmdfdXNlcl9wZXJpb2QgIi4KICAgICAgICAgICAgIldIRVJFIGRhdGVfc3RhcnQgPD0gJyIgLiAkRGF0ZSAuICInIEFORCBkYXRlX2VuZCAgPj0nIiAuICREYXRlIC4gIiciLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewoKICAgICAgICAkRGF0YXskUm93WzBdfXtVc2VySUR9ICAgICAgICAgICA9ICAkUm93WzBdOwogICAgICAgICREYXRheyRSb3dbMF19e1BlcmlvZH0gICAgICAgICAgID0gICRSb3dbMV07CiAgICAgICAgJERhdGF7JFJvd1swXX17RGF0ZVN0YXJ0fSAgICAgICAgPSAgc3Vic3RyKCRSb3dbMl0sIDAsIDEwKTsKICAgICAgICAkRGF0YXskUm93WzBdfXtEYXRlRW5kfSAgICAgICAgICA9ICBzdWJzdHIoJFJvd1szXSwgMCwgMTApOwogICAgICAgICREYXRheyRSb3dbMF19e1dlZWtseUhvdXJzfSAgICAgID0gICRSb3dbNF07CiAgICAgICAgJERhdGF7JFJvd1swXX17TGVhdmVEYXlzfSAgICAgICAgPSAgJFJvd1s1XTsKICAgICAgICAkRGF0YXskUm93WzBdfXtPdmVydGltZX0gICAgICAgICA9ICAkUm93WzZdOwogICAgICAgICREYXRheyRSb3dbMF19e1VzZXJTdGF0dXN9ICAgICAgID0gICRSb3dbN107CiAgICB9CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBVc2VyUmVwb3J0aW5nKCkKCnJldHVybnMgYSBoYXNoIHdpdGggaW5mb3JtYXRpb25zIGFib3V0IGxlYXZlZGF5cywgb3ZlcnRpbWVzLAp3b3JraW5naG91cnMgZXRjLiBvZiBhbGwgdXNlcnMKCiAgICBteSAlRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+VXNlclJlcG9ydGluZygKICAgICAgICBZZWFyICA9PiAnMjAwNScsCiAgICAgICAgTW9udGggPT4gJzEyJywKICAgICAgICBEYXkgICA9PiAnMTInLCAgICAgICMgT3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgVXNlclJlcG9ydGluZyB7CiAgICBteSAkU2VsZiAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgPSBAXzsKICAgIG15ICVEYXRhICAgID0gKCk7CiAgICBmb3JlYWNoIChxdyhZZWFyIE1vbnRoIERheSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pIHx8ICcnOwogICAgICAgIGlmICghJFBhcmFteyRffSAmJiAkXyBuZSAnRGF5JykgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJVc2VyUmVwb3J0aW5nOiBOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCEkUGFyYW17RGF5fSkgewogICAgICAgICRQYXJhbXtEYXl9ID0gRGF5c19pbl9Nb250aCgkUGFyYW17WWVhcn0sICAkUGFyYW17TW9udGh9KTsKICAgIH0KCiAgICBteSAlVXNlckN1cnJlbnRQZXJpb2QgPSAkU2VsZi0+VXNlckN1cnJlbnRQZXJpb2RHZXQoJVBhcmFtKTsKICAgIG15ICRZZWFyU3RhcnQgICAgICAgPSAwOwogICAgbXkgJE1vbnRoU3RhcnQgICAgICA9IDA7CiAgICBteSAkRGF5U3RhcnQgICAgICAgID0gMDsKICAgIG15ICRNb250aFN0YXJ0UG9pbnQgPSAwOwogICAgbXkgJERheVN0YXJ0UG9pbnQgICA9IDA7CiAgICBteSAkTW9udGhFbmRQb2ludCAgID0gMDsKICAgIG15ICREYXlFbmRQb2ludCAgICAgPSAwOwogICAgbXkgJFllYXJFbmQgICAgICAgICA9ICRQYXJhbXtZZWFyfTsKICAgIG15ICRNb250aEVuZCAgICAgICAgPSAkUGFyYW17TW9udGh9OwogICAgbXkgJERheUVuZCAgICAgICAgICA9ICRQYXJhbXtEYXl9OwoKICAgIGZvcmVhY2ggbXkgJFVzZXJJRCAoa2V5cyAlVXNlckN1cnJlbnRQZXJpb2QpewogICAgICAgIGlmICgkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17RGF0ZVN0YXJ0fSA9fiAvXihcZCspLShcZCspLShcZCspLykgewogICAgICAgICAgICAkWWVhclN0YXJ0ICA9ICQxOwogICAgICAgICAgICAkTW9udGhTdGFydCA9ICQyOwogICAgICAgICAgICAkRGF5U3RhcnQgICA9ICQzOwogICAgICAgIH0KICAgICAgICAkRGF0YXskVXNlcklEfXtMZWF2ZURheX0gICAgICAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17RGlzZWFzZWR9ICAgICAgICAgPSAwOwogICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lfSAgICAgICAgID0gMDsKICAgICAgICAkRGF0YXskVXNlcklEfXtUYXJnZXRTdGF0ZX0gICAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17TGVhdmVEYXlUb3RhbH0gICAgPSAwOwogICAgICAgICREYXRheyRVc2VySUR9e0Rpc2Vhc2VkVG90YWx9ICAgID0gMDsKICAgICAgICAkRGF0YXskVXNlcklEfXtPdmVydGltZVRvdGFsfSAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGVUb3RhbH0gPSAwOwoKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIChteSAkWWVhciA9ICRZZWFyU3RhcnQ7ICRZZWFyIDw9ICRZZWFyRW5kOyAkWWVhcisrKSB7CiAgICAgICAgICAgIGlmICgkWWVhciA9PSAkWWVhclN0YXJ0KSB7CiAgICAgICAgICAgICAgICAkTW9udGhTdGFydFBvaW50ID0gJE1vbnRoU3RhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTW9udGhTdGFydFBvaW50ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFllYXIgPT0gJFllYXJFbmQpIHsKICAgICAgICAgICAgICAgICRNb250aEVuZFBvaW50ID0gJE1vbnRoRW5kOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJE1vbnRoRW5kUG9pbnQgPSAxMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKG15ICRNb250aCA9ICRNb250aFN0YXJ0UG9pbnQ7ICRNb250aCA8PSAkTW9udGhFbmRQb2ludDsgJE1vbnRoKyspIHsKICAgICAgICAgICAgICAgIGlmICgkWWVhciA9PSAkWWVhclN0YXJ0ICYmICRNb250aCA9PSAkTW9udGhTdGFydCApIHsKICAgICAgICAgICAgICAgICAgICAkRGF5U3RhcnRQb2ludCA9ICREYXlTdGFydDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICREYXlTdGFydFBvaW50ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkWWVhciA9PSAkWWVhckVuZCAmJiAkTW9udGggPT0gJE1vbnRoRW5kICkgewogICAgICAgICAgICAgICAgICAgICREYXlFbmRQb2ludCA9ICREYXlFbmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkRGF5RW5kUG9pbnQgPSBEYXlzX2luX01vbnRoKCRZZWFyLCAkTW9udGgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yIChteSAkRGF5ID0gJERheVN0YXJ0UG9pbnQ7ICREYXkgPD0gJERheUVuZFBvaW50OyAkRGF5KyspIHsKICAgICAgICAgICAgICAgICAgICBteSAlV29ya2luZ1VuaXQgPSAkU2VsZi0+V29ya2luZ1VuaXRzR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBZZWFyICAgPT4gJFllYXIsCiAgICAgICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAkTW9udGgsCiAgICAgICAgICAgICAgICAgICAgICAgIERheSAgICA9PiAkRGF5LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICRXb3JraW5nSG91cnMgPSAwOwogICAgICAgICAgICAgICAgICAgIG15ICRMZWF2ZURheSAgICAgPSAwOwogICAgICAgICAgICAgICAgICAgIG15ICREaXNlYXNlZCAgICAgPSAwOwogICAgICAgICAgICAgICAgICAgIG15ICRPdmVydGltZSAgICAgPSAwOwogICAgICAgICAgICAgICAgICAgIG15ICRUYXJnZXRTdGF0ZSAgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKGtleXMgJVdvcmtpbmdVbml0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRXb3JraW5nSG91cnMgKz0gJFdvcmtpbmdVbml0eyRffXtQZXJpb2R9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFdvcmtpbmdVbml0eyRffXtQcm9qZWN0SUR9ID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFdvcmtpbmdVbml0eyRffXtBY3Rpb25JRH0gPT0gLTIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtMZWF2ZURheVRvdGFsfSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMZWF2ZURheSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoJFdvcmtpbmdVbml0eyRffXtBY3Rpb25JRH0gPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtEaXNlYXNlZFRvdGFsfSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREaXNlYXNlZCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoJFdvcmtpbmdVbml0eyRffXtBY3Rpb25JRH0gPT0gLTMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtPdmVydGltZVRvdGFsfSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRPdmVydGltZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e1dvcmtpbmdIb3Vyc1RvdGFsfSArPSAkV29ya2luZ0hvdXJzOwogICAgICAgICAgICAgICAgICAgIG15ICRWYWNhdGlvbkNoZWNrID0gJFNlbGYtPlZhY2F0aW9uQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgICAgICAgICAgICAgICAgIERheSAgID0+ICREYXksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSAkV2Vla2RheSA9IERheV9vZl9XZWVrKCRZZWFyLCAkTW9udGgsICREYXkpOwogICAgICAgICAgICAgICAgICAgIGlmICgkV2Vla2RheSAhPSA2ICYmICRXZWVrZGF5ICE9IDcKICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRWYWNhdGlvbkNoZWNrCiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkRGlzZWFzZWQgJiYgISRMZWF2ZURheQogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtUYXJnZXRTdGF0ZVRvdGFsfSArPSAkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17V2Vla2x5SG91cnN9LzU7CiAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRTdGF0ZSA9ICRVc2VyQ3VycmVudFBlcmlvZHskVXNlcklEfXtXZWVrbHlIb3Vyc30vNTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICgkTW9udGggPT0gJE1vbnRoRW5kICYmICRZZWFyID09ICRZZWFyRW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e1RhcmdldFN0YXRlfSAgKz0gJFRhcmdldFN0YXRlOwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtXb3JraW5nSG91cnN9ICs9ICRXb3JraW5nSG91cnM7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e0xlYXZlRGF5fSAgICAgKz0gJExlYXZlRGF5OwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtEaXNlYXNlZH0gICAgICs9ICREaXNlYXNlZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJERhdGF7JFVzZXJJRH17T3ZlcnRpbWV9ICAgICAgICAgID0gJERhdGF7JFVzZXJJRH17V29ya2luZ0hvdXJzfSAgICAgICAgICAgLSAkRGF0YXskVXNlcklEfXtUYXJnZXRTdGF0ZX07CiAgICAgICAgJERhdGF7JFVzZXJJRH17T3ZlcnRpbWVUb3RhbH0gICAgID0gJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e092ZXJ0aW1lfSAgKyAkRGF0YXskVXNlcklEfXtXb3JraW5nSG91cnNUb3RhbH0gLSAkRGF0YXskVXNlcklEfXtUYXJnZXRTdGF0ZVRvdGFsfTsKICAgICAgICAkRGF0YXskVXNlcklEfXtPdmVydGltZVVudGlsfSAgICAgPSAkRGF0YXskVXNlcklEfXtPdmVydGltZVRvdGFsfSAgICAgICAgICAtICREYXRheyRVc2VySUR9e092ZXJ0aW1lfTsKICAgICAgICAkRGF0YXskVXNlcklEfXtMZWF2ZURheVJlbWFpbmluZ30gPSAkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17TGVhdmVEYXlzfSAtICREYXRheyRVc2VySUR9e0xlYXZlRGF5VG90YWx9OwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBQcm9qZWN0U2V0dGluZ3NHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgcHJvamVjdCBkYXRhCgogICAgbXkgJVByb2plY3REYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Qcm9qZWN0U2V0dGluZ3NHZXQoKTsKCj1jdXQKCnN1YiBQcm9qZWN0U2V0dGluZ3NHZXQgewogICAgbXkgJFNlbGYgICAgPSBzaGlmdDsKICAgIG15ICVEYXRhICAgID0gKCk7CgogICAgIyBkYiBzZWxlY3QKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlICgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCwgcHJvamVjdCwgZGVzY3JpcHRpb24sIHN0YXR1cyBGUk9NIHRpbWVfYWNjb3VudGluZ19wcm9qZWN0IiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkRGF0YXtQcm9qZWN0fSAgICAgICAgICAgeyRSb3dbMF19ID0gICRSb3dbMV07CiAgICAgICAgJERhdGF7UHJvamVjdERlc2NyaXB0aW9ufXskUm93WzBdfSA9ICAkUm93WzJdOwogICAgICAgICREYXRhe1Byb2plY3RTdGF0dXN9ICAgICB7JFJvd1swXX0gPSAgJFJvd1szXTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gUHJvamVjdFNldHRpbmdzSW5zZXJ0KCkKCmluc2VydCBuZXcgcHJvamVjdCBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdFNldHRpbmdzSW5zZXJ0KAogICAgICAgIFByb2plY3QgICAgICAgPT4gJ2ludGVybmFsJywgIyBvcHRpb25hbAogICAgICAgIFByb2plY3RTdGF0dXMgPT4gMSB8fCAwLCAgICAgIyBvcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBQcm9qZWN0U2V0dGluZ3NJbnNlcnQgewogICAgbXkgJFNlbGYgICAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSAgID0gQF87CgogICAgaWYgKCEkUGFyYW17UHJvamVjdH0pIHsKICAgICAgICAkUGFyYW17UHJvamVjdH0gICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRQcm9qZWN0TmFtZScpIHx8ICcnOwogICAgfQogICAgaWYgKCEkUGFyYW17UHJvamVjdFN0YXR1c30pIHsKICAgICAgICAkUGFyYW17UHJvamVjdFN0YXR1c30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRQcm9qZWN0U3RhdHVzJykgfHwgJzAnOwogICAgfQoKICAgIGlmICghJFBhcmFte1Byb2plY3REZXNjcmlwdGlvbn0pIHsKICAgICAgICAkUGFyYW17UHJvamVjdERlc2NyaXB0aW9ufSA9ICcnOwogICAgfQoKICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKGtleXMgJVBhcmFtKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KSB8fCAnJzsKICAgIH0KCiAgICAjIGJ1aWxkIHNxbAoKICAgIG15ICRTUUwgPSAiSU5TRVJUIElOVE8gdGltZV9hY2NvdW50aW5nX3Byb2plY3QgKHByb2plY3QsIGRlc2NyaXB0aW9uLCBzdGF0dXMpICIgLgogICAgICAgICJWQUxVRVMgIiAuCiAgICAgICAgIignIiAuICRQYXJhbXtQcm9qZWN0fSAuICInLCAnIiAuICRQYXJhbXtQcm9qZWN0RGVzY3JpcHRpb259IC4gIicsICciIC4gJFBhcmFte1Byb2plY3RTdGF0dXN9IC4gIicpIjsKCiAgICAjIGRiIGluc2VydAogICAgaWYgKCEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oU1FMID0+ICRTUUwpKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFByb2plY3RTZXR0aW5nc1VwZGF0ZSgpCgp1cGRhdGUgcHJvamVjdCBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdFNldHRpbmdzVXBkYXRlKAogICAgICAgIDEgICAgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICMgZXF1YWwgUHJvamVjdElECiAgICAgICAgICAgIFByb2plY3QgICAgICAgPT4gJ2ludGVybmFsJywKICAgICAgICAgICAgUHJvamVjdFN0YXR1cyA9PiAxIHx8IDAsCiAgICAgICAgfSwKICAgICAgICAyICAgID0+IHsgICAgICAgICAgICAgICAgICAgICAgICAjIGVxdWFsIFByb2plY3RJRAogICAgICAgICAgICBQcm9qZWN0ICAgICAgID0+ICdwcm9qZWN0bmFtZScsCiAgICAgICAgICAgIFByb2plY3RTdGF0dXMgPT4gMSB8fCAwLAogICAgICAgIH0sCiAgICAgICAgMyAgICA9PiAuLi4uLi4KICAgICk7Cgo9Y3V0CgpzdWIgUHJvamVjdFNldHRpbmdzVXBkYXRlIHsKICAgIG15ICRTZWxmICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICA9IEBfOwoKICAgIGZvcmVhY2ggbXkgJFByb2plY3RJRCAoc29ydCBrZXlzICAlUGFyYW0pIHsKICAgICAgICBpZiAoJFBhcmFteyRQcm9qZWN0SUR9e1Byb2plY3R9KSB7CiAgICAgICAgICAgICMgZGIgcXVvdGUKICAgICAgICAgICAgZm9yZWFjaCAoa2V5cyAleyRQYXJhbXskUHJvamVjdElEfX0pIHsKICAgICAgICAgICAgICAgICRQYXJhbXskUHJvamVjdElEfXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRQcm9qZWN0SUR9eyRffSkgfHwgJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyBidWlsZCBzcWwKICAgICAgICAgICAgbXkgJFNRTCA9ICJVUERBVEUgdGltZV9hY2NvdW50aW5nX3Byb2plY3QgIiAuCiAgICAgICAgICAgICAgICAiU0VUIHByb2plY3QgPSAnIiAuICRQYXJhbXskUHJvamVjdElEfXtQcm9qZWN0fS4KICAgICAgICAgICAgICAgICAgICAiJywgc3RhdHVzID0gJyIgLiAkUGFyYW17JFByb2plY3RJRH17UHJvamVjdFN0YXR1c30gLgogICAgICAgICAgICAgICAgICAgICInLCBkZXNjcmlwdGlvbiA9ICciIC4gJFBhcmFteyRQcm9qZWN0SUR9e1Byb2plY3REZXNjcmlwdGlvbn0gLiAiJyAiIC4KICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICciIC4gJFByb2plY3RJRCAuICInIjsKICAgICAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICAgICAgaWYgKCEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oU1FMID0+ICRTUUwpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aW9uU2V0dGluZ3NHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgYWN0aW9uIHNldHRpbmdzCgogICAgbXkgJUFjdGlvbkRhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPkFjdGlvblNldHRpbmdzR2V0KCk7Cgo9Y3V0CgpzdWIgQWN0aW9uU2V0dGluZ3NHZXQgewogICAgbXkgJFNlbGYgICAgPSBzaGlmdDsKICAgIG15ICVEYXRhICAgID0gKCk7CgogICAgIyBkYiBzZWxlY3QKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlICgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCwgYWN0aW9uLCBzdGF0dXMgRlJPTSB0aW1lX2FjY291bnRpbmdfYWN0aW9uIiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkRGF0YXskUm93WzBdfXtBY3Rpb259ICAgICAgID0gICRSb3dbMV07CiAgICAgICAgJERhdGF7JFJvd1swXX17QWN0aW9uU3RhdHVzfSA9ICAkUm93WzJdOwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBBY3Rpb25TZXR0aW5nc0luc2VydCgpCgppbnNlcnQgbmV3IGFjdGlvbiBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+QWN0aW9uU2V0dGluZ3NJbnNlcnQoCiAgICAgICAgQWN0aW9uICAgICAgID0+ICdtZWV0aW5nJywgICAjIG9wdGlvbmFsCiAgICAgICAgQWN0aW9uU3RhdHVzID0+IDEgfHwgMCwgICAgICAjIG9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIEFjdGlvblNldHRpbmdzSW5zZXJ0IHsKICAgIG15ICRTZWxmICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICA9IEBfOwoKICAgICMgZGIgcXVvdGUKICAgIGZvcmVhY2ggKGtleXMgJVBhcmFtKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KSB8fCAnJzsKICAgIH0KCiAgICBpZiAoISRQYXJhbXtBY3Rpb259KSB7CiAgICAgICAgJFBhcmFte0FjdGlvbn0gICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRBY3Rpb25OYW1lJykgfHwgJyc7CiAgICB9CiAgICBpZiAoISRQYXJhbXtBY3Rpb25TdGF0dXN9KSB7CiAgICAgICAgJFBhcmFte0FjdGlvblN0YXR1c30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRBY3Rpb25TdGF0dXMnKSB8fCAnMCc7CiAgICB9CgogICAgIyBidWlsZCBzcWwKICAgIG15ICRTUUwgPSAiSU5TRVJUIElOVE8gdGltZV9hY2NvdW50aW5nX2FjdGlvbiAoYWN0aW9uLCBzdGF0dXMpIiAuCiAgICAgICAgIiBWQUxVRVMiIC4KICAgICAgICAiICgnIiAuICRQYXJhbXtBY3Rpb259LiAiJyAsICciIC4gJFBhcmFte0FjdGlvblN0YXR1c30gLiAiJykiOwogICAgIyBkYiBpbnNlcnQKICAgIGlmICghJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3Rpb25TZXR0aW5nc1VwZGF0ZSgpCgp1cGRhdGUgYWN0aW9uIGRhdGEgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5BY3Rpb25TZXR0aW5nc1VwZGF0ZSgKICAgICAgICAxICAgID0+IHsgICAgICAgICAgICAgICAgICAgICAgIyBlcXVhbCBBY3Rpb25JRAogICAgICAgICAgICBBY3Rpb24gICAgICAgPT4gJ21lZXRpbmcnLAogICAgICAgICAgICBBY3Rpb25TdGF0dXMgPT4gMSB8fCAwLAogICAgICAgIH0sCiAgICAgICAgMiAgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICMgZXF1YWwgQWN0aW9uSUQKICAgICAgICAgICAgQWN0aW9uICAgICAgID0+ICdqb3VybmV5JywKICAgICAgICAgICAgQWN0aW9uU3RhdHVzID0+IDEgfHwgMCwKICAgICAgICB9LAogICAgICAgIDMgICAgPT4gLi4uLi4uCiAgICApOwoKPWN1dAoKc3ViIEFjdGlvblNldHRpbmdzVXBkYXRlIHsKICAgIG15ICRTZWxmICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICA9IEBfOwogICAgbXkgJFNRTCAgICAgPSAnJzsKCiAgICBmb3JlYWNoIG15ICRBY3Rpb25JRCAoc29ydCBrZXlzICAlUGFyYW0pIHsKICAgICAgICBpZiAoJFBhcmFteyRBY3Rpb25JRH17QWN0aW9ufSkgewogICAgICAgICAgICAjIGRiIHF1b3RlCiAgICAgICAgICAgIGZvcmVhY2ggKGtleXMgJXskUGFyYW17JEFjdGlvbklEfX0pIHsKICAgICAgICAgICAgICAgICRQYXJhbXskQWN0aW9uSUR9eyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JEFjdGlvbklEfXskX30pIHx8ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgYnVpbGQgc3FsCiAgICAgICAgICAgICRTUUwgPSAiVVBEQVRFIHRpbWVfYWNjb3VudGluZ19hY3Rpb24gIiAuCiAgICAgICAgICAgICAgICAiU0VUIGFjdGlvbiA9ICciIC4gJFBhcmFteyRBY3Rpb25JRH17QWN0aW9ufS4gIicsIHN0YXR1cyA9ICciIC4gJFBhcmFteyRBY3Rpb25JRH17QWN0aW9uU3RhdHVzfSAuICInICIgLgogICAgICAgICAgICAgICAgIldIRVJFIGlkID0gJyIgLiAkQWN0aW9uSUQgLiAiJyI7CiAgICAgICAgICAgICMgZGIgaW5zZXJ0CiAgICAgICAgICAgIGlmICghJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFVzZXJHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgdXNlciBkYXRhCgogICAgbXkgJVVzZXJEYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyR2V0KCk7Cgo9Y3V0CgpzdWIgVXNlckdldCB7CiAgICBteSAkU2VsZiAgICA9IHNoaWZ0OwogICAgbXkgJURhdGEgICAgPSAoKTsKICAgICMgZGIgc2VsZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSAoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgdXNlcl9pZCwgZGVzY3JpcHRpb24sIHNob3dfb3ZlcnRpbWUsIGNyZWF0ZV9wcm9qZWN0IEZST00gdGltZV9hY2NvdW50aW5nX3VzZXIiLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICREYXRheyRSb3dbMF19e1VzZXJJRH0gICAgICAgID0gICRSb3dbMF07CiAgICAgICAgJERhdGF7JFJvd1swXX17RGVzY3JpcHRpb259ICAgPSAgJFJvd1sxXTsKICAgICAgICAkRGF0YXskUm93WzBdfXtTaG93T3ZlcnRpbWV9ICA9ICAkUm93WzJdOwogICAgICAgICREYXRheyRSb3dbMF19e0NyZWF0ZVByb2plY3R9ID0gICRSb3dbM107CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFVzZXJTZXR0aW5nc0dldCgpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSB1c2VyIHBlcmlvZCBkYXRhCgogICAgbXkgJVVzZXJEYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyU2V0dGluZ3NHZXQoKTsKCj1jdXQKCnN1YiBVc2VyU2V0dGluZ3NHZXQgewogICAgbXkgJFNlbGYgICAgPSBzaGlmdDsKICAgIG15ICVEYXRhICAgID0gKCk7CiAgICAjIGRiIHNlbGVjdAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUgKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIHVzZXJfaWQsIHByZWZlcmVuY2VfcGVyaW9kLCBkYXRlX3N0YXJ0LCBkYXRlX2VuZCwgd2Vla2x5X2hvdXJzLCBsZWF2ZV9kYXlzLCBvdmVydGltZSwgc3RhdHVzIEZST00gdGltZV9hY2NvdW50aW5nX3VzZXJfcGVyaW9kIiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkRGF0YXskUm93WzBdfXskUm93WzFdfXtVc2VySUR9ICAgICAgICAgICA9ICAkUm93WzBdOwogICAgICAgICREYXRheyRSb3dbMF19eyRSb3dbMV19e1BlcmlvZH0gICAgICAgICAgID0gICRSb3dbMV07CiAgICAgICAgJERhdGF7JFJvd1swXX17JFJvd1sxXX17RGF0ZVN0YXJ0fSAgICAgICAgPSAgc3Vic3RyKCRSb3dbMl0sIDAsIDEwKTsKICAgICAgICAkRGF0YXskUm93WzBdfXskUm93WzFdfXtEYXRlRW5kfSAgICAgICAgICA9ICBzdWJzdHIoJFJvd1szXSwgMCwgMTApOwogICAgICAgICREYXRheyRSb3dbMF19eyRSb3dbMV19e1dlZWtseUhvdXJzfSAgICAgID0gICRSb3dbNF07CiAgICAgICAgJERhdGF7JFJvd1swXX17JFJvd1sxXX17TGVhdmVEYXlzfSAgICAgICAgPSAgJFJvd1s1XTsKICAgICAgICAkRGF0YXskUm93WzBdfXskUm93WzFdfXtPdmVydGltZX0gICAgICAgICA9ICAkUm93WzZdOwogICAgICAgICREYXRheyRSb3dbMF19eyRSb3dbMV19e1VzZXJTdGF0dXN9ICAgICAgID0gICRSb3dbN107CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFVzZXJTZXR0aW5nc0luc2VydCgpCgppbnNlcnQgbmV3IHVzZXIgZGF0YSBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJTZXR0aW5nc0luc2VydCgKICAgICAgICBVc2VySUQgICAgICAgPT4gJzInLAogICAgICAgIFBlcmlvZCAgICAgICA9PiAnMicsCiAgICApOwoKPWN1dAoKc3ViIFVzZXJTZXR0aW5nc0luc2VydCB7CiAgICBteSAkU2VsZiAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgPSBAXzsKICAgIG15ICRJRCAgICAgID0gJyc7CiAgICBteSAkU1FMICAgICA9ICcnOwoKICAgICRQYXJhbXtXZWVrbHlIb3Vyc30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyV2Vla2x5SG91cnMnKSB8fCAnNDAnOwogICAgJFBhcmFte0xlYXZlRGF5c30gICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJMZWF2ZURheXMnKSAgIHx8ICcyNSc7CiAgICAkUGFyYW17VXNlclN0YXR1c30gID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlclN0YXR1cycpICAgICAgfHwgJzEnOwogICAgJFBhcmFte092ZXJ0aW1lfSAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJPdmVydGltZScpICAgIHx8ICcwJzsKICAgICRQYXJhbXtEYXRlRW5kfSAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyRGF0ZUVuZCcpICAgICB8fCAnMjAwNy0xMi0zMSc7CiAgICAkUGFyYW17RGF0ZVN0YXJ0fSAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlckRhdGVTdGFydCcpICAgfHwgJzIwMDctMDEtMDEnOwogICAgJFBhcmFte0Rlc2NyaXB0aW9ufSAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlckRlc2NyaXB0aW9uJykgfHwgJyc7CgogICAgIyBkYiBxdW90ZQogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgICAgIGlmKCAhZGVmaW5lZCgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJyc7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgc3FsCiAgICAkU1FMID0gIklOU0VSVCBJTlRPIHRpbWVfYWNjb3VudGluZ191c2VyX3BlcmlvZCAodXNlcl9pZCwgcHJlZmVyZW5jZV9wZXJpb2QsIGRhdGVfc3RhcnQsIGRhdGVfZW5kLCIgLgogICAgICAgICIgd2Vla2x5X2hvdXJzLCBsZWF2ZV9kYXlzLCBvdmVydGltZSwgc3RhdHVzKSIgLgogICAgICAgICIgVkFMVUVTIiAuCiAgICAgICAgIiAoJyRQYXJhbXtVc2VySUR9JywgJyRQYXJhbXtQZXJpb2R9JywgJyRQYXJhbXtEYXRlU3RhcnR9IDAwOjAwOjAwJywgJyRQYXJhbXtEYXRlRW5kfSAwMDowMDowMCcsIiAuCiAgICAgICAgIiAnJFBhcmFte1dlZWtseUhvdXJzfScsICckUGFyYW17TGVhdmVEYXlzfScsICckUGFyYW17T3ZlcnRpbWV9JywgJyRQYXJhbXtVc2VyU3RhdHVzfScpIjsKICAgICMgZGIgaW5zZXJ0CiAgICBpZiAoISRTZWxmLT57REJPYmplY3R9LT5EbyhTUUwgPT4gJFNRTCkpIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBTcGxpdCB0aGUgZm9sbG93aW5nIGNvZGUgaW4gYSBzZXBlcmF0ZSBmdW5jdGlvbiEKCiAgICAjY2hlY2sgaWYgdGhlIHVzZXIgc3RpbGwgZXhpc3RzCiAgICBteSAkVXNlcklEOwogICAgIyBidWlsZCBzcWwKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlICgKICAgICAgICBTUUwgPT4gIlNFTEVDVCB1c2VyX2lkIEZST00gdGltZV9hY2NvdW50aW5nX3VzZXIgV0hFUkUgdXNlcl9pZCA9ICciIC4gJFBhcmFte1VzZXJJRH0uICInIiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkVXNlcklEICAgICAgICAgICA9ICAkUm93WzBdOwogICAgfQogICAgaWYgKCFkZWZpbmVkKCRVc2VySUQpKSB7CiAgICAgICAgJFNRTCA9ICJJTlNFUlQgSU5UTyB0aW1lX2FjY291bnRpbmdfdXNlciAodXNlcl9pZCwgZGVzY3JpcHRpb24pIiAuCiAgICAgICAgICAgICIgVkFMVUVTIiAuCiAgICAgICAgICAgICIgKCckUGFyYW17VXNlcklEfScsICckUGFyYW17RGVzY3JpcHRpb259JykiOwogICAgICAgICMgZGIgaW5zZXJ0CiAgICAgICAgaWYgKCEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oU1FMID0+ICRTUUwpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gVXNlclNldHRpbmdzVXBkYXRlKCkKCnVwZGF0ZSB1c2VyIGRhdGEgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyU2V0dGluZ3NVcGRhdGUoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NvbWUgVGV4dCcsCiAgICAgICAgQ3JlYXRlUHJvamVjdCA9PiAxIHx8IDAsCiAgICAgICAgU2hvd092ZXJ0aW1lICA9PiAxIHx8IDAsCiAgICAgICAgMSAgICA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU29tZSBUZXh0JywKICAgICAgICAgICAgQ3JlYXRlUHJvamVjdCA9PiAxIHx8IDAsCiAgICAgICAgICAgIFNob3dPdmVydGltZSAgPT4gMSB8fCAwLAogICAgICAgICAgICAxID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGVyaW9kICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgIERhdGVTdGFydCAgICA9PiAnMjAwNS0xMi0xMicsCiAgICAgICAgICAgICAgICBEYXRlRW5kICAgICAgPT4gJzIwMDUtMTItMzEnLAogICAgICAgICAgICAgICAgV2Vla2x5SG91cnMgID0+ICczOCcsCiAgICAgICAgICAgICAgICBMZWF2ZURheXMgICAgPT4gJzI1JywKICAgICAgICAgICAgICAgIE92ZXJ0aW1lICAgICA9PiAnMzgnLAogICAgICAgICAgICAgICAgVXNlclN0YXR1cyAgID0+IDEgfHwgMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIDIgICAgPT4gewogICAgICAgICAgICAxID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAyLAogICAgICAgICAgICAgICAgUGVyaW9kICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgIERhdGVTdGFydCAgICA9PiAnMjAwNS0xMi0xMicsCiAgICAgICAgICAgICAgICBEYXRlRW5kICAgICAgPT4gJzIwMDUtMTItMzEnLAogICAgICAgICAgICAgICAgV2Vla2x5SG91cnMgID0+ICczOCcsCiAgICAgICAgICAgICAgICBMZWF2ZURheXMgICAgPT4gJzI1JywKICAgICAgICAgICAgICAgIE92ZXJ0aW1lICAgICA9PiAnMzgnLAogICAgICAgICAgICAgICAgVXNlclN0YXR1cyAgID0+IDEgfHwgMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIDMgICAgPT4gLi4uLi4uCiAgICApOwoKPWN1dAoKc3ViIFVzZXJTZXR0aW5nc1VwZGF0ZSB7CiAgICBteSAkU2VsZiAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgPSBAXzsKICAgIGZvcmVhY2ggbXkgJFVzZXJJRCAoc29ydCBrZXlzICAlUGFyYW0pIHsKICAgICAgICBmb3JlYWNoIChxdyhVc2VySUQgRGVzY3JpcHRpb24pKSB7CiAgICAgICAgICAgICRQYXJhbXskVXNlcklEfXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRVc2VySUR9eyRffSkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjc2V0IGRlZmF1bHQgZm9yIFNob3dPdmVyVGltZS4uLgogICAgICAgIGlmKCAhZGVmaW5lZCgkUGFyYW17JFVzZXJJRH17U2hvd092ZXJ0aW1lfSkpIHsKICAgICAgICAgICAgJFBhcmFteyRVc2VySUR9e1Nob3dPdmVydGltZX0gPSAwOwogICAgICAgIH0KCiAgICAgICAgI3NldCBkZWZhdWx0IGZvciBDcmVhdGVQcm9qZWN0Li4uCiAgICAgICAgaWYoICFkZWZpbmVkKCRQYXJhbXskVXNlcklEfXtDcmVhdGVQcm9qZWN0fSkpIHsKICAgICAgICAgICAgJFBhcmFteyRVc2VySUR9e0NyZWF0ZVByb2plY3R9ID0gMDsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgc3FsCiAgICAgICAgbXkgJFNRTCA9ICJVUERBVEUgdGltZV9hY2NvdW50aW5nX3VzZXIgIiAuCiAgICAgICAgICAgICJTRVQgZGVzY3JpcHRpb24gPSAnIiAgIC4gJFBhcmFteyRVc2VySUR9e0Rlc2NyaXB0aW9ufSAuCiAgICAgICAgICAgICInLCBzaG93X292ZXJ0aW1lID0gJyIgIC4gJFBhcmFteyRVc2VySUR9e1Nob3dPdmVydGltZX0gLgogICAgICAgICAgICAiJywgY3JlYXRlX3Byb2plY3QgPSAnIiAuICRQYXJhbXskVXNlcklEfXtDcmVhdGVQcm9qZWN0fSAuICInICIgLgogICAgICAgICAgICAiV0hFUkUgdXNlcl9pZCA9ICciIC4gJFBhcmFteyRVc2VySUR9e1VzZXJJRH0uICInIjsKICAgICAgICAjIGRiIGluc2VydAogICAgICAgIGlmICghJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoIChxdyhVc2VySUQgRGVzY3JpcHRpb24gU2hvd092ZXJ0aW1lIENyZWF0ZVByb2plY3QpKSB7CiAgICAgICAgICAgIGRlbGV0ZSAoJFBhcmFteyRVc2VySUR9eyRffSk7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoIG15ICRQZXJpb2QgKGtleXMgJXskUGFyYW17JFVzZXJJRH19KSB7CiAgICAgICAgICAgICMgZGIgcXVvdGUKICAgICAgICAgICAgZm9yZWFjaCAoa2V5cyAleyRQYXJhbXskVXNlcklEfXskUGVyaW9kfX0pIHsKICAgICAgICAgICAgICAgICRQYXJhbXskVXNlcklEfXskUGVyaW9kfXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRVc2VySUR9eyRQZXJpb2R9eyRffSkgfHwgJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyBidWlsZCBzcWwKICAgICAgICAgICAgbXkgJFNRTCA9ICJVUERBVEUgdGltZV9hY2NvdW50aW5nX3VzZXJfcGVyaW9kICIgLgogICAgICAgICAgICAgICAgIlNFVCBsZWF2ZV9kYXlzID0gJyIgIC4gJFBhcmFteyRVc2VySUR9eyRQZXJpb2R9e0xlYXZlRGF5c30gLgogICAgICAgICAgICAgICAgIicsIGRhdGVfc3RhcnQgPSAnIiAgIC4gJFBhcmFteyRVc2VySUR9eyRQZXJpb2R9e0RhdGVTdGFydH0gLgogICAgICAgICAgICAgICAgIicsIGRhdGVfZW5kID0gJyIgICAgIC4gJFBhcmFteyRVc2VySUR9eyRQZXJpb2R9e0RhdGVFbmR9IC4KICAgICAgICAgICAgICAgICInLCBvdmVydGltZSA9ICciICAgICAuICRQYXJhbXskVXNlcklEfXskUGVyaW9kfXtPdmVydGltZX0gLgogICAgICAgICAgICAgICAgIicsIHdlZWtseV9ob3VycyA9ICciIC4gJFBhcmFteyRVc2VySUR9eyRQZXJpb2R9e1dlZWtseUhvdXJzfSAuCiAgICAgICAgICAgICAgICAiJywgc3RhdHVzID0gJyIgICAgICAgLiAkUGFyYW17JFVzZXJJRH17JFBlcmlvZH17VXNlclN0YXR1c30uICInICIgLgogICAgICAgICAgICAgICAgIldIRVJFIHVzZXJfaWQgPSAnIiAuICRQYXJhbXskVXNlcklEfXskUGVyaW9kfXtVc2VySUR9IC4KICAgICAgICAgICAgICAgICInIEFORCBwcmVmZXJlbmNlX3BlcmlvZCA9ICciIC4gJFBlcmlvZCAuICInIjsKICAgICAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICAgICAgaWYgKCEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oU1FMID0+ICRTUUwpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gV29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjaygpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSBpbmNvbXBsZXRlIHdvcmtpbmcgZGF5cyBhbmQKdGhlIGluZm9ybWF0aW9uIGlmIHRoZSBpbmNvbXBsZXRlIHdvcmtpbmcgZGF5IGFyZSBpbiB0aGUgYWxsb3dlZApyYW5nZS4KCiAgICBteSAlV29ya2luZ1VuaXRzQ2hlY2sgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPldvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2soCiAgICAgICAgVXNlcklEID0+ICcyJywgICAgIyBPcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBXb3JraW5nVW5pdHNDb21wbGV0bmVzc0NoZWNrIHsKICAgIG15ICRTZWxmICAgICAgICAgICAgICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICAgICAgICAgICAgICA9IEBfOwogICAgbXkgJURhdGEgICAgICAgICAgICAgICAgPSAoKTsKICAgIG15ICRXb3JraW5nVW5pdElEICAgICAgID0gMDsKICAgIG15ICVDb21wbGV0ZVdvcmtpbmdEYXlzID0gKCk7CiAgICBteSAoJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIpID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgKTsKCiAgICAkUGFyYW17VXNlcklEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17VXNlcklEfSkgfHwgJyc7CgogICAgaWYgKCEkUGFyYW17VXNlcklEfSkgewogICAgICAgICRQYXJhbXtVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwogICAgfQoKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlICgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBESVNUSU5DVCB0aW1lX3N0YXJ0IEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIFdIRVJFIHVzZXJfaWQgPSAnJFBhcmFte1VzZXJJRH0nIiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICBpZiAoJFJvd1swXSA9fiAvXihcZCspLShcZCspLShcZCspKC4rPykvKSB7CiAgICAgICAgICAgICRDb21wbGV0ZVdvcmtpbmdEYXlzeyQxfXskMn17JDN9ID0gMTsKICAgICAgICB9CiAgICB9CiAgICBteSAlVXNlckN1cnJlbnRQZXJpb2QgPSAkU2VsZi0+VXNlckN1cnJlbnRQZXJpb2RHZXQoCiAgICAgICAgWWVhciAgID0+ICRZZWFyLAogICAgICAgIE1vbnRoICA9PiAkTW9udGgsCiAgICAgICAgRGF5ICAgID0+ICREYXksCiAgICApOwogICAgbXkgJFdvcmtpbmdEYXlzICAgICA9IDA7CiAgICBteSAkWWVhclN0YXJ0ICAgICAgID0gMDsKICAgIG15ICRNb250aFN0YXJ0ICAgICAgPSAwOwogICAgbXkgJERheVN0YXJ0ICAgICAgICA9IDA7CiAgICBteSAkTW9udGhTdGFydFBvaW50ID0gMDsKICAgIG15ICREYXlTdGFydFBvaW50ICAgPSAwOwogICAgbXkgJE1vbnRoRW5kUG9pbnQgICA9IDA7CiAgICBteSAkRGF5RW5kUG9pbnQgICAgID0gMDsKICAgIG15ICRZZWFyRW5kICAgICAgICAgPSAkWWVhcjsKICAgIG15ICRNb250aEVuZCAgICAgICAgPSAkTW9udGg7CiAgICBteSAkRGF5RW5kICAgICAgICAgID0gJERheTsKCiAgICBpZiAoJFVzZXJDdXJyZW50UGVyaW9keyRQYXJhbXtVc2VySUR9fXtEYXRlU3RhcnR9ID1+IC9eKFxkKyktKFxkKyktKFxkKykvKSB7CiAgICAgICAgJFllYXJTdGFydCAgPSAkMTsKICAgICAgICAkTW9udGhTdGFydCA9ICQyOwogICAgICAgICREYXlTdGFydCAgID0gJDM7CiAgICB9CgogICAgZm9yIChteSAkWWVhciA9ICRZZWFyU3RhcnQ7ICRZZWFyIDw9ICRZZWFyRW5kOyAkWWVhcisrKSB7CiAgICAgICAgaWYgKCRZZWFyID09ICRZZWFyU3RhcnQpIHsKICAgICAgICAgICAgJE1vbnRoU3RhcnRQb2ludCA9ICRNb250aFN0YXJ0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE1vbnRoU3RhcnRQb2ludCA9IDE7CiAgICAgICAgfQogICAgICAgIGlmICgkWWVhciA9PSAkWWVhckVuZCkgewogICAgICAgICAgICAkTW9udGhFbmRQb2ludCA9ICRNb250aEVuZDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRNb250aEVuZFBvaW50ID0gMTI7CiAgICAgICAgfQogICAgICAgIGZvciAobXkgJE1vbnRoID0gJE1vbnRoU3RhcnRQb2ludDsgJE1vbnRoIDw9ICRNb250aEVuZFBvaW50OyAkTW9udGgrKykgewogICAgICAgICAgICBpZiAoJFllYXIgPT0gJFllYXJTdGFydCAmJiAkTW9udGggPT0gJE1vbnRoU3RhcnQgKSB7CiAgICAgICAgICAgICAgICAkRGF5U3RhcnRQb2ludCA9ICREYXlTdGFydDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREYXlTdGFydFBvaW50ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFllYXIgPT0gJFllYXJFbmQgJiYgJE1vbnRoID09ICRNb250aEVuZCApIHsKICAgICAgICAgICAgICAgICREYXlFbmRQb2ludCA9ICREYXlFbmQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGF5RW5kUG9pbnQgPSBEYXlzX2luX01vbnRoKCRZZWFyLCAkTW9udGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRNb250aFN0cmluZyA9IHNwcmludGYoIiUwMmQiLCRNb250aCk7CiAgICAgICAgICAgIGZvciAobXkgJERheSA9ICREYXlTdGFydFBvaW50OyAkRGF5IDw9ICREYXlFbmRQb2ludDsgJERheSsrKSB7CiAgICAgICAgICAgICAgICBteSAkVmFjYXRpb25DaGVjayA9ICRTZWxmLT5WYWNhdGlvbkNoZWNrKAogICAgICAgICAgICAgICAgICAgIFllYXIgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgICAgIE1vbnRoID0+ICRNb250aCwKICAgICAgICAgICAgICAgICAgICBEYXkgICA9PiAkRGF5LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkRGF5U3RyaW5nID0gc3ByaW50ZigiJTAyZCIsJERheSk7CiAgICAgICAgICAgICAgICBteSAkV2Vla2RheSA9IERheV9vZl9XZWVrKCRZZWFyLCAkTW9udGgsICREYXkpOwogICAgICAgICAgICAgICAgaWYgKCRXZWVrZGF5ICE9IDYgJiYgJFdlZWtkYXkgIT0gNyAmJiAhJFZhY2F0aW9uQ2hlY2spIHsKICAgICAgICAgICAgICAgICAgICAkV29ya2luZ0RheXMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkV2Vla2RheSAhPSA2ICYmICRXZWVrZGF5ICE9IDcKICAgICAgICAgICAgICAgICAgICAmJiAhJFZhY2F0aW9uQ2hlY2sKICAgICAgICAgICAgICAgICAgICAmJiAhJENvbXBsZXRlV29ya2luZ0RheXN7JFllYXJ9eyRNb250aFN0cmluZ317JERheVN0cmluZ30KICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICREYXRhe0luY29tcGxldGV9eyRZZWFyfXskTW9udGhTdHJpbmd9eyREYXlTdHJpbmd9ID0gJFdvcmtpbmdEYXlzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgbXkgJE1heEludGVydmFsbE9mSW5jb21wbGV0ZURheXMgICAgICAgICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpNYXhJbnRlcnZhbE9mSW5jb21wbGV0ZURheXMnKSB8fCAnNSc7CiAgICBteSAkTWF4SW50ZXJ2YWxsT2ZJbmNvbXBsZXRlRGF5c0JlZm9yZVdhcm5pbmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6Ok1heEludGVydmFsT2ZJbmNvbXBsZXRlRGF5c0JlZm9yZVdhcm5pbmcnKSB8fCAnMyc7CgogICAgZm9yZWFjaCBteSAkWWVhciAoa2V5cyAleyREYXRhe0luY29tcGxldGV9fSkgewogICAgICAgIGZvcmVhY2ggbXkgJE1vbnRoIChrZXlzICV7JERhdGF7SW5jb21wbGV0ZX17JFllYXJ9fSkgewogICAgICAgICAgICBmb3JlYWNoIG15ICREYXkgKGtleXMgJXskRGF0YXtJbmNvbXBsZXRlfXskWWVhcn17JE1vbnRofX0pIHsKICAgICAgICAgICAgICAgIGlmICgkRGF0YXtJbmNvbXBsZXRlfXskWWVhcn17JE1vbnRofXskRGF5fSA8ICRXb3JraW5nRGF5cyAtICRNYXhJbnRlcnZhbGxPZkluY29tcGxldGVEYXlzKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7RW5mb3JjZUluc2VydH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCREYXRhe0luY29tcGxldGV9eyRZZWFyfXskTW9udGh9eyREYXl9IDwgJFdvcmtpbmdEYXlzIC0gJE1heEludGVydmFsbE9mSW5jb21wbGV0ZURheXNCZWZvcmVXYXJuaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7V2FybmluZ30gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBXb3JraW5nVW5pdHNHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgd29ya2luZyB1bml0cyBkYXRhCgogICAgbXkgJVdvcmtpbmdVbml0c0RhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPldvcmtpbmdVbml0c0dldCgKICAgICAgICBZZWFyICAgPT4gJzIwMDUnLAogICAgICAgIE1vbnRoICA9PiAnNycsCiAgICAgICAgRGF5ICAgID0+ICcxMycsCiAgICAgICAgVXNlcklEID0+ICcyJywgICAgIyBPcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBXb3JraW5nVW5pdHNHZXQgewogICAgbXkgJFNlbGYgICAgICAgICAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSAgICAgICAgID0gQF87CiAgICBteSAlRGF0YSAgICAgICAgICA9ICgpOwogICAgbXkgJFdvcmtpbmdVbml0SUQgPSAwOwogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pIHx8ICcnOwogICAgfQogICAgaWYgKCEkUGFyYW17VXNlcklEfSkgewogICAgICAgICRQYXJhbXtVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwogICAgfQoKICAgIG15ICREYXRlID0gc3ByaW50ZigiJTA0ZC0lMDJkLSUwMmQiLCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9KTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlICgKICAgICAgICBTUUwgPT4gIlNFTEVDVCB1c2VyX2lkLCBwcm9qZWN0X2lkLCBhY3Rpb25faWQsIHJlbWFyaywgdGltZV9zdGFydCwgdGltZV9lbmQsIiAuCiAgICAgICAgICAgICIgcGVyaW9kIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIFdIRVJFIHRpbWVfc3RhcnQgTElLRSAnJERhdGUlJyIgLgogICAgICAgICAgICAiIEFORCB1c2VyX2lkID0gJyRQYXJhbXtVc2VySUR9JyBPUkRFUiBieSBpZCIsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgaWYgKCRSb3dbNF0gPX4gL14oLis/KVxzKFxkKzpcZCspOihcZCspLykgewogICAgICAgICAgICAkV29ya2luZ1VuaXRJRCsrOwogICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17VXNlcklEfSAgICAgPSAgJFJvd1swXTsKICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gID0gICRSb3dbMV07CiAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gICA9ICAkUm93WzJdOwogICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UmVtYXJrfSAgICAgPSAgJFJvd1szXTsKICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1N0YXJ0VGltZX0gID0gICQyOwogICAgICAgICAgICBpZiggZGVmaW5lZCgkUm93WzZdKSkgewogICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gICAgID0gIHNwcmludGYgKCIlLjJmIiwgJFJvd1s2XSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSAgICAgPSAgMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e0RhdGV9ICAgICAgID0gICQxOwogICAgICAgICAgICBpZiAoJFJvd1s1XSA9fiAvXiguKz8pXHMoXGQrOlxkKyk6KFxkKykvKSB7CiAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17RW5kVGltZX0gICAgPSAgJDI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFdvcmtpbmdVbml0c0luc2VydCgpCgppbnNlcnQgd29ya2luZyB1bml0cyBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPldvcmtpbmdVbml0c0luc2VydCgKICAgICAgICBZZWFyICA9PiAnMjAwNScsCiAgICAgICAgTW9udGggPT4gJzA3JywKICAgICAgICBEYXkgICA9PiAnMDInLAogICAgICAgIDEgICAgPT4gewogICAgICAgICAgICBQcm9qZWN0SUQgPT4gMSwKICAgICAgICAgICAgQWN0aW9uSUQgID0+IDIzLAogICAgICAgICAgICBSZW1hcmsgICAgPT4gNCwKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICc3OjMwJywKICAgICAgICAgICAgRW5kVGltZSAgID0+ICcxMTowMCcsCiAgICAgICAgICAgIFBlcmlvZCAgICA9PiAnOC41JywKICAgICAgICB9LAogICAgICAgIDIgLi4uLi4uCiAgICApOwoKPWN1dAoKc3ViIFdvcmtpbmdVbml0c0luc2VydCB7CiAgICBteSAkU2VsZiAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgPSBAXzsKICAgIG15ICRTUUwgICAgID0gJyc7CgogICAgZm9yZWFjaCAocXcoWWVhciBNb250aCBEYXkpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KSB8fCAnJzsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiV29ya2luZ1VuaXRzSW5zZXJ0OiBOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJERhdGUgPSBzcHJpbnRmKCIlMDRkLSUwMmQtJTAyZCIsICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0pOwoKICAgIGlmICghJFNlbGYtPldvcmtpbmdVbml0c0RlbGV0ZSgKICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICApCiAgICApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdDYW5cJ3QgZGVsZXRlIFdvcmtpbmcgVW5pdHMhJyk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGRlbGV0ZSAkUGFyYW17WWVhcn07CiAgICBkZWxldGUgJFBhcmFte01vbnRofTsKICAgIGRlbGV0ZSAkUGFyYW17RGF5fTsKCiAgICAjaW5zZXJ0IG5ldyB3b3JraW5nIHVuaXRzCiAgICBmb3JlYWNoIG15ICRXb3JraW5nVW5pdElEIChzb3J0IGtleXMgICVQYXJhbSkgewogICAgICAgICMgZGIgcXVvdGUKICAgICAgICBmb3JlYWNoIChrZXlzICV7JFBhcmFteyRXb3JraW5nVW5pdElEfX0pIHsKICAgICAgICAgICAgJFBhcmFteyRXb3JraW5nVW5pdElEfXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRXb3JraW5nVW5pdElEfXskX30pIHx8ICcnOwogICAgICAgIH0KICAgICAgICBteSAkU3RhcnRUaW1lID0gJERhdGUuIiAiLiRQYXJhbXskV29ya2luZ1VuaXRJRH17U3RhcnRUaW1lfTsKICAgICAgICBteSAkRW5kVGltZSAgID0gJERhdGUuIiAiLiRQYXJhbXskV29ya2luZ1VuaXRJRH17RW5kVGltZX07CgogICAgICAgIGlmKCAoIWRlZmluZWQoJFBhcmFteyRXb3JraW5nVW5pdElEfXtQZXJpb2R9KSkgfHwgKCRQYXJhbXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSBlcSAnJykpIHsKICAgICAgICAgICAgJFBhcmFteyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ID0gJ05VTEwnOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBzcWwKICAgICAgICAkU1FMID0gIklOU0VSVCBJTlRPIHRpbWVfYWNjb3VudGluZ190YWJsZSAodXNlcl9pZCwgcHJvamVjdF9pZCwgYWN0aW9uX2lkLCByZW1hcmssIiAuCiAgICAgICAgICAgICIgdGltZV9zdGFydCwgdGltZV9lbmQsIHBlcmlvZCwgY3JlYXRlZCApIiAuCiAgICAgICAgICAgICIgVkFMVUVTIiAuCiAgICAgICAgICAgICIgKCckU2VsZi0+e1VzZXJJRH0nLCAnJFBhcmFteyRXb3JraW5nVW5pdElEfXtQcm9qZWN0SUR9JywgJyRQYXJhbXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9JywiIC4KICAgICAgICAgICAgIiAnJFBhcmFteyRXb3JraW5nVW5pdElEfXtSZW1hcmt9JywgJyRTdGFydFRpbWUnLCAnJEVuZFRpbWUnLCAkUGFyYW17JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0sIiAuCiAgICAgICAgICAgICIgY3VycmVudF90aW1lc3RhbXApIjsKICAgICAgICAjIGRiIGluc2VydAogICAgICAgIGlmICghJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFdvcmtpbmdVbml0c0RlbGV0ZSgpCgpkZWxldHMgd29ya2luZyB1bml0cyBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPldvcmtpbmdVbml0c0RlbGV0ZSgKICAgICAgICBZZWFyICA9PiAnMjAwNScsCiAgICAgICAgTW9udGggPT4gJzcnLAogICAgICAgIERheSAgID0+ICcxMycsCiAgICApOwoKPWN1dAoKc3ViIFdvcmtpbmdVbml0c0RlbGV0ZSB7CiAgICBteSAkU2VsZiAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgPSBAXzsKICAgIG15ICRTUUwgICAgID0gJyc7CgogICAgZm9yZWFjaCAocXcoWWVhciBNb250aCBEYXkpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KSB8fCAnJzsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiV29ya2luZ1VuaXRzSW5zZXJ0OiBOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJERhdGUgPSBzcHJpbnRmKCIlMDRkLSUwMmQtJTAyZCIsICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0pOwoKICAgICMgZGVsZXRlIG9sZCB3b3JraW5nIHVuaXRzCiAgICAkU1FMID0gIkRFTEVURSBGUk9NIHRpbWVfYWNjb3VudGluZ190YWJsZSAiIC4KICAgICAgICAiV0hFUkUgdGltZV9zdGFydCBMSUtFICckRGF0ZSUnIEFORCB1c2VyX2lkID0gJyRTZWxmLT57VXNlcklEfSciIDsKICAgIGlmICghJFNlbGYtPntEQk9iamVjdH0tPkRvKFNRTCA9PiAkU1FMKSkgewogICAgICAgIHJldHVybiA7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKIyBGUkFNRVdPUkstMi4xOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgdGltZW9iamVjdAo9aXRlbSBWYWNhdGlvbkNoZWNrKCkKCmNoZWNrIGlmIHRoZSBzZWxlY3RlZCBkYXkgaXMgYSB2YWNhdGlvbiAoaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91Cmluc2VydCAwMSBvciAxIGZvciBtb250aCBvciBkYXkgaW4gdGhlIGZ1bmN0aW9uIG9yIGluIHRoZSBTeXNDb25maWcpCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5WYWNhdGlvbkNoZWNrKAogICAgICAgIFllYXIgID0+ICcyMDA1JywKICAgICAgICBNb250aCA9PiAnNycsIHx8IDA3CiAgICAgICAgRGF5ICAgPT4gJzEzJywKICAgICk7Cgo9Y3V0CgpzdWIgVmFjYXRpb25DaGVjayB7CiAgICBteSAkU2VsZiAgICAgICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICAgICAgID0gQF87CiAgICBteSAkVmFjYXRpb25OYW1lID0gJyc7CgogICAgIyBjaGVjayByZXF1aXJlZCBwYXJhbXMKICAgIGZvcmVhY2ggKHF3KFllYXIgTW9udGggRGF5KSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVmFjYXRpb25DaGVjazogTmVlZCAkXyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAkUGFyYW17TW9udGh9ID0gc3ByaW50ZigiJTAyZCIsICRQYXJhbXtNb250aH0pOwogICAgJFBhcmFte0RheX0gICA9IHNwcmludGYoIiUwMmQiLCAkUGFyYW17RGF5fSk7CgogICAgbXkgJFRpbWVWYWNhdGlvbkRheXMgICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVWYWNhdGlvbkRheXMnKTsKICAgIG15ICRUaW1lVmFjYXRpb25EYXlzT25lVGltZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lVmFjYXRpb25EYXlzT25lVGltZScpOwogICAgaWYgKGRlZmluZWQoJFRpbWVWYWNhdGlvbkRheXMtPnskUGFyYW17TW9udGh9fS0+eyRQYXJhbXtEYXl9fSkpIHsKICAgICAgICByZXR1cm4gJFRpbWVWYWNhdGlvbkRheXMtPnskUGFyYW17TW9udGh9fS0+eyRQYXJhbXtEYXl9fTsKICAgIH0KICAgIGVsc2lmIChkZWZpbmVkKCRUaW1lVmFjYXRpb25EYXlzT25lVGltZS0+eyRQYXJhbXtZZWFyfX0tPnskUGFyYW17TW9udGh9fS0+eyRQYXJhbXtEYXl9fSkpIHsKICAgICAgICByZXR1cm4gJFRpbWVWYWNhdGlvbkRheXNPbmVUaW1lLT57JFBhcmFte1llYXJ9fS0+eyRQYXJhbXtNb250aH19LT57JFBhcmFte0RheX19OwogICAgfQogICAgZWxzaWYgKGRlZmluZWQoJFRpbWVWYWNhdGlvbkRheXMtPntpbnQoJFBhcmFte01vbnRofSl9LT57aW50KCRQYXJhbXtEYXl9KX0pKSB7CiAgICAgICAgcmV0dXJuICRUaW1lVmFjYXRpb25EYXlzLT57aW50KCRQYXJhbXtNb250aH0pfS0+e2ludCgkUGFyYW17RGF5fSl9OwogICAgfQogICAgZWxzaWYgKGRlZmluZWQoJFRpbWVWYWNhdGlvbkRheXNPbmVUaW1lLT57JFBhcmFte1llYXJ9fS0+e2ludCgkUGFyYW17TW9udGh9KX0tPntpbnQoJFBhcmFte0RheX0pfSkpIHsKICAgICAgICByZXR1cm4gJFRpbWVWYWNhdGlvbkRheXNPbmVUaW1lLT57JFBhcmFte1llYXJ9fS0+e2ludCgkUGFyYW17TW9udGh9KX0tPntpbnQoJFBhcmFte0RheX0pfTsKICAgIH0KICAgIHJldHVybjsKfQoKPWl0ZW0gUHJvamVjdEFjdGlvblJlcG9ydGluZygpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSBob3VycyBkZXBlbmRlbnQgcHJvamVjdCBhbmQgYWN0aW9uIGRhdGEKCiAgICBteSAlUHJvamVjdERhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlByb2plY3RBY3Rpb25SZXBvcnRpbmcoCiAgICAgICAgWWVhciAgPT4gMjAwNSwKICAgICAgICBNb250aCA9PiA3LAogICAgICAgIFVzZXJJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFByb2plY3RBY3Rpb25SZXBvcnRpbmcgewogICAgbXkgJFNlbGYgICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICAgPSBAXzsKICAgIG15ICVEYXRhICAgICA9ICgpOwogICAgbXkgJElEU2VsZWN0ID0gJyc7CiAgICBmb3JlYWNoIChxdyhZZWFyIE1vbnRoKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSkgfHwgJyc7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIlByb2plY3RBY3Rpb25SZXBvcnRpbmc6IE5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoJFBhcmFte1VzZXJJRH0pIHsKICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17VXNlcklEfSkgfHwgJyc7CiAgICAgICAgJElEU2VsZWN0ID0gIiBBTkQgdXNlcl9pZCA9ICckUGFyYW17VXNlcklEfSciOwogICAgfQogICAgIyBob3VycyBwZXIgbW9udGgKICAgIG15ICREYXRlU3RyaW5nID0gJFBhcmFte1llYXJ9IC4gIi0iIC4gc3ByaW50ZigiJTAyZCIsICRQYXJhbXtNb250aH0pOwoKICAgIG15ICRTUUxfUXVlcnlfVGltZVN0YXJ0ID0gInRpbWVfc3RhcnQgPD0gJyREYXRlU3RyaW5nLTMxIDIzOjU5OjU5JyRJRFNlbGVjdCI7CgogICAgI3R0bzogeWVzLCBJIGtub3cgdGhlcmUgYXJlIHNvbWUgbm9uLWxlYXAteWVhcnMsIC4uLgogICAgIy4uLmJ1dCBjb20nb24gdGhlc2UgZmV3IGVudHJpZXMgaW4gdGhlIGVycm9yIGxvZyB3b24ndCBib3RoZXIgdG9vIG11Y2guLi4gOi0pCiAgICBpZiggKCRQYXJhbXtNb250aH0gPT0gMikgfHwgKCRQYXJhbXtNb250aH0gPT0gNCkgfHwgKCRQYXJhbXtNb250aH0gPT0gNikgfHwgKCRQYXJhbXtNb250aH0gPT0gOSkgfHwgKCRQYXJhbXtNb250aH0gPT0gMTEpKXsKICAgICAgICAkU1FMX1F1ZXJ5X1RpbWVTdGFydCA9ICJ0aW1lX3N0YXJ0IDw9ICckRGF0ZVN0cmluZy0zMCAyMzo1OTo1OSckSURTZWxlY3QiOwogICAgfQoKICAgICMgVG90YWwgaG91cnMKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlICgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBwcm9qZWN0X2lkLCBhY3Rpb25faWQsIHBlcmlvZCBGUk9NIHRpbWVfYWNjb3VudGluZ190YWJsZSBXSEVSRSAkU1FMX1F1ZXJ5X1RpbWVTdGFydCIsCiAgICApOwogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkRGF0YXtUb3RhbH17JFJvd1swXX17JFJvd1sxXX17SG91cnN9ICs9ICRSb3dbMl07CiAgICB9CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUgKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIHByb2plY3RfaWQsIGFjdGlvbl9pZCwgcGVyaW9kIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIiAuCiAgICAgICAgICAgICIgV0hFUkUgdGltZV9zdGFydCA+PSAnJERhdGVTdHJpbmctMDEgMDA6MDA6MDAnIEFORCAkU1FMX1F1ZXJ5X1RpbWVTdGFydCIsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJERhdGF7UGVyTW9udGh9eyRSb3dbMF19eyRSb3dbMV19e0hvdXJzfSArPSAkUm93WzJdOwogICAgfQogICAgcmV0dXJuICVEYXRhOwoKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEwICQgJERhdGU6IDIwMDcvMDYvMDUgMTQ6MTk6NDkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9BZ2VudFRpbWVBY2NvdW50aW5nLnBtIC0gdGhlIGRlIGxhbmd1YWdlIGZvciBBZ2VudFRpbWVBY2NvdW50aW5nCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IGRlX0FnZW50VGltZUFjY291bnRpbmcucG0sdiAxLjQgMjAwNy8wNi8wNSAxNDoxMzo0NCB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfQWdlbnRUaW1lQWNjb3VudGluZzsKCnVzZSBzdHJpY3Q7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259ID0geyAleyRTZWxmLT57VHJhbnNsYXRpb259fSwKICAgICMgVGVtcGxhdGU6IEFnZW50VGltZUFjY291bnRpbmcKICAgICAgICAnU2V0dGluZycgICAgICAgID0+ICdLb25maWd1cmF0aW9uJywKICAgICAgICAnUHJvamVjdFNldHRpbmcnID0+ICdQcm9qZWt0a29uZmlndXJhdGlvbicsCiAgICAgICAgI25ldyB0cmFuc2xhdGlvbnMuLi4KICAgICAgICAnRGF0ZScgICAgICAgID0+ICdEYXR1bScsCiAgICAgICAgJ3VudGlsJyA9PiAnYmlzJywKICAgICAgICAnV29ya2luZ0hvdXJzJyAgICA9PiAnQXJiZWl0c3N0dW5kZW4nLAogICAgICAgICdXb3JraW5nIEhvdXJzJyAgICA9PiAnQXJiZWl0c3N0dW5kZW4nLAogICAgICAgICdXZWVrbHkgSG91cnMnID0+ICdXb2NoZW5zdHVuZGVuJywKICAgICAgICAndGhpcyBtb250aCcgICAgPT4gJ2RpZXNlciBNb25hdCcsCiAgICAgICAgJ092ZXJ0aW1lIHRvdGFsJyAgICA9PiAnU3VtbWUg3GJlcnN0dW5kZW4nLAogICAgICAgICdMZWF2ZSBEYXlzJyAgICA9PiAnVGFnZSBhYndlc2VuZCcsCiAgICAgICAgJ0xlYXZlRGF5IHRoaXMgbW9udGgnICAgID0+ICdVcmxhdWJzdGFnZSAoZGllc2VyIE1vbmF0KScsCiAgICAgICAgJ0xlYXZlRGF5VG90YWwnICAgID0+ICdVcmxhdWJzdGFnZSAoU3VtbWUpJywKICAgICAgICAnTGVhdmVEYXkgcmVtYWluaW5nJyAgICA9PiAnVXJsYXVic3RhZ2UgKHZlcmJsZWliZW5kKScsCiAgICAgICAgJ0Rpc2Vhc2VkIHRoaXMgbW9udGgnICAgID0+ICdFcmtyYW5rdCAoZGllc2VyIE1vbmF0KScsCiAgICAgICAgJ0Rpc2Vhc2VkVG90YWwnICAgID0+ICdFcmtyYW5rdCAoU3VtbWUpJywKICAgICAgICAnVGltZUFjY291bnRpbmcnID0+ICdaZWl0ZXJmYXNzdW5nJywKICAgICAgICAnVGltZSBBY2NvdW50aW5nIE92ZXJ2aWV3IHBlciBNb250aCcgPT4gJ01vbmF0c/xiZXJzaWNodCBaZWl0ZXJmYXNzdW5nJywKICAgICAgICAnRWRpdCBUaW1lIEFjY291bnRpbmcnID0+ICdaZWl0ZXJmYXNzdW5nIGJlYXJiZWl0ZW4nLAogICAgICAgICdFZGl0IFRpbWUgQWNjb3VudGluZyBQcmVmZXJlbmNlJyA9PiAnWmVpdGVyZmFzc3VuZ3NlaW5zdGVsbHVuZ2VuIGJlYXJiZWl0ZW4nLAogICAgICAgICdVc2VyIFJlcG9ydGluZycgPT4gJ051dHplcmJlcmljaHRlJywKICAgICAgICAnUHJvamVjdCBSZXBvcnRpbmcnID0+ICdQcm9qZWt0YmVyaWNodGUnLAogICAgICAgICdUaW1lIFByZXBvcnRpbmcnID0+ICdaZWl0YmVyaWNodGUnLAogICAgICAgICdMZWF2ZURheSBSZW1haW5pbmcnID0+ICdWZXJibGVpYmVuZGUgVXJsYXVic3RhZ2UnLAogICAgICAgICdwZXIgTW9udGgnID0+ICdwcm8gTW9uYXQnLAogICAgICAgICdIb3VycycgPT4gJ1N0dW5kZW4nLAogICAgICAgICdUaW1lIHNlbGVjdGlvbicgPT4gJ0F1c3dhaGwgRGF0dW0nLAogICAgICAgICdJbmNvbXBsZXRlIERheXMnID0+ICduaWNodCBhdXNnZWb8bGx0ZSBUYWdlJywKICAgICAgICAnUHJvamVjdCcgPT4gJ1Byb2pla3QnLAogICAgICAgICdQcm9qZWN0cycgPT4gJ1Byb2pla3RlJywKICAgICAgICAnVG90YWwnID0+ICdTdW1tZScsCiAgICAgICAgJ1JlcG9ydGluZycgPT4gJ0JlcmljaHRzd2VzZW4nLAogICAgICAgICdBY3Rpb24gU2V0dGluZycgPT4gJ0FrdGlvbnNlaW5zdGVsbHVuZ2VuJywKICAgICAgICAnVXNlciBTZXR0aW5nJyA9PiAnTnV0emVyZWluc3RlbGx1bmdlbicsCiAgICAgICAgJ1Nob3cgT3ZlcnRpbWUnID0+ICfcYmVyc3R1bmRlbiBhbnplaWdlbicsCiAgICAgICAgJ0NyZWF0ZSBQcm9qZWN0JyA9PiAnUHJvamVrdCBlcnN0ZWxsZW4nLAogICAgICAgICdOZXcgdXNlciBzZXR0aW5nJyA9PiAnTmV1ZSBOdXR6ZXJlaW5zdGVsbHVuZycsCiAgICAgICAgJ1JlbWFyaycgPT4gJ0FubWVya3VuZycsCiAgICAgICAgJ1N0YXJ0dGltZScgPT4gJ0JlZ2lubicsCiAgICAgICAgJ0VuZHRpbWUnID0+ICdFbmRlJywKICAgICAgICAnU3RhcnRkYXRlJyA9PiAnRGF0dW0gQmVnaW5uJywKICAgICAgICAnRW5kZGF0ZScgPT4gJ0RhdHVtIEVuZGUnLAogICAgICAgICdQZXJpb2QnID0+ICdEYXVlcicsCiAgICAgICAgJ0xlYXZlIERheScgPT4gJ1VybGF1YnN0YWcnLAogICAgICAgICdMZWF2ZURheScgPT4gJ1VybGF1YicsCiAgICAgICAgJ0Rpc2Vhc2VkJyA9PiAnRXJrcmFua3QnLAogICAgICAgICdPdmVydGltZScgPT4gJ9xiZXJzdHVuZGVuJywKICAgICAgICAnVG90YWwnID0+ICdTdW1tZScsCiAgICAgICAgJ092ZXJ2aWV3IG9mICcgPT4gJ9xiZXJzaWNodCAtICcsCiAgICAgICAgJ1RpbWVBY2NvdW50aW5nIG9mJyA9PiAnWmVpdGVyZmFzc3VuZyB2b20nLAogICAgICAgICdTdWNjZXNzZnVsIGluc2VydCEnID0+ICdFcmZvbGdyZWljaCBlaW5nZWb8Z3QhJywKICAgICAgICAnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIE9iamVjdCcgPT4gJ1dvbGxlbiBTaWUgZGllc2VuIEVpbnRyYWcgd2lya2xpY2ggbPZzY2hlbicsCiAgICAgICAgJ0NhblwndCBpbnNlcnQgV29ya2luZyBVbml0cyEnID0+ICdLYW5uIEFyYmVpdHNzdHVuZGVuIG5pY2h0IGVpbmb8Z2VuIScsCiAgICAgICAgJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIG9mIG1pc3NpbmcgQWN0aW9uIScgPT4gJ05pY2h0IHNwZWljaGVyYmFyIC0gQWt0aW9uIGZlaGx0IScsCiAgICAgICAgJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIG9mIG1pc3NpbmcgUHJvamVjdCEnID0+ICdOaWNodCBzcGVpY2hlcmJhciAtIFByb2pla3RhbmdhYmUgZmVobHQhJywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgdGhlIFBlcmlvZCBpcyBiaWdnZXIgdGhhbiB0aGUgaW50ZXJ2YWwgYmV0d2VlbiBTdGFydHRpbWUgYW5kIEVuZHRpbWUhJyA9PiAnTmljaHQgc3BlaWNoZXJiYXIgLSBEYXVlciBpc3QgZ3L232VyIGFscyBkZXIgWmVpdHJhdW0gendpc2NoZW4gQmVnaW5uIHVuZCBFbmRlIScsCiAgICAgICAgJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIFN0YXJ0dGltZSBpcyBvbGRlciB0aGFuIEVuZHRpbWUhJyA9PiAnTmljaHQgc3BlaWNoZXJiYXIgLSBCZWdpbm4gbGllZ3QgbmFjaCBFbmRlIScsCiAgICAgICAgJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIG9mIG1pc3NpbmcgcGVyaW9kIScgPT4gJ05pY2h0IHNwZWljaGVyYmFyIC0gRGF1ZXIgKGVyZ2lidCBzaWNoIGF1cyBTdGFydC0gdW5kIEVuZHplaXQpIGlzdCBuaWNodCBhbmdlZ2ViZW4hJywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgUGVyaW9kIGlzIG5vdCBnaXZlbiBnaXZlbiEnID0+ICdOaWNodCBzcGVpY2hlcmJhciAtIERhdWVyIChlcmdpYnQgc2ljaCBhdXMgU3RhcnQtIHVuZCBFbmR6ZWl0KSBpc3QgbmljaHQgYW5nZWdlYmVuIScsCiAgICAgICAgJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIHdoaWxlIHlvdSBhcmUgRGlzZWFzZWQ/JyA9PiAnU2llIHdhcmVuIGtyYW5rIHVuZCBoYWJlbiBnZWFyYmVpdGV0PyBXaXIgYnJhdWNoZW4gbWVociBzb2xjaGUgTWl0YXJiZWl0ZXIuJywKICAgICAgICAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgd2hpbGUgeW91IGhhdmUgYSBsZWF2ZSBkYXk/JyA9PiAnU2llIGhhdHRlbiBVcmxhdWIgdW5kIGhhYmVuIGdlYXJiZWl0ZXQ/IFdpciBicmF1Y2hlbiBtZWhyIHNvbGNoZSBNaXRhcmJlaXRlci4nLAogICAgICAgICdBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCB3aGlsZSB5b3UgaGF2ZSBvdmVydGltZT8nID0+ICdIYWJlbiBTaWUgd+RocmVuZCBkZXIg3GJlcnN0dW5kZW4gYXVjaCBnZWFyYmVpdGV0PycsCiAgICAgICAgJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIGEgZGF5IGhhcyBvbmx5IDI0IGhvdXJzIScgPT4gJ0VpbiBUYWcgaGF0IG51ciAyNCBTdHVuZGVuIScsCiAgICAgICAgJ0NhblwndCBkZWxldGUgV29ya2luZyBVbml0cyEnID0+ICdLYW5uIEFyYmVpdHNzdHVuZGVuIG5pY2h0IGz2c2NoZW4hJywKICAgICAgICAnUGxlYXNlIGluc2VydCB5b3VyIHdvcmtpbmcgaG91cnMhJyA9PiAnQml0dGUgdHJhZ2VuIFNpZSBJaHJlIEFyYmVpdHN6ZWl0ZW4gZWluIScsCiAgICAgICAgJ1lvdSBoYXZlIHRvIGluc2VydCBTdGFydC0gYW5kIEVuZHRpbWUgb3IgYSBQZXJpb2QnID0+ICdTaWUgbfxzc2VuIEJlZ2lubi0gdW5kIEVuZGV6ZWl0IGFuZ2ViZW4uJywKICAgICAgICAnWW91IGNhbiBvbmx5IHNlbGVjdCBvbmUgY2hlY2tib3ggZWxlbWVudCEnID0+ICdTaWUga/ZubmVuIG51ciBlaW5lIENoZWNrYm94IG1hcmtpZXJlbiEnLAogICAgICAgICdJZiB5b3UgdXNlIGFjdGlvbiBtaXNjLCBwbGVhc2UgZ2l2ZSBhbiBleHBsYW5hdGlvbiBpbiB0aGUgZmllbGQgcmVtYXJrJyA9PiAnV2VubiBTaWUgQWt0aW9uIFNvbnN0aWdlcyBhdXN35GhsZW4sIGdlYmVuIFNpZSBlaW5lIEJlc2NocmVpYnVuZyB1bSBGZWxkIEFubWVya3VuZyBhbi4nLAogICAgICAgICNhY3R1YWxseSB0aGUgZm9sbG93aW5nIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBmaWxlIGRlLnBtLCBob3dldmVyIHRoZXkncmUgbm90IHNvIEkgcHV0J2VtIGhlcmUuLi4KICAgICAgICAnTW9uJyA9PiAnTW8nLAogICAgICAgICdUdWUnID0+ICdEaScsCiAgICAgICAgJ1dlZCcgPT4gJ01pJywKICAgICAgICAnVGh1JyA9PiAnRG8nLAogICAgICAgICdGcmknID0+ICdGcicsCiAgICAgICAgJ1NhdCcgPT4gJ1NhJywKICAgICAgICAnU3VuJyA9PiAnU28nLAogICAgICAgICdKYW51YXJ5JyA9PiAnSmFudWFyJywKICAgICAgICAnRmVicnVhcnknID0+ICdGZWJydWFyJywKICAgICAgICAnTWFyY2gnID0+ICdN5HJ6JywKICAgICAgICAnTWF5JyA9PiAnTWFpJywKICAgICAgICAnSnVuZScgPT4gJ0p1bmknLAogICAgICAgICdKdWx5JyA9PiAnSmFudWFyJywKICAgICAgICAnT2N0b2JlcicgPT4gJ09rdG9iZXInLAogICAgICAgICdEZWNlbWJlcicgPT4gJ0RlemVtYmVyJywKICAgIH07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGltZUFjY291bnRpbmcucG0gLSB0aW1lIGFjY291bnRpbmcgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmcucG0sdiAxLjE0IDIwMDcvMDYvMDUgMTQ6MTU6NDggdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaW1lQWNjb3VudGluZzsKCnVzZSBzdHJpY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmc7CnVzZSBEYXRlOjpQY2FsYyBxdyhUb2RheSBEYXlzX2luX01vbnRoIERheV9vZl9XZWVrIEFkZF9EZWx0YV9ZTUQpOwp1c2UgVGltZTo6TG9jYWw7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xNCAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgIyBnZXQgY29tbW9uIG9iamVjdHMKICAgIGZvcmVhY2ggKGtleXMgJVBhcmFtKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99OwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIE9wamVjdHMKICAgIGZvcmVhY2ggKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IE1vZHVsZVJlZyBMb2dPYmplY3QKICAgICAgICBDb25maWdPYmplY3QgVGlja2V0T2JqZWN0IFRpbWVPYmplY3QgR3JvdXBPYmplY3QpCiAgICApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiR290IG5vICRfISIpIGlmICghJFNlbGYtPnskX30pOwogICAgfQoKICAgICMgY3JlYXRlIHJlcXVpcmVkIG9iamVjdHMuLi4KICAgICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlRpbWVBY2NvdW50aW5nLT5uZXcoJVBhcmFtKTsKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFByZVJ1biB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAoJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIpID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgKTsKICAgIG15ICVVc2VyID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJDdXJyZW50UGVyaW9kR2V0KAogICAgICAgIFllYXIgID0+ICRZZWFyLAogICAgICAgIE1vbnRoID0+ICRNb250aCwKICAgICAgICBEYXkgICA9PiAkRGF5LAogICAgKTsKICAgIGlmICgkVXNlcnskU2VsZi0+e1VzZXJJRH19KXsKICAgICAgICBteSAlSW5jb21wbGV0ZVdvcmtpbmdEYXlzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2soKTsKICAgICAgICAjIHJlZGlyZWN0IGlmIGluY29tcGxldGUgd29ya2luZyBkYXkgYXJlIG91dCBvZiByYW5nZQogICAgICAgIGlmICgkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0VuZm9yY2VJbnNlcnR9CiAgICAgICAgICAgICYmICRTZWxmLT57QWN0aW9ufSBuZSAnQWdlbnRUaW1lQWNjb3VudGluZycKICAgICAgICAgICAgJiYgJFNlbGYtPntBY3Rpb259IG5lICdBZ2VudENhbGVuZGFyU21hbGwnKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj1BZ2VudFRpbWVBY2NvdW50aW5nJlN1YmFjdGlvbj1FZGl0Iik7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSBATW9udGhBcnJheSA9ICgKICAgICAgICAnJywKICAgICAgICAnSmFudWFyeScsCiAgICAgICAgJ0ZlYnJ1YXJ5JywKICAgICAgICAnTWFyY2gnLAogICAgICAgICdBcHJpbCcsCiAgICAgICAgJ01heScsCiAgICAgICAgJ0p1bmUnLAogICAgICAgICdKdWx5JywKICAgICAgICAnQXVndXN0JywKICAgICAgICAnU2VwdGVtYmVyJywKICAgICAgICAnT2N0b2JlcicsCiAgICAgICAgJ05vdmVtYmVyJywKICAgICAgICAnRGVjZW1iZXInLAogICAgKTsKICAgIG15IEBXZWVrZGF5QXJyYXkgPSAoCiAgICAgICAgJ01vbicsCiAgICAgICAgJ1R1ZScsCiAgICAgICAgJ1dlZCcsCiAgICAgICAgJ1RodScsCiAgICAgICAgJ0ZyaScsCiAgICAgICAgJ1NhdCcsCiAgICAgICAgJ1N1bicsCiAgICApOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGVkaXQgdGhlIHRpbWUgYWNjb3VudGluZyBlbGVtZW50cwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0VkaXQnKSB7CiAgICAgICAgbXkgJE91dHB1dCAgICAgICA9ICcnOwogICAgICAgIG15ICVGcm9udGVuZCAgICAgPSAoKTsKICAgICAgICBteSAlUHJvamVjdExpc3QgID0gKCk7CiAgICAgICAgbXkgJUFjdGlvbkxpc3QgICA9ICgpOwogICAgICAgIG15ICVEYXRhICAgICAgICAgPSAoKTsKICAgICAgICBteSAlQWN0aW9uICAgICAgID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgKCRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yZWFjaCAocXcoU3RhdHVzIFllYXIgTW9udGggRGF5IERlbGV0ZSkpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgfQogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICghJFNlbGYtPntBY2Nlc3NSb30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBEYXRlCiAgICAgICAgaWYgKCEkUGFyYW17WWVhcn0gfHwgISRQYXJhbXtNb250aH0gfHwgISRQYXJhbXtEYXl9KSB7CiAgICAgICAgICAgICRQYXJhbXtZZWFyfSAgPSAkWWVhcjsKICAgICAgICAgICAgJFBhcmFte01vbnRofSA9ICRNb250aDsKICAgICAgICAgICAgJFBhcmFte0RheX0gICA9ICREYXk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17WWVhcn0gID0gc3ByaW50ZigiJTAyZCIsJFBhcmFte1llYXJ9KTsKICAgICAgICAgICAgJFBhcmFte01vbnRofSA9IHNwcmludGYoIiUwMmQiLCRQYXJhbXtNb250aH0pOwogICAgICAgICAgICAkUGFyYW17RGF5fSAgID0gc3ByaW50ZigiJTAyZCIsJFBhcmFte0RheX0pOwogICAgICAgIH0KCiAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckN1cnJlbnRQZXJpb2RHZXQoCiAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmb3IgaW5pdGFsIHVzZWluZywgdGhlIGZpcnN0IGFnZW50IHdpdGggcnctcmlnaHQgd2lsbCBiZSByZWRpcmVjdGVkCiAgICAgICAgIyB0byAnU2V0dGluZycuIFRoZW4gaGUgY2FuIGRvIHRoZSBpbml0aWFsIHNldHRpbmdzCiAgICAgICAgaWYgKCEkVXNlcnskU2VsZi0+e1VzZXJJRH19KXsKICAgICAgICAgICAgbXkgJUdyb3VwTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yZWFjaCAoKGtleXMgJUdyb3VwTGlzdCkpIHsKICAgICAgICAgICAgICAgIGlmICgkR3JvdXBMaXN0eyRffSBlcSAndGltZV9hY2NvdW50aW5nJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249QWdlbnRUaW1lQWNjb3VudGluZyYiIC4KICAgICAgICAgICAgICAgICAgICAgICAgIlN1YmFjdGlvbj1TZXR0aW5nIgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJObyBVc2VyUGVyaW9kIGF2YWlsYWJsZSwgcGxlYXNlIGNvbnRhY3QgdGhlIHRpbWUgYWNjb3VudGluZyBhZG1pbiB0byBpbnNlcnQgeW91ciBVc2VyUGVyaW9kISIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVJbmNvbXBsZXRlV29ya2luZ0RheXMgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjaygpOwogICAgICAgIG15ICRNYXhBbGxvd2VkSW5zZXJ0RGF5cyAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6Ok1heEFsbG93ZWRJbnNlcnREYXlzJykgfHwgJzEwJzsKICAgICAgICAoJFBhcmFte1llYXJBbGxvd2VkfSwgJFBhcmFte01vbnRoQWxsb3dlZH0sICRQYXJhbXtEYXlBbGxvd2VkfSkgPSBBZGRfRGVsdGFfWU1EKCRZZWFyLCAkTW9udGgsICREYXksIDAsIDAsIC0kTWF4QWxsb3dlZEluc2VydERheXMpOwogICAgICAgIGlmICh0aW1lbG9jYWwoMSwgMCwgMCAsICRQYXJhbXtEYXl9LCAkUGFyYW17TW9udGh9IC0gMSwgJFBhcmFte1llYXJ9IC0gMTkwMCkgPAogICAgICAgICAgICB0aW1lbG9jYWwoMSwgMCwgMCAsICRQYXJhbXtEYXlBbGxvd2VkfSwgJFBhcmFte01vbnRoQWxsb3dlZH0gLSAxLCAkUGFyYW17WWVhckFsbG93ZWR9IC0gMTkwMCkKICAgICAgICApIHsKICAgICAgICAgICAgaWYgKCEkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0luY29tcGxldGV9eyRQYXJhbXtZZWFyfX17JFBhcmFte01vbnRofX17JFBhcmFte0RheX19KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249VmlldyZZZWFyPSRQYXJhbXtZZWFyfSZNb250aD0kUGFyYW17TW9udGh9JkRheT0kUGFyYW17RGF5fSIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW4nLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kUGFyYW17WWVhcn0mTW9udGg9JFBhcmFte01vbnRofSZEYXk9JFBhcmFte0RheX0iLAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtNb250aF90b19UZXh0fSAgID0gJE1vbnRoQXJyYXlbJFBhcmFte01vbnRofV07CgogICAgICAgICgkUGFyYW17WWVhckJhY2t9LCAkUGFyYW17TW9udGhCYWNrfSwgJFBhcmFte0RheUJhY2t9KSA9IEFkZF9EZWx0YV9ZTUQoJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSwgMCwgMCwgLTEpOwogICAgICAgICgkUGFyYW17WWVhck5leHR9LCAkUGFyYW17TW9udGhOZXh0fSwgJFBhcmFte0RheU5leHR9KSA9IEFkZF9EZWx0YV9ZTUQoJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSwgMCwgMCwgMSk7CgogICAgIyBFZGl0IFdvcmtpbmcgVW5pdHMKICAgICAgICBpZiAoJFBhcmFte1N0YXR1c30pIHsKICAgICAgICAgICAgaWYgKCRQYXJhbXtEZWxldGV9KSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICJEZWxldGUiKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nRGVsZXRlJyk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkV29ya2luZ1VuaXRJRCA9IDA7CiAgICAgICAgICAgIGZvciAoJFdvcmtpbmdVbml0SUQgPSAxOyAkV29ya2luZ1VuaXRJRCA8IDEwOyAkV29ya2luZ1VuaXRJRCsrKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoIChxdyhQcm9qZWN0SUQgQWN0aW9uSUQgUmVtYXJrIFN0YXJ0VGltZSBFbmRUaW1lIFBlcmlvZCkpIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfIC4gJ1snIC4gJFdvcmtpbmdVbml0SUQgLiAnXScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRQYXJhbXtQcm9qZWN0SUR9IHx8ICRQYXJhbXtBY3Rpb25JRH0pIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSA9ICRQYXJhbXtQcm9qZWN0SUR9OwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gID0gJFBhcmFte0FjdGlvbklEfTsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UmVtYXJrfSAgICA9ICRQYXJhbXtSZW1hcmt9OwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtTdGFydFRpbWV9ID0gJFBhcmFte1N0YXJ0VGltZX07CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e0VuZFRpbWV9ICAgPSAkUGFyYW17RW5kVGltZX07CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e0RhdGV9ICAgICAgPSAkUGFyYW17RGF0ZX07CiAgICAgICAgICAgICAgICAgICAgaWYgKCRQYXJhbXtQZXJpb2R9ID1+IC9eKFxkKyksKFxkKykvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ICAgID0gJDEgLiAiLiIgLiAkMjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ID0gJFBhcmFte1BlcmlvZH07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAlUmVkdWNlVGltZSA9ICgpOwogICAgICAgICAgICAgICAgICAgIGlmICgkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OlJlZHVjZVRpbWUnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAlUmVkdWNlVGltZSA9ICV7JFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpSZWR1Y2VUaW1lJyl9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAjaWYgKCRQYXJhbXtTdGFydFRpbWV9ICYmICRQYXJhbXtFbmRUaW1lfSAmJiAhJFBhcmFte1BlcmlvZH0pIHsKICAgICAgICAgICAgICAgICAgICAjb3ZlcndyaXRlIFBlcmlvZCB3aGVuIFN0YXJ0IGFuZCBFbmR0aW1lIGlzIGdpdmVuLi4uCiAgICAgICAgICAgICAgICAgICAgaWYgKCRQYXJhbXtTdGFydFRpbWV9ICYmICRQYXJhbXtFbmRUaW1lfSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFBhcmFte1N0YXJ0VGltZX0gPX4gL14oXGQrKTooXGQrKS8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkMSo2MCArICQyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRQYXJhbXtFbmRUaW1lfSA9fiAvXihcZCspOihcZCspLykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJDEqNjAgKyAkMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFJlZHVjZVRpbWV7JEFjdGlvbnskUGFyYW17QWN0aW9uSUR9fXtBY3Rpb259fSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSA9ICgkRW5kVGltZSAtICRTdGFydFRpbWUpLzYwICogJFJlZHVjZVRpbWV7JEFjdGlvbnskUGFyYW17QWN0aW9uSUR9fXtBY3Rpb259fSAvIDEwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ID0gKCRFbmRUaW1lIC0gJFN0YXJ0VGltZSkvNjA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRDaGVja2JveENoZWNrID0gMDsKICAgICAgICAgICAgZm9yZWFjaCAocXcoTGVhdmVEYXkgRGlzZWFzZWQgT3ZlcnRpbWUpKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgICAgICAgICAgICAgIGlmICgkUGFyYW17JF99KSB7CiAgICAgICAgICAgICAgICAgICAgJFdvcmtpbmdVbml0SUQrKzsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSA9ICctMSc7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfSAgPSAkUGFyYW17JF99OwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtSZW1hcmt9ICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFdvcmtpbmdVbml0SUR9e1N0YXJ0VGltZX0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskV29ya2luZ1VuaXRJRH17RW5kVGltZX0gICA9ICcnOwogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrYm94Q2hlY2srKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJENoZWNrYm94Q2hlY2sgPiAxKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWlyZWREZXNjcmlwdGlvbn0gPSAiWW91IGNhbiBvbmx5IHNlbGVjdCBvbmUgY2hlY2tib3ggZWxlbWVudCEiOwogICAgICAgICAgICB9CiAgICAgICAgICAgICREYXRhe1llYXJ9ICA9ICRQYXJhbXtZZWFyfTsKICAgICAgICAgICAgJERhdGF7TW9udGh9ID0gJFBhcmFte01vbnRofTsKICAgICAgICAgICAgJERhdGF7RGF5fSAgID0gJFBhcmFte0RheX07CiAgICAgICAgICAgIGlmICghJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0luc2VydCglRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKE1lc3NhZ2UgPT4gJ0NhblwndCBpbnNlcnQgV29ya2luZyBVbml0cyEnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtTdWNjZXNzZnVsSW5zZXJ0fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgU2hvdyBXb3JraW5nIFVuaXRzCiAgICAgICAgIyBnZXQgZXhpc3Rpbmcgd29ya2luZyB1bml0cwogICAgICAgICVEYXRhICAgID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0dldCgKICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICApOwoKICAgICAgICBpZiAoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpJbnB1dEhvdXJzV2l0aG91dFN0YXJ0RW5kVGltZScpKSB7CiAgICAgICAgICAgICRQYXJhbXtUZXh0UG9zaXRpb259ICA9ICdsZWZ0JzsKICAgICAgICAgICAgJFBhcmFte1BlcmlvZEJsb2NrfSAgID0gJ1VuaXRJbnB1dFBlcmlvZCc7CiAgICAgICAgICAgICRGcm9udGVuZHtDbGFzc1RpbWV9ICA9ICdmb290bm90ZSc7CiAgICAgICAgICAgICRGcm9udGVuZHtQZXJpb2ROb3RlfSA9ICcqJzsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0Zvb3ROb3RlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtUZXh0UG9zaXRpb259ICA9ICdyaWdodCc7CiAgICAgICAgICAgICRQYXJhbXtQZXJpb2RCbG9ja30gICA9ICdVbml0UGVyaW9kV2l0aG91dElucHV0JzsKICAgICAgICAgICAgJEZyb250ZW5ke0NsYXNzVGltZX0gID0gJ3JlcXVpcmVkJzsKICAgICAgICAgICAgJEZyb250ZW5ke1BlcmlvZE5vdGV9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwcm9qZWN0IHNldHRpbmdzCiAgICAgICAgbXkgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgZm9yZWFjaCBteSAkUHJvamVjdElEIChrZXlzICV7JFByb2plY3R7UHJvamVjdH19KSB7CiAgICAgICAgICAgIGlmICgkUHJvamVjdHtQcm9qZWN0U3RhdHVzfXskUHJvamVjdElEfSkgewogICAgICAgICAgICAgICAgJFByb2plY3RMaXN0eyRQcm9qZWN0SUR9ID0gJFByb2plY3R7UHJvamVjdH17JFByb2plY3RJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFByb2plY3RMaXN0eycnfSA9ICcnOwoKICAgICAgICAjIGdldCBhY3Rpb24gc2V0dGluZ3MKICAgICAgICBmb3JlYWNoIG15ICRBY3Rpb25JRCAoa2V5cyAlQWN0aW9uKSB7CiAgICAgICAgICAgIGlmICgkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9uU3RhdHVzfSkgewogICAgICAgICAgICAgICAgJEFjdGlvbkxpc3R7JEFjdGlvbklEfSA9ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRBY3Rpb25MaXN0eycnfSA9ICcnOwoKICAgICAgICBpZiAodGltZSgpID4gdGltZWxvY2FsKDEsIDAsIDAgLCAkUGFyYW17RGF5fSwgJFBhcmFte01vbnRofSAtIDEsICRQYXJhbXtZZWFyfSAtIDE5MDApKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0QmxvY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAjIGJ1aWxkIHVuaXRzCiAgICAgICAgbXkgJFdvcmtpbmdVbml0SURNYXggPSAxMDsKICAgICAgICBteSAkV29ya2luZ1VuaXRJRCAgICA9IDA7CiAgICAgICAgJFBhcmFte1RvdGFsfSAgICAgICAgPSAwOwogICAgICAgIGZvciAoJFdvcmtpbmdVbml0SUQgPSAxOyAkV29ya2luZ1VuaXRJRCA8ICRXb3JraW5nVW5pdElETWF4OyAkV29ya2luZ1VuaXRJRCsrKSB7CiAgICAgICAgICAgIGlmICgkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSA9PSAtMSkgewogICAgICAgICAgICAgICAgaWYgKCREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gICAgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17RGlzZWFzZWR9ID0gJ2NoZWNrZWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gPT0gLTIpIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17TGVhdmVEYXl9ID0gJ2NoZWNrZWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gPT0gLTMpIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17T3ZlcnRpbWV9ID0gJ2NoZWNrZWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFdvcmtpbmdVbml0SURNYXgrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtJRH0gPSAkV29ya2luZ1VuaXRJRCA7CiAgICAgICAgICAgICAgICAjIGdldCBvcHRpb24gZmllbGRzCiAgICAgICAgICAgICAgICAkRnJvbnRlbmR7J0FjdGlvbk9wdGlvbid9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlQWN0aW9uTGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICREYXRheyRXb3JraW5nVW5pdElEfXtBY3Rpb25JRH0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAiQWN0aW9uSURbJFdvcmtpbmdVbml0SURdIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRnJvbnRlbmR7J1Byb2plY3RPcHRpb24nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVByb2plY3RMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAiUHJvamVjdElEWyRXb3JraW5nVW5pdElEXSIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRQYXJhbXtSZW1hcmt9ICAgID0gJERhdGF7JFdvcmtpbmdVbml0SUR9e1JlbWFya30gfHwgJyc7CiAgICAgICAgICAgICAgICBpZiAoJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfSkgewogICAgICAgICAgICAgICAgICAgIGlmICgkRGF0YXskV29ya2luZ1VuaXRJRH17UGVyaW9kfSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UGVyaW9kfSAgICA9ICREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1RvdGFsfSAgICArPSAkUGFyYW17UGVyaW9kfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiggJERhdGF7JFdvcmtpbmdVbml0SUR9e1BlcmlvZH0gPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufSA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBQZXJpb2QgaXMgbm90IGdpdmVuIGdpdmVuISc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufSA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBTdGFydHRpbWUgaXMgb2xkZXIgdGhhbiBFbmR0aW1lISc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQZXJpb2R9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0gPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBwZXJpb2QhJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UGVyaW9kfSAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtTdGFydFRpbWV9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0VuZFRpbWV9ICAgPSAnJzsKICAgICAgICAgICAgICAgIH0KCiMgICAgICAgICAgICAgICAgZm9yZWFjaCAocXcoU3RhcnQgRW5kKSkgewojICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7JFdvcmtpbmdVbml0SUR9eyRfIC4gIlRpbWUifSAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17JF8gLiAiVGltZSJ9IGVxICcwMDowMDowMCcpIHsKIyAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXskXyAuICJIb3VyIn0gPSAnMDAnOwojICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFteyRfIC4gIk1pbnV0ZSJ9ID0gJzAwJzsKIyAgICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgICAgICBlbHNpZiAoJERhdGF7JFdvcmtpbmdVbml0SUR9eyRfIC4gIlRpbWUifSkgewojICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFteyRfLiAiSG91ciJ9ICAgPSBzdWJzdHIoJERhdGF7JFdvcmtpbmdVbml0SUR9eyRffSwgMCwgMikgfHwgJyc7CiMgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17JF8uICJNaW51dGUifSA9IHN1YnN0cigkRGF0YXskV29ya2luZ1VuaXRJRH17JF99LCAzLCAyKSB8fCAnJzsKIyAgICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgICAgICAkUGFyYW17JF8gLiAiVGltZSJ9ID0gQnVpbGRUaW1lU2VsZWN0aW9uKAojICAgICAgICAgICAgICAgICAgICAgICAgSG91ciAgID0+ICRQYXJhbXskXy4gIkhvdXIifSwKIyAgICAgICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiAkUGFyYW17JF8uICJNaW51dGUifQojICAgICAgICAgICAgICAgICAgICAgICAgUHJlZml4ID0+ICRfLAojICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0ID0+ICdUaW1lSW5wdXRGb3JtYXQnLAojICAgICAgICAgICAgICAgICAgICApOwojICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmb3JlYWNoIChxdyhTdGFydFRpbWUgRW5kVGltZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7JFdvcmtpbmdVbml0SUR9eyRffSAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17JF99IGVxICcwMDowMCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFteyRffSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFteyRffSA9ICREYXRheyRXb3JraW5nVW5pdElEfXskX307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVW5pdCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte1BlcmlvZEJsb2NrfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgVmFsaWRpdHkgY2hlY2tzIHN0YXJ0CiAgICAgICAgICAgICAgICBpZiAoJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfSAmJiAkUGFyYW17RGlzZWFzZWR9KSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1JlYWRPbmx5RGVzY3JpcHRpb259ID0gJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIHdoaWxlIHlvdSBhcmUgRGlzZWFzZWQ/JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ICYmICRQYXJhbXtMZWF2ZURheX0pIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlEZXNjcmlwdGlvbn0gPSAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgd2hpbGUgeW91IGhhdmUgYSBsZWF2ZSBkYXk/JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17QWN0aW9uSUR9ICYmICRQYXJhbXtPdmVydGltZX0pIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlEZXNjcmlwdGlvbn0gPSAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgd2hpbGUgeW91IGhhdmUgb3ZlcnRpbWU/JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkRGF0YXskV29ya2luZ1VuaXRJRH17UHJvamVjdElEfSAmJiAhJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfSkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0gPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBBY3Rpb24hJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghJERhdGF7JFdvcmtpbmdVbml0SUR9e1Byb2plY3RJRH0gJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e0FjdGlvbklEfSkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0gPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBQcm9qZWN0ISc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJERhdGF7JFdvcmtpbmdVbml0SUR9e1N0YXJ0VGltZX0gJiYgJERhdGF7JFdvcmtpbmdVbml0SUR9e1N0YXJ0VGltZX0gbmUgJzAwOjAwJyAmJgogICAgICAgICAgICAgICAgICAgICREYXRheyRXb3JraW5nVW5pdElEfXtFbmRUaW1lfSAmJiAkRGF0YXskV29ya2luZ1VuaXRJRH17RW5kVGltZX0gIG5lICcwMDowMCcKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgIGlmICgkRGF0YXskV29ya2luZ1VuaXRJRH17U3RhcnRUaW1lfSA9fiAvXihcZCspOihcZCspLykgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJDEqNjAgKyAkMjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCREYXRheyRXb3JraW5nVW5pdElEfXtFbmRUaW1lfSA9fiAvXihcZCspOihcZCspLykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkMSo2MCArICQyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCREYXRheyRXb3JraW5nVW5pdElEfXtQZXJpb2R9ID4gKCRFbmRUaW1lIC0gJFN0YXJ0VGltZSkvNjAgKyAwLjAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufSA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSB0aGUgUGVyaW9kIGlzIGJpZ2dlcicgLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIHRoYW4gdGhlIGludGVydmFsIGJldHdlZW4gU3RhcnR0aW1lIGFuZCBFbmR0aW1lISc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJEVuZFRpbWUgPiA2MCAqIDI0IHx8ICRTdGFydFRpbWUgPiA2MCAqIDI0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufSA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBhIGRheSBoYXMgb25seSAyNCBob3VycyEnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259KXsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0UmVxdWlyZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHtEZXNjcmlwdGlvbiA9PiAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259fSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICghJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICAgICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgICAgICAgICApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKE1lc3NhZ2UgPT4gJ0NhblwndCBkZWxldGUgV29ya2luZyBVbml0cyEnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufSAgICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb25UcnVlfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJFBhcmFte1VuaXRSZWFkT25seURlc2NyaXB0aW9ufSl7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVW5pdFJlYWRvbmx5JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7RGVzY3JpcHRpb24gPT4gJFBhcmFte1VuaXRSZWFkT25seURlc2NyaXB0aW9ufX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlYWRPbmx5RGVzY3JpcHRpb259ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjIFZhbGlkaXR5IGNoZWNrcyBlbmQKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSA+IHRpbWVsb2NhbCgxLCAwLCAwICwgJFBhcmFte0RheX0sICRQYXJhbXtNb250aH0gLSAxLCAkUGFyYW17WWVhcn0gLSAxOTAwKSkgewogICAgICAgICAgICAkUGFyYW17VG90YWx9ICAgICAgICAgICA9IHNwcmludGYgKCIlLjJmIiwgJFBhcmFte1RvdGFsfSk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUb3RhbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICMgdmFsaWRpdHkgY2hlY2tzIHN0YXJ0CiAgICAgICAgaWYgKCRQYXJhbXtUb3RhbH0gJiYgJFBhcmFte1RvdGFsfSA+IDI0KSB7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZERlc2NyaXB0aW9ufSA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtb3JlIHRoYW4gMjQgd29ya2luZyBob3VycyEnOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoJFBhcmFte1RvdGFsfSAmJiAkUGFyYW17VG90YWx9ID4gMTYpIHsKICAgICAgICAgICAgJFBhcmFte1JlYWRPbmx5RGVzY3JpcHRpb259ID0gJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIG1vcmUgdGhhbiAxNiBob3Vycz8nOwogICAgICAgIH0KICAgICAgICBpZiAoJFBhcmFte1JlcXVpcmVkRGVzY3JpcHRpb259KXsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlcXVpcmVkJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge0Rlc2NyaXB0aW9uID0+ICRQYXJhbXtSZXF1aXJlZERlc2NyaXB0aW9ufX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICghJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0RlbGV0ZSgKICAgICAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oTWVzc2FnZSA9PiAnQ2FuXCd0IGRlbGV0ZSBXb3JraW5nIFVuaXRzIScpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkUGFyYW17UmVhZE9ubHlEZXNjcmlwdGlvbn0pewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVhZG9ubHknLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7RGVzY3JpcHRpb24gPT4gJFBhcmFte1JlYWRPbmx5RGVzY3JpcHRpb259fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdmFsaWRpdHkgY2hlY2tzIGVuZAoKICAgICAgICAkUGFyYW17RGF0ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcmVmaXggPT4gJycsCiAgICAgICAgICAgIEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywKICAgICAgICApOwoKICAgICAgICBpZiAodGltZWxvY2FsKDEsIDAsIDAgLCAkUGFyYW17RGF5fSwgJFBhcmFte01vbnRofSAtIDEsICRQYXJhbXtZZWFyfSAtIDE5MDApIDwKICAgICAgICAgICAgdGltZWxvY2FsKDEsIDAsIDAgLCAkUGFyYW17RGF5QWxsb3dlZH0sICRQYXJhbXtNb250aEFsbG93ZWR9IC0gMSwgJFBhcmFte1llYXJBbGxvd2VkfSAtIDE5MDApCiAgICAgICAgKSB7CiAgICAgICAgICAgIGlmICgkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0luY29tcGxldGV9eyRQYXJhbXtZZWFyfX17JFBhcmFte01vbnRofX17JFBhcmFte0RheX19ICYmICEkUGFyYW17U3VjY2Vzc2Z1bEluc2VydH0pIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVxdWlyZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4ge0Rlc2NyaXB0aW9uID0+ICdUaGlzIERhdGUgaXMgb3V0IG9mIGxpbWl0LCBidXQgeW91IGhhdmVuXCd0IGluc2VydCB0aGlzIGRheSB5ZXQsIHNvIHlvdSBnZXQgb25lKCEpIGNoYW5jZSB0byBpbnNlcnQnfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggbXkgJFllYXJJRCAoc29ydCBrZXlzICV7JEluY29tcGxldGVXb3JraW5nRGF5c3tJbmNvbXBsZXRlfX0pIHsKICAgICAgICAgICAgZm9yZWFjaCBteSAkTW9udGhJRCAoc29ydCBrZXlzICV7JEluY29tcGxldGVXb3JraW5nRGF5c3tJbmNvbXBsZXRlfXskWWVhcklEfX0pIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJERheUlEIChzb3J0IGtleXMgJXskSW5jb21wbGV0ZVdvcmtpbmdEYXlze0luY29tcGxldGV9eyRZZWFySUR9eyRNb250aElEfX0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISRQYXJhbXtJbmNvbXBsZXRlfSkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5jb21wbGV0ZVRleHQnLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBteSAkQm9sZFN0YXJ0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgbXkgJEJvbGRFbmQgICA9ICcnOwogICAgICAgICAgICAgICAgICAgIGlmICgkWWVhcklEIGVxICRQYXJhbXtZZWFyfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkTW9udGhJRCBlcSAkUGFyYW17TW9udGh9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICREYXlJRCBlcSAkUGFyYW17RGF5fQogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQm9sZFN0YXJ0ID0gJzxiPic7CiAgICAgICAgICAgICAgICAgICAgICAgICRCb2xkRW5kICAgPSAnPC9iPic7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmNvbXBsZXRlV29ya2luZ0RheXMnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgICAgICA9PiAkWWVhcklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9udGggICAgID0+ICRNb250aElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF5ICAgICAgID0+ICREYXlJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbGRTdGFydCA9PiAkQm9sZFN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9sZEVuZCAgID0+ICRCb2xkRW5kLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0luY29tcGxldGV9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJFZhY2F0aW9uQ2hlY2sgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VmFjYXRpb25DaGVjaygKICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17V2Vla2RheX0gICA9IERheV9vZl9XZWVrKCRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0pOwogICAgICAgIGlmICgkUGFyYW17V2Vla2RheX0gIT0gNiAmJiAkUGFyYW17V2Vla2RheX0gIT0gNyAmJiAhJFZhY2F0aW9uQ2hlY2spIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ090aGVyVGltZXMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1dlZWtkYXlfdG9fVGV4dH0gPSAkV2Vla2RheUFycmF5WyRQYXJhbXtXZWVrZGF5fSAtIDFdOwoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAiRWRpdCIpOwogICAgICAgIGlmICghJEluY29tcGxldGVXb3JraW5nRGF5c3tFbmZvcmNlSW5zZXJ0fSkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAjIHNob3cgY3JlYXRlIHByb2plY3QgbGluaywgaWYgYWxsb3dlZAogICAgICAgICAgICBteSAlVXNlckJhc2ljcyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyR2V0KCk7CiAgICAgICAgICAgIGlmICgkVXNlckJhc2ljc3skU2VsZi0+e1VzZXJJRH19e0NyZWF0ZVByb2plY3R9KSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NyZWF0ZVByb2plY3QnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoISRQYXJhbXtSZXF1aXJlZERlc2NyaXB0aW9ufSAmJiAhJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9uVHJ1ZX0gJiYgJFBhcmFte1N1Y2Nlc3NmdWxJbnNlcnR9KSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBJbmZvID0+ICdTdWNjZXNzZnVsIGluc2VydCEnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nRWRpdCcKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB2aWV3IG9sZGVyIGRheSBpbnN0ZXJ0cwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1ZpZXcnKSB7CiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1JvfSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBmb3JlYWNoIChxdyhEYXkgTW9udGggWWVhciBVc2VySUQpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICAgICAgZm9yZWFjaCAocXcoRGF5IE1vbnRoIFllYXIpKSB7CiAgICAgICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiVmlldzogTmVlZCAkXyIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaWYgbm8gVXNlcklEIHBvc3RlZCB1c2UgdGhlIGN1cnJlbnQgdXNlcgogICAgICAgIGlmICghJFBhcmFte1VzZXJJRH0pIHsKICAgICAgICAgICAgJFBhcmFte1VzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgdGhlIG5hbWluZyBvZiB0aGUgYWdlbnQgd2hpY2ggdGltZSBhY2NvdW50aW5nIGlzIHZpc2l0ZWQKICAgICAgICBpZiAoJFBhcmFte1VzZXJJRH0gIT0gJFNlbGYtPntVc2VySUR9KSB7CiAgICAgICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoVHlwZSA9PiAnTG9uZycsIFZhbGlkID0+IDEpOwogICAgICAgICAgICAkUGFyYW17VXNlcn0gICA9ICRTaG93blVzZXJzeyRQYXJhbXtVc2VySUR9fTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtXZWVrZGF5fSAgICAgICAgID0gRGF5X29mX1dlZWsoJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSk7CiAgICAgICAgJFBhcmFte1dlZWtkYXlfdG9fVGV4dH0gPSAkV2Vla2RheUFycmF5WyRQYXJhbXtXZWVrZGF5fSAtIDFdOwogICAgICAgICRQYXJhbXtNb250aF90b19UZXh0fSAgID0gJE1vbnRoQXJyYXlbJFBhcmFte01vbnRofV07CiAgICAgICAgIyBWYWx1ZXMgZm9yIHRoZSBsaW5rIGljb25zIDw+CiAgICAgICAgKCRQYXJhbXtZZWFyQmFja30sICRQYXJhbXtNb250aEJhY2t9LCAkUGFyYW17RGF5QmFja30pID0gQWRkX0RlbHRhX1lNRCgkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9LCAwLCAwLCAtMSk7CiAgICAgICAgKCRQYXJhbXtZZWFyTmV4dH0sICRQYXJhbXtNb250aE5leHR9LCAkUGFyYW17RGF5TmV4dH0pID0gQWRkX0RlbHRhX1lNRCgkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9LCAwLCAwLCAxKTsKCiAgICAgICAgJFBhcmFte0RhdGVTZWxlY3Rpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgUHJlZml4ID0+ICcnLAogICAgICAgICAgICBGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsCiAgICAgICAgKTsKCiAgICAjIFNob3cgV29ya2luZyBVbml0cwogICAgICAgICMgZ2V0IGV4aXN0aW5nIHdvcmtpbmcgdW5pdHMKICAgICAgICBteSAlRGF0YSAgICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNHZXQoCiAgICAgICAgICAgIFllYXIgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBEYXkgICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17RGF0ZX0gPSBzcHJpbnRmKCIlMDRkLSUwMmQtJTAyZCIsICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0pOwoKICAgICAgICAjIGdldCBwcm9qZWN0IGFuZCBhY3Rpb24gc2V0dGluZ3MKICAgICAgICBteSAlUHJvamVjdCA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NHZXQoKTsKICAgICAgICBteSAlQWN0aW9uICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwogICAgICAgIG15ICRGbGFnID0gMDsKCiAgICAgICAgZm9yZWFjaCBteSAkSUQgKGtleXMgJURhdGEpIHsKICAgICAgICAgICAgaWYgKCREYXRheyRJRH17UHJvamVjdElEfSAmJiAkRGF0YXskSUR9e1Byb2plY3RJRH0gPT0gLTEpIHsKICAgICAgICAgICAgICAgIGlmICgkRGF0YXskSUR9e0FjdGlvbklEfSAgICA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtEaXNlYXNlZH0gPSAnY2hlY2tlZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoJERhdGF7JElEfXtBY3Rpb25JRH0gPT0gLTIpIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17TGVhdmVEYXl9ID0gJ2NoZWNrZWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCREYXRheyRJRH17QWN0aW9uSUR9ID09IC0zKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte092ZXJ0aW1lfSA9ICdjaGVja2VkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghJEZsYWcpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0QmxvY2snLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdCAgID0+ICRQcm9qZWN0e1Byb2plY3R9eyREYXRheyRJRH17UHJvamVjdElEfX0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICA9PiAkQWN0aW9uIHskRGF0YXskSUR9e0FjdGlvbklEfX17QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgUmVtYXJrICAgID0+ICREYXRheyRJRH17UmVtYXJrfSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRUaW1lID0+ICREYXRheyRJRH17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRW5kVGltZSAgID0+ICREYXRheyRJRH17RW5kVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFBlcmlvZCAgICA9PiAkRGF0YXskSUR9e1BlcmlvZH0sCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRGbGFnID0gMTsKICAgICAgICAgICAgICAgICRQYXJhbXtUb3RhbH0gKz0gJERhdGF7JElEfXtQZXJpb2R9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkRmxhZykgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVG90YWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7VG90YWwgPT4gc3ByaW50ZiAoIiUuMmYiLCAkUGFyYW17VG90YWx9KX0KICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRQYXJhbXtEaXNlYXNlZH0gfHwgJFBhcmFte0xlYXZlRGF5fSB8fCAkUGFyYW17T3ZlcnRpbWV9KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdGhlclRpbWVzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERpc2Vhc2VkID0+ICRQYXJhbXtEaXNlYXNlZH0sCiAgICAgICAgICAgICAgICAgICAgTGVhdmVEYXkgPT4gJFBhcmFte0xlYXZlRGF5fSwKICAgICAgICAgICAgICAgICAgICBPdmVydGltZSA9PiAkUGFyYW17T3ZlcnRpbWV9LAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFZhY2F0aW9uID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlZhY2F0aW9uQ2hlY2soCiAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRWYWNhdGlvbikgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVmFjYXRpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7VmFjYXRpb24gPT4gJFZhY2F0aW9ufSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJlc2VudGF0aW9uCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICJWaWV3Iik7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nVmlldycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWxldGUgb2JqZWN0IGZyb20gZGF0YWJhc2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWxldGUnKSB7CiAgICAgICAgZm9yZWFjaCAocXcoRGF5IE1vbnRoIFllYXIpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1JvfSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNEZWxldGUoCiAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgKSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249RWRpdCZZZWFyPSRQYXJhbXtZZWFyfSZNb250aD0kUGFyYW17TW9udGh9JkRheT0kUGFyYW17RGF5fSIpOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3IGFib3V0IHRoZSB1c2VycyB0aW1lIGFjY291bnRpbmcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdPdmVydmlldycpIHsKICAgICAgICBteSAkT3V0cHV0ICAgPSAnJzsKICAgICAgICBteSAlRnJvbnRlbmQgPSAoKTsKICAgICAgICBteSAoJFNlYywgJE1pbiwgJEhvdXIsICRDdXJyZW50RGF5LCAkTW9udGgsICRZZWFyKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1JvfSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoIChxdyhTdGF0dXMgRGF5IE1vbnRoIFllYXIgVXNlcklEIFByb2plY3RTdGF0dXNTaG93KSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1N1YmFjdGlvbn0gPSAnRWRpdCc7CgogICAgICAgIGlmICghJFBhcmFte1VzZXJJRH0pIHsKICAgICAgICAgICAgJFBhcmFte1VzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoJFBhcmFte1VzZXJJRH0gIT0gJFNlbGYtPntVc2VySUR9ICYmICEkU2VsZi0+e0FjY2Vzc1J3fSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKFdpdGhIZWFkZXIgPT4gJ3llcycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtTdWJhY3Rpb259ID0gJ1ZpZXcnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRQYXJhbXtVc2VySUR9ICE9ICRTZWxmLT57VXNlcklEfSkgewogICAgICAgICAgICBteSAlU2hvd25Vc2VycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAxKTsKICAgICAgICAgICAgJFBhcmFte1VzZXJ9ICAgPSAkU2hvd25Vc2Vyc3skUGFyYW17VXNlcklEfX07CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIERhdGUKICAgICAgICBpZiAoISRQYXJhbXtZZWFyfSB8fCAhJFBhcmFte01vbnRofSkgewogICAgICAgICAgICAkUGFyYW17WWVhcn0gID0gJFllYXI7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSAkTW9udGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gc3ByaW50ZigiJTAyZCIsICRQYXJhbXtNb250aH0pOwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuJywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRQYXJhbXtZZWFyfSZNb250aD0kUGFyYW17TW9udGh9IiwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17TW9udGhfdG9fVGV4dH0gICA9ICRNb250aEFycmF5WyRQYXJhbXtNb250aH1dOwoKICAgICAgICAoJFBhcmFte1llYXJCYWNrfSwgJFBhcmFte01vbnRoQmFja30sICRQYXJhbXtEYXlCYWNrfSkgPSBBZGRfRGVsdGFfWU1EKCRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgMSwgMCwgLTEsIDApOwogICAgICAgICgkUGFyYW17WWVhck5leHR9LCAkUGFyYW17TW9udGhOZXh0fSwgJFBhcmFte0RheU5leHR9KSA9IEFkZF9EZWx0YV9ZTUQoJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAxLCAwLCAxLCAwKTsKCiAgICAgICAgIyBPdmVydmlldyBwZXIgZGF5CiAgICAgICAgbXkgJERheXNPZk1vbnRoICAgICAgICAgICAgID0gRGF5c19pbl9Nb250aCgkUGFyYW17WWVhcn0sICAkUGFyYW17TW9udGh9KTsKCiAgICAgICAgZm9yIChteSAkRGF5ID0gMTsgJERheSA8PSAkRGF5c09mTW9udGg7ICREYXkrKykgewogICAgICAgICAgICAkUGFyYW17RGF5fSAgICAgPSBzcHJpbnRmKCIlMDJkIiwgJERheSk7CiAgICAgICAgICAgICRQYXJhbXtXZWVrZGF5fSA9IERheV9vZl9XZWVrKCRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJERheSktMTsKICAgICAgICAgICAgbXkgJFZhY2F0aW9uQ2hlY2sgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VmFjYXRpb25DaGVjaygKICAgICAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgICAgICBEYXkgICA9PiAkRGF5LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRQYXJhbXtZZWFyfSBlcSAkWWVhciAmJiAkUGFyYW17TW9udGh9IGVxICRNb250aCAmJiAkQ3VycmVudERheSBlcSAkRGF5KXsKICAgICAgICAgICAgICAgICRQYXJhbXtTdHlsZX0gPSAnYmdjb2xvcj0ib3JhbmdlIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRWYWNhdGlvbkNoZWNrKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17U3R5bGV9ICAgPSAnYmdjb2xvcj0iI0VCQ0NDQyInOwogICAgICAgICAgICAgICAgJFBhcmFte0NvbW1lbnR9ID0gJFZhY2F0aW9uQ2hlY2s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRQYXJhbXtXZWVrZGF5fSA9PSA2IHx8ICRQYXJhbXtXZWVrZGF5fSA9PSA1KSB7CiAgICAgICAgICAgICAgICAkUGFyYW17U3R5bGV9ID0gJ2JnY29sb3I9IiNGRkUwRTAiJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtTdHlsZX0gPSAnYmdjb2xvcj0iI0U1RjBGRiInOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAlRGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNHZXQoCiAgICAgICAgICAgICAgICBZZWFyICAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICAgICAgTW9udGggID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgICAgICBEYXkgICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkV29ya2luZ0hvdXJzID0gMDsKICAgICAgICAgICAgbXkgJU90aGVyVGltZSAgICA9ICgpOwogICAgICAgICAgICAkT3RoZXJUaW1leyctMSd9ID0gJ0Rpc2Vhc2VkJzsKICAgICAgICAgICAgJE90aGVyVGltZXsnLTInfSA9ICdMZWF2ZURheSc7CiAgICAgICAgICAgICRPdGhlclRpbWV7Jy0zJ30gPSAnT3ZlcnRpbWUnOwoKICAgICAgICAgICAgZm9yZWFjaCBteSAkSUQgKGtleXMgJURhdGEpIHsKICAgICAgICAgICAgICAgICRXb3JraW5nSG91cnMgKz0gJERhdGF7JElEfXtQZXJpb2R9OwogICAgICAgICAgICAgICAgaWYgKCREYXRheyRJRH17UHJvamVjdElEfSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtDb21tZW50fSA9ICRPdGhlclRpbWV7JERhdGF7JElEfXtBY3Rpb25JRH19OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkV29ya2luZ0hvdXJzKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17V29ya2luZ0hvdXJzfSA9IHNwcmludGYgKCIlLjJmIiwgJFdvcmtpbmdIb3Vycyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17V29ya2luZ0hvdXJzfSA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW17V2Vla2RheV90b19UZXh0fSA9ICRXZWVrZGF5QXJyYXlbJFBhcmFte1dlZWtkYXl9XTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFyYW17Q29tbWVudH0gPSAnJzsKICAgICAgICB9CgogICAgICAgIG15ICVVc2VyUmVwb3J0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJSZXBvcnRpbmcoCiAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICApOwoKICAgICAgICBmb3JlYWNoIChxdyhUYXJnZXRTdGF0ZSBUYXJnZXRTdGF0ZVRvdGFsIFdvcmtpbmdIb3Vyc1RvdGFsIFdvcmtpbmdIb3VycwogICAgICAgICAgICBPdmVydGltZSBPdmVydGltZVRvdGFsIE92ZXJ0aW1lVW50aWwgTGVhdmVEYXkgTGVhdmVEYXlUb3RhbAogICAgICAgICAgICBMZWF2ZURheVJlbWFpbmluZyBEaXNlYXNlZCBEaXNlYXNlZFRvdGFsIERpc2Vhc2VkUmVtYWluaW5nKQogICAgICAgICkgewogICAgICAgICAgICBpZiAoISRVc2VyUmVwb3J0eyRQYXJhbXtVc2VySUR9fXskX30pIHsKICAgICAgICAgICAgICAgICRVc2VyUmVwb3J0eyRQYXJhbXtVc2VySUR9fXskX30gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXskX30gPSBzcHJpbnRmICgiJS4yZiIsICRVc2VyUmVwb3J0eyRQYXJhbXtVc2VySUR9fXskX30pOwogICAgICAgIH0KCiAgICAgICAgIyBTaG93IE92ZXJ0aW1lIGlmIGFsbG93ZWQKICAgICAgICBteSAlVXNlckJhc2ljcyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyR2V0KCk7CiAgICAgICAgaWYgKCRVc2VyQmFzaWNzeyRQYXJhbXtVc2VySUR9fXtTaG93T3ZlcnRpbWV9KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydGltZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIE92ZXJ2aWV3IHBlciBwcm9qZWN0IGFuZCBhY3Rpb24KICAgICAgICBteSAlUHJvamVjdERhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdEFjdGlvblJlcG9ydGluZygKICAgICAgICAgICAgWWVhciAgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgdGhlIHJlcG9ydCBzb3J0IGJ5IHByb2plY3RzCiAgICAgICAgaWYgKCEkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IHx8ICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ3ZhbGlkJykgewogICAgICAgICAgICAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9ID0gJ2FsbCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IGVxICdhbGwnKSB7CiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gPSAndmFsaWQnOwogICAgICAgIH0KCiAgICAgICAgbXkgJVByb2plY3QgICAgID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgICAgIG15ICVBY3Rpb24gICAgICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwogICAgICAgIGZvcmVhY2ggbXkgJFByb2plY3RJRCAoc29ydCB7JFByb2plY3R7UHJvamVjdH17JGF9IGNtcCAkUHJvamVjdHtQcm9qZWN0fXskYn19IGtleXMgJXskUHJvamVjdHtQcm9qZWN0fX0pIHsKICAgICAgICAgICAgaWYgKCRQcm9qZWN0RGF0YXtUb3RhbH17JFByb2plY3RJRH0pIHsKICAgICAgICAgICAgICAgIGlmICgkUHJvamVjdElEIG5lICctMScpIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvamVjdH09ICcnOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtDbGFzc30gICAgICAgICAgICA9ICdjb250ZW50dmFsdWUnOwogICAgICAgICAgICAgICAgICAgIGlmICgkUHJvamVjdHtQcm9qZWN0U3RhdHVzfXskUHJvamVjdElEfSkgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17U3RhdHVzfSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1N0YXR1c30gPSAncGFzc2l2JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJFRvdGFsICAgICAgPSAwOwogICAgICAgICAgICAgICAgICAgIG15ICRUb3RhbFRvdGFsID0gMDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCgkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IGVxICdhbGwnICYmICEkUGFyYW17U3RhdHVzfSkKICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAndmFsaWQnCiAgICAgICAgICAgICAgICAgICAgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGFjdGlvbiBzb3J0IHdyYXBwZXIgLSBiZSBjYXJlZnVsIGl0cyBub3Qgc2ltdWxhciB3aXRoIHByb2plY3QhIQogICAgICAgICAgICAgICAgICAgICAgICBteSAlU29ydGVkQWN0aW9ucyA9ICgpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRBY3Rpb25JRCAoa2V5cyAleyRQcm9qZWN0RGF0YXtUb3RhbH17JFByb2plY3RJRH19KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU29ydGVkQWN0aW9uc3skQWN0aW9uSUR9ID0gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvbn07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Um93U3Bhbn0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRBY3Rpb25JRCAoc29ydCB7JFNvcnRlZEFjdGlvbnN7JGF9IGNtcCAkU29ydGVkQWN0aW9uc3skYn19IGtleXMgJVNvcnRlZEFjdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgI2ZvcmVhY2ggbXkgJEFjdGlvbklEIChrZXlzICV7JFByb2plY3REYXRhe1RvdGFsfXskUHJvamVjdElEfX0pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17QWN0aW9ufSAgICAgPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc30gICAgICA9IHNwcmludGYgKCIlLjJmIiwgJFByb2plY3REYXRhe1Blck1vbnRofXskUHJvamVjdElEfXskQWN0aW9uSUR9e0hvdXJzfSB8fCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc1RvdGFsfSA9IHNwcmludGYgKCIlLjJmIiwgJFByb2plY3REYXRhe1RvdGFsfXskUHJvamVjdElEfXskQWN0aW9uSUR9e0hvdXJzfSAgICB8fCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUb3RhbCAgICAgICs9ICRQYXJhbXtIb3Vyc307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVG90YWxUb3RhbCArPSAkUGFyYW17SG91cnNUb3RhbH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJFBhcmFte1Byb2plY3R9KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2plY3R9ICAgICAgICAgICAgPSAkUHJvamVjdHtQcm9qZWN0fXskUHJvamVjdElEfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvamVjdERlc2NyaXB0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFByb2plY3R7UHJvamVjdERlc2NyaXB0aW9ufXskUHJvamVjdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3TGluZSAgICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Um93U3Bhbn0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRVc2VyQmFzaWNzeyRTZWxmLT57VXNlcklEfX17Q3JlYXRlUHJvamVjdH0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwZXJzb25zIGhvdyBhcmUgYWxsb3dlZCB0byBzZWUgdGhlIGNyZWF0ZSBvYmplY3QgbGluayBhcmUgYWxsb3dlZCB0byBzZWUgdGhlIHByb2plY3QgcmVwb3J0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0TGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0ID0+ICRQYXJhbXtQcm9qZWN0fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0SUQgPT4gJFByb2plY3RJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvamVjdE5vTGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHtQcm9qZWN0ID0+ICRQYXJhbXtQcm9qZWN0fX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Um93U3Bhbn0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtDbGFzc30gICAgICAgICAgICA9ICdjb250ZW50a2V5JzsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0FjdGlvbn0gICAgICAgICAgID0gJ1RvdGFsJzsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzfSAgICAgICAgICAgID0gc3ByaW50ZiAoIiUuMmYiLCAkVG90YWwpOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17SG91cnNUb3RhbH0gICAgICAgPSBzcHJpbnRmICgiJS4yZiIsICRUb3RhbFRvdGFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1RvdGFsSG91cnN9ICAgICAgKz0gJFRvdGFsOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSArPSAkVG90YWxUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtDbGFzc30gPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYoIGRlZmluZWQoJFBhcmFte1RvdGFsSG91cnN9KSkgewogICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gICAgICA9IHNwcmludGYgKCIlLjJmIiwgJFBhcmFte1RvdGFsSG91cnN9KTsKICAgICAgICB9CiAgICAgICAgaWYoIGRlZmluZWQoJFBhcmFte1RvdGFsSG91cnNUb3RhbH0pKSB7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ID0gc3ByaW50ZiAoIiUuMmYiLCAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSk7CiAgICAgICAgfQogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgJE91dHB1dCAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAiT3ZlcnZpZXciKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdPdmVydmlldycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNldHRpbmdzIGZvciBoYW5kbGluZyB0aW1lIGFjY291bnRpbmcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZXR0aW5nJykgewogICAgICAgIG15ICRPdXRwdXQgICAgICA9ICcnOwogICAgICAgIG15ICVGcm9udGVuZCAgICA9ICgpOwogICAgICAgIG15ICVBY3Rpb24gICAgICA9ICgpOwogICAgICAgIG15ICVTdGF0dXNMaXN0ICA9ICgpOwogICAgICAgIG15ICVVc2VyICAgICAgICA9ICgpOwogICAgICAgIG15ICVEYXRhICAgICAgICA9ICgpOwogICAgICAgIG15ICVVc2VyQmFzaWNzICA9ICgpOwoKICAgICAgICBmb3JlYWNoIChxdyhBY3Rpb25BY3Rpb24gQWN0aW9uVXNlciBOZXdBY3Rpb24gTmV3VXNlcikpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgfQoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUnd9KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NldHRpbmcnLAogICAgICAgICk7CgogICAgICAgICMgc3RvcmUgbGFzdCBzY3JlZW4KICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbicsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249U2V0dGluZyIsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRQYXJhbXtBY3Rpb25BY3Rpb259IHx8ICRQYXJhbXtOZXdBY3Rpb259KSB7CiAgICAgICAgICAgICVBY3Rpb24gPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NHZXQoKTsKICAgICAgICAgICAgbXkgJEFjdGlvbkVtcHR5ID0gMDsKICAgICAgICAgICAgbXkgJUFjdGlvbkNoZWNrID0gKCk7CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJEFjdGlvbklEIChrZXlzICVBY3Rpb24pIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKHF3KEFjdGlvbiBBY3Rpb25TdGF0dXMpKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JEFjdGlvbklEfXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8gLiAnWycgLiAkQWN0aW9uSUQgLiAnXScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCEkRGF0YXskQWN0aW9uSUR9e0FjdGlvbn0pIHsKICAgICAgICAgICAgICAgICAgICAkQWN0aW9uRW1wdHkgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCREYXRheyRBY3Rpb25JRH17QWN0aW9ufSAmJiAkQWN0aW9uQ2hlY2t7JERhdGF7JEFjdGlvbklEfXtBY3Rpb259fSAgJiYgJEFjdGlvbkNoZWNreyREYXRheyRBY3Rpb25JRH17QWN0aW9ufX0gPT0gMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKE1lc3NhZ2UgPT4gJ1RoZSBhY3Rpb25uYW1pbmcgbXVzdCBiZSB1bmlxdWUhJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkQWN0aW9uQ2hlY2t7JERhdGF7JEFjdGlvbklEfXtBY3Rpb259fSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NVcGRhdGUoJURhdGEpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbihNZXNzYWdlID0+ICdDYW5cJ3QgdXBkYXRlIGFjdGlvbiBkYXRhIScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkUGFyYW17TmV3QWN0aW9ufSAmJiAhJEFjdGlvbkVtcHR5KSB7CiAgICAgICAgICAgICAgICBpZiAoISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0luc2VydCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oTWVzc2FnZSA9PiAnQ2FuXCd0IGluc2VydCBhY3Rpb24gZGF0YSEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJVVzZXIgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclNldHRpbmdzR2V0KCk7CiAgICAgICAgICAgIG15ICVMYXN0UGVyaW9kID0gKCk7CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJFVzZXJJRCAoa2V5cyAlVXNlcikgewogICAgICAgICAgICAgICAgJExhc3RQZXJpb2R7JFVzZXJJRH0gPSAwOwogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkUGVyaW9kIChrZXlzICV7JFVzZXJ7JFVzZXJJRH19KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRMYXN0UGVyaW9keyRVc2VySUR9IDwgJFBlcmlvZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkTGFzdFBlcmlvZHskVXNlcklEfSA9ICRQZXJpb2Q7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnTmV3VXNlclNldHRpbmdbJyAuICRVc2VySUQgLiAnXScpKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUluc2VydERhdGEgPSAoKTsKICAgICAgICAgICAgICAgICAgICAkSW5zZXJ0RGF0YXtVc2VySUR9ICAgICAgPSAkVXNlcklEOwogICAgICAgICAgICAgICAgICAgICRJbnNlcnREYXRhe1BlcmlvZH0gICAgICA9ICRMYXN0UGVyaW9keyRVc2VySUR9ICsgMTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17QWN0aW9uVXNlcn0gPSAndHJ1ZSc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclNldHRpbmdzSW5zZXJ0KCVJbnNlcnREYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbihNZXNzYWdlID0+ICdDYW5cJ3QgaW5zZXJ0IHVzZXIgZGF0YSEnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRQYXJhbXtBY3Rpb25Vc2VyfSB8fCAkUGFyYW17TmV3VXNlcn0pIHsKICAgICAgICAgICAgICAgICVVc2VyQmFzaWNzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJHZXQoKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJFVzZXJJRCAoa2V5cyAlVXNlcikgewogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHF3KFNob3dPdmVydGltZSBDcmVhdGVQcm9qZWN0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8gLiAnWycgLiAkVXNlcklEIC4gJ10nKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRCcmVhayA9ICcnOwogICAgICAgICAgICAgICAgICAgIGlmICgkVXNlckJhc2ljc3skVXNlcklEfXtEZXNjcmlwdGlvbn0gJiYgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdEZXNjcmlwdGlvblsnIC4gJFVzZXJJRCAuICddJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEJyZWFrID0gIlxuIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJERlc2NyaXB0aW9uID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdEZXNjcmlwdGlvblsnIC4gJFVzZXJJRCAuICddJyk7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17RGVzY3JpcHRpb259ID0gJFVzZXJCYXNpY3N7JFVzZXJJRH17RGVzY3JpcHRpb259IC4gJEJyZWFrIC4gJERlc2NyaXB0aW9uOwoKICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtVc2VySUR9ID0gJFVzZXJJRDsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRQZXJpb2QgKGtleXMgJXskVXNlcnskVXNlcklEfX0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAocXcoV2Vla2x5SG91cnMgTGVhdmVEYXlzIFVzZXJTdGF0dXMgRGF0ZVN0YXJ0IERhdGVFbmQgT3ZlcnRpbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXskUGVyaW9kfXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8gLiAnWycgLiAkVXNlcklEIC4gJ11bJyAuICRQZXJpb2QgLiAnXScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17JFBlcmlvZH17VXNlcklEfSA9ICRVc2VySUQ7CiAgICAgICAgICAgICAgICAgICAgJExhc3RQZXJpb2R7JFVzZXJJRH0gPSAkUGVyaW9kOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJTZXR0aW5nc1VwZGF0ZSglRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbihNZXNzYWdlID0+ICdDYW5cJ3QgdXBkYXRlIHVzZXIgZGF0YSEnKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJFBhcmFte05ld1VzZXJ9ICYmICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnTmV3VXNlcklEJykpIHsKICAgICAgICAgICAgICAgICAgICAlRGF0YSA9ICgpOwogICAgICAgICAgICAgICAgICAgICREYXRhe1VzZXJJRH0gICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnTmV3VXNlcklEJyk7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7UGVyaW9kfSAgICAgID0gJzEnOwogICAgICAgICAgICAgICAgICAgIGlmICghJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJTZXR0aW5nc0luc2VydCglRGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oTWVzc2FnZSA9PiAnQ2FuXCd0IGluc2VydCB1c2VyIGRhdGEhJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICVHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMaXN0KFZhbGlkID0+IDEpOwogICAgICAgICAgICAgICAgICAgIG15ICVHcm91cERhdGEgPSRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkRGF0YXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdybycsCiAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChrZXlzICVHcm91cHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRHcm91cHN7JF99IGVxICd0aW1lX2FjY291bnRpbmcnICYmICEkR3JvdXBEYXRheyRffSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSUQgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlEID0+ICREYXRhe1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlX2ludG8gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcncgICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBTaG93IFRpbWVBY2NvdW50aW5nIFByZWZlcmVuY2VzCiAgICAgICAgJFN0YXR1c0xpc3R7MX0gPSAndmFsaWQnOwogICAgICAgICRTdGF0dXNMaXN0ezB9ID0gJ2ludmFsaWQnOwoKICAgICAgICAjIFNob3cgYWN0aW9uIGRhdGEKICAgICAgICAlQWN0aW9uID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgJEFjdGlvbkVtcHR5ID0gMDsKICAgICAgICBteSAlU29ydEFjdGlvbiAgPSAoKTsKICAgICAgICBmb3JlYWNoIG15ICRBY3Rpb25JRCAoa2V5cyAlQWN0aW9uKSB7CiAgICAgICAgICAgICRTb3J0QWN0aW9ueyRBY3Rpb25JRH0gPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICB9CiAgICAgICAgZm9yZWFjaCBteSAkQWN0aW9uSUQgKHNvcnQgeyRTb3J0QWN0aW9ueyRhfSBjbXAgJFNvcnRBY3Rpb257JGJ9fSBrZXlzICVTb3J0QWN0aW9uKSB7CiAgICAgICAgICAgICRQYXJhbXtBY3Rpb259ICAgPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICAgICAgJFBhcmFte0FjdGlvbklEfSA9ICRBY3Rpb25JRDsKCiAgICAgICAgICAgICRGcm9udGVuZHsnU3RhdHVzT3B0aW9uJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVN0YXR1c0xpc3QsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb25TdGF0dXN9IHx8ICcnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAiQWN0aW9uU3RhdHVzWyRQYXJhbXtBY3Rpb25JRH1dIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBTaG93IHVzZXIgZGF0YQogICAgICAgICVVc2VyID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJTZXR0aW5nc0dldCgpOwogICAgICAgICVVc2VyQmFzaWNzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJHZXQoKTsKICAgICAgICBteSAlU2hvd25Vc2VycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAxKTsKICAgICAgICBmb3JlYWNoIG15ICRVc2VySUQgKHNvcnQgeyRTaG93blVzZXJzeyRhfSBjbXAgJFNob3duVXNlcnN7JGJ9fSBrZXlzICVTaG93blVzZXJzKSB7CiAgICAgICAgICAgIGlmICgkVXNlcnskVXNlcklEfSkgewogICAgICAgICAgICAgICAgJFBhcmFte1VzZXJ9ICAgICAgICA9ICRTaG93blVzZXJzeyRVc2VySUR9OwogICAgICAgICAgICAgICAgJFBhcmFte1VzZXJJRH0gICAgICA9ICRVc2VySUQ7CgogICAgICAgICAgICAgICAgbXkgJERlc2NyaXB0aW9uID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoJFVzZXJCYXNpY3N7JFVzZXJJRH17RGVzY3JpcHRpb259KSB7CiAgICAgICAgICAgICAgICAgICAgJERlc2NyaXB0aW9uID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkVXNlckJhc2ljc3skVXNlcklEfXtEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIE5ld0xpbmUgICAgICAgID0+IDUwLAogICAgICAgICAgICAgICAgICAgICkgLiAiPGJyPiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRVc2VyQmFzaWNzeyRVc2VySUR9e1Nob3dPdmVydGltZX0pIHsKICAgICAgICAgICAgICAgICAgICAkVXNlckJhc2ljc3skVXNlcklEfXtTaG93T3ZlcnRpbWV9ID0gImNoZWNrZWQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRVc2VyQmFzaWNzeyRVc2VySUR9e0NyZWF0ZVByb2plY3R9KSB7CiAgICAgICAgICAgICAgICAgICAgJFVzZXJCYXNpY3N7JFVzZXJJRH17Q3JlYXRlUHJvamVjdH0gPSAiY2hlY2tlZCI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAkRGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIFNob3dPdmVydGltZSAgPT4gJFVzZXJCYXNpY3N7JFVzZXJJRH17U2hvd092ZXJ0aW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlUHJvamVjdCA9PiAkVXNlckJhc2ljc3skVXNlcklEfXtDcmVhdGVQcm9qZWN0fSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBkZWxldGUgJFNob3duVXNlcnN7JFVzZXJJRH07CgogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkUGVyaW9kIChzb3J0IGtleXMgJXskVXNlcnskVXNlcklEfX0pIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17V2Vla2x5SG91cnN9ID0gJFVzZXJ7JFVzZXJJRH17JFBlcmlvZH17V2Vla2x5SG91cnN9OwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtMZWF2ZURheXN9ICAgPSAkVXNlcnskVXNlcklEfXskUGVyaW9kfXtMZWF2ZURheXN9OwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtPdmVydGltZX0gICAgPSAkVXNlcnskVXNlcklEfXskUGVyaW9kfXtPdmVydGltZX07CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0RhdGVTdGFydH0gICA9ICRVc2VyeyRVc2VySUR9eyRQZXJpb2R9e0RhdGVTdGFydH07CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0RhdGVFbmR9ICAgICA9ICRVc2VyeyRVc2VySUR9eyRQZXJpb2R9e0RhdGVFbmR9OwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQZXJpb2R9ICAgICAgPSAkUGVyaW9kOwoKICAgICAgICAgICAgICAgICAgICAkRnJvbnRlbmR7J1N0YXR1c09wdGlvbid9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVN0YXR1c0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFVzZXJ7JFVzZXJJRH17JFBlcmlvZH17VXNlclN0YXR1c30gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gIlVzZXJTdGF0dXNbJFVzZXJJRF1bJFBlcmlvZF0iLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BlcmlvZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJVNob3duVXNlcnMpIHsKICAgICAgICAgICAgJFNob3duVXNlcnN7Jyd9ID0gJyc7CiAgICAgICAgICAgICRGcm9udGVuZHsnTmV3VXNlck9wdGlvbid9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAnJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gIk5ld1VzZXJJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdOZXdVc2VyT3B0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgJE91dHB1dCAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAiU2V0dGluZyIpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ1NldHRpbmcnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZXR0aW5ncyBmb3IgaGFuZGxpbmcgdGltZSBhY2NvdW50aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnUHJvamVjdFNldHRpbmcnKSB7CiAgICAgICAgbXkgJE91dHB1dCAgICAgPSAnJzsKICAgICAgICBteSAlRnJvbnRlbmQgICA9ICgpOwogICAgICAgIG15ICVQcm9qZWN0ICAgID0gKCk7CiAgICAgICAgbXkgJVN0YXR1c0xpc3QgPSAoKTsKICAgICAgICBteSAlRGF0YSAgICAgICA9ICgpOwoKICAgICAgICBmb3JlYWNoIChxdyhBY3Rpb25Qcm9qZWN0IE5ld1Byb2plY3QpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCEkU2VsZi0+e0FjY2Vzc1JvfSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oV2l0aEhlYWRlciA9PiAneWVzJyk7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0U2V0dGluZycsCiAgICAgICAgKTsKCiAgICAgICAgIyBFZGl0IFRpbWVBY2NvdW50aW5nIFByZWZlcmVuY2VzCiAgICAgICAgaWYgKCRQYXJhbXtBY3Rpb25Qcm9qZWN0fSB8fCAkUGFyYW17TmV3UHJvamVjdH0pIHsKICAgICAgICAgICAgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgICAgIG15ICRQcm9qZWN0RW1wdHkgPSAwOwogICAgICAgICAgICBteSAlUHJvamVjdENoZWNrID0gKCk7CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJFByb2plY3RJRCAoa2V5cyAleyRQcm9qZWN0e1Byb2plY3R9fSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCAocXcoUHJvamVjdCBQcm9qZWN0U3RhdHVzIFByb2plY3REZXNjcmlwdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskUHJvamVjdElEfXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8gLiAnWycgLiAkUHJvamVjdElEIC4gJ10nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghJERhdGF7JFByb2plY3RJRH17UHJvamVjdH0pIHsKICAgICAgICAgICAgICAgICAgICAkUHJvamVjdEVtcHR5ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkRGF0YXskUHJvamVjdElEfXtQcm9qZWN0fSAmJiAkUHJvamVjdENoZWNreyREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9fSAmJiAkUHJvamVjdENoZWNreyREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9fSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ1RoZSBwcm9qZWN0bmFtaW5nIG11c3QgYmUgdW5pcXVlIScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQcm9qZWN0Q2hlY2t7JERhdGF7JFByb2plY3RJRH17UHJvamVjdH19ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzVXBkYXRlKCVEYXRhKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oTWVzc2FnZSA9PiAnQ2FuXCd0IHVwZGF0ZSBwcm9qZWN0IGRhdGEhJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRQYXJhbXtOZXdQcm9qZWN0fSAmJiAhJFByb2plY3RFbXB0eSkgewogICAgICAgICAgICAgICAgaWYgKCEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzSW5zZXJ0KCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbihNZXNzYWdlID0+ICdDYW5cJ3QgaW5zZXJ0IHByb2plY3QgZGF0YSEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBTaG93IFRpbWVBY2NvdW50aW5nIFByZWZlcmVuY2VzCiAgICAgICAgJFN0YXR1c0xpc3R7MX0gPSAndmFsaWQnOwogICAgICAgICRTdGF0dXNMaXN0ezB9ID0gJ2ludmFsaWQnOwoKICAgICAgICAjIFNob3cgcHJvamVjdCBkYXRhCiAgICAgICAgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgJFByb2plY3RFbXB0eSA9IDA7CiAgICAgICAgZm9yZWFjaCBteSAkUHJvamVjdElEIChzb3J0IHskUHJvamVjdHtQcm9qZWN0fXskYX0gY21wICRQcm9qZWN0e1Byb2plY3R9eyRifX0ga2V5cyAleyRQcm9qZWN0e1Byb2plY3R9fSkgewoKICAgICAgICAgICAgJFBhcmFte1Byb2plY3R9ICAgICAgICAgICAgPSAkUHJvamVjdHtQcm9qZWN0fXskUHJvamVjdElEfTsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3REZXNjcmlwdGlvbn0gPSAkUHJvamVjdHtQcm9qZWN0RGVzY3JpcHRpb259eyRQcm9qZWN0SUR9OwogICAgICAgICAgICAkUGFyYW17UHJvamVjdElEfSAgICAgICAgICA9ICRQcm9qZWN0SUQ7CgogICAgICAgICAgICAkRnJvbnRlbmR7J1N0YXR1c09wdGlvbid9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTdGF0dXNMaXN0LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUHJvamVjdHtQcm9qZWN0U3RhdHVzfXskUHJvamVjdElEfSB8fCAnJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gIlByb2plY3RTdGF0dXNbJFBhcmFte1Byb2plY3RJRH1dIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgJE91dHB1dCAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAiU2V0dGluZyIpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ1NldHRpbmcnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0aW1lIGFjY291bnRpbmcgcmVwb3J0aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnUmVwb3J0aW5nJykgewogICAgICAgIG15ICRPdXRwdXQgICA9ICcnOwogICAgICAgIG15ICVGcm9udGVuZCA9ICgpOwogICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoVHlwZSA9PiAnTG9uZycsIFZhbGlkID0+IDApOwogICAgICAgIG15ICgkU2VjLCAkTWluLCAkSG91ciwgJEN1cnJlbnREYXksICRNb250aCwgJFllYXIpID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICApOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUnd9KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKHF3KFN0YXR1cyBNb250aCBZZWFyIFByb2plY3RTdGF0dXNTaG93KSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgRGF0ZQogICAgICAgIGlmICghJFBhcmFte1llYXJ9IHx8ICEkUGFyYW17TW9udGh9KSB7CiAgICAgICAgICAgICRQYXJhbXtZZWFyfSAgPSAkWWVhcjsKICAgICAgICAgICAgJFBhcmFte01vbnRofSA9ICRNb250aDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSBzcHJpbnRmKCIlMDJkIiwgJFBhcmFte01vbnRofSk7CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW4nLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVJlcG9ydGluZyZZZWFyPSRQYXJhbXtZZWFyfSZNb250aD0kUGFyYW17TW9udGh9IiwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17TW9udGhfdG9fVGV4dH0gICA9ICRNb250aEFycmF5WyRQYXJhbXtNb250aH1dOwoKICAgICAgICBteSAlTW9udGggPSAoKTsKICAgICAgICBmb3IgKG15ICRJRCA9IDE7ICRJRCA8PSAxMjsgJElEKyspIHsKICAgICAgICAgICAgJE1vbnRoe3NwcmludGYoIiUwMmQiLCRJRCl9eydWYWx1ZSd9ICAgID0gJE1vbnRoQXJyYXlbJElEXTsKICAgICAgICAgICAgJE1vbnRoe3NwcmludGYoIiUwMmQiLCRJRCl9eydQb3NpdGlvbid9ID0gJElEOwogICAgICAgICAgICBpZiAoJFBhcmFte01vbnRofSA9PSAkSUQpIHsKICAgICAgICAgICAgICAgICRNb250aHtzcHJpbnRmKCIlMDJkIiwkSUQpfXsnU2VsZWN0ZWQnfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRGcm9udGVuZHsnTW9udGhPcHRpb24nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uRWxlbWVudCgKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJU1vbnRoLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICJNb250aCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVllYXIgPSAoKTsKICAgICAgICBmb3IgKG15ICRJRCA9IDIwMDU7ICRJRCA8PSAyMDA2OyAkSUQrKykgewogICAgICAgICAgICAkWWVhcnskSUR9ID0gJElEOwogICAgICAgIH0KICAgICAgICAkRnJvbnRlbmR7J1llYXJPcHRpb24nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVZZWFyLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtZZWFyfSB8fCAnJywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAiWWVhciIsCiAgICAgICAgKTsKCiAgICAgICAgKCRQYXJhbXtZZWFyQmFja30sICRQYXJhbXtNb250aEJhY2t9LCAkUGFyYW17RGF5QmFja30pID0gQWRkX0RlbHRhX1lNRCgkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sIDEsIDAsIC0xLCAwKTsKICAgICAgICAoJFBhcmFte1llYXJOZXh0fSwgJFBhcmFte01vbnRoTmV4dH0sICRQYXJhbXtEYXlOZXh0fSkgPSBBZGRfRGVsdGFfWU1EKCRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgMSwgMCwgMSwgMCk7CgogICAgICAgIG15ICVVc2VyUmVwb3J0ICAgICAgICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyUmVwb3J0aW5nKAogICAgICAgICAgICBZZWFyICAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCAgPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICVVc2VyQmFzaWNzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJHZXQoKTsKICAgICAgICBmb3JlYWNoIG15ICRVc2VySUQgKHNvcnQgeyRTaG93blVzZXJzeyRhfSBjbXAgJFNob3duVXNlcnN7JGJ9fSBrZXlzICVTaG93blVzZXJzKSB7CiAgICAgICAgICAgIGlmICgkVXNlclJlcG9ydHskVXNlcklEfSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCAocXcoTGVhdmVEYXkgT3ZlcnRpbWUgV29ya2luZ0hvdXJzIERpc2Vhc2VkIExlYXZlRGF5UmVtYWluaW5nIE92ZXJ0aW1lVG90YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFteyRffSA9IHNwcmludGYgKCIlLjJmIiwgJFVzZXJSZXBvcnR7JFVzZXJJRH17JF99KTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17J1RvdGFsJyAuICRffSArPSAkUGFyYW17JF99OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgU2hvdyBPdmVydGltZSBpZiBhbGxvd2VkCiAgICAgICAgICAgICAgICBpZiAoISRVc2VyQmFzaWNzeyRVc2VySUR9e1Nob3dPdmVydGltZX0pIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17T3ZlcnRpbWV9ICAgICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17T3ZlcnRpbWVUb3RhbH0gPSAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUGFyYW17VXNlcn0gICA9ICRTaG93blVzZXJzeyRVc2VySUR9OwogICAgICAgICAgICAgICAgJFBhcmFte1VzZXJJRH0gPSAkVXNlcklEOwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvcmVhY2ggKHF3KFRvdGFsTGVhdmVEYXkgVG90YWxPdmVydGltZSBUb3RhbFdvcmtpbmdIb3VycwogICAgICAgICAgICBUb3RhbERpc2Vhc2VkIFRvdGFsTGVhdmVEYXlSZW1haW5pbmcgVG90YWxPdmVydGltZVRvdGFsKQogICAgICAgICkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gc3ByaW50ZiAoIiUuMmYiLCAkUGFyYW17JF99KTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyB0aGUgcmVwb3J0IHNvcnQgYnkgcHJvamVjdHMKICAgICAgICBpZiAoISRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gfHwgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAndmFsaWQnKSB7CiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gPSAnYWxsJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ2FsbCcpIHsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSA9ICd2YWxpZCc7CiAgICAgICAgfQoKICAgICAgICBteSAlUHJvamVjdERhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdEFjdGlvblJlcG9ydGluZygKICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICk7CgogICAgICAgIG15ICVQcm9qZWN0ICAgICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NHZXQoKTsKICAgICAgICBteSAlQWN0aW9uICAgICAgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NHZXQoKTsKICAgICAgICBmb3JlYWNoIG15ICRQcm9qZWN0SUQgKHNvcnQgeyRQcm9qZWN0e1Byb2plY3R9eyRhfSBjbXAgJFByb2plY3R7UHJvamVjdH17JGJ9fSBrZXlzICV7JFByb2plY3R7UHJvamVjdH19KSB7CiAgICAgICAgICAgIGlmICgkUHJvamVjdERhdGF7VG90YWx9eyRQcm9qZWN0SUR9KSB7CiAgICAgICAgICAgICAgICBpZiAoJFByb2plY3RJRCBuZSAnLTEnKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2plY3R9PSAnJzsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17Q2xhc3N9ICAgICAgICAgICAgPSAnY29udGVudHZhbHVlJzsKICAgICAgICAgICAgICAgICAgICBpZiAoJFByb2plY3R7UHJvamVjdFN0YXR1c317JFByb2plY3RJRH0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1N0YXR1c30gPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtTdGF0dXN9ID0gJ3Bhc3Npdic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICRUb3RhbCAgICAgID0gMDsKICAgICAgICAgICAgICAgICAgICBteSAkVG90YWxUb3RhbCA9IDA7CgogICAgICAgICAgICAgICAgICAgIGlmICgoJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAnYWxsJyAmJiAhJFBhcmFte1N0YXR1c30pCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ3ZhbGlkJwogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAjIGFjdGlvbiBzb3J0IHdyYXBwZXIgLSBiZSBjYXJlZnVsIGl0cyBub3Qgc2ltdWxhciB3aXRoIHByb2plY3QhIQogICAgICAgICAgICAgICAgICAgICAgICBteSAlU29ydGVkQWN0aW9ucyA9ICgpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRBY3Rpb25JRCAoa2V5cyAleyRQcm9qZWN0RGF0YXtUb3RhbH17JFByb2plY3RJRH19KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU29ydGVkQWN0aW9uc3skQWN0aW9uSUR9ID0gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvbn07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Um93U3Bhbn0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRBY3Rpb25JRCAoc29ydCB7JFNvcnRlZEFjdGlvbnN7JGF9IGNtcCAkU29ydGVkQWN0aW9uc3skYn19IGtleXMgJVNvcnRlZEFjdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgI2ZvcmVhY2ggbXkgJEFjdGlvbklEIChrZXlzICV7JFByb2plY3REYXRhe1RvdGFsfXskUHJvamVjdElEfX0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtBY3Rpb259ICAgICA9ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzfSAgICAgID0gc3ByaW50ZiAoIiUuMmYiLCAkUHJvamVjdERhdGF7UGVyTW9udGh9eyRQcm9qZWN0SUR9eyRBY3Rpb25JRH17SG91cnN9IHx8IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzVG90YWx9ID0gc3ByaW50ZiAoIiUuMmYiLCAkUHJvamVjdERhdGF7VG90YWx9ICAgeyRQcm9qZWN0SUR9eyRBY3Rpb25JRH17SG91cnN9ICAgIHx8IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRvdGFsICAgICAgKz0gJFBhcmFte0hvdXJzfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUb3RhbFRvdGFsICs9ICRQYXJhbXtIb3Vyc1RvdGFsfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJFBhcmFte1Byb2plY3R9KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2plY3R9ICAgICAgICAgICAgPSAkUHJvamVjdHtQcm9qZWN0fXskUHJvamVjdElEfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvamVjdElEfSAgICAgICAgICA9ICRQcm9qZWN0SUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2plY3REZXNjcmlwdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRQcm9qZWN0e1Byb2plY3REZXNjcmlwdGlvbn17JFByb2plY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld0xpbmUgICAgICAgID0+IDUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Jvd1NwYW59Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvamVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbSwgJUZyb250ZW5kfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtSb3dTcGFufSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtDbGFzc30gICAgICAgICAgICA9ICdjb250ZW50a2V5JzsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0FjdGlvbn0gICAgICAgICAgID0gJ1RvdGFsJzsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzfSAgICAgICAgICAgID0gc3ByaW50ZiAoIiUuMmYiLCAkVG90YWwpOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17SG91cnNUb3RhbH0gICAgICAgPSBzcHJpbnRmICgiJS4yZiIsICRUb3RhbFRvdGFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1RvdGFsSG91cnN9ICAgICAgKz0gJFRvdGFsOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSArPSAkVG90YWxUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghJFBhcmFte1RvdGFsSG91cnN9KSB7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzfSA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICghJFBhcmFte1RvdGFsSG91cnNUb3RhbH0pIHsKICAgICAgICAgICAgJFBhcmFte1RvdGFsSG91cnNUb3RhbH0gPSAwOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1RvdGFsSG91cnN9ICAgICAgPSBzcHJpbnRmICgiJS4yZiIsICRQYXJhbXtUb3RhbEhvdXJzfSk7CiAgICAgICAgJFBhcmFte1RvdGFsSG91cnNUb3RhbH0gPSBzcHJpbnRmICgiJS4yZiIsICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9KTsKCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICJSZXBvcnRpbmciKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7JVBhcmFtLCAlRnJvbnRlbmR9LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdSZXBvcnRpbmcnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0aW1lIGFjY291bnRpbmcgcHJvamVjdCByZXBvcnRpbmcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdQcm9qZWN0UmVwb3J0aW5nJykgewogICAgICAgIG15ICRPdXRwdXQgICA9ICcnOwogICAgICAgIG15ICVGcm9udGVuZCA9ICgpOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoISRTZWxmLT57QWNjZXNzUm99KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbihXaXRoSGVhZGVyID0+ICd5ZXMnKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIGZvcmVhY2ggKHF3KFByb2plY3RJRCkpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkXyk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgICAgICBmb3JlYWNoIChxdyhQcm9qZWN0SUQpKSB7CiAgICAgICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiUHJvamVjdFJlcG9ydGluZzogTmVlZCAkXyIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVBY3Rpb24gICAgICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwogICAgICAgIG15ICVQcm9qZWN0ICAgICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NHZXQoKTsKICAgICAgICAkUGFyYW17UHJvamVjdH0gPSAkUHJvamVjdHtQcm9qZWN0fXskUGFyYW17UHJvamVjdElEfX07CgogICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoVHlwZSA9PiAnTG9uZycsIFZhbGlkID0+IDApOwogICAgICAgICMgbmVjYXNzYXJ5IGJlY2F1c2UgdGhlIFByb2plY3RBY3Rpb25SZXBvcnRpbmcgaXMgbm90IHJld29ya2VkCiAgICAgICAgbXkgKCRTZWMsICRNaW4sICRIb3VyLCAkQ3VycmVudERheSwgJE1vbnRoLCAkWWVhcikgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgICAgICk7CiAgICAgICAgbXkgJVByb2plY3REYXRhID0gKCk7CiAgICAgICAgbXkgJVByb2plY3RUaW1lICAgICA9ICgpOwoKICAgICAgICAjIE9ubHkgb25lIGZ1bmN0aW9uIHNob3VsZCBiZSBlbm91Z2gKICAgICAgICBmb3JlYWNoIG15ICRVc2VySUQgKGtleXMgJVNob3duVXNlcnMpIHsKICAgICAgICAgICAgIyBPdmVydmlldyBwZXIgcHJvamVjdCBhbmQgYWN0aW9uCiAgICAgICAgICAgICVQcm9qZWN0RGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0QWN0aW9uUmVwb3J0aW5nKAogICAgICAgICAgICAgICAgWWVhciAgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgTW9udGggID0+ICRNb250aCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJFByb2plY3REYXRhe1RvdGFsfXskUGFyYW17UHJvamVjdElEfX0pIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJEFjdGlvbklEIChrZXlzICV7JFByb2plY3REYXRhe1RvdGFsfXskUGFyYW17UHJvamVjdElEfX19KSB7CiAgICAgICAgICAgICAgICAgICAgJFByb2plY3RUaW1leyRBY3Rpb25JRH17JFVzZXJJRH0gPSAkUHJvamVjdERhdGF7VG90YWx9eyRQYXJhbXtQcm9qZWN0SUR9fXskQWN0aW9uSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlICgkU2hvd25Vc2Vyc3skVXNlcklEfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2hvdyB0aGUgaGVhZGVybGluZQogICAgICAgIGZvcmVhY2ggbXkgJFVzZXJJRCAoc29ydCB7JFNob3duVXNlcnN7JGF9IGNtcCAkU2hvd25Vc2Vyc3skYn19IGtleXMgJVNob3duVXNlcnMpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJOYW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge1VzZXIgPT4gJFNob3duVXNlcnN7JFVzZXJJRH19LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBiZXR0ZXIgc29sdXRpb24gZm9yIHNvcnQgYWN0aW9ucyBuZWNlc3NhcnkKICAgICAgICBteSAlTmV3QWN0aW9uID0gKCk7CiAgICAgICAgZm9yZWFjaCBteSAkQWN0aW9uSUQgKGtleXMgJVByb2plY3RUaW1lKSB7CiAgICAgICAgICAgICROZXdBY3Rpb257JEFjdGlvbklEfSA9ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgICAgIH0KICAgICAgICAlQWN0aW9uID0gJU5ld0FjdGlvbjsKCiAgICAgICAgIyBzaG93IHRoZSByZXN1bHRzCiAgICAgICAgbXkgJVRvdGFsID0gKCk7CiAgICAgICAgZm9yZWFjaCBteSAkQWN0aW9uSUQgKHNvcnQgeyRBY3Rpb257JGF9IGNtcCAkQWN0aW9ueyRifX0ga2V5cyAlQWN0aW9uKSB7CiAgICAgICAgICAgIG15ICRUb3RhbEhvdXJzID0gMDsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJEFjdGlvbnskQWN0aW9uSUR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGZvcmVhY2ggbXkgJFVzZXJJRCAoc29ydCB7JFNob3duVXNlcnN7JGF9IGNtcCAkU2hvd25Vc2Vyc3skYn19IGtleXMgJVNob3duVXNlcnMpIHsKICAgICAgICAgICAgICAgICRUb3RhbEhvdXJzICs9ICRQcm9qZWN0VGltZXskQWN0aW9uSUR9eyRVc2VySUR9e0hvdXJzfTsKICAgICAgICAgICAgICAgICRUb3RhbHskVXNlcklEfSArPSAkUHJvamVjdFRpbWV7JEFjdGlvbklEfXskVXNlcklEfXtIb3Vyc307CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBIb3VycyA9PiBzcHJpbnRmICgiJS4yZiIsICRQcm9qZWN0VGltZXskQWN0aW9uSUR9eyRVc2VySUR9e0hvdXJzfSB8fCAwKSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAjIFRvdGFsCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEhvdXJzID0+IHNwcmludGYgKCIlLjJmIiwgJFRvdGFsSG91cnMpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1RvdGFsQWxsfSA9IDA7CiAgICAgICAgZm9yZWFjaCBteSAkVXNlcklEIChzb3J0IHskU2hvd25Vc2Vyc3skYX0gY21wICRTaG93blVzZXJzeyRifX0ga2V5cyAlU2hvd25Vc2VycykgewogICAgICAgICAgICAkUGFyYW17VG90YWxBbGx9ICs9ICRUb3RhbHskVXNlcklEfTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJUb3RhbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUb3RhbCA9PiBzcHJpbnRmICgiJS4yZiIsICRUb3RhbHskVXNlcklEfSksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1RvdGFsQWxsfSA9IHNwcmludGYgKCIlLjJmIiwgJFBhcmFte1RvdGFsQWxsfSk7CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAiUHJvamVjdFJlcG9ydGluZyIpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHslUGFyYW0sICVGcm9udGVuZH0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ1Byb2plY3RSZXBvcnRpbmcnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzaG93IGVycm9yIHNjcmVlbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKE1lc3NhZ2UgPT4gIkludmFsaWQgU3ViYWN0aW9uIHByb2Nlc3MhIik7Cn0KCjE7Cg==
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
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9Ob3RpZmljYXRpb25UaW1lQWNjb3VudGluZy5wbQojIENvcHlyaWdodCAoQykgMjAwMy0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBOb3RpZmljYXRpb25UaW1lQWNjb3VudGluZy5wbSx2IDEuMyAyMDA3LzA2LzA1IDE0OjE3OjQxIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6Tm90aWZpY2F0aW9uVGltZUFjY291bnRpbmc7Cgp1c2Ugc3RyaWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWVBY2NvdW50aW5nOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4zICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgVXNlcklEKSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICRTZWxmLT57VGltZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6VGltZSAgICAgICAgICAtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmctPm5ldyglUGFyYW0pOwogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICgkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhcikgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICApOwogICAgbXkgJVVzZXIgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckN1cnJlbnRQZXJpb2RHZXQoCiAgICAgICAgWWVhciAgPT4gJFllYXIsCiAgICAgICAgTW9udGggPT4gJE1vbnRoLAogICAgICAgIERheSAgID0+ICREYXksCiAgICApOwogICAgaWYgKCRVc2VyeyRTZWxmLT57VXNlcklEfX0pewogICAgICAgIG15ICVJbmNvbXBsZXRlV29ya2luZ0RheXMgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjaygpOwogICAgICAgICMgcmVkaXJlY3QgaWYgaW5jb21wbGV0ZSB3b3JraW5nIGRheSBhcmUgb3V0IG9mIHJhbmdlCiAgICAgICAgaWYgKCRJbmNvbXBsZXRlV29ya2luZ0RheXN7V2FybmluZ30pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJ1BsZWFzZSBpbnNlcnQgeW91ciB3b3JraW5nIGhvdXJzIScsCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICcnOwp9CgoxOwo=
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=