TimeAccounting
1.3.1
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
First version for OTRS 2.4.
A TimeAccounting Modul.
Ein Zeiterfassungsmodul.
2.4.x
<br>
<b>WELCOME</b>
<br>
<br>
You are about to install the OTRS package TimeAccounting.<br>
<br>
<br>
<b>REQUIRED OTRS PACKAGES</b>
<ul>
<li>no dependencies</li>
</ul>
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>WILLKOMMEN</b>
<br>
<br>
Sie sind im Begriff das OTRS-Paket TimeAccounting (Zeiterfassung) zu installieren.<br>
<br>
<br>
<b>BENÖTIGTE OTRS-PAKETE</b>
<ul>
<li>keine Abhängigkeiten</li>
</ul>
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>NOTICE</b>
<br>
<br>
In order to grant users access to the time accounting module, you need to add them as member to the group 'time_accounting'.
<br>
<br>
The menu items that were added by this package will be visible after you log-in to the system again.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>HINWEIS</b>
<br>
<br>
Um Benutzern Zugriff auf die Zeiterfassung zu gewähren, müssen diese Mitglied der neuen Gruppe 'time_accounting' sein.
<br>
<br>
Die von diesem Paket hinzugefügten Menü-Punkte sind erst nach einem erneuten Anmeldevorgang im System sichtbar.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ATTENTION</b>
<br>
<br>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from these tables will be irrevocably lost!
<br>
<br>
The group 'time_accounting' that was created during package installation will be deactivated.
You can activate this group again in the admin area.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ACHTUNG</b>
<br>
<br>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br>
<br>
Die von diesem Paket angelegte Gruppe 'time_accounting' wird deaktiviert.
Sie kann jederzeit im Admin-Bereich wieder aktiviert werden.
<br>
<br>
((enjoy))<br>
<br>
# define function name
my $FunctionName = 'CodeInstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
# define function name
my $FunctionName = 'CodeUninstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
2009-04-03 13:49:59
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFRpbWVBY2NvdW50aW5nLnhtbCx2IDEuMTIgMjAwOS8wMi8yNCAxNDo0MjowMSB0ciBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50VGltZUFjY291bnRpbmciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZE1vZHVsZVJlZ2lzdHJhdGlvbiBmb3IgVGltZUFjY291bnRpbmdNb2R1bGUgIHRvIGRlZmluZSB0aGUgcmVnaXN0cmF0aW9uIHNldHRpbmdzIGluIHRoZSBwcm9ncmFtIGFuZCB0byBzZXQgcmlnaHRzIGFuZCBwb3NpdGlvbnMgb2YgaWNvbnMgaW4gdGhlIG5hdmlnYXRpb24gYmFyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZE1vZHVsUmVnaXN0cmF0aW9uIGb8ciBkYXMgWmVpdGVyZmFzc3VuZ3NNb2R1bC4gIEhpZXIKa/ZubmVuIFNpZSBkaWUgQW5nYWJlbiBm/HIgZGllIFJlZ2lzdHJpZXJ1bmcgZGVzIE1vZHVscyBpbSBQcm9ncmFtbSB05HRpZ2VuLiBGZXJuZXIKa/ZubmVuIGRpZSBSZWNodGUgdW5kIGRpZSBQb3NpdGlvbmVuIGRlciBJY29ucyBpbiBkZXIgTmF2aWdhdGlvbnNsZWlzdGUgZ2VzZXR6dCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD50aW1lX2FjY291bnRpbmc8L0dyb3VwPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+dGltZV9hY2NvdW50aW5nPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlRpbWVBY2NvdW50aW5nPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlRpbWVBY2NvdW50aW5nPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPFRpdGxlPlRpbWVBY2NvdW50aW5nPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlRpbWVBY2NvdW50aW5nPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5UaW1lQWNjb3VudGluZzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+dGltZV9hY2NvdW50aW5nLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmYW1wO1N1YmFjdGlvbj1FZGl0PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+VGltZUFjY291bnRpbmc8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5NZW51PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjYwMDA8L1ByaW8+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+dGltZV9hY2NvdW50aW5nPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5PdmVydmlldzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+T3ZlcnZpZXc8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPm92ZXJ2aWV3LnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmYW1wO1N1YmFjdGlvbj1PdmVydmlldzwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5UaW1lQWNjb3VudGluZzwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+bzwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjEwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgIDxHcm91cFJvPnRpbWVfYWNjb3VudGluZzwvR3JvdXBSbz4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+RWRpdCB0aW1lIHJlY29yZDwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+RWRpdDwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+bmV3LnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmYW1wO1N1YmFjdGlvbj1FZGl0PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPlRpbWVBY2NvdW50aW5nPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT5uPC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MjAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgPEdyb3VwPnRpbWVfYWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlByb2plY3QgdGltZSByZXBvcnRpbmc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlJlcG9ydGluZzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+cmVwb3J0aW5nLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmYW1wO1N1YmFjdGlvbj1SZXBvcnRpbmc8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+VGltZUFjY291bnRpbmc8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjUwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8R3JvdXA+dGltZV9hY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+RWRpdCB0aW1lIGFjY291bnRpbmcgc2V0dGluZ3M8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlNldHRpbmc8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPm1vZHVsZV9zZXR0aW5nLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmYW1wO1N1YmFjdGlvbj1TZXR0aW5nPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPlRpbWVBY2NvdW50aW5nPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz45MDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFByb2plY3ROYW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBuYW1lIGZvciBuZXcgcHJvamVjdHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkluaXRpYWxlciBQcm9qZWt0bmFtZSBiZWltIEVyc3RlbGxlbiBlaW5lcyBuZXVlbiBQcm9qZWt0cyBpbiBkZXIgWmVpdGVyZmFzc3VuZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRQcm9qZWN0U3RhdHVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzdGF0dXMgb2YgYW4gbmV3IHByb2plY3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFuZmFuZ3NzdGF0dXMgZWluZXMgbmV1ZW4gUHJvamVrdHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5pbnZhbGlkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj52YWxpZDwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRBY3Rpb25OYW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBuYW1lIGZvciBuZXcgYWN0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SW5pdGlhbGVyIE5hbWUgZWluZXIgbmV1ZW4gVOR0aWdrZWl0IGluIGRlciBaZWl0ZXJmYXNzdW5nLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdEFjdGlvblN0YXR1cyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc3RhdHVzIG9mIGFuIG5ldyBhY3Rpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFuZmFuZ3NzdGF0dXMgZWluZXIgbmV1ZW4gVOR0aWdrZWl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+aW52YWxpZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+dmFsaWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlcldlZWtseUhvdXJzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgc3RhbmRhcmQgd2Vla2x5IGhvdXJzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZCBXb2NoZW5hcmJlaXRzemVpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+NDA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJMZWF2ZURheXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IHNldHRpbmcgZm9yIGxlYXZlIGRheXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkIFVybGF1YnN0YWdlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4yMzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlck92ZXJ0aW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzZXR0aW5nIGZvciBvdmVydGltZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RXZlbnR1ZWxsIHZvcmhhbmRlbmVyINxiZXJzdHVuZGVu/GJlcnRyYWcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJEYXRlU3RhcnQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IHNldHRpbmcgZm9yIGRhdGUgc3RhcnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YXJ0ZGF0dW0gZvxyIGRpZSBFaW5nYWJlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MjAxMC0wMS0wMTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlckRhdGVFbmQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IHNldHRpbmcgZm9yIGRhdGUgZW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5FbmRkYXR1bSBm/HIgZGllIEVpbmdhYmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4yMDEwLTEyLTMxPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyU3RhdHVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzdGF0dXMgb2YgYW4gbmV3IHVzZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFuZmFuZ3NzdGF0dXMgZWluZXMgbmV1ZW4gQmVudXR6ZXJzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+aW52YWxpZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+dmFsaWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpNYXhJbnRlcnZhbE9mSW5jb21wbGV0ZURheXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Xb3JraW5nIGRheXMgYWZ0ZXIgYXQgdGhlIGxhdGVzdCB3b3JraW5nIHVuaXRzIGhhdmUgdG8gaW5zZXJ0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MZWd0IGZlc3QsIG5hY2ggd2lldmllbGVuIFdlcmt0YWdlbiBzcOR0ZXN0ZW5zIGRpZSBBcmJlaXRzc3R1bmRlbiBlaW5nZXRyYWdlbiB3ZXJkZW4gbfxzc2VuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj40PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6Ok1heEludGVydmFsT2ZJbmNvbXBsZXRlRGF5c0JlZm9yZVdhcm5pbmciIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93IHdhcm5pbmcsIGlmIHRvIG11Y2ggaW5jb21wbGV0ZSB3b3JraW5nIGRheXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlplaWd0IGVpbmUgV2FybnVuZywgd2VubiB6dXZpZWxlIEFyYmVpdHN0YWdlIG5pY2h0IGVpbmdldHJhZ2VuIHd1cmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpOb3RpZnlNb2R1bGUjIyM4ODgtVGltZUFjY291bnRpbmciIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGlzIG5vdGlmaWNhdGlvbiBtb2R1bGUgZ2l2ZXMgYSB3YXJuaW5nIGlmIHRvIG11Y2ggaW5jb21wbGV0ZSB3b3JraW5nIGRheXMgYXZhaWxhYmxlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Nb2R1bCwgZGFzIGRlbiBBZ2VudCBpbSBOb3RpZmljYXRpb24tQmVyZWljaCBkZXMgQWdlbnQtSW50ZXJmYWNlcyBkYXL8YmVyIGluZm9ybWllcnQsIHdlbm4gc2Nob24genUgbGFuZ2Uga2VpbmUgU3R1bmRlbiBtZWhyIGVpbmdldHJhZ2VuIHd1cmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlTm90aWZ5PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5vdGlmaWNhdGlvblRpbWVBY2NvdW50aW5nPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6Ok1heEFsbG93ZWRJbnNlcnREYXlzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Rm9yIGhvdyBtYW55IGRheXMgYWdvIHlvdSBjYW4gaW5zZXJ0IHdvcmtpbmcgdW5pdHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkxlZ3QgZmVzdCwgYmlzIHdhbm4gbWFuIGluIORsdGVyZSBaZWl0ZWludHLkZ2UgYmVhcmJlaXRlbiBrYW5uICh6LiBCLiAxMCBUYWdlIHp1cvxja2xpZWdlbmQpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4xMDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpSZWR1Y2VUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VG8gdXNlLCBpZiBzb21lIGFjdGlvbnMgYWNvdW50IHJlZHVjZWQgd29ya2luZyBob3VycyhLZXkgPSZndDsgdHJhdmVsaW5nOyBDb250ZW50ID0mZ3Q7IDUwKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBrYW5uIG1hbiBlaW5nZWJlbiwgb2IgZvxyIGVpbmUgYmVzdGltbXRlIFTkdGlna2VpdCwgZGllIHp1IHZlcnJlY2huZW5kZW4gU3R1bmRlbiBnZWv8cnp0IHdlcmRlbi4gWi4gQiB3ZW5uIFJlaXNlemVpdGVuIG51ciB6dXIgSORsZnRlIHZlcmf8dGV0IHdlcmRlbiAoS2V5ID0mZ3Q7IGpvdXJuZXk7IENvbnRlbnQgPSZndDsgNTApLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InRyYXZlbGluZyI+NTA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6SW5wdXRIb3Vyc1dpdGhvdXRTdGFydEVuZFRpbWUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TZXR0aW5nLCBpZiB3b3JraW5nIGhvdXJzIGNhbiBpbnNlcnQgd2l0aG91dCBzdGFydC0gYW5kIGVuZHRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkxlZ3QgZmVzdCwgb2IgbWFuIEFyYmVpdHNzdHVuZGVuIGF1Y2ggb2huZSBBbmZhbmdzLSB1bmQgRW5kemVpdCBlaW5nZWJlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iUHJlQXBwbGljYXRpb25Nb2R1bGUjIyNBZ2VudFRpbWVBY2NvdW50aW5nIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBtb2R1bGUgeW91IGNhbiBmb3JjZSBpbnNlcnRzIGluIHRoZSBUaW1lQWNjb3VudGluZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TWl0IEhpbGZlIGRpZXNlcyBNb2R1bHMga/ZubmVuIEVpbnRy5GdlIGluIGRpZSBaZWl0ZXJmYXNzdW5nIGVyend1bmdlbiB3ZXJkZW4sIGluIGRlbSBiZWltIEVpbmxvZ2dlbiBkYXMgUG9ydGFsIGdlYmxvY2t0IHdpcmQgdW5kIG51ciBkYXMgWmVpdGVyZmFzc3VuZ3NmZW5zdGVyIGVyc2NoZWludC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+S2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpbWVBY2NvdW50aW5nPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OlByb2plY3QyUmVtYXJrUmVnRXhwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Rm9yIHdoaWNoIHByb2plY3RzIGlzIGEgcmVtYXJrIHJlcXVpcmVkLiBJZiB0aGUgUmVnRXhwIG1hdGNoIG9uIHRoZSBwcm9qZWN0LCB5b3UgaGF2ZSB0byBpbnNlcnQgYSByZW1hcmsgdG9vLiBUaGUgUmVnRXhwIHVzZSB0aGUgc214IHBhcmFtZXRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SW5uZXJoYWxiIGRpZXNlciBLb25maWd1cmF0aW9uc29wdGlvbiBrYW5uIGVpbmUgUmVnRXhwIGRlZmluaWVydCB3ZXJkZW4sIGRpZSBmZXN0bGVndCwgYmVpIHdlbGNoZW4gUHJvamVrdGVuIGVpbmUgQmVtZXJrdW5nIGVpbmdldHJhZ2VuIHdlcmRlbiBtdXNzIChkaWUgUmVnRXhwIGFyYmVpdGV0IG1pdCBzbXgtUGFyYW1ldGVybikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPl4oPzogUFJPSkVDVFwjIHwgSU5GUkE6IHwgUFJPRFVDVDogKTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
Iy0tCiMgS2VybmVsL1N5c3RlbS9UaW1lQWNjb3VudGluZy5wbSAtIGFsbCB0aW1lIGFjY291bnRpbmcgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBUaW1lQWNjb3VudGluZy5wbSx2IDEuMzMgMjAwOS8wNC8wMyAxMTo0OToyOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMzMgJCkgWzFdOwoKdXNlIERhdGU6OlBjYWxjIHF3KFRvZGF5IERheXNfaW5fTW9udGggRGF5X29mX1dlZWspOwoKPWhlYWQxIE5BTUUjCgpLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmcgLSB0aW1lYWNjb3VudGluZyBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHRpbWVhY2NvdW50aW5nIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UjCgo9b3ZlciA0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmc7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFVzZXJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICk7CiAgICBteSAkVGltZUFjY291bnRpbmdPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxMjMsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IFVzZXJJRCBUaW1lT2JqZWN0IFVzZXJPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFVzZXJDdXJyZW50UGVyaW9kR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHVzZXIgb2YgdGhlIGN1cnJlbnQgcGVyaW9kIGRhdGEKCiAgICBteSAlVXNlckRhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJDdXJyZW50UGVyaW9kR2V0KAogICAgICAgIFllYXIgID0+ICcyMDA1JywKICAgICAgICBNb250aCA9PiAnMTInOwogICAgICAgIERheSAgID0+ICcyNCcKICAgICk7Cgo9Y3V0CgpzdWIgVXNlckN1cnJlbnRQZXJpb2RHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgKHF3KFllYXIgTW9udGggRGF5KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKSB8fCAnJzsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVXNlckN1cnJlbnRQZXJpb2RHZXQ6IE5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICREYXRlID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkIiwgJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSApIC4gIiAwMDowMDowMCI7CgogICAgIyBDYWNoaW5nCiAgICBpZiAoICRTZWxmLT57J0NhY2hlOjpVc2VyQ3VycmVudFBlcmlvZEdldCd9eyREYXRlfSApIHsKICAgICAgICByZXR1cm4gJXsgJFNlbGYtPnsnQ2FjaGU6OlVzZXJDdXJyZW50UGVyaW9kR2V0J317JERhdGV9IH07CiAgICB9CgogICAgIyBkYiBzZWxlY3QKICAgIG15ICVEYXRhID0gKCk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4KICAgICAgICAgICAgIlNFTEVDVCB1c2VyX2lkLCBwcmVmZXJlbmNlX3BlcmlvZCwgZGF0ZV9zdGFydCwgZGF0ZV9lbmQsIHdlZWtseV9ob3VycywgbGVhdmVfZGF5cywgb3ZlcnRpbWUgRlJPTSB0aW1lX2FjY291bnRpbmdfdXNlcl9wZXJpb2QgIgogICAgICAgICAgICAuICJXSEVSRSBkYXRlX3N0YXJ0IDw9ICckRGF0ZScgQU5EIGRhdGVfZW5kICA+PSckRGF0ZScgQU5EIHN0YXR1cyA9IDEiLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJFVzZXJSZWYgPSB7CiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgIFBlcmlvZCAgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIERhdGVTdGFydCAgID0+IHN1YnN0ciggJFJvd1syXSwgMCwgMTAgKSwKICAgICAgICAgICAgRGF0ZUVuZCAgICAgPT4gc3Vic3RyKCAkUm93WzNdLCAwLCAxMCApLAogICAgICAgICAgICBXZWVrbHlIb3VycyA9PiAkUm93WzRdLAogICAgICAgICAgICBMZWF2ZURheXMgICA9PiAkUm93WzVdLAogICAgICAgICAgICBPdmVydGltZSAgICA9PiAkUm93WzZdLAogICAgICAgIH07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfSA9ICRVc2VyUmVmOwogICAgfQoKICAgICRTZWxmLT57J0NhY2hlOjpVc2VyQ3VycmVudFBlcmlvZEdldCd9eyREYXRlfSA9IFwlRGF0YTsKCiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFVzZXJSZXBvcnRpbmcoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBsZWF2ZWRheXMsIG92ZXJ0aW1lcywKd29ya2luZ2hvdXJzIGV0Yy4gb2YgYWxsIHVzZXJzCgogICAgbXkgJURhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJSZXBvcnRpbmcoCiAgICAgICAgWWVhciAgPT4gJzIwMDUnLAogICAgICAgIE1vbnRoID0+ICcxMicsCiAgICAgICAgRGF5ICAgPT4gJzEyJywgICAgICAjIE9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIFVzZXJSZXBvcnRpbmcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRGF0YSA9ICgpOwogICAgZm9yIChxdyhZZWFyIE1vbnRoIERheSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICkgfHwgJyc7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSAmJiAkXyBuZSAnRGF5JyApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIlVzZXJSZXBvcnRpbmc6IE5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtEYXl9IHx8PSBEYXlzX2luX01vbnRoKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0gKTsKCiAgICBteSAlVXNlckN1cnJlbnRQZXJpb2QgPSAkU2VsZi0+VXNlckN1cnJlbnRQZXJpb2RHZXQoJVBhcmFtKTsKICAgIG15ICRZZWFyU3RhcnQgICAgICAgICA9IDA7CiAgICBteSAkTW9udGhTdGFydCAgICAgICAgPSAwOwogICAgbXkgJERheVN0YXJ0ICAgICAgICAgID0gMDsKICAgIG15ICRZZWFyRW5kICAgICAgICAgICA9ICRQYXJhbXtZZWFyfTsKICAgIG15ICRNb250aEVuZCAgICAgICAgICA9ICRQYXJhbXtNb250aH07CiAgICBteSAkRGF5RW5kICAgICAgICAgICAgPSAkUGFyYW17RGF5fTsKCiAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJVVzZXJDdXJyZW50UGVyaW9kICkgewogICAgICAgIGlmICggJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e0RhdGVTdGFydH0gPX4gL14oXGQrKS0oXGQrKS0oXGQrKS8gKSB7CiAgICAgICAgICAgICRZZWFyU3RhcnQgID0gJDE7CiAgICAgICAgICAgICRNb250aFN0YXJ0ID0gJDI7CiAgICAgICAgICAgICREYXlTdGFydCAgID0gJDM7CiAgICAgICAgfQogICAgICAgICREYXRheyRVc2VySUR9e0xlYXZlRGF5fSAgICAgICAgID0gMDsKICAgICAgICAkRGF0YXskVXNlcklEfXtTaWNrfSAgICAgICAgICAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17T3ZlcnRpbWV9ICAgICAgICAgPSAwOwogICAgICAgICREYXRheyRVc2VySUR9e1RhcmdldFN0YXRlfSAgICAgID0gMDsKICAgICAgICAkRGF0YXskVXNlcklEfXtMZWF2ZURheVRvdGFsfSAgICA9IDA7CiAgICAgICAgJERhdGF7JFVzZXJJRH17U2lja1RvdGFsfSAgICAgICAgPSAwOwogICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lVG90YWx9ICAgID0gMDsKICAgICAgICAkRGF0YXskVXNlcklEfXtUYXJnZXRTdGF0ZVRvdGFsfSA9IDA7CgogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJFllYXIgKCAkWWVhclN0YXJ0IC4uICRZZWFyRW5kICkgewogICAgICAgICAgICBteSAkTW9udGhTdGFydFBvaW50ID0gJFllYXIgPT0gJFllYXJTdGFydCA/ICRNb250aFN0YXJ0IDogMTsKICAgICAgICAgICAgbXkgJE1vbnRoRW5kUG9pbnQgICA9ICRZZWFyID09ICRZZWFyRW5kICAgPyAkTW9udGhFbmQgICA6IDEyOwoKICAgICAgICAgICAgZm9yIG15ICRNb250aCAoICRNb250aFN0YXJ0UG9pbnQgLi4gJE1vbnRoRW5kUG9pbnQgKSB7CgogICAgICAgICAgICAgICAgbXkgJERheVN0YXJ0UG9pbnQgPSAkWWVhciA9PSAkWWVhclN0YXJ0ICYmICRNb250aCA9PSAkTW9udGhTdGFydCA/ICREYXlTdGFydCA6IDE7CiAgICAgICAgICAgICAgICBteSAkRGF5RW5kUG9pbnQgPSAkWWVhciA9PSAkWWVhckVuZAogICAgICAgICAgICAgICAgICAgICYmICRNb250aCA9PSAkTW9udGhFbmQgPyAkRGF5RW5kIDogRGF5c19pbl9Nb250aCggJFllYXIsICRNb250aCApOwoKICAgICAgICAgICAgICAgIGZvciBteSAkRGF5ICggJERheVN0YXJ0UG9pbnQgLi4gJERheUVuZFBvaW50ICkgewogICAgICAgICAgICAgICAgICAgIG15ICVXb3JraW5nVW5pdCA9ICRTZWxmLT5Xb3JraW5nVW5pdHNHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAkWWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgTW9udGggID0+ICRNb250aCwKICAgICAgICAgICAgICAgICAgICAgICAgRGF5ICAgID0+ICREYXksCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIG15ICRMZWF2ZURheSAgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJFNpY2sgICAgICAgID0gMDsKICAgICAgICAgICAgICAgICAgICBteSAkT3ZlcnRpbWUgICAgPSAwOwogICAgICAgICAgICAgICAgICAgIG15ICRUYXJnZXRTdGF0ZSA9IDA7CgogICAgICAgICAgICAgICAgICAgIGlmICggJFdvcmtpbmdVbml0e0xlYXZlRGF5fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17TGVhdmVEYXlUb3RhbH0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgJExlYXZlRGF5ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkV29ya2luZ1VuaXR7U2lja30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e1NpY2tUb3RhbH0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgJFNpY2sgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRXb3JraW5nVW5pdHtPdmVydGltZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lVG90YWx9Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICRPdmVydGltZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtXb3JraW5nSG91cnNUb3RhbH0gKz0gJFdvcmtpbmdVbml0e1RvdGFsfTsKICAgICAgICAgICAgICAgICAgICBteSAkVmFjYXRpb25DaGVjayA9ICRTZWxmLT57VGltZU9iamVjdH0tPlZhY2F0aW9uQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgICAgICAgICAgICAgICAgIERheSAgID0+ICREYXksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSAkV2Vla2RheSA9IERheV9vZl9XZWVrKCAkWWVhciwgJE1vbnRoLCAkRGF5ICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkV2Vla2RheSAhPSA2CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRXZWVrZGF5ICE9IDcKICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRWYWNhdGlvbkNoZWNrCiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkU2ljawogICAgICAgICAgICAgICAgICAgICAgICAmJiAhJExlYXZlRGF5CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e1RhcmdldFN0YXRlVG90YWx9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICArPSAkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17V2Vla2x5SG91cnN9IC8gNTsKICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldFN0YXRlID0gJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e1dlZWtseUhvdXJzfSAvIDU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoICRNb250aCA9PSAkTW9udGhFbmQgJiYgJFllYXIgPT0gJFllYXJFbmQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e1RhcmdldFN0YXRlfSAgKz0gJFRhcmdldFN0YXRlOwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtXb3JraW5nSG91cnN9ICs9ICRXb3JraW5nVW5pdHtUb3RhbH07CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e0xlYXZlRGF5fSAgICAgKz0gJExlYXZlRGF5OwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtTaWNrfSAgICAgICAgICs9ICRTaWNrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkRGF0YXskVXNlcklEfXtPdmVydGltZX0gPSAkRGF0YXskVXNlcklEfXtXb3JraW5nSG91cnN9IC0gJERhdGF7JFVzZXJJRH17VGFyZ2V0U3RhdGV9OwogICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lVG90YWx9CiAgICAgICAgICAgID0gJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e092ZXJ0aW1lfQogICAgICAgICAgICArICREYXRheyRVc2VySUR9e1dvcmtpbmdIb3Vyc1RvdGFsfQogICAgICAgICAgICAtICREYXRheyRVc2VySUR9e1RhcmdldFN0YXRlVG90YWx9OwogICAgICAgICREYXRheyRVc2VySUR9e092ZXJ0aW1lVW50aWx9ID0gJERhdGF7JFVzZXJJRH17T3ZlcnRpbWVUb3RhbH0gLSAkRGF0YXskVXNlcklEfXtPdmVydGltZX07CiAgICAgICAgJERhdGF7JFVzZXJJRH17TGVhdmVEYXlSZW1haW5pbmd9CiAgICAgICAgICAgID0gJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e0xlYXZlRGF5c30gLSAkRGF0YXskVXNlcklEfXtMZWF2ZURheVRvdGFsfTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gUHJvamVjdFNldHRpbmdzR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHByb2plY3QgZGF0YQoKICAgIG15ICVQcm9qZWN0RGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdFNldHRpbmdzR2V0KAogICAgICAgIFN0YXR1cyA9PiAndmFsaWQnIHx8ICdpbnZhbGlkJywgb3B0aW9uYWwgZGVmYXVsdCB2YWxpZCAmJiBpbnZhbGlkCiAgICApOwoKPWN1dAoKc3ViIFByb2plY3RTZXR0aW5nc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhICA9ICgpOwogICAgbXkgJFdoZXJlID0gJyc7CgogICAgaWYgKCAkUGFyYW17U3RhdHVzfSApIHsKICAgICAgICAkV2hlcmUgPSAnIFdIRVJFIHN0YXR1cyA9ICc7CiAgICAgICAgJFdoZXJlIC49ICRQYXJhbXtTdGF0dXN9IGVxICdpbnZhbGlkJyA/ICcwJyA6ICcxJzsKICAgIH0KCiAgICAjIGRiIHNlbGVjdAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIHByb2plY3QsIGRlc2NyaXB0aW9uLCBzdGF0dXMgRlJPTSB0aW1lX2FjY291bnRpbmdfcHJvamVjdCAkV2hlcmUiLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJElEID0gJFJvd1swXTsKICAgICAgICAkRGF0YXtQcm9qZWN0fXskSUR9ICAgICAgICAgICAgPSAkUm93WzFdOwogICAgICAgICREYXRhe1Byb2plY3REZXNjcmlwdGlvbn17JElEfSA9ICRSb3dbMl07CiAgICAgICAgJERhdGF7UHJvamVjdFN0YXR1c317JElEfSAgICAgID0gJFJvd1szXTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gUHJvamVjdFNldHRpbmdzSW5zZXJ0KCkKCmluc2VydCBuZXcgcHJvamVjdCBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdFNldHRpbmdzSW5zZXJ0KAogICAgICAgIFByb2plY3QgICAgICAgPT4gJ2ludGVybmFsJywgIyBvcHRpb25hbAogICAgICAgIFByb2plY3RTdGF0dXMgPT4gMSB8fCAwLCAgICAgIyBvcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBQcm9qZWN0U2V0dGluZ3NJbnNlcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17UHJvamVjdH0gfHw9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFByb2plY3ROYW1lJykgfHwgJyc7CiAgICAkUGFyYW17UHJvamVjdFN0YXR1c30gfHw9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFByb2plY3RTdGF0dXMnKQogICAgICAgIHx8ICcwJzsKICAgICRQYXJhbXtQcm9qZWN0RGVzY3JpcHRpb259IHx8PSAnJzsKCiAgICAjIGJ1aWxkIHNxbAoKICAgIG15ICRTUUwKICAgICAgICA9ICdJTlNFUlQgSU5UTyB0aW1lX2FjY291bnRpbmdfcHJvamVjdCAocHJvamVjdCwgZGVzY3JpcHRpb24sIHN0YXR1cykgVkFMVUVTICggPyAsID8gLCA/KSc7CgogICAgbXkgJEJpbmQgPSBbIFwkUGFyYW17UHJvamVjdH0sIFwkUGFyYW17UHJvamVjdERlc2NyaXB0aW9ufSwgXCRQYXJhbXtQcm9qZWN0U3RhdHVzfSBdOwoKICAgICMgZGIgaW5zZXJ0CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwsIEJpbmQgPT4gJEJpbmQgKTsKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBQcm9qZWN0U2V0dGluZ3NVcGRhdGUoKQoKdXBkYXRlIHByb2plY3QgZGF0YSBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPlByb2plY3RTZXR0aW5nc1VwZGF0ZSgKICAgICAgICAxICAgID0+IHsgICAgICAgICAgICAgICAgICAgICAgICAjIGVxdWFsIFByb2plY3RJRAogICAgICAgICAgICBQcm9qZWN0ICAgICAgID0+ICdpbnRlcm5hbCcsCiAgICAgICAgICAgIFByb2plY3RTdGF0dXMgPT4gMSB8fCAwLAogICAgICAgIH0sCiAgICAgICAgMiAgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAgIyBlcXVhbCBQcm9qZWN0SUQKICAgICAgICAgICAgUHJvamVjdCAgICAgICA9PiAncHJvamVjdG5hbWUnLAogICAgICAgICAgICBQcm9qZWN0U3RhdHVzID0+IDEgfHwgMCwKICAgICAgICB9LAogICAgICAgIDMgICAgPT4gLi4uLi4uCiAgICApOwoKPWN1dAoKc3ViIFByb2plY3RTZXR0aW5nc1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIFBST0pFQ1RJRDoKICAgIGZvciBteSAkUHJvamVjdElEICggc29ydCBrZXlzICVQYXJhbSApIHsKICAgICAgICBuZXh0IGlmICEkUGFyYW17JFByb2plY3RJRH17UHJvamVjdH07CgogICAgICAgICMgYnVpbGQgc3FsCiAgICAgICAgbXkgJFNRTAogICAgICAgICAgICA9ICJVUERBVEUgdGltZV9hY2NvdW50aW5nX3Byb2plY3QgIgogICAgICAgICAgICAuICJTRVQgcHJvamVjdCA9ID8gLCBzdGF0dXMgPSA/ICwgZGVzY3JpcHRpb24gPSA/ICBXSEVSRSBpZCA9ID8iOwoKICAgICAgICBteSAkQmluZCA9IFsKICAgICAgICAgICAgXCRQYXJhbXskUHJvamVjdElEfXtQcm9qZWN0fSwgICAgICAgICAgICBcJFBhcmFteyRQcm9qZWN0SUR9e1Byb2plY3RTdGF0dXN9LAogICAgICAgICAgICBcJFBhcmFteyRQcm9qZWN0SUR9e1Byb2plY3REZXNjcmlwdGlvbn0sIFwkUHJvamVjdElECiAgICAgICAgXTsKCiAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwsIEJpbmQgPT4gJEJpbmQgKTsKICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3Rpb25TZXR0aW5nc0dldCgpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSBhY3Rpb24gc2V0dGluZ3MKCiAgICBteSAlQWN0aW9uRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+QWN0aW9uU2V0dGluZ3NHZXQoKTsKCj1jdXQKCnN1YiBBY3Rpb25TZXR0aW5nc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICVEYXRhID0gKCk7CgogICAgIyBkYiBzZWxlY3QKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ1NFTEVDVCBpZCwgYWN0aW9uLCBzdGF0dXMgRlJPTSB0aW1lX2FjY291bnRpbmdfYWN0aW9uJywgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtBY3Rpb259ICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e0FjdGlvblN0YXR1c30gPSAkUm93WzJdOwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBBY3Rpb25TZXR0aW5nc0luc2VydCgpCgppbnNlcnQgbmV3IGFjdGlvbiBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+QWN0aW9uU2V0dGluZ3NJbnNlcnQoCiAgICAgICAgQWN0aW9uICAgICAgID0+ICdtZWV0aW5nJywgICAjIG9wdGlvbmFsCiAgICAgICAgQWN0aW9uU3RhdHVzID0+IDEgfHwgMCwgICAgICAjIG9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIEFjdGlvblNldHRpbmdzSW5zZXJ0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkYiBxdW90ZQogICAgZm9yICgga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApIHx8ICcnOwogICAgfQoKICAgICRQYXJhbXtBY3Rpb259IHx8PSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRBY3Rpb25OYW1lJykgfHwgJyc7CiAgICAkUGFyYW17QWN0aW9uU3RhdHVzfSB8fD0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0QWN0aW9uU3RhdHVzJykKICAgICAgICB8fCAnMCc7CgogICAgIyBidWlsZCBzcWwKICAgIG15ICRTUUwKICAgICAgICA9ICJJTlNFUlQgSU5UTyB0aW1lX2FjY291bnRpbmdfYWN0aW9uIChhY3Rpb24sIHN0YXR1cykiCiAgICAgICAgLiAiIFZBTFVFUyAoJyRQYXJhbXtBY3Rpb259JyAsICckUGFyYW17QWN0aW9uU3RhdHVzfScpIjsKCiAgICAjIGRiIGluc2VydAogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMICk7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aW9uU2V0dGluZ3NVcGRhdGUoKQoKdXBkYXRlIGFjdGlvbiBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+QWN0aW9uU2V0dGluZ3NVcGRhdGUoCiAgICAgICAgMSAgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICMgZXF1YWwgQWN0aW9uSUQKICAgICAgICAgICAgQWN0aW9uICAgICAgID0+ICdtZWV0aW5nJywKICAgICAgICAgICAgQWN0aW9uU3RhdHVzID0+IDEgfHwgMCwKICAgICAgICB9LAogICAgICAgIDIgICAgPT4geyAgICAgICAgICAgICAgICAgICAgICAjIGVxdWFsIEFjdGlvbklECiAgICAgICAgICAgIEFjdGlvbiAgICAgICA9PiAnam91cm5leScsCiAgICAgICAgICAgIEFjdGlvblN0YXR1cyA9PiAxIHx8IDAsCiAgICAgICAgfSwKICAgICAgICAzICAgID0+IC4uLi4uLgogICAgKTsKCj1jdXQKCnN1YiBBY3Rpb25TZXR0aW5nc1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIEFDVElPTklEOgogICAgZm9yIG15ICRBY3Rpb25JRCAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgbmV4dCBBQ1RJT05JRCBpZiAhJFBhcmFteyRBY3Rpb25JRH17QWN0aW9ufTsKCiAgICAgICAgIyBidWlsZCBzcWwKICAgICAgICBteSAkU1FMID0gJ1VQREFURSB0aW1lX2FjY291bnRpbmdfYWN0aW9uIFNFVCBhY3Rpb24gPSA/ICwgc3RhdHVzID0gPyBXSEVSRSBpZCA9ID8gJzsKICAgICAgICBteSAkQmluZCA9IFsgXCRQYXJhbXskQWN0aW9uSUR9e0FjdGlvbn0sIFwkUGFyYW17JEFjdGlvbklEfXtBY3Rpb25TdGF0dXN9LCBcJEFjdGlvbklEIF07CgogICAgICAgICMgZGIgaW5zZXJ0CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMLCBCaW5kID0+ICRCaW5kICk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gVXNlckxpc3QoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgdXNlciBkYXRhIG9mIGFsbCB1c2VyCgogICAgbXkgJVVzZXJEYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyTGlzdCgpOwoKPWN1dAoKc3ViIFVzZXJMaXN0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJURhdGEgPSAoKTsKCiAgICAjIGRiIHNlbGVjdAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+CiAgICAgICAgICAgICdTRUxFQ1QgdXNlcl9pZCwgZGVzY3JpcHRpb24sIHNob3dfb3ZlcnRpbWUsIGNyZWF0ZV9wcm9qZWN0LCBjYWxlbmRhciBGUk9NIHRpbWVfYWNjb3VudGluZ191c2VyJywKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRheyAkUm93WzBdIH17VXNlcklEfSAgICAgICAgPSAkUm93WzBdOwogICAgICAgICREYXRheyAkUm93WzBdIH17RGVzY3JpcHRpb259ICAgPSAkUm93WzFdOwogICAgICAgICREYXRheyAkUm93WzBdIH17U2hvd092ZXJ0aW1lfSAgPSAkUm93WzJdOwogICAgICAgICREYXRheyAkUm93WzBdIH17Q3JlYXRlUHJvamVjdH0gPSAkUm93WzNdOwogICAgICAgICREYXRheyAkUm93WzBdIH17Q2FsZW5kYXJ9ICAgICAgPSAkUm93WzRdOwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBVc2VyR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHVzZXIgZGF0YSBvZiBvbmUgdXNlcgoKICAgIG15ICVVc2VyRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+VXNlckdldCgKICAgICAgICBVc2VySUQgPT4gMTUsICAjCiAgICApOwoKPWN1dAoKc3ViIFVzZXJHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBkYXRhCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1VzZXJHZXQ6IE5lZWQgVXNlcklEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlRGF0YSA9ICgpOwoKICAgICMgZGIgc2VsZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4KICAgICAgICAgICAgJ1NFTEVDVCBkZXNjcmlwdGlvbiwgc2hvd19vdmVydGltZSwgY3JlYXRlX3Byb2plY3QsIGNhbGVuZGFyIEZST00gdGltZV9hY2NvdW50aW5nX3VzZXIgV0hFUkUgdXNlcl9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1VzZXJJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRhe1VzZXJJRH0gICAgICAgID0gJFBhcmFte1VzZXJJRH07CiAgICAgICAgJERhdGF7RGVzY3JpcHRpb259ICAgPSAkUm93WzBdOwogICAgICAgICREYXRhe1Nob3dPdmVydGltZX0gID0gJFJvd1sxXTsKICAgICAgICAkRGF0YXtDcmVhdGVQcm9qZWN0fSA9ICRSb3dbMl07CiAgICAgICAgJERhdGF7Q2FsZW5kYXJ9ICAgICAgPSAkUm93WzNdOwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBVc2VyU2V0dGluZ3NHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgdXNlciBwZXJpb2QgZGF0YQoKICAgIG15ICVVc2VyRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+VXNlclNldHRpbmdzR2V0KCk7Cgo9Y3V0CgpzdWIgVXNlclNldHRpbmdzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJURhdGEgPSAoKTsKCiAgICAjIGRiIHNlbGVjdAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+CiAgICAgICAgICAgICdTRUxFQ1QgdXNlcl9pZCwgcHJlZmVyZW5jZV9wZXJpb2QsIGRhdGVfc3RhcnQsIGRhdGVfZW5kLCB3ZWVrbHlfaG91cnMsIGxlYXZlX2RheXMsIG92ZXJ0aW1lLCBzdGF0dXMgJwogICAgICAgICAgICAuCiAgICAgICAgICAgICdGUk9NIHRpbWVfYWNjb3VudGluZ191c2VyX3BlcmlvZCcsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9eyAkUm93WzFdIH17VXNlcklEfSAgICAgID0gJFJvd1swXTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9eyAkUm93WzFdIH17UGVyaW9kfSAgICAgID0gJFJvd1sxXTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9eyAkUm93WzFdIH17RGF0ZVN0YXJ0fSAgID0gc3Vic3RyKCAkUm93WzJdLCAwLCAxMCApOwogICAgICAgICREYXRheyAkUm93WzBdIH17ICRSb3dbMV0gfXtEYXRlRW5kfSAgICAgPSBzdWJzdHIoICRSb3dbM10sIDAsIDEwICk7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXsgJFJvd1sxXSB9e1dlZWtseUhvdXJzfSA9ICRSb3dbNF07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXsgJFJvd1sxXSB9e0xlYXZlRGF5c30gICA9ICRSb3dbNV07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXsgJFJvd1sxXSB9e092ZXJ0aW1lfSAgICA9ICRSb3dbNl07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXsgJFJvd1sxXSB9e1VzZXJTdGF0dXN9ICA9ICRSb3dbN107CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFVzZXJTZXR0aW5nc0luc2VydCgpCgppbnNlcnQgbmV3IHVzZXIgZGF0YSBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJTZXR0aW5nc0luc2VydCgKICAgICAgICBVc2VySUQgICAgICAgPT4gJzInLAogICAgICAgIFBlcmlvZCAgICAgICA9PiAnMicsCiAgICApOwoKPWN1dAoKc3ViIFVzZXJTZXR0aW5nc0luc2VydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICBkZWxldGUgJFNlbGYtPnsnQ2FjaGU6OlVzZXJDdXJyZW50UGVyaW9kR2V0J307CgogICAgJFBhcmFte1dlZWtseUhvdXJzfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJXZWVrbHlIb3VycycpCiAgICAgICAgfHwgJzQwJzsKICAgICRQYXJhbXtMZWF2ZURheXN9ICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJMZWF2ZURheXMnKSB8fCAnMjUnOwogICAgJFBhcmFte1VzZXJTdGF0dXN9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlclN0YXR1cycpICAgIHx8ICcxJzsKICAgICRQYXJhbXtPdmVydGltZX0gICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJPdmVydGltZScpICB8fCAnMCc7CiAgICAkUGFyYW17RGF0ZUVuZH0gICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyRGF0ZUVuZCcpCiAgICAgICAgfHwgJzIwMDctMTItMzEnOwogICAgJFBhcmFte0RhdGVTdGFydH0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyRGF0ZVN0YXJ0JykKICAgICAgICB8fCAnMjAwNy0wMS0wMSc7CiAgICAkUGFyYW17RGVzY3JpcHRpb259ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlckRlc2NyaXB0aW9uJykKICAgICAgICB8fCAnJzsKCiAgICAjIGRiIHF1b3RlCiAgICBmb3IgKCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICk7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRffSApICkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJyc7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgc3FsCiAgICBteSAkU1FMCiAgICAgICAgPSAiSU5TRVJUIElOVE8gdGltZV9hY2NvdW50aW5nX3VzZXJfcGVyaW9kICh1c2VyX2lkLCBwcmVmZXJlbmNlX3BlcmlvZCwgZGF0ZV9zdGFydCwgZGF0ZV9lbmQsIgogICAgICAgIC4gIiB3ZWVrbHlfaG91cnMsIGxlYXZlX2RheXMsIG92ZXJ0aW1lLCBzdGF0dXMpIgogICAgICAgIC4gIiBWQUxVRVMiCiAgICAgICAgLiAiICgnJFBhcmFte1VzZXJJRH0nLCAnJFBhcmFte1BlcmlvZH0nLCAnJFBhcmFte0RhdGVTdGFydH0gMDA6MDA6MDAnLCAnJFBhcmFte0RhdGVFbmR9IDAwOjAwOjAwJywiCiAgICAgICAgLiAiICckUGFyYW17V2Vla2x5SG91cnN9JywgJyRQYXJhbXtMZWF2ZURheXN9JywgJyRQYXJhbXtPdmVydGltZX0nLCAnJFBhcmFte1VzZXJTdGF0dXN9JykiOwoKICAgICMgZGIgaW5zZXJ0CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwgKTsKCiAgICAjIFNwbGl0IHRoZSBmb2xsb3dpbmcgY29kZSBpbiBhIHNlcGVyYXRlIGZ1bmN0aW9uIQoKICAgICNjaGVjayBpZiB0aGUgdXNlciBzdGlsbCBleGlzdHMKICAgIG15ICRVc2VySUQ7CgogICAgIyBidWlsZCBzcWwKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIHVzZXJfaWQgRlJPTSB0aW1lX2FjY291bnRpbmdfdXNlciBXSEVSRSB1c2VyX2lkID0gJyRQYXJhbXtVc2VySUR9JyIsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVXNlcklEID0gJFJvd1swXTsKICAgIH0KICAgIGlmICggIWRlZmluZWQgJFVzZXJJRCApIHsKICAgICAgICAkU1FMID0gIklOU0VSVCBJTlRPIHRpbWVfYWNjb3VudGluZ191c2VyICh1c2VyX2lkLCBkZXNjcmlwdGlvbikiCiAgICAgICAgICAgIC4gIiBWQUxVRVMiCiAgICAgICAgICAgIC4gIiAoJyRQYXJhbXtVc2VySUR9JywgJyRQYXJhbXtEZXNjcmlwdGlvbn0nKSI7CgogICAgICAgICMgZGIgaW5zZXJ0CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMICk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gVXNlclNldHRpbmdzVXBkYXRlKCkKCnVwZGF0ZSB1c2VyIGRhdGEgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyU2V0dGluZ3NVcGRhdGUoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NvbWUgVGV4dCcsCiAgICAgICAgQ3JlYXRlUHJvamVjdCA9PiAxIHx8IDAsCiAgICAgICAgU2hvd092ZXJ0aW1lICA9PiAxIHx8IDAsCiAgICAgICAgMSAgICA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU29tZSBUZXh0JywKICAgICAgICAgICAgQ3JlYXRlUHJvamVjdCA9PiAxIHx8IDAsCiAgICAgICAgICAgIFNob3dPdmVydGltZSAgPT4gMSB8fCAwLAogICAgICAgICAgICAxID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGVyaW9kICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgIERhdGVTdGFydCAgICA9PiAnMjAwNS0xMi0xMicsCiAgICAgICAgICAgICAgICBEYXRlRW5kICAgICAgPT4gJzIwMDUtMTItMzEnLAogICAgICAgICAgICAgICAgV2Vla2x5SG91cnMgID0+ICczOCcsCiAgICAgICAgICAgICAgICBMZWF2ZURheXMgICAgPT4gJzI1JywKICAgICAgICAgICAgICAgIE92ZXJ0aW1lICAgICA9PiAnMzgnLAogICAgICAgICAgICAgICAgVXNlclN0YXR1cyAgID0+IDEgfHwgMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIDIgICAgPT4gewogICAgICAgICAgICAxID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAyLAogICAgICAgICAgICAgICAgUGVyaW9kICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgIERhdGVTdGFydCAgICA9PiAnMjAwNS0xMi0xMicsCiAgICAgICAgICAgICAgICBEYXRlRW5kICAgICAgPT4gJzIwMDUtMTItMzEnLAogICAgICAgICAgICAgICAgV2Vla2x5SG91cnMgID0+ICczOCcsCiAgICAgICAgICAgICAgICBMZWF2ZURheXMgICAgPT4gJzI1JywKICAgICAgICAgICAgICAgIE92ZXJ0aW1lICAgICA9PiAnMzgnLAogICAgICAgICAgICAgICAgVXNlclN0YXR1cyAgID0+IDEgfHwgMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIDMgICAgPT4gLi4uLi4uCiAgICApOwoKPWN1dAoKc3ViIFVzZXJTZXR0aW5nc1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICBkZWxldGUgJFNlbGYtPnsnQ2FjaGU6OlVzZXJDdXJyZW50UGVyaW9kR2V0J307CgogICAgVVNFUklEOgogICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVBhcmFtICkgewoKICAgICAgICBteSAkVXNlclJlZiA9ICRQYXJhbXskVXNlcklEfTsKCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkVXNlclJlZi0+ezF9e0RhdGVTdGFydH0gJiYgIWRlZmluZWQgJFVzZXJSZWYtPnsxfXtEYXRlRW5kfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVzZXJTZXR0aW5nVXBkYXRlOiBUaGVyZSBhcmUgbm8gZGF0YSBmb3IgdXNlciBpZCAkVXNlcklEISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBVU0VSSUQ7CiAgICAgICAgfQoKICAgICAgICAjc2V0IGRlZmF1bHQgZm9yIFNob3dPdmVyVGltZS4uLgogICAgICAgICRVc2VyUmVmLT57U2hvd092ZXJ0aW1lfSB8fD0gMDsKCiAgICAgICAgI3NldCBkZWZhdWx0IGZvciBDcmVhdGVQcm9qZWN0Li4uCiAgICAgICAgJFVzZXJSZWYtPntDcmVhdGVQcm9qZWN0fSB8fD0gMDsKICAgICAgICAkVXNlclJlZi0+e0NhbGVuZGFyfSAgICAgIHx8PSAwOwoKICAgICAgICAjIGJ1aWxkIHNxbAogICAgICAgIG15ICRTUUwKICAgICAgICAgICAgPSAiVVBEQVRFIHRpbWVfYWNjb3VudGluZ191c2VyICIKICAgICAgICAgICAgLiAiU0VUIGRlc2NyaXB0aW9uID0gPywgc2hvd19vdmVydGltZSA9ID8sIGNyZWF0ZV9wcm9qZWN0ID0gPywgY2FsZW5kYXIgPSA/ICIKICAgICAgICAgICAgLiAiV0hFUkUgdXNlcl9pZCA9ID8iOwoKICAgICAgICBteSAkQmluZCA9IFsKICAgICAgICAgICAgXCRVc2VyUmVmLT57RGVzY3JpcHRpb259LCBcJFVzZXJSZWYtPntTaG93T3ZlcnRpbWV9LAogICAgICAgICAgICBcJFVzZXJSZWYtPntDcmVhdGVQcm9qZWN0fSwgXCRVc2VyUmVmLT57Q2FsZW5kYXJ9LCBcJFVzZXJSZWYtPntVc2VySUR9CiAgICAgICAgXTsKCiAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgICAgICBCaW5kID0+ICRCaW5kLAogICAgICAgICk7CgogICAgICAgIGZvciAocXcoVXNlcklEIERlc2NyaXB0aW9uIFNob3dPdmVydGltZSBDcmVhdGVQcm9qZWN0IENhbGVuZGFyKSkgewogICAgICAgICAgICBkZWxldGUgJFVzZXJSZWYtPnskX307CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJFBlcmlvZCAoIGtleXMgJXskVXNlclJlZn0gKSB7CgogICAgICAgICAgICBteSAkUGVyaW9kUmVmID0gJFVzZXJSZWYtPnskUGVyaW9kfTsKCiAgICAgICAgICAgICMgYnVpbGQgc3FsCiAgICAgICAgICAgIG15ICRTUUwKICAgICAgICAgICAgICAgID0gIlVQREFURSB0aW1lX2FjY291bnRpbmdfdXNlcl9wZXJpb2QgIgogICAgICAgICAgICAgICAgLiAiU0VUIGxlYXZlX2RheXMgPSA/LCBkYXRlX3N0YXJ0ID0gPyIKICAgICAgICAgICAgICAgIC4gIiwgZGF0ZV9lbmQgPSA/LCBvdmVydGltZSA9ID8iCiAgICAgICAgICAgICAgICAuICIsIHdlZWtseV9ob3VycyA9ID8sIHN0YXR1cyA9ID8gIgogICAgICAgICAgICAgICAgLiAiV0hFUkUgdXNlcl9pZCA9ID8gQU5EIHByZWZlcmVuY2VfcGVyaW9kID0gPyI7CgogICAgICAgICAgICBteSAkQmluZCA9IFsKICAgICAgICAgICAgICAgIFwkUGVyaW9kUmVmLT57TGVhdmVEYXlzfSwgXCRQZXJpb2RSZWYtPntEYXRlU3RhcnR9LCAgIFwkUGVyaW9kUmVmLT57RGF0ZUVuZH0sCiAgICAgICAgICAgICAgICBcJFBlcmlvZFJlZi0+e092ZXJ0aW1lfSwgIFwkUGVyaW9kUmVmLT57V2Vla2x5SG91cnN9LCBcJFBlcmlvZFJlZi0+e1VzZXJTdGF0dXN9LAogICAgICAgICAgICAgICAgXCRQZXJpb2RSZWYtPntVc2VySUR9LCAgICBcJFBlcmlvZCwKICAgICAgICAgICAgXTsKCiAgICAgICAgICAgICMgZGIgaW5zZXJ0CiAgICAgICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCwgQmluZCA9PiAkQmluZCApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBXb3JraW5nVW5pdHNDb21wbGV0bmVzc0NoZWNrKCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIGluY29tcGxldGUgd29ya2luZyBkYXlzIGFuZAp0aGUgaW5mb3JtYXRpb24gaWYgdGhlIGluY29tcGxldGUgd29ya2luZyBkYXkgYXJlIGluIHRoZSBhbGxvd2VkCnJhbmdlLgoKICAgIG15ICVXb3JraW5nVW5pdHNDaGVjayA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+V29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjaygKICAgICAgICBVc2VySUQgPT4gJzInLCAgICAjIE9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIFdvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRGF0YSAgICAgICAgICAgICAgICA9ICgpOwogICAgbXkgJFdvcmtpbmdVbml0SUQgICAgICAgPSAwOwogICAgbXkgJUNvbXBsZXRlV29ya2luZ0RheXMgPSAoKTsKICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICk7CgogICAgbXkgJFVzZXJJRCA9ICRQYXJhbXtVc2VySUR9IHx8ICRTZWxmLT57VXNlcklEfTsKCiAgICAjIFRPRE86IFNlYXJjaCBvbmx5IGluIHRoZSBDdXJyZW50VXNlclBlcmlvZAogICAgIyBUT0RPOiBTZWFyY2ggb25seSB3b3JraW5nIHVuaXRzIHdoZXJlIGFjdGlvbl9pZCBhbmQgcHJvamVjdF9pZCBpcyB0cnVlCgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAiU0VMRUNUIERJU1RJTkNUIHRpbWVfc3RhcnQgRlJPTSB0aW1lX2FjY291bnRpbmdfdGFibGUgV0hFUkUgdXNlcl9pZCA9ID8iLAogICAgICAgIEJpbmQgPT4gWyBcJFVzZXJJRCBdLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUm93WzBdID1+IC9eKFxkKyktKFxkKyktKFxkKykvICkgewogICAgICAgICAgICAkQ29tcGxldGVXb3JraW5nRGF5c3skMX17JDJ9eyQzfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15ICVVc2VyQ3VycmVudFBlcmlvZCA9ICRTZWxmLT5Vc2VyQ3VycmVudFBlcmlvZEdldCgKICAgICAgICBZZWFyICA9PiAkWWVhciwKICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgRGF5ICAgPT4gJERheSwKICAgICk7CgogICAgbXkgJFdvcmtpbmdEYXlzID0gMDsKICAgIG15ICRZZWFyU3RhcnQgICA9IDA7CiAgICBteSAkTW9udGhTdGFydCAgPSAwOwogICAgbXkgJERheVN0YXJ0ICAgID0gMDsKICAgIG15ICRZZWFyRW5kICAgICA9ICRZZWFyOwogICAgbXkgJE1vbnRoRW5kICAgID0gJE1vbnRoOwogICAgbXkgJERheUVuZCAgICAgID0gJERheTsKCiAgICBpZiAoICRVc2VyQ3VycmVudFBlcmlvZHskVXNlcklEfXtEYXRlU3RhcnR9ID1+IC9eKFxkKyktKFxkKyktKFxkKykvICkgewogICAgICAgICRZZWFyU3RhcnQgID0gJDE7CiAgICAgICAgJE1vbnRoU3RhcnQgPSAkMjsKICAgICAgICAkRGF5U3RhcnQgICA9ICQzOwogICAgfQoKICAgIG15ICRDYWxlbmRhciA9IHsgJFNlbGYtPlVzZXJHZXQoIFVzZXJJRCA9PiAkVXNlcklEICkgfS0+e0NhbGVuZGFyfTsKCiAgICBmb3IgbXkgJFllYXIgKCAkWWVhclN0YXJ0IC4uICRZZWFyRW5kICkgewoKICAgICAgICBteSAkTW9udGhTdGFydFBvaW50ID0gJFllYXIgPT0gJFllYXJTdGFydCA/ICRNb250aFN0YXJ0IDogMTsKICAgICAgICBteSAkTW9udGhFbmRQb2ludCAgID0gJFllYXIgPT0gJFllYXJFbmQgICA/ICRNb250aEVuZCAgIDogMTI7CgogICAgICAgIGZvciBteSAkTW9udGggKCAkTW9udGhTdGFydFBvaW50IC4uICRNb250aEVuZFBvaW50ICkgewogICAgICAgICAgICBteSAkRGF5U3RhcnRQb2ludCA9ICRZZWFyID09ICRZZWFyU3RhcnQgJiYgJE1vbnRoID09ICRNb250aFN0YXJ0ID8gJERheVN0YXJ0IDogMTsKICAgICAgICAgICAgbXkgJERheUVuZFBvaW50ID0gJFllYXIgPT0gJFllYXJFbmQKICAgICAgICAgICAgICAgICYmICRNb250aCA9PSAkTW9udGhFbmQgPyAkRGF5RW5kIDogRGF5c19pbl9Nb250aCggJFllYXIsICRNb250aCApOwogICAgICAgICAgICBteSAkTW9udGhTdHJpbmcgPSBzcHJpbnRmKCAiJTAyZCIsICRNb250aCApOwoKICAgICAgICAgICAgZm9yIG15ICREYXkgKCAkRGF5U3RhcnRQb2ludCAuLiAkRGF5RW5kUG9pbnQgKSB7CiAgICAgICAgICAgICAgICBteSAkVmFjYXRpb25DaGVjayA9ICRTZWxmLT57VGltZU9iamVjdH0tPlZhY2F0aW9uQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgWWVhciAgICAgPT4gJFllYXIsCiAgICAgICAgICAgICAgICAgICAgTW9udGggICAgPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgICAgIERheSAgICAgID0+ICREYXksCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXIgPT4gJENhbGVuZGFyLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkRGF5U3RyaW5nID0gc3ByaW50ZiggIiUwMmQiLCAkRGF5ICk7CiAgICAgICAgICAgICAgICBteSAkV2Vla2RheSA9IERheV9vZl9XZWVrKCAkWWVhciwgJE1vbnRoLCAkRGF5ICk7CiAgICAgICAgICAgICAgICBpZiAoICRXZWVrZGF5ICE9IDYgJiYgJFdlZWtkYXkgIT0gNyAmJiAhJFZhY2F0aW9uQ2hlY2sgKSB7CiAgICAgICAgICAgICAgICAgICAgJFdvcmtpbmdEYXlzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJFdlZWtkYXkgIT0gNgogICAgICAgICAgICAgICAgICAgICYmICRXZWVrZGF5ICE9IDcKICAgICAgICAgICAgICAgICAgICAmJiAhJFZhY2F0aW9uQ2hlY2sKICAgICAgICAgICAgICAgICAgICAmJiAhJENvbXBsZXRlV29ya2luZ0RheXN7JFllYXJ9eyRNb250aFN0cmluZ317JERheVN0cmluZ30KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7SW5jb21wbGV0ZX17JFllYXJ9eyRNb250aFN0cmluZ317JERheVN0cmluZ30gPSAkV29ya2luZ0RheXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBteSAkTWF4SW50ZXJ2YWxsT2ZJbmNvbXBsZXRlRGF5cwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpNYXhJbnRlcnZhbE9mSW5jb21wbGV0ZURheXMnKSB8fCAnNSc7CiAgICBteSAkTWF4SW50ZXJ2YWxsT2ZJbmNvbXBsZXRlRGF5c0JlZm9yZVdhcm5pbmcKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6TWF4SW50ZXJ2YWxPZkluY29tcGxldGVEYXlzQmVmb3JlV2FybmluZycpCiAgICAgICAgfHwgJzMnOwogICAgZm9yIG15ICRZZWFyICgga2V5cyAleyAkRGF0YXtJbmNvbXBsZXRlfSB9ICkgewogICAgICAgIGZvciBteSAkTW9udGggKCBrZXlzICV7ICREYXRhe0luY29tcGxldGV9eyRZZWFyfSB9ICkgewogICAgICAgICAgICBmb3IgbXkgJERheSAoIGtleXMgJXsgJERhdGF7SW5jb21wbGV0ZX17JFllYXJ9eyRNb250aH0gfSApIHsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkRGF0YXtJbmNvbXBsZXRlfXskWWVhcn17JE1vbnRofXskRGF5fQogICAgICAgICAgICAgICAgICAgIDwgJFdvcmtpbmdEYXlzIC0gJE1heEludGVydmFsbE9mSW5jb21wbGV0ZURheXMKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7RW5mb3JjZUluc2VydH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgICAgICREYXRhe0luY29tcGxldGV9eyRZZWFyfXskTW9udGh9eyREYXl9CiAgICAgICAgICAgICAgICAgICAgPCAkV29ya2luZ0RheXMgLSAkTWF4SW50ZXJ2YWxsT2ZJbmNvbXBsZXRlRGF5c0JlZm9yZVdhcm5pbmcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7V2FybmluZ30gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gV29ya2luZ1VuaXRzR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHdvcmtpbmcgdW5pdHMgZGF0YQoKICAgIG15ICVXb3JraW5nVW5pdHNEYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Xb3JraW5nVW5pdHNHZXQoCiAgICAgICAgWWVhciAgID0+ICcyMDA1JywKICAgICAgICBNb250aCAgPT4gJzcnLAogICAgICAgIERheSAgICA9PiAnMTMnLAogICAgICAgIFVzZXJJRCA9PiAnMicsICAgICMgT3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya2luZ1VuaXRzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yICgga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApIHx8ICcnOwogICAgfQoKICAgICRQYXJhbXtVc2VySUR9IHx8PSAkU2VsZi0+e1VzZXJJRH07CgogICAgbXkgJERhdGUgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQiLCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9ICk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCB1c2VyX2lkLCBwcm9qZWN0X2lkLCBhY3Rpb25faWQsIHJlbWFyaywgdGltZV9zdGFydCwgdGltZV9lbmQsIgogICAgICAgICAgICAuICIgcGVyaW9kIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIFdIRVJFIHRpbWVfc3RhcnQgTElLRSAnJERhdGUlJyIKICAgICAgICAgICAgLiAiIEFORCB1c2VyX2lkID0gJyRQYXJhbXtVc2VySUR9JyBPUkRFUiBieSBpZCIsCiAgICApOwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIFRvdGFsID0+IDAsCiAgICAgICAgRGF0ZSAgPT4gJERhdGUsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgUk9XOgogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBuZXh0IFJPVyBpZiAkUm93WzRdICF+IG17XiAoLis/KSBccyAoXGQrOlxkKykgOiAoXGQrKSB9c214OwoKICAgICAgICAjIGNoZWNrIGlmIGl0IGlzIGEgc3BlY2lhbCB3b3JraW5nIHVuaXQKICAgICAgICBpZiAoICRSb3dbMV0gPT0gLTEgKSB7CiAgICAgICAgICAgIG15ICRBY3Rpb25JRCA9ICRSb3dbMl07CgogICAgICAgICAgICAkRGF0YXtTaWNrfSAgICAgPSAkQWN0aW9uSUQgPT0gLTEgPyAxIDogMDsKICAgICAgICAgICAgJERhdGF7TGVhdmVEYXl9ID0gJEFjdGlvbklEID09IC0yID8gMSA6IDA7CiAgICAgICAgICAgICREYXRhe092ZXJ0aW1lfSA9ICRBY3Rpb25JRCA9PSAtMyA/IDEgOiAwOwoKICAgICAgICAgICAgbmV4dCBST1c7CiAgICAgICAgfQogICAgICAgIG15ICRTdGFydFRpbWUgPSAkMjsKICAgICAgICBteSAkRW5kVGltZSAgID0gJyc7CiAgICAgICAgaWYgKCAkUm93WzVdID1+IG17XiguKz8pXHMoXGQrOlxkKyk6KFxkKyl9c214ICkgewogICAgICAgICAgICAkRW5kVGltZSA9ICQyOwogICAgICAgIH0KCiAgICAgICAgbXkgJVdvcmtpbmdVbml0ID0gKAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgUHJvamVjdElEID0+ICRSb3dbMV0sCiAgICAgICAgICAgIEFjdGlvbklEICA9PiAkUm93WzJdLAogICAgICAgICAgICBSZW1hcmsgICAgPT4gJFJvd1szXSwKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgIEVuZFRpbWUgICA9PiAkRW5kVGltZSwKICAgICAgICAgICAgUGVyaW9kICAgID0+IGRlZmluZWQoICRSb3dbNl0gKSA/IHNwcmludGYoICIlLjJmIiwgJFJvd1s2XSApIDogMCwKICAgICAgICApOwoKICAgICAgICAjIG9ubHkgY291bnQgY29tcGxldGUgd29ya2luZyB1bml0cwogICAgICAgIGlmICggJFJvd1sxXSAmJiAkUm93WzJdICkgewogICAgICAgICAgICAkRGF0YXtUb3RhbH0gKz0gJFdvcmtpbmdVbml0e1BlcmlvZH07CiAgICAgICAgfQogICAgICAgIHB1c2ggQHsgJERhdGF7V29ya2luZ1VuaXRzfSB9LCBcJVdvcmtpbmdVbml0OwogICAgfQogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBXb3JraW5nVW5pdHNJbnNlcnQoKQoKaW5zZXJ0IHdvcmtpbmcgdW5pdHMgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Xb3JraW5nVW5pdHNJbnNlcnQoCiAgICAgICAgWWVhciAgPT4gJzIwMDUnLAogICAgICAgIE1vbnRoID0+ICcwNycsCiAgICAgICAgRGF5ICAgPT4gJzAyJywKICAgICAgICBMZWF2ZURheSA9PiAxLCB8fCAwCiAgICAgICAgU2ljayAgICAgPT4gMSwgfHwgMAogICAgICAgIE92ZXJ0aW1lID0+IDEsIHx8IDAKICAgICAgICBXb3JraW5nVW5pdHMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBQcm9qZWN0SUQgPT4gMSwKICAgICAgICAgICAgICAgIEFjdGlvbklEICA9PiAyMywKICAgICAgICAgICAgICAgIFJlbWFyayAgICA9PiAnU29tZVRleHQsCiAgICAgICAgICAgICAgICBTdGFydFRpbWUgPT4gJzc6MzAnLAogICAgICAgICAgICAgICAgRW5kVGltZSAgID0+ICcxMTowMCcsCiAgICAgICAgICAgICAgICBQZXJpb2QgICAgPT4gJzguNScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsgLi4uLi4uIH0sCiAgICAgICAgXQogICAgKTsKCj1jdXQKCnN1YiBXb3JraW5nVW5pdHNJbnNlcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIGZvciAocXcoWWVhciBNb250aCBEYXkpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIldvcmtpbmdVbml0c0luc2VydDogTmVlZCAkXyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkRGF0ZSA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCIsICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0gKTsKCiAgICAjIGRlbGV0ZSBleGl0aW5nIGRhdGEKICAgIGlmICggISRTZWxmLT5Xb3JraW5nVW5pdHNEZWxldGUoJVBhcmFtKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnQ2FuXCd0IGRlbGV0ZSBXb3JraW5nIFVuaXRzIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBhZGQgc3BlY2lhbCB0aW1lIHdvcmtpbmcgdW5pdHMKICAgIG15ICVTcGVjaWFsQWN0aW9uID0gKAogICAgICAgICdTaWNrJyAgICAgPT4gJy0xJywKICAgICAgICAnTGVhdmVEYXknID0+ICctMicsCiAgICAgICAgJ092ZXJ0aW1lJyA9PiAnLTMnLAogICAgKTsKCiAgICBFTEVNRU5UOgogICAgZm9yIG15ICRFbGVtZW50IChxdyhMZWF2ZURheSBTaWNrIE92ZXJ0aW1lKSkgewogICAgICAgIG5leHQgRUxFTUVOVCBpZiAhJFBhcmFteyRFbGVtZW50fTsKCiAgICAgICAgbXkgJVVuaXQgPSAoCiAgICAgICAgICAgIFByb2plY3RJRCA9PiAtMSwKICAgICAgICAgICAgQWN0aW9uSUQgID0+ICRTcGVjaWFsQWN0aW9ueyRFbGVtZW50fSwKICAgICAgICAgICAgUmVtYXJrICAgID0+ICcnLAogICAgICAgICAgICBTdGFydFRpbWUgPT4gJycsCiAgICAgICAgICAgIEVuZFRpbWUgICA9PiAnJywKICAgICAgICAgICAgUGVyaW9kICAgID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAeyAkUGFyYW17V29ya2luZ1VuaXRzfSB9LCBcJVVuaXQ7CiAgICB9CgogICAgI2luc2VydCBuZXcgd29ya2luZyB1bml0cwogICAgVU5JVFJFRjoKICAgIGZvciBteSAkVW5pdFJlZiAoIEB7ICRQYXJhbXtXb3JraW5nVW5pdHN9IH0gKSB7CgogICAgICAgICNuZXh0IFVOSVRSRUYgaWYgISRVbml0UmVmLT57UHJvamVjdElEfSB8fCAhJFVuaXRSZWYtPntBY3Rpb25JRH07CgogICAgICAgIG15ICRTdGFydFRpbWUgPSAkRGF0ZSAuICcgJyAuICRVbml0UmVmLT57U3RhcnRUaW1lfTsKICAgICAgICBteSAkRW5kVGltZSAgID0gJERhdGUgLiAnICcgLiAkVW5pdFJlZi0+e0VuZFRpbWV9OwoKICAgICAgICAjICcnIGRvZXMgbm90IHdvcmsgaW4gaW50ZWdlciBmaWVsZCBvZiBwb3N0Z3JlcwogICAgICAgICRVbml0UmVmLT57UHJvamVjdElEfSB8fD0gMDsKICAgICAgICAkVW5pdFJlZi0+e0FjdGlvbklEfSAgfHw9IDA7CiAgICAgICAgJFVuaXRSZWYtPntQZXJpb2R9ICAgIHx8PSAwOwoKICAgICAgICAjIGJ1aWxkIHNxbAogICAgICAgIG15ICRTUUwKICAgICAgICAgICAgPSAiSU5TRVJUIElOVE8gdGltZV9hY2NvdW50aW5nX3RhYmxlICh1c2VyX2lkLCBwcm9qZWN0X2lkLCBhY3Rpb25faWQsIHJlbWFyaywiCiAgICAgICAgICAgIC4gIiB0aW1lX3N0YXJ0LCB0aW1lX2VuZCwgcGVyaW9kLCBjcmVhdGVkICkiCiAgICAgICAgICAgIC4gIiBWQUxVRVMgICggPywgPywgPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXApIjsKICAgICAgICBteSAkQmluZCA9IFsKICAgICAgICAgICAgXCRTZWxmLT57VXNlcklEfSwgXCRVbml0UmVmLT57UHJvamVjdElEfSwgXCRVbml0UmVmLT57QWN0aW9uSUR9LAogICAgICAgICAgICBcJFVuaXRSZWYtPntSZW1hcmt9LCBcJFN0YXJ0VGltZSwgXCRFbmRUaW1lLCBcJFVuaXRSZWYtPntQZXJpb2R9CiAgICAgICAgXTsKCiAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwsIEJpbmQgPT4gJEJpbmQgKTsKICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBXb3JraW5nVW5pdHNEZWxldGUoKQoKZGVsZXRzIHdvcmtpbmcgdW5pdHMgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Xb3JraW5nVW5pdHNEZWxldGUoCiAgICAgICAgWWVhciAgPT4gJzIwMDUnLAogICAgICAgIE1vbnRoID0+ICc3JywKICAgICAgICBEYXkgICA9PiAnMTMnLAogICAgKTsKCj1jdXQKCnN1YiBXb3JraW5nVW5pdHNEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgKHF3KFllYXIgTW9udGggRGF5KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKSB8fCAnJzsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiV29ya2luZ1VuaXRzSW5zZXJ0OiBOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICREYXRlID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkIiwgJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSApOwoKICAgICMgZGVsZXRlIG9sZCB3b3JraW5nIHVuaXRzCiAgICBteSAkU1FMID0gIkRFTEVURSBGUk9NIHRpbWVfYWNjb3VudGluZ190YWJsZSAiCiAgICAgICAgLiAiV0hFUkUgdGltZV9zdGFydCA8PSAnJERhdGUgMjM6NTk6NTknIEFORCB0aW1lX3N0YXJ0ID49ICckRGF0ZSAwMDowMDowMCcgIgogICAgICAgIC4gIiBBTkQgdXNlcl9pZCA9ICckU2VsZi0+e1VzZXJJRH0nIjsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwgKTsKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBQcm9qZWN0QWN0aW9uUmVwb3J0aW5nKCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIGhvdXJzIGRlcGVuZGVudCBwcm9qZWN0IGFuZCBhY3Rpb24gZGF0YQoKICAgIG15ICVQcm9qZWN0RGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdEFjdGlvblJlcG9ydGluZygKICAgICAgICBZZWFyICA9PiAyMDA1LAogICAgICAgIE1vbnRoID0+IDcsCiAgICAgICAgVXNlcklEID0+IDEyMywgIyBvcHRpb25hbDsgbm8gVXNlcklEIG1lYW5zICdvZiBhbGwgdXNlcicKICAgICk7Cgo9Y3V0CgpzdWIgUHJvamVjdEFjdGlvblJlcG9ydGluZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhICAgICA9ICgpOwogICAgbXkgJElEU2VsZWN0ID0gJyc7CiAgICBmb3IgKHF3KFllYXIgTW9udGgpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRffSApIHx8ICcnOwogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJQcm9qZWN0QWN0aW9uUmVwb3J0aW5nOiBOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmICggJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFBhcmFte1VzZXJJRH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtVc2VySUR9ICkgfHwgJyc7CiAgICAgICAgJElEU2VsZWN0ID0gIiBBTkQgdXNlcl9pZCA9ICckUGFyYW17VXNlcklEfSciOwogICAgfQoKICAgICMgaG91cnMgcGVyIG1vbnRoCiAgICBteSAkRGF5c0luTW9udGggPSBEYXlzX2luX01vbnRoKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0gKTsKICAgIG15ICREYXRlU3RyaW5nID0gJFBhcmFte1llYXJ9IC4gIi0iIC4gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17TW9udGh9ICk7CgogICAgbXkgJFNRTF9RdWVyeV9UaW1lU3RhcnQgPSAidGltZV9zdGFydCA8PSAnJERhdGVTdHJpbmctJERheXNJbk1vbnRoIDIzOjU5OjU5JyRJRFNlbGVjdCI7CgogICAgIyBUb3RhbCBob3VycwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+CiAgICAgICAgICAgICJTRUxFQ1QgcHJvamVjdF9pZCwgYWN0aW9uX2lkLCBwZXJpb2QgRlJPTSB0aW1lX2FjY291bnRpbmdfdGFibGUgV0hFUkUgcHJvamVjdF9pZCAhPSAtMSBBTkQgJFNRTF9RdWVyeV9UaW1lU3RhcnQiLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbmV4dCBpZiAhJFJvd1syXTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e0FjdGlvbnN9eyAkUm93WzFdIH17VG90YWx9ICs9ICRSb3dbMl07CiAgICB9CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgcHJvamVjdF9pZCwgYWN0aW9uX2lkLCBwZXJpb2QgRlJPTSB0aW1lX2FjY291bnRpbmdfdGFibGUiCiAgICAgICAgICAgIC4gIiBXSEVSRSBwcm9qZWN0X2lkICE9IC0xIEFORCB0aW1lX3N0YXJ0ID49ICckRGF0ZVN0cmluZy0wMSAwMDowMDowMCcgQU5EICRTUUxfUXVlcnlfVGltZVN0YXJ0IiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG5leHQgaWYgISRSb3dbMl07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtBY3Rpb25zfXsgJFJvd1sxXSB9e1Blck1vbnRofSArPSAkUm93WzJdOwogICAgfQoKICAgICMgYWRkIHJlYWRhYmxlIGNvbXBvbmVudHMKICAgIG15ICVQcm9qZWN0ID0gJFNlbGYtPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgbXkgJUFjdGlvbiAgPSAkU2VsZi0+QWN0aW9uU2V0dGluZ3NHZXQoKTsKICAgIGZvciBteSAkUHJvamVjdElEICgga2V5cyAlRGF0YSApIHsKICAgICAgICAkRGF0YXskUHJvamVjdElEfXtOYW1lfSAgICAgICAgPSAkUHJvamVjdHtQcm9qZWN0fXskUHJvamVjdElEfTsKICAgICAgICAkRGF0YXskUHJvamVjdElEfXtTdGF0dXN9ICAgICAgPSAkUHJvamVjdHtQcm9qZWN0U3RhdHVzfXskUHJvamVjdElEfTsKICAgICAgICAkRGF0YXskUHJvamVjdElEfXtEZXNjcmlwdGlvbn0gPSAkUHJvamVjdHtQcm9qZWN0RGVzY3JpcHRpb259eyRQcm9qZWN0SUR9OwogICAgICAgIG15ICRBY3Rpb25zUmVmID0gJERhdGF7JFByb2plY3RJRH17QWN0aW9uc307CiAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIGtleXMgJXskQWN0aW9uc1JlZn0gKSB7CiAgICAgICAgICAgICREYXRheyRQcm9qZWN0SUR9e0FjdGlvbnN9eyRBY3Rpb25JRH17TmFtZX0gPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBQcm9qZWN0VG90YWxIb3VycygpCgpyZXR1cm5zIHRoZSB0b3RhbCBzdW0gb2YgYWxsIGhvdXJzIHJlbGF0ZWQgdG8gYSBwcm9qZWN0CgogICAgbXkgJFByb2plY3RUb3RhbEhvdXJzID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Qcm9qZWN0VG90YWxIb3VycygKICAgICAgICBQcm9qZWN0SUQgID0+IDE1LAogICAgKTsKCj1jdXQKCnN1YiBQcm9qZWN0VG90YWxIb3VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtCiAgICBpZiAoICEkUGFyYW17UHJvamVjdElEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1Byb2plY3RBY3Rpb25SZXBvcnRpbmc6IE5lZWQgUHJvamVjdElEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRiIHNlbGVjdAogICAgbXkgJFRvdGFsID0gMDsKICAgIG15ICRTUUwgICA9ICdTRUxFQ1QgU1VNKHBlcmlvZCkgRlJPTSB0aW1lX2FjY291bnRpbmdfdGFibGUgV0hFUkUgcHJvamVjdF9pZCA9ID8nOwogICAgbXkgJEJpbmQgID0gWyBcJFBhcmFte1Byb2plY3RJRH0gXTsKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMLCBCaW5kID0+ICRCaW5kICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUb3RhbCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRUb3RhbDsKfQoKPWl0ZW0gUHJvamVjdEhpc3RvcnkoKQoKcmV0dXJucyBhIGFycmF5IHdpdGggYWxsIFdvcmtpbmdVbml0cyByZWxhdGVkIHRvIGEgcHJvamVjdAoKICAgIG15IEBQcm9qZWN0SGlzdG9yeUFycmF5ID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Qcm9qZWN0SGlzdG9yeSgKICAgICAgICBQcm9qZWN0SUQgID0+IDE1LAogICAgKTsKCmUuZy4gQFByb2plY3RIaXN0b3J5QXJyYXkgPSAoCiAgICAgICAgewogICAgICAgICAgICBJRCAgICAgICAgPT4gOTk5LAogICAgICAgICAgICBVc2VySUQgICAgPT4gMTUsCiAgICAgICAgICAgIFVzZXIgICAgICA9PiAnVG9tJywKICAgICAgICAgICAgQWN0aW9uSUQgID0+IDYsCiAgICAgICAgICAgIEFjdGlvbiAgICA9PiAnbWlzYycsCiAgICAgICAgICAgIFJlbWFyayAgICA9PiAncmVtYXJrJywKICAgICAgICAgICAgVGltZVN0YXJ0ID0+ICc3OjAwJywKICAgICAgICAgICAgVGltZUVuZCAgID0+ICcxODowMCcsCiAgICAgICAgICAgIERhdGUgICAgICA9PiAnMjAwOC0xMC0zMScsICMgdGhlIGRhdGUgb2YgdGhlIHdvcmtpbmcgdW5pdAogICAgICAgICAgICBQZXJpb2QgICAgPT4gMTEsCiAgICAgICAgICAgIENyZWF0ZWQgICA9PiAnMjAwOC0xMS0wMScsICMgdGhlIGluc2VydCB0aW1lIG9mIHRoZSB3b3JraW5nIHVuaXQKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgSUQgICAgICAgID0+IDk5OSwKICAgICAgICAgICAgVXNlcklEICAgID0+IDE2LAogICAgICAgICAgICBVc2VyICAgICAgPT4gJ01hbmUnLAogICAgICAgICAgICBBY3Rpb25JRCAgPT4gNywKICAgICAgICAgICAgQWN0aW9uICAgID0+ICdkZXZlbG9wbWVudCcsCiAgICAgICAgICAgIFJlbWFyayAgICA9PiAncmVtYXJrJywKICAgICAgICAgICAgVGltZVN0YXJ0ID0+ICc3OjAwJywKICAgICAgICAgICAgVGltZUVuZCAgID0+ICcxODowMCcsCiAgICAgICAgICAgIFBlcmlvZCAgICA9PiAxMSwKICAgICAgICAgICAgRGF0ZSAgICAgID0+ICcyMDA4LTExLTAzJywKICAgICAgICAgICAgQ3JlYXRlZCAgID0+ICcyMDA4LTExLTAzJywKICAgICAgICB9CiAgICApOwoKPWN1dAoKc3ViIFByb2plY3RIaXN0b3J5IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW0KICAgIGlmICggISRQYXJhbXtQcm9qZWN0SUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdQcm9qZWN0QWN0aW9uUmVwb3J0aW5nOiBOZWVkIFByb2plY3RJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWxsIGFjdGlvbiBkYXRhIHRvIGdldCB0aGUgcmVhZGFibGUgbmFtZSBvZiB0aGUgYWN0aW9uCiAgICBteSAlQWN0aW9uRGF0YSA9ICRTZWxmLT5BY3Rpb25TZXR0aW5nc0dldCgpOwoKICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoIFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAwICk7CgogICAgIyBkYiBzZWxlY3QKICAgIG15IEBEYXRhID0gKCk7CiAgICBteSAkU1FMICA9ICdTRUxFQ1QgaWQsIHVzZXJfaWQsIGFjdGlvbl9pZCwgcmVtYXJrLCB0aW1lX3N0YXJ0LCB0aW1lX2VuZCwgcGVyaW9kLCBjcmVhdGVkICcKICAgICAgICAuICcgRlJPTSB0aW1lX2FjY291bnRpbmdfdGFibGUgV0hFUkUgcHJvamVjdF9pZCA9ID8nOwogICAgbXkgJEJpbmQgPSBbIFwkUGFyYW17UHJvamVjdElEfSBdOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMLCBCaW5kID0+ICRCaW5kICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICRVc2VyUmVmID0gewogICAgICAgICAgICBJRCAgICAgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIFVzZXIgICAgICA9PiAkU2hvd25Vc2Vyc3sgJFJvd1sxXSB9LAogICAgICAgICAgICBBY3Rpb25JRCAgPT4gJFJvd1syXSwKICAgICAgICAgICAgQWN0aW9uICAgID0+ICRBY3Rpb25EYXRheyAkUm93WzJdIH17QWN0aW9ufSwKICAgICAgICAgICAgUmVtYXJrICAgID0+ICRSb3dbM10gfHwgJycsCiAgICAgICAgICAgIFRpbWVTdGFydCA9PiAkUm93WzRdLAogICAgICAgICAgICBUaW1lRW5kICAgPT4gJFJvd1s1XSwKICAgICAgICAgICAgRGF0ZSAgICAgID0+ICRSb3dbNF0sCiAgICAgICAgICAgIFBlcmlvZCAgICA9PiAkUm93WzZdLAogICAgICAgICAgICBDcmVhdGVkICAgPT4gJFJvd1s3XSwKICAgICAgICB9OwogICAgICAgICRVc2VyUmVmLT57RGF0ZX0gPX4gc3soXGRcZFxkXGQtXGRcZC1cZFxkKSBccyAuKyB9eyQxfXNteDsKCiAgICAgICAgcHVzaCBARGF0YSwgJFVzZXJSZWY7CiAgICB9CgogICAgcmV0dXJuIEBEYXRhOwoKfQoKPWl0ZW0gTGFzdFByb2plY3RzT2ZVc2VyKCkKCnJldHVybnMgdGhlIGEgYXJyYXkgd2l0aCB0aGUgbGFzdCBwcm9qZWN0cyBvZiB0aGUgdXNlcgoKICAgIG15IEBMYXN0UHJvamVjdHMgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPkxhc3RQcm9qZWN0c09mVXNlcigpOwoKPWN1dAoKc3ViIExhc3RQcm9qZWN0c09mVXNlciB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgZGIgc2VsZWN0CiAgICAjIEkgZG9uJ3QgdXNlIGRpc3RpbmN0IGJlY2F1c2Ugb2YgT1JERVIgQlkgcHJvYmxlbXMgb2YgcG9zdGdyZSBzcWwKICAgIG15ICVQcm9qZWN0cyA9ICgpOwogICAgbXkgJFNRTAogICAgICAgID0gJ1NFTEVDVCBwcm9qZWN0X2lkIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIFdIRVJFIHVzZXJfaWQgPSA/IEFORCBwcm9qZWN0X2lkIDw+IC0xIE9SREVSIEJZIHRpbWVfc3RhcnQgREVTQyc7CiAgICBteSAkQmluZCAgPSBbIFwkU2VsZi0+e1VzZXJJRH0gXTsKICAgIG15ICRMaW1pdCA9IDQwOwogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICRTUUwsIEJpbmQgPT4gJEJpbmQsIExpbWl0ID0+ICRMaW1pdCApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgbXkgJENvdW50ZXIgPSAwOwogICAgUk9XOgogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBuZXh0IFJPVyBpZiAkQ291bnRlciA+IDc7CiAgICAgICAgbmV4dCBST1cgaWYgJFByb2plY3RzeyAkUm93WzBdIH07CgogICAgICAgICRQcm9qZWN0c3sgJFJvd1swXSB9ID0gMTsKICAgICAgICAkQ291bnRlcisrOwogICAgfQoKICAgIHJldHVybiBrZXlzICVQcm9qZWN0czsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMzMgJCAkRGF0ZTogMjAwOS8wNC8wMyAxMTo0OToyOSAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9BZ2VudFRpbWVBY2NvdW50aW5nLnBtIC0gdGhlIGRlIGxhbmd1YWdlIGZvciBBZ2VudFRpbWVBY2NvdW50aW5nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBkZV9BZ2VudFRpbWVBY2NvdW50aW5nLnBtLHYgMS40NCAyMDA5LzA0LzAzIDExOjQ5OjI5IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0FnZW50VGltZUFjY291bnRpbmc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259ID0gewogICAgICAgICV7ICRTZWxmLT57VHJhbnNsYXRpb259IH0sCgogICAgICAgICMgVGVtcGxhdGU6IEFnZW50VGltZUFjY291bnRpbmcKICAgICAgICAnU2V0dGluZycgICAgICAgICAgPT4gJ0tvbmZpZ3VyYXRpb24nLAogICAgICAgICdQcm9qZWN0IHNldHRpbmdzJyA9PiAnUHJvamVrdGtvbmZpZ3VyYXRpb25lbicsCgogICAgICAgICdOZXh0IGRheScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTuRjaHN0ZXIgVGFnJywKICAgICAgICAnT25lIGRheSBiYWNrJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0VpbmVuIFRhZyB6dXL8Y2snLAogICAgICAgICdEYXRlJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRGF0dW0nLAogICAgICAgICdDb21tZW50cycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnS29tbWVudGFyZScsCiAgICAgICAgJ3VudGlsJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdiaXMnLAogICAgICAgICdUb3RhbCBob3VycyB3b3JrZWQnICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJiZWl0c3N0dW5kZW4nLAogICAgICAgICdXb3JraW5nIEhvdXJzJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXJiZWl0c3N0dW5kZW4nLAogICAgICAgICdIb3VycyBwZXIgd2VlaycgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnV29jaGVuc3R1bmRlbicsCiAgICAgICAgJ3RoaXMgbW9udGgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdkaWVzZXIgTW9uYXQnLAogICAgICAgICdPdmVydGltZSAoSG91cnMpJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiAn3GJlcnN0dW5kZW4gKGluIFN0dW5kZW4pJywKICAgICAgICAnT3ZlcnRpbWUgKHRvdGFsKScgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ9xiZXJzdHVuZGVuIChkaWVzZXIgTW9uYXQpJywKICAgICAgICAnT3ZlcnRpbWUgKHRoaXMgbW9udGgpJyAgICAgICAgICAgICAgICAgICAgPT4gJ9xiZXJzdHVuZGVuIChTdW1tZSknLAogICAgICAgICdSZW1haW5pbmcgb3ZlcnRpbWUgbGVhdmUnICAgICAgICAgICAgICAgICA9PiAn3GJlcnN0dW5kZW4gKHZlcmJsZWliZW5kKScsCiAgICAgICAgJ1ZhY2F0aW9uJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcmxhdWInLAogICAgICAgICdWYWNhdGlvbiAoRGF5cyknICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVXJsYXViIChpbiBUYWdlbiknLAogICAgICAgICdWYWNhdGlvbiB0YWtlbiAodGhpcyBtb250aCknICAgICAgICAgICAgICA9PiAnVXJsYXVic3RhZ2UgKGRpZXNlciBNb25hdCknLAogICAgICAgICdWYWNhdGlvbiB0YWtlbiAodG90YWwpJyAgICAgICAgICAgICAgICAgICA9PiAnVXJsYXVic3RhZ2UgKFN1bW1lKScsCiAgICAgICAgJ1JlbWFpbmluZyB2YWNhdGlvbicgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcmxhdWJzdGFnZSAodmVyYmxlaWJlbmQpJywKICAgICAgICAnU2ljayBsZWF2ZSB0YWtlbiAodGhpcyBtb250aCknICAgICAgICAgICAgPT4gJ0Vya3Jhbmt0IChkaWVzZXIgTW9uYXQpJywKICAgICAgICAnU2ljayBsZWF2ZSB0YWtlbiAodG90YWwpJyAgICAgICAgICAgICAgICAgPT4gJ0Vya3Jhbmt0IChTdW1tZSknLAogICAgICAgICdUaW1lQWNjb3VudGluZycgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnWmVpdGVyZmFzc3VuZycsCiAgICAgICAgJ1RpbWUgcmVwb3J0aW5nIG1vbnRobHkgb3ZlcnZpZXcnICAgICAgICAgID0+ICdNb25hdHP8YmVyc2ljaHQgWmVpdGVyZmFzc3VuZycsCiAgICAgICAgJ0VkaXQgdGltZSByZWNvcmQnICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdaZWl0ZXJmYXNzdW5nIGJlYXJiZWl0ZW4nLAogICAgICAgICdFZGl0IHRpbWUgYWNjb3VudGluZyBzZXR0aW5ncycgICAgICAgICAgICA9PiAnWmVpdGVyZmFzc3VuZ3NlaW5zdGVsbHVuZ2VuIGJlYXJiZWl0ZW4nLAogICAgICAgICdVc2VyIHJlcG9ydHMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTnV0emVyYmVyaWNodGUnLAogICAgICAgICdVc2VyXCdzIHByb2plY3Qgb3ZlcnZpZXcnICAgICAgICAgICAgICAgICA9PiAnTnV0emVyYmVyaWNodGUnLAogICAgICAgICdQcm9qZWN0IHJlcG9ydCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnUHJvamVrdGJlcmljaHQnLAogICAgICAgICdQcm9qZWN0IHJlcG9ydHMnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnUHJvamVrdGJlcmljaHRlJywKICAgICAgICAnVGltZSByZXBvcnRpbmcnICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1plaXRiZXJpY2h0ZScsCiAgICAgICAgJ0xlYXZlRGF5IFJlbWFpbmluZycgICAgICAgICAgICAgICAgICAgICAgID0+ICdWZXJibGVpYmVuZGUgVXJsYXVic3RhZ2UnLAogICAgICAgICdNb250aGx5IHRvdGFsJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAncHJvIE1vbmF0JywKICAgICAgICAnVmlldyB0aW1lIHJlY29yZCcgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1plaXRyZWtvcmQgYW5zaWNodCcsCiAgICAgICAgJ1ZpZXcgb2YgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBbnNpY2h0IHZvbicsCiAgICAgICAgJ01vbnRobHknICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdwcm8gTW9uYXQnLAogICAgICAgICdIb3VycycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU3R1bmRlbicsCiAgICAgICAgJ0RhdGUgbmF2aWdhdGlvbicgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBdXN3YWhsIERhdHVtJywKICAgICAgICAnTW9udGggbmF2aWdhdGlvbicgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0F1c3dhaGwgRGF0dW0nLAogICAgICAgICdEYXlzIHdpdGhvdXQgZW50cmllcycgICAgICAgICAgICAgICAgICAgICA9PiAnbmljaHQgYXVzZ2Vm/GxsdGUgVGFnZScsCiAgICAgICAgJ1Byb2plY3QnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdQcm9qZWt0JywKICAgICAgICAnUHJvamVjdHMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1Byb2pla3RlJywKICAgICAgICAnR3JhbmQgdG90YWwnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1N1bW1lJywKICAgICAgICAnTGlmZXRpbWUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1N1bW1lJywKICAgICAgICAnTGlmZXRpbWUgdG90YWwnICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1N1bW1lJywKICAgICAgICAnUmVwb3J0aW5nJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0JlcmljaHRzd2VzZW4nLAogICAgICAgICdUYXNrIHNldHRpbmdzJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVOR0aWdrZWl0c2VpbnN0ZWxsdW5nZW4nLAogICAgICAgICdVc2VyIHNldHRpbmdzJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTnV0emVyZWluc3RlbGx1bmdlbicsCiAgICAgICAgJ1Nob3cgT3ZlcnRpbWUnICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICfcYmVyc3R1bmRlbiBhbnplaWdlbicsCiAgICAgICAgJ0FsbG93IHByb2plY3QgY3JlYXRpb24nICAgICAgICAgICAgICAgICAgID0+ICdQcm9qZWt0IGVyc3RlbGxlbicsCiAgICAgICAgJ0FkZCB0aW1lIHBlcmlvZCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOZXVlIE51dHplcmVpbnN0ZWxsdW5nJywKICAgICAgICAnUmVtYXJrJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FubWVya3VuZycsCiAgICAgICAgJ1N0YXJ0JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdCZWdpbm4nLAogICAgICAgICdFbmQnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRW5kZScsCiAgICAgICAgJ1BlcmlvZCBiZWdpbicgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdEYXR1bSBCZWdpbm4nLAogICAgICAgICdQZXJpb2QgZW5kJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRGF0dW0gRW5kZScsCiAgICAgICAgJ1BlcmlvZCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdEYXVlcicsCiAgICAgICAgJ0RheXMgb2YgdmFjYXRpb24nICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcmxhdWJzdGFnZScsCiAgICAgICAgJ09uIHZhY2F0aW9uJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdpbSBVcmxhdWInLAogICAgICAgICdTaWNrIGRheScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRXJrcmFua3QnLAogICAgICAgICdTaWNrIGxlYXZlIChEYXlzKScgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRXJrcmFua3QgKGluIFRhZ2VuKScsCiAgICAgICAgJ1NpY2sgbGVhdmUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdFcmtyYW5rdCcsCiAgICAgICAgJ09uIHNpY2sgbGVhdmUnICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdFcmtyYW5rdCcsCiAgICAgICAgJ1Rhc2snICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdU5HRpZ2tlaXQnLAogICAgICAgICdBdXRob3JpemVkIG92ZXJ0aW1lJyAgICAgICAgICAgICAgICAgICAgICA9PiAnYXV0b3Jpc2llcnRlINxiZXJzdHVuZGVuJywKICAgICAgICAnT24gb3ZlcnRpbWUgbGVhdmUnICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ9xiZXJzdHVuZGVuJywKICAgICAgICAnT3ZlcnRpbWUgbGVhdmUnICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ9xiZXJzdHVuZGVuJywKICAgICAgICAnVG90YWwnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1N1bW1lJywKICAgICAgICAnT3ZlcnZpZXcgb2YgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ9xiZXJzaWNodCAtICcsCiAgICAgICAgJ1RpbWVBY2NvdW50aW5nIG9mJyAgICAgICAgICAgICAgICAgICAgICAgID0+ICdaZWl0ZXJmYXNzdW5nIHZvbScsCiAgICAgICAgJ1N1Y2Nlc3NmdWwgaW5zZXJ0IScgICAgICAgICAgICAgICAgICAgICAgID0+ICdFcmZvbGdyZWljaCBlaW5nZWb8Z3QhJywKICAgICAgICAnTW9yZSBpbnB1dCBmaWVsZHMnICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1dlaXRlcmUgRWluZ2FiZWZlbGRlcicsCiAgICAgICAgJ0RvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyBPYmplY3QnID0+ICdXb2xsZW4gU2llIGRpZXNlbiBFaW50cmFnIHdpcmtsaWNoIGz2c2NoZW4nLAogICAgICAgICdDYW5cJ3QgaW5zZXJ0IFdvcmtpbmcgVW5pdHMhJyAgICAgICAgICAgICA9PiAnS2FubiBkaWUgQXJiZWl0c3N0dW5kZW4gbmljaHQgZWluZvxnZW4hJywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyB0YXNrIScgPT4KICAgICAgICAgICAgJ05pY2h0IHNwZWljaGVyYmFyIC0gVOR0aWdrZWl0IGZlaGx0IScsCiAgICAgICAgJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIG9mIG1pc3NpbmcgcHJvamVjdCEnID0+CiAgICAgICAgICAgICdOaWNodCBzcGVpY2hlcmJhciAtIFByb2pla3RhbmdhYmUgZmVobHQhJywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgdGhlIFBlcmlvZCBpcyBiaWdnZXIgdGhhbiB0aGUgaW50ZXJ2YWwgYmV0d2VlbiBTdGFydHRpbWUgYW5kIEVuZHRpbWUhJwogICAgICAgICAgICA9PiAnTmljaHQgc3BlaWNoZXJiYXIgLSBEYXVlciBpc3QgZ3L232VyIGFscyBkZXIgWmVpdHJhdW0gendpc2NoZW4gQmVnaW5uIHVuZCBFbmRlIScsCiAgICAgICAgJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIFN0YXJ0dGltZSBpcyBvbGRlciB0aGFuIEVuZHRpbWUhJyA9PgogICAgICAgICAgICAnTmljaHQgc3BlaWNoZXJiYXIgLSBCZWdpbm4gbGllZ3QgbmFjaCBFbmRlIScsCiAgICAgICAgJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIG9mIG1pc3NpbmcgcGVyaW9kIScgPT4KICAgICAgICAgICAgJ05pY2h0IHNwZWljaGVyYmFyIC0gRGF1ZXIgKGVyZ2lidCBzaWNoIGF1cyBTdGFydC0gdW5kIEVuZHplaXQpIGlzdCBuaWNodCBhbmdlZ2ViZW4hJywKICAgICAgICAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgUGVyaW9kIGlzIG5vdCBnaXZlbiBnaXZlbiEnID0+CiAgICAgICAgICAgICdOaWNodCBzcGVpY2hlcmJhciAtIERhdWVyIChlcmdpYnQgc2ljaCBhdXMgU3RhcnQtIHVuZCBFbmR6ZWl0KSBpc3QgbmljaHQgYW5nZWdlYmVuIScsCiAgICAgICAgJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIHdoaWxlIHlvdSB3ZXJlIG9uIHNpY2sgbGVhdmU/JyA9PgogICAgICAgICAgICAnU2llIHdhcmVuIGtyYW5rIHVuZCBoYWJlbiBnZWFyYmVpdGV0PyBXaXIgYnJhdWNoZW4gbWVociBzb2xjaGUgTWl0YXJiZWl0ZXIuJywKICAgICAgICAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgd2hpbGUgeW91IHdlcmUgb24gdmFjYXRpb24/JyA9PgogICAgICAgICAgICAnU2llIGhhdHRlbiBVcmxhdWIgdW5kIGhhYmVuIGdlYXJiZWl0ZXQ/IFdpciBicmF1Y2hlbiBtZWhyIHNvbGNoZSBNaXRhcmJlaXRlci4nLAogICAgICAgICdBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCB3aGlsZSB5b3Ugd2VyZSBvbiBvdmVydGltZSBsZWF2ZT8nID0+CiAgICAgICAgICAgICdIYWJlbiBTaWUgd+RocmVuZCBkZXIg3GJlcnN0dW5kZW4gYXVjaCBnZWFyYmVpdGV0PycsCiAgICAgICAgJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIGEgZGF5IGhhcyBvbmx5IDI0IGhvdXJzIScgPT4gJ0VpbiBUYWcgaGF0IG51ciAyNCBTdHVuZGVuIScsCiAgICAgICAgJ0NhblwndCBkZWxldGUgV29ya2luZyBVbml0cyEnICAgICAgPT4gJ0thbm4gQXJiZWl0c3N0dW5kZW4gbmljaHQgbPZzY2hlbiEnLAogICAgICAgICdQbGVhc2UgaW5zZXJ0IHlvdXIgd29ya2luZyBob3VycyEnID0+ICdCaXR0ZSB0cmFnZW4gU2llIElocmUgQXJiZWl0c3plaXRlbiBlaW4hJywKICAgICAgICAnWW91IGhhdmUgdG8gaW5zZXJ0IGEgc3RhcnQgYW5kIGFuIGVuZCB0aW1lIG9yIGEgcGVyaW9kJyA9PgogICAgICAgICAgICAnU2llIG38c3NlbiBCZWdpbm4tIHVuZCBFbmRlemVpdCBvZGVyIGRpZSBEYXVlciBhbmdlYmVuLicsCiAgICAgICAgJ1lvdSBjYW4gb25seSBzZWxlY3Qgb25lIGNoZWNrYm94IGVsZW1lbnQhJyA9PiAnU2llIGv2bm5lbiBudXIgZWluZSBDaGVja2JveCBtYXJraWVyZW4hJywKICAgICAgICAnRWRpdCB0aW1lIGFjY291bnRpbmcgcHJvamVjdCBzZXR0aW5ncycgPT4KICAgICAgICAgICAgJ1plaXRlcmZhc3N1bmc6IEJlYXJiZWl0dW5nIGRlciBQcm9qZWt0a29uZmlndXJhdGlvbicsCiAgICAgICAgJ1Byb2plY3Qgc2V0dGluZ3MnID0+ICdQcm9qZWt0a29uZmlndXJhdGlvbicsCiAgICAgICAgJ0lmIHlvdSBzZWxlY3QgIk1pc2NlbGxhbmVvdXMgKG1pc2MpIiB0aGUgdGFzaywgcGxlYXNlIGV4cGxhaW4gdGhpcyBpbiB0aGUgcmVtYXJrcyBmaWVsZCcgPT4KICAgICAgICAgICAgJ1dlbm4gU2llIGFscyBU5HRpZ2tlaXQgU29uc3RpZ2VzIGF1c3fkaGxlbiwgZ2ViZW4gU2llIGJpdHRlIGVpbmUgQmVzY2hyZWlidW5nIHVtIEZlbGQgQW5tZXJrdW5nIGFuLicsCiAgICAgICAgJ1BsZWFzZSBhZGQgYSByZW1hcmsgd2l0aCBtb3JlIHRoYW4gOCBjaGFyYWN0ZXJzIScgPT4KICAgICAgICAgICAgJ0JpdHRlIGdlYmVuIFNpZSBlaW5lIEFubWVya3VuZyBlaW4gZGllIGzkbmdlciBhbHMgOCBaZWljaGVuIGlzdCEnLAoKIyBGSVhNRSBhY3R1YWxseSB0aGUgZm9sbG93aW5nIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBmaWxlIGRlLnBtLCBob3dldmVyIHRoZXkncmUgbm90IHNvIEkgcHV0J2VtIGhlcmUuLi4KICAgICAgICAnTW9uJyAgICAgID0+ICdNbycsCiAgICAgICAgJ1R1ZScgICAgICA9PiAnRGknLAogICAgICAgICdXZWQnICAgICAgPT4gJ01pJywKICAgICAgICAnVGh1JyAgICAgID0+ICdEbycsCiAgICAgICAgJ0ZyaScgICAgICA9PiAnRnInLAogICAgICAgICdTYXQnICAgICAgPT4gJ1NhJywKICAgICAgICAnU3VuJyAgICAgID0+ICdTbycsCiAgICAgICAgJ0phbnVhcnknICA9PiAnSmFudWFyJywKICAgICAgICAnRmVicnVhcnknID0+ICdGZWJydWFyJywKICAgICAgICAnTWFyY2gnICAgID0+ICdN5HJ6JywKICAgICAgICAnTWF5JyAgICAgID0+ICdNYWknLAogICAgICAgICdKdW5lJyAgICAgPT4gJ0p1bmknLAogICAgICAgICdKdWx5JyAgICAgPT4gJ0p1bGknLAogICAgICAgICdPY3RvYmVyJyAgPT4gJ09rdG9iZXInLAogICAgICAgICdEZWNlbWJlcicgPT4gJ0RlemVtYmVyJywKICAgIH07CiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGltZUFjY291bnRpbmcucG0gLSB0aW1lIGFjY291bnRpbmcgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nLnBtLHYgMS4zNiAyMDA5LzA0LzAzIDExOjQ5OjI5IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaW1lQWNjb3VudGluZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmc7CnVzZSBEYXRlOjpQY2FsYyBxdyhUb2RheSBEYXlzX2luX01vbnRoIERheV9vZl9XZWVrIEFkZF9EZWx0YV9ZTUQpOwp1c2UgVGltZTo6TG9jYWw7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjM2ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgT2JqZWN0cwogICAgZm9yICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBNb2R1bGVSZWcgTG9nT2JqZWN0IFVzZXJPYmplY3QKICAgICAgICBDb25maWdPYmplY3QgVGlja2V0T2JqZWN0IFRpbWVPYmplY3QgR3JvdXBPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKSBpZiAhJFNlbGYtPnskX307CiAgICB9CgogICAgIyBjcmVhdGUgcmVxdWlyZWQgb2JqZWN0cy4uLgogICAgJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmctPm5ldyglUGFyYW0pOwogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUHJlUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICByZXR1cm4gMSBpZiAhJFNlbGYtPntBY2Nlc3NSb307CgogICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpICk7CgogICAgbXkgJVVzZXIgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckN1cnJlbnRQZXJpb2RHZXQoCiAgICAgICAgWWVhciAgPT4gJFllYXIsCiAgICAgICAgTW9udGggPT4gJE1vbnRoLAogICAgICAgIERheSAgID0+ICREYXksCiAgICApOwoKICAgIHJldHVybiBpZiAhJFVzZXJ7ICRTZWxmLT57VXNlcklEfSB9OwoKICAgIG15ICVJbmNvbXBsZXRlV29ya2luZ0RheXMgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjaygpOwoKICAgICMgcmVkaXJlY3QgaWYgaW5jb21wbGV0ZSB3b3JraW5nIGRheSBhcmUgb3V0IG9mIHJhbmdlCiAgICBpZiAoCiAgICAgICAgJEluY29tcGxldGVXb3JraW5nRGF5c3tFbmZvcmNlSW5zZXJ0fQogICAgICAgICYmICRTZWxmLT57QWN0aW9ufSBuZSAnQWdlbnRUaW1lQWNjb3VudGluZycKICAgICAgICAmJiAkU2VsZi0+e0FjdGlvbn0gbmUgJ0FnZW50Q2FsZW5kYXJTbWFsbCcKICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICdBY3Rpb249QWdlbnRUaW1lQWNjb3VudGluZyZTdWJhY3Rpb249RWRpdCcKICAgICAgICApOwogICAgfQogICAgcmV0dXJuOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQE1vbnRoQXJyYXkgPSAoCiAgICAgICAgJycsICAgICAnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICAgICAnQXByaWwnLCAgICdNYXknLAogICAgICAgICdKdW5lJywgJ0p1bHknLCAgICAnQXVndXN0JywgICAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLAogICAgICAgICdEZWNlbWJlcicsCiAgICApOwogICAgbXkgQFdlZWtkYXlBcnJheSA9ICggJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0JywgJ1N1bicsICk7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVsZXRlIHRoZSB0aW1lIGFjY291bnRpbmcgZWxlbWVudHMgb2Ygb25lIGRheQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVsZXRlJyApICkgewogICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgICAgICk7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIGZvciAocXcoU3RhdHVzIFllYXIgTW9udGggRGF5KSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBEYXRlCiAgICAgICAgaWYgKCAhJFBhcmFte1llYXJ9IHx8ICEkUGFyYW17TW9udGh9IHx8ICEkUGFyYW17RGF5fSApIHsKICAgICAgICAgICAgJFBhcmFte1llYXJ9ICA9ICRZZWFyOwogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gJE1vbnRoOwogICAgICAgICAgICAkUGFyYW17RGF5fSAgID0gJERheTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtZZWFyfSAgPSBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtZZWFyfSApOwogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17TW9udGh9ICk7CiAgICAgICAgICAgICRQYXJhbXtEYXl9ICAgPSBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtEYXl9ICk7CiAgICAgICAgfQoKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdEZWxldGUnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nRGVsZXRlJwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGVkaXQgdGhlIHRpbWUgYWNjb3VudGluZyBlbGVtZW50cwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdFZGl0JyApIHsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUm99OwoKICAgICAgICBteSAlRnJvbnRlbmQgICA9ICgpOwogICAgICAgIG15ICVEYXRhICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFjdGlvbkxpc3QgPSAkU2VsZi0+X0FjdGlvbkxpc3QoKTsKICAgICAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgICAgICAgICApOwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBmb3IgKHF3KFN0YXR1cyBZZWFyIE1vbnRoIERheSkpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgRGF0ZQogICAgICAgIGlmICggISRQYXJhbXtZZWFyfSB8fCAhJFBhcmFte01vbnRofSB8fCAhJFBhcmFte0RheX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtZZWFyfSAgPSAkWWVhcjsKICAgICAgICAgICAgJFBhcmFte01vbnRofSA9ICRNb250aDsKICAgICAgICAgICAgJFBhcmFte0RheX0gICA9ICREYXk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17WWVhcn0gID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17WWVhcn0gKTsKICAgICAgICAgICAgJFBhcmFte01vbnRofSA9IHNwcmludGYoICIlMDJkIiwgJFBhcmFte01vbnRofSApOwogICAgICAgICAgICAkUGFyYW17RGF5fSAgID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17RGF5fSApOwogICAgICAgIH0KCiAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckN1cnJlbnRQZXJpb2RHZXQoCiAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmb3IgaW5pdGlhbCB1c2VpbmcsIHRoZSBmaXJzdCBhZ2VudCB3aXRoIHJ3LXJpZ2h0IHdpbGwgYmUgcmVkaXJlY3RlZAogICAgICAgICMgdG8gJ1NldHRpbmcnLiBUaGVuIGhlIGNhbiBkbyB0aGUgaW5pdGlhbCBzZXR0aW5ncwogICAgICAgIGlmICggISRVc2VyeyAkU2VsZi0+e1VzZXJJRH0gfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fRmlyc3RVc2VyUmVkaXJlY3QoKTsKICAgICAgICB9CgogICAgICAgIG15ICVJbmNvbXBsZXRlV29ya2luZ0RheXMgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjaygpOwogICAgICAgIG15ICRNYXhBbGxvd2VkSW5zZXJ0RGF5cwogICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6TWF4QWxsb3dlZEluc2VydERheXMnKSB8fCAnMTAnOwogICAgICAgICggJFBhcmFte1llYXJBbGxvd2VkfSwgJFBhcmFte01vbnRoQWxsb3dlZH0sICRQYXJhbXtEYXlBbGxvd2VkfSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFllYXIsICRNb250aCwgJERheSwgMCwgMCwgLSRNYXhBbGxvd2VkSW5zZXJ0RGF5cyApOwogICAgICAgIGlmICgKICAgICAgICAgICAgdGltZWxvY2FsKCAxLCAwLCAwLCAkUGFyYW17RGF5fSwgJFBhcmFte01vbnRofSAtIDEsICRQYXJhbXtZZWFyfSAtIDE5MDAgKSA8IHRpbWVsb2NhbCgKICAgICAgICAgICAgICAgIDEsIDAsIDAsICRQYXJhbXtEYXlBbGxvd2VkfSwKICAgICAgICAgICAgICAgICRQYXJhbXtNb250aEFsbG93ZWR9IC0gMSwKICAgICAgICAgICAgICAgICRQYXJhbXtZZWFyQWxsb3dlZH0gLSAxOTAwCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISRJbmNvbXBsZXRlV29ya2luZ0RheXN7SW5jb21wbGV0ZX17ICRQYXJhbXtZZWFyfSB9eyAkUGFyYW17TW9udGh9IH0KICAgICAgICAgICAgICAgIHsgJFBhcmFte0RheX0gfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBPUCA9PgogICAgICAgICAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249VmlldyZZZWFyPSRQYXJhbXtZZWFyfSZNb250aD0kUGFyYW17TW9udGh9JkRheT0kUGFyYW17RGF5fSIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc3RvcmUgbGFzdCBzY3JlZW4KICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbicsCiAgICAgICAgICAgIFZhbHVlID0+CiAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249RWRpdCZZZWFyPSRQYXJhbXtZZWFyfSZNb250aD0kUGFyYW17TW9udGh9JkRheT0kUGFyYW17RGF5fSIsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte01vbnRoX3RvX1RleHR9ID0gJE1vbnRoQXJyYXlbICRQYXJhbXtNb250aH0gXTsKCiAgICAgICAgKCAkUGFyYW17WWVhckJhY2t9LCAkUGFyYW17TW9udGhCYWNrfSwgJFBhcmFte0RheUJhY2t9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9LCAwLCAwLCAtMSApOwogICAgICAgICggJFBhcmFte1llYXJOZXh0fSwgJFBhcmFte01vbnRoTmV4dH0sICRQYXJhbXtEYXlOZXh0fSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSwgMCwgMCwgMSApOwoKICAgICAgICBteSAkUmVkdWNlVGltZVJlZiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6UmVkdWNlVGltZScpOwoKICAgICAgICAjIEVkaXQgV29ya2luZyBVbml0cwogICAgICAgIGlmICggJFBhcmFte1N0YXR1c30gKSB7CgogICAgICAgICAgICBJRDoKICAgICAgICAgICAgZm9yIG15ICRJRCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICAgICBmb3IgKHF3KFByb2plY3RJRCBBY3Rpb25JRCBSZW1hcmsgU3RhcnRUaW1lIEVuZFRpbWUgUGVyaW9kKSkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfIC4gJ1snIC4gJElEIC4gJ10nICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJFBhcmFte1Byb2plY3RJRH0gJiYgISRQYXJhbXtBY3Rpb25JRH07CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgYSB2YWxpZCBwZXJpb2QKICAgICAgICAgICAgICAgIG15ICRQZXJpb2QgPSAkUGFyYW17UGVyaW9kfTsKICAgICAgICAgICAgICAgIGlmICggJFBlcmlvZCA9fiBte14gKFxkKykgLCAoXGQrKSB9c214ICkgewogICAgICAgICAgICAgICAgICAgICRQZXJpb2QgPSAkMSAuICIuIiAuICQyOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICVXb3JraW5nVW5pdCA9ICgKICAgICAgICAgICAgICAgICAgICBQcm9qZWN0SUQgPT4gJFBhcmFte1Byb2plY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uSUQgID0+ICRQYXJhbXtBY3Rpb25JRH0sCiAgICAgICAgICAgICAgICAgICAgUmVtYXJrICAgID0+ICRQYXJhbXtSZW1hcmt9LAogICAgICAgICAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICBFbmRUaW1lICAgPT4gJFBhcmFte0VuZFRpbWV9LAogICAgICAgICAgICAgICAgICAgIFBlcmlvZCAgICA9PiAkUGVyaW9kLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEB7ICREYXRhe1dvcmtpbmdVbml0c30gfSwgXCVXb3JraW5nVW5pdDsKCiAgICAgICAgICAgICAgICAjaWYgKCRQYXJhbXtTdGFydFRpbWV9ICYmICRQYXJhbXtFbmRUaW1lfSAmJiAhJFBhcmFte1BlcmlvZH0pIHsKICAgICAgICAgICAgICAgICNvdmVyd3JpdGUgUGVyaW9kIHdoZW4gU3RhcnQgYW5kIEVuZHRpbWUgaXMgZ2l2ZW4uLi4KICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISRQYXJhbXtTdGFydFRpbWV9IHx8ICEkUGFyYW17RW5kVGltZX07CgogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17U3RhcnRUaW1lfSA9fiAvXihcZCspOihcZCspLyApIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJDEgKiA2MCArICQyOwogICAgICAgICAgICAgICAgICAgIGlmICggJFBhcmFte0VuZFRpbWV9ID1+IC9eKFxkKyk6KFxkKykvICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkRW5kVGltZSA9ICQxICogNjAgKyAkMjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVkdWNlVGltZVJlZi0+eyAkQWN0aW9uTGlzdHsgJFBhcmFte0FjdGlvbklEfSB9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkV29ya2luZ1VuaXR7UGVyaW9kfSA9ICggJEVuZFRpbWUgLSAkU3RhcnRUaW1lICkgLyA2MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogJFJlZHVjZVRpbWVSZWYtPnsgJEFjdGlvbkxpc3R7ICRQYXJhbXtBY3Rpb25JRH0gfSB9IC8gMTAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFdvcmtpbmdVbml0e1BlcmlvZH0gPSAoICRFbmRUaW1lIC0gJFN0YXJ0VGltZSApIC8gNjA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDaGVja2JveENoZWNrID0gMDsKICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50IChxdyhMZWF2ZURheSBTaWNrIE92ZXJ0aW1lKSkgewogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkRWxlbWVudCApOwogICAgICAgICAgICAgICAgaWYgKCRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICREYXRheyRFbGVtZW50fSA9IDE7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrYm94Q2hlY2srKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDaGVja2JveENoZWNrID4gMSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZERlc2NyaXB0aW9ufSA9ICdZb3UgY2FuIG9ubHkgc2VsZWN0IG9uZSBjaGVja2JveCBlbGVtZW50ISc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICREYXRhe1llYXJ9ICA9ICRQYXJhbXtZZWFyfTsKICAgICAgICAgICAgJERhdGF7TW9udGh9ID0gJFBhcmFte01vbnRofTsKICAgICAgICAgICAgJERhdGF7RGF5fSAgID0gJFBhcmFte0RheX07CgogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzSW5zZXJ0KCVEYXRhKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NhblwndCBpbnNlcnQgV29ya2luZyBVbml0cyEnCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW17U3VjY2Vzc2Z1bEluc2VydH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBTaG93IFdvcmtpbmcgVW5pdHMKICAgICAgICAjIGdldCBleGlzdGluZyB3b3JraW5nIHVuaXRzCiAgICAgICAgJURhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzR2V0KAogICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpJbnB1dEhvdXJzV2l0aG91dFN0YXJ0RW5kVGltZScpICkgewogICAgICAgICAgICAkUGFyYW17VGV4dFBvc2l0aW9ufSAgPSAnbGVmdCc7CiAgICAgICAgICAgICRQYXJhbXtQZXJpb2RCbG9ja30gICA9ICdVbml0SW5wdXRQZXJpb2QnOwogICAgICAgICAgICAkRnJvbnRlbmR7Q2xhc3NUaW1lfSAgPSAnZm9vdG5vdGUnOwogICAgICAgICAgICAkRnJvbnRlbmR7UGVyaW9kTm90ZX0gPSAnKic7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGb290Tm90ZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtUZXh0UG9zaXRpb259ICA9ICdyaWdodCc7CiAgICAgICAgICAgICRQYXJhbXtQZXJpb2RCbG9ja30gICA9ICdVbml0UGVyaW9kV2l0aG91dElucHV0JzsKICAgICAgICAgICAgJEZyb250ZW5ke0NsYXNzVGltZX0gID0gJ3JlcXVpcmVkJzsKICAgICAgICAgICAgJEZyb250ZW5ke1BlcmlvZE5vdGV9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICBpZiAoIHRpbWUoKSA+IHRpbWVsb2NhbCggMSwgMCwgMCwgJFBhcmFte0RheX0sICRQYXJhbXtNb250aH0gLSAxLCAkUGFyYW17WWVhcn0gLSAxOTAwICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0QmxvY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzaWNrLCBsZWF2ZSBkYXkgYW5kIG92ZXJ0aW1lCiAgICAgICAgJFBhcmFte1NpY2t9ICAgICA9ICREYXRhe1NpY2t9ICAgICA/ICdjaGVja2VkJyA6ICcnOwogICAgICAgICRQYXJhbXtMZWF2ZURheX0gPSAkRGF0YXtMZWF2ZURheX0gPyAnY2hlY2tlZCcgOiAnJzsKICAgICAgICAkUGFyYW17T3ZlcnRpbWV9ID0gJERhdGF7T3ZlcnRpbWV9ID8gJ2NoZWNrZWQnIDogJyc7CgogICAgICAgICRQYXJhbXtUb3RhbH0gPSAkRGF0YXtUb3RhbH07CgogICAgICAgICMgYnVpbGQgYSB3b3JraW5nIHVuaXQgYXJyYXkKICAgICAgICBteSBAVW5pdHMgPSAodW5kZWYpOwogICAgICAgIGlmICggJERhdGF7V29ya2luZ1VuaXRzfSApIHsKICAgICAgICAgICAgcHVzaCBAVW5pdHMsIEB7ICREYXRhe1dvcmtpbmdVbml0c30gfQogICAgICAgIH0KCiAgICAgICAgbXkgJFNob3dBbGxJbnB1dEZpZWxkcyA9IHNjYWxhciBAVW5pdHMgPiA5ID8gMSA6IDA7CgogICAgICAgICMgYnVpbGQgdW5pdHMKICAgICAgICBmb3IgbXkgJElEICggMSAuLiAxNiApIHsKICAgICAgICAgICAgJFBhcmFte0lEfSA9ICRJRDsKICAgICAgICAgICAgbXkgJFVuaXRSZWYgPSAkVW5pdHNbJElEXTsKCiAgICAgICAgICAgICMgZ2V0IG9wdGlvbiBmaWVsZHMKICAgICAgICAgICAgJEZyb250ZW5ke0FjdGlvbk9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVBY3Rpb25MaXN0LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFVuaXRSZWYtPntBY3Rpb25JRH0gfHwgJycsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAiQWN0aW9uSURbJElEXSIsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAoKICAgICAgICAgICAgICAgICNNYXggICAgICAgICA9PiAzNywKICAgICAgICAgICAgICAgIENsYXNzID0+ICdBY3Rpb25TZWxlY3Rpb24nLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJEZyb250ZW5ke1Byb2plY3RPcHRpb259ID0gJFNlbGYtPl9Qcm9qZWN0TGlzdCgKICAgICAgICAgICAgICAgIFdvcmtpbmdVbml0SUQgPT4gJElELAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICA9PiAkVW5pdFJlZi0+e1Byb2plY3RJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUGFyYW17UmVtYXJrfSA9ICRVbml0UmVmLT57UmVtYXJrfSB8fCAnJzsKICAgICAgICAgICAgaWYgKCAkVW5pdFJlZi0+e1Byb2plY3RJRH0gJiYgJFVuaXRSZWYtPntBY3Rpb25JRH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRVbml0UmVmLT57UGVyaW9kfSA9PSAwICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBwZXJpb2QhJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFBlcmlvZCA9ICRVbml0UmVmLT57UGVyaW9kfSB8fCAnJzsKCiAgICAgICAgICAgIGZvciAocXcoU3RhcnRUaW1lIEVuZFRpbWUpKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17JF99ID0gISRVbml0UmVmLT57JF99IHx8ICRVbml0UmVmLT57JF99IGVxICcwMDowMCcgPyAnJyA6ICRVbml0UmVmLT57JF99OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIERlZmluZSBpZiB0aGUgaW5wdXQgZmllbGRzIGFyZSB2aXNpYmxlIG9yIG5vdAogICAgICAgICAgICAkUGFyYW17VmlzaWJpbGl0eX0gPSAkU2hvd0FsbElucHV0RmllbGRzIHx8ICRJRCA8IDkgPyAndmlzaWJsZScgOiAnY29sbGFwc2UnOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17UGVyaW9kQmxvY2t9LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGV4dFBvc2l0aW9uID0+ICRQYXJhbXtUZXh0UG9zaXRpb259LAogICAgICAgICAgICAgICAgICAgIFBlcmlvZCAgICAgICA9PiAkUGVyaW9kLAogICAgICAgICAgICAgICAgICAgIElEICAgICAgICAgICA9PiAkSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBWYWxpZGl0eSBjaGVja3Mgc3RhcnQKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFVuaXRSZWYtPntQcm9qZWN0SUR9CiAgICAgICAgICAgICAgICAmJiAkVW5pdFJlZi0+e0FjdGlvbklEfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte1NpY2t9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgID0gJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIHdoaWxlIHlvdSB3ZXJlIG9uIHNpY2sgbGVhdmU/JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAkVW5pdFJlZi0+e1Byb2plY3RJRH0KICAgICAgICAgICAgICAgICYmICRVbml0UmVmLT57QWN0aW9uSUR9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17TGVhdmVEYXl9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgID0gJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIHdoaWxlIHlvdSB3ZXJlIG9uIHZhY2F0aW9uPyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgJFVuaXRSZWYtPntQcm9qZWN0SUR9CiAgICAgICAgICAgICAgICAmJiAkVW5pdFJlZi0+e0FjdGlvbklEfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte092ZXJ0aW1lfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlEZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICA9ICdBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCB3aGlsZSB5b3Ugd2VyZSBvbiBvdmVydGltZSBsZWF2ZT8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFVuaXRSZWYtPntQcm9qZWN0SUR9ICYmICEkVW5pdFJlZi0+e0FjdGlvbklEfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtaXNzaW5nIHRhc2shJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkVW5pdFJlZi0+e1Byb2plY3RJRH0gJiYgJFVuaXRSZWYtPntBY3Rpb25JRH0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBwcm9qZWN0ISc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFVuaXRSZWYtPntTdGFydFRpbWV9CiAgICAgICAgICAgICAgICAmJiAkVW5pdFJlZi0+e1N0YXJ0VGltZX0gbmUgJzAwOjAwJwogICAgICAgICAgICAgICAgJiYgJFVuaXRSZWYtPntFbmRUaW1lfQogICAgICAgICAgICAgICAgJiYgJFVuaXRSZWYtPntFbmRUaW1lfSBuZSAnMDA6MDAnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICggJFVuaXRSZWYtPntTdGFydFRpbWV9ID1+IC9eKFxkKyk6KFxkKykvICkgewogICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkMSAqIDYwICsgJDI7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVW5pdFJlZi0+e0VuZFRpbWV9ID1+IC9eKFxkKyk6KFxkKykvICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkRW5kVGltZSA9ICQxICogNjAgKyAkMjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVuaXRSZWYtPntQZXJpb2R9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+ICggJEVuZFRpbWUgLSAkU3RhcnRUaW1lICkgLyA2MCArIDAuMDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIHRoZSBQZXJpb2QgaXMgYmlnZ2VyJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJyB0aGFuIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIFN0YXJ0dGltZSBhbmQgRW5kdGltZSEnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEVuZFRpbWUgPiA2MCAqIDI0IHx8ICRTdGFydFRpbWUgPiA2MCAqIDI0ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIGEgZGF5IGhhcyBvbmx5IDI0IGhvdXJzISc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVW5pdFJlcXVpcmVkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgRGVzY3JpcHRpb24gPT4gJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufSB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFJFTUFSSzogZG9uJ3QgZGVsZXRlIGFsbCB3b3JraW5nIHVuaXRzCiAgICAgICAgICAgICAgICAjIFJFTUFSSzogYmV0dGVyIHdvdWxkIGJlIHRvIGRlbGV0ZSBvbmx5IGluY29tcGxldGUgd29ya2luZyB1bml0cwogICAgICAgICAgICAgICAgI2lmICgKICAgICAgICAgICAgICAgICMgICAgISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNEZWxldGUoCiAgICAgICAgICAgICAgICAjICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgICAgICAjICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICAgICAgIyAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgICAgICAgICAjICAgICkKICAgICAgICAgICAgICAgICMgICAgKQogICAgICAgICAgICAgICAgI3sKICAgICAgICAgICAgICAgICMgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAjICAgICAgICBNZXNzYWdlID0+ICdDYW5cJ3QgZGVsZXRlIFdvcmtpbmcgVW5pdHMhJwogICAgICAgICAgICAgICAgIyAgICApOwogICAgICAgICAgICAgICAgI30KICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0gICAgID0gJyc7CiAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb25UcnVlfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUGFyYW17VW5pdFJlYWRPbmx5RGVzY3JpcHRpb259ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0UmVhZG9ubHknLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyBEZXNjcmlwdGlvbiA9PiAkUGFyYW17VW5pdFJlYWRPbmx5RGVzY3JpcHRpb259IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZWFkT25seURlc2NyaXB0aW9ufSA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFZhbGlkaXR5IGNoZWNrcyBlbmQKCiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICAgICA+IHRpbWVsb2NhbCggMSwgMCwgMCwgJFBhcmFte0RheX0sICRQYXJhbXtNb250aH0gLSAxLCAkUGFyYW17WWVhcn0gLSAxOTAwICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFte1RvdGFsfSA9IHNwcmludGYoICIlLjJmIiwgJFBhcmFte1RvdGFsfSApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVG90YWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHZhbGlkaXR5IGNoZWNrcyBzdGFydAogICAgICAgIGlmICggJFBhcmFte1RvdGFsfSAmJiAkUGFyYW17VG90YWx9ID4gMjQgKSB7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbW9yZSB0aGFuIDI0IHdvcmtpbmcgaG91cnMhJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17VG90YWx9ICYmICRQYXJhbXtUb3RhbH0gPiAxNiApIHsKICAgICAgICAgICAgJFBhcmFte1JlYWRPbmx5RGVzY3JpcHRpb259ID0gJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIG1vcmUgdGhhbiAxNiBob3Vycz8nOwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbXtSZXF1aXJlZERlc2NyaXB0aW9ufSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlcXVpcmVkJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBEZXNjcmlwdGlvbiA9PiAkUGFyYW17UmVxdWlyZWREZXNjcmlwdGlvbn0gfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NhblwndCBkZWxldGUgV29ya2luZyBVbml0cyEnCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFte1JlYWRPbmx5RGVzY3JpcHRpb259ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVhZG9ubHknLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IERlc2NyaXB0aW9uID0+ICRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB2YWxpZGl0eSBjaGVja3MgZW5kCgogICAgICAgICRQYXJhbXtEYXRlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFByZWZpeCA9PiAnJywKICAgICAgICAgICAgRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgdGltZWxvY2FsKCAxLCAwLCAwLCAkUGFyYW17RGF5fSwgJFBhcmFte01vbnRofSAtIDEsICRQYXJhbXtZZWFyfSAtIDE5MDAgKSA8IHRpbWVsb2NhbCgKICAgICAgICAgICAgICAgIDEsIDAsIDAsICRQYXJhbXtEYXlBbGxvd2VkfSwKICAgICAgICAgICAgICAgICRQYXJhbXtNb250aEFsbG93ZWR9IC0gMSwKICAgICAgICAgICAgICAgICRQYXJhbXtZZWFyQWxsb3dlZH0gLSAxOTAwCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEluY29tcGxldGVXb3JraW5nRGF5c3tJbmNvbXBsZXRlfXsgJFBhcmFte1llYXJ9IH17ICRQYXJhbXtNb250aH0gfXsgJFBhcmFte0RheX0gfQogICAgICAgICAgICAgICAgJiYgISRQYXJhbXtTdWNjZXNzZnVsSW5zZXJ0fQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlcXVpcmVkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIERhdGUgaXMgb3V0IG9mIGxpbWl0LCBidXQgeW91IGhhdmVuXCd0IGluc2VydCB0aGlzIGRheSB5ZXQsIHNvIHlvdSBnZXQgb25lKCEpIGNoYW5jZSB0byBpbnNlcnQnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIG15ICRZZWFySUQgKCBzb3J0IGtleXMgJXsgJEluY29tcGxldGVXb3JraW5nRGF5c3tJbmNvbXBsZXRlfSB9ICkgewogICAgICAgICAgICBmb3IgbXkgJE1vbnRoSUQgKCBzb3J0IGtleXMgJXsgJEluY29tcGxldGVXb3JraW5nRGF5c3tJbmNvbXBsZXRlfXskWWVhcklEfSB9ICkgewogICAgICAgICAgICAgICAgZm9yIG15ICREYXlJRCAoCiAgICAgICAgICAgICAgICAgICAgc29ydCBrZXlzICV7ICRJbmNvbXBsZXRlV29ya2luZ0RheXN7SW5jb21wbGV0ZX17JFllYXJJRH17JE1vbnRoSUR9IH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFte0luY29tcGxldGV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdJbmNvbXBsZXRlVGV4dCcsICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICRCb2xkU3RhcnQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBteSAkQm9sZEVuZCAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkWWVhcklEICAgICBlcSAkUGFyYW17WWVhcn0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJE1vbnRoSUQgZXEgJFBhcmFte01vbnRofQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkRGF5SUQgICBlcSAkUGFyYW17RGF5fQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkQm9sZFN0YXJ0ID0gJzxiPic7CiAgICAgICAgICAgICAgICAgICAgICAgICRCb2xkRW5kICAgPSAnPC9iPic7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmNvbXBsZXRlV29ya2luZ0RheXMnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgICAgICA9PiAkWWVhcklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9udGggICAgID0+ICRNb250aElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF5ICAgICAgID0+ICREYXlJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbGRTdGFydCA9PiAkQm9sZFN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9sZEVuZCAgID0+ICRCb2xkRW5kLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0luY29tcGxldGV9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFZhY2F0aW9uQ2hlY2sgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5WYWNhdGlvbkNoZWNrKAogICAgICAgICAgICBZZWFyICAgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoICAgID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIERheSAgICAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICBDYWxlbmRhciA9PiAkVXNlckRhdGF7Q2FsZW5kYXJ9LAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtXZWVrZGF5fSA9IERheV9vZl9XZWVrKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9ICk7CiAgICAgICAgaWYgKCAkUGFyYW17V2Vla2RheX0gIT0gNiAmJiAkUGFyYW17V2Vla2RheX0gIT0gNyAmJiAhJFZhY2F0aW9uQ2hlY2sgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdGhlclRpbWVzJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1dlZWtkYXlfdG9fVGV4dH0gPSAkV2Vla2RheUFycmF5WyAkUGFyYW17V2Vla2RheX0gLSAxIF07CgogICAgICAgICMgaW50ZWdyYXRlIHRoZSBoYW5kbGluZyBmb3IgcmVxdWlyZWQgcmVtYXJrcyBpbiByZWxhdGlvbiB0bwogICAgICAgICMgcHJvamVjdHMKICAgICAgICAkUGFyYW17UmVtYXJrUmVnRXhwfSA9ICRTZWxmLT5fUHJvamVjdDJSZW1hcmtSZWdFeHAoKTsKCiAgICAgICAgJFBhcmFte0xpbmtWaXNpYmlsaXR5fSA9ICRTaG93QWxsSW5wdXRGaWVsZHMgPyAnY29sbGFwc2UnIDogJ3Zpc2libGUnOwoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gJ0VkaXQnICk7CiAgICAgICAgaWYgKCAhJEluY29tcGxldGVXb3JraW5nRGF5c3tFbmZvcmNlSW5zZXJ0fSApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGNyZWF0ZSBwcm9qZWN0IGxpbmssIGlmIGFsbG93ZWQKICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJHZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRVc2VyRGF0YXtDcmVhdGVQcm9qZWN0fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0NyZWF0ZVByb2plY3QnLCApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgKICAgICAgICAgICAgISRQYXJhbXtSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAmJiAhJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9uVHJ1ZX0KICAgICAgICAgICAgJiYgJFBhcmFte1N1Y2Nlc3NmdWxJbnNlcnR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoIEluZm8gPT4gJ1N1Y2Nlc3NmdWwgaW5zZXJ0IScsICk7CiAgICAgICAgfQogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdFZGl0JwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHZpZXcgb2xkZXIgZGF5IGluc3RlcnRzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1ZpZXcnICkgewoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKSBpZiAhJFNlbGYtPntBY2Nlc3NSb307CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIGZvciAocXcoRGF5IE1vbnRoIFllYXIgVXNlcklEKSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICAgICAgZm9yIChxdyhEYXkgTW9udGggWWVhcikpIHsKICAgICAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICJWaWV3OiBOZWVkICRfIiApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlmIG5vIFVzZXJJRCBwb3N0ZWQgdXNlIHRoZSBjdXJyZW50IHVzZXIKICAgICAgICAkUGFyYW17VXNlcklEfSB8fD0gJFNlbGYtPntVc2VySUR9OwoKICAgICAgICAjIHNob3cgdGhlIG5hbWluZyBvZiB0aGUgYWdlbnQgd2hpY2ggdGltZSBhY2NvdW50aW5nIGlzIHZpc2l0ZWQKICAgICAgICBpZiAoICRQYXJhbXtVc2VySUR9ICE9ICRTZWxmLT57VXNlcklEfSApIHsKICAgICAgICAgICAgbXkgJVNob3duVXNlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCggVHlwZSA9PiAnTG9uZycsIFZhbGlkID0+IDEgKTsKICAgICAgICAgICAgJFBhcmFte1VzZXJ9ID0gJFNob3duVXNlcnN7ICRQYXJhbXtVc2VySUR9IH07CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17V2Vla2RheX0gICAgICAgICA9IERheV9vZl9XZWVrKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9ICk7CiAgICAgICAgJFBhcmFte1dlZWtkYXlfdG9fVGV4dH0gPSAkV2Vla2RheUFycmF5WyAkUGFyYW17V2Vla2RheX0gLSAxIF07CiAgICAgICAgJFBhcmFte01vbnRoX3RvX1RleHR9ICAgPSAkTW9udGhBcnJheVsgJFBhcmFte01vbnRofSBdOwoKICAgICAgICAjIFZhbHVlcyBmb3IgdGhlIGxpbmsgaWNvbnMgPD4KICAgICAgICAoICRQYXJhbXtZZWFyQmFja30sICRQYXJhbXtNb250aEJhY2t9LCAkUGFyYW17RGF5QmFja30gKQogICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0sIDAsIDAsIC0xICk7CiAgICAgICAgKCAkUGFyYW17WWVhck5leHR9LCAkUGFyYW17TW9udGhOZXh0fSwgJFBhcmFte0RheU5leHR9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9LCAwLCAwLCAxICk7CgogICAgICAgICRQYXJhbXtEYXRlU2VsZWN0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFByZWZpeCA9PiAnJywKICAgICAgICAgICAgRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgICk7CgogICAgICAgICMgU2hvdyBXb3JraW5nIFVuaXRzCiAgICAgICAgIyBnZXQgZXhpc3Rpbmcgd29ya2luZyB1bml0cwogICAgICAgIG15ICVEYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0dldCgKICAgICAgICAgICAgWWVhciAgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIERheSAgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtEYXRlfSA9ICREYXRhe0RhdGV9OwoKICAgICAgICAjIGdldCBwcm9qZWN0IGFuZCBhY3Rpb24gc2V0dGluZ3MKICAgICAgICBteSAlUHJvamVjdCA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NHZXQoKTsKICAgICAgICBteSAlQWN0aW9uICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwoKICAgICAgICAjIGdldCBzaWNrLCBsZWF2ZSBkYXkgYW5kIG92ZXJ0aW1lCiAgICAgICAgJFBhcmFte1NpY2t9ICAgICA9ICREYXRhe1NpY2t9ICAgICA/ICdjaGVja2VkJyA6ICcnOwogICAgICAgICRQYXJhbXtMZWF2ZURheX0gPSAkRGF0YXtMZWF2ZURheX0gPyAnY2hlY2tlZCcgOiAnJzsKICAgICAgICAkUGFyYW17T3ZlcnRpbWV9ID0gJERhdGF7T3ZlcnRpbWV9ID8gJ2NoZWNrZWQnIDogJyc7CgogICAgICAgICMgb25seSBzaG93IHRoZSB1bml0IGJsb2NrIGlmIHRoZXJlIGlzIHNvbWUgZGF0YQogICAgICAgIG15ICRVbml0c1JlZiA9ICREYXRhe1dvcmtpbmdVbml0c307CiAgICAgICAgaWYgKCAkVW5pdHNSZWYtPlswXSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnVW5pdEJsb2NrJywgKTsKCiAgICAgICAgICAgIGZvciBteSAkVW5pdFJlZiAoIEB7JFVuaXRzUmVmfSApIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0ICAgPT4gJFByb2plY3R7UHJvamVjdH17ICRVbml0UmVmLT57UHJvamVjdElEfSB9LAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgPT4gJEFjdGlvbnsgJFVuaXRSZWYtPntBY3Rpb25JRH0gfXtBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBSZW1hcmsgICAgPT4gJFVuaXRSZWYtPntSZW1hcmt9LAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydFRpbWUgPT4gJFVuaXRSZWYtPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBFbmRUaW1lICAgPT4gJFVuaXRSZWYtPntFbmRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgUGVyaW9kICAgID0+ICRVbml0UmVmLT57UGVyaW9kfSwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RvdGFsJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBUb3RhbCA9PiBzcHJpbnRmKCAiJS4yZiIsICREYXRhe1RvdGFsfSApIH0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJFBhcmFte1NpY2t9IHx8ICRQYXJhbXtMZWF2ZURheX0gfHwgJFBhcmFte092ZXJ0aW1lfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ090aGVyVGltZXMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU2ljayAgICAgPT4gJFBhcmFte1NpY2t9LAogICAgICAgICAgICAgICAgICAgIExlYXZlRGF5ID0+ICRQYXJhbXtMZWF2ZURheX0sCiAgICAgICAgICAgICAgICAgICAgT3ZlcnRpbWUgPT4gJFBhcmFte092ZXJ0aW1lfSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckdldCgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRWYWNhdGlvbiA9ICRTZWxmLT57VGltZU9iamVjdH0tPlZhY2F0aW9uQ2hlY2soCiAgICAgICAgICAgIFllYXIgICAgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggICAgPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgRGF5ICAgICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgICAgIENhbGVuZGFyID0+ICRVc2VyRGF0YXtDYWxlbmRhcn0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRWYWNhdGlvbikgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVmFjYXRpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFZhY2F0aW9uID0+ICRWYWNhdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcmVzZW50YXRpb24KICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdWaWV3JyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ1ZpZXcnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVsZXRlIG9iamVjdCBmcm9tIGRhdGFiYXNlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZScgKSB7CiAgICAgICAgZm9yIChxdyhEYXkgTW9udGggWWVhcikpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApIGlmICEkU2VsZi0+e0FjY2Vzc1JvfTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0RlbGV0ZSgKICAgICAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4KICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1FZGl0JlllYXI9JFBhcmFte1llYXJ9Jk1vbnRoPSRQYXJhbXtNb250aH0mRGF5PSRQYXJhbXtEYXl9IgogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcgYWJvdXQgdGhlIHVzZXJzIHRpbWUgYWNjb3VudGluZwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdPdmVydmlldycgKSB7CiAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJEN1cnJlbnREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgICAgICk7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApIGlmICEkU2VsZi0+e0FjY2Vzc1JvfTsKCiAgICAgICAgZm9yIChxdyhTdGF0dXMgRGF5IE1vbnRoIFllYXIgVXNlcklEIFByb2plY3RTdGF0dXNTaG93KSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U3ViYWN0aW9ufSA9ICdFZGl0JzsKCiAgICAgICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17VXNlcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0gJiYgISRTZWxmLT57QWNjZXNzUnd9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte1N1YmFjdGlvbn0gPSAnVmlldyc7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRQYXJhbXtVc2VySUR9ICE9ICRTZWxmLT57VXNlcklEfSApIHsKICAgICAgICAgICAgbXkgJVNob3duVXNlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCggVHlwZSA9PiAnTG9uZycsIFZhbGlkID0+IDEgKTsKICAgICAgICAgICAgJFBhcmFte1VzZXJ9ID0gJFNob3duVXNlcnN7ICRQYXJhbXtVc2VySUR9IH07CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIERhdGUKICAgICAgICBpZiAoICEkUGFyYW17WWVhcn0gfHwgISRQYXJhbXtNb250aH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtZZWFyfSAgPSAkWWVhcjsKICAgICAgICAgICAgJFBhcmFte01vbnRofSA9ICRNb250aDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtNb250aH0gKTsKICAgICAgICB9CgogICAgICAgICMgc3RvcmUgbGFzdCBzY3JlZW4KICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbicsCiAgICAgICAgICAgIFZhbHVlID0+CiAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249T3ZlcnZpZXcmWWVhcj0kUGFyYW17WWVhcn0mTW9udGg9JFBhcmFte01vbnRofSIsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte01vbnRoX3RvX1RleHR9ID0gJE1vbnRoQXJyYXlbICRQYXJhbXtNb250aH0gXTsKCiAgICAgICAgKCAkUGFyYW17WWVhckJhY2t9LCAkUGFyYW17TW9udGhCYWNrfSwgJFBhcmFte0RheUJhY2t9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sIDEsIDAsIC0xLCAwICk7CiAgICAgICAgKCAkUGFyYW17WWVhck5leHR9LCAkUGFyYW17TW9udGhOZXh0fSwgJFBhcmFte0RheU5leHR9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sIDEsIDAsIDEsIDAgKTsKCiAgICAgICAgIyBPdmVydmlldyBwZXIgZGF5CiAgICAgICAgbXkgJERheXNPZk1vbnRoID0gRGF5c19pbl9Nb250aCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9ICk7CgogICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICREYXkgKCAxIC4uICREYXlzT2ZNb250aCApIHsKICAgICAgICAgICAgJFBhcmFte0RheX0gPSBzcHJpbnRmKCAiJTAyZCIsICREYXkgKTsKICAgICAgICAgICAgJFBhcmFte1dlZWtkYXl9ID0gRGF5X29mX1dlZWsoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJERheSApIC0gMTsKICAgICAgICAgICAgbXkgJFZhY2F0aW9uQ2hlY2sgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5WYWNhdGlvbkNoZWNrKAogICAgICAgICAgICAgICAgWWVhciAgICAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICAgICAgTW9udGggICAgPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgICAgIERheSAgICAgID0+ICREYXksCiAgICAgICAgICAgICAgICBDYWxlbmRhciA9PiAkVXNlckRhdGF7Q2FsZW5kYXJ9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkUGFyYW17WWVhcn0gZXEgJFllYXIgJiYgJFBhcmFte01vbnRofSBlcSAkTW9udGggJiYgJEN1cnJlbnREYXkgZXEgJERheSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtTdHlsZX0gPSAnYmdjb2xvcj0ib3JhbmdlIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRWYWNhdGlvbkNoZWNrKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17U3R5bGV9ICAgPSAnYmdjb2xvcj0iI0VCQ0NDQyInOwogICAgICAgICAgICAgICAgJFBhcmFte0NvbW1lbnR9ID0gJFZhY2F0aW9uQ2hlY2s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkUGFyYW17V2Vla2RheX0gPT0gNiB8fCAkUGFyYW17V2Vla2RheX0gPT0gNSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtTdHlsZX0gPSAnYmdjb2xvcj0iI0ZGRTBFMCInOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte1N0eWxlfSA9ICdiZ2NvbG9yPSIjRTVGMEZGIic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICVEYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0dldCgKICAgICAgICAgICAgICAgIFllYXIgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgICAgICBNb250aCAgPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgICAgIERheSAgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQYXJhbXtDb21tZW50fSA9ICREYXRhe1NpY2t9CiAgICAgICAgICAgICAgICA/ICdTaWNrIGxlYXZlJwogICAgICAgICAgICAgICAgOiAkRGF0YXtMZWF2ZURheX0gPyAnT24gdmFjYXRpb24nCiAgICAgICAgICAgICAgICA6ICREYXRhe092ZXJ0aW1lfSA/ICdPbiBvdmVydGltZSBsZWF2ZScKICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgJyc7CgogICAgICAgICAgICAkUGFyYW17V29ya2luZ0hvdXJzfSA9ICREYXRhe1RvdGFsfSA/IHNwcmludGYoICIlLjJmIiwgJERhdGF7VG90YWx9ICkgOiAnJzsKCiAgICAgICAgICAgICRQYXJhbXtXZWVrZGF5X3RvX1RleHR9ID0gJFdlZWtkYXlBcnJheVsgJFBhcmFte1dlZWtkYXl9IF07CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte0NvbW1lbnR9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICBteSAlVXNlclJlcG9ydCA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyUmVwb3J0aW5nKAogICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgKTsKICAgICAgICBmb3IgKAogICAgICAgICAgICBxdyhUYXJnZXRTdGF0ZSBUYXJnZXRTdGF0ZVRvdGFsIFdvcmtpbmdIb3Vyc1RvdGFsIFdvcmtpbmdIb3VycwogICAgICAgICAgICBPdmVydGltZSBPdmVydGltZVRvdGFsIE92ZXJ0aW1lVW50aWwgTGVhdmVEYXkgTGVhdmVEYXlUb3RhbAogICAgICAgICAgICBMZWF2ZURheVJlbWFpbmluZyBTaWNrIFNpY2tUb3RhbCBTaWNrUmVtYWluaW5nKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkVXNlclJlcG9ydHsgJFBhcmFte1VzZXJJRH0gfXskX30gfHw9IDA7CiAgICAgICAgICAgICRQYXJhbXskX30gPSBzcHJpbnRmKCAiJS4yZiIsICRVc2VyUmVwb3J0eyAkUGFyYW17VXNlcklEfSB9eyRffSApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkVXNlckRhdGF7U2hvd092ZXJ0aW1lfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ0aW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgT3ZlcnZpZXcgcGVyIHByb2plY3QgYW5kIGFjdGlvbgogICAgICAgIG15ICVQcm9qZWN0RGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0QWN0aW9uUmVwb3J0aW5nKAogICAgICAgICAgICBZZWFyICAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCAgPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB0aGUgcmVwb3J0IHNvcnQgYnkgcHJvamVjdHMKICAgICAgICBpZiAoICEkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IHx8ICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ3ZhbGlkJyApIHsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSA9ICdhbGwnOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ2FsbCcgKSB7CiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gPSAndmFsaWQnOwogICAgICAgIH0KCiAgICAgICAgUFJPSkVDVElEOgogICAgICAgIGZvciBteSAkUHJvamVjdElEICgKICAgICAgICAgICAgc29ydCB7ICRQcm9qZWN0RGF0YXskYX17TmFtZX0gY21wICRQcm9qZWN0RGF0YXskYn17TmFtZX0gfQogICAgICAgICAgICBrZXlzICVQcm9qZWN0RGF0YQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkUHJvamVjdFJlZiA9ICRQcm9qZWN0RGF0YXskUHJvamVjdElEfTsKICAgICAgICAgICAgbXkgJEFjdGlvbnNSZWYgPSAkUHJvamVjdFJlZi0+e0FjdGlvbnN9OwoKICAgICAgICAgICAgJFBhcmFte1Byb2plY3R9ID0gJyc7CiAgICAgICAgICAgICRQYXJhbXtDbGFzc30gICA9ICdjb250ZW50dmFsdWUnOwogICAgICAgICAgICAkUGFyYW17U3RhdHVzfSAgPSAkUHJvamVjdFJlZi0+e1N0YXR1c30gPyAnJyA6ICdwYXNzaXYnOwoKICAgICAgICAgICAgbXkgJFRvdGFsICAgICAgPSAwOwogICAgICAgICAgICBteSAkVG90YWxUb3RhbCA9IDA7CgogICAgICAgICAgICBuZXh0IFBST0pFQ1RJRCBpZiAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IGVxICdhbGwnICYmICRQYXJhbXtTdGF0dXN9OwoKICAgICAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoCiAgICAgICAgICAgICAgICBzb3J0IHsgJEFjdGlvbnNSZWYtPnskYX17TmFtZX0gY21wICRBY3Rpb25zUmVmLT57JGJ9e05hbWV9IH0KICAgICAgICAgICAgICAgIGtleXMgJXskQWN0aW9uc1JlZn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJEFjdGlvblJlZiA9ICRBY3Rpb25zUmVmLT57JEFjdGlvbklEfTsKCiAgICAgICAgICAgICAgICAkUGFyYW17QWN0aW9ufSAgICAgPSAkQWN0aW9uUmVmLT57TmFtZX07CiAgICAgICAgICAgICAgICAkUGFyYW17SG91cnN9ICAgICAgPSBzcHJpbnRmKCAiJS4yZiIsICRBY3Rpb25SZWYtPntQZXJNb250aH0gfHwgMCApOwogICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzVG90YWx9ID0gc3ByaW50ZiggIiUuMmYiLCAkQWN0aW9uUmVmLT57VG90YWx9IHx8IDAgKTsKICAgICAgICAgICAgICAgICRUb3RhbCAgICAgICs9ICRQYXJhbXtIb3Vyc307CiAgICAgICAgICAgICAgICAkVG90YWxUb3RhbCArPSAkUGFyYW17SG91cnNUb3RhbH07CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17UHJvamVjdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2plY3R9ID0gJFByb2plY3RSZWYtPntOYW1lfTsKICAgICAgICAgICAgICAgICAgICBteSAkUHJvamVjdERlc2NyaXB0aW9uID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkUHJvamVjdFJlZi0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgTmV3TGluZSAgICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvamVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93U3BhbiAgICAgICAgICAgID0+ICggMSArIHNjYWxhciBrZXlzICV7JEFjdGlvbnNSZWZ9ICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgICAgICAgICAgICAgPT4gJFBhcmFte1N0YXR1c30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0RGVzY3JpcHRpb24gPT4gJFByb2plY3REZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRVc2VyRGF0YXtDcmVhdGVQcm9qZWN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgcGVyc29ucyBob3cgYXJlIGFsbG93ZWQgdG8gc2VlIHRoZSBjcmVhdGUgb2JqZWN0IGxpbmsgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWxsb3dlZCB0byBzZWUgdGhlIHByb2plY3QgcmVwb3J0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0TGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0ICAgPT4gJFByb2plY3RSZWYtPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0SUQgPT4gJFByb2plY3RJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvamVjdE5vTGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgUHJvamVjdCA9PiAkUHJvamVjdFJlZi0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtDbGFzc30gICAgICA9ICdjb250ZW50a2V5JzsKICAgICAgICAgICAgJFBhcmFte0FjdGlvbn0gICAgID0gJ1RvdGFsJzsKICAgICAgICAgICAgJFBhcmFte0hvdXJzfSAgICAgID0gc3ByaW50ZiggIiUuMmYiLCAkVG90YWwgKTsKICAgICAgICAgICAgJFBhcmFte0hvdXJzVG90YWx9ID0gc3ByaW50ZiggIiUuMmYiLCAkVG90YWxUb3RhbCApOwogICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gICAgICArPSAkVG90YWw7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ICs9ICRUb3RhbFRvdGFsOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtDbGFzc30gPSAnJzsKICAgICAgICB9CiAgICAgICAgaWYgKCBkZWZpbmVkKCAkUGFyYW17VG90YWxIb3Vyc30gKSApIHsKICAgICAgICAgICAgJFBhcmFte1RvdGFsSG91cnN9ID0gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17VG90YWxIb3Vyc30gKTsKICAgICAgICB9CiAgICAgICAgaWYgKCBkZWZpbmVkKCAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSApICkgewogICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSA9IHNwcmludGYoICIlLjJmIiwgJFBhcmFte1RvdGFsSG91cnNUb3RhbH0gKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnT3ZlcnZpZXcnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nT3ZlcnZpZXcnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2V0dGluZ3MgZm9yIGhhbmRsaW5nIHRpbWUgYWNjb3VudGluZwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZXR0aW5nJyApIHsKICAgICAgICBteSAlRGF0YSA9ICgpOwoKICAgICAgICBmb3IgKHF3KEFjdGlvbkFjdGlvbiBBY3Rpb25Vc2VyIE5ld0FjdGlvbiBOZXdVc2VyKSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUnd9OwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdTZXR0aW5nJywgKTsKCiAgICAgICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuJywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1TZXR0aW5nIiwKICAgICAgICApOwoKICAgICAgICBpZiAoICRQYXJhbXtBY3Rpb25BY3Rpb259IHx8ICRQYXJhbXtOZXdBY3Rpb259ICkgewogICAgICAgICAgICBteSAlQWN0aW9uICAgICAgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NHZXQoKTsKICAgICAgICAgICAgbXkgJEFjdGlvbkVtcHR5ID0gMDsKICAgICAgICAgICAgbXkgJUFjdGlvbkNoZWNrID0gKCk7CiAgICAgICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBrZXlzICVBY3Rpb24gKSB7CiAgICAgICAgICAgICAgICBmb3IgKHF3KEFjdGlvbiBBY3Rpb25TdGF0dXMpKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JEFjdGlvbklEfXskX30KICAgICAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfIC4gJ1snIC4gJEFjdGlvbklEIC4gJ10nICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkRGF0YXskQWN0aW9uSUR9e0FjdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEFjdGlvbkVtcHR5ID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJERhdGF7JEFjdGlvbklEfXtBY3Rpb259CiAgICAgICAgICAgICAgICAgICAgJiYgJEFjdGlvbkNoZWNreyAkRGF0YXskQWN0aW9uSUR9e0FjdGlvbn0gfQogICAgICAgICAgICAgICAgICAgICYmICRBY3Rpb25DaGVja3sgJERhdGF7JEFjdGlvbklEfXtBY3Rpb259IH0gPT0gMQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnVGhlIGFjdGlvbm5hbWluZyBtdXN0IGJlIHVuaXF1ZSEnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkQWN0aW9uQ2hlY2t7ICREYXRheyRBY3Rpb25JRH17QWN0aW9ufSB9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NVcGRhdGUoJURhdGEpICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IHVwZGF0ZSBhY3Rpb24gZGF0YSEnCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFBhcmFte05ld0FjdGlvbn0gJiYgISRBY3Rpb25FbXB0eSApIHsKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0luc2VydCgpICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdDYW5cJ3QgaW5zZXJ0IGFjdGlvbiBkYXRhIScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAlVXNlciA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyU2V0dGluZ3NHZXQoKTsKCiAgICAgICAgICAgIG15ICVMYXN0UGVyaW9kID0gKCk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlVXNlciApIHsKICAgICAgICAgICAgICAgICRMYXN0UGVyaW9keyRVc2VySUR9ID0gMDsKICAgICAgICAgICAgICAgIGZvciBteSAkUGVyaW9kICgga2V5cyAleyAkVXNlcnskVXNlcklEfSB9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJExhc3RQZXJpb2R7JFVzZXJJRH0gPCAkUGVyaW9kICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTGFzdFBlcmlvZHskVXNlcklEfSA9ICRQZXJpb2Q7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJOZXdVc2VyU2V0dGluZ1ske1VzZXJJRH1dIiApICkgewogICAgICAgICAgICAgICAgICAgIG15ICVJbnNlcnREYXRhID0gKCk7CiAgICAgICAgICAgICAgICAgICAgJEluc2VydERhdGF7VXNlcklEfSA9ICRVc2VySUQ7CiAgICAgICAgICAgICAgICAgICAgJEluc2VydERhdGF7UGVyaW9kfSA9ICRMYXN0UGVyaW9keyRVc2VySUR9ICsgMTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17QWN0aW9uVXNlcn0gID0gJ3RydWUnOwogICAgICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyU2V0dGluZ3NJbnNlcnQoJUluc2VydERhdGEpICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NhblwndCBpbnNlcnQgdXNlciBkYXRhIScKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFBhcmFte0FjdGlvblVzZXJ9IHx8ICRQYXJhbXtOZXdVc2VyfSApIHsKCiAgICAgICAgICAgICAgICBteSAlVXNlckJhc2ljcyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyTGlzdCgpOwoKICAgICAgICAgICAgICAgIFVTRVJJRDoKICAgICAgICAgICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlVXNlciApIHsKCiAgICAgICAgICAgICAgICAgICAgZm9yIChxdyggU2hvd092ZXJ0aW1lIENyZWF0ZVByb2plY3QgQ2FsZW5kYXIgKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXskX30KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyAuICdbJyAuICRVc2VySUQgLiAnXScgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRCcmVhayA9ICcnOwogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFVzZXJCYXNpY3N7JFVzZXJJRH17RGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc2NyaXB0aW9uWycgLiAkVXNlcklEIC4gJ10nICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEJyZWFrID0gIlxuIjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICREZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkRlc2NyaXB0aW9uWyR7VXNlcklEfV0iICk7CgogICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9e0Rlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICA9ICRVc2VyQmFzaWNzeyRVc2VySUR9e0Rlc2NyaXB0aW9ufSAuICRCcmVhayAuICREZXNjcmlwdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17VXNlcklEfSA9ICRVc2VySUQ7CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGVyaW9kICgga2V5cyAleyAkVXNlcnskVXNlcklEfSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgZm9sbG93aW5nIGlzIGJlY2F1c2Ugb2YgZGVhY3RpdmF0ZSB1c2VyCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbSA9PiAnRGF0ZVN0YXJ0WycgLiAkVXNlcklEIC4gJ11bJyAuICRQZXJpb2QgLiAnXScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICREYXRheyRVc2VySUR9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBVU0VSSUQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocXcoV2Vla2x5SG91cnMgTGVhdmVEYXlzIFVzZXJTdGF0dXMgRGF0ZVN0YXJ0IERhdGVFbmQgT3ZlcnRpbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXskUGVyaW9kfXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW0gPT4gJF8gLiAnWycgLiAkVXNlcklEIC4gJ11bJyAuICRQZXJpb2QgLiAnXScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17JFBlcmlvZH17VXNlcklEfSA9ICRVc2VySUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXN0UGVyaW9keyRVc2VySUR9ID0gJFBlcmlvZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJTZXR0aW5nc1VwZGF0ZSglRGF0YSkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NhblwndCB1cGRhdGUgdXNlciBkYXRhIScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte05ld1VzZXJ9ICYmICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05ld1VzZXJJRCcgKSApIHsKCiAgICAgICAgICAgICAgICAgICAgJURhdGEgPSAoKTsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtVc2VySUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV3VXNlcklEJyApOwogICAgICAgICAgICAgICAgICAgICREYXRhe1BlcmlvZH0gPSAnMSc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJTZXR0aW5nc0luc2VydCglRGF0YSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IGluc2VydCB1c2VyIGRhdGEhJwogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBteSAlR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTGlzdCggVmFsaWQgPT4gMSApOwogICAgICAgICAgICAgICAgICAgIG15ICVHcm91cERhdGEgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJERhdGF7VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKCBrZXlzICVHcm91cHMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdyb3Vwc3skX30gZXEgJ3RpbWVfYWNjb3VudGluZycgJiYgISRHcm91cERhdGF7JF99ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJERhdGF7VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm8gICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVfaW50byA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGUgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydyAgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIFNob3cgVGltZUFjY291bnRpbmcgUHJlZmVyZW5jZXMKICAgICAgICBteSAlU3RhdHVzTGlzdCA9ICgKICAgICAgICAgICAgMSA9PiAndmFsaWQnLAogICAgICAgICAgICAwID0+ICdpbnZhbGlkJywKICAgICAgICApOwoKICAgICAgICAjIFNob3cgYWN0aW9uIGRhdGEKICAgICAgICBteSAlQWN0aW9uICAgICAgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+QWN0aW9uU2V0dGluZ3NHZXQoKTsKICAgICAgICBteSAkQWN0aW9uRW1wdHkgPSAwOwoKICAgICAgICBmb3IgbXkgJEFjdGlvbklEICggc29ydCB7ICRBY3Rpb257JGF9e0FjdGlvbn0gY21wICRBY3Rpb257JGJ9e0FjdGlvbn0gfSBrZXlzICVBY3Rpb24gKSB7CiAgICAgICAgICAgICRQYXJhbXtBY3Rpb259ICAgPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICAgICAgJFBhcmFte0FjdGlvbklEfSA9ICRBY3Rpb25JRDsKCiAgICAgICAgICAgIG15ICRTdGF0dXNPcHRpb24gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVN0YXR1c0xpc3QsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb25TdGF0dXN9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAiQWN0aW9uU3RhdHVzWyRQYXJhbXtBY3Rpb25JRH1dIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIFN0YXR1c09wdGlvbiA9PiAkU3RhdHVzT3B0aW9uLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgU2hvdyB1c2VyIGRhdGEKICAgICAgICBteSAlVXNlciAgICAgICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyU2V0dGluZ3NHZXQoKTsKICAgICAgICBteSAlVXNlckJhc2ljcyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyTGlzdCgpOwogICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoIFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAxICk7CgogICAgICAgICMgZmlsbCB1cCB0aGUgY2FsZW5kYXIgbGlzdAogICAgICAgIG15ICRDYWxlbmRhckxpc3RSZWYgPSB7IDAgPT4gJ0RlZmF1bHQnIH07CiAgICAgICAgZm9yIG15ICRDYWxlbmRhciAoIDEgLi4gOSApIHsKICAgICAgICAgICAgbXkgJENhbGVuZGFyTmFtZSA9ICJUaW1lWm9uZTo6Q2FsZW5kYXIke0NhbGVuZGFyfU5hbWUiOwogICAgICAgICAgICAkQ2FsZW5kYXJMaXN0UmVmLT57JENhbGVuZGFyfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCRDYWxlbmRhck5hbWUpOwogICAgICAgIH0KCiAgICAgICAgVVNFUklEOgogICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCB7ICRTaG93blVzZXJzeyRhfSBjbXAgJFNob3duVXNlcnN7JGJ9IH0ga2V5cyAlU2hvd25Vc2VycyApIHsKICAgICAgICAgICAgbmV4dCBVU0VSSUQgaWYgISRVc2VyeyRVc2VySUR9OwoKICAgICAgICAgICAgJFBhcmFte1VzZXJ9ICAgPSAkU2hvd25Vc2Vyc3skVXNlcklEfTsKICAgICAgICAgICAgJFBhcmFte1VzZXJJRH0gPSAkVXNlcklEOwogICAgICAgICAgICBteSAkVXNlclJlZiAgICAgICA9ICRVc2VyeyRVc2VySUR9OwogICAgICAgICAgICBteSAkVXNlckJhc2ljc1JlZiA9ICRVc2VyQmFzaWNzeyRVc2VySUR9OwoKICAgICAgICAgICAgbXkgJERlc2NyaXB0aW9uID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFVzZXJCYXNpY3NSZWYtPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICAgICAgTmV3TGluZSAgICAgICAgPT4gNTAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkRGVzY3JpcHRpb24gPSAkRGVzY3JpcHRpb24gPyAkRGVzY3JpcHRpb24gLiAnPGJyPicgOiAnJzsKCiAgICAgICAgICAgIG15ICRDYWxlbmRhck9wdGlvbiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkQ2FsZW5kYXJMaXN0UmVmLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gIkNhbGVuZGFyWyRVc2VySURdIiwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkVXNlckJhc2ljc1JlZi0+e0NhbGVuZGFyfSB8fCAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgID0+ICREZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICBTaG93T3ZlcnRpbWUgICA9PiAkVXNlckJhc2ljc1JlZi0+e1Nob3dPdmVydGltZX0gPyAnY2hlY2tlZCcgOiAnJywKICAgICAgICAgICAgICAgICAgICBDcmVhdGVQcm9qZWN0ICA9PiAkVXNlckJhc2ljc1JlZi0+e0NyZWF0ZVByb2plY3R9ID8gJ2NoZWNrZWQnIDogJycsCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJPcHRpb24gPT4gJENhbGVuZGFyT3B0aW9uLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGRlbGV0ZSAkU2hvd25Vc2Vyc3skVXNlcklEfTsKCiAgICAgICAgICAgIGZvciBteSAkUGVyaW9kICggc29ydCBrZXlzICV7JFVzZXJSZWZ9ICkgewoKICAgICAgICAgICAgICAgIG15ICRTdGF0dXNPcHRpb24gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTdGF0dXNMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFVzZXJSZWYtPnskUGVyaW9kfXtVc2VyU3RhdHVzfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICJVc2VyU3RhdHVzWyRVc2VySURdWyRQZXJpb2RdIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQZXJpb2QnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgV2Vla2x5SG91cnMgID0+ICRVc2VyUmVmLT57JFBlcmlvZH17V2Vla2x5SG91cnN9LAogICAgICAgICAgICAgICAgICAgICAgICBMZWF2ZURheXMgICAgPT4gJFVzZXJSZWYtPnskUGVyaW9kfXtMZWF2ZURheXN9LAogICAgICAgICAgICAgICAgICAgICAgICBPdmVydGltZSAgICAgPT4gJFVzZXJSZWYtPnskUGVyaW9kfXtPdmVydGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVTdGFydCAgICA9PiAkVXNlclJlZi0+eyRQZXJpb2R9e0RhdGVTdGFydH0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVFbmQgICAgICA9PiAkVXNlclJlZi0+eyRQZXJpb2R9e0RhdGVFbmR9LAogICAgICAgICAgICAgICAgICAgICAgICBQZXJpb2QgICAgICAgPT4gJFBlcmlvZCwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzT3B0aW9uID0+ICRTdGF0dXNPcHRpb24sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICglU2hvd25Vc2VycykgewogICAgICAgICAgICAkU2hvd25Vc2Vyc3snJ30gPSAnJzsKICAgICAgICAgICAgbXkgJE5ld1VzZXJPcHRpb24gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJycsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdOZXdVc2VyT3B0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBOZXdVc2VyT3B0aW9uID0+ICROZXdVc2VyT3B0aW9uLCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdTZXR0aW5nJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ1NldHRpbmcnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2V0dGluZ3MgZm9yIGhhbmRsaW5nIHRpbWUgYWNjb3VudGluZwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdQcm9qZWN0U2V0dGluZycgKSB7CiAgICAgICAgbXkgJVByb2plY3QgPSAoKTsKICAgICAgICBteSAlRGF0YSAgICA9ICgpOwoKICAgICAgICBmb3IgKHF3KEFjdGlvblByb2plY3QgTmV3UHJvamVjdCkpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICB9CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApIGlmICEkU2VsZi0+e0FjY2Vzc1JvfTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnUHJvamVjdFNldHRpbmcnLCApOwoKICAgICAgICAjIEVkaXQgVGltZUFjY291bnRpbmcgUHJlZmVyZW5jZXMKICAgICAgICBpZiAoICRQYXJhbXtBY3Rpb25Qcm9qZWN0fSB8fCAkUGFyYW17TmV3UHJvamVjdH0gKSB7CiAgICAgICAgICAgICVQcm9qZWN0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgICAgICAgICBteSAkUHJvamVjdEVtcHR5ID0gMDsKICAgICAgICAgICAgbXkgJVByb2plY3RDaGVjayA9ICgpOwogICAgICAgICAgICBmb3IgbXkgJFByb2plY3RJRCAoIGtleXMgJXsgJFByb2plY3R7UHJvamVjdH0gfSApIHsKICAgICAgICAgICAgICAgIGZvciAocXcoUHJvamVjdCBQcm9qZWN0U3RhdHVzIFByb2plY3REZXNjcmlwdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskUHJvamVjdElEfXskX30KICAgICAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfIC4gJ1snIC4gJFByb2plY3RJRCAuICddJyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAhJERhdGF7JFByb2plY3RJRH17UHJvamVjdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFByb2plY3RFbXB0eSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFByb2plY3RJRH17UHJvamVjdH0KICAgICAgICAgICAgICAgICAgICAmJiAkUHJvamVjdENoZWNreyAkRGF0YXskUHJvamVjdElEfXtQcm9qZWN0fSB9CiAgICAgICAgICAgICAgICAgICAgJiYgJFByb2plY3RDaGVja3sgJERhdGF7JFByb2plY3RJRH17UHJvamVjdH0gfSA9PSAxCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdUaGUgcHJvamVjdG5hbWluZyBtdXN0IGJlIHVuaXF1ZSEnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICggJERhdGF7JFByb2plY3RJRH17UHJvamVjdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQcm9qZWN0Q2hlY2t7ICREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzVXBkYXRlKCVEYXRhKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NhblwndCB1cGRhdGUgcHJvamVjdCBkYXRhIScKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUGFyYW17TmV3UHJvamVjdH0gJiYgISRQcm9qZWN0RW1wdHkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzSW5zZXJ0KCkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NhblwndCBpbnNlcnQgcHJvamVjdCBkYXRhIScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIFNob3cgVGltZUFjY291bnRpbmcgUHJlZmVyZW5jZXMKICAgICAgICBteSAlU3RhdHVzTGlzdCA9ICgKICAgICAgICAgICAgMSA9PiAndmFsaWQnLAogICAgICAgICAgICAwID0+ICdpbnZhbGlkJywKICAgICAgICApOwoKICAgICAgICAjIFNob3cgcHJvamVjdCBkYXRhCiAgICAgICAgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgJFByb2plY3RFbXB0eSA9IDA7CiAgICAgICAgZm9yIG15ICRQcm9qZWN0SUQgKAogICAgICAgICAgICBzb3J0IHsgJFByb2plY3R7UHJvamVjdH17JGF9IGNtcCAkUHJvamVjdHtQcm9qZWN0fXskYn0gfQogICAgICAgICAgICBrZXlzICV7ICRQcm9qZWN0e1Byb2plY3R9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0fSAgICAgICAgICAgID0gJFByb2plY3R7UHJvamVjdH17JFByb2plY3RJRH07CiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0RGVzY3JpcHRpb259ID0gJFByb2plY3R7UHJvamVjdERlc2NyaXB0aW9ufXskUHJvamVjdElEfTsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3RJRH0gICAgICAgICAgPSAkUHJvamVjdElEOwoKICAgICAgICAgICAgbXkgJFN0YXR1c09wdGlvbiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU3RhdHVzTGlzdCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFByb2plY3R7UHJvamVjdFN0YXR1c317JFByb2plY3RJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICJQcm9qZWN0U3RhdHVzWyRQYXJhbXtQcm9qZWN0SUR9XSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvamVjdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgU3RhdHVzT3B0aW9uID0+ICRTdGF0dXNPcHRpb24sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdTZXR0aW5nJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ1NldHRpbmcnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGltZSBhY2NvdW50aW5nIHJlcG9ydGluZwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdSZXBvcnRpbmcnICkgewogICAgICAgIG15ICVGcm9udGVuZCA9ICgpOwogICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoIFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAwICk7CiAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJEN1cnJlbnREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgICAgICk7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApIGlmICEkU2VsZi0+e0FjY2Vzc1J3fTsKCiAgICAgICAgZm9yIChxdyhTdGF0dXMgTW9udGggWWVhciBQcm9qZWN0U3RhdHVzU2hvdykpIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgRGF0ZQogICAgICAgIGlmICggISRQYXJhbXtZZWFyfSB8fCAhJFBhcmFte01vbnRofSApIHsKICAgICAgICAgICAgJFBhcmFte1llYXJ9ICA9ICRZZWFyOwogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gJE1vbnRoOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte01vbnRofSA9IHNwcmludGYoICIlMDJkIiwgJFBhcmFte01vbnRofSApOwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuJywKICAgICAgICAgICAgVmFsdWUgPT4KICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1SZXBvcnRpbmcmWWVhcj0kUGFyYW17WWVhcn0mTW9udGg9JFBhcmFte01vbnRofSIsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte01vbnRoX3RvX1RleHR9ID0gJE1vbnRoQXJyYXlbICRQYXJhbXtNb250aH0gXTsKCiAgICAgICAgbXkgJU1vbnRoID0gKCk7CiAgICAgICAgZm9yIG15ICRJRCAoIDEgLi4gMTIgKSB7CiAgICAgICAgICAgICRNb250aHsgc3ByaW50ZiggIiUwMmQiLCAkSUQgKSB9e1ZhbHVlfSAgICA9ICRNb250aEFycmF5WyRJRF07CiAgICAgICAgICAgICRNb250aHsgc3ByaW50ZiggIiUwMmQiLCAkSUQgKSB9e1Bvc2l0aW9ufSA9ICRJRDsKICAgICAgICAgICAgaWYgKCAkUGFyYW17TW9udGh9ID09ICRJRCApIHsKICAgICAgICAgICAgICAgICRNb250aHsgc3ByaW50ZiggIiUwMmQiLCAkSUQgKSB9e1NlbGVjdGVkfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRGcm9udGVuZHtNb250aE9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvbkVsZW1lbnQoCiAgICAgICAgICAgIERhdGEgPT4gXCVNb250aCwKICAgICAgICAgICAgTmFtZSA9PiAnTW9udGgnLAogICAgICAgICk7CgogICAgICAgIG15IEBZZWFyID0gKCAyMDA1IC4uICRZZWFyICk7CgogICAgICAgICRGcm9udGVuZHtZZWFyT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgID0+IFxAWWVhciwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte1llYXJ9IHx8ICcnLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnWWVhcicsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgKCAkUGFyYW17WWVhckJhY2t9LCAkUGFyYW17TW9udGhCYWNrfSwgJFBhcmFte0RheUJhY2t9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sIDEsIDAsIC0xLCAwICk7CiAgICAgICAgKCAkUGFyYW17WWVhck5leHR9LCAkUGFyYW17TW9udGhOZXh0fSwgJFBhcmFte0RheU5leHR9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sIDEsIDAsIDEsIDAgKTsKCiAgICAgICAgbXkgJVVzZXJSZXBvcnQgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclJlcG9ydGluZygKICAgICAgICAgICAgWWVhciAgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAlVXNlckJhc2ljcyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyTGlzdCgpOwoKICAgICAgICBVU0VSSUQ6CiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IHsgJFNob3duVXNlcnN7JGF9IGNtcCAkU2hvd25Vc2Vyc3skYn0gfSBrZXlzICVTaG93blVzZXJzICkgewogICAgICAgICAgICBuZXh0IFVTRVJJRCBpZiAhJFVzZXJSZXBvcnR7JFVzZXJJRH07CgogICAgICAgICAgICBmb3IgKHF3KExlYXZlRGF5IE92ZXJ0aW1lIFdvcmtpbmdIb3VycyBTaWNrIExlYXZlRGF5UmVtYWluaW5nIE92ZXJ0aW1lVG90YWwpKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17JF99ID0gc3ByaW50ZiggIiUuMmYiLCAkVXNlclJlcG9ydHskVXNlcklEfXskX30gKTsKICAgICAgICAgICAgICAgICRQYXJhbXsgJ1RvdGFsJyAuICRfIH0gKz0gJFBhcmFteyRffTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBTaG93IE92ZXJ0aW1lIGlmIGFsbG93ZWQKICAgICAgICAgICAgaWYgKCAhJFVzZXJCYXNpY3N7JFVzZXJJRH17U2hvd092ZXJ0aW1lfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtPdmVydGltZX0gICAgICA9ICcnOwogICAgICAgICAgICAgICAgJFBhcmFte092ZXJ0aW1lVG90YWx9ID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtVc2VyfSAgID0gJFNob3duVXNlcnN7JFVzZXJJRH07CiAgICAgICAgICAgICRQYXJhbXtVc2VySUR9ID0gJFVzZXJJRDsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBmb3IgKAogICAgICAgICAgICBxdyhUb3RhbExlYXZlRGF5IFRvdGFsT3ZlcnRpbWUgVG90YWxXb3JraW5nSG91cnMKICAgICAgICAgICAgVG90YWxTaWNrIFRvdGFsTGVhdmVEYXlSZW1haW5pbmcgVG90YWxPdmVydGltZVRvdGFsKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17JF99ID0gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17JF99ICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgdGhlIHJlcG9ydCBzb3J0IGJ5IHByb2plY3RzCiAgICAgICAgaWYgKCAhJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSB8fCAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IGVxICd2YWxpZCcgKSB7CiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gPSAnYWxsJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IGVxICdhbGwnICkgewogICAgICAgICAgICAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9ID0gJ3ZhbGlkJzsKICAgICAgICB9CgogICAgICAgIG15ICVQcm9qZWN0RGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0QWN0aW9uUmVwb3J0aW5nKAogICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBSRU1BUks6bWVyZ2UgdGhpcyBwcm9qZWN0cmVwb3J0aW5nIGxpc3Qgd2l0aCB0aGUgbGlzdCBpbiBvdmVydmlldwoKICAgICAgICBQUk9KRUNUSUQ6CiAgICAgICAgZm9yIG15ICRQcm9qZWN0SUQgKAogICAgICAgICAgICBzb3J0IHsgJFByb2plY3REYXRheyRhfXtOYW1lfSBjbXAgJFByb2plY3REYXRheyRifXtOYW1lfSB9CiAgICAgICAgICAgIGtleXMgJVByb2plY3REYXRhCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRQcm9qZWN0UmVmID0gJFByb2plY3REYXRheyRQcm9qZWN0SUR9OwogICAgICAgICAgICBteSAkQWN0aW9uc1JlZiA9ICRQcm9qZWN0UmVmLT57QWN0aW9uc307CgogICAgICAgICAgICAkUGFyYW17UHJvamVjdH0gPSAnJzsKICAgICAgICAgICAgJFBhcmFte0NsYXNzfSAgID0gJ2NvbnRlbnR2YWx1ZSc7CiAgICAgICAgICAgICRQYXJhbXtTdGF0dXN9ICA9ICRQcm9qZWN0UmVmLT57U3RhdHVzfSA/ICcnIDogJ3Bhc3Npdic7CgogICAgICAgICAgICBteSAkVG90YWwgICAgICA9IDA7CiAgICAgICAgICAgIG15ICRUb3RhbFRvdGFsID0gMDsKCiAgICAgICAgICAgIG5leHQgUFJPSkVDVElEIGlmICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ2FsbCcgJiYgJFBhcmFte1N0YXR1c307CgogICAgICAgICAgICBmb3IgbXkgJEFjdGlvbklEICgKICAgICAgICAgICAgICAgIHNvcnQgeyAkQWN0aW9uc1JlZi0+eyRhfXtOYW1lfSBjbXAgJEFjdGlvbnNSZWYtPnskYn17TmFtZX0gfQogICAgICAgICAgICAgICAga2V5cyAleyRBY3Rpb25zUmVmfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAkQWN0aW9uUmVmID0gJEFjdGlvbnNSZWYtPnskQWN0aW9uSUR9OwoKICAgICAgICAgICAgICAgICRQYXJhbXtBY3Rpb259ICAgICA9ICRBY3Rpb25SZWYtPntOYW1lfTsKICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc30gICAgICA9IHNwcmludGYoICIlLjJmIiwgJEFjdGlvblJlZi0+e1Blck1vbnRofSB8fCAwICk7CiAgICAgICAgICAgICAgICAkUGFyYW17SG91cnNUb3RhbH0gPSBzcHJpbnRmKCAiJS4yZiIsICRBY3Rpb25SZWYtPntUb3RhbH0gfHwgMCApOwogICAgICAgICAgICAgICAgJFRvdGFsICAgICAgKz0gJFBhcmFte0hvdXJzfTsKICAgICAgICAgICAgICAgICRUb3RhbFRvdGFsICs9ICRQYXJhbXtIb3Vyc1RvdGFsfTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17UHJvamVjdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2plY3R9ID0gJFByb2plY3RSZWYtPntOYW1lfTsKICAgICAgICAgICAgICAgICAgICBteSAkUHJvamVjdERlc2NyaXB0aW9uID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkUHJvamVjdFJlZi0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgTmV3TGluZSAgICAgICAgPT4gNTAsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvamVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93U3BhbiAgICAgICAgICAgID0+ICggMSArIHNjYWxhciBrZXlzICV7JEFjdGlvbnNSZWZ9ICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgICAgICAgICAgICAgPT4gJFBhcmFte1N0YXR1c30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0RGVzY3JpcHRpb24gPT4gJFByb2plY3REZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QgICAgICAgICAgICA9PiAkUHJvamVjdFJlZi0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdElEICAgICAgICAgID0+ICRQcm9qZWN0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte0NsYXNzfSAgICAgID0gJ2NvbnRlbnRrZXknOwogICAgICAgICAgICAkUGFyYW17QWN0aW9ufSAgICAgPSAnVG90YWwnOwogICAgICAgICAgICAkUGFyYW17SG91cnN9ICAgICAgPSBzcHJpbnRmKCAiJS4yZiIsICRUb3RhbCApOwogICAgICAgICAgICAkUGFyYW17SG91cnNUb3RhbH0gPSBzcHJpbnRmKCAiJS4yZiIsICRUb3RhbFRvdGFsICk7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzfSAgICAgICs9ICRUb3RhbDsKICAgICAgICAgICAgJFBhcmFte1RvdGFsSG91cnNUb3RhbH0gKz0gJFRvdGFsVG90YWw7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gICAgICB8fD0gMDsKICAgICAgICAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSB8fD0gMDsKCiAgICAgICAgJFBhcmFte1RvdGFsSG91cnN9ICAgICAgPSBzcHJpbnRmKCAiJS4yZiIsICRQYXJhbXtUb3RhbEhvdXJzfSApOwogICAgICAgICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ID0gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSApOwoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdSZXBvcnRpbmcnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nUmVwb3J0aW5nJwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRpbWUgYWNjb3VudGluZyBwcm9qZWN0IHJlcG9ydGluZwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdQcm9qZWN0UmVwb3J0aW5nJyApIHsKICAgICAgICBteSAlRnJvbnRlbmQgPSAoKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUm99OwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAkUGFyYW17UHJvamVjdElEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Byb2plY3RJRCcgKTsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICAgICAgaWYgKCAhJFBhcmFte1Byb2plY3RJRH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnUHJvamVjdFJlcG9ydGluZzogTmVlZCBQcm9qZWN0SUQnCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAlQWN0aW9uICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwogICAgICAgIG15ICVQcm9qZWN0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgICAgICRQYXJhbXtQcm9qZWN0fSA9ICRQcm9qZWN0e1Byb2plY3R9eyAkUGFyYW17UHJvamVjdElEfSB9OwoKICAgICAgICBteSAlU2hvd25Vc2VycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KCBUeXBlID0+ICdMb25nJywgVmFsaWQgPT4gMCApOwoKICAgICAgICAjIG5lY2Fzc2FyeSBiZWNhdXNlIHRoZSBQcm9qZWN0QWN0aW9uUmVwb3J0aW5nIGlzIG5vdCByZXdvcmtlZAogICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICRDdXJyZW50RGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgICAgICAgICApOwogICAgICAgIG15ICVQcm9qZWN0RGF0YSA9ICgpOwogICAgICAgIG15ICVQcm9qZWN0VGltZSA9ICgpOwoKICAgICAgICAjIE9ubHkgb25lIGZ1bmN0aW9uIHNob3VsZCBiZSBlbm91Z2gKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJVNob3duVXNlcnMgKSB7CgogICAgICAgICAgICAjIE92ZXJ2aWV3IHBlciBwcm9qZWN0IGFuZCBhY3Rpb24KICAgICAgICAgICAgIyBSRU1BUks6IFRoaXMgaXMgdGhlIHdyb25nIGZ1bmN0aW9uIHRvIGdldCB0aGlzIGluZm9ybWF0aW9uCiAgICAgICAgICAgICVQcm9qZWN0RGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0QWN0aW9uUmVwb3J0aW5nKAogICAgICAgICAgICAgICAgWWVhciAgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgTW9udGggID0+ICRNb250aCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRQcm9qZWN0RGF0YXsgJFBhcmFte1Byb2plY3RJRH0gfSApIHsKICAgICAgICAgICAgICAgIG15ICRBY3Rpb25zUmVmID0gJFByb2plY3REYXRheyAkUGFyYW17UHJvamVjdElEfSB9e0FjdGlvbnN9OwogICAgICAgICAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIGtleXMgJXskQWN0aW9uc1JlZn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFByb2plY3RUaW1leyRBY3Rpb25JRH17JFVzZXJJRH17SG91cnN9ID0gJEFjdGlvbnNSZWYtPnskQWN0aW9uSUR9e1RvdGFsfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkU2hvd25Vc2Vyc3skVXNlcklEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRoZSBoZWFkZXJsaW5lCiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IHsgJFNob3duVXNlcnN7JGF9IGNtcCAkU2hvd25Vc2Vyc3skYn0gfSBrZXlzICVTaG93blVzZXJzICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlck5hbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFVzZXIgPT4gJFNob3duVXNlcnN7JFVzZXJJRH0gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYmV0dGVyIHNvbHV0aW9uIGZvciBzb3J0IGFjdGlvbnMgbmVjZXNzYXJ5CiAgICAgICAgbXkgJU5ld0FjdGlvbiA9ICgpOwogICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBrZXlzICVQcm9qZWN0VGltZSApIHsKICAgICAgICAgICAgJE5ld0FjdGlvbnskQWN0aW9uSUR9ID0gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvbn07CiAgICAgICAgfQogICAgICAgICVBY3Rpb24gPSAlTmV3QWN0aW9uOwoKICAgICAgICAjIHNob3cgdGhlIHJlc3VsdHMKICAgICAgICBteSAlVG90YWwgPSAoKTsKICAgICAgICBmb3IgbXkgJEFjdGlvbklEICggc29ydCB7ICRBY3Rpb257JGF9IGNtcCAkQWN0aW9ueyRifSB9IGtleXMgJUFjdGlvbiApIHsKICAgICAgICAgICAgbXkgJFRvdGFsSG91cnMgPSAwOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBBY3Rpb24gPT4gJEFjdGlvbnskQWN0aW9uSUR9LCB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQgeyAkU2hvd25Vc2Vyc3skYX0gY21wICRTaG93blVzZXJzeyRifSB9IGtleXMgJVNob3duVXNlcnMgKSB7CiAgICAgICAgICAgICAgICAkVG90YWxIb3VycyAgICAgKz0gJFByb2plY3RUaW1leyRBY3Rpb25JRH17JFVzZXJJRH17SG91cnN9IHx8IDA7CiAgICAgICAgICAgICAgICAkVG90YWx7JFVzZXJJRH0gKz0gJFByb2plY3RUaW1leyRBY3Rpb25JRH17JFVzZXJJRH17SG91cnN9IHx8IDA7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBIb3VycyA9PiBzcHJpbnRmKCAiJS4yZiIsICRQcm9qZWN0VGltZXskQWN0aW9uSUR9eyRVc2VySUR9e0hvdXJzfSB8fCAwICksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgVG90YWwKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IEhvdXJzID0+IHNwcmludGYoICIlLjJmIiwgJFRvdGFsSG91cnMgKSwgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1RvdGFsQWxsfSA9IDA7CiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IHsgJFNob3duVXNlcnN7JGF9IGNtcCAkU2hvd25Vc2Vyc3skYn0gfSBrZXlzICVTaG93blVzZXJzICkgewogICAgICAgICAgICAkUGFyYW17VG90YWxBbGx9ICs9ICRUb3RhbHskVXNlcklEfTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJUb3RhbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgVG90YWwgPT4gc3ByaW50ZiggIiUuMmYiLCAkVG90YWx7JFVzZXJJRH0gKSwgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtUb3RhbEFsbH0gPSBzcHJpbnRmKCAiJS4yZiIsICRQYXJhbXtUb3RhbEFsbH0gKTsKCiAgICAgICAgbXkgQFByb2plY3RIaXN0b3J5QXJyYXkgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdEhpc3RvcnkoCiAgICAgICAgICAgIFByb2plY3RJRCA9PiAkUGFyYW17UHJvamVjdElEfSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkUm93IChAUHJvamVjdEhpc3RvcnlBcnJheSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFVzZXIgICA9PiAkUm93LT57VXNlcn0sCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uID0+ICRSb3ctPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFJlbWFyayA9PiAkUm93LT57UmVtYXJrfSB8fCAnLS0nLAogICAgICAgICAgICAgICAgICAgIFBlcmlvZCA9PiAkUm93LT57UGVyaW9kfSwKICAgICAgICAgICAgICAgICAgICBEYXRlICAgPT4gJFJvdy0+e0RhdGV9LAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyB0aGUgdG90YWwgc3VtIG9mIGhvdXJzIGF0IHRoZSBlbmQgb2YgdGhlIGhpc3RvcnkgbGlzdAogICAgICAgICMgSSBhbHNvIGNhbiB1c2UgJFBhcmFte1RvdGFsQWxsfQogICAgICAgIG15ICRQcm9qZWN0VG90YWxIb3VycyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0VG90YWxIb3VycygKICAgICAgICAgICAgUHJvamVjdElEID0+ICRQYXJhbXtQcm9qZWN0SUR9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0hpc3RvcnlUb3RhbCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgSGlzdG9yeVRvdGFsID0+ICRQcm9qZWN0VG90YWxIb3VycyB8fCAwLAogICAgICAgICAgICAgICAgfQogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnUHJvamVjdFJlcG9ydGluZycgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdQcm9qZWN0UmVwb3J0aW5nJwogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNob3cgZXJyb3Igc2NyZWVuCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oIE1lc3NhZ2UgPT4gJ0ludmFsaWQgU3ViYWN0aW9uIHByb2Nlc3MhJyApOwp9CgpzdWIgX0ZpcnN0VXNlclJlZGlyZWN0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBmb3IgaW5pdGlhbCB1c2VpbmcsIHRoZSBmaXJzdCBhZ2VudCB3aXRoIHJ3LXJpZ2h0IHdpbGwgYmUgcmVkaXJlY3RlZAogICAgIyB0byAnU2V0dGluZycuIFRoZW4gaGUgY2FuIGRvIHRoZSBpbml0aWFsIHNldHRpbmdzCgogICAgbXkgJUdyb3VwTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgKTsKICAgIGZvciAoIGtleXMgJUdyb3VwTGlzdCApIHsKICAgICAgICBpZiAoICRHcm91cExpc3R7JF99IGVxICd0aW1lX2FjY291bnRpbmcnICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRUaW1lQWNjb3VudGluZyYiIC4gIlN1YmFjdGlvbj1TZXR0aW5nIgogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgIk5vIFVzZXJQZXJpb2QgYXZhaWxhYmxlLCBwbGVhc2UgY29udGFjdCB0aGUgdGltZSBhY2NvdW50aW5nIGFkbWluIHRvIGluc2VydCB5b3VyIFVzZXJQZXJpb2QhIgogICAgKTsKfQoKc3ViIF9BY3Rpb25MaXN0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJUFjdGlvbkxpc3Q7CiAgICBteSAlQWN0aW9uID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CgogICAgIyBnZXQgYWN0aW9uIHNldHRpbmdzCiAgICBBQ1RJT05JRDoKICAgIGZvciBteSAkQWN0aW9uSUQgKCBrZXlzICVBY3Rpb24gKSB7CiAgICAgICAgbmV4dCBBQ1RJT05JRCBpZiAhJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvblN0YXR1c307CiAgICAgICAgbmV4dCBBQ1RJT05JRCBpZiAhJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvbn07CiAgICAgICAgJEFjdGlvbkxpc3R7JEFjdGlvbklEfSA9ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgfQogICAgJEFjdGlvbkxpc3R7Jyd9ID0gJyc7CgogICAgcmV0dXJuICVBY3Rpb25MaXN0Owp9CgpzdWIgX1Byb2plY3RMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW0KICAgIGlmICggISRQYXJhbXtXb3JraW5nVW5pdElEfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdfUHJvamVjdExpc3Q6IE5lZWQgV29ya2luZ1VuaXRJRCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGF0IGZpcnN0IGEgZW1wdHkgbGluZQogICAgbXkgQExpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnJywKICAgICAgICAgICAgVmFsdWUgPT4gJycsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgcHJvamVjdCBzZXR0aW5ncwogICAgbXkgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KAogICAgICAgIFN0YXR1cyA9PiAndmFsaWQnLAogICAgKTsKCiAgICBpZiAoICEkU2VsZi0+e0xhc3RQcm9qZWN0c1JlZn0gKSB7CgogICAgICAgICMgZ2V0IHRoZSBsYXN0IHByb2plY3RzCiAgICAgICAgbXkgQExhc3RQcm9qZWN0cyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5MYXN0UHJvamVjdHNPZlVzZXIoKTsKCiAgICAgICAgIyBhZGQgdGhlIGZhdm9yaXRzCiAgICAgICAgJXsgJFNlbGYtPntMYXN0UHJvamVjdHNSZWZ9IH0gPSBtYXAgeyAkXyA9PiAxIH0gQExhc3RQcm9qZWN0czsKICAgIH0KCiAgICBQUk9KRUNUSUQ6CiAgICBmb3IgbXkgJFByb2plY3RJRCAoCiAgICAgICAgc29ydCB7ICRQcm9qZWN0e1Byb2plY3R9eyRhfSBjbXAgJFByb2plY3R7UHJvamVjdH17JGJ9IH0KICAgICAgICBrZXlzICV7ICRQcm9qZWN0e1Byb2plY3R9IH0KICAgICAgICApCiAgICB7CiAgICAgICAgbmV4dCBQUk9KRUNUSUQgaWYgISRTZWxmLT57TGFzdFByb2plY3RzUmVmfS0+eyRQcm9qZWN0SUR9OwogICAgICAgIG15ICVIYXNoID0gKAogICAgICAgICAgICBLZXkgICA9PiAkUHJvamVjdElELAogICAgICAgICAgICBWYWx1ZSA9PiAkUHJvamVjdHtQcm9qZWN0fXskUHJvamVjdElEfSwKICAgICAgICApOwogICAgICAgIHB1c2ggQExpc3QsIFwlSGFzaDsKCiAgICAgICAgIyBhdCB0aGUgbW9tZW50IGl0IGlzIG5vdCBwb3NzaWxiZSBtYXJrIHRoZSBzZWxlY3RlZCBwcm9qZWN0CiAgICAgICAgIyBpbiB0aGUgZmF2b3JpdCBsaXN0IChJIHRoaW5rIGEgYnVnIGluIEJ1aWxkIHNlbGVjdGlvbj8hKQogICAgfQoKICAgICMgYWRkIHRoZSBzZXBlcmF0b3IKICAgIHB1c2ggQExpc3QsIHsKICAgICAgICBLZXkgICAgICA9PiAnMCcsCiAgICAgICAgVmFsdWUgICAgPT4gJy0tLS0tLS0tLS0tLS0tLS0tLS0tJywKICAgICAgICBEaXNhYmxlZCA9PiAxLAogICAgfTsKCiAgICAjIGFkZCBhbGwgYWxsb3dlZCBwcm9qZWN0cyB0byB0aGUgbGlzdAogICAgUFJPSkVDVElEOgogICAgZm9yIG15ICRQcm9qZWN0SUQgKAogICAgICAgIHNvcnQgeyAkUHJvamVjdHtQcm9qZWN0fXskYX0gY21wICRQcm9qZWN0e1Byb2plY3R9eyRifSB9CiAgICAgICAga2V5cyAleyAkUHJvamVjdHtQcm9qZWN0fSB9CiAgICAgICAgKQogICAgewogICAgICAgIG5leHQgUFJPSkVDVElEIGlmICEkUHJvamVjdHtQcm9qZWN0fXskUHJvamVjdElEfTsKICAgICAgICBteSAlSGFzaCA9ICgKICAgICAgICAgICAgS2V5ICAgPT4gJFByb2plY3RJRCwKICAgICAgICAgICAgVmFsdWUgPT4gJFByb2plY3R7UHJvamVjdH17JFByb2plY3RJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICRQYXJhbXtTZWxlY3RlZElEfSAmJiAkUGFyYW17U2VsZWN0ZWRJRH0gZXEgJFByb2plY3RJRCApIHsKICAgICAgICAgICAgJEhhc2h7U2VsZWN0ZWR9ID0gMTsKICAgICAgICB9CgogICAgICAgIHB1c2ggQExpc3QsIFwlSGFzaDsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICA9PiBcQExpc3QsCiAgICAgICAgTmFtZSAgICAgICAgPT4gIlByb2plY3RJRFskUGFyYW17V29ya2luZ1VuaXRJRH1dIiwKICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAoKICAgICAgICAjTWF4ICAgICAgICAgPT4gNjIsCiAgICAgICAgQ2xhc3MgPT4gJ1Byb2plY3RTZWxlY3Rpb24nLAogICAgKTsKCn0KCiMgaW50ZWdyYXRlIHRoZSBoYW5kbGluZyBmb3IgcmVxdWlyZWQgcmVtYXJrcyBpbiByZWxhdGlvbiB0byBwcm9qZWN0cwoKc3ViIF9Qcm9qZWN0MlJlbWFya1JlZ0V4cCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15IEBQcm9qZWN0czJSZW1hcmsgPSAoKTsKICAgIG15ICVQcm9qZWN0RGF0YSAgICAgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KAogICAgICAgIFN0YXR1cyA9PiAndmFsaWQnLAogICAgKTsKCiAgICByZXR1cm4gJycgaWYgISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6UHJvamVjdDJSZW1hcmtSZWdFeHAnKTsKCiAgICBteSAkUHJvamVjdDJSZW1hcmtSZWdFeHAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OlByb2plY3QyUmVtYXJrUmVnRXhwJyk7CgogICAgZm9yIG15ICRQcm9qZWN0SUQgKCBrZXlzICV7ICRQcm9qZWN0RGF0YXtQcm9qZWN0fSB9ICkgewogICAgICAgIGlmICggJFByb2plY3REYXRhe1Byb2plY3R9eyRQcm9qZWN0SUR9ID1+IG17JFByb2plY3QyUmVtYXJrUmVnRXhwfXNteCApIHsKICAgICAgICAgICAgcHVzaCBAUHJvamVjdHMyUmVtYXJrLCAkUHJvamVjdElEOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gam9pbiAnfCcsIEBQcm9qZWN0czJSZW1hcms7Cn0KMTsK
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdFZGl0LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIGVkaXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmdFZGl0LmR0bCx2IDEuMjYgMjAwOS8wNC8wMyAxMTo0OToyOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKICAgIGZvciAodmFyIENvdW50ZXIgPSAxO0NvdW50ZXIgPCAxMDsgQ291bnRlcisrKSB7CiAgICAgICAgdmFyIFJlbWFyayAgPSAnUmVtYXJrWycgICAgKyBDb3VudGVyICsgJ10nOwogICAgICAgIHZhciBQcm9qZWN0ID0gJ1Byb2plY3RJRFsnICsgQ291bnRlciArICddJzsKCiAgICAgICAgaWYgKCBkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW1Byb2plY3RdLnZhbHVlICkgewoKICAgICAgICAgICAgdmFyIFJlbWFya0NoZWNrID0gcHJvamVjdF9yZW1hcmtfY2hlY2soUHJvamVjdCk7CgogICAgICAgICAgICBpZiAoICAgZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tQcm9qZWN0XS52YWx1ZQogICAgICAgICAgICAgICAgJiYgUmVtYXJrQ2hlY2sKICAgICAgICAgICAgICAgICYmICAoIWRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbUmVtYXJrXS52YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICB8fCBkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW1JlbWFya10udmFsdWUubGVuZ3RoIDwgOAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiUGxlYXNlIGFkZCBhIHJlbWFyayB3aXRoIG1vcmUgdGhhbiA4IGNoYXJhY3RlcnMhIn0nKTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbUmVtYXJrXS5mb2N1cygpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7Cn0KCmZ1bmN0aW9uIHByb2plY3RfcmVtYXJrX2NoZWNrKFByb2plY3QpIHsKCiAgICB2YXIgcmVnID0gL14oJFFEYXRheyJSZW1hcmtSZWdFeHAifSkkLzsKCiAgICBpZiAoIHJlZy50ZXN0KGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbUHJvamVjdF0udmFsdWUpID09IGZhbHNlICkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwp9CgovLyBUaGlzIGZ1bmNpdG9uIG1ha2UgdGhlIGludmlzaWJsZSBpbnB1dCBmaWVsZHMgKDkgLSAxNikgdmlzaWJsZQoKZnVuY3Rpb24gTW9yZUlucHV0RmllbGRzKCkgewogICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKSB7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIk1vcmVGaWVsZHNbOV0iKS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJNb3JlRmllbGRzWzEwXSIpLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIk1vcmVGaWVsZHNbMTFdIikuc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiTW9yZUZpZWxkc1sxMl0iKS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJNb3JlRmllbGRzWzEzXSIpLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIk1vcmVGaWVsZHNbMTRdIikuc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiTW9yZUZpZWxkc1sxNV0iKS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJNb3JlRmllbGRzWzE2XSIpLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIkxpbmsiKS5zdHlsZS52aXNpYmlsaXR5ID0gImNvbGxhcHNlIjsKICAgIH0KfQoKLy8tLT4KPC9zY3JpcHQ+Cgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgouUHJvamVjdFNlbGVjdGlvbiB7IHdpZHRoOjQ1MHB4O30KLkFjdGlvblNlbGVjdGlvbiB7IHdpZHRoOjMwMHB4O30KPC9zdHlsZT4KCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkVkaXQgdGltZSByZWNvcmQifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJPdmVydmlldyJ9PC9hPgo8IS0tIGR0bDpibG9jazpDcmVhdGVQcm9qZWN0IC0tPgogICAgICAtCiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVByb2plY3RTZXR0aW5nIiBjbGFzcz0ibWVudWl0ZW0iPgogICAgICAkVGV4dHsiUHJvamVjdCBzZXR0aW5ncyJ9CiAgICAgIDwvYT4KPCEtLSBkdGw6YmxvY2s6Q3JlYXRlUHJvamVjdCAtLT4KICAgIDwvdGQ+CiAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iY29udGVudGJvZHkiIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlMiI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJFZGl0Ij4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkRhdGUgbmF2aWdhdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiRGF0ZSJ9CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IlllYXIifS0kUURhdGF7Ik1vbnRoIn0tJFFEYXRheyJEYXkifSZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RWRpdCZZZWFyPSRMUURhdGF7IlllYXJCYWNrIn0mTW9udGg9JExRRGF0YXsiTW9udGhCYWNrIn0mRGF5PSRMUURhdGF7IkRheUJhY2sifSI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9bGVmdC1iaWcucG5nIiBhbHQ9IiRUZXh0eyJPbmUgZGF5IGJhY2sifSI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RWRpdCZZZWFyPSRMUURhdGF7IlllYXJOZXh0In0mTW9udGg9JExRRGF0YXsiTW9udGhOZXh0In0mRGF5PSRMUURhdGF7IkRheU5leHQifSI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9cmlnaHQtYmlnLnBuZyIgYWx0PSIkVGV4dHsiTmV4dCBkYXkifSI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5jb21wbGV0ZVRleHQgLS0+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRGF5cyB3aXRob3V0IGVudHJpZXMifToKPCEtLSBkdGw6YmxvY2s6SW5jb21wbGV0ZVdvcmtpbmdEYXlzIC0tPgogICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kTFFEYXRheyJZZWFyIn0mTW9udGg9JExRRGF0YXsiTW9udGgifSZEYXk9JExRRGF0YXsiRGF5In0iPgogICAgICAgICAgICAgICAgICAgICREYXRheyJCb2xkU3RhcnQifQogICAgICAgICAgICAgICAgICAgICRRRGF0YXsiWWVhciJ9LSRRRGF0YXsiTW9udGgifS0kUURhdGF7IkRheSJ9CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IkJvbGRFbmQifQogICAgICAgICAgICAgICAgICAgIDwvYT4KPCEtLSBkdGw6YmxvY2s6SW5jb21wbGV0ZVdvcmtpbmdEYXlzIC0tPgogICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5jb21wbGV0ZVRleHQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGZvb3RlciI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJFZGl0Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN0YXR1cyIgICAgdmFsdWU9IkFjdGlvbiI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJZZWFyIiAgICAgIHZhbHVlPSIkUURhdGF7IlllYXIifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJNb250aCIgICAgIHZhbHVlPSIkUURhdGF7Ik1vbnRoIn0iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRGF5IiAgICAgICB2YWx1ZT0iJFFEYXRheyJEYXkifSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgICAgICAgICAgICRUZXh0eyJEYXRlIn06ICRUZXh0eyIkUURhdGF7IldlZWtkYXlfdG9fVGV4dCJ9In0gJFFEYXRheyJZZWFyIn0tJFFEYXRheyJNb250aCJ9LSRRRGF0YXsiRGF5In0KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgYWxpZ249ImNlbnRlciI+CjwhLS0gZHRsOmJsb2NrOlVuaXRCbG9jayAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUHJvamVjdCJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVGFzayJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUmVtYXJrIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXJ0In0gKEhIOk1NKTxzcGFuIGNsYXNzPSIkUURhdGF7IkNsYXNzVGltZSJ9Ij4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiRW5kIn0gKEhIOk1NKTxzcGFuIGNsYXNzPSIkUURhdGF7IkNsYXNzVGltZSJ9Ij4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUGVyaW9kIn08c3BhbiBjbGFzcz0iZm9vdG5vdGUiPiRRRGF0YXsiUGVyaW9kTm90ZSJ9PC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVbml0IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiIGlkPSJNb3JlRmllbGRzWyRRRGF0YXsiSUQifV0iICBzdHlsZT0idmlzaWJpbGl0eTokUURhdGF7IlZpc2liaWxpdHkifSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kRGF0YXsiUHJvamVjdE9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiREYXRheyJBY3Rpb25PcHRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iUmVtYXJrWyRRRGF0YXsiSUQifV0iICAgIHZhbHVlPSIkUURhdGF7IlJlbWFyayJ9IiAgICBzaXplPSIzNSI+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdGFydFRpbWVbJFFEYXRheyJJRCJ9XSIgdmFsdWU9IiRRRGF0YXsiU3RhcnRUaW1lIn0iIHNpemU9IjciPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRW5kVGltZVskUURhdGF7IklEIn1dIiAgIHZhbHVlPSIkUURhdGF7IkVuZFRpbWUifSIgICBzaXplPSI3Ij48L3RkPgo8IS0tIGR0bDpibG9jazpVbml0SW5wdXRQZXJpb2QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iJFFEYXRheyJUZXh0UG9zaXRpb24ifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlBlcmlvZFskUURhdGF7IklEIn1dIiB2YWx1ZT0iJFFEYXRheyJQZXJpb2QifSIgc2l6ZT0iNyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlVuaXRJbnB1dFBlcmlvZCAtLT4KPCEtLSBkdGw6YmxvY2s6VW5pdFBlcmlvZFdpdGhvdXRJbnB1dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSIkUURhdGF7IlRleHRQb3NpdGlvbiJ9Ij4kUURhdGF7IlBlcmlvZCJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VW5pdFBlcmlvZFdpdGhvdXRJbnB1dCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVuaXRSZXF1aXJlZCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0icmVxdWlyZWQiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVbml0UmVxdWlyZWQgLS0+CjwhLS0gZHRsOmJsb2NrOlVuaXRSZWFkb25seSAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0icmVhZG9ubHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVbml0UmVhZG9ubHkgLS0+CjwhLS0gZHRsOmJsb2NrOlVuaXQgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgaWQ9IkxpbmsiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpNb3JlSW5wdXRGaWVsZHMoKSIgc3R5bGU9InZpc2liaWxpdHk6JFFEYXRheyJMaW5rVmlzaWJpbGl0eSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1kb3duLWJpZy5wbmciIGFsdD0iJFRleHR7Ik1vcmUgaW5wdXQgZmllbGRzIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVuaXRCbG9jayAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiBjb2xzcGFuPSI0Ij4KPCEtLSBkdGw6YmxvY2s6T3RoZXJUaW1lcyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBuYW1lPSJMZWF2ZURheSIgJERhdGF7IkxlYXZlRGF5In0+JFRleHR7Ik9uIHZhY2F0aW9uIn0mbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBuYW1lPSJTaWNrIiAgICAgJERhdGF7IlNpY2sifT4kVGV4dHsiT24gc2ljayBsZWF2ZSJ9Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iMSIgbmFtZT0iT3ZlcnRpbWUiICREYXRheyJPdmVydGltZSJ9PiRUZXh0eyJPbiBvdmVydGltZSBsZWF2ZSJ9CjwhLS0gZHRsOmJsb2NrOk90aGVyVGltZXMgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlRvdGFsIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlRvdGFsIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSIkUURhdGF7IlRleHRQb3NpdGlvbiJ9Ij4kUURhdGF7IlRvdGFsIn0mbmJzcDs8L3RkPgo8IS0tIGR0bDpibG9jazpUb3RhbCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVxdWlyZWQiPiRUZXh0eyIkUURhdGF7IkRlc2NyaXB0aW9uIn0ifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVxdWlyZWQgLS0+CjwhLS0gZHRsOmJsb2NrOlJlYWRvbmx5IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVhZG9ubHkiPiRUZXh0eyIkUURhdGF7IkRlc2NyaXB0aW9uIn0ifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVhZG9ubHkgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSIgbmFtZT0iRGVsZXRlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVxdWlyZWQiPiogJFRleHR7IlJlcXVpcmVkIEZpZWxkIn08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Rm9vdE5vdGUgLS0+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdG5vdGUiPiogJFRleHR7IllvdSBoYXZlIHRvIGluc2VydCBhIHN0YXJ0IGFuZCBhbiBlbmQgdGltZSBvciBhIHBlcmlvZCJ9PC9kaXY+CjwhLS0gZHRsOmJsb2NrOkZvb3ROb3RlIC0tPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rub3RlIj4qICRUZXh0eyJJZiB5b3Ugc2VsZWN0ICJNaXNjZWxsYW5lb3VzIChtaXNjKSIgdGhlIHRhc2ssIHBsZWFzZSBleHBsYWluIHRoaXMgaW4gdGhlIHJlbWFya3MgZmllbGQifTwvZGl2PgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdWaWV3LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9yIHZpZXcgaW5zZXJ0cyBvZiBvbmUgZGF5CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nVmlldy5kdGwsdiAxLjExIDIwMDkvMDQvMDMgMTE6NDk6MjkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJWaWV3IHRpbWUgcmVjb3JkIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlbiJ9IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJWaWV3IG9mICJ9ICRRRGF0YXsiVXNlciJ9PGJyPjxicj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJWaWV3Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlVzZXJJRCIgICAgdmFsdWU9IiRRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4kVGV4dHsiRGF0ZSBuYXZpZ2F0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICREYXRheyJEYXRlU2VsZWN0aW9uIn0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJEYXRlIn0mbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVZpZXcmWWVhcj0kUURhdGF7IlllYXJCYWNrIn0mTW9udGg9JFFEYXRheyJNb250aEJhY2sifSZEYXk9JFFEYXRheyJEYXlCYWNrIn0mVXNlcklEPSRRRGF0YXsiVXNlcklEIn0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWxlZnQtYmlnLnBuZyIgYWx0PSIkVGV4dHsiT25lIGRheSBiYWNrIn0iPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVZpZXcmWWVhcj0kUURhdGF7IlllYXJOZXh0In0mTW9udGg9JFFEYXRheyJNb250aE5leHQifSZEYXk9JFFEYXRheyJEYXlOZXh0In0mVXNlcklEPSRRRGF0YXsiVXNlcklEIn0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifXJpZ2h0LWJpZy5wbmciIGFsdD0iJFRleHR7Ik5leHQgZGF5In0iPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiRGF0ZSJ9OiAkUURhdGF7IldlZWtkYXlfdG9fVGV4dCJ9ICRRRGF0YXsiRGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI5MCUiPgo8IS0tIGR0bDpibG9jazpVbml0QmxvY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUHJvamVjdCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVGFzayJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUmVtYXJrIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJTdGFydCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiRW5kIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQZXJpb2QifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VW5pdCAtLT4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJQcm9qZWN0In0mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiQWN0aW9uIn0mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiUmVtYXJrIn0mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJTdGFydFRpbWUifSZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkVuZFRpbWUifSZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlBlcmlvZCJ9Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVbml0IC0tPgo8IS0tIGR0bDpibG9jazpVbml0QmxvY2sgLS0+CjwhLS0gZHRsOmJsb2NrOlRvdGFsIC0tPgogICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+CiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbCJ9Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUb3RhbCAtLT4KPCEtLSBkdGw6YmxvY2s6T3RoZXJUaW1lcyAtLT4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSItMiIgbmFtZT0iTGVhdmVEYXkiICREYXRheyJMZWF2ZURheSJ9IGRpc2FibGVkPiRUZXh0eyJPbiB2YWNhdGlvbiJ9Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9Ii0xIiBuYW1lPSJTaWNrIiAkRGF0YXsiU2ljayJ9IGRpc2FibGVkPiRUZXh0eyJPbiBzaWNrIGxlYXZlIn0mbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iLTMiIG5hbWU9Ik92ZXJ0aW1lIiAkRGF0YXsiT3ZlcnRpbWUifSBkaXNhYmxlZD4kVGV4dHsiT24gb3ZlcnRpbWUgbGVhdmUifQogICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3RoZXJUaW1lcyAtLT4KPCEtLSBkdGw6YmxvY2s6VmFjYXRpb24gLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJWYWNhdGlvbiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpWYWNhdGlvbiAtLT4KICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4mbmJzcDs8L3RkPjwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdTZXR0aW5nLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIHNldHRpbmdzCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nU2V0dGluZy5kdGwsdiAxLjIxIDIwMDkvMDQvMDMgMTE6NDk6MjkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KPCEtLSBkdGw6YmxvY2s6UHJvamVjdFNldHRpbmcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiRWRpdCB0aW1lIGFjY291bnRpbmcgcHJvamVjdCBzZXR0aW5ncyJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW4ifSIgY2xhc3M9Im1lbnVpdGVtIj4KICAgICAgJFRleHR7IkJhY2sifQogICAgICA8L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iUHJvamVjdFNldHRpbmciPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJQcm9qZWN0IHNldHRpbmdzIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgIDx0ciAgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlByb2plY3QifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkNvbW1lbnRzIn08L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXR1cyJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlByb2plY3RbJFFEYXRheyJQcm9qZWN0SUQifV0iIHZhbHVlPSIkUURhdGF7IlByb2plY3QifSIgc2l6ZT0iMzAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHJvd3M9IjIiIG5hbWU9IlByb2plY3REZXNjcmlwdGlvblskUURhdGF7IlByb2plY3RJRCJ9XSIgY29scz0iNDAiPiRRRGF0YXsiUHJvamVjdERlc2NyaXB0aW9uIn08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IlN0YXR1c09wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlByb2plY3QgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiTmV3In0iIG5hbWU9Ik5ld1Byb2plY3QiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG5hbWU9IkFjdGlvblByb2plY3QiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyIGNsYXNzPSJyZXF1aXJlZCI+PHRkPiogJFRleHR7IlJlcXVpcmVkIEZpZWxkIn08L3RkPjwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UHJvamVjdFNldHRpbmcgLS0+CjwhLS0gZHRsOmJsb2NrOlNldHRpbmcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiRWRpdCB0aW1lIGFjY291bnRpbmcgc2V0dGluZ3MifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVByb2plY3RTZXR0aW5nIiBjbGFzcz0ibWVudWl0ZW0iPgogICAgICAkVGV4dHsiUHJvamVjdCBzZXR0aW5ncyJ9CiAgICAgIDwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZXR0aW5nIj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiVGFzayBzZXR0aW5ncyJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRhc2sifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdGF0dXMifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkFjdGlvblskUURhdGF7IkFjdGlvbklEIn1dIiB2YWx1ZT0iJFFEYXRheyJBY3Rpb24ifSIgc2l6ZT0iNDAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlN0YXR1c09wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFjdGlvbiAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiTmV3In0iIG5hbWU9Ik5ld0FjdGlvbiI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgbmFtZT0iQWN0aW9uQWN0aW9uIj4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgICA8YnI+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlVzZXIgc2V0dGluZ3MifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGFsaWduPSJjZW50ZXIiPgo8IS0tIGR0bDpibG9jazpVc2VyIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGNvbHNwYW49IjMiPiRRRGF0YXsiVXNlciJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNvbW1lbnRzIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICREYXRheyJEZXNjcmlwdGlvbiJ9CiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHJvd3M9IjEiIG5hbWU9IkRlc2NyaXB0aW9uWyRRRGF0YXsiVXNlcklEIn1dIiBjb2xzPSI0MCI+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iQ2hlY2tib3giIG5hbWU9IlNob3dPdmVydGltZVskUURhdGF7IlVzZXJJRCJ9XSIgdmFsdWU9IjEiICREYXRheyJTaG93T3ZlcnRpbWUifT4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiU2hvdyBPdmVydGltZSJ9PGJyPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJDaGVja2JveCIgbmFtZT0iQ3JlYXRlUHJvamVjdFskUURhdGF7IlVzZXJJRCJ9XSIgdmFsdWU9IjEiICREYXRheyJDcmVhdGVQcm9qZWN0In0+CiAgICAgICAgICAgICAgICAgICAgJFRleHR7IkFsbG93IHByb2plY3QgY3JlYXRpb24ifQogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2FsZW5kYXIifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkNhbGVuZGFyT3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlBlcmlvZCBiZWdpbiJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUGVyaW9kIGVuZCJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiRGF5cyBvZiB2YWNhdGlvbiJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiSG91cnMgcGVyIHdlZWsifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiQXV0aG9yaXplZCBvdmVydGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJTdGF0dXMifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UGVyaW9kIC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkRhdGVTdGFydFskUURhdGF7IlVzZXJJRCJ9XVskUURhdGF7IlBlcmlvZCJ9XSIgdmFsdWU9IiRRRGF0YXsiRGF0ZVN0YXJ0In0iIHNpemU9IjEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJEYXRlRW5kWyRRRGF0YXsiVXNlcklEIn1dWyRRRGF0YXsiUGVyaW9kIn1dIiB2YWx1ZT0iJFFEYXRheyJEYXRlRW5kIn0iIHNpemU9IjEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJMZWF2ZURheXNbJFFEYXRheyJVc2VySUQifV1bJFFEYXRheyJQZXJpb2QifV0iIHZhbHVlPSIkUURhdGF7IkxlYXZlRGF5cyJ9IiBzaXplPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJXZWVrbHlIb3Vyc1skUURhdGF7IlVzZXJJRCJ9XVskUURhdGF7IlBlcmlvZCJ9XSIgdmFsdWU9IiRRRGF0YXsiV2Vla2x5SG91cnMifSIgc2l6ZT0iNSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iT3ZlcnRpbWVbJFFEYXRheyJVc2VySUQifV1bJFFEYXRheyJQZXJpb2QifV0iIHZhbHVlPSIkUURhdGF7Ik92ZXJ0aW1lIn0iIHNpemU9IjUiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IlN0YXR1c09wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlBlcmlvZCAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIHRpbWUgcGVyaW9kIn0iICBuYW1lPSJOZXdVc2VyU2V0dGluZ1skUURhdGF7IlVzZXJJRCJ9XSI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+PGhyPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVc2VyIC0tPgo8IS0tIGR0bDpibG9jazpOZXdVc2VyT3B0aW9uIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7Ik5ld1VzZXJPcHRpb24ifQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJOZXcifSIgIG5hbWU9Ik5ld1VzZXIiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TmV3VXNlck9wdGlvbiAtLT4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG5hbWU9IkFjdGlvblVzZXIiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyIGNsYXNzPSJyZXF1aXJlZCI+PHRkPiogJFRleHR7IlJlcXVpcmVkIEZpZWxkIn08L3RkPjwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U2V0dGluZyAtLT4K
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdPdmVydmlldy5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIHRpbWUgYWNjb3VudGluZyBvdmVydmlldwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaW1lQWNjb3VudGluZ092ZXJ2aWV3LmR0bCx2IDEuMjEgMjAwOS8wNC8wMyAxMTo0OToyOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlRpbWUgcmVwb3J0aW5nIG1vbnRobHkgb3ZlcnZpZXcifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIzMyUiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMiIgYWxpZ249ImNlbnRlciI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjQiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3ZlcnZpZXcgb2YgIn0gJFFEYXRheyJVc2VyIn08YnI+PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVc2VyIC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249T3ZlcnZpZXcmWWVhcj0kTFFEYXRheyJZZWFyQmFjayJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoQmFjayJ9JlVzZXJJRD0kTFFEYXRheyJVc2VySUQifSI+CiAgICAgICAgICAgICYjMDYwOyYjMDYwOwogICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICZuYnNwOyZuYnNwOwogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXJOZXh0In0mTW9udGg9JExRRGF0YXsiTW9udGhOZXh0In0mVXNlcklEPSRMUURhdGF7IlVzZXJJRCJ9Ij4KICAgICAgICAgICAgJiMwNjI7JiMwNjI7CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImNvbnRlbnRoZWFkIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgJFRleHR7IiRRRGF0YXsiTW9udGhfdG9fVGV4dCJ9In0gJFFEYXRheyJZZWFyIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgIDx0ciAkRGF0YXsiU3R5bGUifT4KICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249JExRRGF0YXsiU3ViYWN0aW9uIn0mWWVhcj0kTFFEYXRheyJZZWFyIn0mTW9udGg9JExRRGF0YXsiTW9udGgifSZEYXk9JExRRGF0YXsiRGF5In0mVXNlcklEPSRMUURhdGF7IlVzZXJJRCJ9Ij4KICAgICAgICAgICAgJFFEYXRheyJEYXkifQogICAgICAgICAgICA8L2E+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkPiRUZXh0eyIkUURhdGF7IldlZWtkYXlfdG9fVGV4dCJ9In08L3RkPgogICAgICAgICAgPHRkPiRUZXh0eyIkUURhdGF7IkNvbW1lbnQifSJ9PC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiV29ya2luZ0hvdXJzIn08L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9ImNvbnRlbnRoZWFkIiBhbGlnbj0ibGVmdCI+JFRleHR7IlRvdGFsIGhvdXJzIHdvcmtlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiV29ya2luZ0hvdXJzIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjMzJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiBhbGlnbj0iY2VudGVyIj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnRpbWUgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7Ik92ZXJ0aW1lIChIb3VycykifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOyRUZXh0eyJPdmVydGltZSAodGhpcyBtb250aCkifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGFsaWduPSJyaWdodCI+JFFEYXRheyJPdmVydGltZSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDskVGV4dHsiT3ZlcnRpbWUgKHRvdGFsKSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7Ik92ZXJ0aW1lVW50aWwifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZD4kVGV4dHsiUmVtYWluaW5nIG92ZXJ0aW1lIGxlYXZlIn06PC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiT3ZlcnRpbWVUb3RhbCJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ0aW1lIC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiRUZXh0eyJWYWNhdGlvbiAoRGF5cykifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOyRUZXh0eyJWYWNhdGlvbiB0YWtlbiAodGhpcyBtb250aCkifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGFsaWduPSJyaWdodCI+JFFEYXRheyJMZWF2ZURheSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDskVGV4dHsiVmFjYXRpb24gdGFrZW4gKHRvdGFsKSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkxlYXZlRGF5VG90YWwifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZD4kVGV4dHsiUmVtYWluaW5nIHZhY2F0aW9uIn06PC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiTGVhdmVEYXlSZW1haW5pbmcifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiRUZXh0eyJTaWNrIGxlYXZlIChEYXlzKSJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7JFRleHR7IlNpY2sgbGVhdmUgdGFrZW4gKHRoaXMgbW9udGgpIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiU2ljayJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDskVGV4dHsiU2ljayBsZWF2ZSB0YWtlbiAodG90YWwpIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiU2lja1RvdGFsIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGNsYXNzPSJjb250ZW50Ym9keSIgYm9yZGVyPSIwIiB3aWR0aD0iNTAlIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiIGFsaWduPSJjZW50ZXIiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJVc2VyJ3MgcHJvamVjdCBvdmVydmlldyJ9OgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9JlByb2plY3RTdGF0dXNTaG93PSRMUURhdGF7IlByb2plY3RTdGF0dXNTaG93In0mVXNlcklEPSRMUURhdGF7IlVzZXJJRCJ9Ij4KICAgICAgICAgICAgKCRUZXh0eyJTaG93In0gJFRleHR7IiRRRGF0YXsiUHJvamVjdFN0YXR1c1Nob3cifSJ9ICRUZXh0eyJQcm9qZWN0cyJ9KQogICAgICAgICAgICA8L2E+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJNb250aGx5In08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJMaWZldGltZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlByb2plY3QifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlRhc2sifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBY3Rpb24gLS0+CiAgICAgICAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRkIHJvd3NwYW49IiREYXRheyJSb3dTcGFuIn0iIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRlbnRrZXkkUURhdGF7IlN0YXR1cyJ9Ij4KPCEtLSBkdGw6YmxvY2s6UHJvamVjdE5vTGluayAtLT4KICAgICAgICAgICAgICAgICAgJERhdGF7IlByb2plY3QifQo8IS0tIGR0bDpibG9jazpQcm9qZWN0Tm9MaW5rIC0tPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0TGluayAtLT4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UHJvamVjdFJlcG9ydGluZyZQcm9qZWN0SUQ9JFFEYXRheyJQcm9qZWN0SUQifSI+CiAgICAgICAgICAgICAgICAgICREYXRheyJQcm9qZWN0In0KICAgICAgICAgICAgICAgICAgPC9hPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0TGluayAtLT4KICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb250ZW50dmFsdWUkUURhdGF7IlN0YXR1cyJ9Ij4kRGF0YXsiUHJvamVjdERlc2NyaXB0aW9uIn08L3NwYW4+CiAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNsYXNzIn0kUURhdGF7IlN0YXR1cyJ9IiA+JFFEYXRheyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ2xhc3MifSRRRGF0YXsiU3RhdHVzIn0iIGFsaWduPSJyaWdodCI+JFFEYXRheyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9JFFEYXRheyJTdGF0dXMifSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkhvdXJzVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IkdyYW5kIHRvdGFsIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEhvdXJzVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdSZXBvcnRpbmcuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciB0aW1lIGFjY291bnRpbmcgcmVwb3J0aW5nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nUmVwb3J0aW5nLmR0bCx2IDEuMTcgMjAwOS8wNC8wMyAxMTo0OToyOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJUaW1lIHJlcG9ydGluZyJ9OiAkVGV4dHsiJFFEYXRheyJNb250aF90b19UZXh0In0ifSAkUURhdGF7IlllYXIifSAkRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCIgPiRUZXh0eyJNb250aCBuYXZpZ2F0aW9uIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJSZXBvcnRpbmciPgogICAgICAgICAgICAgICREYXRheyJNb250aE9wdGlvbiJ9CiAgICAgICAgICAgICAgJERhdGF7IlllYXJPcHRpb24ifQogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICRUZXh0eyIkUURhdGF7Ik1vbnRoX3RvX1RleHQifSJ9ICRRRGF0YXsiWWVhciJ9CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1SZXBvcnRpbmcmWWVhcj0kTFFEYXRheyJZZWFyQmFjayJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoQmFjayJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1sZWZ0LWJpZy5wbmciIGFsdD0iJFRleHR7Ik9uZSBkYXkgYmFjayJ9Ij48L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1SZXBvcnRpbmcmWWVhcj0kTFFEYXRheyJZZWFyTmV4dCJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoTmV4dCJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1yaWdodC1iaWcucG5nIiBhbHQ9IiRUZXh0eyJOZXh0IGRheSJ9Ij48L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGNsYXNzPSJjb250ZW50Ym9keSIgYm9yZGVyPSIwIiB3aWR0aD0iNTAlIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiIGFsaWduPSJjZW50ZXIiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJVc2VyIHJlcG9ydHMifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIyIj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+JFRleHR7Ik1vbnRobHkgdG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IkxpZmV0aW1lIHRvdGFsIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVXNlciJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiV29ya2luZyBIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiT3ZlcnRpbWUgbGVhdmUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlZhY2F0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJTaWNrIGxlYXZlIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJPdmVydGltZSBsZWF2ZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiTGVhdmVEYXkgUmVtYWluaW5nIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9JlVzZXJJRD0kTFFEYXRheyJVc2VySUQifSI+CiAgICAgICAgICAgICAgICAgICRRRGF0YXsiVXNlciJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IldvcmtpbmdIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiZuYnNwOyRRRGF0YXsiT3ZlcnRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkxlYXZlRGF5In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJTaWNrIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+Jm5ic3A7JFFEYXRheyJPdmVydGltZVRvdGFsIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJMZWF2ZURheVJlbWFpbmluZyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVc2VyIC0tPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlRvdGFsIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbFdvcmtpbmdIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxPdmVydGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxMZWF2ZURheSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxTaWNrIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbE92ZXJ0aW1lVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsTGVhdmVEYXlSZW1haW5pbmcifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICRUZXh0eyJQcm9qZWN0IHJlcG9ydHMifToKICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UmVwb3J0aW5nJlllYXI9JExRRGF0YXsiWWVhciJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoIn0mUHJvamVjdFN0YXR1c1Nob3c9JExRRGF0YXsiUHJvamVjdFN0YXR1c1Nob3cifSI+CiAgICAgICAgICAgICgkVGV4dHsiU2hvdyJ9ICRUZXh0eyIkUURhdGF7IlByb2plY3RTdGF0dXNTaG93In0ifSAkVGV4dHsiUHJvamVjdHMifSkKICAgICAgICAgICAgPC9hPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiTW9udGhseSB0b3RhbCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiTGlmZXRpbWUgdG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQcm9qZWN0In08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJUYXNrIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiSG91cnMifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0cj4KPCEtLSBkdGw6YmxvY2s6UHJvamVjdCAtLT4KICAgICAgICAgICAgICAgIDx0ZCByb3dzcGFuPSIkRGF0YXsiUm93U3BhbiJ9IiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb250ZW50a2V5JFFEYXRheyJTdGF0dXMifSI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVByb2plY3RSZXBvcnRpbmcmUHJvamVjdElEPSRRRGF0YXsiUHJvamVjdElEIn0iPgogICAgICAgICAgICAgICAgICAkRGF0YXsiUHJvamVjdCJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb250ZW50dmFsdWUkUURhdGF7IlN0YXR1cyJ9Ij4kRGF0YXsiUHJvamVjdERlc2NyaXB0aW9uIn08L3NwYW4+CiAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNsYXNzIn0kUURhdGF7IlN0YXR1cyJ9IiA+JFFEYXRheyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ2xhc3MifSRRRGF0YXsiU3RhdHVzIn0iIGFsaWduPSJyaWdodCI+JFFEYXRheyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9JFFEYXRheyJTdGF0dXMifSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkhvdXJzVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0ciAgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiRUZXh0eyJUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxIb3Vyc1RvdGFsIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdQcm9qZWN0UmVwb3J0aW5nLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIHJlcG9ydGluZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaW1lQWNjb3VudGluZ1Byb2plY3RSZXBvcnRpbmcuZHRsLHYgMS43IDIwMDkvMDQvMDMgMTE6NDk6MjkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiUHJvamVjdCByZXBvcnQifTogJFFEYXRheyJQcm9qZWN0In0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW4ifSIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBjbGFzcz0iY29udGVudGJvZHkiIGJvcmRlcj0iMCIgd2lkdGg9IjUwJSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgJFRleHR7IlByb2plY3QgcmVwb3J0In06ICRRRGF0YXsiUHJvamVjdCJ9CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVGFzayJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VXNlck5hbWUgLS0+CiAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJVc2VyIn08L3RkPgo8IS0tIGR0bDpibG9jazpVc2VyTmFtZSAtLT4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkFjdGlvbiJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiSG91cnMifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRvdGFsIn08L3RkPgo8IS0tIGR0bDpibG9jazpVc2VyVG90YWwgLS0+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbCJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VXNlclRvdGFsIC0tPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxBbGwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICRUZXh0eyJIaXN0b3J5In06ICRRRGF0YXsiUHJvamVjdCJ9CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiRGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVXNlciJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVGFzayJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUmVtYXJrIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQZXJpb2QifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkRhdGUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJVc2VyIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiQWN0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiUmVtYXJrIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGFsaWduPSJyaWdodCI+JFFEYXRheyJQZXJpb2QifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KPCEtLSBkdGw6YmxvY2s6SGlzdG9yeVRvdGFsIC0tPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJyaWdodCI+JFFEYXRheyJIaXN0b3J5VG90YWwifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOkhpc3RvcnlUb3RhbCAtLT4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdEZWxldGUuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBkZWxldGUgYSBkYXkgb2YgdGltZWFjY291bnRpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmdEZWxldGUuZHRsLHYgMS4yIDIwMDkvMDQvMDMgMTE6NDk6MjkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjwhLS0gc3RhcnQgZm9ybSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJEZWxldGUifTogJFRleHR7IlRpbWVBY2NvdW50aW5nIG9mIn0gJFFEYXRheyJZZWFyIn0tJFFEYXRheyJNb250aCJ9LSRRRGF0YXsiRGF5In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KIyAgPHRyPgojICAgIDx0ZCBjbGFzcz0ibWVudSI+CiMgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlblZpZXcifSIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgojICAgIDwvdGQ+CiMgIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjM1MCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgID4kVGV4dHsiRGVsZXRlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IlRpbWVBY2NvdW50aW5nIG9mIn0gJFFEYXRheyJZZWFyIn0tJFFEYXRheyJNb250aCJ9LSRRRGF0YXsiRGF5In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgT2JqZWN0In0/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kUURhdGF7IlllYXIifSZNb250aD0kUURhdGF7Ik1vbnRoIn0mRGF5PSRRRGF0YXsiRGF5In0iIj4kVGV4dHsiTm8ifTwvYT4gPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RGVsZXRlJlllYXI9JFFEYXRheyJZZWFyIn0mTW9udGg9JFFEYXRheyJNb250aCJ9JkRheT0kUURhdGF7IkRheSJ9Ij4kVGV4dHsiWWVzIn08L2E+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBlbmQgZm9ybSAtLT4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9Ob3RpZmljYXRpb25UaW1lQWNjb3VudGluZy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTm90aWZpY2F0aW9uVGltZUFjY291bnRpbmcucG0sdiAxLjYgMjAwOS8wNC8wMyAxMTo0OToyOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6Tm90aWZpY2F0aW9uVGltZUFjY291bnRpbmc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWVBY2NvdW50aW5nOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBVc2VySUQpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgJFNlbGYtPntUaW1lT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZy0+bmV3KCVQYXJhbSk7CiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSggU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksICk7CiAgICBteSAlVXNlciA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyQ3VycmVudFBlcmlvZEdldCgKICAgICAgICBZZWFyICA9PiAkWWVhciwKICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgRGF5ICAgPT4gJERheSwKICAgICk7CiAgICBpZiAoICRVc2VyeyAkU2VsZi0+e1VzZXJJRH0gfSApIHsKICAgICAgICBteSAlSW5jb21wbGV0ZVdvcmtpbmdEYXlzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2soKTsKCiAgICAgICAgIyByZWRpcmVjdCBpZiBpbmNvbXBsZXRlIHdvcmtpbmcgZGF5IGFyZSBvdXQgb2YgcmFuZ2UKICAgICAgICBpZiAoICRJbmNvbXBsZXRlV29ya2luZ0RheXN7V2FybmluZ30gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgIEluZm8gICAgID0+ICdQbGVhc2UgaW5zZXJ0IHlvdXIgd29ya2luZyBob3VycyEnLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJwogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAnJzsKfQoKMTsK
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=
IyAtLQojIFRpbWVBY2NvdW50aW5nLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFRpbWVBY2NvdW50aW5nLnBtLHYgMS40IDIwMDgvMDgvMjkgMDU6NTU6MjYgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6VGltZUFjY291bnRpbmc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKPWhlYWQxIE5BTUUKClRpbWVBY2NvdW50aW5nLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFhNTE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29kZU9iamVjdCA9IHZhcjo6cGFja2FnZXNldHVwOjpUaW1lQWNjb3VudGluZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBYTUxPYmplY3QgICAgPT4gJFhNTE9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBYTUxPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFkZCB0aGUgZ3JvdXAgdGltZV9hY2NvdW50aW5nCiAgICAkU2VsZi0+X0dyb3VwQWRkKAogICAgICAgIE5hbWUgICAgICAgID0+ICd0aW1lX2FjY291bnRpbmcnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdHcm91cCBmb3IgYWxsIHRpbWUgYWNjb3VudGluZyB1c2VyLicsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlYWN0aXZhdGUgdGhlIGdyb3VwIHRpbWVfYWNjb3VudGluZwogICAgJFNlbGYtPl9Hcm91cERlYWN0aXZhdGUoCiAgICAgICAgTmFtZSA9PiAndGltZV9hY2NvdW50aW5nJywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Hcm91cEFkZCgpCgphZGQgYSBncm91cAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0dyb3VwQWRkKAogICAgICAgIE5hbWUgICAgICAgID0+ICd0aGUtZ3JvdXAtbmFtZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1RoZSBncm91cCBkZXNjcmlwdGlvbi4nLAogICAgKTsKCj1jdXQKCnN1YiBfR3JvdXBBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBEZXNjcmlwdGlvbikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdmFsaWQgbGlzdAogICAgbXkgJVZhbGlkTGlzdCA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CgogICAgIyBjaGVjayBpZiBncm91cCBhbHJlYWR5IGV4aXN0cwogICAgbXkgJEdyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyByZWFjdGl2YXRlIHRoZSBncm91cAogICAgaWYgKCRHcm91cElEKSB7CgogICAgICAgICMgZ2V0IGN1cnJlbnQgZ3JvdXAgZGF0YQogICAgICAgIG15ICVHcm91cERhdGEgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBHZXQoCiAgICAgICAgICAgIElEICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWFjdGl2YXRlIGdyb3VwCiAgICAgICAgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwVXBkYXRlKAogICAgICAgICAgICAlR3JvdXBEYXRhLAogICAgICAgICAgICBWYWxpZElEID0+ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgYWRkIHRoZSBncm91cAogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFBhcmFte05hbWV9LAogICAgICAgICAgICBDb21tZW50ID0+ICRQYXJhbXtEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGxvb2t1cCB0aGUgbmV3IGdyb3VwIGlkCiAgICBteSAkTmV3R3JvdXBJRCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cExvb2t1cCgKICAgICAgICBHcm91cCAgPT4gJFBhcmFte05hbWV9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGFkZCB1c2VyIHJvb3QgdG8gdGhlIGdyb3VwCiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJBZGQoCiAgICAgICAgR0lEICAgICAgICA9PiAkTmV3R3JvdXBJRCwKICAgICAgICBVSUQgICAgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgICAgICBtb3ZlX2ludG8gPT4gMSwKICAgICAgICAgICAgY3JlYXRlICAgID0+IDEsCiAgICAgICAgICAgIG93bmVyICAgICA9PiAxLAogICAgICAgICAgICBwcmlvcml0eSAgPT4gMSwKICAgICAgICAgICAgcncgICAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Hcm91cERlYWN0aXZhdGUoKQoKZGVhY3RpdmF0ZSBhIGdyb3VwCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fR3JvdXBEZWFjdGl2YXRlKAogICAgICAgIE5hbWUgPT4gJ3RoZS1ncm91cC1uYW1lJywKICAgICk7Cgo9Y3V0CgpzdWIgX0dyb3VwRGVhY3RpdmF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCBncm91cCBpZAogICAgbXkgJEdyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgPT4gJFBhcmFte05hbWV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRHcm91cElEOwoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwoKICAgICMgZ2V0IGN1cnJlbnQgZ3JvdXAgZGF0YQogICAgbXkgJUdyb3VwRGF0YSA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cEdldCgKICAgICAgICBJRCAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZGVhY3RpdmF0ZSBncm91cAogICAgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwVXBkYXRlKAogICAgICAgICVHcm91cERhdGEsCiAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRMaXN0UmV2ZXJzZXtpbnZhbGlkfSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjQgJCAkRGF0ZTogMjAwOC8wOC8yOSAwNTo1NToyNiAkCgo9Y3V0Cg==