OTRSAppointmentCalendar
5.0.1
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRSAppointmentCalendar 5.
The Appointment Calendar package.
Das Terminkalender-Paket.
Az értekezlet naptár csomag.
Модул за календаре и термине.
Modul za kalendare i termine.
5.0.x
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to install the OTRS package OTRSAppointmentCalendar.<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
Minimum framework version for this package is <strong><u>5.0.14</u></strong>. Please make sure you have updated the framework before installing this package!
</ul>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ДОБРОДОШЛИ</strong>
<br/>
<br/>
Ово је инсталација OTRS пакета OTRSAppointmentCalendar.<br/>
<br/>
<br/>
<strong>УПОЗОРЕЊЕ</strong>
<br/>
<br/>
Најмања подржана верзија система за овај пакет је <strong><u>5.0.14</u></strong>. Проверите да ли сте освежили ваш систем пре инсталације пакета!
</ul>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>DOBRODOŠLI</strong>
<br/>
<br/>
Ovo je instalacija OTRS paketa OTRSAppointmentCalendar.<br/>
<br/>
<br/>
<strong>UPOZORENJE</strong>
<br/>
<br/>
Najmanja podržana verzija sistema za ovaj paket je <strong><u>5.0.14</u></strong>. Proverite da li ste osvežili vaš sistem pre instalacije paketa!
</ul>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>Willkommen</strong>
<br/>
<br/>
Sie sind dabei das OTRS Paket OTRSAppointmentCalendar zu installieren.<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
Die minimale OTRS Frameworkversion für dieses Paket ist <strong><u>5.0.14</u></strong>.
Bitte stellen Sie sicher, dass Sie das Framework vor der Installation dieses Pakets aktualisiert haben!
</ul>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from this table will be irrevocably lost.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ACHTUNG</strong>
<br/>
<br/>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATENCIÓN</strong>
<br/>
<br/>
Si usted desinstala este paquete, todas las tablas de la base de datos creadas durante la instalación serán borradas.
¡Todos los datos de esas tablas serán irrevocablemente perdidos!.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>FIGYELEM</strong>
<br/>
<br/>
Ha eltávolítja ezt a csomagot, akkor a telepítés során létrehozott összes adatbázistábla törlésre kerül.
Az ezekben a táblákban lévő összes adat visszavonhatatlanul el fog veszni!
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>УПОЗОРЕЊЕ</strong>
<br/>
<br/>
Уколико деинсталирате овај пакет, све табеле у бази података које су креиране приликом инсталације ће бити обрисане.
Сви подаци из ових табела биће неповратно изгубљени.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>UPOZORENJE</strong>
<br/>
<br/>
Ukoliko deinstalerate ovaj paket, sve tabele u bazi podataka koje su kreirane prilikom instalacije će biti obrisane.
Svi podaci iz ovih tabela biće nepovratno izgubljeni.
<br/>
<br/>
((enjoy))<br/>
<br/>
DateTime
DateTime::TimeZone
$Kernel::OM->Get('var::packagesetup::OTRSAppointmentCalendar')->CodeInstall();
$Kernel::OM->Get('var::packagesetup::OTRSAppointmentCalendar')->CodeUpgrade();
$Kernel::OM->Get('var::packagesetup::OTRSAppointmentCalendar')->CodeUninstall();
$Kernel::OM->Get('var::packagesetup::OTRSAppointmentCalendar')->CodeReinstall();
2016-10-27 15:04:24
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkNvbmZpZyI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUHVibGljQ2FsZW5kYXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpQdWJsaWM6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlB1YmxpYyBjYWxlbmRhci48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+UHVibGljIENhbGVuZGFyPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+T3ZlcnZpZXc8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q2FsZW5kYXI8L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxOYW1lIFRyYW5zbGF0YWJsZT0iMSI+Q2FsZW5kYXI8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxMaW5rT3B0aW9uPjwvTGlua09wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkNhbGVuZGFyPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+TWVudTwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NzU8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lIFRyYW5zbGF0YWJsZT0iMSI+Q2FsZW5kYXIgT3ZlcnZpZXc8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxMaW5rT3B0aW9uPjwvTGlua09wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkNhbGVuZGFyPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz42MDAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWUgVHJhbnNsYXRhYmxlPSIxIj5SZXNvdXJjZSBPdmVydmlldzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPExpbmtPcHRpb24+Y2xhc3M9Ik9UUlNCdXNpbmVzc1JlcXVpcmVkIjwvTGlua09wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkNhbGVuZGFyPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz43MDAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNyZWF0ZSBuZXcgYXBwb2ludG1lbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZSBUcmFuc2xhdGFibGU9IjEiPk5ldyBBcHBvaW50bWVudDwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7U3ViYWN0aW9uPUFwcG9pbnRtZW50Q3JlYXRlPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxMaW5rT3B0aW9uPjwvTGlua09wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkNhbGVuZGFyPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz44MDAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TG9hZGVyPgogICAgICAgICAgICAgICAgICAgIDxDU1M+dGhpcmRwYXJ0eS9mdWxsY2FsZW5kYXItMy4wLjEvZnVsbGNhbGVuZGFyLm1pbi5jc3M8L0NTUz4KICAgICAgICAgICAgICAgICAgICA8Q1NTPnRoaXJkcGFydHkvZnVsbGNhbGVuZGFyLXNjaGVkdWxlci0xLjQuMC9zY2hlZHVsZXIubWluLmNzczwvQ1NTPgogICAgICAgICAgICAgICAgICAgIDxDU1M+Q29yZS5BcHBvaW50bWVudENhbGVuZGFyLmNzczwvQ1NTPgogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvbW9tZW50anMtMi4xMy4wL21vbWVudC5taW4uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9mdWxsY2FsZW5kYXItMy4wLjEvZnVsbGNhbGVuZGFyLm1pbi5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Z1bGxjYWxlbmRhci1zY2hlZHVsZXItMS40LjAvc2NoZWR1bGVyLm1pbi5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD5Db3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9jbGlwYm9hcmQuanMtMS41LjEyL2NsaXBib2FyZC5taW4uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICA8L0xvYWRlcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRBcHBvaW50bWVudEVkaXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPkVkaXQgYXBwb2ludG1lbnQ8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+PC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudEFwcG9pbnRtZW50TGlzdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BcHBvaW50bWVudCBsaXN0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGUgVHJhbnNsYXRhYmxlPSIxIj5BcHBvaW50bWVudCBsaXN0PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRBcHBvaW50bWVudFBsdWdpblNlYXJjaCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5QbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGUgVHJhbnNsYXRhYmxlPSIxIj5QbHVnaW4gc2VhcmNoPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNhbGVuZGFyIG1hbmFnZSBzY3JlZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPk1hbmFnZSBDYWxlbmRhcnM8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q2FsZW5kYXI8L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWUgVHJhbnNsYXRhYmxlPSIxIj5NYW5hZ2UgQ2FsZW5kYXJzPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2U8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPExpbmtPcHRpb24+PC9MaW5rT3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+Q2FsZW5kYXI8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkl0ZW1BcmVhPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjkwMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxMb2FkZXI+CiAgICAgICAgICAgICAgICAgICAgPENTUz5Db3JlLkFwcG9pbnRtZW50Q2FsZW5kYXIuTWFuYWdlLmNzczwvQ1NTPgogICAgICAgICAgICAgICAgICAgIDxDU1M+dGhpcmRwYXJ0eS9zcGVjdHJ1bS0xLjguMC9zcGVjdHJ1bS5jc3M8L0NTUz4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2NsaXBib2FyZC5qcy0xLjUuMTIvY2xpcGJvYXJkLm1pbi5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD50aGlyZHBhcnR5L3NwZWN0cnVtLTEuOC4wL3NwZWN0cnVtLmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5NYW5hZ2UuanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICA8L0xvYWRlcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRBcHBvaW50bWVudEltcG9ydCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+SW1wb3J0IEFwcG9pbnRtZW50czwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5DYWxlbmRhcjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpDYWxlbmRhckxpbWl0T3ZlcnZpZXciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXGQrIj4xMDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFwcG9pbnRtZW50Q2FsZW5kYXI6OkNhbGVuZGFyQ29sb3JzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXBwb2ludG1lbnRDYWxlbmRhcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPiMwMDAwMDA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jMUUxRTFFPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzNBM0EzQTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM1NDU0NTM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jNkU2RTZFPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Izg3ODY4NzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM4ODg3ODc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jQTA5RkEwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0I4QjhCODwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNEMEQwRDA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRThFOEU4PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGRkZGRjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM4OTExMDA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jODk0ODAwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Izg4ODUwMTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM0NTg0MDE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jMDI4NDAxPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzAxODQ0ODwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiMwMDg2ODg8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jMDA0QTg4PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzAwMTg4ODwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM0OTFBODg8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jODkxRTg4PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Izg5MTY0ODwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNGRjIxMDE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRkY4ODAyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGRkEwMzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM4M0Y5MDI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jMDVGODAyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzAzRjk4NzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiMwMEZERkY8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jMDA4Q0ZGPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzAwMkVGRjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM4OTMxRkY8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRkYzOUZGPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGMjk4NzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNGRjcyNkU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRkZDRTZFPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGRkI2RDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNDRUZBNkU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jNjhGOTZFPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzY4RkRGRjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM2OEZCRDA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jNkFDRkZGPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzZFNzZGRjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNEMjc4RkY8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRkY3QUZGPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGN0ZEMzwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpQbHVnaW4jIyMwMTAwLVRpY2tldCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyOjpQbHVnaW48L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbjo6VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPlRpY2tldDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVVJMIj4mbHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSVzPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMTIwMCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5MaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+QXBwb2ludG1lbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPlRpY2tldDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+Tm9ybWFsPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6Q29tcGxleFRhYmxlOjpTZXR0aW5nc1Zpc2liaWxpdHkjIyNBcHBvaW50bWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmUgQWN0aW9ucyB3aGVyZSBhIHNldHRpbmdzIGJ1dHRvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGxpbmtlZCBvYmplY3RzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIEFjdGlvbnMgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgdGhlIGZvbGxvd2luZyBKUyBhbmQgQ1NTIGZpbGVzOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5BZ2VudFRpY2tldFpvb208L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6Q29tcGxleFRhYmxlIyMjQXBwb2ludG1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3Q6OkFwcG9pbnRtZW50LnBtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0Q29sdW1ucyI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2FsZW5kYXJOYW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj4yPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlN0YXJ0VGltZSI+MjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbmRUaW1lIj4yPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxvY2F0aW9uIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGlmaWNhdGlvblRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlZCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVkIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhbGVuZGFyTmFtZSI+MTAwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj4xMTA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU3RhcnRUaW1lIj4xMjA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW5kVGltZSI+MTMwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxvY2F0aW9uIj4xNDA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90aWZpY2F0aW9uVGltZSI+MTUwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZWQiPjE2MDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVkIj4xNzA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnRDYWxlbmRhcjo6SW1wb3J0OjpSZWN1cnJpbmdNb250aHNMaW1pdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5PVFJTIGRvZXNuJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkFwcG9pbnRtZW50Q2FsZW5kYXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJcZCsiPjEyMDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFwcG9pbnRtZW50Q2FsZW5kYXI6OlRpY2tldEFwcG9pbnRtZW50VHlwZSMjIzAxMDAtRmlyc3RSZXNwb25zZVRpbWUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGVzY2FsYXRpb24gdGltZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkFwcG9pbnRtZW50Q2FsZW5kYXI6OlRpY2tldEFwcG9pbnRtZW50czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpFc2NhbGF0aW9uVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2V5Ij5GaXJzdFJlc3BvbnNlVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5GaXJzdCByZXNwb25zZSB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+VGlja2V0U0xBVXBkYXRlfFRpY2tldFF1ZXVlVXBkYXRlfFRpY2tldFN0YXRlVXBkYXRlfFRpY2tldENyZWF0ZXxBcnRpY2xlQ3JlYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXJrIj5FPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRUeXBlIyMjMDIwMC1VcGRhdGVUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRpY2tldDo6RXNjYWxhdGlvblRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSI+VXBkYXRlVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5VcGRhdGUgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPlRpY2tldFNMQVVwZGF0ZXxUaWNrZXRRdWV1ZVVwZGF0ZXxUaWNrZXRTdGF0ZVVwZGF0ZXxUaWNrZXRDcmVhdGV8QXJ0aWNsZUNyZWF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWFyayI+RTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFwcG9pbnRtZW50Q2FsZW5kYXI6OlRpY2tldEFwcG9pbnRtZW50VHlwZSMjIzAzMDAtU29sdXRpb25UaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRpY2tldDo6RXNjYWxhdGlvblRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSI+U29sdXRpb25UaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPlNvbHV0aW9uIHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij5UaWNrZXRTTEFVcGRhdGV8VGlja2V0UXVldWVVcGRhdGV8VGlja2V0U3RhdGVVcGRhdGV8VGlja2V0Q3JlYXRlfEFydGljbGVDcmVhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hcmsiPkU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudFR5cGUjIyMwNDAwLVBlbmRpbmdUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRpY2tldDo6UGVuZGluZ1RpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSI+UGVuZGluZ1RpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+UGVuZGluZyB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+VGlja2V0UGVuZGluZ1RpbWVVcGRhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hcmsiPlA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudFR5cGUjIyMwNTAwLUR5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRpY2tldDo6RHluYW1pY0ZpZWxkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXkiPkR5bmFtaWNGaWVsZF8lczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljRmllbGRfJXM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij5UaWNrZXREeW5hbWljRmllbGRVcGRhdGVfLio8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hcmsiPkQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudFNlYXJjaFBhcmFtcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkFwcG9pbnRtZW50Q2FsZW5kYXI6OlRpY2tldEFwcG9pbnRtZW50czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPlRpdGxlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VHlwZXM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5TdGF0ZXM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5TdGF0ZVR5cGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Qcmlvcml0aWVzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+U2VydmljZXM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5TTEFzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+TG9ja3M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Pd25lcklEczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPlJlc3BvbnNpYmxlSURzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q3VzdG9tZXJJRDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkN1c3RvbWVyVXNlckxvZ2luPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+RnJvbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPlRvPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q2M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5TdWJqZWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Qm9keTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkF0dGFjaG1lbnROYW1lPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8IS0tIG5vdGlmaWNhdGlvbnMgLS0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6OkFkbWluOjpBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQjIyNFdmVudE9iamVjdFR5cGVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6QWRtaW5Ob3RpZmljYXRpb25FdmVudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkNhbGVuZGFyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+QXBwb2ludG1lbnQ8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRXZlbnRzIyMjQ2FsZW5kYXIiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+Q2FsZW5kYXJDcmVhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5DYWxlbmRhclVwZGF0ZTwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJFdmVudHMjIyNBcHBvaW50bWVudCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5MaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW48L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5BcHBvaW50bWVudENyZWF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkFwcG9pbnRtZW50VXBkYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+QXBwb2ludG1lbnREZWxldGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5BcHBvaW50bWVudE5vdGlmaWNhdGlvbjwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpFdmVudE1vZHVsZVBvc3QjIyMxMDAtTm90aWZpY2F0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyOjpFdmVudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXZlbnQ6Ok5vdGlmaWNhdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihBcHBvaW50bWVudENyZWF0ZXxBcHBvaW50bWVudFVwZGF0ZXxBcHBvaW50bWVudERlbGV0ZXxBcHBvaW50bWVudE5vdGlmaWNhdGlvbnxDYWxlbmRhckNyZWF0ZXxDYWxlbmRhclVwZGF0ZSk8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPCEtLSBub3RpZmljYXRpb25zIHVpIC0tPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD5hZG1pbjwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGlzIG1vZHVsZSBpcyBwYXJ0IG9mIHRoZSBhZG1pbiBhcmVhIG9mIE9UUlMuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPkFwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnM8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TmFtZSBUcmFuc2xhdGFibGU9IjEiPkFwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnM8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+Q3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5TeXN0ZW08L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjQwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgPExvYWRlcj4KICAgICAgICAgICAgICAgICAgICA8Q1NTPkNvcmUuQWdlbnQuQWRtaW4uTm90aWZpY2F0aW9uRXZlbnQuY3NzPC9DU1M+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+Q29yZS5BZ2VudC5BZG1pbi5Ob3RpZmljYXRpb25FdmVudC5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgIDwvTG9hZGVyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpBZG1pbjo6QWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50IyMjUmljaFRleHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VXNlcyByaWNodGV4dCBmb3Igdmlld2luZyBhbmQgZWRpdGluZyB0aWNrZXQgbm90aWZpY2F0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6QWRtaW5Ob3RpZmljYXRpb25FdmVudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6QWRtaW46OkFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCMjI1JpY2hUZXh0V2lkdGgiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgd2lkdGggZm9yIHRoZSByaWNoIHRleHQgZWRpdG9yIGNvbXBvbmVudCBmb3IgdGhpcyBzY3JlZW4uIEVudGVyIG51bWJlciAocGl4ZWxzKSBvciBwZXJjZW50IHZhbHVlIChyZWxhdGl2ZSkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpBZG1pbk5vdGlmaWNhdGlvbkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXlxkKyU/JCI+NjIwPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6OkFkbWluOjpBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQjIyNSaWNoVGV4dEhlaWdodCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBoZWlnaHQgZm9yIHRoZSByaWNoIHRleHQgZWRpdG9yIGNvbXBvbmVudCBmb3IgdGhpcyBzY3JlZW4uIEVudGVyIG51bWJlciAocGl4ZWxzKSBvciBwZXJjZW50IHZhbHVlIChyZWxhdGl2ZSkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpBZG1pbk5vdGlmaWNhdGlvbkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXlxkKyU/JCI+MzIwPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IlByZWZlcmVuY2VzR3JvdXBzIyMjQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6UHJlZmVyZW5jZXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6UHJlZmVyZW5jZXM6OkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbHVtbiI+Tm90aWZpY2F0aW9uIFNldHRpbmdzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMYWJlbCIgVHJhbnNsYXRhYmxlPSIxIj5BcHBvaW50bWVudCBub3RpZmljYXRpb25zPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjIiBUcmFuc2xhdGFibGU9IjEiPkNob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByZWZLZXkiPkFkbWluQXBwb2ludG1lbnROb3RpZmNhdGlvbkV2ZW50VHJhbnNwb3J0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj44MDAxPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJOb3RpZmljYXRpb246OkNoYXJhY3RlcnNQZXJMaW5lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgcGVyIGxpbmUgdXNlZCBpbiBjYXNlIGFuIEhUTUwgYXJ0aWNsZSBwcmV2aWV3IHJlcGxhY2VtZW50IG9uIFRlbXBsYXRlR2VuZXJhdG9yIGZvciBFdmVudE5vdGlmaWNhdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpBZG1pbk5vdGlmaWNhdGlvbkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj44MDwvU3RyaW5nPjwhLS0gZGVmYXVsdCAxIGhvdXIgLS0+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDwhLS0gbm90aWZpY2F0aW9uIHRyYW5zcG9ydHMgLS0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnROb3RpZmljYXRpb246OlRyYW5zcG9ydCMjI0VtYWlsIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgYWxsIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIG5vdGlmaWNhdGlvbiB0cmFuc3BvcnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpBZG1pbk5vdGlmaWNhdGlvbkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VHJhbnNwb3J0OjpFbWFpbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5FbWFpbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSWNvbiI+ZmEgZmEtZW52ZWxvcGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjEwMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSXNPVFJTQnVzaW5lc3NUcmFuc3BvcnQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFnZW50RW5hYmxlZEJ5RGVmYXVsdCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uOjpUcmFuc3BvcnQjIyNOb3RpZmljYXRpb25WaWV3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgYWxsIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIG5vdGlmaWNhdGlvbiB0cmFuc3BvcnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpBZG1pbk5vdGlmaWNhdGlvbkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VHJhbnNwb3J0OjpOb3RpZmljYXRpb25WaWV3PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPldlYiBWaWV3PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJY29uIj5mYSBmYS10aC1saXN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj4xMTA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklzT1RSU0J1c2luZXNzVHJhbnNwb3J0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBZ2VudEVuYWJsZWRCeURlZmF1bHQiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudE5vdGlmaWNhdGlvbjo6VHJhbnNwb3J0IyMjU01TIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgYWxsIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIG5vdGlmaWNhdGlvbiB0cmFuc3BvcnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpBZG1pbk5vdGlmaWNhdGlvbkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VHJhbnNwb3J0OjpTTVM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+U01TIChTaG9ydCBNZXNzYWdlIFNlcnZpY2UpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJY29uIj5mYSBmYS1tb2JpbGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjEyMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSXNPVFJTQnVzaW5lc3NUcmFuc3BvcnQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFnZW50RW5hYmxlZEJ5RGVmYXVsdCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFwcG9pbnRtZW50Q2FsZW5kYXI6OkV2ZW50TW9kdWxlUG9zdCMjIzIwMC1UaWNrZXRBcHBvaW50bWVudHMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkFwcG9pbnRtZW50Q2FsZW5kYXI6OkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VGlja2V0QXBwb2ludG1lbnRzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+QXBwb2ludG1lbnRVcGRhdGU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPCEtLSBkYXNoYm9hcmQgd2lkZ2V0IC0tPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRGFzaGJvYXJkQmFja2VuZCMjIzA1MDAtQXBwb2ludG1lbnRDYWxlbmRhciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZGFzaGJvYXJkIGJhY2tlbmQuICJMaW1pdCIgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZGlzcGxheWVkIGJ5IGRlZmF1bHQuICJHcm91cCIgaXMgdXNlZCB0byByZXN0cmljdCBhY2Nlc3MgdG8gdGhlIHBsdWdpbiAoZS4gZy4gR3JvdXA6IGFkbWluO2dyb3VwMTtncm91cDI7KS4gIkRlZmF1bHQiIGluZGljYXRlcyBpZiB0aGUgcGx1Z2luIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBvciBpZiB0aGUgdXNlciBuZWVkcyB0byBlbmFibGUgaXQgbWFudWFsbHkuICJDYWNoZVRUTExvY2FsIiBkZWZpbmVzIHRoZSBjYWNoZSBleHBpcmF0aW9uIHBlcmlvZCBpbiBtaW51dGVzIGZvciB0aGUgcGx1Z2luLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6RGFzaGJvYXJkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkRhc2hib2FyZDo6QXBwb2ludG1lbnRDYWxlbmRhcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnRzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTaG93RW1haWwiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklkbGVNaW51dGVzIj42MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU29ydEJ5Ij5Vc2VyRnVsbG5hbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZpbHRlciI+VG9kYXk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj5Db250ZW50U21hbGw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbWl0Ij4xMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2FjaGVUVExMb2NhbCI+NTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8IS0tIGFwcG9pbnRtZW50IGNyZWF0aW9uIGxpbmtlZCB0byBleHRlcm5hbCBvYmplY3RzIC0tPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyM1NTAtQXBwb2ludG1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0TWVudTo6R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5OZXcgQXBwb2ludG1lbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkNyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztTdWJhY3Rpb249QXBwb2ludG1lbnRDcmVhdGU7UGx1Z2luS2V5PTAxMDAtVGlja2V0O09iamVjdElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQb3B1cFR5cGUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2x1c3Rlck5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+TWlzY2VsbGFuZW91czwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2x1c3RlclByaW9yaXR5Ij44MDA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk92ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPkFnZW5kYSBPdmVydmlldzwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5DYWxlbmRhcjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5PdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWUgVHJhbnNsYXRhYmxlPSIxIj5BZ2VuZGEgT3ZlcnZpZXc8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldzwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8TGlua09wdGlvbj48L0xpbmtPcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5DYWxlbmRhcjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NjUwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPExvYWRlcj4KICAgICAgICAgICAgICAgICAgICA8Q1NTPnRoaXJkcGFydHkvZnVsbGNhbGVuZGFyLTMuMC4xL2Z1bGxjYWxlbmRhci5taW4uY3NzPC9DU1M+CiAgICAgICAgICAgICAgICAgICAgPENTUz5Db3JlLkFwcG9pbnRtZW50Q2FsZW5kYXIuY3NzPC9DU1M+CiAgICAgICAgICAgICAgICAgICAgPENTUz5Db3JlLkFwcG9pbnRtZW50Q2FsZW5kYXIuQWdlbmRhLmNzczwvQ1NTPgogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvbW9tZW50anMtMi4xMy4wL21vbWVudC5taW4uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9mdWxsY2FsZW5kYXItMy4wLjEvZnVsbGNhbGVuZGFyLmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgIDwvTG9hZGVyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFnZW50QXBwb2ludG1lbnRFZGl0OjpMb2NhdGlvbjo6TGluayMjIzEtR29vZ2xlTWFwcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNTU0NsYXNzIj5Hb29nbGVNYXBzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPl9ibGFuazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGV4dCIgVHJhbnNsYXRhYmxlPSIxIj5Mb2NhdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVVJMIj5odHRwOi8vbWFwcy5nb29nbGUuY29tL21hcHM/ej03JmFtcDtxPTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSWNvbk5hbWUiPmZhLWdsb2JlIGZhLWxnPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpFdmVudE1vZHVsZVBvc3QjIyM5NTAtVGlja2V0QXBwb2ludG1lbnRzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpUaWNrZXRBcHBvaW50bWVudHM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij5UaWNrZXRTTEFVcGRhdGV8VGlja2V0UXVldWVVcGRhdGV8VGlja2V0U3RhdGVVcGRhdGV8VGlja2V0Q3JlYXRlfEFydGljbGVDcmVhdGV8VGlja2V0UGVuZGluZ1RpbWVVcGRhdGV8VGlja2V0RHluYW1pY0ZpZWxkVXBkYXRlXy4qPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUcmFuc2FjdGlvbiI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBDbGFzczo6UmV0dXJuVmFsdWU7CgoKPWhlYWQxIE5BTUUKCkNsYXNzOjpSZXR1cm5WYWx1ZSAtIEEgcmV0dXJuLXZhbHVlIG9iamVjdCB0aGF0IGxldHMgeW91IHRyZWF0IGl0IAphcyBhcyBhIGJvb2xlYW4sIGFycmF5IG9yIG9iamVjdAoKPWhlYWQxIERFU0NSSVBUSU9OCgpDbGFzczo6UmV0dXJuVmFsdWUgaXMgYSAiY2xldmVyIiByZXR1cm4gdmFsdWUgb2JqZWN0IHRoYXQgY2FuIGFsbG93CmNvZGUgY2FsbGluZyB5b3VyIHJvdXRpbmUgdG8gZXhwZWN0OgogICAgYSBib29sZWFuIHZhbHVlIChkaWQgaXQgZmFpbCkKb3IgIGEgbGlzdCAod2hhdCBhcmUgdGhlIHJldHVybiB2YWx1ZXMpCgo9aGVhZDEgRVhBTVBMRQoKICAgIHN1YiBkZW1vIHsKICAgICAgICBteSAkdmFsdWUgPSBzaGlmdDsKICAgICAgICBteSAkcmV0ID0gQ2xhc3M6OlJldHVyblZhbHVlLT5uZXcoKTsKICAgICAgICAkcmV0LT5hc19hcnJheSgnMCcsICdObyByZXN1bHRzIGZvdW5kJyk7CiAgICAKICAgICAgICB1bmxlc3MoJHZhbHVlKSB7CiAgICAgICAgICAgICRyZXQtPmFzX2Vycm9yKGVycm5vID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPT4gIllvdSBkaWRuJ3Qgc3VwcGx5IGEgcGFyYW1ldGVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19iYWNrdHJhY2UgPT4gMSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4oJHJldC0+cmV0dXJuX3ZhbHVlKTsKICAgIH0KCiAgICBpZiAoZGVtbygnZm9vJykpeyAKICAgICAgICBwcmludCAidGhlIHJvdXRpbmUgc3VjY2VlZGVkIHdpdGggb25lIHBhcmFtZXRlciI7CiAgICB9CiAgICBpZiAoZGVtbygpKSB7CiAgICAgICAgcHJpbnQgIlRoZSByb3V0aW5lIHN1Y2NlZWRlZCB3aXRoIDAgcGFyYW10ZXJzLiBzaG91bGRuJ3QgaGFwcGVuIjsKICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnQgIlRoZSByb3V0aW5lIGZhaWxlZCB3aXRoIDAgcGFyYW1ldGVycyAoYXMgaXQgc2hvdWxkKS4iOwogICAgfQoKCiAgICBteSAkcmV0dXJuID0gZGVtbygpOwogICAgaWYgKCRyZXR1cm4pIHsKICAgICAgICBwcmludCAiVGhlIHJvdXRpbmUgc3VjY2VlZGVkIHdpdGggMCBwYXJhbXRlcnMuIHNob3VsZG4ndCBoYXBwZW4iOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludCAiVGhlIHJvdXRpbmUgZmFpbGVkIHdpdGggMCBwYXJhbWV0ZXJzIChhcyBpdCBzaG91bGQpLiAiLgogICAgICAgICAgICAgICJTdGFjayB0cmFjZTpcbiIuCiAgICAgICAgJHJldHVybi0+YmFja3RyYWNlOwogICAgfQoKICAgIG15IEByZXR1cm4zID0gZGVtbygnZm9vJyk7CiAgICBwcmludCAiVGhlIHJvdXRpbmUgZ290ICIuam9pbignLCcsQHJldHVybjMpLgogICAgICAgICAgIndoZW4gYXNraW5nIGZvciBkZW1vJ3MgcmVzdWx0cyBhcyBhbiBhcnJheSI7CgoKICAgIG15ICRyZXR1cm4yID0gZGVtbygnZm9vJyk7CgogICAgdW5sZXNzICgkcmV0dXJuMikgewogICAgICAgIHByaW50ICJUaGUgcm91dGluZSBmYWlsZWQgd2l0aCBhIHBhcmFtZXRlci4gc2hvdWxkbid0IGhhcHBlbi4iLgogICAgICAgICAgICAgIlN0YWNrIHRyYWNlOlxuIi4KICAgICAgICAkcmV0dXJuMi0+YmFja3RyYWNlOwogICAgfQoKICAgIG15IEByZXR1cm4yX2FycmF5ID0gQHskcmV0dXJuMn07ICMgVE9ETzogZG9lcyB0aGlzIHdvcmsKICAgIG15IEByZXR1cm4yX2FycmF5MiA9ICRyZXR1cm4yLT5hc19hcnJheTsKCgo9Y3V0CgoKdXNlIEV4cG9ydGVyOwoKdXNlIHZhcnMgcXcvJFZFUlNJT04gQEVYUE9SVCBASVNBLzsKCkBJU0EgPSBxdy9FeHBvcnRlci87CkBFWFBPUlQgPSBxdyAvJnJldHVybl92YWx1ZS87CnVzZSBDYXJwOwp1c2UgRGV2ZWw6OlN0YWNrVHJhY2U7CnVzZSBEYXRhOjpEdW1wZXI7CgoKJFZFUlNJT04gPSAnMC41NSc7CgoKdXNlIG92ZXJsb2FkICdib29sJyA9PiBcJmVycm9yX2NvbmRpdGlvbjsKdXNlIG92ZXJsb2FkICciIicgPT4gXCZlcnJvcl9jb25kaXRpb247CnVzZSBvdmVybG9hZCAnZXEnID0+IFwmbXlfZXE7CnVzZSBvdmVybG9hZCAnQHt9JyA9PiBcJmFzX2FycmF5Owp1c2Ugb3ZlcmxvYWQgJ2ZhbGxiYWNrJyA9PiBcJmFzX2FycmF5OwoKCj1oZWFkMSBNRVRIT0RTIAoKPWl0ZW0gbmV3CgpJbnN0YW50aWF0ZSBhIG5ldyBDbGFzczo6UmV0dXJuVmFsdWUgb2JqZWN0Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRzZWxmID0ge307CiAgICBibGVzcygkc2VsZik7CiAgICByZXR1cm4oJHNlbGYpOwp9CgpzdWIgbXlfZXEgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIGlmICh3YW50YXJyYXkoKSkgewogICAgICAgIHJldHVybigkc2VsZi0+YXNfYXJyYXkpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuKCRzZWxmKTsKICAgIH0gICAgCn0KCj1pdGVtIGFzX2FycmF5CgpSZXR1cm4gdGhlICdhc19hcnJheScgYXR0cmlidXRlIG9mIHRoaXMgb2JqZWN0IGFzIGFuIGFycmF5LgoKPWN1dAoKCj1pdGVtIGFzX2FycmF5IFtBUlJBWV0KCklmICRzZWxmIGlzIGNhbGxlZCBpbiBhbiBhcnJheSBjb250ZXh0LCByZXR1cm5zIHRoZSBhcnJheSBzcGVjaWZpZWQgaW4gQVJSQVkKCj1jdXQKCnN1YiBhc19hcnJheSB7CgogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIGlmIChAXykgeyAKICAgICAgICBAeyRzZWxmLT57J2FzX2FycmF5J319ID0gKEBfKTsKICAgIH0KICAgIHJldHVybihAeyRzZWxmLT57J2FzX2FycmF5J319KTsKfQoKCj1pdGVtIGFzX2Vycm9yIEhBU0gKClR1cm5zIHRoaXMgcmV0dXJuLXZhbHVlIG9iamVjdCBpbnRvICBhbiBlcnJvciByZXR1cm4gb2JqZWN0LiAgVEFrZXMgdGhyZWUgcGFyYW1ldGVyczoKCiAgICBtZXNzYWdlCiAgICBkb19iYWNrdHJhY2UKICAgIGVycm5vIAoKICAgICdtZXNzYWdlJyBpcyBhIGh1bWFuIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2UgZXhwbGFpbmluZyB3aGF0J3MgZ29pbmcgb24KCiAgICAnZG9fYmFja3RyYWNlJyBpcyBhIGJvb2xlYW4uIElmIGl0J3MgdHJ1ZSwgYSBjYXJwLXN0eWxlIGJhY2t0cmFjZSB3aWxsIGJlIAogICAgc3RvcmVkIGluICRzZWxmLT57J2JhY2t0cmFjZSd9LiBJdCBkZWZhdWx0cyB0byB0cnVlCgogICAgZXJybm8gYW5kIG1lc3NhZ2UgZGVmYXVsdCB0byB1bmRlZi4gZXJybm8gX211c3RfIGJlIHNwZWNpZmllZC4gCiAgICBJdCdzIGEgbnVtZXJpYyBlcnJvciBudW1iZXIuICBBbnkgdHJ1ZSBpbnRlZ2VyIHZhbHVlICB3aWxsIGNhdXNlIHRoZSAKICAgIG9iamVjdCB0byBldmFsdWF0ZSB0byBmYWxzZSBpbiBhIHNjYWxhciBjb250ZXh0LiBBdCBmaXJzdCwgdGhpcyBtYXkgbG9vayBhIAogICAgYml0IGNvdW50ZXJpbnR1aXRpdmUsIGJ1dCBpdCBtZWFucyB0aGF0IHlvdSBjYW4gaGF2ZSBlcnJvciBjb2RlcyBhbmQgc3RpbGwgCiAgICBhbGxvdyBzaW1wbGUgdXNlIG9mIHlvdXIgZnVuY3Rpb25zIGluIGEgc3R5bGUgbGlrZSB0aGlzOgoKCiAgICAgICAgaWYgKCRvYmotPmRvX3NvbWV0aGluZykgewogICAgICAgICAgICBwcmludCAiWWF5ISBpdCB3b3JrZWQiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByaW50ICJTb3JyeS4gdGhlcmUncyBiZWVuIGFuIGVycm9yLiI7CiAgICAgICAgfQoKCiAgICAgICAgYXMgd2VsbCBhcyBtb3JlIGNvbXBsZXggdXNlIGxpa2UgdGhpczoKCiAgICAgICAgbXkgJHJldHZhbCA9ICRvYmotPmRvX3NvbWV0aGluZzsKICAgICAgICAKICAgICAgICBpZiAoJHJldHZhbCkgewogICAgICAgICAgICBwcmludCAiWWF5LiB3ZSBkaWQgc29tZXRoaW5nXG4iOwogICAgICAgICAgICBteSAoJGZvbywgJGJhciwgJGJheikgPSBAeyRyZXR2YWx9OwogICAgICAgICAgICBteSAkaHVtYW5fcmVhZGFibGVfcmV0dXJuID0gJHJldHZhbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoJHJldHZhbC0+ZXJybm8gPT0gMjApIHsKICAgICAgICAgICAgICAgIGRpZSAiRmFpbGVkIHdpdGggZXJyb3IgMjAgKE5vdCBlbm91Z2ggbW9ua2V5cykuIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRpZSAgJHJldHZhbC0+YmFja3RyYWNlOyAjIERpZSBhbmQgcHJpbnQgb3V0IGEgYmFja3RyYWNlIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgCgo9Y3V0CgpzdWIgYXNfZXJyb3IgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICVhcmdzID0gKCBlcnJubyA9PiB1bmRlZiwKICAgICAgICAgICAgICAgICBtZXNzYWdlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgIGRvX2JhY2t0cmFjZSA9PiAxLAogICAgICAgICAgICAgICAgIEBfKTsKCiAgICB1bmxlc3MoJGFyZ3N7J2Vycm5vJ30pIHsKICAgICAgICBjYXJwICIkc2VsZiAtPiBhc19lcnJvciBjYWxsZWQgd2l0aG91dCBhbiAnZXJybm8nIHBhcmFtZXRlciI7CiAgICAgICAgcmV0dXJuICh1bmRlZik7CiAgICB9CgogICAgJHNlbGYtPnsnZXJybm8nfSA9ICRhcmdzeydlcnJubyd9OwogICAgJHNlbGYtPnsnZXJyb3JfbWVzc2FnZSd9ID0gJGFyZ3N7J21lc3NhZ2UnfTsKICAgIGlmICgkYXJnc3snZG9fYmFja3RyYWNlJ30pIHsKICAgICAgICAjIFVzZSBjYXJwJ3MgaW50ZXJuYWwgYmFja3RyYWNlIG1ldGhvZHMsIHJhdGhlciB0aGFuIGR1cGxpY2F0aW5nIHRoZW0gb3Vyc2VsdmVzCiAgICAgICAgIG15ICR0cmFjZSA9IERldmVsOjpTdGFja1RyYWNlLT5uZXcoaWdub3JlX3BhY2thZ2UgPT4gJ0NsYXNzOjpSZXR1cm5WYWx1ZScpOwoKICAgICAgICAkc2VsZi0+eydiYWNrdHJhY2UnfSA9ICR0cmFjZS0+YXNfc3RyaW5nOyAjIGxpa2UgY2FycAogICAgfQoKICAgIHJldHVybigxKTsKfQoKCj1pdGVtIGVycm5vIAoKUmV0dXJucyB0aGUgZXJybm8gaWYgdGhlcmUncyBiZWVuIGFuIGVycm9yLiBPdGhlcndpc2UsIHJldHVybiB1bmRlZgoKPWN1dAoKc3ViIGVycm5vIHsgCiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgaWYgKCRzZWxmLT57J2Vycm5vJ30pIHsKICAgICAgICByZXR1cm4gKCRzZWxmLT57J2Vycm5vJ30pOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICByZXR1cm4odW5kZWYpOwogICAgIH0KfQoKCj1pdGVtIGVycm9yX21lc3NhZ2UKCklmIHRoZXJlJ3MgYmVlbiBhbiBlcnJvciByZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UuCgo9Y3V0CgpzdWIgZXJyb3JfbWVzc2FnZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgaWYgKCRzZWxmLT57J2Vycm9yX21lc3NhZ2UnfSkgewogICAgICAgIHJldHVybigkc2VsZi0+eydlcnJvcl9tZXNzYWdlJ30pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuKHVuZGVmKTsKICAgIH0KfQoKCj1pdGVtIGJhY2t0cmFjZQoKSWYgdGhlcmUncyBiZWVuIGFuIGVycm9yIGFuZCB3ZSBhc2tlZCBmb3IgYSBiYWNrdHJhY2UsIHJldHVybiB0aGUgYmFja3RyYWNlLiAKT3RoZXJ3aXNlLCByZXR1cm4gdW5kZWYuCgo9Y3V0CgpzdWIgYmFja3RyYWNlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBpZiAoJHNlbGYtPnsnYmFja3RyYWNlJ30pIHsKICAgICAgICByZXR1cm4oJHNlbGYtPnsnYmFja3RyYWNlJ30pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuKHVuZGVmKTsKICAgIH0KfQoKPWN1dAoKPWl0ZW0gZXJyb3JfY29uZGl0aW9uCgpJZiB0aGVyZSdzIGJlZW4gYW4gZXJyb3IsIHJldHVybiB1bmRlZi4gT3RoZXJ3aXNlIHJldHVybiAxCgo9Y3V0CgpzdWIgZXJyb3JfY29uZGl0aW9uIHsgCiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgaWYgKCRzZWxmLT57J2Vycm5vJ30pIHsKICAgICAgICAgICAgcmV0dXJuICh1bmRlZik7CiAgICAgICAgfQogICAgICAgIGVsc2lmICh3YW50YXJyYXkoKSkgewogICAgICAgICAgICByZXR1cm4oQHskc2VsZi0+eydhc19hcnJheSd9fSk7CiAgICAgICAgfQogICAgICAgZWxzZSB7IAogICAgICAgICAgICByZXR1cm4oMSk7CiAgICAgICB9ICAgICAKfQoKc3ViIHJldHVybl92YWx1ZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgaWYgKHdhbnRhcnJheSkgewogICAgICAgICByZXR1cm4gKCRzZWxmLT5hc19hcnJheSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgIHJldHVybiAoJHNlbGYpOwogICAgfQp9CgoKPWhlYWQxIEFVVEhPUgogICAgCiAgICBKZXNzZSBWaW5jZW50IDxqZXNzZUBiZXN0cHJhY3RpY2FsLmNvbT4KCj1oZWFkMSBCVUdTCgogICAgVGhpcyBtb2R1bGUgaGFzLCBhcyB5ZXQsIG5vdCBiZWVuIHVzZWQgaW4gcHJvZHVjdGlvbiBjb2RlLiBJIHRoaW5nCiAgICBpdCBzaG91bGQgd29yaywgYnV0IGhhdmUgbmV2ZXIgYmVuY2htYXJrZWQgaXQuIEkgaGF2ZSBub3QgeWV0IHVzZWQKICAgIGl0IGV4dGVuc2l2ZWx5LCB0aG91Z2ggSSBkbyBwbGFuIHRvIGluIHRoZSBub3QtdG9vLWRpc3RhbnQgZnV0dXJlLgogICAgSWYgeW91IGhhdmUgcXVlc3Rpb25zIG9yIGNvbW1lbnRzLCAgcGxlYXNlIHdyaXRlIG1lLgoKICAgIElmIHlvdSBuZWVkIHRvIHJlcG9ydCBhIGJ1ZywgcGxlYXNlIHNlbmQgbWFpbCB0byAKICAgIDxidWctY2xhc3MtcmV0dXJudmFsdWVAcnQuY3Bhbi5vcmc+IG9yIHJlcG9ydCB5b3VyIGVycm9yIG9uIHRoZSB3ZWIKICAgIGF0IGh0dHA6Ly9ydC5jcGFuLm9yZy8KCj1oZWFkMSBDT1BZUklHSFQKCiAgICBDb3B5cmlnaHQgKGMpIDIwMDIsMjAwMywyMDA1LDIwMDcgSmVzc2UgVmluY2VudCA8amVzc2VAYmVzdHByYWN0aWNhbC5jb20+CiAgICBZb3UgbWF5IHVzZSwgbW9kaWZ5LCBmb2xkLCBzcGluZGxlIG9yIG11dGlsYXRlIHRoaXMgbW9kdWxlIHVuZGVyCiAgICB0aGUgc2FtZSB0ZXJtcyBhcyBwZXJsIGl0c2VsZi4KCj1oZWFkMSBTRUUgQUxTTwoKICAgIENsYXNzOjpSZXR1cm5WYWx1ZSBpc24ndCBhbiBleGNlcHRpb24gaGFuZGxlci4gSWYgaXQgZG9lc24ndAogICAgZG8gd2hhdCB5b3Ugd2FudCwgeW91IG1pZ2h0IHdhbnQgbG9vayBhdCBvbmUgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVycwogICAgYmVsb3c6CgogICAgRXJyb3IsIEV4Y2VwdGlvbiwgRXhjZXB0aW9ucywgRXhjZXB0aW9uczo6Q2xhc3MKCiAgICBZb3UgbWlnaHQgYWxzbyB3YW50IHRvIGxvb2sgYXQgQ29udGV4dHVhbDo6UmV0dXJuLCBhbm90aGVyIGltcGxlbWVudGF0aW9uCiAgICBvZiB0aGUgc2FtZSBjb25jZXB0IGFzIHRoaXMgbW9kdWxlLgoKPWN1dAoKMTsK
cGFja2FnZSBDbGFzczo6QWNjZXNzb3I7CnJlcXVpcmUgNS4wMDUwMjsKdXNlIHN0cmljdDsKJENsYXNzOjpBY2Nlc3Nvcjo6VkVSU0lPTiA9ICcwLjM0JzsKCnN1YiBuZXcgewogICAgbXkoJHByb3RvLCAkZmllbGRzKSA9IEBfOwogICAgbXkoJGNsYXNzKSA9IHJlZiAkcHJvdG8gfHwgJHByb3RvOwoKICAgICRmaWVsZHMgPSB7fSB1bmxlc3MgZGVmaW5lZCAkZmllbGRzOwoKICAgICMgbWFrZSBhIGNvcHkgb2YgJGZpZWxkcy4KICAgIGJsZXNzIHslJGZpZWxkc30sICRjbGFzczsKfQoKc3ViIG1rX2FjY2Vzc29ycyB7CiAgICBteSgkc2VsZiwgQGZpZWxkcykgPSBAXzsKCiAgICAkc2VsZi0+X21rX2FjY2Vzc29ycygncncnLCBAZmllbGRzKTsKfQoKaWYgKGV2YWwgeyByZXF1aXJlIFN1Yjo6TmFtZSB9KSB7CiAgICBTdWI6Ok5hbWUtPmltcG9ydDsKfQoKewogICAgbm8gc3RyaWN0ICdyZWZzJzsKCiAgICBzdWIgaW1wb3J0IHsKICAgICAgICBteSAoJGNsYXNzLCBAd2hhdCkgPSBAXzsKICAgICAgICBteSAkY2FsbGVyID0gY2FsbGVyOwogICAgICAgIGZvciAoQHdoYXQpIHsKICAgICAgICAgICAgaWYgKC9eKD86YW50bGVyc3xtb29zZS0/bGlrZSkkL2kpIHsKICAgICAgICAgICAgICAgICp7IiR7Y2FsbGVyfTo6aGFzIn0gPSBzdWIgewogICAgICAgICAgICAgICAgICAgIG15ICgkZiwgJWFyZ3MpID0gQF87CiAgICAgICAgICAgICAgICAgICAgJGNhbGxlci0+X21rX2FjY2Vzc29ycygoJGFyZ3N7aXN9fHwicnciKSwgJGYpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICp7IiR7Y2FsbGVyfTo6ZXh0ZW5kcyJ9ID0gc3ViIHsKICAgICAgICAgICAgICAgICAgICBAeyIke2NhbGxlcn06OklTQSJ9ID0gQF87CiAgICAgICAgICAgICAgICAgICAgdW5sZXNzIChncmVwICRfLT5jYW4oIl9ta19hY2Nlc3NvcnMiKSwgQF8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyIke2NhbGxlcn06OklTQSJ9LCAkY2xhc3M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICMgd2UnbGwgdXNlIHRoZWlyIEBJU0EgYXMgYSBkZWZhdWx0LCBpbiBjYXNlIGl0IGhhcHBlbnMgdG8gYmUKICAgICAgICAgICAgICAgICMgc2V0IGFscmVhZHkKICAgICAgICAgICAgICAgICZ7IiR7Y2FsbGVyfTo6ZXh0ZW5kcyJ9KEB7IiR7Y2FsbGVyfTo6SVNBIn0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHN1YiBmb2xsb3dfYmVzdF9wcmFjdGljZSB7CiAgICAgICAgbXkoJHNlbGYpID0gQF87CiAgICAgICAgbXkgJGNsYXNzID0gcmVmICRzZWxmIHx8ICRzZWxmOwogICAgICAgICp7IiR7Y2xhc3N9OjphY2Nlc3Nvcl9uYW1lX2ZvciJ9ICA9IFwmYmVzdF9wcmFjdGljZV9hY2Nlc3Nvcl9uYW1lX2ZvcjsKICAgICAgICAqeyIke2NsYXNzfTo6bXV0YXRvcl9uYW1lX2ZvciJ9ICA9IFwmYmVzdF9wcmFjdGljZV9tdXRhdG9yX25hbWVfZm9yOwogICAgfQoKICAgIHN1YiBfbWtfYWNjZXNzb3JzIHsKICAgICAgICBteSgkc2VsZiwgJGFjY2VzcywgQGZpZWxkcykgPSBAXzsKICAgICAgICBteSAkY2xhc3MgPSByZWYgJHNlbGYgfHwgJHNlbGY7CiAgICAgICAgbXkgJHJhID0gJGFjY2VzcyBlcSAncncnIHx8ICRhY2Nlc3MgZXEgJ3JvJzsKICAgICAgICBteSAkd2EgPSAkYWNjZXNzIGVxICdydycgfHwgJGFjY2VzcyBlcSAnd28nOwoKICAgICAgICBmb3JlYWNoIG15ICRmaWVsZCAoQGZpZWxkcykgewogICAgICAgICAgICBteSAkYWNjZXNzb3JfbmFtZSA9ICRzZWxmLT5hY2Nlc3Nvcl9uYW1lX2ZvcigkZmllbGQpOwogICAgICAgICAgICBteSAkbXV0YXRvcl9uYW1lID0gJHNlbGYtPm11dGF0b3JfbmFtZV9mb3IoJGZpZWxkKTsKICAgICAgICAgICAgaWYoICRhY2Nlc3Nvcl9uYW1lIGVxICdERVNUUk9ZJyBvciAkbXV0YXRvcl9uYW1lIGVxICdERVNUUk9ZJyApIHsKICAgICAgICAgICAgICAgICRzZWxmLT5fY2FycCgiSGF2aW5nIGEgZGF0YSBhY2Nlc3NvciBuYW1lZCBERVNUUk9ZICBpbiAnJGNsYXNzJyBpcyB1bndpc2UuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRhY2Nlc3Nvcl9uYW1lIGVxICRtdXRhdG9yX25hbWUpIHsKICAgICAgICAgICAgICAgIG15ICRhY2Nlc3NvcjsKICAgICAgICAgICAgICAgIGlmICgkcmEgJiYgJHdhKSB7CiAgICAgICAgICAgICAgICAgICAgJGFjY2Vzc29yID0gJHNlbGYtPm1ha2VfYWNjZXNzb3IoJGZpZWxkKTsKICAgICAgICAgICAgICAgIH0gZWxzaWYgKCRyYSkgewogICAgICAgICAgICAgICAgICAgICRhY2Nlc3NvciA9ICRzZWxmLT5tYWtlX3JvX2FjY2Vzc29yKCRmaWVsZCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRhY2Nlc3NvciA9ICRzZWxmLT5tYWtlX3dvX2FjY2Vzc29yKCRmaWVsZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkZnVsbG5hbWUgPSAiJHtjbGFzc306OiRhY2Nlc3Nvcl9uYW1lIjsKICAgICAgICAgICAgICAgIG15ICRzdWJuYW1lZCA9IDA7CiAgICAgICAgICAgICAgICB1bmxlc3MgKGRlZmluZWQgJnskZnVsbG5hbWV9KSB7CiAgICAgICAgICAgICAgICAgICAgc3VibmFtZSgkZnVsbG5hbWUsICRhY2Nlc3NvcikgaWYgZGVmaW5lZCAmc3VibmFtZTsKICAgICAgICAgICAgICAgICAgICAkc3VibmFtZWQgPSAxOwogICAgICAgICAgICAgICAgICAgICp7JGZ1bGxuYW1lfSA9ICRhY2Nlc3NvcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkYWNjZXNzb3JfbmFtZSBlcSAkZmllbGQpIHsKICAgICAgICAgICAgICAgICAgICAjIHRoZSBvbGQgYmVoYXZpb3VyCiAgICAgICAgICAgICAgICAgICAgbXkgJGFsaWFzID0gIiR7Y2xhc3N9OjpfJHtmaWVsZH1fYWNjZXNzb3IiOwogICAgICAgICAgICAgICAgICAgIHN1Ym5hbWUoJGFsaWFzLCAkYWNjZXNzb3IpIGlmIGRlZmluZWQgJnN1Ym5hbWUgYW5kIG5vdCAkc3VibmFtZWQ7CiAgICAgICAgICAgICAgICAgICAgKnskYWxpYXN9ID0gJGFjY2Vzc29yIHVubGVzcyBkZWZpbmVkICZ7JGFsaWFzfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG15ICRmdWxsYWNjbmFtZSA9ICIke2NsYXNzfTo6JGFjY2Vzc29yX25hbWUiOwogICAgICAgICAgICAgICAgbXkgJGZ1bGxtdXRuYW1lID0gIiR7Y2xhc3N9OjokbXV0YXRvcl9uYW1lIjsKICAgICAgICAgICAgICAgIGlmICgkcmEgYW5kIG5vdCBkZWZpbmVkICZ7JGZ1bGxhY2NuYW1lfSkgewogICAgICAgICAgICAgICAgICAgIG15ICRhY2Nlc3NvciA9ICRzZWxmLT5tYWtlX3JvX2FjY2Vzc29yKCRmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgc3VibmFtZSgkZnVsbGFjY25hbWUsICRhY2Nlc3NvcikgaWYgZGVmaW5lZCAmc3VibmFtZTsKICAgICAgICAgICAgICAgICAgICAqeyRmdWxsYWNjbmFtZX0gPSAkYWNjZXNzb3I7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJHdhIGFuZCBub3QgZGVmaW5lZCAmeyRmdWxsbXV0bmFtZX0pIHsKICAgICAgICAgICAgICAgICAgICBteSAkbXV0YXRvciA9ICRzZWxmLT5tYWtlX3dvX2FjY2Vzc29yKCRmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgc3VibmFtZSgkZnVsbG11dG5hbWUsICRtdXRhdG9yKSBpZiBkZWZpbmVkICZzdWJuYW1lOwogICAgICAgICAgICAgICAgICAgICp7JGZ1bGxtdXRuYW1lfSA9ICRtdXRhdG9yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKfQoKc3ViIG1rX3JvX2FjY2Vzc29ycyB7CiAgICBteSgkc2VsZiwgQGZpZWxkcykgPSBAXzsKCiAgICAkc2VsZi0+X21rX2FjY2Vzc29ycygncm8nLCBAZmllbGRzKTsKfQoKc3ViIG1rX3dvX2FjY2Vzc29ycyB7CiAgICBteSgkc2VsZiwgQGZpZWxkcykgPSBAXzsKCiAgICAkc2VsZi0+X21rX2FjY2Vzc29ycygnd28nLCBAZmllbGRzKTsKfQoKc3ViIGJlc3RfcHJhY3RpY2VfYWNjZXNzb3JfbmFtZV9mb3IgewogICAgbXkgKCRjbGFzcywgJGZpZWxkKSA9IEBfOwogICAgcmV0dXJuICJnZXRfJGZpZWxkIjsKfQoKc3ViIGJlc3RfcHJhY3RpY2VfbXV0YXRvcl9uYW1lX2ZvciB7CiAgICBteSAoJGNsYXNzLCAkZmllbGQpID0gQF87CiAgICByZXR1cm4gInNldF8kZmllbGQiOwp9CgpzdWIgYWNjZXNzb3JfbmFtZV9mb3IgewogICAgbXkgKCRjbGFzcywgJGZpZWxkKSA9IEBfOwogICAgcmV0dXJuICRmaWVsZDsKfQoKc3ViIG11dGF0b3JfbmFtZV9mb3IgewogICAgbXkgKCRjbGFzcywgJGZpZWxkKSA9IEBfOwogICAgcmV0dXJuICRmaWVsZDsKfQoKc3ViIHNldCB7CiAgICBteSgkc2VsZiwgJGtleSkgPSBzcGxpY2UoQF8sIDAsIDIpOwoKICAgIGlmKEBfID09IDEpIHsKICAgICAgICAkc2VsZi0+eyRrZXl9ID0gJF9bMF07CiAgICB9CiAgICBlbHNpZihAXyA+IDEpIHsKICAgICAgICAkc2VsZi0+eyRrZXl9ID0gW0BfXTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRzZWxmLT5fY3JvYWsoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgcmVjZWl2ZWQiKTsKICAgIH0KfQoKc3ViIGdldCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIGlmKEBfID09IDEpIHsKICAgICAgICByZXR1cm4gJHNlbGYtPnskX1swXX07CiAgICB9CiAgICBlbHNpZiggQF8gPiAxICkgewogICAgICAgIHJldHVybiBAeyRzZWxmfXtAX307CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkc2VsZi0+X2Nyb2FrKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIHJlY2VpdmVkIik7CiAgICB9Cn0KCnN1YiBtYWtlX2FjY2Vzc29yIHsKICAgIG15ICgkY2xhc3MsICRmaWVsZCkgPSBAXzsKCiAgICByZXR1cm4gc3ViIHsKICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgICAgICBpZihAXykgewogICAgICAgICAgICByZXR1cm4gJHNlbGYtPnNldCgkZmllbGQsIEBfKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHNlbGYtPmdldCgkZmllbGQpOwogICAgICAgIH0KICAgIH07Cn0KCnN1YiBtYWtlX3JvX2FjY2Vzc29yIHsKICAgIG15KCRjbGFzcywgJGZpZWxkKSA9IEBfOwoKICAgIHJldHVybiBzdWIgewogICAgICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgICAgIGlmIChAXykgewogICAgICAgICAgICBteSAkY2FsbGVyID0gY2FsbGVyOwogICAgICAgICAgICAkc2VsZi0+X2Nyb2FrKCInJGNhbGxlcicgY2Fubm90IGFsdGVyIHRoZSB2YWx1ZSBvZiAnJGZpZWxkJyBvbiBvYmplY3RzIG9mIGNsYXNzICckY2xhc3MnIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHNlbGYtPmdldCgkZmllbGQpOwogICAgICAgIH0KICAgIH07Cn0KCnN1YiBtYWtlX3dvX2FjY2Vzc29yIHsKICAgIG15KCRjbGFzcywgJGZpZWxkKSA9IEBfOwoKICAgIHJldHVybiBzdWIgewogICAgICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgICAgIHVubGVzcyAoQF8pIHsKICAgICAgICAgICAgbXkgJGNhbGxlciA9IGNhbGxlcjsKICAgICAgICAgICAgJHNlbGYtPl9jcm9haygiJyRjYWxsZXInIGNhbm5vdCBhY2Nlc3MgdGhlIHZhbHVlIG9mICckZmllbGQnIG9uIG9iamVjdHMgb2YgY2xhc3MgJyRjbGFzcyciKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkc2VsZi0+c2V0KCRmaWVsZCwgQF8pOwogICAgICAgIH0KICAgIH07Cn0KCgp1c2UgQ2FycCAoKTsKCnN1YiBfY2FycCB7CiAgICBteSAoJHNlbGYsICRtc2cpID0gQF87CiAgICBDYXJwOjpjYXJwKCRtc2cgfHwgJHNlbGYpOwogICAgcmV0dXJuOwp9CgpzdWIgX2Nyb2FrIHsKICAgIG15ICgkc2VsZiwgJG1zZykgPSBAXzsKICAgIENhcnA6OmNyb2FrKCRtc2cgfHwgJHNlbGYpOwogICAgcmV0dXJuOwp9CgoxOwoKX19FTkRfXwoKPWhlYWQxIE5BTUUKCiAgQ2xhc3M6OkFjY2Vzc29yIC0gQXV0b21hdGVkIGFjY2Vzc29yIGdlbmVyYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKICBwYWNrYWdlIEZvbzsKICB1c2UgYmFzZSBxdyhDbGFzczo6QWNjZXNzb3IpOwogIEZvby0+Zm9sbG93X2Jlc3RfcHJhY3RpY2U7CiAgRm9vLT5ta19hY2Nlc3NvcnMocXcobmFtZSByb2xlIHNhbGFyeSkpOwoKICAjIG9yIGlmIHlvdSBwcmVmZXIgYSBNb29zZS1saWtlIGludGVyZmFjZS4uLgogCiAgcGFja2FnZSBGb287CiAgdXNlIENsYXNzOjpBY2Nlc3NvciAiYW50bGVycyI7CiAgaGFzIG5hbWUgPT4gKCBpcyA9PiAicnciLCBpc2EgPT4gIlN0ciIgKTsKICBoYXMgcm9sZSA9PiAoIGlzID0+ICJydyIsIGlzYSA9PiAiU3RyIiApOwogIGhhcyBzYWxhcnkgPT4gKCBpcyA9PiAicnciLCBpc2EgPT4gIk51bSIgKTsKCiAgIyBNZWFud2hpbGUsIGluIGEgbmVhcmJ5IHBpZWNlIG9mIGNvZGUhCiAgIyBDbGFzczo6QWNjZXNzb3IgcHJvdmlkZXMgbmV3KCkuCiAgbXkgJG1wID0gRm9vLT5uZXcoeyBuYW1lID0+ICJNYXJ0eSIsIHJvbGUgPT4gIkpBUEgiIH0pOwoKICBteSAkam9iID0gJG1wLT5yb2xlOyAgIyBnZXRzICRtcC0+e3JvbGV9CiAgJG1wLT5zYWxhcnkoNDAwMDAwKTsgICMgc2V0cyAkbXAtPntzYWxhcnl9ID0gNDAwMDAwICMgSSB3aXNoCiAgCiAgIyBsaWtlIG15IEBpbmZvID0gQHskbXB9e3F3KG5hbWUgcm9sZSl9CiAgbXkgQGluZm8gPSAkbXAtPmdldChxdyhuYW1lIHJvbGUpKTsKICAKICAjICRtcC0+e3NhbGFyeX0gPSA0MDAwMDAKICAkbXAtPnNldCgnc2FsYXJ5JywgNDAwMDAwKTsKCgo9aGVhZDEgREVTQ1JJUFRJT04KClRoaXMgbW9kdWxlIGF1dG9tYWdpY2FsbHkgZ2VuZXJhdGVzIGFjY2Vzc29ycy9tdXRhdG9ycyBmb3IgeW91ciBjbGFzcy4KCk1vc3Qgb2YgdGhlIHRpbWUsIHdyaXRpbmcgYWNjZXNzb3JzIGlzIGFuIGV4ZXJjaXNlIGluIGN1dHRpbmcgYW5kCnBhc3RpbmcuICBZb3UgdXN1YWxseSB3aW5kIHVwIHdpdGggYSBzZXJpZXMgb2YgbWV0aG9kcyBsaWtlIHRoaXM6CgogICAgc3ViIG5hbWUgewogICAgICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgICAgaWYoQF8pIHsKICAgICAgICAgICAgJHNlbGYtPntuYW1lfSA9ICRfWzBdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHNlbGYtPntuYW1lfTsKICAgIH0KCiAgICBzdWIgc2FsYXJ5IHsKICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgICAgIGlmKEBfKSB7CiAgICAgICAgICAgICRzZWxmLT57c2FsYXJ5fSA9ICRfWzBdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHNlbGYtPntzYWxhcnl9OwogICAgfQoKICAjIGV0Yy4uLgoKT25lIGZvciBlYWNoIHBpZWNlIG9mIGRhdGEgaW4geW91ciBvYmplY3QuICBXaGlsZSBzb21lIHdpbGwgYmUgdW5pcXVlLApkb2luZyB2YWx1ZSBjaGVja3MgYW5kIHNwZWNpYWwgc3RvcmFnZSB0cmlja3MsIG1vc3Qgd2lsbCBzaW1wbHkgYmUKZXhlcmNpc2VzIGluIHJlcGV0aXRpb24uICBOb3Qgb25seSBpcyBpdCBCYWQgU3R5bGUgdG8gaGF2ZSBhIGJ1bmNoIG9mCnJlcGV0aXRpb3VzIGNvZGUsIGJ1dCBpdCdzIGFsc28gc2ltcGx5IG5vdCBsYXp5LCB3aGljaCBpcyB0aGUgcmVhbAp0cmFnZWR5LgoKSWYgeW91IG1ha2UgeW91ciBtb2R1bGUgYSBzdWJjbGFzcyBvZiBDbGFzczo6QWNjZXNzb3IgYW5kIGRlY2xhcmUgeW91cgphY2Nlc3NvciBmaWVsZHMgd2l0aCBta19hY2Nlc3NvcnMoKSB0aGVuIHlvdSdsbCBmaW5kIHlvdXJzZWxmIHdpdGggYQpzZXQgb2YgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYWNjZXNzb3JzIHdoaWNoIGNhbiBldmVuIGJlCmN1c3RvbWl6ZWQhCgpUaGUgYmFzaWMgc2V0IHVwIGlzIHZlcnkgc2ltcGxlOgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+bWtfYWNjZXNzb3JzKCBxdyhmYXIgYmFyIGNhcikgKTsKCkRvbmUuICBGb28gbm93IGhhcyBzaW1wbGUgZmFyKCksIGJhcigpIGFuZCBjYXIoKSBhY2Nlc3NvcnMKZGVmaW5lZC4KCkFsdGVybmF0aXZlbHksIGlmIHlvdSB3YW50IHRvIGZvbGxvdyBEYW1pYW4ncyBJPGJlc3QgcHJhY3RpY2U+IGd1aWRlbGluZXMgCnlvdSBjYW4gdXNlOgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+Zm9sbG93X2Jlc3RfcHJhY3RpY2U7CiAgICBGb28tPm1rX2FjY2Vzc29ycyggcXcoZmFyIGJhciBjYXIpICk7CgpCPE5vdGU6PiB5b3UgbXVzdCBjYWxsIEM8Zm9sbG93X2Jlc3RfcHJhY3RpY2U+IGJlZm9yZSBjYWxsaW5nIEM8bWtfYWNjZXNzb3JzPi4KCj1oZWFkMiBNb29zZS1saWtlCgpCeSBwb3B1bGFyIGRlbWFuZCB3ZSBub3cgaGF2ZSBhIHNpbXBsZSBNb29zZS1saWtlIGludGVyZmFjZS4gIFlvdSBjYW4gbm93IGRvOgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIENsYXNzOjpBY2Nlc3NvciAiYW50bGVycyI7CiAgICBoYXMgZmFyID0+ICggaXMgPT4gInJ3IiApOwogICAgaGFzIGJhciA9PiAoIGlzID0+ICJydyIgKTsKICAgIGhhcyBjYXIgPT4gKCBpcyA9PiAicnciICk7CgpDdXJyZW50bHkgb25seSB0aGUgQzxpcz4gYXR0cmlidXRlIGlzIHN1cHBvcnRlZC4KCj1oZWFkMSBDT05TVFJVQ1RPUgoKQ2xhc3M6OkFjY2Vzc29yIHByb3ZpZGVzIGEgYmFzaWMgY29uc3RydWN0b3IsIEM8bmV3Pi4gIEl0IGdlbmVyYXRlcyBhCmhhc2gtYmFzZWQgb2JqZWN0IGFuZCBjYW4gYmUgY2FsbGVkIGFzIGVpdGhlciBhIGNsYXNzIG1ldGhvZCBvciBhbgpvYmplY3QgbWV0aG9kLiAgCgo9aGVhZDIgbmV3CgogICAgbXkgJG9iaiA9IEZvby0+bmV3OwogICAgbXkgJG9iaiA9ICRvdGhlcl9vYmotPm5ldzsKCiAgICBteSAkb2JqID0gRm9vLT5uZXcoXCVmaWVsZHMpOwogICAgbXkgJG9iaiA9ICRvdGhlcl9vYmotPm5ldyhcJWZpZWxkcyk7CgpJdCB0YWtlcyBhbiBvcHRpb25hbCAlZmllbGRzIGhhc2ggd2hpY2ggaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZQpvYmplY3QgKGhhbmR5IGlmIHlvdSB1c2UgcmVhZC1vbmx5IGFjY2Vzc29ycykuICBUaGUgZmllbGRzIG9mIHRoZSBoYXNoCmNvcnJlc3BvbmQgdG8gdGhlIG5hbWVzIG9mIHlvdXIgYWNjZXNzb3JzLCBzby4uLgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+bWtfYWNjZXNzb3JzKCdmb28nKTsKCiAgICBteSAkb2JqID0gRm9vLT5uZXcoeyBmb28gPT4gNDIgfSk7CiAgICBwcmludCAkb2JqLT5mb287ICAgICMgNDIKCmhvd2V2ZXIgJWZpZWxkcyBjYW4gY29udGFpbiBhbnl0aGluZywgbmV3KCkgd2lsbCBzaG92ZSB0aGVtIGFsbCBpbnRvCnlvdXIgb2JqZWN0LgoKPWhlYWQxIE1BS0lORyBBQ0NFU1NPUlMKCj1oZWFkMiBmb2xsb3dfYmVzdF9wcmFjdGljZQoKSW4gRGFtaWFuJ3MgUGVybCBCZXN0IFByYWN0aWNlcyBib29rIGhlIHJlY29tbWVuZHMgc2VwYXJhdGUgZ2V0IGFuZCBzZXQgbWV0aG9kcwp3aXRoIHRoZSBwcmVmaXggc2V0XyBhbmQgZ2V0XyB0byBtYWtlIGl0IGV4cGxpY2l0IHdoYXQgeW91IGludGVuZCB0byBkby4gIElmIHlvdQp3YW50IHRvIGNyZWF0ZSB0aG9zZSBhY2Nlc3NvciBtZXRob2RzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lcywgY2FsbDoKCiAgICBfX1BBQ0tBR0VfXy0+Zm9sbG93X2Jlc3RfcHJhY3RpY2UKCkI8YmVmb3JlPiB5b3UgY2FsbCBhbnkgb2YgdGhlIGFjY2Vzc29yLW1ha2luZyBtZXRob2RzLgoKPWhlYWQyIGFjY2Vzc29yX25hbWVfZm9yIC8gbXV0YXRvcl9uYW1lX2ZvcgoKWW91IG1heSBoYXZlIHlvdXIgb3duIGNyYXp5IGlkZWFzIGZvciB0aGUgbmFtZXMgb2YgdGhlIGFjY2Vzc29ycywgc28geW91IGNhbgptYWtlIHRob3NlIGhhcHBlbiBieSBvdmVycmlkaW5nIEM8YWNjZXNzb3JfbmFtZV9mb3I+IGFuZCBDPG11dGF0b3JfbmFtZV9mb3I+IGluCnlvdXIgc3ViY2xhc3MuICAoSSBjb3BpZWQgdGhhdCBpZGVhIGZyb20gQ2xhc3M6OkRCSS4pCgo9aGVhZDIgbWtfYWNjZXNzb3JzCgogICAgX19QQUNLQUdFX18tPm1rX2FjY2Vzc29ycyhAZmllbGRzKTsKClRoaXMgY3JlYXRlcyBhY2Nlc3Nvci9tdXRhdG9yIG1ldGhvZHMgZm9yIGVhY2ggbmFtZWQgZmllbGQgZ2l2ZW4gaW4KQGZpZWxkcy4gIEZvcmVhY2ggZmllbGQgaW4gQGZpZWxkcyBpdCB3aWxsIGdlbmVyYXRlIHR3byBhY2Nlc3NvcnMuCk9uZSBjYWxsZWQgImZpZWxkKCkiIGFuZCB0aGUgb3RoZXIgY2FsbGVkICJfZmllbGRfYWNjZXNzb3IoKSIuICBGb3IKZXhhbXBsZToKCiAgICAjIEdlbmVyYXRlcyBmb28oKSwgX2Zvb19hY2Nlc3NvcigpLCBiYXIoKSBhbmQgX2Jhcl9hY2Nlc3NvcigpLgogICAgX19QQUNLQUdFX18tPm1rX2FjY2Vzc29ycyhxdyhmb28gYmFyKSk7CgpTZWUgTDxDQVZFQVRTIEFORCBUUklDS1MvIk92ZXJyaWRpbmcgYXV0b2dlbmVyYXRlZCBhY2Nlc3NvcnMiPgpmb3IgZGV0YWlscy4KCj1oZWFkMiBta19yb19hY2Nlc3NvcnMKCiAgX19QQUNLQUdFX18tPm1rX3JvX2FjY2Vzc29ycyhAcmVhZF9vbmx5X2ZpZWxkcyk7CgpTYW1lIGFzIG1rX2FjY2Vzc29ycygpIGV4Y2VwdCBpdCB3aWxsIGdlbmVyYXRlIHJlYWQtb25seSBhY2Nlc3NvcnMKKGllLiB0cnVlIGFjY2Vzc29ycykuICBJZiB5b3UgYXR0ZW1wdCB0byBzZXQgYSB2YWx1ZSB3aXRoIHRoZXNlCmFjY2Vzc29ycyBpdCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4gIEl0IG9ubHkgdXNlcyBnZXQoKSBhbmQgbm90CnNldCgpLgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+bWtfcm9fYWNjZXNzb3JzKHF3KGZvbyBiYXIpKTsKCiAgICAjIExldCdzIGFzc3VtZSB3ZSBoYXZlIGFuIG9iamVjdCAkZm9vIG9mIGNsYXNzIEZvby4uLgogICAgcHJpbnQgJGZvby0+Zm9vOyAgIyBvaywgcHJpbnRzIHdoYXRldmVyIHRoZSB2YWx1ZSBvZiAkZm9vLT57Zm9vfSBpcwogICAgJGZvby0+Zm9vKDQyKTsgICAgIyBCT09NISAgTmF1Z2h0eSB5b3UuCgoKPWhlYWQyIG1rX3dvX2FjY2Vzc29ycwoKICBfX1BBQ0tBR0VfXy0+bWtfd29fYWNjZXNzb3JzKEB3cml0ZV9vbmx5X2ZpZWxkcyk7CgpTYW1lIGFzIG1rX2FjY2Vzc29ycygpIGV4Y2VwdCBpdCB3aWxsIGdlbmVyYXRlIHdyaXRlLW9ubHkgYWNjZXNzb3JzCihpZS4gbXV0YXRvcnMpLiAgSWYgeW91IGF0dGVtcHQgdG8gcmVhZCBhIHZhbHVlIHdpdGggdGhlc2UgYWNjZXNzb3JzCml0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLiAgSXQgb25seSB1c2VzIHNldCgpIGFuZCBub3QgZ2V0KCkuCgpCPE5PVEU+IEknbSBub3QgZW50aXJlbHkgc3VyZSB3aHkgdGhpcyBpcyB1c2VmdWwsIGJ1dCBJJ20gc3VyZSBzb21lb25lCndpbGwgbmVlZCBpdC4gIElmIHlvdSd2ZSBmb3VuZCBhIHVzZSwgbGV0IG1lIGtub3cuICBSaWdodCBub3cgaXQncyBoZXJlCmZvciBvcnRob2dpbmFsaXR5IGFuZCBiZWNhdXNlIGl0J3MgZWFzeSB0byBpbXBsZW1lbnQuCgogICAgcGFja2FnZSBGb287CiAgICB1c2UgYmFzZSBxdyhDbGFzczo6QWNjZXNzb3IpOwogICAgRm9vLT5ta193b19hY2Nlc3NvcnMocXcoZm9vIGJhcikpOwoKICAgICMgTGV0J3MgYXNzdW1lIHdlIGhhdmUgYW4gb2JqZWN0ICRmb28gb2YgY2xhc3MgRm9vLi4uCiAgICAkZm9vLT5mb28oNDIpOyAgICAgICMgT0suICBTZXRzICRzZWxmLT57Zm9vfSA9IDQyCiAgICBwcmludCAkZm9vLT5mb287ICAgICMgQk9PTSEgIENhbid0IHJlYWQgZnJvbSB0aGlzIGFjY2Vzc29yLgoKPWhlYWQxIE1vb3NlIQoKSWYgeW91IHByZWZlciBhIE1vb3NlLWxpa2UgaW50ZXJmYWNlIHRvIGNyZWF0ZSBhY2Nlc3NvcnMsIHlvdSBjYW4gdXNlIEM8aGFzPiBieQppbXBvcnRpbmcgdGhpcyBtb2R1bGUgbGlrZSB0aGlzOgoKICB1c2UgQ2xhc3M6OkFjY2Vzc29yICJhbnRsZXJzIjsKCm9yCgogIHVzZSBDbGFzczo6QWNjZXNzb3IgIm1vb3NlLWxpa2UiOwoKVGhlbiB5b3UgY2FuIGRlY2xhcmUgYWNjZXNzb3JzIGxpa2UgdGhpczoKCiAgaGFzIGFscGhhID0+ICggaXMgPT4gInJ3IiwgaXNhID0+ICJTdHIiICk7CiAgaGFzIGJldGEgID0+ICggaXMgPT4gInJvIiwgaXNhID0+ICJTdHIiICk7CiAgaGFzIGdhbW1hID0+ICggaXMgPT4gIndvIiwgaXNhID0+ICJTdHIiICk7CgpDdXJyZW50bHkgb25seSB0aGUgQzxpcz4gYXR0cmlidXRlIGlzIHN1cHBvcnRlZC4gIEFuZCBvdXIgQzxpcz4gYWxzbyBzdXBwb3J0cwp0aGUgIndvIiB2YWx1ZSB0byBtYWtlIGEgd3JpdGUtb25seSBhY2Nlc3Nvci4KCklmIHlvdSBhcmUgdXNpbmcgdGhlIE1vb3NlLWxpa2UgaW50ZXJmYWNlIHRoZW4geW91IHNob3VsZCB1c2UgdGhlIEM8ZXh0ZW5kcz4KcmF0aGVyIHRoYW4gdHdlYWtpbmcgeW91ciBDPEBJU0E+IGRpcmVjdGx5LiAgQmFzaWNhbGx5LCByZXBsYWNlCgogIEBJU0EgPSBxdy9Gb28gQmFyLzsKCndpdGgKCiAgZXh0ZW5kcyhxdy9Gb28gQmFyLyk7Cgo9aGVhZDEgREVUQUlMUwoKQW4gYWNjZXNzb3IgZ2VuZXJhdGVkIGJ5IENsYXNzOjpBY2Nlc3NvciBsb29rcyBzb21ldGhpbmcgbGlrZQp0aGlzOgoKICAgICMgWW91ciBmb28gbWF5IHZhcnkuCiAgICBzdWIgZm9vIHsKICAgICAgICBteSgkc2VsZikgPSBzaGlmdDsKICAgICAgICBpZihAXykgeyAgICAjIHNldAogICAgICAgICAgICByZXR1cm4gJHNlbGYtPnNldCgnZm9vJywgQF8pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRzZWxmLT5nZXQoJ2ZvbycpOwogICAgICAgIH0KICAgIH0KClZlcnkgc2ltcGxlLiAgQWxsIGl0IGRvZXMgaXMgZGV0ZXJtaW5lIGlmIHlvdSdyZSB3YW50aW5nIHRvIHNldCBhCnZhbHVlIG9yIGdldCBhIHZhbHVlIGFuZCBjYWxscyB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kLgpDbGFzczo6QWNjZXNzb3IgcHJvdmlkZXMgZGVmYXVsdCBnZXQoKSBhbmQgc2V0KCkgbWV0aG9kcyB3aGljaAp5b3VyIGNsYXNzIGNhbiBvdmVycmlkZS4gIFRoZXkncmUgZGV0YWlsZWQgbGF0ZXIuCgo9aGVhZDIgTW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvZiB0aGUgYWNjZXNzb3IKClJhdGhlciB0aGFuIGFjdHVhbGx5IG1vZGlmeWluZyB0aGUgYWNjZXNzb3IgaXRzZWxmLCBpdCBpcyBtdWNoIG1vcmUKc2Vuc2libGUgdG8gc2ltcGx5IG92ZXJyaWRlIHRoZSB0d28ga2V5IG1ldGhvZHMgd2hpY2ggdGhlIGFjY2Vzc29yCmNhbGxzLiAgTmFtZWx5IHNldCgpIGFuZCBnZXQoKS4KCklmIHlvdSAtcmVhbGx5LSB3YW50IHRvLCB5b3UgY2FuIG92ZXJyaWRlIG1ha2VfYWNjZXNzb3IoKS4KCj1oZWFkMiBzZXQKCiAgICAkb2JqLT5zZXQoJGtleSwgJHZhbHVlKTsKICAgICRvYmotPnNldCgka2V5LCBAdmFsdWVzKTsKCnNldCgpIGRlZmluZXMgaG93IGdlbmVyYWxseSBvbmUgc3RvcmVzIGRhdGEgaW4gdGhlIG9iamVjdC4KCm92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNoYW5nZSBob3cgZGF0YSBpcyBzdG9yZWQgYnkgeW91ciBhY2Nlc3NvcnMuCgo9aGVhZDIgZ2V0CgogICAgJHZhbHVlICA9ICRvYmotPmdldCgka2V5KTsKICAgIEB2YWx1ZXMgPSAkb2JqLT5nZXQoQGtleXMpOwoKZ2V0KCkgZGVmaW5lcyBob3cgZGF0YSBpcyByZXRyZWl2ZWQgZnJvbSB5b3VyIG9iamVjdHMuCgpvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjaGFuZ2UgaG93IGl0IGlzIHJldHJlaXZlZC4KCj1oZWFkMiBtYWtlX2FjY2Vzc29yCgogICAgJGFjY2Vzc29yID0gX19QQUNLQUdFX18tPm1ha2VfYWNjZXNzb3IoJGZpZWxkKTsKCkdlbmVyYXRlcyBhIHN1YnJvdXRpbmUgcmVmZXJlbmNlIHdoaWNoIGFjdHMgYXMgYW4gYWNjZXNzb3IgZm9yIHRoZSBnaXZlbgokZmllbGQuICBJdCBjYWxscyBnZXQoKSBhbmQgc2V0KCkuCgpJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHlvdXIgYWNjZXNzb3JzLCB0cnkgb3ZlcnJpZGluZwpnZXQoKSBhbmQgc2V0KCkgYmVmb3JlIHlvdSBzdGFydCBtdWNraW5nIHdpdGggbWFrZV9hY2Nlc3NvcigpLgoKPWhlYWQyIG1ha2Vfcm9fYWNjZXNzb3IKCiAgICAkcmVhZF9vbmx5X2FjY2Vzc29yID0gX19QQUNLQUdFX18tPm1ha2Vfcm9fYWNjZXNzb3IoJGZpZWxkKTsKCkdlbmVyYXRlcyBhIHN1YnJvdXRpbmUgcmVmcmVuY2Ugd2hpY2ggYWN0cyBhcyBhIHJlYWQtb25seSBhY2Nlc3NvciBmb3IKdGhlIGdpdmVuICRmaWVsZC4gIEl0IG9ubHkgY2FsbHMgZ2V0KCkuCgpPdmVycmlkZSBnZXQoKSB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHlvdXIgYWNjZXNzb3JzLgoKPWhlYWQyIG1ha2Vfd29fYWNjZXNzb3IKCiAgICAkcmVhZF9vbmx5X2FjY2Vzc29yID0gX19QQUNLQUdFX18tPm1ha2Vfd29fYWNjZXNzb3IoJGZpZWxkKTsKCkdlbmVyYXRlcyBhIHN1YnJvdXRpbmUgcmVmcmVuY2Ugd2hpY2ggYWN0cyBhcyBhIHdyaXRlLW9ubHkgYWNjZXNzb3IKKG11dGF0b3IpIGZvciB0aGUgZ2l2ZW4gJGZpZWxkLiAgSXQgb25seSBjYWxscyBzZXQoKS4KCk92ZXJyaWRlIHNldCgpIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgeW91ciBhY2Nlc3NvcnMuCgo9aGVhZDEgRVhDRVBUSU9OUwoKSWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgQ2xhc3M6OkFjY2Vzc29yIHdpbGwgd2FybiBvciBkaWUgYnkgY2FsbGluZyBDYXJwOjpjYXJwCm9yIENhcnA6OmNyb2FrLiAgSWYgeW91IGRvbid0IGxpa2UgdGhpcyB5b3UgY2FuIG92ZXJyaWRlIF9jYXJwKCkgYW5kIF9jcm9haygpIGluCnlvdXIgc3ViY2xhc3MgYW5kIGRvIHdoYXRldmVyIGVsc2UgeW91IHdhbnQuCgo9aGVhZDEgRUZGSUNJRU5DWQoKQ2xhc3M6OkFjY2Vzc29yIGRvZXMgbm90IGVtcGxveSBhbiBhdXRvbG9hZGVyLCB0aHVzIGl0IGlzIG11Y2ggZmFzdGVyCnRoYW4geW91J2QgdGhpbmsuICBJdHMgZ2VuZXJhdGVkIG1ldGhvZHMgaW5jdXIgbm8gc3BlY2lhbCBwZW5hbHR5IG92ZXIKb25lcyB5b3UnZCB3cml0ZSB5b3Vyc2VsZi4KCiAgYWNjZXNzb3JzOgogICAgICAgICAgICAgIFJhdGUgIEJhc2ljICAgRmFzdCBGYXN0ZXIgRGlyZWN0CiAgQmFzaWMgICAzNjc1ODkvcyAgICAgLS0gICAtNTElICAgLTU1JSAgIC04OSUKICBGYXN0ICAgIDc0Nzk2NC9zICAgMTAzJSAgICAgLS0gICAgLTklICAgLTc3JQogIEZhc3RlciAgODE5MTk5L3MgICAxMjMlICAgIDEwJSAgICAgLS0gICAtNzUlCiAgRGlyZWN0IDMyNDU4ODcvcyAgIDc4MyUgICAzMzQlICAgMjk2JSAgICAgLS0KCiAgbXV0YXRvcnM6CiAgICAgICAgICAgICAgUmF0ZSAgICBBY2MgICBGYXN0IEZhc3RlciBEaXJlY3QKICBBY2MgICAgIDI2NTU2NC9zICAgICAtLSAgIC01NCUgICAtNjMlICAgLTkxJQogIEZhc3QgICAgNTczNDM5L3MgICAxMTYlICAgICAtLSAgIC0yMSUgICAtODAlCiAgRmFzdGVyICA3MjQ3MTAvcyAgIDE3MyUgICAgMjYlICAgICAtLSAgIC03NSUKICBEaXJlY3QgMjg2MDk3OS9zICAgOTc3JSAgIDM5OSUgICAyOTUlICAgICAtLQoKQ2xhc3M6OkFjY2Vzc29yOjpGYXN0IGlzIGZhc3RlciB0aGFuIG1ldGhvZHMgd3JpdHRlbiBieSBhbiBhdmVyYWdlIHByb2dyYW1tZXIKKHdoZXJlICJhdmVyYWdlIiBpcyBiYXNlZCBvbiBTY2h3ZXJuJ3MgZXhhbXBsZSBjb2RlKS4KCkNsYXNzOjpBY2Nlc3NvciBpcyBzbG93ZXIgdGhhbiBhdmVyYWdlLCBidXQgbW9yZSBmbGV4aWJsZS4KCkNsYXNzOjpBY2Nlc3Nvcjo6RmFzdGVyIGlzIGV2ZW4gZmFzdGVyIHRoYW4gQ2xhc3M6OkFjY2Vzc29yOjpGYXN0LiAgSXQgdXNlcyBhbgphcnJheSBpbnRlcm5hbGx5LCBub3QgYSBoYXNoLiAgVGhpcyBjb3VsZCBiZSBhIGdvb2Qgb3IgYmFkIGZlYXR1cmUgZGVwZW5kaW5nIG9uCnlvdXIgcG9pbnQgb2Ygdmlldy4KCkRpcmVjdCBoYXNoIGFjY2VzcyBpcywgb2YgY291cnNlLCBtdWNoIGZhc3RlciB0aGFuIGFsbCBvZiB0aGVzZSwgYnV0IGl0CnByb3ZpZGVzIG5vIGVuY2Fwc3VsYXRpb24uCgpPZiBjb3Vyc2UsIGl0J3Mgbm90IGFzIHNpbXBsZSBhcyBzYXlpbmcgIkNsYXNzOjpBY2Nlc3NvciBpcyBzbG93ZXIgdGhhbgphdmVyYWdlIi4gIFRoZXNlIGFyZSBiZW5jaG1hcmtzIGZvciBhIHNpbXBsZSBhY2Nlc3Nvci4gIElmIHlvdXIgYWNjZXNzb3JzIGRvCmFueSBzb3J0IG9mIGNvbXBsaWNhdGVkIHdvcmsgKHN1Y2ggYXMgdGFsa2luZyB0byBhIGRhdGFiYXNlIG9yIHdyaXRpbmcgdG8gYQpmaWxlKSB0aGUgdGltZSBzcGVudCBkb2luZyB0aGF0IHdvcmsgd2lsbCBxdWlja2x5IHN3YW1wIHRoZSB0aW1lIHNwZW5kIGp1c3QKY2FsbGluZyB0aGUgYWNjZXNzb3IuICBJbiB0aGF0IGNhc2UsIENsYXNzOjpBY2Nlc3NvciBhbmQgdGhlIG9uZXMgeW91IHdyaXRlCndpbGwgYmUgcm91Z2hseSB0aGUgc2FtZSBzcGVlZC4KCgo9aGVhZDEgRVhBTVBMRVMKCkhlcmUncyBhbiBleGFtcGxlIG9mIGdlbmVyYXRpbmcgYW4gYWNjZXNzb3IgZm9yIGV2ZXJ5IHB1YmxpYyBmaWVsZCBvZgp5b3VyIGNsYXNzLgoKICAgIHBhY2thZ2UgQWx0b2lkczsKICAgIAogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yIENsYXNzOjpGaWVsZHMpOwogICAgdXNlIGZpZWxkcyBxdyhjdXJpb3VzbHkgc3Ryb25nIG1pbnRzKTsKICAgIEFsdG9pZHMtPm1rX2FjY2Vzc29ycyggQWx0b2lkcy0+c2hvd19maWVsZHMoJ1B1YmxpYycpICk7CgogICAgc3ViIG5ldyB7CiAgICAgICAgbXkgJHByb3RvID0gc2hpZnQ7CiAgICAgICAgbXkgJGNsYXNzID0gcmVmICRwcm90byB8fCAkcHJvdG87CiAgICAgICAgcmV0dXJuIGZpZWxkczo6bmV3KCRjbGFzcyk7CiAgICB9CgogICAgbXkgQWx0b2lkcyAkdGluID0gQWx0b2lkcy0+bmV3OwoKICAgICR0aW4tPmN1cmlvdXNseSgnQ3VyaW91c2VyIGFuZCBjdXJpb3VzZXInKTsKICAgIHByaW50ICR0aW4tPntjdXJpb3VzbHl9OyAgICAjIHByaW50cyAnQ3VyaW91c2VyIGFuZCBjdXJpb3VzZXInCgogICAgCiAgICAjIFN1YmNsYXNzaW5nIHdvcmtzLCB0b28uCiAgICBwYWNrYWdlIE1pbnQ6OlNudWZmOwogICAgdXNlIGJhc2UgcXcoQWx0b2lkcyk7CgogICAgbXkgTWludDo6U251ZmYgJHBvdWNoID0gTWludDo6U251ZmYtPm5ldzsKICAgICRwb3VjaC0+c3Ryb25nKCdCbG93IHlvdXIgaGVhZCBvZmYhJyk7CiAgICBwcmludCAkcG91Y2gtPntzdHJvbmd9OyAgICAgIyBwcmludHMgJ0Jsb3cgeW91ciBoZWFkIG9mZiEnCgoKSGVyZSdzIGEgc2ltcGxlIGV4YW1wbGUgb2YgYWx0ZXJpbmcgdGhlIGJlaGF2aW9yIG9mIHlvdXIgYWNjZXNzb3JzLgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+bWtfYWNjZXNzb3JzKHF3KHRoaXMgdGhhdCB1cCBkb3duKSk7CgogICAgc3ViIGdldCB7CiAgICAgICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICAgICAgIyBOb3RlIGV2ZXJ5IHRpbWUgc29tZW9uZSBnZXRzIHNvbWUgZGF0YS4KICAgICAgICBwcmludCBTVERFUlIgIkdldHRpbmcgQF9cbiI7CgogICAgICAgICRzZWxmLT5TVVBFUjo6Z2V0KEBfKTsKICAgIH0KCiAgICBzdWIgc2V0IHsKICAgICAgICBteSAoJHNlbGYsICRrZXkpID0gc3BsaWNlKEBfLCAwLCAyKTsKCiAgICAgICAgIyBOb3RlIGV2ZXJ5IHRpbWUgc29tZW9uZSBzZXRzIHNvbWUgZGF0YS4KICAgICAgICBwcmludCBTVERFUlIgIlNldHRpbmcgJGtleSB0byBAX1xuIjsKCiAgICAgICAgJHNlbGYtPlNVUEVSOjpzZXQoJGtleSwgQF8pOwogICAgfQoKCj1oZWFkMSBDQVZFQVRTIEFORCBUUklDS1MKCkNsYXNzOjpBY2Nlc3NvciBoYXMgdG8gZG8gc29tZSBpbnRlcm5hbCB3YWNraW5lc3MgdG8gZ2V0IGl0cwpqb2IgZG9uZSBxdWlja2x5IGFuZCBlZmZpY2llbnRseS4gIEJlY2F1c2Ugb2YgdGhpcywgdGhlcmUncyBhIGZldwp0cmlja3MgYW5kIHRyYXBzIG9uZSBtdXN0IGtub3cgYWJvdXQuCgpIZXksIG5vdGhpbmcncyBwZXJmZWN0LgoKPWhlYWQyIERvbid0IG1ha2UgYSBmaWVsZCBjYWxsZWQgREVTVFJPWQoKVGhpcyBpcyBiYWQuICBTaW5jZSBERVNUUk9ZIGlzIGEgbWFnaWNhbCBtZXRob2QgaXQgd291bGQgYmUgYmFkIGZvciB1cwp0byBkZWZpbmUgYW4gYWNjZXNzb3IgdXNpbmcgdGhhdCBuYW1lLiAgQ2xhc3M6OkFjY2Vzc29yIHdpbGwKY2FycCBpZiB5b3UgdHJ5IHRvIHVzZSBpdCB3aXRoIGEgZmllbGQgbmFtZWQgIkRFU1RST1kiLgoKPWhlYWQyIE92ZXJyaWRpbmcgYXV0b2dlbmVyYXRlZCBhY2Nlc3NvcnMKCllvdSBtYXkgd2FudCB0byBvdmVycmlkZSB0aGUgYXV0b2dlbmVyYXRlZCBhY2Nlc3NvciB3aXRoIHlvdXIgb3duLCB5ZXQKaGF2ZSB5b3VyIGN1c3RvbSBhY2Nlc3NvciBjYWxsIHRoZSBkZWZhdWx0IG9uZS4gIEZvciBpbnN0YW5jZSwgbWF5YmUKeW91IHdhbnQgdG8gaGF2ZSBhbiBhY2Nlc3NvciB3aGljaCBjaGVja3MgaXRzIGlucHV0LiAgTm9ybWFsbHksIG9uZQp3b3VsZCBleHBlY3QgdGhpcyB0byB3b3JrOgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+bWtfYWNjZXNzb3JzKHF3KGVtYWlsIHRoaXMgdGhhdCB3aGF0ZXZlcikpOwoKICAgICMgT25seSBhY2NlcHQgYWRkcmVzc2VzIHdoaWNoIGxvb2sgdmFsaWQuCiAgICBzdWIgZW1haWwgewogICAgICAgIG15KCRzZWxmKSA9IHNoaWZ0OwogICAgICAgIG15KCRlbWFpbCkgPSBAXzsKCiAgICAgICAgaWYoIEBfICkgeyAgIyBTZXR0aW5nCiAgICAgICAgICAgIHJlcXVpcmUgRW1haWw6OlZhbGlkOwogICAgICAgICAgICB1bmxlc3MoIEVtYWlsOjpWYWxpZC0+YWRkcmVzcygkZW1haWwpICkgewogICAgICAgICAgICAgICAgY2FycCgiJGVtYWlsIGRvZXNuJ3QgbG9vayBsaWtlIGEgdmFsaWQgYWRkcmVzcy4iKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzZWxmLT5TVVBFUjo6ZW1haWwoQF8pOwogICAgfQoKVGhlcmUncyBhIHN1YnRsZSBwcm9ibGVtIGluIHRoZSBsYXN0IGV4YW1wbGUsIGFuZCBpdCdzIGluIHRoaXMgbGluZToKCiAgICByZXR1cm4gJHNlbGYtPlNVUEVSOjplbWFpbChAXyk7CgpJZiB3ZSBsb29rIGF0IGhvdyBGb28gd2FzIGRlZmluZWQsIGl0IGNhbGxlZCBta19hY2Nlc3NvcnMoKSB3aGljaApzdHVjayBlbWFpbCgpIHJpZ2h0IGludG8gRm9vJ3MgbmFtZXNwYWNlLiAgVGhlcmUgKmlzKiBubwpTVVBFUjo6ZW1haWwoKSB0byBkZWxlZ2F0ZSB0byEgIFR3byB3YXlzIGFyb3VuZCB0aGlzLi4uIGZpcnN0IGlzIHRvCm1ha2UgYSAicHVyZSIgYmFzZSBjbGFzcyBmb3IgRm9vLiAgVGhpcyBwdXJlIGNsYXNzIHdpbGwgZ2VuZXJhdGUgdGhlCmFjY2Vzc29ycyBhbmQgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IHN1cGVyIGNsYXNzIGZvciBGb28gdG8gdXNlOgoKICAgIHBhY2thZ2UgUHVyZTo6T3JnYW5pYzo6Rm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIFB1cmU6Ok9yZ2FuaWM6OkZvby0+bWtfYWNjZXNzb3JzKHF3KGVtYWlsIHRoaXMgdGhhdCB3aGF0ZXZlcikpOwoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoUHVyZTo6T3JnYW5pYzo6Rm9vKTsKCkFuZCBub3cgRm9vOjplbWFpbCgpIGNhbiBvdmVycmlkZSB0aGUgZ2VuZXJhdGVkClB1cmU6Ok9yZ2FuaWM6OkZvbzo6ZW1haWwoKSBhbmQgdXNlIGl0IGFzIFNVUEVSOjplbWFpbCgpLgoKVGhpcyBpcyBwcm9iYWJseSB0aGUgbW9zdCBvYnZpb3VzIHNvbHV0aW9uIHRvIGV2ZXJ5b25lIGJ1dCBtZS4KSW5zdGVhZCwgd2hhdCBmaXJzdCBtYWRlIHNlbnNlIHRvIG1lIHdhcyBmb3IgbWtfYWNjZXNzb3JzKCkgdG8gZGVmaW5lCmFuIGFsaWFzIG9mIGVtYWlsKCksIF9lbWFpbF9hY2Nlc3NvcigpLiAgVXNpbmcgdGhpcyBzb2x1dGlvbiwKRm9vOjplbWFpbCgpIHdvdWxkIGJlIHdyaXR0ZW4gd2l0aDoKCiAgICByZXR1cm4gJHNlbGYtPl9lbWFpbF9hY2Nlc3NvcihAXyk7CgppbnN0ZWFkIG9mIHRoZSBleHBlY3RlZCBTVVBFUjo6ZW1haWwoKS4KCgo9aGVhZDEgQVVUSE9SUwoKQ29weXJpZ2h0IDIwMDkgTWFydHkgUGF1bGV5IDxtYXJ0eStwZXJsQGthc2VpLmNvbT4KClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCnRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiAgVGhhdCBtZWFucyBlaXRoZXIgKGEpIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBvciAoYikgdGhlIEFydGlzdGljIExpY2Vuc2UuCgo9aGVhZDIgT1JJR0lOQUwgQVVUSE9SCgpNaWNoYWVsIEcgU2Nod2VybiA8c2Nod2VybkBwb2JveC5jb20+Cgo9aGVhZDIgVEhBTktTCgpMaXogYW5kIFJVWiBmb3IgcGVyZm9ybWFuY2UgdHdlYWtzLgoKVGVscywgZm9yIGhpcyBiaWcgZmVhdHVyZSByZXF1ZXN0L2J1ZyByZXBvcnQuCgpWYXJpb3VzIHByZXNlbnRlcnMgYXQgWUFQQzo6QXNpYSAyMDA5IGZvciBjcml0aWNpc2luZyB0aGUgbm9uLU1vb3NlIGludGVyZmFjZS4KCj1oZWFkMSBTRUUgQUxTTwoKU2VlIEw8Q2xhc3M6OkFjY2Vzc29yOjpGYXN0PiBhbmQgTDxDbGFzczo6QWNjZXNzb3I6OkZhc3Rlcj4gaWYgc3BlZWQgaXMgbW9yZQppbXBvcnRhbnQgdGhhbiBmbGV4aWJpbGl0eS4KClRoZXNlIGFyZSBzb21lIG1vZHVsZXMgd2hpY2ggZG8gc2ltaWxhciB0aGluZ3MgaW4gZGlmZmVyZW50IHdheXMKTDxDbGFzczo6U3RydWN0PiwgTDxDbGFzczo6TWV0aG9kbWFrZXI+LCBMPENsYXNzOjpHZW5lcmF0ZT4sCkw8Q2xhc3M6OkNsYXNzPiwgTDxDbGFzczo6Q29udHJhY3Q+LCBMPE1vb3NlPiwgTDxNb3VzZT4KClNlZSBMPENsYXNzOjpEQkk+IGZvciBhbiBleGFtcGxlIG9mIHRoaXMgbW9kdWxlIGluIHVzZS4KCj1jdXQK
dXNlIHN0cmljdDsKcGFja2FnZSBDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQ7CnVzZSBiYXNlICdDbGFzczo6QWNjZXNzb3InOwpvdXIgJFZFUlNJT04gPSAnMC4wMSc7CgpzdWIgbWFrZV9hY2Nlc3NvciB7CiAgICBteSgkY2xhc3MsICRmaWVsZCkgPSBAXzsKCiAgICAjIEJ1aWxkIGEgY2xvc3VyZSBhcm91bmQgJGZpZWxkLgogICAgcmV0dXJuIHN1YiB7CiAgICAgICAgbXkoJHNlbGYpID0gc2hpZnQ7CgogICAgICAgIGlmIChAXykgewogICAgICAgICAgICAkc2VsZi0+c2V0KCRmaWVsZCwgQF8pOwogICAgICAgICAgICByZXR1cm4gJHNlbGY7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHNlbGYtPmdldCgkZmllbGQpOwogICAgICAgIH0KICAgIH07Cn0KCnN1YiBtYWtlX3dvX2FjY2Vzc29yIHsKICAgIG15KCRjbGFzcywgJGZpZWxkKSA9IEBfOwoKICAgIHJldHVybiBzdWIgewogICAgICAgIG15KCRzZWxmKSA9IHNoaWZ0OwoKICAgICAgICB1bmxlc3MgKEBfKSB7CiAgICAgICAgICAgIG15ICRjYWxsZXIgPSBjYWxsZXI7CiAgICAgICAgICAgIHJlcXVpcmUgQ2FycDsKICAgICAgICAgICAgQ2FycDo6Y3JvYWsoIickY2FsbGVyJyBjYW5ub3QgYWNjZXNzIHRoZSB2YWx1ZSBvZiAnJGZpZWxkJyBvbiAiLgogICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0cyBvZiBjbGFzcyAnJGNsYXNzJyIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJHNlbGYtPnNldCgkZmllbGQsIEBfKTsKICAgICAgICAgICAgcmV0dXJuICRzZWxmOwogICAgICAgIH0KICAgIH07Cn0KCjE7Cl9fRU5EX18KCj1oZWFkMSBOQU1FCgpDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQgLSBtYWtlIGNoYWluZWQgYWNjZXNzb3JzCgo9aGVhZDEgU1lOT1BTSVMKCiBwYWNrYWdlIEZvbzsKIHVzZSBiYXNlIHF3KCBDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQgKTsKIF9fUEFDS0FHRV9fLT5ta19hY2Nlc3NvcnMocXcoIGZvbyBiYXIgYmF6ICkpOwoKIG15ICRmb28gPSBGb28tPm5ldy0+Zm9vKDEpLT5iYXIoMiktPmJheig0KTsKIHByaW50ICRmb28tPmJhcjsgIyBwcmludHMgMgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBIGNoYWluZWQgYWNjZXNzb3IgaXMgb25lIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIG9iamVjdCB3aGVuIGNhbGxlZAp3aXRoIHBhcmFtZXRlcnMgKHRvIHNldCksIGFuZCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIHdoZW4gY2FsbGVkIHdpdGgKbm8gYXJndW1lbnRzLgoKVGhpcyBtb2R1bGUgc3ViY2xhc3NlcyBDbGFzczo6QWNjZXNzb3IgaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgc2FtZQpta19hY2Nlc3NvcnMgaW50ZXJmYWNlLgoKPWhlYWQxIEFVVEhPUgoKUmljaGFyZCBDbGFtcCA8cmljaGFyZGNAdW5peGJlYXJkLm5ldD4KCj1oZWFkMSBDT1BZUklHSFQKCkNvcHlyaWdodCAoQykgMjAwMyBSaWNoYXJkIENsYW1wLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KClRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCgo9aGVhZDEgU0VFIEFMU08KCkw8Q2xhc3M6OkFjY2Vzc29yPiwgTDxDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQ6OkZhc3Q+Cgo9Y3V0Cg==
cGFja2FnZSBDbGFzczo6QWNjZXNzb3I6OkZhc3Q7CnVzZSBiYXNlICdDbGFzczo6QWNjZXNzb3InOwp1c2Ugc3RyaWN0OwokQ2xhc3M6OkFjY2Vzc29yOjpGYXN0OjpWRVJTSU9OID0gJzAuMzQnOwoKc3ViIG1ha2VfYWNjZXNzb3IgewogICAgbXkoJGNsYXNzLCAkZmllbGQpID0gQF87CgogICAgcmV0dXJuIHN1YiB7CiAgICAgICAgcmV0dXJuICRfWzBdLT57JGZpZWxkfSBpZiBzY2FsYXIoQF8pID09IDE7CiAgICAgICAgcmV0dXJuICRfWzBdLT57JGZpZWxkfSAgPSBzY2FsYXIoQF8pID09IDIgPyAkX1sxXSA6IFtAX1sxLi4kI19dXTsKICAgIH07Cn0KCgpzdWIgbWFrZV9yb19hY2Nlc3NvciB7CiAgICBteSgkY2xhc3MsICRmaWVsZCkgPSBAXzsKCiAgICByZXR1cm4gc3ViIHsKICAgICAgICByZXR1cm4gJF9bMF0tPnskZmllbGR9IGlmIEBfID09IDE7CiAgICAgICAgbXkgJGNhbGxlciA9IGNhbGxlcjsKICAgICAgICAkX1swXS0+X2Nyb2FrKCInJGNhbGxlcicgY2Fubm90IGFsdGVyIHRoZSB2YWx1ZSBvZiAnJGZpZWxkJyBvbiBvYmplY3RzIG9mIGNsYXNzICckY2xhc3MnIik7CiAgICB9Owp9CgoKc3ViIG1ha2Vfd29fYWNjZXNzb3IgewogICAgbXkoJGNsYXNzLCAkZmllbGQpID0gQF87CgogICAgcmV0dXJuIHN1YiB7CiAgICAgICAgaWYgKEBfID09IDEpIHsKICAgICAgICAgICAgbXkgJGNhbGxlciA9IGNhbGxlcjsKICAgICAgICAgICAgJF9bMF0tPl9jcm9haygiJyRjYWxsZXInIGNhbm5vdCBhY2Nlc3MgdGhlIHZhbHVlIG9mICckZmllbGQnIG9uIG9iamVjdHMgb2YgY2xhc3MgJyRjbGFzcyciKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkX1swXS0+eyRmaWVsZH0gPSAkX1sxXSBpZiBAXyA9PSAyOwogICAgICAgICAgICByZXR1cm4gKHNoaWZ0KS0+eyRmaWVsZH0gPSBcQF87CiAgICAgICAgfQogICAgfTsKfQoKCjE7CgpfX0VORF9fCgo9aGVhZDEgTkFNRQoKQ2xhc3M6OkFjY2Vzc29yOjpGYXN0IC0gRmFzdGVyLCBidXQgbGVzcyBleHBhbmRhYmxlLCBhY2Nlc3NvcnMKCj1oZWFkMSBTWU5PUFNJUwoKICBwYWNrYWdlIEZvbzsKICB1c2UgYmFzZSBxdyhDbGFzczo6QWNjZXNzb3I6OkZhc3QpOwoKICAjIFRoZSByZXN0IGlzIHRoZSBzYW1lIGFzIENsYXNzOjpBY2Nlc3NvciBidXQgd2l0aG91dCBzZXQoKSBhbmQgZ2V0KCkuCgo9aGVhZDEgREVTQ1JJUFRJT04KClRoaXMgaXMgYSBmYXN0ZXIgYnV0IGxlc3MgZXhwYW5kYWJsZSB2ZXJzaW9uIG9mIENsYXNzOjpBY2Nlc3Nvci4KQ2xhc3M6OkFjY2Vzc29yJ3MgZ2VuZXJhdGVkIGFjY2Vzc29ycyByZXF1aXJlIHR3byBtZXRob2QgY2FsbHMgdG8gYWNjb21waXNoCnRoZWlyIHRhc2sgKG9uZSBmb3IgdGhlIGFjY2Vzc29yLCBhbm90aGVyIGZvciBnZXQoKSBvciBzZXQoKSkuCkNsYXNzOjpBY2Nlc3Nvcjo6RmFzdCBlbGltaW5hdGVzIGNhbGxpbmcgc2V0KCkvZ2V0KCkgYW5kIGRvZXMgdGhlIGFjY2VzcyBpdHNlbGYsCnJlc3VsdGluZyBpbiBhIHNvbWV3aGF0IGZhc3RlciBhY2Nlc3Nvci4KClRoZSBkb3duc2lkZSBpcyB0aGF0IHlvdSBjYW4ndCBlYXNpbHkgYWx0ZXIgdGhlIGJlaGF2aW9yIG9mIHlvdXIKYWNjZXNzb3JzLCBub3IgY2FuIHlvdXIgc3ViY2xhc3Nlcy4gIE9mIGNvdXJzZSwgc2hvdWxkIHlvdSBuZWVkIHRoaXMKbGF0ZXIsIHlvdSBjYW4gYWx3YXlzIHN3YXAgb3V0IENsYXNzOjpBY2Nlc3Nvcjo6RmFzdCBmb3IKQ2xhc3M6OkFjY2Vzc29yLgoKUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQ2xhc3M6OkFjY2Vzc29yIGZvciBtb3JlIGluZm8uCgo9aGVhZDEgRUZGSUNJRU5DWQoKTDxDbGFzczo6QWNjZXNzb3IvRUZGSUNJRU5DWT4gZm9yIGFuIGVmZmljaWVuY3kgY29tcGFyaXNvbi4KCj1oZWFkMSBBVVRIT1JTCgpDb3B5cmlnaHQgMjAwNyBNYXJ0eSBQYXVsZXkgPG1hcnR5K3BlcmxAa2FzZWkuY29tPgoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuICBUaGF0IG1lYW5zIGVpdGhlciAoYSkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIG9yIChiKSB0aGUgQXJ0aXN0aWMgTGljZW5zZS4KCj1oZWFkMiBPUklHSU5BTCBBVVRIT1IKCk1pY2hhZWwgRyBTY2h3ZXJuIDxzY2h3ZXJuQHBvYm94LmNvbT4KCj1oZWFkMSBTRUUgQUxTTwoKTDxDbGFzczo6QWNjZXNzb3I+Cgo9Y3V0Cg==
dXNlIHN0cmljdDsKcGFja2FnZSBDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQ6OkZhc3Q7CnVzZSBiYXNlICdDbGFzczo6QWNjZXNzb3I6OkZhc3QnOwoKc3ViIG1ha2VfYWNjZXNzb3IgewogICAgbXkoJGNsYXNzLCAkZmllbGQpID0gQF87CgogICAgcmV0dXJuIHN1YiB7CiAgICAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICAgICBpZihAXykgewogICAgICAgICAgICAkc2VsZi0+eyRmaWVsZH0gPSAoQF8gPT0gMSA/ICRfWzBdIDogW0BfXSk7CiAgICAgICAgICAgIHJldHVybiAkc2VsZjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRzZWxmLT57JGZpZWxkfTsKICAgIH07Cn0KCnN1YiBtYWtlX3dvX2FjY2Vzc29yIHsKICAgIG15KCRjbGFzcywgJGZpZWxkKSA9IEBfOwoKICAgIHJldHVybiBzdWIgewogICAgICAgIG15KCRzZWxmKSA9IHNoaWZ0OwoKICAgICAgICB1bmxlc3MgKEBfKSB7CiAgICAgICAgICAgIG15ICRjYWxsZXIgPSBjYWxsZXI7CiAgICAgICAgICAgIHJlcXVpcmUgQ2FycDsKICAgICAgICAgICAgQ2FycDo6Y3JvYWsoIickY2FsbGVyJyBjYW5ub3QgYWNjZXNzIHRoZSB2YWx1ZSBvZiAnJGZpZWxkJyBvbiAiLgogICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0cyBvZiBjbGFzcyAnJGNsYXNzJyIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJHNlbGYtPnskZmllbGR9ID0gKEBfID09IDEgPyAkX1swXSA6IFtAX10pOwogICAgICAgICAgICByZXR1cm4gJHNlbGY7CiAgICAgICAgfQogICAgfTsKfQoKMTsKCj1oZWFkMSBOQU1FCgpDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQ6OkZhc3QgLSBGYXN0ZXIsIGJ1dCBsZXNzIGV4cGFuZGFibGUsIGNoYWluZWQgYWNjZXNzb3JzCgo9aGVhZDEgU1lOT1BTSVMKCiBwYWNrYWdlIEZvbzsKIHVzZSBiYXNlIHF3KENsYXNzOjpBY2Nlc3Nvcjo6Q2hhaW5lZDo6RmFzdCk7CgogICMgVGhlIHJlc3QgYXMgQ2xhc3M6OkFjY2Vzc29yOjpDaGFpbmVkIGV4Y2VwdCBubyBzZXQoKSBvciBnZXQoKS4KCj1oZWFkMSBERVNDUklQVElPTgoKQnkgYW5hbG9ndWUgdG8gQ2xhc3M6OkFjY2Vzc29yIGFuZCBDbGFzczo6QWNjZXNzb3I6OkZhc3QgdGhpcyBtb2R1bGUKcHJvdmlkZXMgYSBmYXN0ZXIgbGVzcy1mbGV4aWJsZSBjaGFpbmVkIGFjY2Vzc29yIG1ha2VyLgoKPWhlYWQxIEFVVEhPUgoKUmljaGFyZCBDbGFtcCA8cmljaGFyZGNAdW5peGJlYXJkLm5ldD4KCj1oZWFkMSBDT1BZUklHSFQKCkNvcHlyaWdodCAoQykgMjAwMyBSaWNoYXJkIENsYW1wLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KClRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCgo9aGVhZDEgU0VFIEFMU08KCkw8Q2xhc3M6OkFjY2Vzc29yOjpGYXN0PiwgTDxDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQ+Cgo9Y3V0Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOwp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeS87Cgp1c2UgQ2xhc3M6OlJldHVyblZhbHVlOwp1c2UgVGV4dDo6dkZpbGU6OmFzRGF0YTsKCm91ciAkVkVSU0lPTiA9ICcwLjIyJzsKCnVzZSBDYXJwOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWwgLSBHZW5lcmF0ZXMgaUNhbGVuZGFyIChSRkMgMjQ0NSkgY2FsZW5kYXIgZmlsZXMKCj1oZWFkMSBTWU5PUFNJUwoKICAgIHVzZSBEYXRhOjpJQ2FsOwoKICAgIG15ICRjYWxlbmRhciA9IERhdGE6OklDYWwtPm5ldygpOwoKICAgIG15ICR2dG9kbyA9IERhdGE6OklDYWw6OkVudHJ5OjpUb2RvLT5uZXcoKTsKICAgICR2dG9kby0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgIyAuLi4gc2VlIERhdGE6OklDYWw6OkVudHJ5OjpUb2RvIGRvY3VtZW50YXRpb24KICAgICk7CgogICAgIyAuLi4gb3IKICAgICRjYWxlbmRhciA9IERhdGE6OklDYWwtPm5ldyhmaWxlbmFtZSA9PiAnZm9vLmljcycpOyAjIHBhcnNlIGV4aXN0aW5nIGZpbGUKICAgICRjYWxlbmRhciA9IERhdGE6OklDYWwtPm5ldyhkYXRhID0+ICdCRUdJTjpWQ0FMRU5EQVIuLi4nKTsgIyBwYXJzZSBmcm9tIHNjYWxhcgogICAgJGNhbGVuZGFyLT5hZGRfZW50cnkoJHZ0b2RvKTsKICAgIHByaW50ICRjYWxlbmRhci0+YXNfc3RyaW5nOwoKPWhlYWQxIERFU0NSSVBUSU9OCgpBIEw8RGF0YTo6SUNhbD4gb2JqZWN0IHJlcHJlc2VudHMgYSBDPFZDQUxFTkRBUj4gb2JqZWN0IGFzIGRlZmluZWQgaW4gdGhlCmlDYWxlbmRhciBwcm90b2NvbCAoUkZDIDI0NDUsIE1JTUUgdHlwZSAidGV4dC9jYWxlbmRhciIpLCBhcyBpbXBsZW1lbnRlZCBpbiBtYW55CnBvcHVsYXIgY2FsZW5kYXJpbmcgcHJvZ3JhbXMgc3VjaCBhcyBBcHBsZSdzIGlDYWwuCgpFYWNoIEw8RGF0YTo6SUNhbD4gb2JqZWN0IGlzIGEgY29sbGVjdGlvbiBvZiAiZW50cmllcyIsIHdoaWNoIGFyZSBvYmplY3RzIG9mIGEKc3ViY2xhc3Mgb2YgTDxEYXRhOjpJQ2FsOjpFbnRyeT4uICBUaGUgdHlwZXMgb2YgZW50cmllcyBkZWZpbmVkIGJ5IGlDYWxlbmRhcgood2hpY2ggcmVmZXJzIHRvIHRoZW0gYXMgImNvbXBvbmVudHMiKSBpbmNsdWRlIGV2ZW50cywgdG8tZG8gaXRlbXMsIGpvdXJuYWwKZW50cmllcywgZnJlZS9idXN5IHRpbWUgaW5kaWNhdG9ycywgYW5kIHRpbWUgem9uZSBkZXNjcmlwdG9yczsgaW4gYWRkaXRpb24sCmV2ZW50cyBhbmQgdG8tZG8gaXRlbXMgY2FuIGNvbnRhaW4gYWxhcm0gZW50cmllcy4gIChDdXJyZW50bHksIEw8RGF0YTo6SUNhbD4Kb25seSBpbXBsZW1lbnRzIHRvLWRvIGl0ZW1zIGFuZCBldmVudHMuKQoKTDxEYXRhOjpJQ2FsPiBpcyBhIHN1YmNsYXNzIG9mIEw8RGF0YTo6SUNhbDo6RW50cnk+OyBzZWUgaXRzIG1hbnBhZ2UgZm9yIG1vcmUKbWV0aG9kcyBhcHBsaWNhYmxlIHRvIEw8RGF0YTo6SUNhbD4uCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIG5ldyBbIGRhdGEgPT4gJGRhdGEsIF0gWyBmaWxlbmFtZSA9PiAkZmlsZSBdLCBbIGNhbG5hbWUgPT4gJHN0cmluZyBdLCBbIHZjYWwxMCA9PiAkYm9vbCBdLCBbIHJmY19zdHJpY3QgPT4gJGJvb2wgXSwgWyBhdXRvX3VpZCA9PiAkYm9vbCBdCgpDcmVhdGVzIGEgbmV3IEw8RGF0YTo6SUNhbD4gb2JqZWN0LgoKSWYgaXQgaXMgZ2l2ZW4gYSBmaWxlbmFtZSBvciBkYXRhIGFyZ3VtZW50IGlzIHBhc3NlZCwgdGhlbiB0aGlzIHBhcnNlcyB0aGUKY29udGVudCBvZiB0aGUgZmlsZSBvciBzdHJpbmcgaW50byB0aGUgb2JqZWN0LiAgSWYgdGhlIEM8dmNhbDEwPiBmbGFnIGlzIHBhc3NlZCwKcGFyc2VzIGl0IGFjY29yZGluZyB0byB2Q2FsZW5kYXIgMS4wLCBub3QgaUNhbGVuZGFyIDIuMDsgdGhpcyBpbiBwYXJ0aWN1bGFyIGltcGFjdHMKdGhlIHBhcnNpbmcgb2YgY29udGludWF0aW9uIGxpbmVzIGluIHF1b3RlZC1wcmludGFibGUgc2VjdGlvbnMuCgpJZiBhIGNhbG5hbWUgaXMgcGFzc2VkLCBzZXRzIHgtd3ItY2FsbmFtZSB0byB0aGUgZ2l2ZW4gc3RyaW5nLiAgQWx0aG91Z2gKbm90IHNwZWNpZmllZCBpbiBSRkMyNDQ1LCBtb3N0IGNhbGVuZGFyIHNvZnR3YXJlIHJlc3BlY3RzIHgtd3ItY2FsbmFtZQphcyB0aGUgZGlzcGxheWVkIG5hbWUgb2YgdGhlIGNhbGVuZGFyLgoKSWYgdGhlIEM8cmZjX3N0cmljdD4gZmxhZyBpcyBzZXQgdG8gdHJ1ZSwgd2lsbCByZXF1aXJlIERhdGE6OklDYWwgdG8KaW5jbHVkZSBVSURzLCBhcyBwZXIgUkZDMjQ0NToKCiAgICA0LjguNC43IFVuaXF1ZSBJZGVudGlmaWVyCiAgICAuLi4gVGhlIHByb3BlcnR5IE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSAiVkVWRU5UIiwgIlZUT0RPIiwKICAgICJWSk9VUk5BTCIgb3IgIlZGUkVFQlVTWSIgY2FsZW5kYXIgY29tcG9uZW50cyIKCklmIHRoZSBDPGF1dG9fdWlkPiBmbGFnIGlzIHNldCB0byB0cnVlLCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYQpkZWZhdWx0IFVJRCBmb3IgZWFjaCB0eXBlIHdoaWNoIHJlcXVpcmVzIGl0LCBiYXNlZCBvbiB0aGUgUkZDLXN1Z2dlc3RlZAphbGdvcml0aG0uICBFeHBsaWNpdGx5LXNldCBVSUQgYXR0cmlidXRlcyB3aWxsIG92ZXJyaWRlIHRoaXMKYXV0by1nZW5lcmF0ZWQgdmFsdWUuCgpJZiBhIGZpbGVuYW1lIG9yIGRhdGEgYXJndW1lbnQgaXMgbm90IHBhc3NlZCwgdGhpcyBqdXN0IHNldHMgdGhlCm9iamVjdCdzIEM8VkVSU0lPTj4gYW5kIEM8UFJPRElEPiBwcm9wZXJ0aWVzIHRvICIyLjAiIChvciAiMS4wIiBpZiB0aGUKQzx2Y2FsMTA+IGZsYWcgaXMgcGFzc2VkKSBhbmQgdGhlIHZhbHVlIG9mIHRoZSBDPHByb2R1Y3RfaWQ+IG1ldGhvZApyZXNwZWN0aXZlbHkuCgpSZXR1cm5zIGEgZmFsc2UgdmFsdWUgdXBvbiBmYWlsdXJlIHRvIG9wZW4gb3IgcGFyc2UgdGhlIGZpbGUgb3IgZGF0YTsgdGhpcyBmYWxzZQp2YWx1ZSBpcyBhIEw8Q2xhc3M6OlJldHVyblZhbHVlPiBvYmplY3QgYW5kIGNhbiBiZSBxdWVyaWVkIGFzIHRvIGl0cwpDPGVycm9yX21lc3NhZ2U+LgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgIG15ICRzZWxmICA9ICRjbGFzcy0+U1VQRVI6Om5ldyhAXyk7CgogICAgbXkgJWFyZ3MgPSAoCiAgICAgICAgZmlsZW5hbWUgICA9PiB1bmRlZiwKICAgICAgICBjYWxuYW1lICAgID0+IHVuZGVmLAogICAgICAgIGRhdGEgICAgICAgPT4gdW5kZWYsCiAgICAgICAgdmNhbDEwICAgICA9PiAwLAogICAgICAgIHJmY19zdHJpY3QgPT4gMCwKICAgICAgICBhdXRvX3VpZCAgID0+IDAsCiAgICAgICAgQF8KICAgICk7CgogICAgJHNlbGYtPnZjYWwxMCggJGFyZ3N7dmNhbDEwfSApOwogICAgJHNlbGYtPnJmY19zdHJpY3QoICRhcmdze3JmY19zdHJpY3R9ICk7CiAgICAkc2VsZi0+YXV0b191aWQoICRhcmdze2F1dG9fdWlkfSApOwoKICAgIGlmICggZGVmaW5lZCAkYXJnc3tmaWxlbmFtZX0gb3IgZGVmaW5lZCAkYXJnc3tkYXRhfSApIHsKCiAgICAgICAgIyBtaWdodCByZXR1cm4gYSBDbGFzczo6UmV0dXJuVmFsdWUgaWYgcGFyc2luZyBmYWlscwogICAgICAgIHJldHVybiAkc2VsZi0+cGFyc2UoJWFyZ3MpOwogICAgfSBlbHNlIHsKICAgICAgICAkc2VsZi0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgICAgIHZlcnNpb24gPT4gKCAkc2VsZi0+dmNhbDEwID8gJzEuMCcgOiAnMi4wJyApLAogICAgICAgICAgICBwcm9kaWQgPT4gJHNlbGYtPnByb2R1Y3RfaWQsCiAgICAgICAgKTsKICAgICAgICAkc2VsZi0+YWRkX3Byb3BlcnR5KCd4LXdyLWNhbG5hbWUnID0+ICRhcmdze2NhbG5hbWV9KQogICAgICAgICAgICBpZiBkZWZpbmVkICRhcmdze2NhbG5hbWV9OwoKICAgICAgICByZXR1cm4gJHNlbGY7CiAgICB9Cn0KCj1oZWFkMiBwYXJzZSBbIGRhdGEgPT4gJGRhdGEsIF0gWyBmaWxlbmFtZSA9PiAkZmlsZSwgXQoKUGFyc2UgYSBDPC5pY3M+IGZpbGUgb3Igc3RyaW5nIGNvbnRhaW5pbmcgb25lLCBhbmQgcG9wdWxhdGUgQzwkc2VsZj4Kd2l0aCBpdHMgY29udGVudHMuCgpTaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSBvbiBhIGdpdmVuIG9iamVjdCwgYW5kIHdpbGwgYmUgYXV0b21hdGljYWxseQpjYWxsZWQgYnkgQzxuZXc+IGlmIHlvdSBwcm92aWRlIGFyZ3VtZW50cyB0byBDPG5ldz4uCgpSZXR1cm5zIEM8JHNlbGY+IG9uIHN1Y2Nlc3MuICBSZXR1cm5zIGEgZmFsc2UgdmFsdWUgdXBvbiBmYWlsdXJlIHRvCm9wZW4gb3IgcGFyc2UgdGhlIGZpbGUgb3IgZGF0YTsgdGhpcyBmYWxzZSB2YWx1ZSBpcyBhCkw8Q2xhc3M6OlJldHVyblZhbHVlPiBvYmplY3QgYW5kIGNhbiBiZSBxdWVyaWVkIGFzIHRvIGl0cwpDPGVycm9yX21lc3NhZ2U+LgoKPWN1dAoKc3ViIHBhcnNlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAlYXJncyA9ICgKICAgICAgICBmaWxlbmFtZSA9PiB1bmRlZiwKICAgICAgICBkYXRhICAgICA9PiB1bmRlZiwKICAgICAgICBAXwogICAgKTsKCiAgICB1bmxlc3MgKCBkZWZpbmVkICRhcmdze2ZpbGVuYW1lfSBvciBkZWZpbmVkICRhcmdze2RhdGF9ICkgewogICAgICAgIHJldHVybiAkc2VsZi0+X2Vycm9yKAogICAgICAgICAgICAicGFyc2UgY2FsbGVkIHdpdGggbm8gZmlsZW5hbWUgb3IgZGF0YSBzcGVjaWZpZWQiKTsKICAgIH0KCiAgICBteSBAbGluZXM7CgogICAgIyBvcGVuIHRoZSBmaWxlIChjaGVja2luZyBhcyB3ZSBnbywgbGlrZSBnb29kIGxpdHRsZSBQZXJsIG1vbmdlcnMpCiAgICBpZiAoIGRlZmluZWQgJGFyZ3N7ZmlsZW5hbWV9ICkgewogICAgICAgIG9wZW4gbXkgJGZoLCAnPCcsICRhcmdze2ZpbGVuYW1lfQogICAgICAgICAgICBvciByZXR1cm4gJHNlbGYtPl9lcnJvcigiY291bGQgbm90IG9wZW4gJyRhcmdze2ZpbGVuYW1lfSc6ICQhIik7CiAgICAgICAgQGxpbmVzID0gbWFwIHsgY2hvbXA7ICRfIH0gPCRmaD47CiAgICB9IGVsc2UgewogICAgICAgIEBsaW5lcyA9IHNwbGl0IC9ccj9cbi8sICRhcmdze2RhdGF9OwogICAgfQoKICAgIEBsaW5lcyA9ICRzZWxmLT5fdmNhbDEwX2lucHV0X2NsZWFudXAoQGxpbmVzKSBpZiAkc2VsZi0+dmNhbDEwOwoKICAgICMgUGFyc2UgdGhlIGxpbmVzOyBUZXh0Ojp2RmlsZSBkb2Vzbid0IHdhbnQgdHJhaWxpbmcgbmV3bGluZXMKICAgIG15ICRjYWwgPSBldmFsIHsgVGV4dDo6dkZpbGU6OmFzRGF0YS0+bmV3LT5wYXJzZV9saW5lcyhAbGluZXMpIH07CiAgICByZXR1cm4gJHNlbGYtPl9lcnJvcigicGFyc2UgZmFpbHVyZTogJEAiKSBpZiAkQDsKCiAgICByZXR1cm4gJHNlbGYtPl9lcnJvcigicGFyc2UgZmFpbHVyZSIpCiAgICAgICAgdW5sZXNzICRjYWwgYW5kIGV4aXN0cyAkY2FsLT57b2JqZWN0c307CgogICAgIyBsb29wIHRocm91Z2ggYWxsIHRoZSB2Y2FyZHMKICAgIGZvcmVhY2ggbXkgJG9iamVjdCAoIEB7ICRjYWwtPntvYmplY3RzfSB9ICkgewogICAgICAgICRzZWxmLT5wYXJzZV9vYmplY3QoJG9iamVjdCk7CiAgICB9CgogICAgbXkgJHZlcnNpb25fcmVmID0gJHNlbGYtPnByb3BlcnR5KCJ2ZXJzaW9uIik7CiAgICBteSAkdmVyc2lvbiA9ICR2ZXJzaW9uX3JlZiA/ICR2ZXJzaW9uX3JlZi0+WzBdLT52YWx1ZSA6IHVuZGVmOwogICAgdW5sZXNzICggZGVmaW5lZCAkdmVyc2lvbiApIHsKICAgICAgICByZXR1cm4gJHNlbGYtPl9lcnJvcigiZGF0YSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBwcm9wZXJ0eSIpOwogICAgfQoKICAgIGlmICggICAkdmVyc2lvbiBlcSAnMS4wJyBhbmQgbm90ICRzZWxmLT52Y2FsMTAKICAgICAgICBvciAkdmVyc2lvbiBlcSAnMi4wJyBhbmQgJHNlbGYtPnZjYWwxMCApCiAgICB7CiAgICAgICAgcmV0dXJuICRzZWxmLT5fZXJyb3IoICdhcHBsaWNhdGlvbiBjbGFpbXMgZGF0YSBpcycKICAgICAgICAgICAgICAgIC4gKCAkc2VsZi0+dmNhbDEwID8gJycgOiAnIG5vdCcgKQogICAgICAgICAgICAgICAgLiAnIHZDYWwgMS4wIGJ1dCBkb2MgY29udGFpbnMgVkVSU0lPTjonCiAgICAgICAgICAgICAgICAuICR2ZXJzaW9uICk7CiAgICB9CgogICAgcmV0dXJuICRzZWxmOwp9CgpzdWIgX2Vycm9yIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnICA9IHNoaWZ0OwoKICAgIG15ICRyZXQgPSBDbGFzczo6UmV0dXJuVmFsdWUtPm5ldzsKICAgICRyZXQtPmFzX2Vycm9yKCBlcnJubyA9PiAxLCBtZXNzYWdlID0+ICRtc2cgKTsKICAgIHJldHVybiAkcmV0Owp9Cgo9aGVhZDIgaWNhbF9lbnRyeV90eXBlCgpSZXR1cm5zIEM8VkNBTEVOREFSPiwgaXRzIGlDYWxlbmRhciBlbnRyeSBuYW1lLgoKPWN1dAoKc3ViIGljYWxfZW50cnlfdHlwZSB7J1ZDQUxFTkRBUid9Cgo9aGVhZDIgcHJvZHVjdF9pZAoKUmV0dXJucyB0aGUgcHJvZHVjdCBJRCB1c2VkIGluIHRoZSBjYWxlbmRhcidzIEM8UFJPRElEPiBwcm9wZXJ0eTsgeW91IG1heQp3aXNoIHRvIG92ZXJyaWRlIHRoaXMgaW4gYSBzdWJjbGFzcyBmb3IgeW91ciBvd24gYXBwbGljYXRpb24uCgo9Y3V0CgpzdWIgcHJvZHVjdF9pZCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgcmV0dXJuICJEYXRhOjpJQ2FsICRWRVJTSU9OIjsKfQoKPWhlYWQyIG1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBtdXN0IGJlIHNwZWNpZmllZApleGFjdGx5IG9uZSB0aW1lIGZvciBhIGNhbGVuZGFyOgoKICAgICAgcHJvZGlkIHZlcnNpb24KCj1jdXQKCnN1YiBtYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgcXcoCiAgICAgICAgcHJvZGlkIHZlcnNpb24KICAgICk7Cn0KCj1oZWFkMiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBtYXkgYmUgc3BlY2lmaWVkCmF0IG1vc3Qgb25lIHRpbWUgZm9yIGEgY2FsZW5kYXI6CgogICAgICBjYWxzY2FsZSBtZXRob2QKCj1jdXQKCnN1YiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcyB7CiAgICBxdygKICAgICAgICBjYWxzY2FsZSBtZXRob2QKICAgICk7Cn0KCiMgSW4gcXVvdGVkLXByaW50YWJsZSBzZWN0aW9ucywgY29udmVydCBmcm9tIHZjYWwxMCAiPVxuIiBsaW5lIGVuZGluZ3MgdG8KIyBpY2FsMjAgIlxuICIuCnN1YiBfdmNhbDEwX2lucHV0X2NsZWFudXAgewogICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CiAgICBteSBAaW5fbGluZXMgPSBAXzsKCiAgICBteSBAb3V0X2xpbmVzOwoKICAgIG15ICRpbl9xcCA9IDA7CkxJTkU6IHdoaWxlIChAaW5fbGluZXMpIHsKICAgICAgICBteSAkbGluZSA9IHNoaWZ0IEBpbl9saW5lczsKCiAgICAgICAgaWYgKCBub3QgJGluX3FwIGFuZCAkbGluZSA9fiAvXlteOl0rO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEUvaSApIHsKICAgICAgICAgICAgJGluX3FwID0gMTsKICAgICAgICB9CgogICAgICAgIHVubGVzcyAoJGluX3FwKSB7CiAgICAgICAgICAgIHB1c2ggQG91dF9saW5lcywgJGxpbmU7CiAgICAgICAgICAgIG5leHQgTElORTsKICAgICAgICB9CgogICAgICAgIGlmICggJGxpbmUgPX4gcy89JC8vICkgewogICAgICAgICAgICBwdXNoIEBvdXRfbGluZXMsICRsaW5lOwogICAgICAgICAgICAkaW5fbGluZXNbMF0gPSAnICcgLiAkaW5fbGluZXNbMF0gaWYgQGluX2xpbmVzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHB1c2ggQG91dF9saW5lcywgJGxpbmU7CiAgICAgICAgICAgICRpbl9xcCA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBAb3V0X2xpbmVzOwp9Cgo9aGVhZDEgREVQRU5ERU5DSUVTCgpMPERhdGE6OklDYWw+IHJlcXVpcmVzIEw8Q2xhc3M6OkFjY2Vzc29yPiwgTDxUZXh0Ojp2RmlsZTo6YXNEYXRhPiwKTDxNSU1FOjpRdW90ZWRQcmludD4sIGFuZCBMPENsYXNzOjpSZXR1cm5WYWx1ZT4uCgo9aGVhZDEgQlVHUyBBTkQgTElNSVRBVElPTlMKCkw8RGF0YTo6SUNhbD4gZG9lcyBub3Qgc3VwcG9ydCB0aW1lIHpvbmUgZGF5bGlnaHQgb3Igc3RhbmRhcmQgZW50cmllcywKc28gdGltZSB6b25lIGNvbXBvbmVudHMgYXJlIGJhc2ljYWxseSB1c2VsZXNzLgoKV2hpbGUgTDxEYXRhOjpJQ2FsPiB0cmllcyB0byBjaGVjayB3aGljaCBwcm9wZXJ0aWVzIGFyZSByZXF1aXJlZCBhbmQKcmVwZWF0YWJsZSwgdGhpcyBvbmx5IHdvcmtzIGluIHNpbXBsZSBjYXNlczsgaXQgZG9lcyBub3QgY2hlY2sgZm9yCnByb3BlcnRpZXMgdGhhdCBtdXN0IGVpdGhlciBib3RoIGV4aXN0IG9yIGJvdGggbm90IGV4aXN0LCBvciBmb3IKbXV0dWFsbHkgZXhjbHVzaXZlIHByb3BlcnRpZXMuCgpMPERhdGE6OklDYWw+IGRvZXMgbm90IGNoZWNrIHRvIHNlZSBpZiBwcm9wZXJ0eSBwYXJhbWV0ZXIgbmFtZXMgYXJlCmtub3duIGluIGdlbmVyYWwgb3IgYWxsb3dlZCBvbiB0aGUgcGFydGljdWxhciBwcm9wZXJ0eS4KCkw8RGF0YTo6SUNhbD4gZG9lcyBub3QgY2hlY2sgdG8gc2VlIGlmIG5lc3RlZCBlbnRyaWVzIGFyZSBuZXN0ZWQKcHJvcGVybHkgKGFsYXJtcyBpbiB0b2RvcyBhbmQgZXZlbnRzIG9ubHksIGV2ZXJ5dGhpbmcgZWxzZSBpbgpjYWxlbmRhcnMgb25seSkuCgpUaGUgb25seSBwcm9wZXJ0eSBlbmNvZGluZyBzdXBwb3J0ZWQgYnkgTDxEYXRhOjpJQ2FsPiBpcyBxdW90ZWQKcHJpbnRhYmxlLgoKUGxlYXNlIHJlcG9ydCBhbnkgYnVncyBvciBmZWF0dXJlIHJlcXVlc3RzIHRvCkM8YnVnLWRhdGEtaWNhbEBydC5jcGFuLm9yZz4sIG9yIHRocm91Z2ggdGhlIHdlYiBpbnRlcmZhY2UgYXQKTDxodHRwOi8vcnQuY3Bhbi5vcmc+LgoKCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpQcm9wZXJ0eTsKCnVzZSBiYXNlIHF3L0NsYXNzOjpBY2Nlc3Nvci87Cgp1c2UgQ2FycDsKdXNlIE1JTUU6OlF1b3RlZFByaW50ICgpOwoKb3VyICRWRVJTSU9OID0gJzAuMDYnOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWw6OlByb3BlcnR5IC0gUmVwcmVzZW50cyBhIHByb3BlcnR5IG9uIGFuIGVudHJ5IGluIGFuIGlDYWxlbmRhciBmaWxlCgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpQcm9wZXJ0eT4gb2JqZWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgcHJvcGVydHkgb24gYW4KZW50cnkgaW4gYW4gaUNhbGVuZGFyIGZpbGUuICBQcm9wZXJ0aWVzIGhhdmUgcGFyYW1ldGVycyBpbiBhZGRpdGlvbiB0bwp0aGVpciB2YWx1ZS4KCllvdSBzaG91bGRuJ3QgbmVlZCB0byBjcmVhdGUgTDxEYXRhOjpJQ2FsOjpQcm9wZXJ0eT4gdmFsdWVzIGRpcmVjdGx5Ci0tIGp1c3QgdXNlIEM8YWRkX3Byb3BlcnR5PiBpbiBMPERhdGE6OklDYWw6OkVudHJ5Pi4KClRoZSBDPGVuY29kaW5nPiBwYXJhbWV0ZXIgdmFsdWUgaXMgb25seSBpbnRlcnByZXRlZCBieSBMPERhdGE6OklDYWw+CmluIHRoZSBDPGRlY29kZWRfdmFsdWU+IGFuZCBDPGVuY29kZT4gbWV0aG9kczogYWxsIG90aGVyIG1ldGhvZHMKYWNjZXNzIHRoZSBlbmNvZGVkIHZlcnNpb24gZGlyZWN0bHkgKGlmIHRoZXJlIGlzIGFuIGVuY29kaW5nKS4KCkN1cnJlbnRseSwgdGhlIG9ubHkgc3VwcG9ydGVkIGVuY29kaW5nIGlzIEM8UVVPVEVELVBSSU5UQUJMRT4uCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIG5ldyAka2V5LCAkdmFsdWUsIFskcGFyYW1ldGVyX2hhc2hdCgpDcmVhdGVzIGEgbmV3IEw8RGF0YTo6SUNhbDo6UHJvcGVydHk+IHdpdGgga2V5IEM8JGtleT4gYW5kIHZhbHVlIEM8JHZhbHVlPi4KCklmIEM8JHBhcmFtZXRlcl9oYXNoPiBpcyBwcm92aWRlZCwgc2V0cyB0aGUgcHJvcGVydHkncyBwYXJhbWV0ZXJzIHRvCml0LiAgVGhlIHBhcmFtZXRlciBoYXNoIHNob3VsZCBoYXZlIGtleXMgZXF1YWwgdG8gdGhlIG5hbWVzIG9mIHRoZQpwYXJhbWV0ZXJzIChjYXNlIGluc2Vuc2l0aXZlOyBwYXJhbWV0ZXIgaGFzaGVzIHNob3VsZCBub3QgY29udGFpbiB0d28KZGlmZmVyZW50IGtleXMgd2hpY2ggYXJlIHRoZSBzYW1lIHdoZW4gY29udmVydGVkIHRvIHVwcGVyIGNhc2UpOyB0aGUKdmFsdWVzIHNob3VsZCBlaXRoZXIgYmUgYSBzdHJpbmcgaWYgdGhlIHBhcmFtZXRlciBoYXMgYSBzaW5nbGUgdmFsdWUKb3IgYW4gYXJyYXkgcmVmZXJlbmNlIG9mIHN0cmluZ3MgaWYgdGhlIHBhcmFtZXRlciBoYXMgbXVsdGlwbGUgdmFsdWVzLgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgIG15ICRzZWxmICA9IHt9OwoKICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CgogICAgJHNlbGYtPmtleShzaGlmdCk7CiAgICAkc2VsZi0+dmFsdWUoc2hpZnQpOwogICAgJHNlbGYtPnBhcmFtZXRlcnMoIHNoaWZ0IHx8IHt9ICk7CiAgICByZXR1cm4gKCRzZWxmKTsKfQoKPWhlYWQyIGtleSBbJGtleV0KCkdldHMgb3Igc2V0cyB0aGUga2V5IG5hbWUgb2YgdGhpcyBwcm9wZXJ0eS4KCj1oZWFkMiB2YWx1ZSBbJHZhbHVlXQoKR2V0cyBvciBzZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5LgoKPWhlYWQyIHBhcmFtZXRlcnMgWyRwYXJhbV9oYXNoXQoKR2V0cyBvciBzZXRzIHRoZSBwYXJhbWV0ZXIgaGFzaCByZWZlcmVuY2Ugb2YgdGhpcyBwcm9wZXJ0eS4gIFBhcmFtZXRlcgprZXlzIGFyZSBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZS4KCj1oZWFkMiB2Y2FsMTAgWyRib29sXQoKR2V0cyBvciBzZXRzIGEgYm9vbGVhbiBzYXlpbmcgd2hldGhlciB0aGlzIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcwp2Q2FsZW5kYXIgMS4wIChhcyBvcHBvc2VkIHRvIGlDYWxlbmRhciAyLjApLiAgR2VuZXJhbGx5LCB5b3UgY2FuIGp1c3QKc2V0IHRoaXMgb24geW91ciBtYWluIEw8RGF0YTo6SUNhbD4gb2JqZWN0IHdoZW4geW91IGNvbnN0cnVjdCBpdDsKQzxhZGRfZW50cnk+IGF1dG9tYXRpY2FsbHkgbWFrZXMgc3VyZSB0aGF0IHN1Yi1lbnRyaWVzIGVuZCB1cCB3aXRoIHRoZQpzYW1lIHZhbHVlIGFzIHRoZWlyIHBhcmVudHMsIGFuZCBDPGFkZF9wcm9wZXJ0eT4gbWFrZXMgc3VyZSB0aGF0CnByb3BlcnRpZXMgZW5kIHVwIHdpdGggdGhlIHNhbWUgdmFsdWUgYXMgdGhlaXIgZW50cnkuCgo9Y3V0CgpfX1BBQ0tBR0VfXy0+bWtfYWNjZXNzb3JzKHF3KGtleSB2YWx1ZSBfcGFyYW1ldGVycyB2Y2FsMTApKTsKCnN1YiBwYXJhbWV0ZXJzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgaWYgKEBfKSB7CiAgICAgICAgbXkgJHBhcmFtcyAgICAgPSBzaGlmdDsKICAgICAgICBteSAkbmV3X3BhcmFtcyA9IHt9OwogICAgICAgIHdoaWxlICggbXkgKCAkaywgJHYgKSA9IGVhY2ggJSRwYXJhbXMgKSB7CiAgICAgICAgICAgICRuZXdfcGFyYW1zLT57IHVjICRrIH0gPSAkdjsKICAgICAgICB9CiAgICAgICAgJHNlbGYtPl9wYXJhbWV0ZXJzKCRuZXdfcGFyYW1zKTsKICAgIH0KCiAgICByZXR1cm4gJHNlbGYtPl9wYXJhbWV0ZXJzOwp9CgpteSAlRU5DT0RJTkdTID0gKAogICAgJ1FVT1RFRC1QUklOVEFCTEUnID0+IHsKICAgICAgICBlbmNvZGUgPT4gc3ViIHsKICAgICAgICAgICAgbXkgJGRlYyA9IHNoaWZ0IHx8ICcnOwogICAgICAgICAgICAkZGVjID1+IHMvXG4vXHJcbi9nOwogICAgICAgICAgICByZXR1cm4gTUlNRTo6UXVvdGVkUHJpbnQ6OmVuY29kZSggJGRlYywgJycgKTsKICAgICAgICB9LAogICAgICAgIGRlY29kZSA9PiBzdWIgewogICAgICAgICAgICBteSAkZGVjID0gTUlNRTo6UXVvdGVkUHJpbnQ6OmRlY29kZSggc2hpZnQgfHwgJycgKTsKICAgICAgICAgICAgJGRlYyA9fiBzL1xyXG4vXG4vZzsKICAgICAgICAgICAgcmV0dXJuICRkZWM7CiAgICAgICAgICAgIH0KICAgIH0sCik7Cgo9aGVhZDIgZGVjb2RlZF92YWx1ZQoKR2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSwgY29udmVydGVkIGZyb20gdGhlIGVuY29kaW5nIHNwZWNpZmllZAppbiBpdHMgZW5jb2RpbmcgcGFyYW1ldGVyLiAgKFRoYXQgaXMsIEM8dmFsdWU+IHdpbGwgcmV0dXJuIHRoZSBlbmNvZGVkCnZlcnNpb247IHRoaXMgd2lsbCBhcHBseSB0aGUgZW5jb2RpbmcuKSAgSWYgdGhlIGVuY29kaW5nIGlzIG5vdApzcGVjaWZpZWQgb3IgcmVjb2duaXplZCwganVzdCByZXR1cm5zIHRoZSByYXcgdmFsdWUuCgo9Y3V0CgpzdWIgZGVjb2RlZF92YWx1ZSB7CiAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKICAgIG15ICR2YWx1ZSAgICA9ICRzZWxmLT52YWx1ZTsKICAgIG15ICRlbmNvZGluZyA9IHVjKCAkc2VsZi0+cGFyYW1ldGVycy0+eydFTkNPRElORyd9IHx8ICIiICk7CgogICAgaWYgKCAkRU5DT0RJTkdTeyRlbmNvZGluZ30gKSB7CiAgICAgICAgcmV0dXJuICRFTkNPRElOR1N7JGVuY29kaW5nfXsnZGVjb2RlJ30tPigkdmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgfQp9Cgo9aGVhZDIgZW5jb2RlICRlbmNvZGluZwoKQ2FsbHMgQzxkZWNvZGVkX3ZhbHVlPiB0byBnZXQgdGhlIGN1cnJlbnQgZGVjb2RlZCB2YWx1ZSwgdGhlbiBlbmNvZGVzCml0IGluIEM8JGVuY29kaW5nPiwgc2V0cyB0aGUgdmFsdWUgdG8gdGhhdCwgYW5kIHNldHMgdGhlIGVuY29kaW5nCnBhcmFtZXRlciB0byBDPCRlbmNvZGluZz4uIChDPCRlbmNvZGluZz4gaXMgZmlyc3QgY29udmVydGVkIHRvIHVwcGVyCmNhc2UuKQoKSWYgQzwkZW5jb2Rpbmc+IGlzIHVuZGVmLCBkZWxldGVzIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXIgYW5kIHNldHMgdGhlCnZhbHVlIHRvIHRoZSBkZWNvZGVkIHZhbHVlLiAgRG9lcyBub3RoaW5nIGlmIHRoZSBlbmNvZGluZyBpcyBub3QKcmVjb2duaXplZC4KCj1jdXQKCnN1YiBlbmNvZGUgewogICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CiAgICBteSAkZW5jb2RpbmcgPSB1YyBzaGlmdDsKCiAgICBteSAkZGVjb2RlZF92YWx1ZSA9ICRzZWxmLT5kZWNvZGVkX3ZhbHVlOwoKICAgIGlmICggbm90IGRlZmluZWQgJGVuY29kaW5nICkgewogICAgICAgICRzZWxmLT52YWx1ZSgkZGVjb2RlZF92YWx1ZSk7CiAgICAgICAgZGVsZXRlICRzZWxmLT5wYXJhbWV0ZXJzLT57J0VOQ09ESU5HJ307CiAgICB9IGVsc2lmICggJEVOQ09ESU5HU3skZW5jb2Rpbmd9ICkgewogICAgICAgICRzZWxmLT52YWx1ZSggJEVOQ09ESU5HU3skZW5jb2Rpbmd9eydlbmNvZGUnfS0+KCRkZWNvZGVkX3ZhbHVlKSApOwogICAgICAgICRzZWxmLT5wYXJhbWV0ZXJzLT57J0VOQ09ESU5HJ30gPSAkZW5jb2Rpbmc7CiAgICB9CiAgICByZXR1cm4gJHNlbGY7Cn0KCj1oZWFkMiBhc19zdHJpbmcgQVJHUwoKUmV0dXJucyB0aGUgcHJvcGVydHkgZm9ybWF0dGVkIGFzIGEgc3RyaW5nIChpbmNsdWRpbmcgdHJhaWxpbmcKbmV3bGluZSkuCgpUYWtlcyBuYW1lZCBhcmd1bWVudHM6Cgo9b3ZlcgoKPWl0ZW0gZm9sZAoKRGVmYXVsdHMgdG8gdHJ1ZS4gcGFzcyBpbiBhIGZhbHNlIHZhbHVlIGlmIHlvdSBuZWVkIHRvIGdlbmVyYXRlCm5vbi1yZmMtY29tcGxpYW50IGNhbGVuZGFycy4KCj1pdGVtIGNybGYKCkRlZmF1bHRzIHRvIEM8XHgwZFx4MGE+LCBwZXIgUkZDIDI0NDUgc3BlYy4gIFRoaXMgb3B0aW9uIGlzIHByaW1hcmlseQpmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlIHByaW9yIHRvIDAuMTYsCndoaWNoIHVzZWQgQzxceDBhPi4KCj1iYWNrCgo9Y3V0CgpzdWIgYXNfc3RyaW5nIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAlYXJncyA9ICgKICAgICAgICBmb2xkID0+IDEsCiAgICAgICAgY3JsZiA9PiBEYXRhOjpJQ2FsOjpFbnRyeS0+Q1JMRiwKICAgICAgICBAXwogICAgKTsKICAgIG15ICRzdHJpbmcKICAgICAgICA9IHVjKCAkc2VsZi0+a2V5ICkKICAgICAgICAuICRzZWxmLT5fcGFyYW1ldGVyc19hc19zdHJpbmcgLiAiOiIKICAgICAgICAuICRzZWxmLT5fdmFsdWVfYXNfc3RyaW5nKCAkc2VsZi0+a2V5ICkKICAgICAgICAuICRhcmdze2NybGZ9OwoKICAjIEFzc3VtcHRpb246IHRoZSBvbmx5IHBsYWNlIGluIGFuIGlDYWxlbmRhciB0aGF0IG5lZWRzIGZvbGRpbmcgYXJlIHByb3BlcnR5CiAgIyBsaW5lcwogICAgaWYgKCAkYXJnc3snZm9sZCd9ICkgewogICAgICAgIHJldHVybiAkc2VsZi0+X2ZvbGQoICRzdHJpbmcsICRhcmdze2NybGZ9ICk7CiAgICB9CgogICAgcmV0dXJuICRzdHJpbmc7Cn0KCj1iZWdpbiBwcml2YXRlCgo9aGVhZDIgX3ZhbHVlX2FzX3N0cmluZwoKUmV0dXJucyB0aGUgcHJvcGVydHkncyB2YWx1ZSBhcyBhIHN0cmluZy4gIENvbW1hIGFuZCBzZW1pY29sb24gYXJlIG5vdAplc2NhcGVkIHdoZW4gdGhlIHZhbHVlIGlzIHJlY3VyIHR5cGUgKHRoZSBrZXkgaXMgcnJ1bGUpLgoKVmFsdWVzIGFyZSBxdW90ZWQgYWNjb3JkaW5nIHRoZSBpQ2FsIHNwZWMsIHVubGVzcyB0aGlzIGlzIGluIHZDYWwgMS4wCm1vZGUuCgo9ZW5kIHByaXZhdGUKCj1jdXQKCnN1YiBfdmFsdWVfYXNfc3RyaW5nIHsKICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgbXkgJGtleSAgID0gc2hpZnQ7CiAgICBteSAkdmFsdWUgPSBkZWZpbmVkKCAkc2VsZi0+dmFsdWUoKSApID8gJHNlbGYtPnZhbHVlKCkgOiAnJzsKCiAgICB1bmxlc3MgKCAkc2VsZi0+dmNhbDEwICkgewogICAgICAgICR2YWx1ZSA9fiBzL1xcL1xcXFwvZ3M7CiAgICAgICAgJHZhbHVlID1+IHMvOy9cXDsvZ3MgdW5sZXNzIGxjKCRrZXkpIGVxICdycnVsZSc7CiAgICAgICAgJHZhbHVlID1+IHMvLC9cXCwvZ3MgdW5sZXNzIGxjKCRrZXkpIGVxICdycnVsZSc7CiAgICAgICAgJHZhbHVlID1+IHMvXHgwZD9ceDBhL1xcbi9nczsKICAgIH0KCiAgICByZXR1cm4gJHZhbHVlOwp9Cgo9YmVnaW4gcHJpdmF0ZQoKPWhlYWQyIF9wYXJhbWV0ZXJzX2FzX3N0cmluZwoKUmV0dXJucyB0aGUgcHJvcGVydHkncyBwYXJhbWV0ZXJzIGFzIGEgc3RyaW5nLiAgUHJvcGVydGllcyBhcmUgc29ydGVkIGFscGhhYmV0aWNhbGx5CnRvIGFpZCB0ZXN0aW5nLgoKPWVuZCBwcml2YXRlCgo9Y3V0CgpzdWIgX3BhcmFtZXRlcnNfYXNfc3RyaW5nIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkb3V0ICA9ICcnOwogICAgZm9yIG15ICRuYW1lICggc29ydCBrZXlzICV7ICRzZWxmLT5wYXJhbWV0ZXJzIH0gKSB7CiAgICAgICAgbXkgJHZhbHVlID0gJHNlbGYtPnBhcmFtZXRlcnMtPnskbmFtZX07CiAgICAgICAgJG91dAogICAgICAgICAgICAuPSAnOycKICAgICAgICAgICAgLiAkbmFtZSAuICc9JwogICAgICAgICAgICAuICRzZWxmLT5fcXVvdGVkX3BhcmFtZXRlcl92YWx1ZXMoCiAgICAgICAgICAgIHJlZiAkdmFsdWUgPyBAJHZhbHVlIDogJHZhbHVlICk7CiAgICB9CiAgICByZXR1cm4gJG91dDsKfQoKPWJlZ2luIHByaXZhdGUKCj1oZWFkMiBfcXVvdGVkX3BhcmFtZXRlcl92YWx1ZXMgQHZhbHVlcwoKUXVvdGVzIGFueSBvZiB0aGUgdmFsdWVzIGluIEM8QHZhbHVlcz4gdGhhdCBuZWVkIHRvIGJlIHF1b3RlZCBhbmQKcmV0dXJucyB0aGUgcXVvdGVkIHZhbHVlcyBqb2luZWQgYnkgY29tbWFzLgoKSWYgYW55IG9mIHRoZSB2YWx1ZXMgY29udGFpbnMgYSBkb3VibGUtcXVvdGUsIGVyYXNlcyBpdCBhbmQgZW1pdHMgYQp3YXJuaW5nLgoKPWVuZCBwcml2YXRlCgo9Y3V0CgpzdWIgX3F1b3RlZF9wYXJhbWV0ZXJfdmFsdWVzIHsKICAgIG15ICRzZWxmICAgPSBzaGlmdDsKICAgIG15IEB2YWx1ZXMgPSBAXzsKCiAgICBmb3IgbXkgJHZhbCAoQHZhbHVlcykgewogICAgICAgIGlmICggJHZhbCA9fiAvIi8gKSB7CgogICAgICAgICAgICAjIEdldCBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSB1c2VyJ3MgY29kZQogICAgICAgICAgICBsb2NhbCAkQ2FycDo6Q2FycExldmVsID0gJENhcnA6OkNhcnBMZXZlbCArIDE7CiAgICAgICAgICAgIGNhcnAgIkludmFsaWQgcGFyYW1ldGVyIHZhbHVlIChjb250YWlucyBkb3VibGUgcXVvdGUpOiAkdmFsIjsKICAgICAgICAgICAgJHZhbCA9fiB0ci8iLy9kOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gam9pbiAnLCcsIG1hcCB7IC9bOyw6XS8gPyBxcSgiJF8iKSA6ICRfIH0gQHZhbHVlczsKfQoKPWJlZ2luIHByaXZhdGUKCj1oZWFkMiBfZm9sZCAkc3RyaW5nICRjcmxmCgpSZXR1cm5zIEM8JHN0cmluZz4gZm9sZGVkIHdpdGggbmV3bGluZXMgYW5kIGxlYWRpbmcgd2hpdGVzcGFjZSBzbyB0aGF0CmVhY2ggbGluZSBpcyBhdCBtb3N0IDc1IGNoYXJhY3RlcnMuCgooTm90ZSB0aGF0IGl0IGZvbGRzIGF0IDc1IGNoYXJhY3RlcnMsIG5vdCA3NSBieXRlcyBhcyBzcGVjaWZpZWQgaW4gdGhlCnN0YW5kYXJkLikKCklmIHRoaXMgaXMgdkNhbGVuZGFyIDEuMCBhbmQgZW5jb2RlZCB3aXRoIFFVT1RFRC1QUklOVEFCTEUsIGRvZXMgbm90CmZvbGQgYXQgYWxsLgoKPWVuZCBwcml2YXRlCgo9Y3V0CgpzdWIgX2ZvbGQgewogICAgbXkgJHNlbGYgICA9IHNoaWZ0OwogICAgbXkgJHN0cmluZyA9IHNoaWZ0OwogICAgbXkgJGNybGYgICA9IHNoaWZ0OwoKICAgIG15ICRxdW90ZWRfcHJpbnRhYmxlID0gJHNlbGYtPnZjYWwxMAogICAgICAgICYmIHVjKCAkc2VsZi0+cGFyYW1ldGVycy0+eydFTkNPRElORyd9IHx8ICcnICkgZXEgJ1FVT1RFRC1QUklOVEFCTEUnOwoKICAgIGlmICgkcXVvdGVkX3ByaW50YWJsZSkgewoKICAgICAjIEluIG9sZCB2Y2FsLCBxdW90ZWQtcHJpbnRhYmxlIHByb3BlcnRpZXMgaGF2ZSBkaWZmZXJlbnQgZm9sZGluZyBydWxlcy4KICAgICAjIEJ1dCBzb21lIGludGVyb3AgdGVzdHMgc3VnZ2VzdCBpdCdzIHdpc2VyIGp1c3QgdG8gbm90IGZvbGQgZm9yIHZjYWwgMS4wCiAgICAgIyBhdCBhbGwgKGluIHF1b3RlZC1wcmludGFibGUpLgogICAgfSBlbHNlIHsKICAgICAgICBteSAkcG9zID0gMDsKCiAgICAgICAgIyBXYWxrIHRocm91Z2ggdGhlIHZhbHVlLCBsb29raW5nIHRvIHJlcGxhY2UgNzUgY2hhcmFjdGVycyBhdAogICAgICAgICMgYSB0aW1lLiAgV2UgYXNzaWduIHRvIHBvcygpIHRvIHVwZGF0ZSB3aGVyZSB0byBwaWNrIHVwIGZvcgogICAgICAgICMgdGhlIG5leHQgbWF0Y2guCiAgICAgICAgd2hpbGUgKCAkc3RyaW5nID1+IHMvXEcoLns3NX0pKD89LikvJDEkY3JsZiAvICkgewogICAgICAgICAgICAkcG9zICs9IDc1ICsgbGVuZ3RoKCRjcmxmKTsKICAgICAgICAgICAgcG9zKCRzdHJpbmcpID0gJHBvczsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRzdHJpbmc7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsKCg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTsKdXNlIGJhc2UgcXcvQ2xhc3M6OkFjY2Vzc29yLzsKdXNlIERhdGE6OklDYWw6OlByb3BlcnR5Owp1c2UgU3lzOjpIb3N0bmFtZSBxdygpOyAgICAgICAgICMgRm9yIHVuaXF1ZSBVSURzIGZvciBlbnRyaWVzCnVzZSBDYXJwOwoKdXNlIGNvbnN0YW50IENSTEYgPT4gIlx4MGRceDBhIjsKCj1oZWFkMSBOQU1FCgpEYXRhOjpJQ2FsOjpFbnRyeSAtIFJlcHJlc2VudHMgYW4gZW50cnkgaW4gYW4gaUNhbGVuZGFyIGZpbGUKCj1oZWFkMSBTWU5PUFNJUwoKICAgIG15ICR2dG9kbyA9IERhdGE6OklDYWw6OkVudHJ5OjpUb2RvLT5uZXcoKTsKICAgICR2dG9kby0+YWRkX3Byb3BlcnR5KAogICAgIyAuLi4gc2VlIERhdGE6OklDYWw6OkVudHJ5OjpUb2RvIGRvY3VtZW50YXRpb24KICAgICk7CiAgICAkdnRvZG8tPmFkZF9wcm9wZXJ0aWVzKCAuLi4gKTsKCiAgICAkY2FsZW5kYXItPmFkZF9lbnRyeSgkdnRvZG8pOwoKICAgICRldmVudC0+YWRkX2VudHJ5KCRhbGFybSk7CiAgICAkZXZlbnQtPmFkZF9lbnRyaWVzKCRhbGFybTEsIC4uLik7CgogICAgIyBvciBhbGwgaW4gb25lIGdvCiAgICBteSAkdnRvZG8gPSBEYXRhOjpJQ2FsOjpFbnRyeTo6VG9kby0+bmV3KCBcJXByb3BzLCBcQGVudHJpZXMgKTsKCj1oZWFkMSBERVNDUklQVElPTgoKQSBMPERhdGE6OklDYWw6OkVudHJ5PiBvYmplY3QgcmVwcmVzZW50cyBhIHNpbmdsZSBlbnRyeSBpbiBhbgppQ2FsZW5kYXIgZmlsZS4gIChOb3RlIHRoYXQgdGhlIGlDYWxlbmRhciBSRkMgcmVmZXJzIHRvIGVudHJpZXMgYXMKImNvbXBvbmVudHMiLikgIGlDYWxlbmRhciBkZWZpbmVzIHNldmVyYWwgdHlwZXMgb2YgZW50cmllcywgc3VjaCBhcwpldmVudHMgYW5kIHRvLWRvIGxpc3RzOyBlYWNoIG9mIHRoZXNlIGNvcnJlc3BvbmRzIHRvIGEgc3ViY2xhc3Mgb2YKTDxEYXRhOjpJQ2FsOjpFbnRyeT4gKHRob3VnaCBvbmx5IHRvLWRvIGxpc3RzIGFuZCBldmVudHMgYXJlIGN1cnJlbnRseQppbXBsZW1lbnRlZCkuICBMPERhdGE6OklDYWw6OkVudHJ5PiBzaG91bGQgYmUgdHJlYXRlZCBhcyBhbiBhYnN0cmFjdApiYXNlIGNsYXNzIC0tIGFsbCBvYmplY3RzIGNyZWF0ZWQgc2hvdWxkIGJlIG9mIGl0cyBzdWJjbGFzc2VzLiAgVGhlCmVudGlyZSBjYWxlbmRhciBpdHNlbGYgKHRoZSBMPERhdGE6OklDYWw+IG9iamVjdCkgaXMgYWxzbyByZXByZXNlbnRlZAphcyBhIEw8RGF0YTo6SUNhbDo6RW50cnk+IG9iamVjdC4KCkVhY2ggZW50cnkgaGFzIGFuIGVudHJ5IHR5cGUgKHN1Y2ggYXMgQzxWQ0FMRU5EQVI+IG9yIEM8VkVWRU5UPiksIGEKc2VyaWVzIG9mICJwcm9wZXJ0aWVzIiwgYW5kIHBvc3NpYmx5IHNvbWUgc3ViLWVudHJpZXMuICAoT25seSB0aGUgcm9vdApMPERhdGE6OklDYWw+IG9iamVjdCBjYW4gaGF2ZSBzdWItZW50cmllcywgZXhjZXB0IGZvciBhbGFybSBlbnRyaWVzCmNvbnRhaW5lZCBpbiBldmVudHMgYW5kIHRvLWRvcyAobm90IHlldCBpbXBsZW1lbnRlZCkuKQoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBuZXcKCkNyZWF0ZXMgYSBuZXcgZW50cnkgb2JqZWN0IHdpdGggbm8gcHJvcGVydGllcyBvciBzdWItZW50cmllcy4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJGNsYXNzID0gc2hpZnQ7CiAgICBteSAkc2VsZiAgPSAkY2xhc3MtPlNVUEVSOjpuZXcoKTsKICAgICMgQUxMT1cgcGFzc2luZyBhcmd1bWVudHMgaGVyZSEKICAgICRzZWxmLT5zZXQoIHByb3BlcnRpZXMgPT4ge30gKTsKICAgICRzZWxmLT5zZXQoIGVudHJpZXMgICAgPT4gW10gKTsKICAgIGZvciAoQF8pIHsKICAgICAgICByZWYgJF8gZXEgIkhBU0giICBhbmQgJHNlbGYtPmFkZF9wcm9wZXJ0aWVzKCAlJF8gKTsKICAgICAgICByZWYgJF8gZXEgIkFSUkFZIiBhbmQgJHNlbGYtPmFkZF9lbnRyaWVzKCBAJF8gKTsKICAgIH0KICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIGFzX3N0cmluZyBbIGNybGYgPT4gQzxDUkxGPiBdCgpSZXR1cm5zIHRoZSBlbnRyeSBhcyBhbiBhcHByb3ByaWF0ZWx5IGZvcm1hdHRlZCBzdHJpbmcgKHdpdGggdHJhaWxpbmcKbmV3bGluZSkuCgpQcm9wZXJ0aWVzIGFyZSByZXR1cm5lZCBpbiBhbHBoYWJldGljYWwgb3JkZXIsIHdpdGggbXVsdGlwbGUKcHJvcGVydGllcyBvZiB0aGUgc2FtZSBuYW1lIHJldHVybmVkIGluIHRoZSBvcmRlciBhZGRlZC4gIChQcm9wZXJ0eQpvcmRlciBpcyB1bmltcG9ydGFudCBpbiBpQ2FsZW5kYXIsIGFuZCB0aGlzIG1ha2VzIHRlc3RpbmcgZWFzaWVyLikKCklmIGFueSBtYW5kYXRvcnkgcHJvcGVydHkgaXMgbWlzc2luZywgaXNzdWVzIGEgd2FybmluZy4KClRoZSBzdHJpbmcgdG8gdXNlIGFzIGEgbmV3bGluZSBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgYnkgZ2l2aW5nCnRoZSBhIEM8Y3JsZj4gYXJndW1lbnQsIHdoaWNoIGRlZmF1bHRzIHRvIEM8XHgwZFx4MGE+LCBwZXIgUkZDIDI0NDUKc3BlYzsgdGhpcyBvcHRpb24gaXMgcHJpbWFyaWx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoCnZlcnNpb25zIG9mIHRoaXMgbW9kdWxlIGJlZm9yZSAwLjE2LgoKPWN1dAoKbXkgJHVpZCA9IDA7CnN1YiBhc19zdHJpbmcgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICVhcmdzID0gKAogICAgICAgIGNybGYgPT4gQ1JMRiwKICAgICAgICBAXwogICAgKTsKICAgIG15ICRvdXRwdXQgPSAkc2VsZi0+aGVhZGVyKCVhcmdzKTsKCiAgICBteSBAbWFuZGF0b3J5ID0gKAogICAgICAgICRzZWxmLT5tYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgJHNlbGYtPm1hbmRhdG9yeV9yZXBlYXRhYmxlX3Byb3BlcnRpZXMsCiAgICApOwoKICAgIGlmIChncmVwIHskXyBlcSAidWlkIn0gQG1hbmRhdG9yeSBhbmQgIWRlZmluZWQgJHNlbGYtPnByb3BlcnRpZXMtPnt1aWR9CiAgICAgICAgICAgIGFuZCAkc2VsZi0+YXV0b191aWQpIHsKICAgICAgIyBQZXIgdGhlIFJGQywgY3JlYXRlIGEgInBlcnNpc3RlbnQsIGdsb2JhbGx5IHVuaXF1ZSIgVUlEIGZvciB0aGlzCiAgICAgICMgZXZlbnQ7ICJwZXJzaXN0ZW50IiBpbiB0aGlzIGNvbnRleHQgZG9lcyBub3QgbWVhbiBjb25zaXN0ZW50CiAgICAgICMgYWNyb3NzIHRpbWUsIGJ1dCByYXRoZXIgInVuaXF1ZSBhY3Jvc3MgYWxsIHRpbWUiCiAgICAgICRzZWxmLT5hZGRfcHJvcGVydHkoCiAgICAgICAgICB1aWQgPT4gdGltZSgpIC4gJy0nIC4kJCAuICctJyAuICR1aWQrKyAuICdAJyAuIFN5czo6SG9zdG5hbWU6Omhvc3RuYW1lKCkKICAgICAgKTsKICAgIH0KCiAgICBmb3IgbXkgJG5hbWUgKCBAbWFuZGF0b3J5ICkgewogICAgICAgIGNhcnAgIk1hbmRhdG9yeSBwcm9wZXJ0eSBmb3IgIiAuICggcmVmICRzZWxmICkgLiAiIG1pc3Npbmc6ICRuYW1lIgogICAgICAgICAgICB1bmxlc3MgJHNlbGYtPnByb3BlcnRpZXMtPnskbmFtZX0KICAgICAgICAgICAgICAgIGFuZCBAeyAkc2VsZi0+cHJvcGVydGllcy0+eyRuYW1lfSB9OwogICAgfQoKICAgIG15IEBwcm9wZXJ0aWVzID0gc29ydCB7CiAgICAgICAgIyBSRkMyNDQ1IGltcGxpZXMgYW4gb3JkZXIgKHNlZSA0LjYgQ2FsZW5kYXIgQ29tcG9uZW50cykgYnV0IGRvZXMgbm90CiAgICAgICAgIyByZXF1aXJlIGl0LiAgSG93ZXZlciwgc29tZSBhcHBsaWNhdGlvbnMgYnJlYWsgaWYgVkVSU0lPTiBpcyBub3QgZmlyc3QKICAgICAgICAjIChzZWUgaHR0cDovL2ljYWx2YWxpZC5jbG91ZGFwcC5uZXQvRGVmYXVsdC5hc3B4IGFuZCBbcnQuY3Bhbi5vcmcgIyAjNjU0NDddKS4KICAgICAgICByZXR1cm4gLTEgaWYgJGEgZXEgJ3ZlcnNpb24nOwogICAgICAgIHJldHVybiAgMSBpZiAkYiBlcSAndmVyc2lvbic7CiAgICAgICAgcmV0dXJuICRhIGNtcCAkYjsKICAgIH0ga2V5cyAleyAkc2VsZi0+cHJvcGVydGllcyB9OwoKICAgIGZvciBteSAkbmFtZSAoQHByb3BlcnRpZXMpIHsKICAgICAgICAkb3V0cHV0IC49ICRfCiAgICAgICAgICAgIGZvciBtYXAgeyAkXy0+YXNfc3RyaW5nKCVhcmdzKSB9IEB7ICRzZWxmLT5wcm9wZXJ0aWVzLT57JG5hbWV9IH07CiAgICB9CgogICAgZm9yIG15ICRlbnRyeSAoIEB7ICRzZWxmLT5lbnRyaWVzIH0gKSB7CiAgICAgICAgJG91dHB1dCAuPSAkZW50cnktPmFzX3N0cmluZyglYXJncyk7CiAgICB9CiAgICAkb3V0cHV0IC49ICRzZWxmLT5mb290ZXIoJWFyZ3MpOwoKICAgIHJldHVybiAkb3V0cHV0Owp9Cgo9aGVhZDIgYWRkX2VudHJ5ICRlbnRyeQoKQWRkcyBhbiBlbnRyeSB0byB0aGlzIGVudHJ5LiAgKEFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQsIHRoaXMgc2hvdWxkCm9ubHkgYmUgY2FsbGVkIG9uIGVpdGhlciBhIHRvLWRvIG9yIGV2ZW50IGVudHJ5IHdpdGggYW4gYWxhcm0gZW50cnksCm9yIG9uIGEgY2FsZW5kYXIgZW50cnkgKEw8RGF0YTo6SUNhbD4pIHdpdGggYSB0by1kbywgZXZlbnQsIGpvdXJuYWwsCnRpbWV6b25lLCBvciBmcmVlL2J1c3kgZW50cnkuKQoKUmV0dXJucyB0cnVlIGlmIHRoZSBlbnRyeSB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlCihwZXJoYXBzIGJlY2F1c2UgeW91IHRyaWVkIHRvIGFkZCBhbiBlbnRyeSBvZiBhbiBpbnZhbGlkIHR5cGUsIGJ1dAp0aGlzIGNoZWNrIGhhc24ndCBiZWVuIGltcGxlbWVudGVkIHlldCkuCgo9Y3V0CgpzdWIgYWRkX2VudHJ5IHsKICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgbXkgJGVudHJ5ID0gc2hpZnQ7CiAgICBwdXNoIEB7ICRzZWxmLT57ZW50cmllc30gfSwgJGVudHJ5OwoKICAgICRlbnRyeS0+dmNhbDEwKCAkc2VsZi0+dmNhbDEwICk7CiAgICAkZW50cnktPnJmY19zdHJpY3QoICRzZWxmLT5yZmNfc3RyaWN0ICk7CiAgICAkZW50cnktPmF1dG9fdWlkKCAkc2VsZi0+YXV0b191aWQgKTsKCiAgICByZXR1cm4gJHNlbGY7Cn0KCj1oZWFkMiBhZGRfZW50cmllcyAkZW50cnkxLCBbJGVudHJ5MiwgLi4uXQoKQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY2FsbCBDPGFkZF9lbnRyeT4gc2V2ZXJhbCB0aW1lcyB3aXRoIGEgbGlzdApvZiBlbnRyaWVzLgoKPWN1dAoKc3ViIGFkZF9lbnRyaWVzIHsKICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgJHNlbGYtPmFkZF9lbnRyeSggJF8gKSBmb3IgQF87CiAgICByZXR1cm4gJHNlbGY7Cn0KCj1oZWFkMiBlbnRyaWVzCgpSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBhcnJheSBvZiBzdWJlbnRyaWVzIG9mIHRoaXMgZW50cnkuCgo9Y3V0CgpfX1BBQ0tBR0VfXy0+bWtfcm9fYWNjZXNzb3JzKCdlbnRyaWVzJyk7Cgo9aGVhZDIgcHJvcGVydGllcwoKUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgaGFzaCBvZiBwcm9wZXJ0aWVzIG9mIHRoaXMgZW50cnkuICBUaGUga2V5cwphcmUgcHJvcGVydHkgbmFtZXMgYW5kIHRoZSB2YWx1ZXMgYXJlIGFycmF5IHJlZmVyZW5jZXMgY29udGFpbmluZwpMPERhdGE6OklDYWw6OlByb3BlcnR5PiBvYmplY3RzLgoKPWN1dAoKX19QQUNLQUdFX18tPm1rX3JvX2FjY2Vzc29ycygncHJvcGVydGllcycpOwoKPWhlYWQyIHByb3BlcnR5CgpHaXZlbiBhIHByb3BlcnR5IG5hbWUgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgb2YKTDxEYXRhOjpJQ2FsOjpQcm9wZXJ0eT4gb2JqZWN0cy4KCj1jdXQKCnN1YiBwcm9wZXJ0eSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJHByb3AgPSBsYyBzaGlmdDsKICAgIHJldHVybiAkc2VsZi0+eydwcm9wZXJ0aWVzJ30tPnskcHJvcH07Cn0KCj1oZWFkMiBhZGRfcHJvcGVydHkgJHByb3BuYW1lID0+ICRwcm9wdmFsCgpDcmVhdGVzIGEgbmV3IEw8RGF0YTo6SUNhbDo6UHJvcGVydHk+IG9iamVjdCB3aXRoIG5hbWUgQzwkcHJvcG5hbWU+CmFuZCB2YWx1ZSBDPCRwcm9wdmFsPiBhbmQgYWRkcyBpdCB0byB0aGUgZXZlbnQuCgpJZiB0aGUgcHJvcGVydHkgaXMgbm90IGtub3duIHRvIGV4aXN0IGZvciB0aGF0IG9iamVjdCB0eXBlIGFuZCBkb2VzCm5vdCBiZWdpbiB3aXRoIEM8WC0+LCBpc3N1ZXMgYSB3YXJuaW5nLgoKSWYgdGhlIHByb3BlcnR5IGlzIGtub3duIHRvIGJlIHVuaXF1ZSwgcmVwbGFjZXMgdGhlIG9yaWdpbmFsIHByb3BlcnR5LgoKVG8gc3BlY2lmeSBwYXJhbWV0ZXJzIGZvciB0aGUgcHJvcGVydHksIGxldCBDPCRwcm9wdmFsPiBiZSBhCnR3by1lbGVtZW50IGFycmF5IHJlZmVyZW5jZSB3aGVyZSB0aGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgcHJvcGVydHkKdmFsdWUgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBpcyBhIGhhc2ggcmVmZXJlbmNlLiAgVGhlIGtleXMgb2YgdGhlCmhhc2ggYXJlIHBhcmFtZXRlciBuYW1lczsgdGhlIHZhbHVlcyBzaG91bGQgYmUgZWl0aGVyIHN0cmluZ3Mgb3IgYXJyYXkKcmVmZXJlbmNlcyBvZiBzdHJpbmdzLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcGFyYW1ldGVyIHNob3VsZCBoYXZlCm9uZSBvciBtdWx0aXBsZSAodG8gYmUgY29tbWEtc2VwYXJhdGVkKSB2YWx1ZXMuCgpFeGFtcGxlcyBvZiBzZXR0aW5nIHBhcmFtZXRlcnM6CgogIyBBZGQgYSBwcm9wZXJ0eSB3aXRoIGEgcGFyYW1ldGVyIG9mIFZBTFVFIHNldCB0byAnREFURScKICRldmVudC0+YWRkX3Byb3BlcnR5KCByZGF0ZSA9PiBbICRkYXRlLCB7IFZBTFVFID0+ICdEQVRFJyB9IF0gKTsKCj1jdXQKCnN1YiBhZGRfcHJvcGVydHkgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRwcm9wID0gbGMgc2hpZnQ7CiAgICBteSAkdmFsICA9IHNoaWZ0OwoKICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkcHJvcDsKCiAgICB1bmxlc3MgKCAkc2VsZi0+aXNfcHJvcGVydHkoJHByb3ApIG9yICRwcm9wID1+IC9eeC0vaSApIHsKICAgICAgICBjYXJwICJVbmtub3duIHByb3BlcnR5IGZvciAiIC4gKCByZWYgJHNlbGYgKSAuICI6ICRwcm9wIjsKICAgIH0KCiAgICBpZiAoICRzZWxmLT5pc191bmlxdWUoJHByb3ApICkgewoKICAgICAgICAjIEl0IHNob3VsZCBiZSB1bmlxdWUsIHNvIGNsZWFyIG91dCBhbnl0aGluZyB3ZSBtaWdodCBoYXZlIGZpcnN0CiAgICAgICAgJHNlbGYtPnByb3BlcnRpZXMtPnskcHJvcH0gPSBbXTsKICAgIH0KCiAgICAkdmFsID0gWyAkdmFsLCB7fSBdIHVubGVzcyByZWYgJHZhbCBlcSAnQVJSQVknOwoKICAgIG15ICggJHByb3BfdmFsdWUsICRwYXJhbV9oYXNoICkgPSBAJHZhbDsKCiAgICBteSAkcCA9IERhdGE6OklDYWw6OlByb3BlcnR5LT5uZXcoICRwcm9wID0+ICRwcm9wX3ZhbHVlLCAkcGFyYW1faGFzaCApOwogICAgJHAtPnZjYWwxMCggJHNlbGYtPnZjYWwxMCApOwoKICAgIHB1c2ggQHsgJHNlbGYtPnByb3BlcnRpZXMtPnskcHJvcH0gfSwgJHA7CiAgICByZXR1cm4gJHNlbGY7Cn0KCj1oZWFkMiBhZGRfcHJvcGVydGllcyAkcHJvcG5hbWUxID0+ICRwcm9wdmFsMSwgWyRwcm9wbmFtZTIgPT4gJHByb3BuYW1lMiwgLi4uXQoKQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY2FsbCBDPGFkZF9wcm9wZXJ0eT4gc2V2ZXJhbCB0aW1lcyB3aXRoIGEgbGlzdApvZiBwcm9wZXJ0aWVzLgoKVGhpcyBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBjYWxsIGFkZCBDPGFkZF9wcm9wZXJ0eT4gb24gdGhlbSBpbiB0aGUKb3JkZXIgZ2l2ZW4sIHNvIHRoYXQgdW5pcXVlIHByb3BlcnRpZXMgZ2l2ZW4gbGF0ZXIgaW4gdGhlIGNhbGwgd2lsbAp0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aG9zZSBnaXZlbiBlYXJsaWVyLiAgKFRoaXMgaXMgdW5yZWxhdGVkIHRvIHRoZQpvcmRlciBvZiBwcm9wZXJ0aWVzIHdoZW4gdGhlIGVudHJ5IGlzIHJlbmRlcmVkIGFzIGEgc3RyaW5nLCB0aG91Z2guKQoKUGFyYW1ldGVycyBmb3IgdGhlIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBpbiB0aGUgc2FtZSB3YXkgYXMgaW4KQzxhZGRfcHJvcGVydHk+LgoKPWN1dAoKc3ViIGFkZF9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgaWYgKCBAXyAlIDIgKSB7CiAgICAgICAgY2FycCAiT2RkIG51bWJlciBvZiBlbGVtZW50cyBpbiBhZGRfcHJvcGVydGllcyBjYWxsIjsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgd2hpbGUgKEBfKSB7CiAgICAgICAgbXkgJHByb3AgPSBzaGlmdDsKICAgICAgICBteSAkdmFsICA9IHNoaWZ0OwogICAgICAgICRzZWxmLT5hZGRfcHJvcGVydHkoICRwcm9wID0+ICR2YWwgKTsKICAgIH0KICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIG1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcwoKU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgKHdoaWNoIHJldHVybnMgYW4gZW1wdHkgbGlzdCBieQpkZWZhdWx0KSB0byBwcm92aWRlIGEgbGlzdCBvZiBsb3dlciBjYXNlIHN0cmluZ3MgaWRlbnRpZnlpbmcgdGhlCnByb3BlcnRpZXMgd2hpY2ggbXVzdCBhcHBlYXIgZXhhY3RseSBvbmNlIGluIHRoZSBzdWJjbGFzcydzIGVudHJ5CnR5cGUuCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsgKCkgfQoKPWhlYWQyIG1hbmRhdG9yeV9yZXBlYXRhYmxlX3Byb3BlcnRpZXMKClN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kICh3aGljaCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgYnkKZGVmYXVsdCkgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgbG93ZXIgY2FzZSBzdHJpbmdzIGlkZW50aWZ5aW5nIHRoZQpwcm9wZXJ0aWVzIHdoaWNoIG11c3QgYXBwZWFyIGF0IGxlYXN0IG9uY2UgaW4gdGhlIHN1YmNsYXNzJ3MgZW50cnkKdHlwZS4KCj1jdXQKCnN1YiBtYW5kYXRvcnlfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsgKCkgfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCAod2hpY2ggcmV0dXJucyBhbiBlbXB0eSBsaXN0IGJ5CmRlZmF1bHQpIHRvIHByb3ZpZGUgYSBsaXN0IG9mIGxvd2VyIGNhc2Ugc3RyaW5ncyBpZGVudGlmeWluZyB0aGUKcHJvcGVydGllcyB3aGljaCBtdXN0IGFwcGVhciBhdCBtb3N0IG9uY2UgaW4gdGhlIHN1YmNsYXNzJ3MgZW50cnkKdHlwZS4KCj1jdXQKCnN1YiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcyB7ICgpIH0KCj1oZWFkMiBvcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXMKClN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kICh3aGljaCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgYnkKZGVmYXVsdCkgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgbG93ZXIgY2FzZSBzdHJpbmdzIGlkZW50aWZ5aW5nIHRoZQpwcm9wZXJ0aWVzIHdoaWNoIG1heSBhcHBlYXIgemVybywgb25lLCBvciBtb3JlIHRpbWVzIGluIHRoZSBzdWJjbGFzcydzCmVudHJ5IHR5cGUuCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsgKCkgfQoKPWhlYWQyIGlzX3Byb3BlcnR5ICRuYW1lCgpSZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9wZXJ0eQpDPCRuYW1lPiBpcyBrbm93biB0byB0aGUgY2xhc3MgKHRoYXQgaXMsIGlmIGl0J3MgbGlzdGVkIGluCkM8KG1hbmRhdG9yeS9vcHRpb25hbClfKHVuaXF1ZS9yZXBlYXRhYmxlKV9wcm9wZXJ0aWVzPikuCgo9Y3V0CgpzdWIgaXNfcHJvcGVydHkgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRuYW1lID0gc2hpZnQ7CiAgICByZXR1cm4gc2NhbGFyIGdyZXAgeyAkXyBlcSAkbmFtZSB9ICRzZWxmLT5tYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgJHNlbGYtPm1hbmRhdG9yeV9yZXBlYXRhYmxlX3Byb3BlcnRpZXMsCiAgICAgICAgJHNlbGYtPm9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzLAogICAgICAgICRzZWxmLT5vcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXM7Cn0KCj1oZWFkMiBpc19tYW5kYXRvcnkgJG5hbWUKClJldHVybnMgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIHByb3BlcnR5CkM8JG5hbWU+IGlzIGtub3duIHRvIHRoZSBjbGFzcyBhcyBtYW5kYXRvcnkgKHRoYXQgaXMsIGlmIGl0J3MgbGlzdGVkCmluIEM8bWFuZGF0b3J5Xyh1bmlxdWUvcmVwZWF0YWJsZSlfcHJvcGVydGllcz4pLgoKPWN1dAoKc3ViIGlzX21hbmRhdG9yeSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJG5hbWUgPSBzaGlmdDsKICAgIHJldHVybiBzY2FsYXIgZ3JlcCB7ICRfIGVxICRuYW1lIH0gJHNlbGYtPm1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcywKICAgICAgICAkc2VsZi0+bWFuZGF0b3J5X3JlcGVhdGFibGVfcHJvcGVydGllczsKfQoKPWhlYWQyIGlzX29wdGlvbmFsICRuYW1lCgpSZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9wZXJ0eQpDPCRuYW1lPiBpcyBrbm93biB0byB0aGUgY2xhc3MgYXMgb3B0aW9uYWwgKHRoYXQgaXMsIGlmIGl0J3MgbGlzdGVkIGluCkM8b3B0aW9uYWxfKHVuaXF1ZS9yZXBlYXRhYmxlKV9wcm9wZXJ0aWVzPikuCgo9Y3V0CgpzdWIgaXNfb3B0aW9uYWwgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRuYW1lID0gc2hpZnQ7CiAgICByZXR1cm4gc2NhbGFyIGdyZXAgeyAkXyBlcSAkbmFtZSB9ICRzZWxmLT5vcHRpb25hbF91bmlxdWVfcHJvcGVydGllcywKICAgICAgICAkc2VsZi0+b3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzOwp9Cgo9aGVhZDIgaXNfdW5pcXVlICRuYW1lCgpSZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9wZXJ0eQpDPCRuYW1lPiBpcyBrbm93biB0byB0aGUgY2xhc3MgYXMgdW5pcXVlICh0aGF0IGlzLCBpZiBpdCdzIGxpc3RlZCBpbgpDPChtYW5kYXRvcnkvb3B0aW9uYWwpX3VuaXF1ZV9wcm9wZXJ0aWVzPikuCgo9Y3V0CgpzdWIgaXNfdW5pcXVlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkbmFtZSA9IHNoaWZ0OwogICAgcmV0dXJuIHNjYWxhciBncmVwIHsgJF8gZXEgJG5hbWUgfSAkc2VsZi0+bWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzLAogICAgICAgICRzZWxmLT5vcHRpb25hbF91bmlxdWVfcHJvcGVydGllczsKfQoKPWhlYWQyIGlzX3JlcGVhdGFibGUgJG5hbWUKClJldHVybnMgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIHByb3BlcnR5CkM8JG5hbWU+IGlzIGtub3duIHRvIHRoZSBjbGFzcyBhcyByZXBlYXRhYmxlICh0aGF0IGlzLCBpZiBpdCdzIGxpc3RlZAppbiBDPChtYW5kYXRvcnkvb3B0aW9uYWwpX3JlcGVhdGFibGVfcHJvcGVydGllcz4pLgoKPWN1dAoKc3ViIGlzX3JlcGVhdGFibGUgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRuYW1lID0gc2hpZnQ7CiAgICByZXR1cm4gc2NhbGFyIGdyZXAgeyAkXyBlcSAkbmFtZSB9ICRzZWxmLT5tYW5kYXRvcnlfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzLAogICAgICAgICRzZWxmLT5vcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXM7Cn0KCj1oZWFkMiBpY2FsX2VudHJ5X3R5cGUKClN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgdGhlIGlkZW50aWZ5aW5nIHR5cGUKbmFtZSBvZiB0aGUgZW50cnkgKHN1Y2ggYXMgQzxWQ0FMRU5EQVI+IG9yIEM8VlRPRE8+KS4KCj1jdXQKCnN1YiBpY2FsX2VudHJ5X3R5cGUgeydVTkRFRklORUQnfQoKPWhlYWQyIHZjYWwxMCBbJGJvb2xdCgpHZXRzIG9yIHNldHMgYSBib29sZWFuIHNheWluZyB3aGV0aGVyIHRoaXMgZW50cnkgc2hvdWxkIGJlIGludGVycHJldGVkCmFzIHZDYWxlbmRhciAxLjAgKGFzIG9wcG9zZWQgdG8gaUNhbGVuZGFyIDIuMCkuICBHZW5lcmFsbHksIHlvdSBjYW4KanVzdCBzZXQgdGhpcyBvbiB5b3VyIG1haW4gTDxEYXRhOjpJQ2FsPiBvYmplY3Qgd2hlbiB5b3UgY29uc3RydWN0IGl0OwpDPGFkZF9lbnRyeT4gYXV0b21hdGljYWxseSBtYWtlcyBzdXJlIHRoYXQgc3ViLWVudHJpZXMgZW5kIHVwIHdpdGggdGhlCnNhbWUgdmFsdWUgYXMgdGhlaXIgcGFyZW50cy4KCj1jdXQKCl9fUEFDS0FHRV9fLT5ta19hY2Nlc3NvcnMoJ3ZjYWwxMCcpOwoKPWhlYWQyIHJmY19zdHJpY3QgWyRib29sXQoKR2V0cyBvciBzZXRzIGEgYm9vbGVhbiBzYXlpbmcgd2hldGhlciB0aGlzIGVudHJ5IHdpbGwgY29tcGxhaW4gYWJvdXQKbWlzc2luZyBVSURzIGFzIHBlciBSRkMyNDQ2LiBEZWZhdWx0cyB0byBmYWxzZSwgZm9yIGJhY2t3YXJkcwpjb21wYXRpYmlsaXR5LiAgR2VuZXJhbGx5LCB5b3UgY2FuIGp1c3Qgc2V0IHRoaXMgb24geW91ciBtYWluCkw8RGF0YTo6SUNhbD4gb2JqZWN0IHdoZW4geW91IGNvbnN0cnVjdCBpdDsgQzxhZGRfZW50cnk+IGF1dG9tYXRpY2FsbHkKbWFrZXMgc3VyZSB0aGF0IHN1Yi1lbnRyaWVzIGVuZCB1cCB3aXRoIHRoZSBzYW1lIHZhbHVlIGFzIHRoZWlyIHBhcmVudHMuCgo9Y3V0CgpfX1BBQ0tBR0VfXy0+bWtfYWNjZXNzb3JzKCdyZmNfc3RyaWN0Jyk7Cgo9aGVhZDIgYXV0b191aWQgWyRib29sXQoKR2V0cyBvciBzZXRzIGEgYm9vbGVhbiBzYXlpbmcgd2hldGhlciB0aGlzIGVudHJ5IHNob3VsZCBhdXRvbWF0aWNhbGx5CmdlbmVyYXRlIGl0cyBvd24gcGVyc2lzdGVudGx5IHVuaXF1ZSBVSURzLiAgRGVmYXVsdHMgdG8gZmFsc2UuCkdlbmVyYWxseSwgeW91IGNhbiBqdXN0IHNldCB0aGlzIG9uIHlvdXIgbWFpbiBMPERhdGE6OklDYWw+IG9iamVjdCB3aGVuCnlvdSBjb25zdHJ1Y3QgaXQ7IEM8YWRkX2VudHJ5PiBhdXRvbWF0aWNhbGx5IG1ha2VzIHN1cmUgdGhhdCBzdWItZW50cmllcwplbmQgdXAgd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyB0aGVpciBwYXJlbnRzLgoKPWN1dAoKX19QQUNLQUdFX18tPm1rX2FjY2Vzc29ycygnYXV0b191aWQnKTsKCj1oZWFkMiBoZWFkZXIKClJldHVybnMgdGhlIGhlYWRlciBsaW5lIGZvciB0aGUgZW50cnkgKGluY2x1ZGluZyB0cmFpbGluZyBuZXdsaW5lKS4KCj1jdXQKCnN1YiBoZWFkZXIgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICVhcmdzID0gKAogICAgICAgIGNybGYgPT4gQ1JMRiwKICAgICAgICBAXwogICAgKTsKICAgIHJldHVybiAnQkVHSU46JyAuICRzZWxmLT5pY2FsX2VudHJ5X3R5cGUgLiAkYXJnc3tjcmxmfTsKfQoKPWhlYWQyIGZvb3RlcgoKUmV0dXJucyB0aGUgZm9vdGVyIGxpbmUgZm9yIHRoZSBlbnRyeSAoaW5jbHVkaW5nIHRyYWlsaW5nIG5ld2xpbmUpLgoKPWN1dAoKc3ViIGZvb3RlciB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJWFyZ3MgPSAoCiAgICAgICAgY3JsZiA9PiBDUkxGLAogICAgICAgIEBfCiAgICApOwogICAgcmV0dXJuICdFTkQ6JyAuICRzZWxmLT5pY2FsX2VudHJ5X3R5cGUgLiAkYXJnc3tjcmxmfTsKfQoKIyBtYXBwaW5nIG9mIGV2ZW50IHR5cGVzIHRvIGNsYXNzICh1bmRlciB0aGUgRGF0YTo6SWNhbDo6RXZlbnQgbmFtZXNwYWNlKQpteSAlX2dlbmVyaWMgPSAoCiAgICB2ZXZlbnQgICAgPT4gJ0V2ZW50JywKICAgIHZ0b2RvICAgICA9PiAnVG9kbycsCiAgICB2am91cm5hbCAgPT4gJ0pvdXJuYWwnLAogICAgdmZyZWVidXN5ID0+ICdGcmVlQnVzeScsCiAgICB2dGltZXpvbmUgPT4gJ1RpbWVab25lJywKICAgIHN0YW5kYXJkICA9PiAnVGltZVpvbmU6OlN0YW5kYXJkJywKICAgIGRheWxpZ2h0ICA9PiAnVGltZVpvbmU6OkRheWxpZ2h0JywKKTsKCj1oZWFkMiBwYXJzZV9vYmplY3QKClRyYW5zbGF0ZSBhIEw8VGV4dDo6dkZpbGU6OmFzRGF0YT4gc3ViIG9iamVjdCBpbnRvIHRoZSBhcHByb3ByaWF0ZQpMPERhdGE6OmlDYWw6OkV2ZW50PiBzdWJ0eXBlLgoKPWN1dAoKIyBUT0RPOiB0aGlzIGlzIGN1cnJlbnRseSByZWN1cnNpdmUgd2hpY2ggY291bGQgYmxvdyB0aGUgc3RhY2sgLQojICAgICAgIGl0IG1pZ2h0IGJlIHdvcnRoIHJlZmFjdG9yaW5nIHRvIG1ha2UgaXQgc2VxdWVudGlhbApzdWIgcGFyc2Vfb2JqZWN0IHsKICAgIG15ICggJHNlbGYsICRvYmplY3QgKSA9IEBfOwoKICAgIG15ICR0eXBlID0gJG9iamVjdC0+e3R5cGV9OwoKICAgIG15ICRuZXdfc2VsZjsKCiAgICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiBpdCdzIGdlbmVyaWMgbG9uZyBuYW1lIGp1c3QgaW4gY2FzZSB0aGVyZQogICAgIyBldmVudCB0dXJucyBvdXQgdG8gYmUgYSBWR0VORVJJQyBlbnRyeSB0eXBlCiAgICBpZiAoIG15ICRjbGFzcyA9ICRfZ2VuZXJpY3sgbGMoJHR5cGUpIH0gKSB7CiAgICAgICAgJG5ld19zZWxmID0gJHNlbGYtPl9wYXJzZV9kYXRhX2ljYWxfZ2VuZXJpYyggJGNsYXNzLCAkb2JqZWN0ICk7CgogICAgICAgICMgdGhlbiBsb29rIGZvciBzcGVjaWZpYyBvdmVycmlkZXMKICAgIH0gZWxzaWYgKCBteSAkc3ViID0gJHNlbGYtPmNhbiggJ19wYXJzZV8nIC4gbGMoJHR5cGUpICkgKSB7CiAgICAgICAgJG5ld19zZWxmID0gJHNlbGYtPiRzdWIoJG9iamVjdCk7CgogICAgICAgICMgY29tcGxhaW4KICAgIH0gZWxzZSB7CiAgICAgICAgd2FybiAiQ2FuJ3QgcGFyc2UgdHlwZSAkdHlwZSB5ZXQiOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlY3Vyc2UgdGhyb3VnaCBzdWItb2JqZWN0cwogICAgZm9yZWFjaCBteSAkc3ViX29iamVjdCAoIEB7ICRvYmplY3QtPntvYmplY3RzfSB9ICkgewogICAgICAgICRuZXdfc2VsZi0+cGFyc2Vfb2JqZWN0KCRzdWJfb2JqZWN0KTsKICAgIH0KCiAgICByZXR1cm4gJHNlbGY7Cn0KCiMgc3BlY2lhbCBiZWNhdXNlIHdlIHdhbnQgdG8gdXNlIG91cnNlbHZlcyBhcyB0aGUgcGFyZW50CnN1YiBfcGFyc2VfdmNhbGVuZGFyIHsKICAgIG15ICggJHNlbGYsICRvYmplY3QgKSA9IEBfOwogICAgJHNlbGYtPl9wYXJzZV9nZW5lcmljX2V2ZW50KCAkc2VsZiwgJG9iamVjdCApOwogICAgcmV0dXJuICRzZWxmOwp9CgojIG1hcHBpbmcgb2YgYWN0aW9uIHR5cGVzIHRvIGNsYXNzICh1bmRlciB0aGUgRGF0YTo6SWNhbDo6RXZlbnQ6OkFsYXJtIG5hbWVzcGFjZSkKbXkgJV9hY3Rpb25fbWFwID0gKAogICAgQVVESU8gICAgID0+ICdBdWRpbycsCiAgICBESVNQTEFZICAgPT4gJ0Rpc3BsYXknLAogICAgRU1BSUwgICAgID0+ICdFbWFpbCcsCiAgICBQUk9DRURVUkUgPT4gJ1Byb2NlZHVyZScsCiAgICBOT05FICAgICAgPT4gJ05vbmUnLAogICAgVVJJICAgICAgID0+ICdVUkknLAopOwoKIyBhbGFybXMgaGF2ZSBhY3Rpb25zCnN1YiBfcGFyc2VfdmFsYXJtIHsKICAgIG15ICggJHBhcmVudCwgJG9iamVjdCApID0gQF87CgogICAgIyBpY2sKICAgIG15ICRhY3Rpb24gPSAkb2JqZWN0LT57cHJvcGVydGllc30tPntBQ1RJT059LT5bMF0tPnt2YWx1ZX07CiAgICBkaWUgIkNhbid0IHBhcnNlIFZBTEFSTSB3aXRoIGFjdGlvbiAkYWN0aW9uIgogICAgICAgIHVubGVzcyBleGlzdHMgJF9hY3Rpb25fbWFweyRhY3Rpb259OwoKICAgICRhY3Rpb24gPSAkX2FjdGlvbl9tYXB7JGFjdGlvbn07CiAgICBteSAkYWxhcm1fY2xhc3MgPSAiRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjokYWN0aW9uIjsKICAgIGV2YWwgInJlcXVpcmUgJGFsYXJtX2NsYXNzIjsKICAgIGRpZSAiRmFpbGVkIHRvIHJlcXVpcmUgJGFsYXJtX2NsYXNzIDogJEAiIGlmICRAOwoKICAgICRhbGFybV9jbGFzcy0+aW1wb3J0OwogICAgbXkgJGFsYXJtID0gJGFsYXJtX2NsYXNzLT5uZXc7CiAgICAkcGFyZW50LT5fcGFyc2VfZ2VuZXJpY19ldmVudCggJGFsYXJtLCAkb2JqZWN0ICk7CiAgICAkcGFyZW50LT5hZGRfZW50cnkoJGFsYXJtKTsKICAgIHJldHVybiAkYWxhcm07Cn0KCiMgZ2VuZXJpYyBldmVudCBoYW5kbGVyCnN1YiBfcGFyc2VfZGF0YV9pY2FsX2dlbmVyaWMgewogICAgbXkgKCAkcGFyZW50LCAkY2xhc3MsICRvYmplY3QgKSA9IEBfOwoKICAgIG15ICRlbnRyeV9jbGFzcyA9ICJEYXRhOjpJQ2FsOjpFbnRyeTo6JGNsYXNzIjsKICAgIGV2YWwgInJlcXVpcmUgJGVudHJ5X2NsYXNzIjsKICAgIGRpZSAiRmFpbGVkIHRvIHJlcXVpcmUgJGVudHJ5X2NsYXNzIDogJEAiIGlmICRAOwoKICAgICRlbnRyeV9jbGFzcy0+aW1wb3J0OwogICAgbXkgJGVudHJ5ID0gJGVudHJ5X2NsYXNzLT5uZXc7CiAgICAkZW50cnktPnZjYWwxMCgkcGFyZW50LT52Y2FsMTApOwogICAgJHBhcmVudC0+X3BhcnNlX2dlbmVyaWNfZXZlbnQoICRlbnRyeSwgJG9iamVjdCApOwogICAgJHBhcmVudC0+YWRkX2VudHJ5KCRlbnRyeSk7CiAgICByZXR1cm4gJGVudHJ5Owp9CgojIGhhbmRsZSB0cmFuc2ZlcnJpbmcgb2YgcHJvcGVydGllcwpzdWIgX3BhcnNlX2dlbmVyaWNfZXZlbnQgewogICAgbXkgKCAkcGFyZW50LCAkZW50cnksICRvYmplY3QgKSA9IEBfOwoKICAgIG15ICRwID0gJG9iamVjdC0+e3Byb3BlcnRpZXN9OwogICAgZm9yIG15ICRrZXkgKCBzb3J0IGtleXMgJSRwICkgewogICAgICAgIGZvcmVhY2ggbXkgJG9jY3VyZW5jZSAoQHsgJHAtPnska2V5fSB9KSB7CiAgICAgICAgICAgIG15ICRwcm9wOwoKICAgICAgICAgICAgIyBVbmVzY2FwZXMsIGJ1dCBvbmx5IGluIHYyLCBhbmQgbm90IGlmIGl0J3MgZXhwbGljaXRseSBub3QgVEVYVAogICAgICAgICAgICBpZiAobm90ICRwYXJlbnQtPnZjYWwxMAogICAgICAgICAgICAgICAgYW5kICggIG5vdCAkb2NjdXJlbmNlLT57cGFyYW19CiAgICAgICAgICAgICAgICAgICAgb3Igbm90IGRlZmluZWQgJG9jY3VyZW5jZS0+e3BhcmFtfXtWQUxVRX0KICAgICAgICAgICAgICAgICAgICBvciAkb2NjdXJlbmNlLT57cGFyYW19e1ZBTFVFfSBlcSAiVEVYVCIgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkb2NjdXJlbmNlLT57dmFsdWV9ID1+IHMvXFwoWzssXFxdKS8kMS9nOwogICAgICAgICAgICAgICAgJG9jY3VyZW5jZS0+e3ZhbHVlfSA9fiBzL1xcbi9cbi9pZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBoYW5kbGUgb3B0aW9uYWwgcGFyYW1zIGFuZCAnbm9ybWFsJyBrZXkvdmFsdWUgcGFpcnMKICAgICAgICAgICAgIyBUT0RPOiBsaW5lIHdyYXBwaW5nPwogICAgICAgICAgICBpZiAoICRvY2N1cmVuY2UtPntwYXJhbX0gKSB7CiAgICAgICAgICAgICAgICAkcHJvcCA9IFsgJG9jY3VyZW5jZS0+e3ZhbHVlfSwgJG9jY3VyZW5jZS0+e3BhcmFtfSBdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHByb3AgPSAkb2NjdXJlbmNlLT57dmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRlbnRyeS0+YWRkX3Byb3BlcnR5KCBsYygka2V5KSA9PiAkcHJvcCApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkZW50cnk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6RnJlZUJ1c3k7Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OkZyZWVCdXN5IC0gUmVwcmVzZW50cyBibG9ja3Mgb2YgZnJlZSBhbmQgYnVzeSB0aW1lIGluIGFuIGlDYWxlbmRhciBmaWxlCgo9aGVhZDEgU1lOT1BTSVMKCiAgICBteSAkdmZyZWVidXN5ID0gRGF0YTo6SUNhbDo6RW50cnk6OkZyZWVCdXN5LT5uZXcoKTsKICAgICR2ZnJlZWJ1c3ktPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgIG9yZ2FuaXplciA9PiAnTUFJTFRPOmpzbWl0aEBob3N0LmNvbScsCiAgICAgICAgIyBEYXQqZSo6OklDYWwgaXMgbm90IGEgdHlwbyBoZXJlCiAgICAgICAgZnJlZWJ1c3kgICA9PiBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IC4uLiApLT5pY2FsIC4gJy8nIC4gRGF0ZTo6SUNhbC0+bmV3KCBlcG9jaCA9PiAuLi4gKS0+aWNhbCwKICAgICk7CgogICAgJGNhbGVuZGFyLT5hZGRfZW50cnkoJHZmcmVlYnVzeSk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6RnJlZUJ1c3k+IG9iamVjdCByZXByZXNlbnRzIGEgcmVxdWVzdCBmb3IKaW5mb3JtYXRpb24gYWJvdXQgZnJlZSBhbmQgYnVzeSB0aW1lIG9yIGEgcmVwb25zZSB0byBzdWNoIGEgcmVxdWVzdCwKaW4gYW4gaUNhbGVuZGFyIGZpbGUuICAoTm90ZSB0aGF0IHRoZSBpQ2FsZW5kYXIgUkZDIHJlZmVycyB0byBlbnRyaWVzCmFzICJjb21wb25lbnRzIi4pICBJdCBpcyBhIHN1YmNsYXNzIG9mIEw8RGF0YTo6SUNhbDo6RW50cnk+IGFuZAphY2NlcHRzIGFsbCBvZiBpdHMgbWV0aG9kcy4KCj1oZWFkMSBNRVRIT0RTCgo9Y3V0Cgo9aGVhZDIgaWNhbF9lbnRyeV90eXBlCgpSZXR1cm5zIEM8VkZSRUVCVVNZPiwgaXRzIGlDYWxlbmRhciBlbnRyeSBuYW1lLgoKPWN1dAoKc3ViIGljYWxfZW50cnlfdHlwZSB7J1ZGUkVFQlVTWSd9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpUaGUgQzx1aWQ+IHByb3BlcnR5IGlzIG1hbmRhdG9yeSBpZiBDPHJmY19zdHJpY3Q+IHdhcyBwYXNzZWQgdG8KTDxEYXRhOjpJQ2FsL25ldz4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gJHNlbGYtPnJmY19zdHJpY3QgPyAoInVpZCIpIDogKCkKfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYXQgbW9zdCBvbmUgdGltZSBmb3IgYSBmcmVlL2J1c3kgZW50cnk6CgogICAgICAgIGNvbnRhY3QgIGR0c3RhcnQgIGR0ZW5kICBkdXJhdGlvbiAgZHRzdGFtcAogICAgICAgIG9yZ2FuaXplciAgdWlkICB1cmwKCj1jdXQKCnN1YiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcyB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgQHJldCA9IHF3KAogICAgICAgIGNvbnRhY3QgIGR0c3RhcnQgIGR0ZW5kICBkdXJhdGlvbiAgZHRzdGFtcAogICAgICAgIG9yZ2FuaXplciAgdXJsCiAgICApOwogICAgcHVzaCBAcmV0LCAidWlkIiB1bmxlc3MgJHNlbGYtPnJmY19zdHJpY3Q7CiAgICByZXR1cm4gQHJldDsKfQoKPWhlYWQyIG9wdGlvbmFsX3JlcGVhdGFibGVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBtYXkgYmUKc3BlY2lmaWVkIGFueSBudW1iZXIgb2YgdGltZXMgZm9yIGZyZWUvYnVzeSBlbnRyeToKCiAgICAgICAgYXR0ZW5kZWUgY29tbWVudCBmcmVlYnVzeSByZXF1ZXN0LXN0YXR1cwoKPWN1dAoKc3ViIG9wdGlvbmFsX3JlcGVhdGFibGVfcHJvcGVydGllcyB7CiAgICBxdygKICAgICAgICBhdHRlbmRlZSBjb21tZW50IGZyZWVidXN5IHJlcXVlc3Qtc3RhdHVzCiAgICApOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6VGltZVpvbmU7Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OlRpbWVab25lIC0gUmVwcmVzZW50cyBhIHRpbWUgem9uZSBkZWZpbml0aW9uIGluIGFuIGlDYWxlbmRhciBmaWxlCgo9aGVhZDEgU1lOT1BTSVMKCiAgICBteSAkdnRpbWV6b25lID0gRGF0YTo6SUNhbDo6RW50cnk6OlRpbWVab25lLT5uZXcoKTsKICAgICR2dGltZXpvbmUtPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgIHR6aWQgPT4gIlVTLUVhc3Rlcm4iLAogICAgICAgIHR6dXJsID0+ICJodHRwOi8vem9uZXMuc3Rkc19yX3VzLm5ldC90ei9VUy1FYXN0ZXJuIgogICAgKTsKCiAgICAkdnRpbWV6b25lLT5hZGRfZW50cnkoJGRheWxpZ2h0KTsgIyBkYXlsaWdodC8gc3RhbmRhcmQgbm90IHlldCBpbXBsZW1lbnRlZAogICAgJHZ0aW1lem9uZS0+YWRkX2VudHJ5KCRzdGFuZGFyZCk7ICMgOi0oCgogICAgJGNhbGVuZGFyLT5hZGRfZW50cnkoJHZ0aW1lem9uZSk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6VGltZVpvbmU+IG9iamVjdCByZXByZXNlbnRzIHRoZSBkZWNsYXJhdGlvbiBvZgphIHRpbWUgem9uZSBpbiBhbiBpQ2FsZW5kYXIgZmlsZS4gIChOb3RlIHRoYXQgdGhlIGlDYWxlbmRhciBSRkMgcmVmZXJzCnRvIGVudHJpZXMgYXMgImNvbXBvbmVudHMiLikgIEl0IGlzIGEgc3ViY2xhc3Mgb2YgTDxEYXRhOjpJQ2FsOjpFbnRyeT4KYW5kIGFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKVGhpcyBtb2R1bGUgaXMgbm90IHlldCB1c2VmdWwsIGJlY2F1c2UgZXZlcnkgdGltZSB6b25lIGRlY2xhcmF0aW9uCm5lZWRzIHRvIGNvbnRhaW4gYXQgbGVhc3Qgb25lIEM8U1RBTkRBUkQ+IG9yIEM8REFZTElHSFQ+IGNvbXBvbmVudCwKYW5kIHRoZXNlIGhhdmUgbm90IHlldCBiZWVuIGltcGxlbWVudGVkLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBpY2FsX2VudHJ5X3R5cGUKClJldHVybnMgQzxWVElNRVpPTkU+LCBpdHMgaUNhbGVuZGFyIGVudHJ5IG5hbWUuCgo9Y3V0CgpzdWIgaWNhbF9lbnRyeV90eXBlIHsnVlRJTUVaT05FJ30KCj1oZWFkMiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBtYXkgYmUKc3BlY2lmaWVkIGF0IG1vc3Qgb25lIHRpbWUgZm9yIGEgdGltZSB6b25lIGRlY2xhcmF0aW9uOgoKICAgICAgICBsYXN0LW1vZGlmaWVkIHR6dXJsCgo9Y3V0CgpzdWIgb3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgcXcoCiAgICAgICAgbGFzdC1tb2RpZmllZCB0enVybAogICAgKTsKfQoKPWhlYWQyIG1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBDPHR6aWQ+IHByb3BlcnR5IG11c3QgYmUKc3BlY2lmaWVkIGV4YWN0bHkgb25lIHRpbWUgaW4gYSB0aW1lIHpvbmUgZGVjbGFyYXRpb24uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIHR6aWQKICAgICk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6RXZlbnQ7Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OkV2ZW50IC0gUmVwcmVzZW50cyBhbiBldmVudCBpbiBhbiBpQ2FsZW5kYXIgZmlsZQoKPWhlYWQxIFNZTk9QU0lTCgogICAgbXkgJHZldmVudCA9IERhdGE6OklDYWw6OkVudHJ5OjpFdmVudC0+bmV3KCk7CiAgICAkdmV2ZW50LT5hZGRfcHJvcGVydGllcygKICAgICAgICBzdW1tYXJ5ID0+ICJteSBwYXJ0eSIsCiAgICAgICAgZGVzY3JpcHRpb24gPT4gIkknbGwgY3J5IGlmIEkgd2FudCB0byIsCiAgICAgICAgIyBEYXQqZSo6OklDYWwgaXMgbm90IGEgdHlwbyBoZXJlCiAgICAgICAgZHRzdGFydCAgID0+IERhdGU6OklDYWwtPm5ldyggZXBvY2ggPT4gdGltZSApLT5pY2FsLAogICAgKTsKCiAgICAkY2FsZW5kYXItPmFkZF9lbnRyeSgkdmV2ZW50KTsKCiAgICAkdmV2ZW50LT5hZGRfZW50cnkoJGFsYXJtKTsKCj1oZWFkMSBERVNDUklQVElPTgoKQSBMPERhdGE6OklDYWw6OkVudHJ5OjpFdmVudD4gb2JqZWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgZXZlbnQgaW4gYW4KaUNhbGVuZGFyIGZpbGUuICAoTm90ZSB0aGF0IHRoZSBpQ2FsZW5kYXIgUkZDIHJlZmVycyB0byBlbnRyaWVzIGFzCiJjb21wb25lbnRzIi4pICBJdCBpcyBhIHN1YmNsYXNzIG9mIEw8RGF0YTo6SUNhbDo6RW50cnk+IGFuZCBhY2NlcHRzCmFsbCBvZiBpdHMgbWV0aG9kcy4KCj1oZWFkMSBNRVRIT0RTCgo9Y3V0Cgo9aGVhZDIgaWNhbF9lbnRyeV90eXBlCgpSZXR1cm5zIEM8VkVWRU5UPiwgaXRzIGlDYWxlbmRhciBlbnRyeSBuYW1lLgoKPWN1dAoKc3ViIGljYWxfZW50cnlfdHlwZSB7J1ZFVkVOVCd9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpUaGUgQzx1aWQ+IHByb3BlcnR5IGlzIG1hbmRhdG9yeSBpZiBDPHJmY19zdHJpY3Q+IHdhcyBwYXNzZWQgdG8KTDxEYXRhOjpJQ2FsL25ldz4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gJHNlbGYtPnJmY19zdHJpY3QgPyAoInVpZCIpIDogKCkKfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYXQgbW9zdCBvbmUgdGltZSBmb3IgYW4gZXZlbnQ6CgogICAgICAgIGNsYXNzICBjcmVhdGVkICBkZXNjcmlwdGlvbiAgZHRzdGFydCAgZ2VvCiAgICAgICAgbGFzdC1tb2RpZmllZCAgbG9jYXRpb24gIG9yZ2FuaXplciAgcHJpb3JpdHkKICAgICAgICBkdHN0YW1wICBzZXF1ZW5jZSAgc3RhdHVzICBzdW1tYXJ5ICB0cmFuc3AKICAgICAgICB1aWQgIHVybCAgcmVjdXJyZW5jZS1pZAoKSW4gYWRkaXRpb24sIEM8ZHRlbmQ+IGFuZCBDPGR1cmF0aW9uPiBtYXkgYmUgc3BlY2lmaWVkIGF0IG1vc3Qgb25jZQplYWNoLCBidXQgbm90IGJvdGggaW4gdGhlIHNhbWUgZW50cnkgKHRob3VnaCB0aGlzIHJlc3RyaWN0aW9uIGlzIG5vdAplbmZvcmNlZCkuCgpPciBpZiBDPDwgdmNhbDEwID0+IDEgPj46CgogICAgICAgIGNsYXNzIGRjcmVhdGVkIGNvbXBsZXRlZCBkZXNjcmlwdGlvbiBkdHN0YXJ0IGR0ZW5kCiAgICAgICAgbGFzdC1tb2RpZmllZCBsb2NhdGlvbiBybnVtIHByaW9yaXR5CiAgICAgICAgc2VxdWVuY2Ugc3RhdHVzIHN1bW1hcnkgdHJhbnNwCiAgICAgICAgdXJsIHVpZAoKPWN1dAoKc3ViIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSBAcmV0ID0gJHNlbGYtPnJmY19zdHJpY3QgPyAoKSA6ICgidWlkIik7CiAgICBpZiAobm90ICRzZWxmLT52Y2FsMTApIHsKICAgICAgICBwdXNoIEByZXQsIHF3KAogICAgICAgICAgICBjbGFzcyAgY3JlYXRlZCAgZGVzY3JpcHRpb24gIGR0c3RhcnQgIGdlbwogICAgICAgICAgICBsYXN0LW1vZGlmaWVkICBsb2NhdGlvbiAgb3JnYW5pemVyICBwcmlvcml0eQogICAgICAgICAgICBkdHN0YW1wICBzZXF1ZW5jZSAgc3RhdHVzICBzdW1tYXJ5ICB0cmFuc3AKICAgICAgICAgICAgdXJsICByZWN1cnJlbmNlLWlkCgogICAgICAgICAgICBkdGVuZCBkdXJhdGlvbgogICAgICAgICk7CiAgICB9IGVsc2UgewogICAgICAgIHB1c2ggQHJldCwgcXcoCiAgICAgICAgICAgIGNsYXNzIGRjcmVhdGVkIGNvbXBsZXRlZCBkZXNjcmlwdGlvbiBkdHN0YXJ0IGR0ZW5kCiAgICAgICAgICAgIGxhc3QtbW9kaWZpZWQgbG9jYXRpb24gcm51bSBwcmlvcml0eQogICAgICAgICAgICBzZXF1ZW5jZSBzdGF0dXMgc3VtbWFyeSB0cmFuc3AKICAgICAgICAgICAgdXJsCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBAcmV0Owp9Cgo9aGVhZDIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYW55IG51bWJlciBvZiB0aW1lcyBmb3IgYW4gZXZlbnQ6CgogICAgICAgIGF0dGFjaCAgYXR0ZW5kZWUgIGNhdGVnb3JpZXMgIGNvbW1lbnQKICAgICAgICBjb250YWN0ICBleGRhdGUgIGV4cnVsZSAgcmVxdWVzdC1zdGF0dXMgIHJlbGF0ZWQtdG8KICAgICAgICByZXNvdXJjZXMgIHJkYXRlICBycnVsZQoKT3IgaWYgQzw8IHZjYWwxMCA9PiAxID4+OgoKICAgICAgICBhYWxhcm0gIGF0dGFjaCAgYXR0ZW5kZWUgIGNhdGVnb3JpZXMKICAgICAgICBkYWxhcm0gIGV4ZGF0ZSAgZXhydWxlICBtYWxhcm0gIHBhbGFybSAgcmVsYXRlZC10bwogICAgICAgIHJlc291cmNlcyAgcmRhdGUgIHJydWxlCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBpZiAobm90ICRzZWxmLT52Y2FsMTApIHsKICAgICAgICBxdygKICAgICAgICAgICAgYXR0YWNoICBhdHRlbmRlZSAgY2F0ZWdvcmllcyAgY29tbWVudAogICAgICAgICAgICBjb250YWN0ICBleGRhdGUgIGV4cnVsZSAgcmVxdWVzdC1zdGF0dXMgIHJlbGF0ZWQtdG8KICAgICAgICAgICAgcmVzb3VyY2VzICByZGF0ZSAgcnJ1bGUKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICBxdygKICAgICAgICAgICAgYWFsYXJtICBhdHRhY2ggIGF0dGVuZGVlICBjYXRlZ29yaWVzCiAgICAgICAgICAgIGRhbGFybSAgZXhkYXRlICBleHJ1bGUgIG1hbGFybSAgcGFsYXJtICByZWxhdGVkLXRvCiAgICAgICAgICAgIHJlc291cmNlcyAgcmRhdGUgIHJydWxlCiAgICAgICAgKTsKICAgIH0KfQoKPWhlYWQxIFNFRSBBTFNPCgo9b3ZlciA0Cgo9aXRlbSBMPERhdGE6OklDYWw6OkRhdGVUaW1lPgoKRm9yIGRhdGUgcGFyc2luZyBhbmQgZm9ybWF0dGluZywgaW5jbHVkaW5nIGRlbm90aW5nICJhbGwgZGF5IiBldmVudHMsCmNvbnNpZGVyaW5nIHVzaW5nIHRoaXMgbW9kdWxlLiBCZWNhdXNlIGl0J3MgYSAibWl4IGluIiwgeW91IGNhbiBzdGlsbAp1c2UgYWxsIHRoZSBtZXRob2RzIGhlcmUgYXMgd2VsbCBhcyB0aGUgbmV3IGRhdGUgaGFuZGxpbmcgbWV0aG9kcyBpdApkZWZpbmVzLgoKPWJhY2sKCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6Sm91cm5hbDsKCnVzZSBiYXNlIHF3L0RhdGE6OklDYWw6OkVudHJ5LzsKCj1oZWFkMSBOQU1FCgpEYXRhOjpJQ2FsOjpFbnRyeTo6Sm91cm5hbCAtIFJlcHJlc2VudHMgYSBqb3VybmFsIGVudHJ5IGluIGFuIGlDYWxlbmRhciBmaWxlCgo9aGVhZDEgU1lOT1BTSVMKCiAgICBteSAkdmpvdXJuYWwgPSBEYXRhOjpJQ2FsOjpFbnRyeTo6Sm91cm5hbC0+bmV3KCk7CiAgICAkdmpvdXJuYWwtPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgIHN1bW1hcnkgPT4gIk1pbnV0ZXMgb2YgbXkgcGFydHkiLAogICAgICAgIGRlc2NyaXB0aW9uID0+ICJJIGNyaWVkIGJlY2F1c2UgSSB3YW50ZWQgdG8uIiwKICAgICAgICAjIERhdCplKjo6SUNhbCBpcyBub3QgYSB0eXBvIGhlcmUKICAgICAgICBkdHN0YXJ0ICAgPT4gRGF0ZTo6SUNhbC0+bmV3KCBlcG9jaCA9PiB0aW1lICktPmljYWwsCiAgICApOwoKICAgICRjYWxlbmRhci0+YWRkX2VudHJ5KCR2am91cm5hbCk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6Sm91cm5hbD4gb2JqZWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgam91cm5hbAplbnRyeSBpbiBhbiBpQ2FsZW5kYXIgZmlsZS4gIChOb3RlIHRoYXQgdGhlIGlDYWxlbmRhciBSRkMgcmVmZXJzIHRvCmVudHJpZXMgYXMgImNvbXBvbmVudHMiLikgIEl0IGlzIGEgc3ViY2xhc3Mgb2YgTDxEYXRhOjpJQ2FsOjpFbnRyeT4KYW5kIGFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBpY2FsX2VudHJ5X3R5cGUKClJldHVybnMgQzxWSk9VUk5BTD4sIGl0cyBpQ2FsZW5kYXIgZW50cnkgbmFtZS4KCj1jdXQKCnN1YiBpY2FsX2VudHJ5X3R5cGUgeydWSk9VUk5BTCd9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpUaGUgQzx1aWQ+IHByb3BlcnR5IGlzIG1hbmRhdG9yeSBpZiBDPHJmY19zdHJpY3Q+IHdhcyBwYXNzZWQgdG8KTDxEYXRhOjpJQ2FsL25ldz4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gJHNlbGYtPnJmY19zdHJpY3QgPyAoInVpZCIpIDogKCkKfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYXQgbW9zdCBvbmUgdGltZSBmb3IgYSBqb3VybmFsIGVudHJ5OgoKICAgIGNsYXNzICBjcmVhdGVkICBkZXNjcmlwdGlvbiAgZHRzdGFydCAgZHRzdGFtcAogICAgbGFzdC1tb2RpZmllZCAgb3JnYW5pemVyICByZWN1cnJlbmNlLWlkICBzZXF1ZW5jZSAgc3RhdHVzCiAgICBzdW1tYXJ5ICB1aWQgIHVybAoKPWN1dAoKc3ViIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSBAcmV0ID0gcXcoCiAgICAgICAgY2xhc3MgIGNyZWF0ZWQgIGRlc2NyaXB0aW9uICBkdHN0YXJ0ICBkdHN0YW1wCiAgICAgICAgbGFzdC1tb2RpZmllZCAgb3JnYW5pemVyICByZWN1cnJlbmNlLWlkICBzZXF1ZW5jZSAgc3RhdHVzCiAgICAgICAgc3VtbWFyeSB1cmwKICAgICk7CiAgICBwdXNoIEByZXQsICJ1aWQiIHVubGVzcyAkc2VsZi0+cmZjX3N0cmljdDsKICAgIHJldHVybiBAcmV0Owp9Cgo9aGVhZDIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYW55IG51bWJlciBvZiB0aW1lcyBmb3IgYSBqb3VybmFsIGVudHJ5OgoKICAgICAgICBhdHRhY2ggIGF0dGVuZGVlICBjYXRlZ29yaWVzICBjb21tZW50CiAgICAgICAgY29udGFjdCAgZXhkYXRlICBleHJ1bGUgIHJlbGF0ZWQtdG8gIHJkYXRlCiAgICAgICAgcnJ1bGUgIHJlcXVlc3Qtc3RhdHVzCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGF0dGFjaCAgYXR0ZW5kZWUgIGNhdGVnb3JpZXMgIGNvbW1lbnQKICAgICAgICBjb250YWN0ICBleGRhdGUgIGV4cnVsZSAgcmVsYXRlZC10byAgcmRhdGUKICAgICAgICBycnVsZSAgcmVxdWVzdC1zdGF0dXMKICAgICk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6VG9kbzsKCnVzZSBiYXNlIHF3L0RhdGE6OklDYWw6OkVudHJ5LzsKCj1oZWFkMSBOQU1FCgpEYXRhOjpJQ2FsOjpFbnRyeTo6VG9kbyAtIFJlcHJlc2VudHMgYSB0by1kbyBlbnRyeSBpbiBhbiBpQ2FsZW5kYXIgZmlsZQoKPWhlYWQxIFNZTk9QU0lTCgogICAgbXkgJHZ0b2RvID0gRGF0YTo6SUNhbDo6RW50cnk6OlRvZG8tPm5ldygpOwogICAgJHZ0b2RvLT5hZGRfcHJvcGVydGllcygKICAgICAgICBzdW1tYXJ5ICAgPT4gImdvIHRvIHNsZWVwIiwKICAgICAgICBzdGF0dXMgICAgPT4gJ0lOQ09NUExFVEUnLAogICAgICAgICMgRGF0KmUqOjpJQ2FsIGlzIG5vdCBhIHR5cG8gaGVyZQogICAgICAgIGR0c3RhcnQgICA9PiBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IHRpbWUgKS0+aWNhbCwKICAgICk7CgogICAgJGNhbGVuZGFyLT5hZGRfZW50cnkoJHZ0b2RvKTsKCiAgICAkdnRvZG8tPmFkZF9lbnRyeSgkYWxhcm0pOwoKPWhlYWQxIERFU0NSSVBUSU9OCgpBIEw8RGF0YTo6SUNhbDo6RW50cnk6OlRvZG8+IG9iamVjdCByZXByZXNlbnRzIGEgc2luZ2xlIHRvLWRvIGVudHJ5IGluCmFuIGlDYWxlbmRhciBmaWxlLiAgKE5vdGUgdGhhdCB0aGUgaUNhbGVuZGFyIFJGQyByZWZlcnMgdG8gZW50cmllcyBhcwoiY29tcG9uZW50cyIuKSAgSXQgaXMgYSBzdWJjbGFzcyBvZiBMPERhdGE6OklDYWw6OkVudHJ5PiBhbmQgYWNjZXB0cwphbGwgb2YgaXRzIG1ldGhvZHMuCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIGljYWxfZW50cnlfdHlwZQoKUmV0dXJucyBDPFZUT0RPPiwgaXRzIGlDYWxlbmRhciBlbnRyeSBuYW1lLgoKPWN1dAoKc3ViIGljYWxfZW50cnlfdHlwZSB7J1ZUT0RPJ30KCj1oZWFkMiBtYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMKClRoZSBDPHVpZD4gcHJvcGVydHkgaXMgbWFuZGF0b3J5IGlmIEM8cmZjX3N0cmljdD4gd2FzIHBhc3NlZCB0bwpMPERhdGE6OklDYWwvbmV3Pi4KCj1jdXQKCnN1YiBtYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIHJldHVybiAkc2VsZi0+cmZjX3N0cmljdCA/ICgidWlkIikgOiAoKQp9Cgo9aGVhZDIgb3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXMKCkFjY29yZGluZyB0byB0aGUgaUNhbGVuZGFyIHN0YW5kYXJkLCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgbWF5IGJlCnNwZWNpZmllZCBhdCBtb3N0IG9uZSB0aW1lIGZvciBhIHRvLWRvIGl0ZW06CgogICAgICBjbGFzcyAgY29tcGxldGVkICBjcmVhdGVkICBkZXNjcmlwdGlvbiAgZHRzdGFtcAogICAgICBkdHN0YXJ0ICBnZW8gIGxhc3QtbW9kaWZpZWQgIGxvY2F0aW9uICBvcmdhbml6ZXIKICAgICAgcGVyY2VudC1jb21wbGV0ZSAgcHJpb3JpdHkgIHJlY3VycmVuY2UtaWQgIHNlcXVlbmNlICBzdGF0dXMKICAgICAgc3VtbWFyeSAgdWlkICB1cmwKCkluIGFkZGl0aW9uLCBDPGR1ZT4gYW5kIEM8ZHVyYXRpb24+IG1heSBiZSBzcGVjaWZpZWQgYXQgbW9zdCBvbmNlCmVhY2gsIGJ1dCBub3QgYm90aCBpbiB0aGUgc2FtZSBlbnRyeSAodGhvdWdoIHRoaXMgcmVzdHJpY3Rpb24gaXMgbm90CmVuZm9yY2VkKS4KCk9yIGlmIEM8PCB2Y2FsMTAgPT4gMSA+PjoKCiAgICAgICAgY2xhc3MgZGNyZWF0ZWQgY29tcGxldGVkIGRlc2NyaXB0aW9uIGR0c3RhcnQgZHVlCiAgICAgICAgbGFzdC1tb2RpZmllZCBsb2NhdGlvbiBybnVtIHByaW9yaXR5CiAgICAgICAgc2VxdWVuY2Ugc3RhdHVzIHN1bW1hcnkgdHJhbnNwCiAgICAgICAgdXJsIHVpZAoKPWN1dAoKc3ViIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSBAcmV0ID0gJHNlbGYtPnJmY19zdHJpY3QgPyAoKSA6ICgidWlkIik7CiAgICBpZiAobm90ICRzZWxmLT52Y2FsMTApIHsKICAgICAgICBwdXNoIEByZXQsIHF3KAogICAgICAgICAgICBjbGFzcyAgY29tcGxldGVkICBjcmVhdGVkICBkZXNjcmlwdGlvbiAgZHRzdGFtcAogICAgICAgICAgICBkdHN0YXJ0ICBnZW8gIGxhc3QtbW9kaWZpZWQgIGxvY2F0aW9uICBvcmdhbml6ZXIKICAgICAgICAgICAgcGVyY2VudC1jb21wbGV0ZSAgcHJpb3JpdHkgIHJlY3VycmVuY2UtaWQgIHNlcXVlbmNlICBzdGF0dXMKICAgICAgICAgICAgc3VtbWFyeSAgdWlkICB1cmwKCiAgICAgICAgICAgIGR1ZSBkdXJhdGlvbgogICAgICAgICk7CiAgICB9IGVsc2UgewogICAgICAgIHB1c2ggQHJldCwgcXcoCiAgICAgICAgICAgIGNsYXNzIGRjcmVhdGVkIGNvbXBsZXRlZCBkZXNjcmlwdGlvbiBkdHN0YXJ0IGR1ZQogICAgICAgICAgICBsYXN0LW1vZGlmaWVkIGxvY2F0aW9uIHJudW0gcHJpb3JpdHkKICAgICAgICAgICAgc2VxdWVuY2Ugc3RhdHVzIHN1bW1hcnkgdHJhbnNwCiAgICAgICAgICAgIHVybCB1aWQKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIEByZXQ7Cn0KCj1oZWFkMiBvcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXMKCkFjY29yZGluZyB0byB0aGUgaUNhbGVuZGFyIHN0YW5kYXJkLCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgbWF5IGJlCnNwZWNpZmllZCBhbnkgbnVtYmVyIG9mIHRpbWVzIGZvciBhIHRvLWRvIGl0ZW06CgogICAgICBhdHRhY2ggIGF0dGVuZGVlICBjYXRlZ29yaWVzICBjb21tZW50ICBjb250YWN0CiAgICAgIGV4ZGF0ZSAgZXhydWxlICByZXF1ZXN0LXN0YXR1cyAgcmVsYXRlZC10byAgcmVzb3VyY2VzCiAgICAgIHJkYXRlICBycnVsZQoKT3IgaWYgQzw8IHZjYWwxMCA9PiAxID4+OgoKICAgICAgICBhYWxhcm0gIGF0dGFjaCAgYXR0ZW5kZWUgIGNhdGVnb3JpZXMKICAgICAgICBkYWxhcm0gIGV4ZGF0ZSAgZXhydWxlICBtYWxhcm0gIHBhbGFybSAgcmVsYXRlZC10bwogICAgICAgIHJlc291cmNlcyAgcmRhdGUgIHJydWxlCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBpZiAobm90ICRzZWxmLT52Y2FsMTApIHsKICAgICAgICBxdygKICAgICAgICAgICAgYXR0YWNoICBhdHRlbmRlZSAgY2F0ZWdvcmllcyAgY29tbWVudCAgY29udGFjdAogICAgICAgICAgICBleGRhdGUgIGV4cnVsZSAgcmVxdWVzdC1zdGF0dXMgIHJlbGF0ZWQtdG8gIHJlc291cmNlcwogICAgICAgICAgICByZGF0ZSAgcnJ1bGUKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICBxdygKICAgICAgICAgICAgYWFsYXJtICBhdHRhY2ggIGF0dGVuZGVlICBjYXRlZ29yaWVzCiAgICAgICAgICAgIGRhbGFybSAgZXhkYXRlICBleHJ1bGUgIG1hbGFybSAgcGFsYXJtICByZWxhdGVkLXRvCiAgICAgICAgICAgIHJlc291cmNlcyAgcmRhdGUgIHJydWxlCiAgICAgICAgKTsKICAgIH0KfQoKPWhlYWQxIEFVVEhPUgoKQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMgRTxsdD5tb2R1bGVzQGJlc3RwcmFjdGljYWwuY29tRTxndD4KCj1oZWFkMSBMSUNFTkNFIEFORCBDT1BZUklHSFQKCkNvcHlyaWdodCAoYykgMjAwNSAtIDIwMTUsIEJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KClRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuIFNlZSBMPHBlcmxhcnRpc3RpYz4uCgo9Y3V0CgoxOwo=
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm07Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxhcm1zCgo9aGVhZDEgREVTQ1JJUFRJT04KCkw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtPiBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0aGUgb3RoZXIgdHlwZQpvZiBzdXBwb3J0ZWQgYnkgYWxhcm1zOgoKPW92ZXIKCj1pdGVtIEw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpBdWRpbz4KCj1pdGVtIEw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpEaXNwbGF5PgoKPWl0ZW0gTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkVtYWlsPgoKPWl0ZW0gTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlByb2NlZHVyZT4KCj1iYWNrCgpJdCBpcyBhIHN1YmNsYXNzIG9mIEw8RGF0YTo6SUNhbDo6RW50cnk+IGFuZCBhY2NlcHRzIGFsbCBvZiBpdHMgbWV0aG9kcy4KCj1oZWFkMSBNRVRIT0RTCgo9Y3V0Cgo9aGVhZDIgbmV3CgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgIG15ICRzZWxmICA9ICRjbGFzcy0+U1VQRVI6Om5ldyhAXyk7CiAgICBkaWUgIkNhbid0IGluc3RhbnRpYXRlIGFic3RyYWN0IGJhc2UgY2xhc3MgRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtIgogICAgICAgIGlmICRjbGFzcyBlcSBfX1BBQ0tBR0VfXzsKICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIGljYWxfZW50cnlfdHlwZQoKUmV0dXJucyBDPFZBTEFSTT4sIGl0cyBpQ2FsZW5kYXIgZW50cnkgbmFtZS4KCj1jdXQKCnN1YiBpY2FsX2VudHJ5X3R5cGUgeydWQUxBUk0nfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIEM8ZHVyYXRpb24+IGFuZCBDPHJldHJlYXQ+CnByb3BlcnRpZXMgbWF5IGJlIHNwZWNpZmllZCBhdCBtb3N0IG9uZSB0aW1lIGFsbCB0eXBlcyBvZiBhbGFybXM7IGlmIG9uZQppcyBzcGVjaWZpZWQsIHRoZSBvdGhlciBvbmUgbXVzdCBiZSBhbHNvLCB0aG91Z2ggdGhpcyBtb2R1bGUgZG9lcyBub3QKZW5mb3JjZSB0aGF0IHJlc3RyaWN0aW9uLgoKPWN1dAoKc3ViIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGR1cmF0aW9uIHJlcGVhdAogICAgKTsKfQoKPWhlYWQyIG1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBDPHRyaWdnZXI+IHByb3BlcnR5IG11c3QgYmUKc3BlY2lmaWVkIGV4YWN0bHkgb25jZSBmb3IgYW4gYWxsIHR5cGVzIG9mIGFsYXJtczsgc3ViY2xhc3NlcyBtYXkgaGF2ZQphZGRpdGlvbmFsIHJlcXVpcmVkIHByb3BlcnRpZXMuCgpJbiBhZGRpdGlvbiwgdGhlIEM8YWN0aW9uPiBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCBleGFjdGx5IG9uY2UsIGJ1dAphbGwgc3ViY2xhc3NlcyBhdXRvbWF0aWNhbGx5IHNldCBzYWlkIHByb3BlcnR5IGFwcHJvcHJpYXRlbHkuCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGFjdGlvbiB0cmlnZ2VyCiAgICApOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6VGltZVpvbmU6OlN0YW5kYXJkOwoKdXNlIGJhc2UgcXcvRGF0YTo6SUNhbDo6RW50cnkvOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWw6OkVudHJ5OjpUaW1lWm9uZTo6U3RhbmRhcmQgLSBSZXByZXNlbnRzIGEgU3RhbmRhcmQgVGltZSBiYXNlIG9mZnNldCBmcm9tIFVUQyBmb3IgcGFyZW50IFRpbWVab25lCgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgdGltZSB6b25lIGlzIHVuYW1iaWd1b3VzbHkgZGVmaW5lZCBieSB0aGUgc2V0IG9mIHRpbWUgbWVhc3VyZW1lbnQKcnVsZXMgZGV0ZXJtaW5lZCBieSB0aGUgZ292ZXJuaW5nIGJvZHkgZm9yIGEgZ2l2ZW4gZ2VvZ3JhcGhpYwphcmVhLiBUaGVzZSBydWxlcyBkZXNjcmliZSBhdCBhIG1pbmltdW0gdGhlIGJhc2Ugb2Zmc2V0IGZyb20gVVRDIGZvcgp0aGUgdGltZSB6b25lLCBvZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgU3RhbmRhcmQgVGltZSBvZmZzZXQuIE1hbnkKbG9jYXRpb25zIGFkanVzdCB0aGVpciBTdGFuZGFyZCBUaW1lIGZvcndhcmQgb3IgYmFja3dhcmQgYnkgb25lIGhvdXIsCmluIG9yZGVyIHRvIGFjY29tbW9kYXRlIHNlYXNvbmFsIGNoYW5nZXMgaW4gbnVtYmVyIG9mIGRheWxpZ2h0IGhvdXJzLApvZnRlbiByZWZlcnJlZCB0byBhcyBEYXlsaWdodCBTYXZpbmcgVGltZS4gU29tZSBsb2NhdGlvbnMgYWRqdXN0IHRoZWlyCnRpbWUgYnkgYSBmcmFjdGlvbiBvZiBhbiBob3VyLiBTdGFuZGFyZCBUaW1lIGlzIGFsc28ga25vd24gYXMgV2ludGVyClRpbWUuIERheWxpZ2h0IFNhdmluZyBUaW1lIGlzIGFsc28ga25vd24gYXMgQWR2YW5jZWQgVGltZSwgU3VtbWVyClRpbWUsIG9yIExlZ2FsIFRpbWUgaW4gY2VydGFpbiBjb3VudHJpZXMuIFRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MKdGhlIGNoYW5nZXMgaW4gdGltZSB6b25lIHJ1bGVzIGluIGVmZmVjdCBmb3IgTmV3IFlvcmsgQ2l0eSBzdGFydGluZwpmcm9tIDE5NjcuIEVhY2ggbGluZSByZXByZXNlbnRzIGEgZGVzY3JpcHRpb24gb3IgcnVsZSBmb3IgYSBwYXJ0aWN1bGFyCm9ic2VydmFuY2UuCgogICAgIEVmZmVjdGl2ZSBPYnNlcnZhbmNlIFJ1bGUKCiAgICAgRGF0ZSAgICAgICAoRGF0ZS9UaW1lKSAgICAgICAgICAgICBPZmZzZXQgIEFiYnJldmlhdGlvbgoKICAgICAxOTY3LSogICAgIGxhc3QgU3VuIGluIE9jdCwgMDI6MDAgIC0wNTAwICAgRVNUCgogICAgIDE5NjctMTk3MyAgbGFzdCBTdW4gaW4gQXByLCAwMjowMCAgLTA0MDAgICBFRFQKCiAgICAgMTk3NC0xOTc0ICBKYW4gNiwgIDAyOjAwICAgICAgICAgICAtMDQwMCAgIEVEVAoKICAgICAxOTc1LTE5NzUgIEZlYiAyMywgMDI6MDAgICAgICAgICAgIC0wNDAwICAgRURUCgogICAgIDE5NzYtMTk4NiAgbGFzdCBTdW4gaW4gQXByLCAwMjowMCAgLTA0MDAgICBFRFQKCiAgICAgMTk4Ny0qICAgICBmaXJzdCBTdW4gaW4gQXByLCAwMjowMCAtMDQwMCAgIEVEVAoKTm90ZTogVGhlIHNwZWNpZmljYXRpb24gb2YgYSBnbG9iYWwgdGltZSB6b25lIHJlZ2lzdHJ5IGlzIG5vdAphZGRyZXNzZWQgYnkgdGhpcyBkb2N1bWVudCBhbmQgaXMgbGVmdCBmb3IgZnV0dXJlIHN0dWR5LiAgSG93ZXZlciwKaW1wbGVtZW50ZXJzIG1heSBmaW5kIHRoZSBPbHNvbiB0aW1lIHpvbmUgZGF0YWJhc2UgW1RaXSBhIHVzZWZ1bApyZWZlcmVuY2UuIEl0IGlzIGFuIGluZm9ybWFsLCBwdWJsaWMtZG9tYWluIGNvbGxlY3Rpb24gb2YgdGltZSB6b25lCmluZm9ybWF0aW9uLCB3aGljaCBpcyBjdXJyZW50bHkgYmVpbmcgbWFpbnRhaW5lZCBieSB2b2x1bnRlZXIgSW50ZXJuZXQKcGFydGljaXBhbnRzLCBhbmQgaXMgdXNlZCBpbiBzZXZlcmFsIG9wZXJhdGluZyBzeXN0ZW1zLiBUaGlzIGRhdGFiYXNlCmNvbnRhaW5zIGN1cnJlbnQgYW5kIGhpc3RvcmljYWwgdGltZSB6b25lIGluZm9ybWF0aW9uIGZvciBhIHdpZGUKdmFyaWV0eSBvZiBsb2NhdGlvbnMgYXJvdW5kIHRoZSBnbG9iZTsgaXQgcHJvdmlkZXMgYSB0aW1lIHpvbmUKaWRlbnRpZmllciBmb3IgZXZlcnkgdW5pcXVlIHRpbWUgem9uZSBydWxlIHNldCBpbiBhY3R1YWwgdXNlIHNpbmNlCjE5NzAsIHdpdGggaGlzdG9yaWNhbCBkYXRhIGdvaW5nIGJhY2sgdG8gdGhlIGludHJvZHVjdGlvbiBvZiBzdGFuZGFyZAp0aW1lLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBpY2FsX2VudHJ5X3R5cGUKClJldHVybnMgQzxTVEFOREFSRD4sIGl0cyBpQ2FsZW5kYXIgZW50cnkgbmFtZS4KCj1jdXQKCnN1YiBpY2FsX2VudHJ5X3R5cGUgeydTVEFOREFSRCd9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG11c3QgYmUKc3BlY2lmaWVkIGV4YWN0bHkgb25lIHRpbWUgaW4gYSBzdGFuZGFyZCB0aW1lIGRlY2xhcmF0aW9uOgoKICAgICAgICBkdHN0YXJ0ICB0em9mZnNldHRvICB0em9mZnNldGZyb20KCj1jdXQKCnN1YiBtYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgcXcoCiAgICAgICAgZHRzdGFydAogICAgICAgIHR6b2Zmc2V0dG8KICAgICAgICB0em9mZnNldGZyb20KICAgICk7Cn0KCj1oZWFkMiBvcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXMKCkFjY29yZGluZyB0byB0aGUgaUNhbGVuZGFyIHN0YW5kYXJkLCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgbWF5IGJlCnNwZWNpZmllZCBhbnkgbnVtYmVyIG9mIHRpbWVzIGZvciBhIHN0YW5kYXJkIHRpbWUgZGVjbGFyYXRpb246CgogICAgICAgIGNvbW1lbnQgIHJkYXRlICBycnVsZSAgdHpuYW1lCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGNvbW1lbnQKICAgICAgICByZGF0ZQogICAgICAgIHJydWxlCiAgICAgICAgdHpuYW1lCiAgICApOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6VGltZVpvbmU6OkRheWxpZ2h0OwoKdXNlIGJhc2UgcXcvRGF0YTo6SUNhbDo6RW50cnkvOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWw6OkVudHJ5OjpUaW1lWm9uZTo6RGF5bGlnaHQgLSBSZXByZXNlbnRzIGEgRGF5bGlnaHQgVGltZSBiYXNlIG9mZnNldCBmcm9tIFVUQyBmb3IgcGFyZW50IFRpbWVab25lCgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgdGltZSB6b25lIGlzIHVuYW1iaWd1b3VzbHkgZGVmaW5lZCBieSB0aGUgc2V0IG9mIHRpbWUgbWVhc3VyZW1lbnQKcnVsZXMgZGV0ZXJtaW5lZCBieSB0aGUgZ292ZXJuaW5nIGJvZHkgZm9yIGEgZ2l2ZW4gZ2VvZ3JhcGhpYwphcmVhLiBUaGVzZSBydWxlcyBkZXNjcmliZSBhdCBhIG1pbmltdW0gdGhlIGJhc2Ugb2Zmc2V0IGZyb20gVVRDIGZvcgp0aGUgdGltZSB6b25lLCBvZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgU3RhbmRhcmQgVGltZSBvZmZzZXQuIE1hbnkKbG9jYXRpb25zIGFkanVzdCB0aGVpciBTdGFuZGFyZCBUaW1lIGZvcndhcmQgb3IgYmFja3dhcmQgYnkgb25lIGhvdXIsCmluIG9yZGVyIHRvIGFjY29tbW9kYXRlIHNlYXNvbmFsIGNoYW5nZXMgaW4gbnVtYmVyIG9mIGRheWxpZ2h0IGhvdXJzLApvZnRlbiByZWZlcnJlZCB0byBhcyBEYXlsaWdodCBTYXZpbmcgVGltZS4gU29tZSBsb2NhdGlvbnMgYWRqdXN0IHRoZWlyCnRpbWUgYnkgYSBmcmFjdGlvbiBvZiBhbiBob3VyLiBTdGFuZGFyZCBUaW1lIGlzIGFsc28ga25vd24gYXMgV2ludGVyClRpbWUuIERheWxpZ2h0IFNhdmluZyBUaW1lIGlzIGFsc28ga25vd24gYXMgQWR2YW5jZWQgVGltZSwgU3VtbWVyClRpbWUsIG9yIExlZ2FsIFRpbWUgaW4gY2VydGFpbiBjb3VudHJpZXMuIFRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MKdGhlIGNoYW5nZXMgaW4gdGltZSB6b25lIHJ1bGVzIGluIGVmZmVjdCBmb3IgTmV3IFlvcmsgQ2l0eSBzdGFydGluZwpmcm9tIDE5NjcuIEVhY2ggbGluZSByZXByZXNlbnRzIGEgZGVzY3JpcHRpb24gb3IgcnVsZSBmb3IgYSBwYXJ0aWN1bGFyCm9ic2VydmFuY2UuCgogICAgIEVmZmVjdGl2ZSBPYnNlcnZhbmNlIFJ1bGUKCiAgICAgRGF0ZSAgICAgICAoRGF0ZS9UaW1lKSAgICAgICAgICAgICBPZmZzZXQgIEFiYnJldmlhdGlvbgoKICAgICAxOTY3LSogICAgIGxhc3QgU3VuIGluIE9jdCwgMDI6MDAgIC0wNTAwICAgRVNUCgogICAgIDE5NjctMTk3MyAgbGFzdCBTdW4gaW4gQXByLCAwMjowMCAgLTA0MDAgICBFRFQKCiAgICAgMTk3NC0xOTc0ICBKYW4gNiwgIDAyOjAwICAgICAgICAgICAtMDQwMCAgIEVEVAoKICAgICAxOTc1LTE5NzUgIEZlYiAyMywgMDI6MDAgICAgICAgICAgIC0wNDAwICAgRURUCgogICAgIDE5NzYtMTk4NiAgbGFzdCBTdW4gaW4gQXByLCAwMjowMCAgLTA0MDAgICBFRFQKCiAgICAgMTk4Ny0qICAgICBmaXJzdCBTdW4gaW4gQXByLCAwMjowMCAtMDQwMCAgIEVEVAoKTm90ZTogVGhlIHNwZWNpZmljYXRpb24gb2YgYSBnbG9iYWwgdGltZSB6b25lIHJlZ2lzdHJ5IGlzIG5vdAphZGRyZXNzZWQgYnkgdGhpcyBkb2N1bWVudCBhbmQgaXMgbGVmdCBmb3IgZnV0dXJlIHN0dWR5LiAgSG93ZXZlciwKaW1wbGVtZW50ZXJzIG1heSBmaW5kIHRoZSBPbHNvbiB0aW1lIHpvbmUgZGF0YWJhc2UgW1RaXSBhIHVzZWZ1bApyZWZlcmVuY2UuIEl0IGlzIGFuIGluZm9ybWFsLCBwdWJsaWMtZG9tYWluIGNvbGxlY3Rpb24gb2YgdGltZSB6b25lCmluZm9ybWF0aW9uLCB3aGljaCBpcyBjdXJyZW50bHkgYmVpbmcgbWFpbnRhaW5lZCBieSB2b2x1bnRlZXIgSW50ZXJuZXQKcGFydGljaXBhbnRzLCBhbmQgaXMgdXNlZCBpbiBzZXZlcmFsIG9wZXJhdGluZyBzeXN0ZW1zLiBUaGlzIGRhdGFiYXNlCmNvbnRhaW5zIGN1cnJlbnQgYW5kIGhpc3RvcmljYWwgdGltZSB6b25lIGluZm9ybWF0aW9uIGZvciBhIHdpZGUKdmFyaWV0eSBvZiBsb2NhdGlvbnMgYXJvdW5kIHRoZSBnbG9iZTsgaXQgcHJvdmlkZXMgYSB0aW1lIHpvbmUKaWRlbnRpZmllciBmb3IgZXZlcnkgdW5pcXVlIHRpbWUgem9uZSBydWxlIHNldCBpbiBhY3R1YWwgdXNlIHNpbmNlCjE5NzAsIHdpdGggaGlzdG9yaWNhbCBkYXRhIGdvaW5nIGJhY2sgdG8gdGhlIGludHJvZHVjdGlvbiBvZiBzdGFuZGFyZAp0aW1lLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBpY2FsX2VudHJ5X3R5cGUKClJldHVybnMgQzxEQVlMSUdIVD4sIGl0cyBpQ2FsZW5kYXIgZW50cnkgbmFtZS4KCj1jdXQKCnN1YiBpY2FsX2VudHJ5X3R5cGUgeydEQVlMSUdIVCd9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG11c3QgYmUKc3BlY2lmaWVkIGV4YWN0bHkgb25lIHRpbWUgaW4gYSBkYXlsaWdodCBkZWNsYXJhdGlvbjoKCiAgICAgICAgZHRzdGFydCAgdHpvZmZzZXR0byAgdHpvZmZzZXRmcm9tCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGR0c3RhcnQKICAgICAgICB0em9mZnNldHRvCiAgICAgICAgdHpvZmZzZXRmcm9tCiAgICApOwp9Cgo9aGVhZDIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYW55IG51bWJlciBvZiB0aW1lcyBmb3IgYSBkYXlsaWdodCBkZWNsYXJhdGlvbjoKCiAgICAgICAgY29tbWVudCAgcmRhdGUgIHJydWxlICB0em5hbWUKCj1jdXQKCnN1YiBvcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXMgewogICAgcXcoCiAgICAgICAgY29tbWVudAogICAgICAgIHJkYXRlCiAgICAgICAgcnJ1bGUKICAgICAgICB0em5hbWUKICAgICk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlByb2NlZHVyZTsKCnVzZSBiYXNlIHF3L0RhdGE6OklDYWw6OkVudHJ5OjpBbGFybS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpQcm9jZWR1cmUgLSBSZXByZXNlbnRzIGEgcHJvY2VkdXJlLWNhbGwgYWxhcm0gaW4gYW4gaUNhbGVuZGFyIGZpbGUKCj1oZWFkMSBTWU5PUFNJUwoKICAgIG15ICR2YWxhcm0gPSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlByb2NlZHVyZS0+bmV3KCk7CiAgICAkdmFsYXJtLT5hZGRfcHJvcGVydGllcygKICAgICAgICBhdHRhY2ggPT4gWyAiZnRwOi8vaG9zdC5jb20vbm92by1wcm9jcy9mZWxpemFuby5leGUiLCB7IGZtdHR5cGUgPT4gImFwcGxpY2F0aW9uL2JpbmFyeSIgfSBdLAogICAgICAgICMgRGF0KmUqOjpJQ2FsIGlzIG5vdCBhIHR5cG8gaGVyZQogICAgICAgIHRyaWdnZXIgICA9PiBbIERhdGU6OklDYWwtPm5ldyggZXBvY2ggPT4gLi4uICktPmljYWwsIHsgdmFsdWUgPT4gJ0RBVEUtVElNRScgfSBdLAogICAgKTsKCiAgICAkdmV2ZW50LT5hZGRfZW50cnkoJHZhbGFybSk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlByb2NlZHVyZT4gb2JqZWN0IHJlcHJlc2VudHMgYW4gYWxhcm0KdGhhdCBjYWxscyBhIHByb2NlZHVyZSAoaW4gc29tZSBhcHBsaWNhdGlvbi1kZWZpbmVkIHdheSksIHdoaWNoIGlzCmF0dGFjaGVkIHRvIGEgdG9kbyBpdGVtIG9yIGV2ZW50IGluIGFuIGlDYWxlbmRhciBmaWxlLiAgKE5vdGUgdGhhdCB0aGUKaUNhbGVuZGFyIFJGQyByZWZlcnMgdG8gZW50cmllcyBhcyAiY29tcG9uZW50cyIuKSAgSXQgaXMgYSBzdWJjbGFzcyBvZgpMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybT4gYW5kIGFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBuZXcKCkNyZWF0ZXMgYSBuZXcgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlByb2NlZHVyZT4gb2JqZWN0OyBzZXRzIGl0cwpDPEFDVElPTj4gcHJvcGVydHkgdG8gQzxQUk9DRURVUkU+LgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgIG15ICRzZWxmICA9ICRjbGFzcy0+U1VQRVI6Om5ldyhAXyk7CiAgICAkc2VsZi0+YWRkX3Byb3BlcnR5KCBhY3Rpb24gPT4gIlBST0NFRFVSRSIgKTsKICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpJbiBhZGRpdGlvbiB0byBDPGR1cmF0aW9uPiBhbmQgQzxyZXBlYXQ+IChzZWUKTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0vb3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXM+KSwgcHJvY2VkdXJlLWNhbGwKYWxhcm1zIG1heSBhbHNvIHNwZWNpZnkgYSB2YWx1ZSBmb3IgQzxkZXNjcmlwdGlvbj4uCgo9Y3V0CgpzdWIgb3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgcmV0dXJuICgKICAgICAgICBzaGlmdC0+U1VQRVI6Om9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzLAogICAgICAgICJkZXNjcmlwdGlvbiIsCiAgICApOwp9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpJbiBhZGRpdGlvbiB0byBDPGFjdGlvbj4gYW5kIEM8dHJpZ2dlcj4gKHNlZQpMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybS9tYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXM+KSwgcHJvY2VkdXJlLWNhbGwKYWxhcm1zIG11c3QgYWxzbyBzcGVjaWZ5IGEgdmFsdWUgZm9yIEM8YXR0YWNoPi4KCj1jdXQKCnN1YiBtYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgcmV0dXJuICgKICAgICAgICBzaGlmdC0+U1VQRVI6Om1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcywKICAgICAgICAiYXR0YWNoIiwKICAgICk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06Ok5vbmU7Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0vOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6Tm9uZSAtIFJlcHJlc2VudHMgYW4gZGVmYXVsdCBuby1vcCBhbGFybQoKPWhlYWQxIFNZTk9QU0lTCgogICAgbXkgJHZhbGFybSA9IERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6Tm9uZS0+bmV3KCk7CiAgICAkdmV2ZW50LT5hZGRfZW50cnkoJHZhbGFybSk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06Ok5vbmU+IG9iamVjdCByZXByZXNlbnRzIGEgZGVmYXVsdCBhbGFybQp0aGF0IGRvZXMgbm90aGluZzsgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBhIGxhY2sgb2YgYWxhcm0sIGJlY2F1c2UKY2xpZW50cyBtYXkgYmUgZXhwZWN0ZWQgdG8gIm92ZXJyaWRlIiBhbnkgZGVmYXVsdCBhbGFybSBwcmVzZW50IGluCmNhbGVuZGFyIGRhdGEgd2l0aCB0aGUgY3VycmVudCB2YWx1ZSByZXRyaWV2ZWQgZnJvbSB0aGUgc2VydmVyLiAgVGhpcwpjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIEw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtPiBhbmQgYWNjZXB0cyBhbGwgb2YKaXRzIG1ldGhvZHMuCgpUaGlzIGVsZW1lbnQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBvZmZpY2lhbCBpQ2FsIFJGQywgYnV0IGlzIHJhdGhlciBhbgp1bmFjY2VwdGVkIGRyYWZ0IHN0YW5kYXJkOyBzZWUKTDxodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtZGFib28tdmFsYXJtLWV4dGVuc2lvbnMtMDQjc2VjdGlvbi0xMT4KQjxJdHMgaW50ZXJvcGVyYWJpbGl0eSBhbmQgc3VwcG9ydCBpcyB0aHVzIGxpbWl0ZWQuPiBUaGlzIGlzIGFsYXJtIHR5cGUKaXMgcHJpbWFyaWx5IHVzZWQgYnkgQXBwbGUuCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIG5ldwoKQ3JlYXRlcyBhIG5ldyBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6Tm9uZT4gb2JqZWN0OyBzZXRzIGl0cwpDPEFDVElPTj4gcHJvcGVydHkgdG8gQzxOT05FPi4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJGNsYXNzID0gc2hpZnQ7CiAgICBteSAkc2VsZiAgPSAkY2xhc3MtPlNVUEVSOjpuZXcoQF8pOwogICAgJHNlbGYtPmFkZF9wcm9wZXJ0eSggYWN0aW9uID0+ICJOT05FIiApOwogICAgcmV0dXJuICRzZWxmOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkRpc3BsYXk7Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0vOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6RGlzcGxheSAtIFJlcHJlc2VudHMgYSBkaXNwbGF5ZWQgYWxhcm0gaW4gYW4gaUNhbGVuZGFyIGZpbGUKCj1oZWFkMSBTWU5PUFNJUwoKICAgIG15ICR2YWxhcm0gPSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkRpc3BsYXktPm5ldygpOwogICAgJHZhbGFybS0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgZGVzY3JpcHRpb24gPT4gIldha2UgdXAhIiwKICAgICAgICAjIERhdCplKjo6SUNhbCBpcyBub3QgYSB0eXBvIGhlcmUKICAgICAgICB0cmlnZ2VyICAgPT4gWyBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IC4uLiApLT5pY2FsLCB7IHZhbHVlID0+ICdEQVRFLVRJTUUnIH0gXSwKICAgICk7CgogICAgJHZldmVudC0+YWRkX2VudHJ5KCR2YWxhcm0pOwoKPWhlYWQxIERFU0NSSVBUSU9OCgpBIEw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpEaXNwbGF5PiBvYmplY3QgcmVwcmVzZW50cyBhIGFsYXJtIHRoYXQKZGlzcGxheXMgYSBtZXNzYWdlIHdoaWNoIGlzIGF0dGFjaGVkIHRvIGEgdG9kbyBpdGVtIG9yIGV2ZW50IGluIGFuCmlDYWxlbmRhciBmaWxlLiAgKE5vdGUgdGhhdCB0aGUgaUNhbGVuZGFyIFJGQyByZWZlcnMgdG8gZW50cmllcyBhcwoiY29tcG9uZW50cyIuKSAgSXQgaXMgYSBzdWJjbGFzcyBvZiBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybT4gYW5kCmFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBuZXcKCkNyZWF0ZXMgYSBuZXcgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkRpc3BsYXk+IG9iamVjdDsgc2V0cyBpdHMKQzxBQ1RJT04+IHByb3BlcnR5IHRvIEM8RElTUExBWT4uCgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogICAgbXkgJHNlbGYgID0gJGNsYXNzLT5TVVBFUjo6bmV3KEBfKTsKICAgICRzZWxmLT5hZGRfcHJvcGVydHkoIGFjdGlvbiA9PiAiRElTUExBWSIgKTsKICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIG1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcwoKSW4gYWRkaXRpb24gdG8gQzxhY3Rpb24+IGFuZCBDPHRyaWdnZXI+IChzZWUKTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0vbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzPiksIGRpc3BsYXllZAphbGFybXMgbXVzdCBhbHNvIHNwZWNpZnkgYSB2YWx1ZSBmb3IgQzxkZXNjcmlwdGlvbj4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHJldHVybiAoCiAgICAgICAgc2hpZnQtPlNVUEVSOjptYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgImRlc2NyaXB0aW9uIiwKICAgICk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlVSSTsKCnVzZSBiYXNlIHF3L0RhdGE6OklDYWw6OkVudHJ5OjpBbGFybS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpVUkkgLSBSZXByZXNlbnRzIG5vdGlmaWNhdGlvbiB2aWEgYSBjdXN0b20gVVJJCgo9aGVhZDEgU1lOT1BTSVMKCiAgICBteSAkdmFsYXJtID0gRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpVUkktPm5ldygpOwogICAgJHZhbGFybS0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgdXJpID0+ICJzbXM6KzE1MTA1NTUwMTAxP2JvZHk9aGVsbG8lMjB0aGVyZSIsCiAgICAgICAgIyBEYXQqZSo6OklDYWwgaXMgbm90IGEgdHlwbyBoZXJlCiAgICAgICAgdHJpZ2dlciAgID0+IFsgRGF0ZTo6SUNhbC0+bmV3KCBlcG9jaCA9PiAuLi4gKS0+aWNhbCwgeyB2YWx1ZSA9PiAnREFURS1USU1FJyB9IF0sCiAgICApOwoKICAgICR2ZXZlbnQtPmFkZF9lbnRyeSgkdmFsYXJtKTsKCj1oZWFkMSBERVNDUklQVElPTgoKQSBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6VVJJPiBvYmplY3QgcmVwcmVzZW50cyBhbiBhbGFybSB0aGF0Cm5vdGlmaWVzIHZpYSBhcmJpdHJhcnkgVVJJIHdoaWNoIGlzIGF0dGFjaGVkIHRvIGEgdG9kbyBpdGVtIG9yIGV2ZW50IGluCmFuIGlDYWxlbmRhciBmaWxlLiAgKE5vdGUgdGhhdCB0aGUgaUNhbGVuZGFyIFJGQyByZWZlcnMgdG8gZW50cmllcyBhcwoiY29tcG9uZW50cyIuKSAgSXQgaXMgYSBzdWJjbGFzcyBvZiBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybT4gYW5kCmFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKVGhpcyBlbGVtZW50IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgb2ZmaWNpYWwgaUNhbCBSRkMsIGJ1dCBpcyByYXRoZXIgYW4KdW5hY2NlcHRlZCBkcmFmdCBzdGFuZGFyZDsgc2VlCkw8aHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWRhYm9vLXZhbGFybS1leHRlbnNpb25zLTA0I3NlY3Rpb24tNj4KQjxJdHMgaW50ZXJvcGVyYWJpbGl0eSBhbmQgc3VwcG9ydCBpcyB0aHVzIGxpbWl0ZWQuPiBUaGlzIGlzIGFsYXJtIHR5cGUKaXMgcHJpbWFyaWx5IHVzZWQgYnkgQXBwbGUuCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIG5ldwoKQ3JlYXRlcyBhIG5ldyBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6QWxhcm0+IG9iamVjdDsgc2V0cyBpdHMKQzxBQ1RJT04+IHByb3BlcnR5IHRvIEM8Tk9ORT4uCgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogICAgbXkgJHNlbGYgID0gJGNsYXNzLT5TVVBFUjo6bmV3KEBfKTsKICAgICRzZWxmLT5hZGRfcHJvcGVydHkoIGFjdGlvbiA9PiAiVVJJIiApOwogICAgcmV0dXJuICRzZWxmOwp9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpJbiBhZGRpdGlvbiB0byBDPGFjdGlvbj4gYW5kIEM8dHJpZ2dlcj4gKHNlZQpMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybS9tYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXM+KSwgdXJpIGFsYXJtcwptdXN0IGFsc28gc3BlY2lmeSBhIHZhbHVlIGZvciBDPHVyaT4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHJldHVybiAoCiAgICAgICAgc2hpZnQtPlNVUEVSOjptYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgInVyaSIsCiAgICApOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkVtYWlsOwoKdXNlIGJhc2UgcXcvRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtLzsKCj1oZWFkMSBOQU1FCgpEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkVtYWlsIC0gUmVwcmVzZW50cyBhbiBlbWFpbGVkIGFsYXJtIGluIGFuIGlDYWxlbmRhciBmaWxlCgo9aGVhZDEgU1lOT1BTSVMKCiAgICBteSAkdmFsYXJtID0gRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpBdWRpby0+bmV3KCk7CiAgICAkdmFsYXJtLT5hZGRfcHJvcGVydGllcygKICAgICAgICBhdHRhY2ggPT4gWyAiYmFzaWM6ZnRwOi8vaG9zdC5jb20vcHViL3NvdW5kcy9iZWxsLTAxLmF1ZCIsIHsgZm10dHlwZSA9PiAiYXVkaW8vYmFzaWMiIH0gXSwKICAgICAgICAjIERhdCplKjo6SUNhbCBpcyBub3QgYSB0eXBvIGhlcmUKICAgICAgICB0cmlnZ2VyICAgPT4gWyBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IC4uLiApLT5pY2FsLCB7IHZhbHVlID0+ICdEQVRFLVRJTUUnIH0gXSwKICAgICk7CgogICAgJHZldmVudC0+YWRkX2VudHJ5KCR2YWxhcm0pOwoKPWhlYWQxIERFU0NSSVBUSU9OCgpBIEw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpFbWFpbD4gb2JqZWN0IHJlcHJlc2VudHMgYW4gZW1haWxlZAphbGFybSBhdHRhY2hlZCB0byBhIHRvZG8gaXRlbSBvciBldmVudCBpbiBhbiBpQ2FsZW5kYXIgZmlsZS4gIChOb3RlCnRoYXQgdGhlIGlDYWxlbmRhciBSRkMgcmVmZXJzIHRvIGVudHJpZXMgYXMgImNvbXBvbmVudHMiLikgIEl0IGlzIGEKc3ViY2xhc3Mgb2YgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0+IGFuZCBhY2NlcHRzIGFsbCBvZiBpdHMgbWV0aG9kcy4KClRoZSBDPGF0dGVuZGVlPiBwcm9wZXJ0aWVzIGFyZSBpbnRlbmRlZCBhcyB0aGUgcmVjaXBpZW50IGxpc3Qgb2YgdGhlCmVtYWlsOyB0aGUgQzxzdW1tYXJ5PiBhcyBpdHMgc3ViamVjdDsgdGhlIEM8ZGVzY3JpcHRpb24+IGFzIGl0cyBib2R5OwphbmQgdGhlIEM8YXR0YWNoPiBhcyBpdHMgYXR0YWNobWVudHMuCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIG5ldwoKQ3JlYXRlcyBhIG5ldyBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6RW1haWw+IG9iamVjdDsgc2V0cyBpdHMKQzxBQ1RJT04+IHByb3BlcnR5IHRvIEM8RU1BSUw+LgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgIG15ICRzZWxmICA9ICRjbGFzcy0+U1VQRVI6Om5ldyhAXyk7CiAgICAkc2VsZi0+YWRkX3Byb3BlcnR5KCBhY3Rpb24gPT4gIkVNQUlMIiApOwogICAgcmV0dXJuICRzZWxmOwp9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpJbiBhZGRpdGlvbiB0byBDPGFjdGlvbj4gYW5kIEM8dHJpZ2dlcj4gKHNlZQpMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybS9tYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXM+KSwgZW1haWxlZCBhbGFybXMKbXVzdCBhbHNvIHNwZWNpZnkgYSB2YWx1ZSBmb3IgQzxkZXNjcmlwdGlvbj4gYW5kIEM8c3VtbWFyeT4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHJldHVybiAoCiAgICAgICAgc2hpZnQtPlNVUEVSOjptYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgImRlc2NyaXB0aW9uIiwgInN1bW1hcnkiLAogICAgKTsKfQoKPWhlYWQyIG1hbmRhdG9yeV9yZXBlYXRhYmxlX3Byb3BlcnRpZXMKCkFjY29yZGluZyB0byB0aGUgaUNhbGVuZGFyIHN0YW5kYXJkLCB0aGUgQzxhdHRlbmRlZT4gcHJvcGVydHkgbXVzdCBiZQpzcGVjaWZpZWQgYXQgbGVhc3Qgb25jZSBmb3IgYW4gZW1haWxlZCBhbGFybS4KCj1jdXQKCnN1YiBtYW5kYXRvcnlfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGF0dGVuZGVlCiAgICApOwp9Cgo9aGVhZDIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIEM8YXR0YWNoPiBwcm9wZXJ0eSBtYXkgYmUKc3BlY2lmaWVkIGFueSBudW1iZXIgb2YgdGltZXMgZm9yIGFuIGVtYWlsZWQgYWxhcm0uCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGF0dGFjaAogICAgKTsKfQoKPWhlYWQxIEFVVEhPUgoKQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMgRTxsdD5tb2R1bGVzQGJlc3RwcmFjdGljYWwuY29tRTxndD4KCj1oZWFkMSBMSUNFTkNFIEFORCBDT1BZUklHSFQKCkNvcHlyaWdodCAoYykgMjAwNSAtIDIwMTUsIEJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KClRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuIFNlZSBMPHBlcmxhcnRpc3RpYz4uCgo9Y3V0CgoxOwo=
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkF1ZGlvOwoKdXNlIGJhc2UgcXcvRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtLzsKCj1oZWFkMSBOQU1FCgpEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkF1ZGlvIC0gUmVwcmVzZW50cyBhbiBhdWRpbyBhbGFybSBpbiBhbiBpQ2FsZW5kYXIgZmlsZQoKPWhlYWQxIFNZTk9QU0lTCgogICAgbXkgJHZhbGFybSA9IERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6QXVkaW8tPm5ldygpOwogICAgJHZhbGFybS0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgYXR0YWNoID0+IFsgImZ0cDovL2hvc3QuY29tL3B1Yi9zb3VuZHMvYmVsbC0wMS5hdWQiLCB7IGZtdHR5cGUgPT4gImF1ZGlvL2Jhc2ljIiB9IF0sCiAgICAgICAgIyBEYXQqZSo6OklDYWwgaXMgbm90IGEgdHlwbyBoZXJlCiAgICAgICAgdHJpZ2dlciAgID0+IFsgRGF0ZTo6SUNhbC0+bmV3KCBlcG9jaCA9PiAuLi4gKS0+aWNhbCwgeyB2YWx1ZSA9PiAnREFURS1USU1FJyB9IF0sCiAgICApOwoKICAgICR2ZXZlbnQtPmFkZF9lbnRyeSgkdmFsYXJtKTsKCj1oZWFkMSBERVNDUklQVElPTgoKQSBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6QXVkaW8+IG9iamVjdCByZXByZXNlbnRzIGFuIGF1ZGlvIGFsYXJtCmF0dGFjaGVkIHRvIGEgdG9kbyBpdGVtIG9yIGV2ZW50IGluIGFuIGlDYWxlbmRhciBmaWxlLiAgKE5vdGUgdGhhdCB0aGUKaUNhbGVuZGFyIFJGQyByZWZlcnMgdG8gZW50cmllcyBhcyAiY29tcG9uZW50cyIuKSAgSXQgaXMgYSBzdWJjbGFzcyBvZgpMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybT4gYW5kIGFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBuZXcKCkNyZWF0ZXMgYSBuZXcgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkF1ZGlvPiBvYmplY3Q7IHNldHMgaXRzCkM8QUNUSU9OPiBwcm9wZXJ0eSB0byBDPEFVRElPPi4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJGNsYXNzID0gc2hpZnQ7CiAgICBteSAkc2VsZiAgPSAkY2xhc3MtPlNVUEVSOjpuZXcoQF8pOwogICAgJHNlbGYtPmFkZF9wcm9wZXJ0eSggYWN0aW9uID0+ICJBVURJTyIgKTsKICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpJbiBhZGRpdGlvbiB0byBDPGR1cmF0aW9uPiBhbmQgQzxyZXBlYXQ+IChzZWUKTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0vb3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXM+KSwgYXVkaW8gYWxhcm1zCm1heSBzcGVjaWZ5IGEgdmFsdWUgZm9yIEM8YXR0YWNoPi4KCj1jdXQKCnN1YiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcyB7CiAgICByZXR1cm4gKAogICAgICAgIHNoaWZ0LT5TVVBFUjo6b3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgImF0dGFjaCIsCiAgICApOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
IyAkUmV2OiA2NzggJApwYWNrYWdlIERhdGU6OklDYWw7CnVzZSBzdHJpY3Q7Cgp1c2UgdmFycyBxdygkVkVSU0lPTiAkbG9jYWx6b25lICRsb2NhbG9mZnNldCBAbW9udGhzIEBsZWFwbW9udGhzICVhZGRfdW5pdHMpOwokVkVSU0lPTiA9ICcyLicuKHF3JyRSZXY6IDY3OCAkJylbMV07CnVzZSBDYXJwOwp1c2UgVGltZTo6TG9jYWw7CnVzZSBEYXRlOjpMZWFweWVhciBxdygpOwp1c2UgRGF0ZTo6SUNhbDo6RHVyYXRpb247CnVzZSBvdmVybG9hZCAnPD0+JyA9PiAnY29tcGFyZScsCiAgICAgICAgICAgICAnZmFsbGJhY2snID0+IDEsCiAgICAgICAgICAgICAnLScgPT4gXCZzdWJ0cmFjdCwKICAgICAgICAgICAgICcrJyA9PiBcJmFkZF9vdmVybG9hZDsKCiRsb2NhbHpvbmUgICA9ICRFTlZ7VFp9IHx8IDA7CiRsb2NhbG9mZnNldCA9IF9jYWxjX2xvY2FsX29mZnNldCgpOwoKIyBEb2N1bWVudGF0aW9uIHt7ewoKPWhlYWQxIE5BTUUKCkRhdGU6OklDYWwgLSBQZXJsIGV4dGVuc2lvbiBmb3IgSUNhbGVuZGFyIGRhdGUgb2JqZWN0cy4KCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDY3OCAkCgo9aGVhZDEgU1lOT1BTSVMKCiAgICB1c2UgRGF0ZTo6SUNhbDsKCiAgICAkaWNhbCA9IERhdGU6OklDYWwtPm5ldyggaWNhbCA9PiAnMTk5NzEwMjRUMTIwMDAwJyApOwogICAgJGljYWwgPSBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IHRpbWUgKTsKICAgICRpY2FsID0gRGF0ZTo6SUNhbC0+bmV3KCB5ZWFyID0+IDE5NjQsCiAgICAgICAgbW9udGggPT4gMTAsIGRheSA9PiAxNiwgaG91ciA9PiAxNiwKICAgICAgICBtaW4gPT4gMTIsIHNlYyA9PiA0NyApOwoKICAgICRob3VyID0gJGljYWwtPmhvdXI7CiAgICAkeWVhciA9ICRpY2FsLT55ZWFyOwoKICAgICRpY2FsX3N0cmluZyA9ICRpY2FsLT5pY2FsOwogICAgJGVwb2NoX3RpbWUgPSAkaWNhbC0+ZXBvY2g7CgogICAgJGljYWwyID0gJGljYWwgKyAkZHVyYXRpb247CgooV2hlcmUgJGR1cmF0aW9uIGlzIGVpdGhlciBhIGR1cmF0aW9uIHN0cmluZywgbGlrZSAnUDJXM0RUN0g5TScsIG9yIGEKRGF0ZTo6SUNhbDo6RHVyYXRpb24gKHF2KSBvYmplY3QuCgogICAgJGljYWwgKz0gJ1A2RFQxMkgnOwoKICAgICRkdXJhdGlvbiA9ICRpY2FsIC0gJGljYWwyOwogICAgJGljYWwzID0gJGljYWwgLSAkZHVyYXRpb247Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkRhdGU6OklDYWwgdGFsa3MgdGhlIElDYWwgZGF0ZSBmb3JtYXQsIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIGJhc2UgY2xhc3MgZm9yCm90aGVyIGRhdGUvY2FsZW5kYXIgbW9kdWxlcyB0aGF0IGtub3cgYWJvdXQgSUNhbCB0aW1lIGZvcm1hdCBhbHNvLgoKPWhlYWQxIEFVVEhPUgoKUmljaCBCb3dlbiwgYW5kIHRoZSBSZWVma25vdCB0ZWFtLiBBbGFzLCBSZWVma25vdCBpcyBubyBtb3JlLiBTZWUKaHR0cDovL2RhdGV0aW1lLnBlcmwub3JnLyBmb3IgbW9yZSBtb2Rlcm4gYW5kIGFjY3VyYXRlIG1vZHVsZXMuCgpMYXN0IHRvdWNoZWQgYnkgJEF1dGhvcjogcmJvd2VuICQKCj1oZWFkMSBNRVRIT0RTCgpEYXRlOjpJQ2FsIGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYXZhaWxhYmxlOgoKPWhlYWQyIG5ldwoKQSBuZXcgRGF0ZTo6SUNhbCBvYmplY3QgY2FuIGJlIGNyZWF0ZWQgd2l0aCBhbnkgdmFsaWQgSUNhbCBzdHJpbmc6CgogICAgbXkgJGljYWwgPSBEYXRlOjpJQ2FsLT5uZXcoIGljYWwgPT4gJzE5OTcxMDI0VDEyMDAwMCcgKTsKICAgICMgd2lsbCBkZWZhdWx0IHRvIHRoZSB0aW1lem9uZSBzcGVjaWZpZWQgaW4gJFRaLCBzZWUgYmVsb3cKCk9yIHdpdGggYW55IGVwb2NoIHRpbWU6CgogICAgbXkgJGljYWwgPSBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IHRpbWUgKTsKCk9yLCBiZXR0ZXIgc3RpbGwsIGNyZWF0ZSBpdCB3aXRoIGNvbXBvbmVudHMKCiAgICBteSAkZGF0ZSA9IERhdGU6OklDYWwtPm5ldyggCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheSA9PiAyNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID0+IDEwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9PiAxMDY2LAogICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0+IDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9PiAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjID0+IDQ3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgpJZiB5b3UgY2FsbCBuZXcgd2l0aG91dCBhbnkgYXJndW1lbnRzLCB5b3UnbGwgZ2V0IGEgRGF0ZTo6SUNhbCBvYmplY3QgdGhhdCBpcwpzZXQgdG8gdGhlIHRpbWUgcmlnaHQgbm93LgoKICAgIG15ICRpY2FsID0gRGF0ZTo6SUNhbC0+bmV3KCk7CgpJZiB5b3UgYWxyZWFkeSBoYXZlIGFuIG9iamVjdCBpbiBEYXRlOjpJQ2FsLCBvciBzb21lIG90aGVyIHN1YmNsYXNzCnRoZXJlb2YsIHlvdSBjYW4gY3JlYXRlIGEgbmV3IERhdGU6OklDYWwgKG9yIHN1YmNsYXNzKSBvYmplY3QgdXNpbmcKdGhhdCBvYmplY3QgdG8gc3RhcnQgd2l0aC4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBjb252ZXJ0aW5nCmZyb20gb25lIGNhbGVuZGFyIHRvIGFub3RoZXI6CgogICAjIERpcmVjdCBjb252ZXJzaW9uIGZyb20gRGlzY29yZGlhbiB0byBJU08gZGF0ZXMKICAgbXkgJGRpc2NvID0gRGF0ZTo6RGlzY29yZGlhbi0+bmV3KCBkaXNjbyA9PiAnMTIgQ2hhb3MsIFlPTEQgMzE3NycgKTsKICAgbXkgJGlzbyA9IERhdGU6OklTTy0+bmV3KCAkZGlzY28gKTsKICAgcHJpbnQgJGlzby0+aXNvOwoKbmV3KCkgaGFuZGxlcyB0aW1lem9uZXMuIEl0IGRlZmF1bHRzIHRpbWVzIHRvIFVUQyAoR3JlZW53aWNoCk1lYW4gVGltZSwgYWxzbyBjYWxsZWQgWnVsdSkuIElmIHlvdSB3YW50IHRvIHNldCB1cCBhIHRpbWUKdGhhdCdzIGluIHRoZSBVUyAiUGFjaWZpYyIgdGltZXpvbmUsIHdoaWNoIGlzIEdNVC04LCB1c2Ugc29tZXRoaW5nCmxpa2U6CiAgICAKICAgIG15ICRpY2FsID0gRGF0ZTo6SUNhbC0+bmV3KCBpY2FsID0+ICcxOTk3MTAyNFQxMjAwMDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9PiAiLTA4MDAiKTsKICAgCk5vdGUgdGhhdCBhcyBvZiB2ZXJzaW9uIDEuNDQsIG5ldygpIHRyaWVzIHRvIGJlIGludGVsbGlnZW50CmFib3V0IGZpZ3VyaW5nIG91dCB5b3VyIGxvY2FsIHRpbWUgem9uZS4gSWYgeW91IGVudGVyCmEgdGltZSB0aGF0J3Mgbm90ICpleHBsaWNpdGx5KiBpbiBVVEMsIGl0IGxvb2tzIGF0CnRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAkVFosIGlmIGl0IGV4aXN0cywgdG8gZGV0ZXJtaW5lCnlvdXIgbG9jYWwgb2Zmc2V0LiBJZiAkVFogaXNuJ3Qgc2V0LCBuZXcoKSB3aWxsIGNvbXBsYWluLgoKPWN1dAoKI319fQoKI3t7eyBzdWIgbmV3CgpzdWIgbmV3IHsKICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogICAgbXkgKCAkc2VsZiwgJWFyZ3MsICRzZWMsICRtaW4sICRob3VyLCAkZGF5LCAkbW9udGgsICR5ZWFyLCAkdHogKTsKCiAgICAjICR6ZmxhZyBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhpcyB0aW1lIGlzIG5hdGl2ZWx5IGluIFVUQyAgICAKICAgIG15ICR6ZmxhZyA9IDA7CgogICAgIyBGaXJzdCBhcmd1bWVudCBjYW4gYmUgYSBEYXRlOjpJQ2FsIChvciBzdWJjbGFzcyB0aGVyZW9mKSBvYmplY3QKICAgIGlmICggcmVmICRfWzBdICkgewogICAgICAgICRhcmdze2ljYWx9ID0gJF9bMF0tPmljYWw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgJWFyZ3MgPSBAXzsKICAgIH0KCiAgICAkc2VsZiA9IHt9OwoKICAgICMgRGF0ZSBpcyBzcGVjaWZpZWQgYXMgZXBvY2gje3t7CiAgICBpZiAoIGRlZmluZWQoICRhcmdze2Vwb2NofSApICkgewoKICAgICAgICAoICRzZWMsICRtaW4sICRob3VyLCAkZGF5LCAkbW9udGgsICR5ZWFyICkgPQogICAgICAgICAgKCBnbXRpbWUoICRhcmdze2Vwb2NofSApIClbIDAsIDEsIDIsIDMsIDQsIDUgXTsKICAgICAgICAkeWVhciArPSAxOTAwOwogICAgICAgICRtb250aCsrOwoKICAgICAgICAkemZsYWcgPSAxOyAgICAjIGVwb2NoIHRpbWVzIGFyZSBieSBkZWZpbml0aW9uIGluIEdNVAogICAgfSAgICAjfX19CgogICAgIyBEYXRlIGlzIHNwZWNpZmllZCBhcyBpY2FsIHN0cmluZyN7e3sKICAgIGVsc2lmICggZGVmaW5lZCggJGFyZ3N7aWNhbH0gKSApIHsKCiAgICAgICAgIyBUaW1lem9uZSwgaWYgYW55CiAgICAgICAgJGFyZ3N7aWNhbH0gPX4gcy9eKD86VFpJRD0oW146XSspOik/Ly87CiAgICAgICAgJHR6ID0gJDE7CgogICAgICAgICMgU3BsaXQgdXAgaWNhbCBzdHJpbmcKICAgICAgICAoICR5ZWFyLCAkbW9udGgsICRkYXksICRob3VyLCAkbWluLCAkc2VjLCAkemZsYWcgKSA9CiAgICAgICAgICAkYXJnc3tpY2FsfSA9fiAvXig/OihcZHs0fSkoXGRcZCkoXGRcZCkpCiAgICAgICAgICAgICAgICg/OlQoXGRcZCk/KFxkXGQpPyhcZFxkKT8pPwogICAgICAgICAgICAgICAgICAgICAgICAgKFopPyQveDsKCiAgICAgICAgIyBUT0RPOiBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gaWYgd2UgZ2V0IGEgVFpJRC4gCiAgICAgICAgIyBJJ2Qgc3VnZ2VzdCB3ZSBzdG9yZSBpdCBmb3IgdXNlIGJ5IG1vZHVsZXMgdGhhdCBjYXJlCiAgICAgICAgIyBhYm91dCBUWklEIG5hbWVzLiBCdXQgd2UgZG9uJ3Qgd2FudCB0aGlzIG1vZHVsZQogICAgICAgICMgdG8gZGVhbCB3aXRoIHRpbWV6b25lIG5hbWVzLCBvbmx5IG9mZnNldHMsIEkgdGhpbmsuCiAgICAgICAgIyAtLXNybAoKICAgIH0gICAgI319fQoKICAgICMgVGltZSBzcGVjaWZpZWQgYXMgY29tcG9uZW50cyN7e3sKICAgIGVsc2lmICggZGVmaW5lZCggJGFyZ3N7ZGF5fSApICkgewoKICAgICAgICAjIENob2tlIGlmIG1pc3NpbmcgYXJndW1lbnRzCiAgICAgICAgZm9yZWFjaCBteSAkYXR0cmliKHF3KGRheSBtb250aCB5ZWFyICkpIHsKICAgICAgICAgICAgd2FybiAiQXR0cmlidXRlICRhdHRyaWIgcmVxdWlyZWQiIHVubGVzcyBkZWZpbmVkICRhcmdzeyRhdHRyaWJ9OwogICAgICAgIH0KICAgICAgICBmb3JlYWNoIG15ICRhdHRyaWIocXcoIGhvdXIgbWluIHNlYyApKSB7CiAgICAgICAgICAgICRhcmdzeyRhdHRyaWJ9ID0gMCB1bmxlc3MgZGVmaW5lZCAkYXJnc3skYXR0cmlifTsKICAgICAgICB9CgogICAgICAgICMgQW5kIHRoZW4ganVzdCB1c2Ugd2hhdCB3YXMgcGFzc2VkIGluCiAgICAgICAgKCAkc2VjLCAkbWluLCAkaG91ciwgJGRheSwgJG1vbnRoLCAkeWVhciApID0KICAgICAgICAgIEBhcmdzeyAnc2VjJywgJ21pbicsICdob3VyJywgJ2RheScsICdtb250aCcsICd5ZWFyJyB9OwoKICAgIH0gICAgI319fQoKICAgIGVsc2UgeyAgICAjIEp1c3QgdXNlIGN1cnJlbnQgZ210aW1lI3t7ewoKICAgICAgICAjIFNpbmNlIHdlIGFyZSBkZWZhdWx0aW5nLCB0aGlzIHF1YWxpZmllcyBhcyBVVEMKICAgICAgICAkemZsYWcgPSAxOwoKICAgICAgICAoICRzZWMsICRtaW4sICRob3VyLCAkZGF5LCAkbW9udGgsICR5ZWFyICkgPSAoIGdtdGltZSh0aW1lKSApWyAwIC4uIDUgXTsKICAgICAgICAkeWVhciArPSAxOTAwOwogICAgICAgICRtb250aCsrOwogICAgfSAgICAjfX19CgogICAgJHNlbGYtPntqdWxpYW59ID0gZ3JlZzJqZCggJHllYXIsICRtb250aCwgJGRheSApOwogICAgJHNlbGYtPntqdWxzZWN9ID0gdGltZV9hc19zZWNvbmRzKCAkaG91ciwgJG1pbiwgJHNlYyApOwogICAgYmxlc3MgJHNlbGYsICRjbGFzczsKCiAgICBpZiAoIGV4aXN0cyggJGFyZ3N7b2Zmc2V0fSApICkgewogICAgICAgICMgV2Ugc2hvdWxkIGNvbXBsYWluIGlmIHRoZXkncmUgdHJ5aW5nIHRvIHNldCBhIG5vbi1VVEMKICAgICAgICAjIG9mZnNldCBvbiBhIHRpbWUgdGhhdCdzIGluaGVyZW50bHkgVVRDLiAgLWp2CiAgICAgICAgaWYgKCR6ZmxhZyAmJiAoJGFyZ3N7b2Zmc2V0fSAhPSAwKSkgewogICAgICAgICAgICBjYXJwICJUaW1lIGhhZCBjb25mbGljdGluZyBvZmZzZXQgYW5kIFVUQyBpbmZvLiBVc2luZyBVVEMiCiAgICAgICAgICAgICAgdW5sZXNzICRFTlZ7SEFSTkVTU19BQ1RJVkV9OwogICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICMgU2V0IHVwIHRoZSBvZmZzZXQgZm9yIHRoaXMgZGF0ZXRpbWUuCiAgICAgICAgICAgICRzZWxmLT5vZmZzZXQoICRhcmdze29mZnNldH0gfHwgMCApOwogICAgICAgIH0KICAgICAgfSBlbHNpZiAoICEkemZsYWcgKSB7CgogICAgICAgICMgQ2hlY2sgaWYgdGhlIHRpbWV6b25lIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgY2hlY2tlZC4KICAgICAgICAjIEFwcGFyZW50bHkgdGhpcyBoYXBwZW5zIG9uIHNvbWUgc3lzdGVtcy4gUGF0Y2ggZnJvbSBNaWtlCiAgICAgICAgIyBIZWlucy4gQXNrIGhpbS4KICAgICAgICBteSAkdHogID0gJEVOVntUWn0gfHwgJzAnOwogICAgICAgIG15ICRsb2MgPSAkdHogZXEgJGxvY2Fsem9uZSA/ICRsb2NhbG9mZnNldCA6IF9jYWxjX2xvY2FsX29mZnNldCgpOwogICAgICAgICRzZWxmLT5vZmZzZXQoJGxvYykgaWYgZGVmaW5lZCAkc2VsZjsKICAgIH0KCiAgICByZXR1cm4gJHNlbGY7Cn0KCiN9fX0KCiN7e3sgc3ViIGljYWwKCj1oZWFkMiBpY2FsCgogICAgJGljYWxfc3RyaW5nID0gJGljYWwtPmljYWw7CgpSZXRyaWV2ZXMsIG9yIHNldHMsIHRoZSBkYXRlIG9uIHRoZSBvYmplY3QsIHVzaW5nIGFueSB2YWxpZCBJQ2FsIGRhdGUvdGltZQpzdHJpbmcuIE91dHB1dCBpcyBpbiBVVEMgKGVuZHMgd2l0aCBhICJaIikgYnkgZGVmYXVsdC4gVG8gZ2V0Cm91dHB1dCBpbiBsb2NhbHRpbWUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgbWFjaGluZSwgZG86CiAgICAKICAgICRpY2FsX3N0cmluZyA9ICRpY2FsLT5pY2FsKCBsb2NhbHRpbWUgPT4gMSApOwoKVG8gZ2V0IG91dHB1dCByZWxhdGl2ZSB0byBhbiBhcmJpdHJhcnkgb2Zmc2V0LCBkbzoKCiAgICAkaWNhbF9zdHJpbmcgPSAkaWNhbC0+aWNhbCggb2Zmc2V0ID0+ICcrMDU0NScgKTsKCj1jdXQKCnN1YiBpY2FsIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBpZiAoIDEgJiBAXyApIHsgICAgICMgb2RkIG51bWJlciBvZiBwYXJhbWV0ZXJzPwogICAgICAgIGNhcnAgIkJhZCBhcmdzOiBleHBlY3RlZCBuYW1lZCBwYXJhbWV0ZXIgbGlzdCI7CiAgICAgICAgc2hpZnQ7ICAgICMgYXZvaWQgd2FybmluZyBmcm9tICVhcmdzPUBfIGFzc2lnbm1lbnQKICAgIH0KICAgIG15ICVhcmdzID0gQF87CiAgICBteSAkaWNhbDsKCiAgICBpZiAoIGV4aXN0cyAkYXJnc3tsb2NhbHRpbWV9ICkgewogICAgICAgIGNhcnAgImNhbid0IGhhdmUgbG9jYWx0aW1lIGFuZCBvZmZzZXQgdG9nZXRoZXIsIHVzaW5nIGxvY2FsdGltZSBvZmZzZXQiCiAgICAgICAgICBpZiBleGlzdHMgJGFyZ3N7b2Zmc2V0fTsKCiAgICAgICAgIyBtYWtlIG91dHB1dCBpbiBsb2NhbHRpbWUgZm9ybWF0IGJ5IHNldHRpbmcgJGFyZ3N7b2Zmc2V0fQogICAgICAgICRhcmdze29mZnNldH0gPSAkc2VsZi0+b2Zmc2V0OwogICAgfQoKICAgIGlmICggZXhpc3RzICRhcmdze29mZnNldH0gKSB7CgogICAgICAgICMgbWFrZSBvdXRwdXQgYmFzZWQgb24gYW4gYXJiaXRyYXJ5IG9mZnNldAogICAgICAgICMgTm8gWiBvbiB0aGUgZW5kIQogICAgICAgIG15ICRqdWxpYW4gPSAkc2VsZi0+e2p1bGlhbn07CiAgICAgICAgbXkgJGp1bHNlYyA9ICRzZWxmLT57anVsc2VjfTsKICAgICAgICBteSAkYWRqdXN0ID0gb2Zmc2V0X3RvX3NlY29uZHMoICRhcmdze29mZnNldH0gKTsKICAgICAgICAkc2VsZi0+YWRkKCBzZWNvbmRzID0+ICRhZGp1c3QgKTsKICAgICAgICAkaWNhbCA9CiAgICAgICAgICBzcHJpbnRmKCAnJTA0ZCUwMmQlMDJkVCUwMmQlMDJkJTAyZCcsICRzZWxmLT55ZWFyLCAkc2VsZi0+bW9udGgsCiAgICAgICAgICAkc2VsZi0+ZGF5LCAkc2VsZi0+aG91ciwgJHNlbGYtPm1pbnV0ZSwgJHNlbGYtPnNlY29uZCwgKTsKICAgICAgICAkc2VsZi0+e2p1bGlhbn0gPSAkanVsaWFuOwogICAgICAgICRzZWxmLT57anVsc2VjfSA9ICRqdWxzZWM7CiAgICAgIH0gZWxzZSB7CgogICAgICAgICMgbWFrZSBvdXRwdXQgaW4gVVRDIGJ5IGRlZmF1bHQKICAgICAgICAjIGlmIHdlIHdlcmUgb3JpZ2luYWxseSBnaXZlbiB0aGlzIHRpbWUgaW4gb2Zmc2V0CiAgICAgICAgIyBmb3JtLCB3ZSdsbCBuZWVkIHRvIGFkanVzdCBpdCBmb3Igb3V0cHV0CiAgICAgICAgaWYgKCAkc2VsZi0+aG91ciB8fCAkc2VsZi0+bWluIHx8ICRzZWxmLT5zZWMgKSB7CiAgICAgICAgICAgICRpY2FsID0KICAgICAgICAgICAgICBzcHJpbnRmKCAnJTA0ZCUwMmQlMDJkVCUwMmQlMDJkJTAyZFonLCAkc2VsZi0+eWVhciwgJHNlbGYtPm1vbnRoLAogICAgICAgICAgICAgICRzZWxmLT5kYXksICRzZWxmLT5ob3VyLCAkc2VsZi0+bWludXRlLCAkc2VsZi0+c2Vjb25kICk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkaWNhbCA9CiAgICAgICAgICAgICAgc3ByaW50ZiggJyUwNGQlMDJkJTAyZFonLCAkc2VsZi0+eWVhciwgJHNlbGYtPm1vbnRoLCAkc2VsZi0+ZGF5ICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkaWNhbDsKfSAgICAjfX19Cgoje3t7IHN1YiBlcG9jaAoKPWhlYWQyIGVwb2NoCgogICAgJGVwb2NoX3RpbWUgPSAkaWNhbC0+ZXBvY2g7CiAgICAKICAgICRpY2FsLT5lcG9jaCggOTg2ODc0MzEgKTsKClNldHMsIG9yIHJldHJpZXZlcywgdGhlIGVwb2NoIHRpbWUgcmVwcmVzZW50ZWQgYnkgdGhlIG9iamVjdCwgaWYgaXQgaXMKcmVwcmVzZW50YWJsZSBhcyBzdWNoLiAoRGF0ZXMgYmVmb3JlIDE5NzEgb3IgYWZ0ZXIgMjAzOCB3aWxsIG5vdCBoYXZlIGFuIGVwb2NoCnJlcHJlc2VudGF0aW9uLikKCkludGVybmFscyBub3RlOiBUaGUgSUNhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0ZSBpcyBjb25zaWRlcmVkIHRoZSBvbmx5CmF1dGhvcml0YXRpdmUgb25lLiBUaGlzIG1lYW5zIHRoYXQgd2UgbWF5IG5lZWQgdG8gcmVjb25zdHJ1Y3QgdGhlIGVwb2NoIHRpbWUKZnJvbSB0aGUgSUNhbCByZXByZXNlbnRhdGlvbiBpZiB3ZSBhcmUgbm90IHN1cmUgdGhhdCB0aGV5IGFyZSBpbiBzeW5jaC4gV2UnbGwKbmVlZCB0byBkbyBjbGV2ZXIgdGhpbmdzIHRvIGtlZXAgdHJhY2sgb2Ygd2hlbiB0aGUgdHdvIG1heSBub3QgYmUgaW4gc3luY2guCkFuZCwgb2YgY291cnNlLCB0aGUgc2FtZSB3aWxsIGdvIGZvciBhbnkgc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzLgoKPWN1dAoKc3ViIGVwb2NoIHsKICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgbXkgJGNsYXNzID0gcmVmKCRzZWxmKTsKCiAgICBteSAkZXBvY2g7CgogICAgaWYgKCAkZXBvY2ggPSBzaGlmdCApIHsgICAgIyBQYXNzZWQgaW4gYSBuZXcgdmFsdWUKCiAgICAgICAgbXkgJG5ld2Vwb2NoID0gJGNsYXNzLT5uZXcoIGVwb2NoID0+ICRlcG9jaCApOwogICAgICAgICRzZWxmLT57anVsaWFufSA9ICRuZXdlcG9jaC0+e2p1bGlhbn07CiAgICAgICAgJHNlbGYtPntqdWxzZWN9ID0gJG5ld2Vwb2NoLT57anVsc2VjfTsKCiAgICB9CgogICAgZWxzZSB7ICAgICMgQ2FsY3VsYXRlIGVwb2NoIGZyb20gY29tcG9uZW50cywgaWYgcG9zc2libGUKCiAgICAgICAgJGVwb2NoID0KICAgICAgICAgIHRpbWVnbSggJHNlbGYtPnNlYywgJHNlbGYtPm1pbiwgJHNlbGYtPmhvdXIsICRzZWxmLT5kYXksCiAgICAgICAgICAoICRzZWxmLT5tb250aCApIC0gMSwgKCAkc2VsZi0+eWVhciApIC0gMTkwMCApOwogICAgfQoKICAgIHJldHVybiAkZXBvY2g7Cn0KCiN9fX0KCiN7e3sgc3ViIG9mZnNldF90b19zZWNvbmRzCgo9aGVhZDIgb2Zmc2V0X3RvX3NlY29uZHMKCiAgICAkc2Vjb25kc19wbHVzX29yX21pbnVzID0gb2Zmc2V0X3RvX3NlY29uZHMoJG9mZnNldCk7CiAgIApDaGFuZ2VzIC0wNjAwIHRvIC0yMTYwMC4gTm90IG9iamVjdCBtZXRob2QsIG5vIHNpZGUtZWZmZWN0cy4KCj1jdXQKCnN1YiBvZmZzZXRfdG9fc2Vjb25kcyB7CiAgICBteSAkb2Zmc2V0ID0gc2hpZnQ7CgogICAgIyBSZWxvY2F0ZWQgZnJvbSBvZmZzZXQgZm9yIHJlLXVzZQogICAgbXkgJG5ld29mZnNldDsKCiAgICBpZiAoICRvZmZzZXQgZXEgJzAnICkgewogICAgICAgICRuZXdvZmZzZXQgPSAwOwogICAgICB9IGVsc2lmICggJG9mZnNldCA9fiAvXihbKy1dKShcZFxkKShcZFxkKVx6LyApCiAgICB7CiAgICAgICAgbXkgKCAkc2lnbiwgJGhvdXJzLCAkbWludXRlcyApID0gKCAkMSwgJDIsICQzICk7CgogICAgICAgICMgY29udmVydCB0byBzZWNvbmRzLCBpZ25vcmluZyB0aGUgcG9zc2liaWxpdHkgb2YgbGVhcCBzZWNvbmRzCiAgICAgICAgIyBvciBkYXlsaWdodC1zYXZpbmdzLXRpbWUgc2hpZnRzCiAgICAgICAgJG5ld29mZnNldCA9ICRob3VycyAqIDYwICogNjAgKyAkbWludXRlcyAqIDYwOwogICAgICAgICRuZXdvZmZzZXQgKj0gLTEgaWYgJHNpZ24gZXEgJy0nOwogICAgICB9IGVsc2UgewogICAgICAgIGNhcnAoIllvdSBnYXZlIGFuIG9mZnNldCwgJG9mZnNldCwgdGhhdCBtYWtlcyBubyBzZW5zZSIpOwogICAgICAgIHJldHVybiB1bmRlZjsKICAgIH0KICAgIHJldHVybiAkbmV3b2Zmc2V0Owp9CgojfX19Cgoje3t7IHN1YiBvZmZzZXRfZnJvbV9zZWNvbmRzCgo9aGVhZDIgb2Zmc2V0X2Zyb21fc2Vjb25kcwoKICAgICRzZWNvbmRzX3BsdXNfb3JfbWludXMgPSBvZmZzZXRfZnJvbV9zZWNvbmRzKCRvZmZzZXRfaW5fc2Vjb25kcyk7CiAgIApDaGFuZ2VzIC0xODAwMCAoc2Vjb25kcykgdG8gLTA2MDAgKGhvdXJzLCBtaW51dGVzKS4gCk5vdCBvYmplY3QgbWV0aG9kLCBubyBzaWRlLWVmZmVjdHMuCgo9Y3V0CgpzdWIgb2Zmc2V0X2Zyb21fc2Vjb25kcyB7CiAgICBteSAkc2Vjb2Zmc2V0ICA9IHNoaWZ0OwogICAgbXkgJGhobW1vZmZzZXQgPSAwOwoKICAgIGlmICggJHNlY29mZnNldCBuZSAnMCcgKSB7CiAgICAgICAgbXkgKCAkc2lnbiwgJHNlY3MgKSA9ICggIiIsICIiICk7CiAgICAgICAgKCAkc2lnbiwgJHNlY3MgKSA9ICRzZWNvZmZzZXQgPX4gLyhbKy1dKT8oXGQrKS87CgogICAgICAgICMgdGhyb3cgaW4gYSArIHRvIG1ha2UgdGhpcyBsb29rIGxpa2UgYW4gb2Zmc2V0IGlmIHBvc2l0aXZlCiAgICAgICAgJHNpZ24gPSAiKyIgdW5sZXNzICRzaWduOwoKICAgICAgICAjIE5PVEU6IHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHJldHVybiAiKzAwMDAiIGlmIHlvdSBnaXZlIGl0IGEgbnVtYmVyCiAgICAgICAgIyBvZiBzZWNvbmRzIHRoYXQgYXJlIGEgbXVsdGlwbGUgb2YgYSBkYXkuIEhvd2V2ZXIsIGZvciBzcGVlZCByZWFzb25zCiAgICAgICAgIyBJJ20gbm90IGdvaW5nIHRvIHdyaXRlIGluIGEgY29tcGFyaXNvbiB0byByZWZvcm1hdCB0aGF0IGJhY2sgdG8gMC4KICAgICAgICAjIAogICAgICAgIG15ICRob3VycyA9ICRzZWNzIC8gKCA2MCAqIDYwICk7CiAgICAgICAgJGhvdXJzID0gJGhvdXJzICUgMjQ7CiAgICAgICAgbXkgJG1pbnMgPSAoICRzZWNzICUgKCA2MCAqIDYwICkgKSAvIDYwOwogICAgICAgICRoaG1tb2Zmc2V0ID0gc3ByaW50ZiggJyVzJTAyZCUwMmQnLCAkc2lnbiwgJGhvdXJzLCAkbWlucyApOwoKICAgIH0KCiAgICByZXR1cm4gJGhobW1vZmZzZXQ7Cn0KCiN9fX0KCiN7e3sgc3ViIG9mZnNldAoKPWhlYWQyIG9mZnNldCAKCiAgICAkb2Zmc2V0ID0gJGljYWwtPm9mZnNldDsKICAgCiAgICAjIFdlIG5lZWQgdGVzdHMgZm9yIHRoZXNlLiAgCiAgICAkaWNhbC0+b2Zmc2V0KCAnKzExMDAnICk7ICMgYSBudW1iZXIgb2YgaG91cnMgYW5kIG1pbnV0ZXM6IFVUQysxMQogICAgJGljYWwtPm9mZnNldCggMCApOyAgICAgICAjIHJlc2V0IHRvIFVUQwoKU2V0cyBvciByZXRyaWV2ZXMgdGhlIG9mZnNldCBmcm9tIFVUQyBmb3IgdGhpcyB0aW1lLiBUaGlzIGFsbG93cwp0aW1lem9uZSBzdXBwb3J0LCBhc3N1bWluZyB5b3Uga25vdyB3aGF0IHlvdXIgbG9jYWwgKG9yIG5vbi1sb2NhbCkKVVRDIG9mZnNldCBpcy4gRGVmYXVsdHMgdG8gMC4gCgpJbnRlcm5hbHMgbm90ZTogYWxsIHRpbWVzIGFyZSBpbnRlcm5hbGx5IHN0b3JlZCBpbiBVVEMsIGV2ZW4gdGhvdWdoIHRoZXkKbWF5IGhhdmUgc29tZSBvZmZzZXQgaW5mb3JtYXRpb24uIE9mZnNldHMgYXJlIGludGVybmFsbHkgc3RvcmVkIGluCnNpZ25lZCBpbnRlZ2VyIHNlY29uZHMuIAoKQkUgQ0FSRUZVTCBhYm91dCB1c2luZyB0aGlzIGZ1bmN0aW9uIG9uIG9iamVjdHMgdGhhdCB3ZXJlIGluaXRpYWxpemVkCndpdGggYW4gb2Zmc2V0LiBJZiB5b3Ugc3RhcnRlZCBhbiBvYmplY3Qgd2l0aDoKICAgIAogICAgbXkgJGQgPSBuZXcoaWNhbD0+JzE5NzAwMTAxMTIwMDAwJywgb2Zmc2V0PT4nKzAxMDAnKTsgCgphbmQgeW91IHRoZW4gY2FsbDogCgogICAgJGQtPm9mZnNldCgnKzAyMDAnKTsgCiAgICAKeW91J2xsIGJlIHNheWluZyAiWWVhaCwgSSBrbm93IEkgKnNhaWQqIGl0IHdhcyBpbiArMDEwMCwgYnV0IHJlYWxseSBJCndhbnQgaXQgdG8gYmUgaW4gKzAyMDAgbm93IGFuZCBmb3JldmVyLiIgV2hpY2ggbWF5IGJlIHlvdXIgaW50ZW50aW9uLAppZiB5b3UncmUgdHJ5aW5nIHRvIHRyYW5zcG9zZSBhIHdob2xlIHNldCBvZiBkYXRlcyB0byBhbm90aGVyIHRpbWV6b25lLS0tCmJ1dCB5b3UgY2FuIGFsc28gZG8gdGhhdCBhdCB0aGUgcHJlc2VudGF0aW9uIGxldmVsLCB3aXRoCnRoZSBpY2FsKCkgbWV0aG9kLiBFaXRoZXIgd2F5IHdpbGwgd29yay4KCj1jdXQKCnN1YiBvZmZzZXQgewogICAgbXkgKCAkc2VsZiwgJG9mZnNldCApID0gQF87CiAgICBteSAkbmV3b2Zmc2V0ID0gdW5kZWY7CgogICAgaWYgKCBkZWZpbmVkKCRvZmZzZXQpICkgeyAgICAjIFBhc3NlZCBpbiBhIG5ldyB2YWx1ZQogICAgICAgICRuZXdvZmZzZXQgPSBvZmZzZXRfdG9fc2Vjb25kcygkb2Zmc2V0KTsKCiAgICAgICAgdW5sZXNzICggZGVmaW5lZCAkbmV3b2Zmc2V0ICkgeyByZXR1cm4gdW5kZWY7IH0KCiAgICAgICAgIyBzaW5jZSB3ZSdyZSBpbnRlcm5hbGx5IHN0b3JpbmcgaW4gR01ULCB3ZSBuZWVkIHRvCiAgICAgICAgIyBhZGp1c3QgdGhlIHRpbWUgd2Ugd2VyZSBnaXZlbiBieSB0aGUgb2Zmc2V0IHNvIHRoYXQKICAgICAgICAjIHRoZSBpbnRlcm5hbCBkYXRlL3RpbWUgd2lsbCBiZSByaWdodC4KCiAgICAgICAgaWYgKCAkc2VsZi0+e29mZnNldH0gKSB7CgogICAgICAgICAgICAjIGZpZ3VyZSBvdXQgd2hldGhlciB0aGVyZSdzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuCiAgICAgICAgICAgICMgdGhlIGV4aXN0aW5nIG9mZnNldCBhbmQgdGhlIG9mZnNldCB3ZSB3ZXJlIGdpdmVuLgogICAgICAgICAgICAjIElmIHNvLCBhZGp1c3QgYXBwcm9wcmlhdGVseS4KICAgICAgICAgICAgbXkgJG9mZnNldGRpZmYgPSAkc2VsZi0+e29mZnNldH0gLSAkbmV3b2Zmc2V0OwoKICAgICAgICAgICAgaWYgKCRvZmZzZXRkaWZmKSB7CiAgICAgICAgICAgICAgICAkc2VsZi0+e29mZnNldH0gPSAkbmV3b2Zmc2V0OwogICAgICAgICAgICAgICAgJHNlbGYtPmFkZCggc2Vjb25kcyA9PiAkb2Zmc2V0ZGlmZiApOwogICAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgICAgIyBsZWF2ZSB0aGUgb2Zmc2V0IHRoZSB3YXkgaXQgaXMKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNlbGYtPmFkZCggc2Vjb25kcyA9PiAtJG5ld29mZnNldCApOwogICAgICAgICAgICAkc2VsZi0+e29mZnNldH0gPSAkbmV3b2Zmc2V0OwogICAgICAgIH0KCiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCAkc2VsZi0+e29mZnNldH0gKSB7CiAgICAgICAgICAgICRvZmZzZXQgPSBvZmZzZXRfZnJvbV9zZWNvbmRzKCAkc2VsZi0+e29mZnNldH0gKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRvZmZzZXQgPSAwOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJG9mZnNldDsKfQoKI319fQoKIyBzdWIgYWRkIHt7ewoKPWhlYWQyIGFkZAoKICAgICRzZWxmLT5hZGQoIHllYXIgPT4gMywgbW9udGggPT4gMiwgd2VlayA9PiAxLCBkYXkgPT4gMTIsCiAgICAgICAgICAgICAgICBob3VyID0+IDEsIG1pbnV0ZSA9PiAzNCwgc2VjID0+IDU5ICk7CiAgICAkZGF0ZS0+YWRkKCBkdXJhdGlvbiA9PiAnUDFXVDFIMU0xUycgKTsgIyBhZGQgMSB3aywgMSBociwgMSBtaW4sIGFuZCAxIHNlYwoKQWRkcyBhIGR1cmF0aW9uIHRvIGEgRGF0ZTo6SUNhbCBvYmplY3QuCgpTdXBwb3J0ZWQgcGFyYXRlcnMgYXJlOiBkdXJhdGlvbiwgZW9tX21vZGUsIHllYXIsIG1vbnRoLCB3ZWVrLCBkYXksCmhvdXIsIG1pbiwgc2VjIG9yIHNlY29uZHMuCgonZHVyYXRpb24nIGlzIGEgSUNhbGVuZGFyIGR1cmF0aW9uIHN0cmluZyAoc2VlIGR1cmF0aW9uX3ZhbHVlKS4KCklmIGEgdmFsdWUgaXMgdW5kZWZpbmVkIG9yIG9taXR0ZWQsIDEgaXMgYXNzdW1lZDoKCiAgICAkaWNhbC0+YWRkKCAnbWludXRlJyApOyAjIGFkZCBhIG1pbnV0ZQoKVGhlIHJlc3VsdCB3aWxsIGJlIG5vcm1hbGl6ZWQuIFRoYXQgaXMsIHRoZSBvdXRwdXQgdGltZSB3aWxsIGhhdmUKbWVhbmluZ2Z1bCB2YWx1ZXMsIHJhdGhlciB0aGFuIGJlaW5nIDQ4OjczIHBtIG9uIHRoZSAzNHRoIG9mIApoZXhhZGVjZW1iZXIuCgpBZGRpbmcgbW9udGhzIG9yIHllYXJzIGNhbiBiZSBkb25lIHZpYSB0aHJlZSBkaWZmZXJlbnQgbWV0aG9kcywKc3BlY2lmaWVkIGJ5IHRoZSBlb21fbW9kZSBwYXJhbWV0ZXIsIHdoaWNoIHRoZW4gYXBwbGllcyB0byBhbGwKYWRkaXRpb25zIChvciBzdWJ0cmFjdGlvbnMpIG9mIG1vbnRocyBvciB5ZWFycyBmb2xsb3dpbmcgaXQgaW4gdGhlCnBhcmFtZXRlciBsaXN0LgoKVGhlIGRlZmF1bHQsIGVvbV9tb2RlID0+ICd3cmFwJywgbWVhbnMgYWRkaW5nIG1vbnRocyBvciB5ZWFycyB0aGF0CnJlc3VsdCBpbiBkYXlzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBuZXcgbW9udGggd2lsbCByb2xsIG92ZXIgaW50byB0aGUKZm9sbG93aW5nIG1vbnRoLiAgRm9yIGluc3RhbmNlLCBhZGRpbmcgb25lIHllYXIgdG8gRmViIDI5IHdpbGwgcmVzdWx0CmluIE1hciAxLgoKSWYgeW91IHNwZWNpZnkgZW9tX21vZGUgPT4gJ2xpbWl0JywgdGhlIGVuZCBvZiB0aGUgbW9udGggaXMgbmV2ZXIKY3Jvc3NlZC4gIFRodXMsIGFkZGluZyBvbmUgeWVhciB0byBGZWIgMjksIDIwMDAgd2lsbCByZXN1bHQgaW4gRmViIDI4LAoyMDAxLiAgSG93ZXZlciwgYWRkaW5nIHRocmVlIG1vcmUgeWVhcnMgd2lsbCByZXN1bHQgaW4gRmViIDI4LCAyMDA0LApub3QgRmViIDI5LgoKSWYgeW91IHNwZWNpZnkgZW9tX21vZGUgPT4gJ3ByZXNlcnZlJywgdGhlIHNhbWUgY2FsY3VsYXRpb24gaXMgZG9uZSBhcwpmb3IgJ2xpbWl0JyBleGNlcHQgdGhhdCBpZiB0aGUgb3JpZ2luYWwgZGF0ZSBpcyBhdCB0aGUgZW5kIG9mIHRoZQptb250aCB0aGUgbmV3IGRhdGUgd2lsbCBhbHNvIGJlLiAgRm9yIGluc3RhbmNlLCBhZGRpbmcgb25lIG1vbnRoIHRvCkZlYiAyOSwgMjAwMCB3aWxsIHJlc3VsdCBpbiBNYXIgMzEsIDIwMDAuCgpBbGwgYWRkaXRpb25zIGFyZSBwZXJmb3JtZWQgaW4gdGhlIG9yZGVyIHNwZWNpZmllZC4gIEZvciBpbnN0YW5jZSwKd2l0aCB0aGUgZGVmYXVsdCBzZXR0aW5nIG9mIGVvbV9tb2RlID0+ICd3cmFwJywgYWRkaW5nIG9uZSBkYXkgYW5kIG9uZQptb250aCB0byBGZWIgMjkgd2lsbCByZXN1bHQgaW4gQXByIDEsIHdoaWxlIGFkZGluZyBvbmUgbW9udGggYW5kIG9uZQpkYXkgd2lsbCByZXN1bHQgaW4gTWFyIDMwLgoKPWN1dAoKc3ViIGFkZCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgY2FycCAiRGF0ZTo6SUNhbDo6YWRkIHdhcyBjYWxsZWQgd2l0aG91dCBhbiBhdHRyaWJ1dGUgYXJnIiB1bmxlc3MgQF87CiAgICAoICRzZWxmLT57anVsaWFufSwgJHNlbGYtPntqdWxzZWN9KSA9CiAgICAgICAgX2FkZCgkc2VsZi0+e2p1bGlhbn0sICRzZWxmLT57anVsc2VjfSwgQF8pOwogICAgcmV0dXJuICRzZWxmOwp9CgojfX19CgojIHN1YiBfYWRkIHt7ewoKPWJlZ2luIGludGVybmFsCgogICAgQWRkIChvciBzdWJ0cmFjdCkgdG8gYSBkYXRlL3RpbWUuICBGaXJzdCB0d28gcGFyYW1ldGVycyBhcmUKICAgIHRoZSBqZCBhbmQgc2VjcyBvZiB0aGUgZGF5LiAgRm9yIHRoZSByZXN0LCBzZWUgdGhlIGFkZCBtZXRob2QuCiAgICBSZXR1cm5zIHRoZSBhZGp1c3RlZCBqZCBhbmQgc2Vjcy4KCj1lbmQgaW50ZXJuYWwKCj1jdXQKCiMgZm9yIGVhY2ggdW5pdCwgc3BlY2lmeSB3aGF0IGl0IGNoYW5nZXMgYnkgKDA9ZGF5LCAxPXNlY29uZCwgMj1tb250aCkKIyBhbmQgYnkgd2hhdCBmYWN0b3IKCiVhZGRfdW5pdHMgPSAoeWVhcj0+WzIsMTJdLCBtb250aD0+WzIsMV0sIHdlZWs9PlswLDddLCBkYXk9PlswLDFdLAogICAgICAgICAgICAgIGhvdXI9PlsxLDM2MDBdLCBtaW49PlsxLDYwXSwgc2VjPT5bMSwxXSwgc2Vjb25kcz0+WzEsMV0pOwoKc3ViIF9hZGQgewogICAgbXkgKCRqZCwgJHNlY3MpID0gc3BsaWNlKEBfLCAwLCAyKTsKICAgIG15ICRlb21fbW9kZSA9IDA7CiAgICBteSAoJGFkZCwgJHVuaXQsICRjb3VudCk7CgogICAgIyBsb29wIHRocm91Z2ggdW5pdD0+Y291bnQgcGFyYW1ldGVycwogICAgd2hpbGUgKCgkdW5pdCwgJGNvdW50KSA9IHNwbGljZShAXywgMCwgMikpIHsKCiAgICAgICAgaWYgKCR1bml0IGVxICdkdXJhdGlvbicpIHsgIyBhZGQgYSBkdXJhdGlvbiBzdHJpbmcKICAgICAgICAgICAgbXkgJWR1cjsKICAgICAgICAgICAgQGR1cnsnZGF5Jywnc2VjJywnbW9udGgnfSA9IGR1cmF0aW9uX3ZhbHVlKCRjb3VudCk7CgogICAgICAgICAgICAjIHByZXRlbmQgdGhlc2Ugd2VyZSBwYXNzZWQgdG8gdXMgYXMgZS5nLiBtb250aD0+MSwgZGF5PT4xLCBzZWM9PjEuCiAgICAgICAgICAgICMgc2luY2UgbW9udGhzL3llYXJzIGNvbWUgZmlyc3QgaW4gdGhlIGR1cmF0aW9uIHN0cmluZywgd2UKICAgICAgICAgICAgIyBwdXQgdGhlbSBmaXJzdC4KICAgICAgICAgICAgdW5zaGlmdCBAXywgbWFwICRkdXJ7JF99ID8gKCRfLCRkdXJ7JF99KSA6ICgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vbnRoJywgJ2RheScsICdzZWMnOwogICAgICAgICAgICBuZXh0OwogICAgICAgIH0gZWxzaWYgKCR1bml0IGVxICdlb21fbW9kZScpIHsKICAgICAgICAgICAgaWYgKCRjb3VudCBlcSAnd3JhcCcpIHsgJGVvbV9tb2RlID0gMCB9CiAgICAgICAgICAgIGVsc2lmICgkY291bnQgZXEgJ2xpbWl0JykgeyAkZW9tX21vZGUgPSAxIH0KICAgICAgICAgICAgZWxzaWYgKCRjb3VudCBlcSAncHJlc2VydmUnKSB7ICRlb21fbW9kZSA9IDIgfQogICAgICAgICAgICBlbHNlIHsgY2FycCAiVW5yZWNvZ25pemVkIGVvbV9tb2RlLCAkY291bnQsIGlnbm9yZWQiIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1bmxlc3MgKCRhZGQgPSAkYWRkX3VuaXRzeyR1bml0fSkgewogICAgICAgICAgICAgICAgY2FycCAiVW5yZWNvZ25pemVkIHRpbWUgdW5pdCwgJHVuaXQsIHNraXBwZWQiOwogICAgICAgICAgICAgICAgbmV4dDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGNvdW50ID0gMSBpZiAhZGVmaW5lZCAkY291bnQ7ICMgY291bnQgZGVmYXVsdHMgdG8gMQogICAgICAgICAgICAkY291bnQgKj0gJGFkZC0+WzFdOyAjIG11bHRpcGx5IGJ5IHRoZSBmYWN0b3IgZm9yIHRoaXMgdW5pdAoKICAgICAgICAgICAgaWYgKCRhZGQtPlswXSA9PSAwKSB7ICMgYWRkIHRvIGRheXMKICAgICAgICAgICAgICAgICRqZCArPSAkY291bnQ7CiAgICAgICAgICAgIH0gZWxzaWYgKCRhZGQtPlswXSA9PSAxKSB7ICMgYWRkIHRvIHNlY29uZHMKICAgICAgICAgICAgICAgICRzZWNzICs9ICRjb3VudDsKICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAjIGFkZCB0byBtb250aHMKICAgICAgICAgICAgICAgIG15ICgkeSwgJG1vLCAkZCk7CgogICAgICAgICAgICAgICAgX25vcm1hbGl6ZV9zZWNvbmRzKCAkamQsICRzZWNzICk7CiAgICAgICAgICAgICAgICBpZiAoJGVvbV9tb2RlID09IDIpIHsgIyBzdGlja3kgZW9tIG1vZGUKICAgICAgICAgICAgICAgICAgICAjIGlmIGl0IGlzIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIG1ha2UgaXQgdGhlIDB0aAogICAgICAgICAgICAgICAgICAgICMgZGF5IG9mIHRoZSBmb2xsb3dpbmcgbW9udGggKHdoaWNoIHRoZW4gd2lsbCBub3JtYWxpemUKICAgICAgICAgICAgICAgICAgICAjIGJhY2sgdG8gdGhlIGxhc3QgZGF5IG9mIHRoZSBuZXcgbW9udGgpLgogICAgICAgICAgICAgICAgICAgICgkeSwgJG1vLCAkZCkgPSBqZDJncmVnKCAkamQrMSApOwogICAgICAgICAgICAgICAgICAgIC0tJGQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICgkeSwgJG1vLCAkZCkgPSBqZDJncmVnKCAkamQgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJGVvbV9tb2RlICYmICRkID4gMjgpIHsgIyBsaW1pdCBkYXkgdG8gbGFzdCBvZiBuZXcgbW9udGgKICAgICAgICAgICAgICAgICAgICAjIGZpbmQgdGhlIGpkIG9mIHRoZSBsYXN0IGRheSBvZiBvdXIgdGFyZ2V0IG1vbnRoCiAgICAgICAgICAgICAgICAgICAgJGpkID0gZ3JlZzJqZCggJHksICRtbyskY291bnQrMSwgMCApOwoKICAgICAgICAgICAgICAgICAgICAjIHdoYXQgZGF5IG9mIHRoZSBtb250aCBpcyBpdD8gKGRpc2NhcmQgeWVhciBhbmQgbW9udGgpCiAgICAgICAgICAgICAgICAgICAgbXkgJGxhc3RkYXkgPSBzY2FsYXIgamQyZ3JlZyggJGpkICk7CgogICAgICAgICAgICAgICAgICAgICMgaWYgb3VyIG9yaWdpbmFsIGRheSB3YXMgbGVzcyB0aGFuIHRoZSBsYXN0IGRheSwKICAgICAgICAgICAgICAgICAgICAjIHVzZSB0aGF0IGluc3RlYWQKICAgICAgICAgICAgICAgICAgICAkamQgLT0gJGxhc3RkYXkgLSAkZCBpZiAkbGFzdGRheSA+ICRkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkamQgPSBncmVnMmpkKCAkeSwgJG1vKyRjb3VudCwgJGQgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBfbm9ybWFsaXplX3NlY29uZHMoICRqZCwgJHNlY3MgKTsKfQoKI319fQoKIyBzdWIgYWRkX292ZXJsb2FkIHt7ewoKPWhlYWQyIGFkZF9vdmVybG9hZAoKICAgICRkYXRlID0gJGRhdGUxICsgJGR1cmF0aW9uOwoKV2hlcmUgJGR1cmF0aW9uIGlzIGVpdGhlciBhIGR1cmF0aW9uIHN0cmluZywgb3IgYSBEYXRlOjpJQ2FsOjpEdXJhdGlvbgpvYmplY3QuCgogICAgJGRhdGUgKz0gJ1AyRFQ0SDdNJzsKCkFkZHMgYSBkdXJhdGlvbiB0byBhIGRhdGUgb2JqZWN0LiBSZXR1cm5zIGEgbmV3IG9iamVjdCwgb3IsIGluIHRoZSBjYXNlCm9mICs9LCBtb2RpZmllcyB0aGUgZXhpc3Rpbmcgb2JqZWN0LgoKPWN1dAoKc3ViIGFkZF9vdmVybG9hZCB7CiAgICBteSAkb25lID0gc2hpZnQ7CiAgICBteSAkdHdvID0gc2hpZnQ7CgogICAgbXkgJHJldCA9ICRvbmUtPmNsb25lOwoKICAgIGlmICggcmVmICR0d28gKSB7CiAgICAgICAgJHJldC0+YWRkKCBkdXJhdGlvbiA9PiAkdHdvLT5hc19pY2FsICk7CiAgICB9IGVsc2UgewogICAgICAgICRyZXQtPmFkZCggZHVyYXRpb24gPT4gJHR3byApOwogICAgfQoKICAgIHJldHVybiAkcmV0Owp9ICMgfX19CgojIHN1YiBfbm9ybWFsaXplX3NlY29uZHMge3t7Cgo9YmVnaW4gaW50ZXJuYWwKCiAgICAoJGpkLCAkc2VjcykgPSBfbm9ybWFsaXplX3NlY29uZHMoICRqZCwgJHNlY3MgKTsKCiAgICBDb3JyZWN0cyBzZWNvbmRzIHRoYXQgaGF2ZSBnb25lIGludG8gZm9sbG93aW5nIG9yIHByZXZpb3VzIGRheShzKS4KICAgIEFkanVzdHMgdGhlIHBhc3NlZCBkYXlzIGFuZCBzZWNvbmRzIGFzIHdlbGwgYXMgcmV0dXJuaW5nIHRoZW0uCgo9ZW5kIGludGVybmFsCgo9Y3V0CgpzdWIgX25vcm1hbGl6ZV9zZWNvbmRzIHsKICAgIG15ICRhZGo7CgogICAgaWYgKCRfWzFdIDwgMCkgewogICAgICAgICRhZGogPSBpbnQoICgkX1sxXS04NjM5OSkvODY0MDAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgJGFkaiA9IGludCggJF9bMV0vODY0MDAgKTsKICAgIH0KICAgICgkX1swXSArPSAkYWRqKSwgKCRfWzFdIC09ICRhZGoqODY0MDApOwp9CgojfX19CgojIHN1YiBkdXJhdGlvbl92YWx1ZSB7e3sKCj1oZWFkMiBkdXJhdGlvbl92YWx1ZQoKR2l2ZW4gYSBkdXJhdGlvbiBzdHJpbmcsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheXMsCnNlY29uZHMsIGFuZCBtb250aHMgcmVwcmVzZW50ZWQgYnkgdGhhdCBkdXJhdGlvbi4gSW4gdGhhdCBvcmRlci4gU2VlbXMKb2RkIHRvIG1lLiBUaGlzIHNob3VsZCBiZSBjb25zaWRlcmVkIGFuIGludGVybmFsIGZ1bmN0aW9uLCBhbmQgeW91CnNob3VsZCBleHBlY3QgdGhlIEFQSSB0byBjaGFuZ2UgaW4gdGhlIHZlcnkgbmVhciBmdXR1cmUuCgo9Y3V0CgpzdWIgZHVyYXRpb25fdmFsdWUgewogICAgbXkgJHN0ciA9IHNoaWZ0OwoKICAgIG15IEB0ZW1wID0gJHN0ciA9fiBtewogICAgICAgICAgICAoW1wrXC1dKT8gICAoPyMgU2lnbikKICAgICAgICAgICAgKFApICAgICAoPyMgJ1AnIGZvciBwZXJpb2Q/IFRoaXMgaXMgb3VyIG1hZ2ljIGNoYXJhY3RlcikKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAoPzooXGQrKVkpPyAoPyMgWWVhcnMpCiAgICAgICAgICAgICAgICAoPzooXGQrKU0pPyAoPyMgTW9udGhzKQogICAgICAgICAgICAgICAgKD86KFxkKylXKT8gKD8jIFdlZWtzKQogICAgICAgICAgICAgICAgKD86KFxkKylEKT8gKD8jIERheXMpCiAgICAgICAgICAgICk/CiAgICAgICAgICAgICg/OlQgICAgICAgICg/IyBUaW1lIHByZWZpeCkKICAgICAgICAgICAgICAgICg/OihcZCspSCk/ICg/IyBIb3VycykKICAgICAgICAgICAgICAgICg/OihcZCspTSk/ICg/IyBNaW51dGVzKQogICAgICAgICAgICAgICAgKD86KFxkKylTKT8gKD8jIFNlY29uZHMpCiAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICB9eDsKICAgIG15ICggJHNpZ24sICRtYWdpYyApID0gQHRlbXBbIDAgLi4gMSBdOwogICAgbXkgKCAkeWVhcnMsICRtb250aHMsICR3ZWVrcywgJGRheXMsICRob3VycywgJG1pbnMsICRzZWNzICkgPQogICAgICBtYXAgeyBkZWZpbmVkKCRfKSA/ICRfIDogMCB9IEB0ZW1wWyAyIC4uICQjdGVtcCBdOwoKICAgIHVubGVzcyAoIGRlZmluZWQoJG1hZ2ljKSApIHsKICAgICAgICBjYXJwICJJbnZhbGlkIGR1cmF0aW9uOiAkc3RyIjsKICAgICAgICByZXR1cm4gdW5kZWY7CiAgICB9CiAgICAkc2lnbiA9ICggKCBkZWZpbmVkKCRzaWduKSAmJiAkc2lnbiBlcSAnLScgKSA/IC0xIDogMSApOwoKICAgIG15ICRzID0gJHNpZ24gKiAoICRzZWNzICsgKCAkbWlucyAqIDYwICkgKyAoICRob3VycyAqIDM2MDAgKSApOwogICAgbXkgJGQgPSAkc2lnbiAqICggJGRheXMgKyAoICR3ZWVrcyAqIDcgKSApOwogICAgbXkgJG0gPSAkc2lnbiAqICggJG1vbnRocyArICggJHllYXJzICogMTIgKSApOwogICAgcmV0dXJuICggJGQsICRzLCAkbSApOwp9CgojfX19CgojIHN1YiBzdWJ0cmFjdCB7e3sKCj1oZWFkMiBzdWJ0cmFjdAoKICAkZHVyYXRpb24gPSAkZGF0ZTEgLSAkZGF0ZTI7CgpTdWJ0cmFjdCBvbmUgRGF0ZTo6SUNhbCBvYmplY3QgZnJvbSBhbm90aGVyIHRvIGdpdmUgYSBkdXJhdGlvbiAtIHRoZQpsZW5ndGggb2YgdGhlIGludGVydmFsIGJldHdlZW4gdGhlIHR3byBkYXRlcy4gVGhlIHJldHVybiB2YWx1ZSBpcyBhCkRhdGU6OklDYWw6OkR1cmF0aW9uIG9iamVjdCAocXYpIGFuZCBhbGxvd3MgeW91IHRvIGdldCBhdCBlYWNoIG9mIHRoZQppbmRpdmlkdWFsIGNvbXBvbmVudHMsIG9yIHRoZSBlbnRpcmUgZHVyYXRpb24gc3RyaW5nOgoKICAgICRkID0gJGRhdGUxIC0gJFg7CgpOb3RlIHRoYXQgJFggY2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgoKSWYgJFggaXMgYW5vdGhlciBEYXRlOjpJQ2FsIG9iamVjdCAob3Igc3ViY2xhc3MgdGhlcmVvZikgdGhlbiAkZCB3aWxsIGJlCmEgRGF0ZTo6SUNhbDo6RHVyYXRpb24gb2JqZWN0LgoKICAgICR3ZWVrID0gJGQtPndlZWtzOyAjIGhvdyBtYW55IHdlZWtzIGFwYXJ0PwogICAgJGRheXMgPSAkZC0+YXNfZGF5czsgIyBIb3cgbWFueSBkYXlzIGFwYXJ0PwoKSWYgJFggaXMgYSBkdXJhdGlvbiBzdHJpbmcsIG9yIGEgRGF0ZTo6SUNhbDo6RGlyYXRpb24gb2JqZWN0LCB0aGVuICRkCndpbGwgYmUgYW4gb2JqZWN0IGluIHRoZSBzYW1lIGNsYXNzIGFzICRkYXRlMTsKCiAgICAkbmV3ZGF0ZSA9ICRkYXRlIC0gJGR1cmF0aW9uOyAKCj1jdXQKCnN1YiBzdWJ0cmFjdCB7CiAgICBteSAoICRkYXRlMSwgJGRhdGUyLCAkcmV2ZXJzZWQgKSA9IEBfOwogICAgbXkgJGR1cjsKCiAgICAjIElmIHRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnRzIHdhcyByZXZlcnNlZCwgb3ZlcmxvYWQgdGVsbHMgdXMKICAgICMgYWJvdXQgaXQgaW4gdGhlIHRoaXJkIGFyZ3VtZW50LgogICAgaWYgKCRyZXZlcnNlZCkgewogICAgICAgICggJGRhdGUyLCAkZGF0ZTEgKSA9ICggJGRhdGUxLCAkZGF0ZTIgKTsKICAgIH0KCiAgICBpZiAocmVmICRkYXRlMSAmJiByZWYgJGRhdGUyKSB7CiAgICAjIElmICRkYXRlMSBpcyBhIERhdGU6OklDYWwgb2JqZWN0LCBhbmQgJGRhdGUyIGlzIGEgRHVyYXRpb24gb2JqZWN0LAogICAgIyB0aGVuIHdlIHNob3VsZCBzdWJ0cmFjdCBhbmQgZ2V0IGEgZGF0ZS4KICAgICAgICBpZiAoKHJlZiAkZGF0ZTIpIGVxICdEYXRlOjpJQ2FsOjpEdXJhdGlvbicpIHsKICAgICAgICAgICAgbXkgJHNlY29uZHMgPSAkZGF0ZTItPmFzX3NlY29uZHM7CiAgICAgICAgICAgIG15ICRyZXQgPSAkZGF0ZTEtPmNsb25lOwogICAgICAgICAgICAkcmV0LT5hZGQoIHNlY29uZHMgPT4gLTEgKiAkc2Vjb25kcyApOwogICAgICAgICAgICByZXR1cm4gJHJldDsKCiAgICAgICAgfSBlbHNlIHsKICAgICMgSWYgJGRhdGUyIGlzIGEgRGF0ZTo6SUNhbCBvYmplY3QsIG9yIHNvbWUgY2xhc3MgdGhlcmVvZiwgd2Ugc2hvdWxkCiAgICAjIHN1YnRyYWN0IGFuZCBnZXQgYSBkdXJhdGlvbgoKICAgICAgICAgICAgbXkgJGRheXMgPSAkZGF0ZTEtPntqdWxpYW59IC0gJGRhdGUyLT57anVsaWFufTsKICAgICAgICAgICAgbXkgJHNlY3MgPSAkZGF0ZTEtPntqdWxzZWN9IC0gJGRhdGUyLT57anVsc2VjfTsKCiAgICAgICAgICAgIHJldHVybiBEYXRlOjpJQ2FsOjpEdXJhdGlvbi0+bmV3KAogICAgICAgICAgICAgIGRheXMgICAgPT4gJGRheXMsCiAgICAgICAgICAgICAgc2Vjb25kcyA9PiAkc2VjcwogICAgICAgICAgICApOwogICAgICAgIH0gCiAgICB9IGVsc2lmICggcmVmICRkYXRlMSAmJiAKICAgICAgICAgICAgICAoICRkdXIgPSBEYXRlOjpJQ2FsOjpEdXJhdGlvbi0+bmV3KCBpY2FsID0+ICRkYXRlMiApICkKICAgICAgICAgICAgKSB7CiAgICAjIElmICRkYXRlMSBpcyBhIERhdGU6OklDYWwgb2JqZWN0LCBhbmQgJGRhdGUyIGlzIGEgZHVyYXRpb24gc3RyaW5nLAogICAgIyB3ZSBzaG91bGQgc3VidHJhY3QgYW5kIGdldCBhIGRhdGUKICAgICAgICByZXR1cm4gJGRhdGUxIC0gJGR1cjsgIyBJcyB0aGF0IGNoZWF0aW5nPwoKICAgICMgT3RoZXJ3aXNlLCByZXR1cm4gdW5kZWYKICAgIH0gZWxzZSB7CiAgICAgICAgd2FybiAiSW52YWxpZCBhcmd1bWVudHMuIFlvdSBjYW4gc3VidHJhY3QgYSBkYXRlIGZyb20gYSBkYXRlLCBvciBhIGR1cmF0aW9uIGZyb20gYSBkYXRlIjsKICAgICAgICByZXR1cm47CiAgICB9Cgp9ICMgfX19CgojIHN1YiBjbG9uZSB7e3sKCj1oZWFkMiBjbG9uZQoKICAgICRjb3B5ID0gJGRhdGUtPmNsb25lOwoKUmV0dXJucyBhIHJlcGxpY2Egb2YgdGhlIGRhdGUgb2JqZWN0LCBpbmNsdWRpbmcgYWxsIGF0dHJpYnV0ZXMuCgo9Y3V0CgpzdWIgY2xvbmUgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRjbGFzcyA9IHJlZiAkc2VsZjsKICAgIG15ICVoYXNoID0gJSRzZWxmOwogICAgbXkgJG5ldyA9IFwlaGFzaDsKICAgIGJsZXNzICRuZXcsICRjbGFzczsKICAgIHJldHVybiAkbmV3Owp9ICMgfX19CgojIHN1YiBjb21wYXJlIHt7ewoKPWhlYWQyIGNvbXBhcmUKCiAgICAkY21wID0gJGRhdGUxLT5jb21wYXJlKCRkYXRlMik7CgogICAgQGRhdGVzID0gc29ydCB7JGEtPmNvbXBhcmUoJGIpfSBAZGF0ZXM7CgpDb21wYXJlIHR3byBEYXRlOjpJQ2FsIG9iamVjdHMuIFNlbWFudGljcyBhcmUgY29tcGF0aWJsZSB3aXRoCnNvcnQ7IHJldHVybnMgLTEgaWYgJGEgPCAkYiwgMCBpZiAkYSA9PSAkYiwgMSBpZiAkYSA+ICRiLiAKCj1jdXQKCnN1YiBjb21wYXJlIHsKICAgIG15ICggJHNlbGYsICRvdGhlcmRhdGUgKSA9IChAXyk7CgogICAgdW5sZXNzICggZGVmaW5lZCgkb3RoZXJkYXRlKSApIHsgcmV0dXJuIHVuZGVmIH0KCiAgICAjIE9uZSBvciBtb3JlIGRheXMgZGlmZmVyZW50CgogICAgaWYgKCAkc2VsZi0+e2p1bGlhbn0gPCAkb3RoZXJkYXRlLT57anVsaWFufSApIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0gZWxzaWYgKCAkc2VsZi0+e2p1bGlhbn0gPiAkb3RoZXJkYXRlLT57anVsaWFufSApCiAgICB7CiAgICAgICAgcmV0dXJuIDE7CgogICAgICAgICMgVGhleSBhcmUgdGhlIHNhbWUgZGF5CiAgICAgIH0gZWxzaWYgKCAkc2VsZi0+e2p1bHNlY30gPCAkb3RoZXJkYXRlLT57anVsc2VjfSApCiAgICB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9IGVsc2lmICggJHNlbGYtPntqdWxzZWN9ID4gJG90aGVyZGF0ZS0+e2p1bHNlY30gKQogICAgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgICAgIyBpZiB3ZSBnb3QgYWxsIHRoaXMgd2F5IGFuZCBoYXZlbid0IHlldCByZXR1cm5lZCwgdGhlIHVuaXRzIGFyZSBlcXVhbC4KICAgIHJldHVybiAwOwp9CgojfX19CgojIGludGVybmFsIHN0dWZmIHt7ewoKPWJlZ2luIGludGVybmFsCgogQG1vbnRocyA9IG1vbnRocygkeWVhcik7CgpSZXR1cm5zIHRoZSBKdWxpYW4gZGF5IGF0IHRoZSBlbmQgb2YgYSBtb250aCwgY29ycmVjdCBmb3IgdGhhdCB5ZWFyLgoKPWVuZCBpbnRlcm5hbCAKCj1jdXQKCiMgcHJlY2FsY3VsYXRlIHRoZXNlIHZhbHVlcyBhdCBtb2R1bGUgbG9hZCB0aW1lIHNvIHRoYXQgd2UgZG9uJ3QKIyBoYXZlIHRvIGRvIGl0IHJlcGVhdGVkbHkgZHVyaW5nIHJ1bnRpbWUuIAojIApCRUdJTiB7CgogICAgIyAgICAgICAgICAgKyAgMzEsIDI4LCAzMSwgMzAsICAzMSwgIDMwLCAgMzEsICAzMSwgIDMwLCAgMzEsICAzMCwgIDMxCiAgICBAbW9udGhzID0gKCAwLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNCwgMzY1ICk7CiAgICBAbGVhcG1vbnRocyA9IEBtb250aHM7CgogICAgZm9yICggMiAuLiAxMiApIHsKICAgICAgICAkbGVhcG1vbnRoc1skX10gPSAkbW9udGhzWyRfXSArIDE7CiAgICB9Cn0KCnN1YiBtb250aHMgewogICAgcmV0dXJuIERhdGU6OkxlYXB5ZWFyOjppc2xlYXAoc2hpZnQpID8gQGxlYXBtb250aHMgOiBAbW9udGhzOwp9Cgo9YmVnaW4gaW50ZXJuYWwKCiAgICB0aW1lX2FzX3NlY29uZHMoICRhcmdze2hvdXJ9LCAkYXJnc3ttaW59LCAkYXJnc3tzZWN9ICk7CgpSZXR1cm5zIHRoZSB0aW1lIG9mIGRheSBhcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgaW4gdGhlIGRheS4KCj1lbmQgaW50ZXJuYWwKCj1jdXQKCiMgfX19CgojIHN1YiB0aW1lX2FzX3NlY29uZHMge3t7CgpzdWIgdGltZV9hc19zZWNvbmRzIHsKICAgIG15ICggJGhvdXIsICRtaW4sICRzZWMgKSA9IEBfOwoKICAgICRob3VyIHx8PSAwOwogICAgJG1pbiB8fD0gMDsKICAgICRzZWMgfHw9IDA7CgogICAgbXkgJHNlY3MgPSAkaG91ciAqIDM2MDAgKyAkbWluICogNjAgKyAkc2VjOwogICAgcmV0dXJuICRzZWNzOwp9ICN9fX0KCiMgc3ViIGRheSB7e3sKCj1oZWFkMiBkYXkKCiAgICBteSAkZGF5ID0gJGRhdGUtPmRheTsKClJldHVybnMgdGhlIGRheSBvZiB0aGUgbW9udGguCgpEYXkgaXMgaW4gdGhlIHJhbmdlIDEuLjMxCgo9Y3V0CgpzdWIgZGF5IHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gKCBqZDJncmVnKCAkc2VsZi0+e2p1bGlhbn0gKSApWzJdOwp9ICMgfX19CgojIHN1YiBtb250aCB7e3sKCj1oZWFkMiBtb250aAoKICAgIG15ICRtb250aCA9ICRkYXRlLT5tb250aDsKClJldHVybnMgdGhlIG1vbnRoIG9mIHRoZSB5ZWFyLgoKTW9udGggaXMgcmV0dXJuZWQgYXMgYSBudW1iZXIgaW4gdGhlIHJhbmdlIDEuLjEyCgo9Y3V0CgpzdWIgbW9udGggewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIHJldHVybiAoIGpkMmdyZWcoICRzZWxmLT57anVsaWFufSApIClbMV07Cn0gIyB9fX0KCiMgc3ViIG1vbiB7e3sKCnN1YiBtb24geyByZXR1cm4gbW9udGgoQF8pOyB9CgojfX19CgojIHN1YiB5ZWFyIHt7ewoKPWhlYWQyIHllYXIKCiAgICBteSAkeWVhciA9ICRkYXRlLT55ZWFyOwoKUmV0dXJucyB0aGUgeWVhci4gIAoKPWN1dAoKc3ViIHllYXIgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIHJldHVybiAoIGpkMmdyZWcoICRzZWxmLT57anVsaWFufSApIClbMF07Cn0gIyB9fX0KCiMgc3ViIGpkMmdyZWcge3t7Cgo9aGVhZDIgamQyZ3JlZwoKICAgICgkeWVhciwgJG1vbnRoLCAkZGF5KSA9IGpkMmdyZWcoICRqZCApOwoKICAgIENvbnZlcnQgbnVtYmVyIG9mIGRheXMgb24gb3IgYWZ0ZXIgSmFuIDEsIDEgQ0UgKEdyZWdvcmlhbikgdG8KICAgIGdyZWdvcmlhbiB5ZWFyLG1vbnRoLGRheS4KCj1jdXQKCnN1YiBqZDJncmVnIHsKICAgIHVzZSBpbnRlZ2VyOwogICAgbXkgJGQgPSBzaGlmdDsKICAgIG15ICR5YWRqID0gMDsKICAgIG15ICggJGMsICR5LCAkbSApOwoKICAgICMgYWRkIDMwNiBkYXlzIHRvIG1ha2UgcmVsYXRpdmUgdG8gTWFyIDEsIDA7IGFsc28gYWRqdXN0ICRkIHRvIGJlIHdpdGhpbgogICAgIyBhIHJhbmdlICgxLi4yKioyOC0xKSB3aGVyZSBvdXIgY2FsY3VsYXRpb25zIHdpbGwgd29yayB3aXRoIDMyYml0IGludHMKICAgIGlmICggJGQgPiAyKioyOCAtIDMwNyApIHsKCiAgICAgICAgIyBhdm9pZCBvdmVyZmxvdyBpZiAkZCBjbG9zZSB0byBtYXhpbnQKICAgICAgICAkeWFkaiA9ICggJGQgLSAxNDYwOTcgKyAzMDYgKSAvIDE0NjA5NyArIDE7CiAgICAgICAgJGQgLT0gJHlhZGogKiAxNDYwOTcgLSAzMDY7CiAgICAgIH0gZWxzaWYgKCAoICRkICs9IDMwNiApIDw9IDAgKQogICAgewogICAgICAgICR5YWRqID0KICAgICAgICAgIC0oIC0kZCAvIDE0NjA5NyArIDEgKTsgICAgIyBhdm9pZCBhbWJpZ3VpdHkgaW4gQyBkaXZpc2lvbiBvZiBuZWdhdGl2ZXMKICAgICAgICAkZCAtPSAkeWFkaiAqIDE0NjA5NzsKICAgIH0KCiAgICAkYyA9CiAgICAgICggJGQgKiA0IC0gMSApIC8gMTQ2MDk3OyAgICAjIGNhbGMgIyBvZiBjZW50dXJpZXMgJGQgaXMgYWZ0ZXIgMjkgRmViIG9mIHlyIDAKICAgICRkIC09ICRjICogMTQ2MDk3IC8gNDsgICAgIyAgICAgKDQgY2VudHVyaWVzID0gMTQ2MDk3IGRheXMpCiAgICAkeSA9ICggJGQgKiA0IC0gMSApIC8gMTQ2MTsgICAgIyBjYWxjIG51bWJlciBvZiB5ZWFycyBpbnRvIHRoZSBjZW50dXJ5LAogICAgJGQgLT0gJHkgKiAxNDYxIC8gNDsgICAgIyAgICAgYWdhaW4gTWFyY2gtYmFzZWQgKDQgeXJzID1+IDE0NlswMV0gZGF5cykKICAgICRtID0KICAgICAgKCAkZCAqIDEyICsgMTA5MyApIC8gMzY3OyAgICAjIGdldCB0aGUgbW9udGggKDMuLjE0IHJlcHJlc2VudCBNYXJjaCB0aHJvdWdoCiAgICAkZCAtPSAoICRtICogMzY3IC0gMTA5NCApIC8gMTI7ICAgICMgICAgIEZlYnJ1YXJ5IG9mIGZvbGxvd2luZyB5ZWFyKQogICAgJHkgKz0gJGMgKiAxMDAgKyAkeWFkaiAqIDQwMDsgICAgIyBnZXQgdGhlIHJlYWwgeWVhciwgd2hpY2ggaXMgb2ZmIGJ5CiAgICArKyR5LCAkbSAtPSAxMiBpZiAkbSA+IDEyOyAgICAgICAgICMgICAgIG9uZSBpZiBtb250aCBpcyBKYW51YXJ5IG9yIEZlYnJ1YXJ5CiAgICByZXR1cm4gKCAkeSwgJG0sICRkICk7Cn0gICAgI319fQoKIyBzdWIgZ3JlZzJqZCB7e3sKCj1oZWFkMiBncmVnMmpkCgogICAgJGpkID0gZ3JlZzJqZCggJHllYXIsICRtb250aCwgJGRheSApOwoKICAgIENvbnZlcnQgZ3JlZ29yaWFuIHllYXIsbW9udGgsZGF5IHRvIGRheXMgb24gb3IgYWZ0ZXIgSmFuIDEsIDEgQ0UKICAgIChHcmVnb3JpYW4pLiAgTm9ybWFsaXphdGlvbiBpcyBwZXJmb3JtZWQgKGUuZy4gbW9udGggb2YgMjggbWVhbnMKICAgIEFwcmlsIHR3byB5ZWFycyBhZnRlciBnaXZlbiB5ZWFyKSBmb3IgbW9udGggPCAxIG9yID4gMTIgb3IgZGF5IDwgMQogICAgb3IgPiBsYXN0IGRheSBvZiBtb250aC4KCj1jdXQKCnN1YiBncmVnMmpkIHsKICAgIHVzZSBpbnRlZ2VyOwogICAgbXkgKCAkeSwgJG0sICRkICkgPSBAXzsKICAgIG15ICRhZGo7CgogICAgIyBtYWtlIG1vbnRoIGluIHJhbmdlIDMuLjE0ICh0cmVhdCBKYW4gJiBGZWIgYXMgbW9udGhzIDEzLi4xNCBvZiBwcmV2IHllYXIpCiAgICBpZiAoICRtIDw9IDIgKSB7CiAgICAgICAgJHkgLT0gKCAkYWRqID0gKCAxNCAtICRtICkgLyAxMiApOwogICAgICAgICRtICs9IDEyICogJGFkajsKICAgICAgfSBlbHNpZiAoICRtID4gMTQgKQogICAgewogICAgICAgICR5ICs9ICggJGFkaiA9ICggJG0gLSAzICkgLyAxMiApOwogICAgICAgICRtIC09IDEyICogJGFkajsKICAgIH0KCiAgICAjIG1ha2UgeWVhciBwb3NpdGl2ZSAob2gsIGZvciBhIHVzZSBpbnRlZ2VyICdzYW5lX2RpdichKQogICAgaWYgKCAkeSA8IDAgKSB7CiAgICAgICAgJGQgLT0gMTQ2MDk3ICogKCAkYWRqID0gKCAzOTkgLSAkeSApIC8gNDAwICk7CiAgICAgICAgJHkgKz0gNDAwICogJGFkajsKICAgIH0KCiAgICAjIGFkZDogZGF5IG9mIG1vbnRoLCBkYXlzIG9mIHByZXZpb3VzIDAtMTEgbW9udGggcGVyaW9kIHRoYXQgYmVnYW4gdy9NYXJjaCwKICAgICMgZGF5cyBvZiBwcmV2aW91cyAwLTM5OSB5ZWFyIHBlcmlvZCB0aGF0IGJlZ2FuIHcvTWFyY2ggb2YgYSA0MDAtbXVsdGlwbGUKICAgICMgeWVhciksIGRheXMgb2YgYW55IDQwMC15ZWFyIHBlcmlvZHMgYmVmb3JlIHRoYXQsIGFuZCAzMDYgZGF5cyB0byBhZGp1c3QKICAgICMgZnJvbSBNYXIgMSwgeWVhciAwLXJlbGF0aXZlIHRvIEphbiAxLCB5ZWFyIDEtcmVsYXRpdmUgKHdoZXcpCgogICAgJGQgKz0gKCAkbSAqIDM2NyAtIDEwOTQgKSAvIDEyICsgJHkgJSAxMDAgKiAxNDYxIC8gNCArCiAgICAgICggJHkgLyAxMDAgKiAzNjUyNCArICR5IC8gNDAwICkgLSAzMDY7Cn0gICAgIyB9fX0KCiMgc3ViIGRheXNfdGhpc195ZWFyIHt7ewoKPWhlYWQyIGRheXNfdGhpc195ZWFyCgogICR5ZGF5ID0gRGF0ZTo6SUNhbDo6ZGF5c190aGlzX3llYXIoJGRheSwgJG1vbnRoLCAkeWVhcik7CgpSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF5cyBzbyBmYXIgdGhpcyB5ZWFyLiBBbmFsb2dvdXMgdG8gdGhlIHlkYXkKYXR0cmlidXRlIG9mIGdtdGltZSAob3IgbG9jYWx0aW1lKSBleGNlcHQgdGhhdCBpdCB3b3JrcyBvdXRzaWRlIG9mIHRoZQplcG9jaC4KCj1jdXQKCnN1YiBkYXlzX3RoaXNfeWVhciB7CiAgICBteSAoICRkLCAkbSwgJHkgKSA9IEBfOwogICAgbXkgQG1saXN0ID0gJm1vbnRocygkeSk7CiAgICByZXR1cm4gJG1saXN0WyRtIC0gMV0gKyAkZCAtIDE7Cn0gICAgI319fQoKIyBzdWIgZGF5X29mX3dlZWsge3t7Cgo9aGVhZDIgZGF5X29mX3dlZWsKCiAgICBteSAkZGF5X29mX3dlZWsgPSAkZGF0ZS0+ZGF5X29mX3dlZWsKClJldHVybnMgdGhlIGRheSBvZiB3ZWVrIGFzIDAuLjYgKDAgaXMgU3VuZGF5LCA2IGlzIFNhdHVyZGF5KS4KCj1jdXQKCnN1YiBkYXlfb2Zfd2VlayB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgcmV0dXJuICRzZWxmLT57anVsaWFufSAlIDc7Cn0gICAgI319fQoKIyBzdWIgaG91ciB7e3sKCj1oZWFkMiBob3VyCgogICAgbXkgJGhvdXIgPSAkZGF0ZS0+aG91cgoKUmV0dXJucyB0aGUgaG91ciBvZiB0aGUgZGF5LgoKSG91ciBpcyBpbiB0aGUgcmFuZ2UgMC4uMjMKCj1jdXQKCnN1YiBob3VyIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gKCAkc2VsZi0+cGFyc2V0aW1lIClbMl07Cn0gIyB9fX0KCiMgc3ViIG1pbiB7e3sKCj1oZWFkMiBtaW4KCiAgICBteSAkbWluID0gJGRhdGUtPm1pbjsKClJldHVybnMgdGhlIG1pbnV0ZS4KCk1pbnV0ZSBpcyBpbiB0aGUgcmFuZ2UgMC4uNTkKCj1jdXQKCnN1YiBtaW4gewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIHJldHVybiAoICRzZWxmLT5wYXJzZXRpbWUgKVsxXTsKfQoKc3ViIG1pbnV0ZSB7IHJldHVybiBtaW4oQF8pOyB9CgojIH19fQoKIyBzdWIgc2VjIHt7ewoKPWhlYWQyIHNlYwoKICAgIG15ICRzZWMgPSAkZGF0ZS0+c2VjOwoKUmV0dXJucyB0aGUgc2Vjb25kLgoKU2Vjb25kIGlzIGluIHRoZSByYW5nZSAwLi42MC4gVGhlIHZhbHVlIG9mIDYwIGlzIChtYXliZSkgbmVlZGVkIGZvcgpsZWFwIHNlY29uZHMuIEJ1dCBJJ20gbm90IHN1cmUgaWYgd2UncmUgZ29pbmcgdG8gZ28gdGhlcmUuCgo9Y3V0CgpzdWIgc2VjIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gKCAkc2VsZi0+cGFyc2V0aW1lIClbMF07Cn0KCnN1YiBzZWNvbmQgeyByZXR1cm4gc2VjKEBfKTsgfQoKIyB9fX0KCiMgc3ViIHBhcnNldGltZSB7e3sKCj1iZWdpbiBpbnRlcm5hbAoKICggJHNlYywgJG1pbiwgJGhvdXIgKSA9IHBhcnNldGltZSggJHNlY29uZHMgKTsKCkdpdmVuIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzbyBmYXIgdG9kYXksIHJldHVybnMgdGhlIHNlY29uZHMsCm1pbnV0ZXMsIGFuZCBob3VycyBvZiB0aGUgY3VycmVudCB0aW1lLgoKPWVuZCBpbnRlcm5hbAoKPWN1dAoKc3ViIHBhcnNldGltZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJHRpbWUgPSAkc2VsZi0+e2p1bHNlY307CgogICAgbXkgJGhvdXIgPSBpbnQoICR0aW1lIC8gMzYwMCApOwogICAgJHRpbWUgLT0gJGhvdXIgKiAzNjAwOwoKICAgIG15ICRtaW4gPSBpbnQoICR0aW1lIC8gNjAgKTsKICAgICR0aW1lIC09ICRtaW4gKiA2MDsKCiAgICByZXR1cm4gKCBpbnQoJHRpbWUpLCAkbWluLCAkaG91ciApOwp9ICMgfX19CgojIHN1YiBqdWxpYW4vamQgI3t7ewoKPWhlYWQyIGp1bGlhbgoKICBteSAkamQgPSAkZGF0ZS0+amQ7CgpSZXR1cm5zIGEgbGlzdHJlZiwgY29udGFpbmluZyB0d28gZWxlbWVudHMuIFRoZSBkYXRlIGFzIGEganVsaWFuIGRheSwKYW5kIHRoZSB0aW1lIGFzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBtaWRuaWdodC4gVGhpcyBzaG91bGQgbm90IApiZSB0aG91Z2h0IG9mIGFzIGEgcmVhbCBqdWxpYW4gZGF5LCBiZWNhdXNlIGl0J3Mgbm90LiBUaGUgbW9kdWxlIGlzCmludGVybmFsbHkgY29uc2lzdGVudCwgYW5kIHRoYXQncyBlbm91Z2guCgpUaGlzIG1ldGhvZCByZWFsbHkgb25seSBpcyBoZXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMKdmVyc2lvbnMsIGFzIHRoZSBqZCBtZXRob2QgaXMgbm93IHRocm93biBvdmVyIGZvciBwbGFpbiBoYXNoIHJlZmVyZW5jZXMuCgpTZWUgdGhlIGZpbGUgSU5URVJOQUxTIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW50ZXJuYWwKZm9ybWF0LgoKPWN1dAoKc3ViIGpkIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgaWYgKCBteSAkamQgPSBzaGlmdCApIHsKICAgICAgICAoICRzZWxmLT57anVsaWFufSwgJHNlbGYtPntqdWxzZWN9ICkgPSBAJGpkOwogICAgfQoKICAgIHJldHVybiBbICRzZWxmLT57anVsaWFufSwgJHNlbGYtPntqdWxzZWN9IF07Cn0KCnN1YiBqdWxpYW4geyByZXR1cm4gamQoQF8pIH0KCiMgSU5URVJOQUwgT05MWTogZmlndXJlcyBvdXQgd2hhdCB0aGUgVVRDIG9mZnNldCAoaW4gSEhNTSkgaXMKIyBpcyBmb3IgdGhlIGN1cnJlbnQgbWFjaGluZS4Kc3ViIF9jYWxjX2xvY2FsX29mZnNldCB7CgogICAgdXNlIFRpbWU6OkxvY2FsOwogICAgbXkgQHQgPSBnbXRpbWU7CgogICAgbXkgJGxvY2FsID0gdGltZWxvY2FsKEB0KTsKICAgIG15ICRnbSAgICA9IHRpbWVnbShAdCk7CgogICAgbXkgJHNlY2RpZmYgPSAkZ20gLSAkbG9jYWw7CiAgICByZXR1cm4gb2Zmc2V0X2Zyb21fc2Vjb25kcygkc2VjZGlmZik7Cn0KCiN9fX0KCjE7CgojIE1vcmUgZG9jcyB7e3sKCj1oZWFkMSBUT0RPCgo9b3ZlciA0IAoKPWl0ZW0gLSBhZGQgZ210aW1lIGFuZCBsb2NhbHRpbWUgbWV0aG9kcywgcGVyaGFwcz8KCj1pdGVtIC0gRml4IHRoZSBJTlRFUk5BTFMgZmlsZSBzbyB0aGF0IGl0IGFjdHVhbGx5IHJlZmxlY3RzIHJlYWxpdHkKCj1iYWNrCgo9aGVhZDEgSU5URVJOQUxTCgpQbGVhc2Ugc2VlIHRoZSBmaWxlIElOVEVSTkFMUyBmb3IgZGlzY3Vzc2lvbiBvbiB0aGUgaW50ZXJuYWxzLgoKPWhlYWQxIEFVVEhPUgoKUmljaCBCb3dlbiAoRHJCYWNjaHVzKSByYm93ZW5AcmNib3dlbi5jb20KCkFuZCB0aGUgcmVzdCBvZiB0aGUgUmVlZmtub3QgdGVhbS4gU2VlIHRoZSBzb3VyY2UgZm9yIGEgZnVsbApsaXN0IG9mIHBhdGNoIGNvbnRyaWJ1dG9ycyBhbmQgdmVyc2lvbi1ieS12ZXJzaW9uIG5vdGVzLgoKPWhlYWQxIFNFRSBBTFNPCgpkYXRldGltZUBwZXJsLm9yZyBtYWlsaW5nIGxpc3QKCmh0dHA6Ly9kYXRldGltZS5wZXJsLm9yZy8KClRpbWU6OkxvY2FsCgpOZXQ6OklDYWwKCj1jdXQKCiN9fX0KCg==
IyAkSGVhZGVyOiAvY3Zzcm9vdC9kYXRlLWxlYXB5ZWFyL2xpYi9EYXRlL0xlYXB5ZWFyLnBtLHYgMS43MSAyMDAyLzA4LzMwIDAwOjAwOjI1IHJib3dlbiBFeHAgJApwYWNrYWdlIERhdGU6OkxlYXB5ZWFyOwp1c2Ugc3RyaWN0OwoKdXNlIEV4cG9ydGVyOwp1c2UgdmFycyBxdyhASVNBIEBFWFBPUlQgJFZFUlNJT04pOwpASVNBID0gcXcoRXhwb3J0ZXIpOwoKQEVYUE9SVCA9IHF3KCBpc2xlYXAgKTsKJFZFUlNJT04gPSAoIHF3JyRSZXZpc2lvbjogMS43MiAkJyApWzFdOwoKPWhlYWQxIE5BTUUKCkRhdGU6OkxlYXB5ZWFyIC0gSXMgYSBwYXJ0aWN1bGFyIHllYXIgYSBsZWFwIHllYXI/Cgo9aGVhZDEgU1lOT1BTSVMKCiAgdXNlIERhdGU6OkxlYXB5ZWFyOwogIGlmICggaXNsZWFwKDE5NDUpICkgewogICAgLi4uCiAgfQoKPWhlYWQxIERFU0NSSVBUSU9OCgpEYXRlOjpMZWFweWVhciBleHBvcnRzIG9uZSBmdW5jdGlvbiAtIGlzbGVhcCAtIHdoaWNoIHJldHVybnMgMSBvciAwIGlmCmEgeWVhciBpcyBsZWFwLCBvciBub3QsIHJlc3BlY3RpdmVseS4KCj1oZWFkMSBpc2xlYXAKCiAgICAkdHJ1ZSA9IGlzbGVhcCggMjAwNCApOwoKUmV0dXJucyAxIGluIGEgbGVhcCB5ZWFyLCAwIG90aGVyd2lzZS4KCj1jdXQKCnN1YiBpc2xlYXAgewogICAgbXkgKCR5ZWFyKSA9IEBfOwogICAgcmV0dXJuIDEgaWYgKCggJHllYXIgJSA0MDAgKSA9PSAwICk7ICMgNDAwJ3MgYXJlIGxlYXAKICAgIHJldHVybiAwIGlmICgoICR5ZWFyICUgMTAwICkgPT0gMCApOyAjIE90aGVyIGNlbnR1cmllcyBhcmUgbm90CiAgICByZXR1cm4gMSBpZiAoKCAkeWVhciAlIDQgKSA9PSAwICk7ICMgQWxsIG90aGVyIDQncyBhcmUgbGVhcAogICAgcmV0dXJuIDA7ICMgRXZlcnl0aGluZyBlbHNlIGlzIG5vdAp9CgoxOwoKPWhlYWQxIEFVVEhPUgoKUmljaCBCb3dlbiAocmJvd2VuQHJjYm93ZW4uY29tKQoKPWN1dAoK
cGFja2FnZSBEYXRlOjpJQ2FsOjpEdXJhdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSBDYXJwOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04gKTsKJFZFUlNJT04gPSAocXcnJFJldmlzaW9uOiAxLjYxICQnKVsxXTsKCiMgRG9jdW1lbnRhdGlvbiB7e3sKCj1oZWFkMSBOQU1FCgpEYXRlOjpJQ2FsOjpEdXJhdGlvbiAtIGR1cmF0aW9ucyBpbiBpQ2FsZW5kYXIgZm9ybWF0LCBmb3IgbWF0aCBwdXJwb3Nlcy4KCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNjEgJAoKPWhlYWQxIFNZTk9QU0lTCgogICAgdXNlIERhdGU6OklDYWw6OkR1cmF0aW9uOwoKICAgICRkID0gRGF0ZTo6SUNhbDo6RHVyYXRpb24tPm5ldyggaWNhbCA9PiAnLVAxVzNEVDJIM000NVMnICk7CgogICAgJGQgPSBEYXRlOjpJQ2FsOjpEdXJhdGlvbi0+bmV3KCB3ZWVrcyA9PiAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5cyA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VycyA9PiA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51dGVzID0+IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzID0+IDQ1KTsgCgogICAgIyBhIG9uZSBob3VyIGR1cmF0aW9uLCB3aXRob3V0IG90aGVyIGNvbXBvbmVudHMKICAgICRkID0gRGF0ZTo6SUNhbDo6RHVyYXRpb24tPm5ldyggc2Vjb25kcyA9PiAiMzYwMCIpOyAKCiAgICAjIFJlYWQtb25seSBhY2Nlc3NvcnM6CiAgICAkZC0+d2Vla3M7CiAgICAkZC0+ZGF5czsKICAgICRkLT5ob3VyczsKICAgICRkLT5taW51dGVzOwogICAgJGQtPnNlY29uZHM7CiAgICAkZC0+c2lnbjsKCiAgICAjIFRPRE86IFJlc29sdmUgc2lnbigpIGRpc2N1c3Npb24gZnJvbSByay1kZXZlbCBhbmQgdXBkYXRlIHN5bm9wc2lzLgogICAgCiAgICAkZC0+YXNfc2Vjb25kcyAoKTsgICAjIHJldHVybnMganVzdCBzZWNvbmRzCiAgICAkZC0+YXNfZWxlbWVudHMgKCk7ICAjIHJldHVybnMgYSBoYXNoIG9mIGVsZW1lbnRzLCBsaWtlIHRoZSBhY2Nlc3NvcnMgYWJvdmUKICAgICRkLT5hc19pY2FsKCk7ICAgICAgICMgcmV0dXJucyBhbiBpQ2FsZW5kYXIgZHVyYXRpb24gc3RyaW5nCiAgICAKPWhlYWQxIERFU0NSSVBUSU9OCgpUaGlzIGlzIGEgdHJpdmlhbCBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGR1cmF0aW9uIG9iamVjdHMsIGZvciBkb2luZyBtYXRoCmluIERhdGU6OklDYWwKCj1oZWFkMSBBVVRIT1IKClJpY2ggQm93ZW4sIGFuZCB0aGUgUmVlZmtub3QgdGVhbS4gQWxhcywgUmVlZmtub3QgaXMgbm8gbW9yZS4gU2VlCmh0dHA6Ly9kYXRldGltZS5wZXJsLm9yZy8gZm9yIG1vcmUgbW9kZXJuIG1vZHVsZXMuCgpMYXN0IHRvdWNoZWQgYnkgJEF1dGhvcjogcmJvd2VuICQKCj1oZWFkMSBNRVRIT0RTCgpEYXRlOjpJQ2FsOjpEdXJhdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzIGF2YWlsYWJsZToKCj1oZWFkMiBuZXcKCkEgbmV3IERhdGU6OklDYWw6OkR1cmF0aW9uIG9iamVjdCBjYW4gYmUgY3JlYXRlZCB3aXRoIGFuIGlDYWxlbmRhciBzdHJpbmcgOgoKICAgIG15ICRpY2FsID0gRGF0ZTo6SUNhbDo6RHVyYXRpb24tPm5ldyAoIGljYWwgPT4gJ1AzVzJEJyApOwogICAgIyAzIHdlZWtzLCAyIGRheXMsIHBvc2l0aXZlIGRpcmVjdGlvbgogICAgbXkgJGljYWwgPSBEYXRlOjpJQ2FsOjpEdXJhdGlvbi0+bmV3ICggaWNhbCA9PiAnLVA2SDNNMzBTJyApOwogICAgIyA2IGhvdXJzLCAzIG1pbnV0ZXMsIDMwIHNlY29uZHMsIG5lZ2F0aXZlIGRpcmVjdGlvbgogICAgCk9yIHdpdGggYSBudW1iZXIgb2Ygc2Vjb25kczoKCiAgICBteSAkaWNhbCA9IERhdGU6OklDYWw6OkR1cmF0aW9uLT5uZXcgKCBzZWNvbmRzID0+ICIzNjAwIiApOwogICAgIyBvbmUgaG91ciBwb3NpdGl2ZQoKT3IsIGJldHRlciBzdGlsbCwgY3JlYXRlIGl0IHdpdGggY29tcG9uZW50cwoKICAgIG15ICRkYXRlID0gRGF0ZTo6SUNhbDo6RHVyYXRpb24tPm5ldyAoIAogICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWVrcyA9PiA2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5cyA9PiAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91cnMgPT4gNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlcyA9PiAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyA9PiA0NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9PiAiKyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKClRoZSBzaWduIGRlZmF1bHRzIHRvICIrIiwgYnV0ICIrIiBhbmQgIi0iIGFyZSBsZWdhbCB2YWx1ZXMuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPWN1dAoKI319fQoKI3t7eyBzdWIgbmV3CgpzdWIgbmV3IHsKICAgIG15ICgkY2xhc3MsICVhcmdzKSA9IEBfOwogICAgbXkgJHZlcmlmaWVkID0ge307CiAgICBteSAkc2VsZiA9IHt9OwogICAgYmxlc3MgJHNlbGYsICRjbGFzczsKCiAgICBteSAkc2Vjb25kc19vbmx5ID0gMTsgICAgIyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2Ugd2VyZSBnaXZlbiBsZW5ndGggaW4gc2Vjb25kcyBvbmx5CiAgICAkc2Vjb25kc19vbmx5ID0gMCB1bmxlc3MgKGRlZmluZWQgJGFyZ3N7J3NlY29uZHMnfSk7IAoKICAgICMgSWYgb25lIG9mIHRoZSBhdHRyaWJ1dGVzIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZXkgYWxsIG11c3QgYmUKICAgICMgbmVnYXRpdmUuIE90aGVyd2lzZSwgd2UncmUgbm90IHN1cmUgd2hhdCB0aGlzIG1lYW5zLgogICAgZm9yZWFjaCAocXcoaG91cnMgbWludXRlcyBzZWNvbmRzIGRheXMgd2Vla3MpKSB7CiAgICAgICAgaWYgKGRlZmluZWQoJGFyZ3N7JF99KSApICAgewogICAgICAgICAgICAjIG1ha2Ugc3VyZSB0aGlzIGFyZ3VtZW50IGlzIGFsbCBkaWdpdHMsIG9wdGlvbmFsIC0gc2lnbgogICAgICAgICAgICBpZiAoJGFyZ3N7JF99ID1+IG0vLT9bMC05XSskLykgeyAKICAgICAgICAgICAgICAgIGlmICgkYXJnc3skX30gPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgJGFyZ3N7c2lnbn0gPSAnLSc7CiAgICAgICAgICAgICAgICAgICAgJGFyZ3N7JF99ID0gYWJzKCRhcmdzeyRffSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdmVyaWZpZWQtPnskX30gPSAkYXJnc3skX307CiAgICAgICAgICAgICAgICB1bmxlc3MgKCRfIGVxICdzZWNvbmRzJykgewogICAgICAgICAgICAgICAgICAgICRzZWNvbmRzX29ubHkgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY2FycCAoIlBhcmFtZXRlciAkXyBjb250YWlucyBub24tbnVtZXJpYyB2YWx1ZSAiIC4gJGFyZ3N7JF99IC4gIlxuIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKGRlZmluZWQgKCRhcmdze3NpZ259KSApIHsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhpcyBhcmd1bWVudCArIG9yIC0KICAgICAgICBpZiAoJGFyZ3N7c2lnbn0gPX4gbS9bKy1dLykgewogICAgICAgICAgICAjIGlmIHNvLCBhc3NpZ24gaXQKICAgICAgICAgICAgJHNlbGYtPntzaWdufSA9ICgkYXJnc3tzaWdufSBlcSAiKyIpID8gMSA6IC0xOwogICAgICAgICAgICAkdmVyaWZpZWQtPntzaWdufSA9ICgkYXJnc3tzaWdufSBlcSAiKyIpID8gJysnIDogJy0nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNhcnAgKCJQYXJhbWV0ZXIgc2lnbiBjb250YWlucyBhIHZhbHVlIG90aGVyIHRoYW4gKyBvciAtIDogIgogICAgICAgICAgICAgICAgLiAkYXJnc3tzaWdufSAuICJcbiIpOwogICAgICAgIH0KICAgICAgICAKICAgIH0KCiAgICAjIElmIGEgbnVtYmVyIGlzIGdpdmVuLCBjb252ZXJ0IGl0IHRvIGhvdXJzLCBtaW51dGVzLCBhbmQgc2Vjb25kcywKICAgICMgYnV0ICpkb24ndCogZXh0cmFjdCBkYXlzIC0tIHdlIHdhbnQgaXQgdG8gcmVwcmVzZW50IGFuIGFic29sdXRlCiAgICAjIGFtb3VudCBvZiB0aW1lLCByZWdhcmRsZXNzIG9mIHRpbWV6b25lCiAgICBpZiAoJHNlY29uZHNfb25seSkgeyAjIGlmIHdlIHdlcmUgZ2l2ZW4gYW4gaW50ZWdlciB0aW1lX3QKICAgICAgICAkc2VsZi0+X3NldF9mcm9tX3NlY29uZHMoJGFyZ3N7J3NlY29uZHMnfSk7CiAgICB9IGVsc2lmIChkZWZpbmVkICgkYXJnc3snaWNhbCd9KSApIHsgICAKICAgICAgICAjIEEgc3RhbmRhcmQgZHVyYXRpb24gc3RyaW5nCiAgICAgICAgI3dhcm4gInNldHRpbmcgZnJvbSBpY2FsXG4iOwogICAgICAgICRzZWxmLT5fc2V0X2Zyb21faWNhbCgkYXJnc3snaWNhbCd9KTsKICAgIH0gZWxzaWYgKG5vdCAkc2Vjb25kc19vbmx5KSB7CiAgICAgICAgI3dhcm4gInNldHRpbmcgZnJvbSBjb21wb25lbnRzIjsKICAgICAgICAjdXNlIERhdGE6OkR1bXBlcjsgd2FybiBEdW1wZXIgJHZlcmlmaWVkOwogICAgICAgICRzZWxmLT5fc2V0X2Zyb21fY29tcG9uZW50cygkdmVyaWZpZWQpOwogICAgfQogICAgCiAgICByZXR1cm4gdW5kZWYgdW5sZXNzICVhcmdzOwogICAKICAgIHJldHVybiAkc2VsZjsKfQoKI319fQoKIyBBY2Nlc3NvcnMge3t7Cgo9aGVhZDIgc2lnbiwgd2Vla3MsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzCgpSZWFkLW9ubHkgYWNjZXNzb3JzIGZvciB0aGUgZWxlbWVudHMgb2YgdGhlIG9iamVjdC4gCgo9Y3V0IAoKI319fQoKIyB7e3sgc3ViIHNpZ24gCgpzdWIgc2lnbiB7CiAgICBteSAoJHNlbGYpID0gQF87CiAgICByZXR1cm4gJHNlbGYtPntzaWdufTsKfQoKI319fQoKIyB7e3sgc3ViIHdlZWtzIAoKc3ViIHdlZWtzIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgIG15ICR3ID0gJHskc2VsZi0+X3dkfVswXTsKICAgIHJldHVybiB1bmxlc3MgJHc7CiAgICByZXR1cm4gJHNlbGYtPntzaWdufSAqICR3Owp9CgojfX19CgojIHt7eyBzdWIgZGF5cyAKCnN1YiBkYXlzIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgIG15ICRkID0gJHskc2VsZi0+X3dkfVsxXTsKICAgIHJldHVybiB1bmxlc3MgJGQ7CiAgICByZXR1cm4gICRzZWxmLT57c2lnbn0gKiAkZDsKCn0gI319fQoKI3t7eyBzdWIgaG91cnMgCgpzdWIgaG91cnMgewogICAgbXkgKCRzZWxmKSA9IEBfOwogICAgbXkgJGggPSAkeyRzZWxmLT5faG1zfVswXTsKICAgIHJldHVybiB1bmxlc3MgJGg7CiAgICByZXR1cm4gJHNlbGYtPntzaWdufSAqICRoOwp9CgojfX19CgojIHt7eyBzdWIgbWludXRlcyAKCnN1YiBtaW51dGVzIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgIG15ICRtID0gJHskc2VsZi0+X2htc31bMV07CiAgICByZXR1cm4gdW5sZXNzICRtOwogICAgcmV0dXJuICRzZWxmLT57c2lnbn0gKiAkbTsKfQoKI319fQoKIyB7e3sgc3ViIHNlY29uZHMgCgpzdWIgc2Vjb25kcyB7CiAgICBteSAoJHNlbGYpID0gQF87CiAgICBteSAkcyA9ICR7JHNlbGYtPl9obXN9WzJdOwogICAgcmV0dXJuIHVubGVzcyAkczsKICAgIHJldHVybiAkc2VsZi0+e3NpZ259ICogJHM7Cn0KCiN9fX0KCiMgc3ViIGFzX3NlY29uZHMge3t7Cgo9aGVhZDIgYXNfc2Vjb25kcwoKUmV0dXJucyB0aGUgZHVyYXRpb24gaW4gcmF3IHNlY29uZHMuIAoKV0FSTklORyAtLSB0aGlzIGZvbGRzIGluIHRoZSBudW1iZXIgb2YgZGF5cywgYXNzdW1pbmcgdGhhdCB0aGV5IGFyZSBhbHdheXMgODY0MDAKc2Vjb25kcyBsb25nICh3aGljaCBpcyBub3QgdHJ1ZSB0d2ljZSBhIHllYXIgaW4gYXJlYXMgdGhhdCBob25vciBkYXlsaWdodApzYXZpbmdzIHRpbWUpLiAgSWYgeW91J3JlIHVzaW5nIHRoaXMgZm9yIGRhdGUgYXJpdGhtZXRpYywgY29uc2lkZXIgdXNpbmcgdGhlCkk8YWRkKCk+IG1ldGhvZCBmcm9tIGEgTDxEYXRlOjpJQ2FsPiBvYmplY3QsIGFzIHRoaXMgd2lsbCBiZWhhdmUgYmV0dGVyLgpPdGhlcndpc2UsIHlvdSBtaWdodCBleHBlcmllbmNlIHNvbWUgZXJyb3Igd2hlbiB3b3JraW5nIHdpdGggdGltZXMgdGhhdCBhcmUKc3BlY2lmaWVkIGluIGEgdGltZSB6b25lIHRoYXQgb2JzZXJ2ZXMgZGF5bGlnaHQgc2F2aW5ncyB0aW1lLgoKCj1jdXQgCgpzdWIgYXNfc2Vjb25kcyB7CiAgICBteSAoJHNlbGYpID0gQF87CgogICAgbXkgJG5zZWNzID0gJHNlbGYtPntuc2Vjc30gfHwgMDsKICAgIG15ICRuZGF5cyA9ICRzZWxmLT57bmRheXN9IHx8IDA7CiAgICBteSAkc2lnbiAgPSAkc2VsZi0+e3NpZ259ICB8fCAxOwogICAgcmV0dXJuICRzaWduKigkbnNlY3MrKCRuZGF5cyoyNCo2MCo2MCkpOwp9CgojfX19CgojIHN1YiBhc19kYXlzIHt7ewoKPWhlYWQyIGFzX2RheXMKCiAgICAkZGF5cyA9ICRkdXJhdGlvbi0+YXNfZGF5czsKClJldHVybnMgdGhlIGR1cmF0aW9uIGFzIGEgbnVtYmVyIG9mIGRheXMuIE5vdCB0byBiZSBjb25mdXNlZCB3aXRoIHRoZQpDPGRheXM+IG1ldGhvZCwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGRheXMsIHJhdGhlcgp0aGFuIG1vZCdpbmcgb3V0IHRoZSBjb21wbGV0ZSB3ZWVrcy4gVGh1cywgaWYgd2UgaGF2ZSBhIGR1cmF0aW9uIG9mIDMzCmRheXMsIEM8d2Vla3M+IHdpbGwgcmV0dXJuIDQsIEM8ZGF5cz4gd2lsbCByZXR1cm4gNSwgYnV0IEM8YXNfZGF5cz4gd2lsbApyZXR1cm4gMzMuCgpOb3RlIHRoYXQgdGhpcyBpcyBhIGxhenkgY29udmVuaWVuY2UgZnVuY3Rpb24gd2hpY2ggaXMganVzdCB3ZWVrcyo3ICsKZGF5cy4KCj1jdXQKCnN1YiBhc19kYXlzIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgIG15ICR3ZCA9ICRzZWxmLT5fd2Q7CiAgICByZXR1cm4gJHNlbGYtPntzaWdufSAqICggJHdkLT5bMF0qNyArICR3ZC0+WzFdICk7Cn0jIH19fQoKI3t7eyBzdWIgYXNfaWNhbCAKCj1oZWFkMiBhc19pY2FsCgpSZXR1cm4gdGhlIGR1cmF0aW9uIGluIGFuIGlDYWxlbmRhciBmb3JtYXQgdmFsdWUgc3RyaW5nIChlLmcuLCAiUFQySDBNMFMiKQoKPWN1dCAKCnN1YiBhc19pY2FsIHsKICAgIG15ICgkc2VsZikgPSBAXzsKCiAgICBteSAkdHBhcnQgPSAnJzsKCiAgICBpZiAobXkgJGFyX2htcyA9ICRzZWxmLT5faG1zKSB7CiAgICAgICAgJHRwYXJ0ID0gc3ByaW50ZignVCVkSCVkTSVkUycsIEAkYXJfaG1zKTsKICAgIH0KCiAgICBteSAkYXJfd2QgPSAkc2VsZi0+X3dkKCk7CiAgICAKICAgIG15ICRkcGFydCA9ICcnOwogICAgaWYgKGRlZmluZWQgJGFyX3dkKSB7CiAgICAgICAgbXkgKCR3ZWVrcywgJGRheXMpID0gQCRhcl93ZDsKICAgICAgICBpZiAoJHdlZWtzICYmICRkYXlzKSB7CiAgICAgICAgICAgICRkcGFydCA9IHNwcmludGYoJyVkVyVkRCcsICR3ZWVrcywgJGRheXMpOwogICAgICAgIH0gZWxzaWYgKCR3ZWVrcykgeyAgICMgKGlmIGRheXMgPSAwKQogICAgICAgICAgICAkZHBhcnQgPSBzcHJpbnRmKCclZFcnLCAkd2Vla3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRkcGFydCA9IHNwcmludGYoJyVkRCcsICRkYXlzKTsKICAgICAgICB9CiAgICB9CgogICAgIyBwdXQgYSBzaWduIGluIHRoZSByZXR1cm4gdmFsdWUgaWYgbmVjZXNzYXJ5CiAgICBteSAkdmFsdWUgPSBqb2luKCcnLCAoKCRzZWxmLT57c2lnbn0gPCAwKSA/ICctJyA6ICcnKSwKICAgICAgICAgICAgICAgICAgICAgJ1AnLCAkZHBhcnQsICR0cGFydCk7CgogICAgIyByZW1vdmUgYW55IHplcm8gY29tcG9uZW50cyBmcm9tIHRoZSB0aW1lIHN0cmluZyAoLVAxMEQwSCAtPiAtUDEwRCkKICAgICR2YWx1ZSA9fiBzLyg/PD1bXlxkXSkwW1dESE1TXS8vZzsKCiAgICAjIHJldHVybiBlaXRoZXIgdGhlIHRpbWUgdmFsdWUgb3IgUFQwUyAoaWYgdGhlIHRpbWUgdmFsdWUgaXMgemVybykuCiAgICByZXR1cm4gKCgkdmFsdWUgIX4gL1BUPyQvKSA/ICR2YWx1ZSA6ICdQVDBTJyk7Cn0KCiN9fX0KCiN7e3sgc3ViIGFzX2VsZW1lbnRzCgo9aGVhZDIgYXNfZWxlbWVudHMKClJldHVybnMgdGhlIGR1cmF0aW9uIGFzIGEgaGFzaHJlZiBvZiBlbGVtZW50cy4gCgo9Y3V0IAoKc3ViIGFzX2VsZW1lbnRzIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgCiAgICAjIGdldCB2YWx1ZXMgZm9yIGFsbCB0aGUgZWxlbWVudHMKICAgIG15ICR3ZCA9ICRzZWxmLT5fd2Q7CiAgICBteSAkaG1zID0gJHNlbGYtPl9obXM7CiAgIAogICAgbXkgJHJldHVybiA9IHsKICAgICAgICBzaWduID0+ICRzZWxmLT57c2lnbn0sIAogICAgICAgIHdlZWtzID0+ICR7JHdkfVswXSwKICAgICAgICBkYXlzID0+ICR7JHdkfVsxXSwKICAgICAgICBob3VycyA9PiAkeyRobXN9WzBdLAogICAgICAgIG1pbnV0ZXMgPT4gJHskaG1zfVsxXSwKICAgICAgICBzZWNvbmRzID0+ICR7JGhtc31bMl0sCiAgICB9OwogICAgcmV0dXJuICRyZXR1cm47Cn0KCiN9fX0KCiMgSU5URVJOQUxTIHt7ewoKPWhlYWQxIElOVEVSTkFMUwoKaGVhZDIgR0VORVJBTCBNT0RFTAoKSW50ZXJuYWxseSwgd2Ugc3RvcmUgMyBkYXRhIHZhbHVlczogYSBudW1iZXIgb2YgZGF5cywgYSBudW1iZXIgb2Ygc2Vjb25kcyAoYW55dGhpbmcKc2hvcnRlciB0aGFuIGEgZGF5KSwgYW5kIGEgc2lnbiAoMSBvciAtMSkuIFdlIGFyZSBhc3N1bWluZyB0aGF0IGEgZGF5IGlzIDI0IGhvdXJzIGZvcgpwdXJwb3NlcyBvZiB0aGlzIG1vZHVsZTsgeWVzLCB3ZSBrbm93IHRoYXQncyBub3QgY29tcGxldGVseSBhY2N1cmF0ZSBiZWNhdXNlIG9mCmRheWxpZ2h0LXNhdmluZ3MtdGltZSBzd2l0Y2hvdmVycywgYnV0IGl0J3MgbW9zdGx5IGNvcnJlY3QuIFN1Z2dlc3Rpb25zIGFyZSB3ZWxjb21lLgoKTk9URTogVGhlIG1ldGhvZHMgYmVsb3cgU0hPVUxEIE5PVCBiZSByZWxpZWQgb24gdG8gc3RheSB0aGUgc2FtZSBpbiBmdXR1cmUgdmVyc2lvbnMuCgo9aGVhZDIgX3NldF9mcm9tX2ljYWwgKCRzZWxmLCAkZHVyYXRpb25fc3RyaW5nKQoKQ29udmVydHMgYSBSRkMyNDQ1IERVUkFUSU9OIGZvcm1hdCBzdHJpbmcgdG8gdGhlIGludGVybmFsIHN0b3JhZ2UgZm9ybWF0LgoKPWN1dAoKI319fQoKIyBzdWIgX3NldF9mcm9tX2ljYWwgKGludGVybmFsKSB7e3sKCnN1YiBfc2V0X2Zyb21faWNhbCB7CiAgICBteSAoJHNlbGYsICRzdHIpID0gQF87CgogICAgbXkgJHBhcnNlZF92YWx1ZXMgPSBfcGFyc2VfaWNhbF9zdHJpbmcoJHN0cik7CiAgICAKICAgIHJldHVybiAkc2VsZi0+X3NldF9mcm9tX2NvbXBvbmVudHMoJHBhcnNlZF92YWx1ZXMpOwp9ICMgfX19CgojIHN1YiBfcGFyc2VfaWNhbF9zdHJpbmcgKGludGVybmFsKSB7e3sKCj1oZWFkMiBfcGFyc2VfaWNhbF9zdHJpbmcgKCRzdHJpbmcpCgpSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHBhcnNpbmcgaUNhbGVuZGFyIGludG8gdXNhYmxlIHZhbHVlcy4gCgo9Y3V0CgpzdWIgX3BhcnNlX2ljYWxfc3RyaW5nIHsKICAgIG15ICgkc3RyKSA9IEBfOwogICAgCiAgICAjIFJGQyAyNDQ1IHNlY3Rpb24gNC4zLjYKICAgICMKICAgICMgZHVyLXZhbHVlICA9IChbIisiXSAvICItIikgIlAiIChkdXItZGF0ZSAvIGR1ci10aW1lIC8gZHVyLXdlZWspCiAgICAjIGR1ci1kYXRlICAgPSBkdXItZGF5IFtkdXItdGltZV0KICAgICMgZHVyLXRpbWUgICA9ICJUIiAoZHVyLWhvdXIgLyBkdXItbWludXRlIC8gZHVyLXNlY29uZCkKICAgICMgZHVyLXdlZWsgICA9IDEqRElHSVQgIlciCiAgICAjIGR1ci1ob3VyICAgPSAxKkRJR0lUICJIIiBbZHVyLW1pbnV0ZV0KICAgICMgZHVyLW1pbnV0ZSA9IDEqRElHSVQgIk0iIFtkdXItc2Vjb25kXQogICAgIyBkdXItc2Vjb25kID0gMSpESUdJVCAiUyIKICAgICMgZHVyLWRheSAgICA9IDEqRElHSVQgIkQiCgogICAgbXkgKCRzaWduX3N0ciwgJG1hZ2ljLCAkd2Vla3MsICRkYXlzLCAkaG91cnMsICRtaW51dGVzLCAkc2Vjb25kcykgPQogICAgICAgICRzdHIgPX4gbXsKICAgICAgICAgICAgKFtcK1wtXSk/ICAgKD8jIFNpZ24pCiAgICAgICAgICAgIChQKSAgICAgKD8jICdQJyBmb3IgcGVyaW9kPyBUaGlzIGlzIG91ciBtYWdpYyBjaGFyYWN0ZXIpCiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgKD86KFxkKylXKT8gKD8jIFdlZWtzKQogICAgICAgICAgICAgICAgKD86KFxkKylEKT8gKD8jIERheXMpCiAgICAgICAgICAgICk/CiAgICAgICAgICAgICg/OlQgICAgICAgICg/IyBUaW1lIHByZWZpeCkKICAgICAgICAgICAgICAgICg/OihcZCspSCk/ICg/IyBIb3VycykKICAgICAgICAgICAgICAgICg/OihcZCspTSk/ICg/IyBNaW51dGVzKQogICAgICAgICAgICAgICAgKD86KFxkKylTKT8gKD8jIFNlY29uZHMpCiAgICAgICAgICAgICk/CiAgICAgICAgfXg7CgogICAgaWYgKCFkZWZpbmVkKCRtYWdpYykpIHsKICAgICAgICBjYXJwICJJbnZhbGlkIGR1cmF0aW9uOiAkc3RyIjsKICAgICAgICByZXR1cm4gdW5kZWY7CiAgICB9CgogICAgIyBtYWtlIHN1cmUgdGhlIHNpZ24gZ2V0cyBzZXQsIGFuZCB0dXJuIGl0IGludG8gYW4gaW50ZWdlciBtdWx0aXBsaWVyCiAgICAkc2lnbl9zdHIgfHw9ICIrIjsKICAgIG15ICRzaWduID0gKCRzaWduX3N0ciBlcSAiLSIpID8gLTEgOiAxOwogICAgCiAgICBteSAkcmV0dXJuID0ge307CiAgICAkcmV0dXJuLT57J3dlZWtzJ30gPSAkd2Vla3M7CiAgICAkcmV0dXJuLT57J2RheXMnfSA9ICRkYXlzOwogICAgJHJldHVybi0+eydob3Vycyd9ID0gJGhvdXJzOwogICAgJHJldHVybi0+eydtaW51dGVzJ30gPSAkbWludXRlczsKICAgICRyZXR1cm4tPnsnc2Vjb25kcyd9ID0gJHNlY29uZHM7CiAgICAkcmV0dXJuLT57J3NpZ24nfSA9ICRzaWduOwoKICAgIHJldHVybiAkcmV0dXJuOwp9ICMgfX19CgojIHN1YiBfc2V0X2Zyb21fY29tcG9uZW50cyAoaW50ZXJuYWwpIHt7ewoKPWhlYWQyIF9zZXRfZnJvbV9jb21wb25lbnRzICgkc2VsZiwgJGhhc2hyZWYpCgpDb252ZXJ0cyBmcm9tIGEgaGFzaHJlZiB0byB0aGUgaW50ZXJuYWwgc3RvcmFnZSBmb3JtYXQuClRoZSBoYXNocmVmIGNhbiBjb250YWluIGVsZW1lbnRzICJzaWduIiwgIndlZWtzIiwgImRheXMiLCAiaG91cnMiLCAibWludXRlcyIsICJzZWNvbmRzIi4KCj1jdXQKCnN1YiBfc2V0X2Zyb21fY29tcG9uZW50cyB7CiAgICBteSAoJHNlbGYsICRhcmdzKSA9IEBfOwoKICAgICMgU2V0IHVwIHNvbWUgZWFzaWVyLXRvLXJlYWQgdmFyaWFibGVzCiAgICBteSAoJHNpZ24sICR3ZWVrcywgJGRheXMsICRob3VycywgJG1pbnV0ZXMsICRzZWNvbmRzKTsKICAgICRzaWduID0gJGFyZ3MtPnsnc2lnbid9OwogICAgJHdlZWtzID0gJGFyZ3MtPnsnd2Vla3MnfTsKICAgICRkYXlzID0gJGFyZ3MtPnsnZGF5cyd9OwogICAgJGhvdXJzID0gJGFyZ3MtPnsnaG91cnMnfTsKICAgICRtaW51dGVzID0gJGFyZ3MtPnsnbWludXRlcyd9OwogICAgJHNlY29uZHMgPSAkYXJncy0+eydzZWNvbmRzJ307CiAgICAKICAgICRzZWxmLT57c2lnbn0gPSAoZGVmaW5lZCgkc2lnbikgJiYgJHNpZ24gZXEgJy0nKSA/IC0xIDogMTsKCiAgICBpZiAoZGVmaW5lZCgkd2Vla3MpIG9yIGRlZmluZWQoJGRheXMpKSB7CiAgICAgICAgJHNlbGYtPl93ZChbJHdlZWtzIHx8IDAsICRkYXlzIHx8IDBdKTsKICAgIH0KCiAgICBpZiAoZGVmaW5lZCgkaG91cnMpIHx8IGRlZmluZWQoJG1pbnV0ZXMpIHx8IGRlZmluZWQoJHNlY29uZHMpKSB7CiAgICAgICAgJHNlbGYtPl9obXMoWyRob3VycyB8fCAwLCAkbWludXRlcyB8fCAwLCAkc2Vjb25kcyB8fCAwXSk7CiAgICB9CgogICAgcmV0dXJuICRzZWxmOwp9ICMgfX19CgojIHN1YiBfc2V0X2Zyb21faWNhbCAoaW50ZXJuYWwpIHt7ewoKPWhlYWQyIF9zZXRfZnJvbV9pY2FsICgkc2VsZiwgJG51bV9zZWNvbmRzKQoKU2V0cyBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgcHJvcGVybHkgaWYgd2Ugd2VyZSBvbmx5IGdpdmVuIHNlY29uZHMgYXMgYSBwYXJhbWV0ZXIuCgo9Y3V0CgpzdWIgX3NldF9mcm9tX3NlY29uZHMgewogICAgbXkgKCRzZWxmLCAkc2Vjb25kcykgPSBAXzsKICAgICAgICAgICAgCiAgICAkc2VsZi0+e3NpZ259ID0gKCgkc2Vjb25kcyA8IDApID8gLTEgOiAxKTsKICAgICMgZmluZCB0aGUgbnVtYmVyIG9mIGRheXMsIGlmIGFueQogICAgbXkgJG5kYXlzID0gaW50ICgkc2Vjb25kcyAvICgyNCo2MCo2MCkpOwogICAgIyBub3csIGhvdyBtYW55IGhvdXJzL21pbnV0ZXMvc2Vjb25kcyBhcmUgdGhlcmUsIGFmdGVyCiAgICAjIGRheXMgYXJlIHRha2VuIG91dD8KICAgIG15ICRuc2VjcyA9ICRzZWNvbmRzICUgKDI0KjYwKjYwKTsKICAgICRzZWxmLT57bmRheXN9ID0gYWJzKCRuZGF5cyk7CiAgICAkc2VsZi0+e25zZWNzfSA9IGFicygkbnNlY3MpOwoKCiAgICByZXR1cm4gJHNlbGY7Cn0gIyB9fX0KCiMgc3ViIF9obXMgKGludGVybmFsKSB7e3sKCj1oZWFkMiAkc2VsZi0+X2htcygpOwoKUmV0dXJuIGFuIGFycmF5cmVmIHRvIGhvdXJzLCBtaW51dGVzLCBhbmQgc2Vjb25kIGNvbXBvbmVudHMsIG9yIHVuZGVmCmlmIG5zZWNzIGlzIHVuZGVmaW5lZC4gIElmIGdpdmVuIGFuIGFycmF5cmVmLCBjb21wdXRlcyB0aGUgbmV3IG5zZWNzIHZhbHVlIApmb3IgdGhlIGR1cmF0aW9uLiAgCgo9Y3V0IAoKc3ViIF9obXMgewogICAgbXkgKCRzZWxmLCAkaG1zX2FycmF5cmVmKSA9IEBfOwoKICAgIGlmIChkZWZpbmVkKCRobXNfYXJyYXlyZWYpKSB7CiAgICAgICAgbXkgJG5ld19zZWNfdmFsdWUgPSAkaG1zX2FycmF5cmVmLT5bMF0qMzYwMCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaG1zX2FycmF5cmVmLT5bMV0qNjAgICArICRobXNfYXJyYXlyZWYtPlsyXTsKICAgICAgICAkc2VsZi0+e25zZWNzfSA9ICgkbmV3X3NlY192YWx1ZSk7CiAgICB9IAoKICAgIG15ICRuc2VjcyA9ICRzZWxmLT57bnNlY3N9OwogICAgaWYgKGRlZmluZWQoJG5zZWNzKSkgewogICAgICAgIG15ICRob3VycyA9IGludCgkbnNlY3MvMzYwMCk7CiAgICAgICAgbXkgJG1pbnV0ZXMgID0gaW50KCgkbnNlY3MtJGhvdXJzKjM2MDApLzYwKTsKICAgICAgICBteSAkc2Vjb25kcyAgPSAkbnNlY3MgJSA2MDsKICAgICAgICByZXR1cm4gWyAkaG91cnMsICRtaW51dGVzLCAkc2Vjb25kcyBdOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludCAicmV0dXJuaW5nIHVuZGVmXG4iOwogICAgICAgIHJldHVybiB1bmRlZjsKICAgIH0KfSAjIH19fQoKIyBzdWIgX3dkIChpbnRlcm5hbCkge3t7Cgo9aGVhZDIgJHNlbGYtPl93ZCgpIAoKUmV0dXJuIGFuIGFycmF5cmVmIHRvIHdlZWtzIGFuZCBkYXkgY29tcG9uZW50cywgb3IgdW5kZWYgaWYgbmRheXMKaXMgdW5kZWZpbmVkLiAgSWYgR2l2ZW4gYW4gYXJyYXlyZWYsIGNvbXB1dHMgdGhlIG5ldyBuZGF5cyB2YWx1ZQpmb3IgdGhlIGR1cmF0aW9uLiAgCgo9Y3V0IAoKc3ViIF93ZCAgewogICAgbXkgKCRzZWxmLCAkd2RfYXJyYXlyZWYpID0gQF87CgogICAgI3ByaW50ICJlbnRlcmluZyBfd2RcbiI7CiAgICAKICAgIGlmIChkZWZpbmVkKCR3ZF9hcnJheXJlZikpIHsKICAgICAgICAKICAgICAgICBteSAkbmV3X25kYXlzID0gJHdkX2FycmF5cmVmLT5bMF0qNyArICR3ZF9hcnJheXJlZi0+WzFdOwogICAgICAgICRzZWxmLT57bmRheXN9ID0gJG5ld19uZGF5czsKICAgIH0KICAgIAogICAgI3VzZSBEYXRhOjpEdW1wZXI7IHByaW50IER1bXBlciAkc2VsZi0+e25kYXlzfTsKICAgIAogICAgaWYgKGRlZmluZWQobXkgJG5kYXlzPSAkc2VsZi0+e25kYXlzfSkpIHsKICAgICAgICBteSAkd2Vla3MgPSBpbnQoJG5kYXlzLzcpOwogICAgICAgIG15ICRkYXlzICA9ICRuZGF5cyAlIDc7CiAgICAgICAgcmV0dXJuIFsgJHdlZWtzLCAkZGF5cyBdOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdW5kZWY7CiAgICB9Cn0gIyB9fX0KCjE7Cg==
cGFja2FnZSBEZXZlbDo6U3RhY2tUcmFjZTsKCnVzZSA1LjAwNjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciAkVkVSU0lPTiA9ICcyLjAxJzsKCnVzZSBEZXZlbDo6U3RhY2tUcmFjZTo6RnJhbWU7CnVzZSBGaWxlOjpTcGVjOwp1c2UgU2NhbGFyOjpVdGlsIHF3KCBibGVzc2VkICk7Cgp1c2Ugb3ZlcmxvYWQKICAgICciIicgICAgID0+IFwmYXNfc3RyaW5nLAogICAgZmFsbGJhY2sgPT4gMTsKCnN1YiBuZXcgewogICAgbXkgJGNsYXNzID0gc2hpZnQ7CiAgICBteSAlcCAgICAgPSBAXzsKCiAgICAkcHt1bnNhZmVfcmVmX2NhcHR1cmV9ID0gIWRlbGV0ZSAkcHtub19yZWZzfQogICAgICAgIGlmIGV4aXN0cyAkcHtub19yZWZzfTsKCiAgICBteSAkc2VsZiA9IGJsZXNzIHsKICAgICAgICBpbmRleCAgPT4gdW5kZWYsCiAgICAgICAgZnJhbWVzID0+IFtdLAogICAgICAgIHJhdyAgICA9PiBbXSwKICAgICAgICAlcCwKICAgIH0sICRjbGFzczsKCiAgICAkc2VsZi0+X3JlY29yZF9jYWxsZXJfZGF0YSgpOwoKICAgIHJldHVybiAkc2VsZjsKfQoKc3ViIF9yZWNvcmRfY2FsbGVyX2RhdGEgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICBteSAkZmlsdGVyID0gJHNlbGYtPntmaWx0ZXJfZnJhbWVzX2Vhcmx5fSAmJiAkc2VsZi0+X21ha2VfZnJhbWVfZmlsdGVyKCk7CgogICAgIyBXZSBleGNsdWRlIHRoaXMgbWV0aG9kIGJ5IHN0YXJ0aW5nIGF0IGxlYXN0IG9uZSBmcmFtZSBiYWNrLgogICAgbXkgJHggPSAxICsgKCAkc2VsZi0+e3NraXBfZnJhbWVzfSB8fCAwICk7CgogICAgd2hpbGUgKAogICAgICAgIG15IEBjCiAgICAgICAgPSAkc2VsZi0+e25vX2FyZ3N9CiAgICAgICAgPyBjYWxsZXIoICR4KysgKQogICAgICAgIDogZG8gewogICAgICAgICAgICAjIyBubyBjcml0aWMgKE1vZHVsZXM6OlByb2hpYml0TXVsdGlwbGVQYWNrYWdlcywgVmFyaWFibGVzOjpQcm9oaWJpdFBhY2thZ2VWYXJzKQogICAgICAgICAgICBwYWNrYWdlICAgICMgdGhlIG5ld2xpbmUga2VlcHMgZHppbCBmcm9tIGFkZGluZyBhIHZlcnNpb24gaGVyZQogICAgICAgICAgICAgICAgREI7CiAgICAgICAgICAgIEBEQjo6YXJncyA9ICgpOwogICAgICAgICAgICBjYWxsZXIoICR4KysgKTsKICAgICAgICB9CiAgICAgICAgKSB7CgogICAgICAgIG15IEBhcmdzOwoKICAgICAgICAjIyBubyBjcml0aWMgKFZhcmlhYmxlczo6UHJvaGliaXRQYWNrYWdlVmFycykKICAgICAgICBAYXJncyA9ICRzZWxmLT57bm9fYXJnc30gPyAoKSA6IEBEQjo6YXJnczsKICAgICAgICAjIyB1c2UgY3JpdGljCgogICAgICAgIG15ICRyYXcgPSB7CiAgICAgICAgICAgIGNhbGxlciA9PiBcQGMsCiAgICAgICAgICAgIGFyZ3MgICA9PiBcQGFyZ3MsCiAgICAgICAgfTsKCiAgICAgICAgbmV4dCBpZiAkZmlsdGVyICYmICEkZmlsdGVyLT4oJHJhdyk7CgogICAgICAgIHVubGVzcyAoICRzZWxmLT57dW5zYWZlX3JlZl9jYXB0dXJlfSApIHsKICAgICAgICAgICAgJHJhdy0+e2FyZ3N9ID0gWyBtYXAgeyByZWYgJF8gPyAkc2VsZi0+X3JlZl90b19zdHJpbmcoJF8pIDogJF8gfQogICAgICAgICAgICAgICAgICAgIEB7ICRyYXctPnthcmdzfSB9IF07CiAgICAgICAgfQoKICAgICAgICBwdXNoIEB7ICRzZWxmLT57cmF3fSB9LCAkcmF3OwogICAgfQp9CgpzdWIgX3JlZl90b19zdHJpbmcgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRyZWYgID0gc2hpZnQ7CgogICAgcmV0dXJuIG92ZXJsb2FkOjpBZGRyUmVmKCRyZWYpCiAgICAgICAgaWYgYmxlc3NlZCAkcmVmICYmICRyZWYtPmlzYSgnRXhjZXB0aW9uOjpDbGFzczo6QmFzZScpOwoKICAgIHJldHVybiBvdmVybG9hZDo6QWRkclJlZigkcmVmKSB1bmxlc3MgJHNlbGYtPntyZXNwZWN0X292ZXJsb2FkfTsKCiAgICAjIyBubyBjcml0aWMgKFZhcmlhYmxlczo6UmVxdWlyZUluaXRpYWxpemF0aW9uRm9yTG9jYWxWYXJzKQogICAgbG9jYWwgJEA7CiAgICBsb2NhbCAkU0lHe19fRElFX199OwogICAgIyMgdXNlIGNyaXRpYwoKICAgIG15ICRzdHIgPSBldmFsIHsgJHJlZiAuIHF7fSB9OwoKICAgIHJldHVybiAkQCA/IG92ZXJsb2FkOjpBZGRyUmVmKCRyZWYpIDogJHN0cjsKfQoKc3ViIF9tYWtlX2ZyYW1lcyB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIG15ICRmaWx0ZXIgPSAhJHNlbGYtPntmaWx0ZXJfZnJhbWVzX2Vhcmx5fSAmJiAkc2VsZi0+X21ha2VfZnJhbWVfZmlsdGVyKCk7CgogICAgbXkgJHJhdyA9IGRlbGV0ZSAkc2VsZi0+e3Jhd307CiAgICBmb3IgbXkgJHIgKCBAeyRyYXd9ICkgewogICAgICAgIG5leHQgaWYgJGZpbHRlciAmJiAhJGZpbHRlci0+KCRyKTsKCiAgICAgICAgJHNlbGYtPl9hZGRfZnJhbWUoICRyLT57Y2FsbGVyfSwgJHItPnthcmdzfSApOwogICAgfQp9CgpteSAkZGVmYXVsdF9maWx0ZXIgPSBzdWIgezF9OwoKc3ViIF9tYWtlX2ZyYW1lX2ZpbHRlciB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIG15ICggQGlfcGFja19yZSwgJWlfY2xhc3MgKTsKICAgIGlmICggJHNlbGYtPntpZ25vcmVfcGFja2FnZX0gKSB7CiAgICAgICAgIyMgbm8gY3JpdGljIChWYXJpYWJsZXM6OlJlcXVpcmVJbml0aWFsaXphdGlvbkZvckxvY2FsVmFycykKICAgICAgICBsb2NhbCAkQDsKICAgICAgICBsb2NhbCAkU0lHe19fRElFX199OwogICAgICAgICMjIHVzZSBjcml0aWMKCiAgICAgICAgJHNlbGYtPntpZ25vcmVfcGFja2FnZX0gPSBbICRzZWxmLT57aWdub3JlX3BhY2thZ2V9IF0KICAgICAgICAgICAgdW5sZXNzIGV2YWwgeyBAeyAkc2VsZi0+e2lnbm9yZV9wYWNrYWdlfSB9IH07CgogICAgICAgIEBpX3BhY2tfcmUKICAgICAgICAgICAgPSBtYXAgeyByZWYgJF8gPyAkXyA6IHFyL15cUSRfXEUkLyB9IEB7ICRzZWxmLT57aWdub3JlX3BhY2thZ2V9IH07CiAgICB9CgogICAgbXkgJHAgPSBfX1BBQ0tBR0VfXzsKICAgIHB1c2ggQGlfcGFja19yZSwgcXIvXlxRJHBcRSQvOwoKICAgIGlmICggJHNlbGYtPntpZ25vcmVfY2xhc3N9ICkgewogICAgICAgICRzZWxmLT57aWdub3JlX2NsYXNzfSA9IFsgJHNlbGYtPntpZ25vcmVfY2xhc3N9IF0KICAgICAgICAgICAgdW5sZXNzIHJlZiAkc2VsZi0+e2lnbm9yZV9jbGFzc307CiAgICAgICAgJWlfY2xhc3MgPSBtYXAgeyAkXyA9PiAxIH0gQHsgJHNlbGYtPntpZ25vcmVfY2xhc3N9IH07CiAgICB9CgogICAgbXkgJHVzZXJfZmlsdGVyID0gJHNlbGYtPntmcmFtZV9maWx0ZXJ9OwoKICAgIHJldHVybiBzdWIgewogICAgICAgIHJldHVybiAwIGlmIGdyZXAgeyAkX1swXXtjYWxsZXJ9WzBdID1+IC8kXy8gfSBAaV9wYWNrX3JlOwogICAgICAgIHJldHVybiAwIGlmIGdyZXAgeyAkX1swXXtjYWxsZXJ9WzBdLT5pc2EoJF8pIH0ga2V5cyAlaV9jbGFzczsKCiAgICAgICAgaWYgKCR1c2VyX2ZpbHRlcikgewogICAgICAgICAgICByZXR1cm4gJHVzZXJfZmlsdGVyLT4oICRfWzBdICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gMTsKICAgIH07Cn0KCnN1YiBfYWRkX2ZyYW1lIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkYyAgICA9IHNoaWZ0OwogICAgbXkgJHAgICAgPSBzaGlmdDsKCiAgICAjIGV2YWwgYW5kIGlzX3JlcXVpcmUgYXJlIG9ubHkgcmV0dXJuZWQgd2hlbiBhcHBsaWNhYmxlIHVuZGVyIDUuMDA1MDMuCiAgICBwdXNoIEAkYywgKCB1bmRlZiwgdW5kZWYgKSBpZiBzY2FsYXIgQCRjID09IDY7CgogICAgcHVzaCBAeyAkc2VsZi0+e2ZyYW1lc30gfSwKICAgICAgICBEZXZlbDo6U3RhY2tUcmFjZTo6RnJhbWUtPm5ldygKICAgICAgICAkYywKICAgICAgICAkcCwKICAgICAgICAkc2VsZi0+e3Jlc3BlY3Rfb3ZlcmxvYWR9LAogICAgICAgICRzZWxmLT57bWF4X2FyZ19sZW5ndGh9LAogICAgICAgICRzZWxmLT57bWVzc2FnZX0sCiAgICAgICAgJHNlbGYtPntpbmRlbnR9CiAgICAgICAgKTsKfQoKc3ViIG5leHRfZnJhbWUgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICAjIHJlc2V0IHRvIHRvcCBpZiBuZWNlc3NhcnkuCiAgICAkc2VsZi0+e2luZGV4fSA9IC0xIHVubGVzcyBkZWZpbmVkICRzZWxmLT57aW5kZXh9OwoKICAgIG15IEBmID0gJHNlbGYtPmZyYW1lcygpOwogICAgaWYgKCBkZWZpbmVkICRmWyAkc2VsZi0+e2luZGV4fSArIDEgXSApIHsKICAgICAgICByZXR1cm4gJGZbICsrJHNlbGYtPntpbmRleH0gXTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRzZWxmLT57aW5kZXh9ID0gdW5kZWY7CiAgICAgICAgIyMgbm8gY3JpdGljIChTdWJyb3V0aW5lczo6UHJvaGliaXRFeHBsaWNpdFJldHVyblVuZGVmKQogICAgICAgIHJldHVybiB1bmRlZjsKICAgIH0KfQoKc3ViIHByZXZfZnJhbWUgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICBteSBAZiA9ICRzZWxmLT5mcmFtZXMoKTsKCiAgICAjIHJlc2V0IHRvIHRvcCBpZiBuZWNlc3NhcnkuCiAgICAkc2VsZi0+e2luZGV4fSA9IHNjYWxhciBAZiB1bmxlc3MgZGVmaW5lZCAkc2VsZi0+e2luZGV4fTsKCiAgICBpZiAoIGRlZmluZWQgJGZbICRzZWxmLT57aW5kZXh9IC0gMSBdICYmICRzZWxmLT57aW5kZXh9ID49IDEgKSB7CiAgICAgICAgcmV0dXJuICRmWyAtLSRzZWxmLT57aW5kZXh9IF07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAjIyBubyBjcml0aWMgKFN1YnJvdXRpbmVzOjpQcm9oaWJpdEV4cGxpY2l0UmV0dXJuVW5kZWYpCiAgICAgICAgJHNlbGYtPntpbmRleH0gPSB1bmRlZjsKICAgICAgICByZXR1cm4gdW5kZWY7CiAgICB9Cn0KCnN1YiByZXNldF9wb2ludGVyIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgJHNlbGYtPntpbmRleH0gPSB1bmRlZjsKCiAgICByZXR1cm47Cn0KCnN1YiBmcmFtZXMgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICBpZiAoQF8pIHsKICAgICAgICBkaWUKICAgICAgICAgICAgIkRldmVsOjpTdGFja1RyYWNlLT5mcmFtZXMoKSBjYW4gb25seSB0YWtlIERldmVsOjpTdGFja1RyYWNlOjpGcmFtZSBhcmdzXG4iCiAgICAgICAgICAgIGlmIGdyZXAgeyAhJF8tPmlzYSgnRGV2ZWw6OlN0YWNrVHJhY2U6OkZyYW1lJykgfSBAXzsKCiAgICAgICAgJHNlbGYtPntmcmFtZXN9ID0gXEBfOwogICAgICAgIGRlbGV0ZSAkc2VsZi0+e3Jhd307CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkc2VsZi0+X21ha2VfZnJhbWVzKCkgaWYgJHNlbGYtPntyYXd9OwogICAgfQoKICAgIHJldHVybiBAeyAkc2VsZi0+e2ZyYW1lc30gfTsKfQoKc3ViIGZyYW1lIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkaSAgICA9IHNoaWZ0OwoKICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkaTsKCiAgICByZXR1cm4gKCAkc2VsZi0+ZnJhbWVzKCkgKVskaV07Cn0KCnN1YiBmcmFtZV9jb3VudCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiBzY2FsYXIoICRzZWxmLT5mcmFtZXMoKSApOwp9CgpzdWIgYXNfc3RyaW5nIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkcCAgICA9IHNoaWZ0OwoKICAgIG15ICRzdCAgICA9IHF7fTsKICAgIG15ICRmaXJzdCA9IDE7CiAgICBmb3JlYWNoIG15ICRmICggJHNlbGYtPmZyYW1lcygpICkgewogICAgICAgICRzdCAuPSAkZi0+YXNfc3RyaW5nKCAkZmlyc3QsICRwICkgLiAiXG4iOwogICAgICAgICRmaXJzdCA9IDA7CiAgICB9CgogICAgcmV0dXJuICRzdDsKfQoKewogICAgIyMgbm8gY3JpdGljIChNb2R1bGVzOjpQcm9oaWJpdE11bHRpcGxlUGFja2FnZXMsIENsYXNzSGllcmFyY2hpZXM6OlByb2hpYml0RXhwbGljaXRJU0EpCiAgICBwYWNrYWdlICAgICMgaGlkZSBmcm9tIFBBVVNFCiAgICAgICAgRGV2ZWw6OlN0YWNrVHJhY2VGcmFtZTsKCiAgICBvdXIgQElTQSA9ICdEZXZlbDo6U3RhY2tUcmFjZTo6RnJhbWUnOwp9CgoxOwoKIyBBQlNUUkFDVDogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIHN0YWNrIHRyYWNlCgpfX0VORF9fCgo9cG9kCgo9aGVhZDEgTkFNRQoKRGV2ZWw6OlN0YWNrVHJhY2UgLSBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgc3RhY2sgdHJhY2UKCj1oZWFkMSBWRVJTSU9OCgp2ZXJzaW9uIDIuMDEKCj1oZWFkMSBTWU5PUFNJUwoKICB1c2UgRGV2ZWw6OlN0YWNrVHJhY2U7CgogIG15ICR0cmFjZSA9IERldmVsOjpTdGFja1RyYWNlLT5uZXcoKTsKCiAgcHJpbnQgJHRyYWNlLT5hc19zdHJpbmcoKTsgIyBsaWtlIGNhcnAKCiAgIyBmcm9tIHRvcCAobW9zdCByZWNlbnQpIG9mIHN0YWNrIHRvIGJvdHRvbS4KICB3aGlsZSAoIG15ICRmcmFtZSA9ICR0cmFjZS0+bmV4dF9mcmFtZSgpICkgewogICAgICBwcmludCAiSGFzIGFyZ3NcbiIgaWYgJGZyYW1lLT5oYXNhcmdzKCk7CiAgfQoKICAjIGZyb20gYm90dG9tIChsZWFzdCByZWNlbnQpIG9mIHN0YWNrIHRvIHRvcC4KICB3aGlsZSAoIG15ICRmcmFtZSA9ICR0cmFjZS0+cHJldl9mcmFtZSgpICkgewogICAgICBwcmludCAiU3ViOiAiLCAkZnJhbWUtPnN1YnJvdXRpbmUoKSwgIlxuIjsKICB9Cgo9aGVhZDEgREVTQ1JJUFRJT04KClRoZSBDPERldmVsOjpTdGFja1RyYWNlPiBtb2R1bGUgY29udGFpbnMgdHdvIGNsYXNzZXMsIEMsRGV2ZWw6OlN0YWNrVHJhY2U+IGFuZApMPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4uIFRoZXNlIG9iamVjdHMgZW5jYXBzdWxhdGUgdGhlIGluZm9ybWF0aW9uIHRoYXQKY2FuIHJldHJpZXZlZCB2aWEgUGVybCdzIEM8Y2FsbGVyKCk+IGZ1bmN0aW9uLCBhcyB3ZWxsIGFzIHByb3ZpZGluZyBhIHNpbXBsZQppbnRlcmZhY2UgdG8gdGhpcyBkYXRhLgoKVGhlIEM8RGV2ZWw6OlN0YWNrVHJhY2U+IG9iamVjdCBjb250YWlucyBhIHNldCBvZiBDPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4Kb2JqZWN0cywgb25lIGZvciBlYWNoIGxldmVsIG9mIHRoZSBzdGFjay4gVGhlIGZyYW1lcyBjb250YWluIGFsbCB0aGUgZGF0YQphdmFpbGFibGUgZnJvbSBDPGNhbGxlcigpPi4KClRoaXMgY29kZSB3YXMgY3JlYXRlZCB0byBzdXBwb3J0IG15IEw8RXhjZXB0aW9uOjpDbGFzczo6QmFzZT4gY2xhc3MgKHBhcnQgb2YKTDxFeGNlcHRpb246OkNsYXNzPikgYnV0IG1heSBiZSB1c2VmdWwgaW4gb3RoZXIgY29udGV4dHMuCgo9ZW5jb2RpbmcgVVRGLTgKCj1oZWFkMSAnVE9QJyBBTkQgJ0JPVFRPTScgT0YgVEhFIFNUQUNLCgpXaGVuIGRlc2NyaWJpbmcgdGhlIG1ldGhvZHMgb2YgdGhlIHRyYWNlIG9iamVjdCwgSSB1c2UgdGhlIHdvcmRzICd0b3AnIGFuZAonYm90dG9tJy4gSW4gdGhpcyBjb250ZXh0LCB0aGUgJ3RvcCcgZnJhbWUgb24gdGhlIHN0YWNrIGlzIHRoZSBtb3N0IHJlY2VudApmcmFtZSBhbmQgdGhlICdib3R0b20nIGlzIHRoZSBsZWFzdCByZWNlbnQuCgpIZXJlJ3MgYW4gZXhhbXBsZToKCiAgZm9vKCk7ICAjIGJvdHRvbSBmcmFtZSBpcyBoZXJlCgogIHN1YiBmb28gewogICAgIGJhcigpOwogIH0KCiAgc3ViIGJhciB7CiAgICAgRGV2ZWw6OlN0YWNrVHJhY2UtPm5ldygpOyAgIyB0b3AgZnJhbWUgaXMgaGVyZS4KICB9Cgo9aGVhZDEgTUVUSE9EUwoKVGhpcyBjbGFzcyBwcm92aWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKCj1oZWFkMiBEZXZlbDo6U3RhY2tUcmFjZS0+bmV3KCVuYW1lZF9wYXJhbXMpCgpSZXR1cm5zIGEgbmV3IERldmVsOjpTdGFja1RyYWNlIG9iamVjdC4KClRha2VzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKCj1vdmVyIDQKCj1pdGVtICogZnJhbWVfZmlsdGVyID0+ICRzdWIKCkJ5IGRlZmF1bHQsIERldmVsOjpTdGFja1RyYWNlIHdpbGwgaW5jbHVkZSBhbGwgc3RhY2sgZnJhbWVzIGJlZm9yZSB0aGUKY2FsbCB0byBpdHMgY29uc3RydWN0b3IuCgpIb3dldmVyLCB5b3UgbWF5IHdhbnQgdG8gZmlsdGVyIG91dCBzb21lIGZyYW1lcyB3aXRoIG1vcmUgZ3JhbnVsYXJpdHkKdGhhbiAnaWdub3JlX3BhY2thZ2UnIG9yICdpZ25vcmVfY2xhc3MnIGFsbG93LgoKWW91IGNhbiBwcm92aWRlIGEgc3Vicm91dGluZSB3aGljaCBpcyBjYWxsZWQgd2l0aCB0aGUgcmF3IGZyYW1lIGRhdGEKZm9yIGVhY2ggZnJhbWUuIFRoaXMgaXMgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIHR3byBrZXlzLCAiY2FsbGVyIiwgYW5kCiJhcmdzIiwgYm90aCBvZiB3aGljaCBhcmUgYXJyYXkgcmVmZXJlbmNlcy4gVGhlICJjYWxsZXIiIGtleSBpcyB0aGUKcmF3IGRhdGEgYXMgcmV0dXJuZWQgYnkgUGVybCdzIEM8Y2FsbGVyKCk+IGZ1bmN0aW9uLCBhbmQgdGhlICJhcmdzIgprZXkgYXJlIHRoZSBzdWJyb3V0aW5lIGFyZ3VtZW50cyBmb3VuZCBpbiBDPEBEQjo6YXJncz4uCgpUaGUgZmlsdGVyIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhbWUgc2hvdWxkIGJlIGluY2x1ZGVkLCBvcgpmYWxzZSBpZiBpdCBzaG91bGQgYmUgc2tpcHBlZC4KCj1pdGVtICogZmlsdGVyX2ZyYW1lc19lYXJseSA9PiAkYm9vbGVhbgoKSWYgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgQzxmcmFtZV9maWx0ZXI+IHdpbGwgYmUgY2FsbGVkIGFzIHNvb24gYXMgdGhlCnN0YWNrdHJhY2UgaXMgY3JlYXRlZCwgYW5kIGJlZm9yZSByZWZzIGFyZSBzdHJpbmdpZmllZCAoaWYKQzx1bnNhZmVfcmVmX2NhcHR1cmU+IGlzIG5vdCBzZXQpLCByYXRoZXIgdGhhbiBiZWluZyBmaWx0ZXJlZCBsYXppbHkgd2hlbgpMPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4gb2JqZWN0cyBhcmUgZmlyc3QgbmVlZGVkLgoKVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gZmlsdGVyIGJhc2VkIG9uIHRoZSBmcmFtZSdzIGFyZ3VtZW50cyBhbmQgd2FudAp0byBiZSBhYmxlIHRvIGV4YW1pbmUgb2JqZWN0IHByb3BlcnRpZXMsIGZvciBleGFtcGxlLgoKPWl0ZW0gKiBpZ25vcmVfcGFja2FnZSA9PiAkcGFja2FnZV9uYW1lIE9SIFxAcGFja2FnZV9uYW1lcwoKQW55IGZyYW1lcyB3aGVyZSB0aGUgcGFja2FnZSBpcyBvbmUgb2YgdGhlc2UgcGFja2FnZXMgd2lsbCBub3QgYmUgb24KdGhlIHN0YWNrLgoKPWl0ZW0gKiBpZ25vcmVfY2xhc3MgPT4gJHBhY2thZ2VfbmFtZSBPUiBcQHBhY2thZ2VfbmFtZXMKCkFueSBmcmFtZXMgd2hlcmUgdGhlIHBhY2thZ2UgaXMgYSBzdWJjbGFzcyBvZiBvbmUgb2YgdGhlc2UgcGFja2FnZXMKKG9yIGlzIHRoZSBzYW1lIHBhY2thZ2UpIHdpbGwgbm90IGJlIG9uIHRoZSBzdGFjay4KCkRldmVsOjpTdGFja1RyYWNlIGludGVybmFsbHkgYWRkcyBpdHNlbGYgdG8gdGhlICdpZ25vcmVfcGFja2FnZScKcGFyYW1ldGVyLCBtZWFuaW5nIHRoYXQgdGhlIERldmVsOjpTdGFja1RyYWNlIHBhY2thZ2UgaXMgQjxBTFdBWVM+Cmlnbm9yZWQuIEhvd2V2ZXIsIGlmIHlvdSBjcmVhdGUgYSBzdWJjbGFzcyBvZiBEZXZlbDo6U3RhY2tUcmFjZSBpdAp3aWxsIG5vdCBiZSBpZ25vcmVkLgoKPWl0ZW0gKiBza2lwX2ZyYW1lcyA9PiAkaW50ZWdlcgoKVGhpcyB3aWxsIGNhdXNlIHRoaXMgbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBleGNsdWRlZCBmcm9tIHRvcCBvZiB0aGUKc3RhY2sgdHJhY2UuIFRoaXMgcHJldmVudHMgdGhlIGZyYW1lcyBmcm9tIGJlaW5nIGNhcHR1cmVkIGF0IGFsbCwgYW5kIGFwcGxpZXMKYmVmb3JlIHRoZSBDPGZyYW1lX2ZpbHRlcj4sIEM8aWdub3JlX3BhY2thZ2U+LCBvciBDPGlnbm9yZV9jbGFzcz4gb3B0aW9ucywKZXZlbiB3aXRoIEM8ZmlsdGVyX2ZyYW1lc19lYXJseT4uCgo9aXRlbSAqIHVuc2FmZV9yZWZfY2FwdHVyZSA9PiAkYm9vbGVhbgoKSWYgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlbiBEZXZlbDo6U3RhY2tUcmFjZSB3aWxsIHN0b3JlCnJlZmVyZW5jZXMgaW50ZXJuYWxseSB3aGVuIGdlbmVyYXRpbmcgc3RhY2t0cmFjZSBmcmFtZXMuCgpCPFRoaXMgb3B0aW9uIGlzIHZlcnkgZGFuZ2Vyb3VzLCBhbmQgc2hvdWxkIG5ldmVyIGJlIHVzZWQgd2l0aCBleGNlcHRpb24Kb2JqZWN0cz4uIFVzaW5nIHRoaXMgb3B0aW9uIHdpbGwga2VlcCBhbnkgb2JqZWN0cyBvciByZWZlcmVuY2VzIGFsaXZlIHBhc3QKdGhlaXIgbm9ybWFsIGxpZmV0aW1lLCB1bnRpbCB0aGUgc3RhY2sgdHJhY2Ugb2JqZWN0IGdvZXMgb3V0IG9mIHNjb3BlLiBJdCBjYW4Ka2VlcCBvYmplY3RzIGFsaXZlIGV2ZW4gYWZ0ZXIgdGhlaXIgQzxERVNUUk9ZPiBzdWIgaXMgY2FsbGVkLCByZXN1bHRpbmcgaXQgaXQKYmVpbmcgY2FsbGVkIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIG9iamVjdC4KCklmIG5vdCBzZXQsIERldmVsOjpTdGFja1RyYWNlIHJlcGxhY2VzIGFueSByZWZlcmVuY2VzIHdpdGggdGhlaXIgc3RyaW5naWZpZWQKcmVwcmVzZW50YXRpb24uCgo9aXRlbSAqIG5vX2FyZ3MgPT4gJGJvb2xlYW4KCklmIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIHRoZW4gRGV2ZWw6OlN0YWNrVHJhY2Ugd2lsbCBub3Qgc3RvcmUgY2FsbGVyCmFyZ3VtZW50cyBpbiBzdGFjayB0cmFjZSBmcmFtZXMgYXQgYWxsLgoKPWl0ZW0gKiByZXNwZWN0X292ZXJsb2FkID0+ICRib29sZWFuCgpCeSBkZWZhdWx0LCBEZXZlbDo6U3RhY2tUcmFjZSB3aWxsIGNhbGwgQzxvdmVybG9hZDo6QWRkclJlZigpPiB0byBnZXQKdGhlIHVuZGVybHlpbmcgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdCwgaW5zdGVhZCBvZgpyZXNwZWN0aW5nIHRoZSBvYmplY3QncyBzdHJpbmdpZmljYXRpb24gb3ZlcmxvYWRpbmcuIElmIHlvdSB3b3VsZApwcmVmZXIgdG8gc2VlIHRoZSBvdmVybG9hZGVkIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdHMgaW4gc3RhY2sKdHJhY2VzLCB0aGVuIHNldCB0aGlzIHBhcmFtZXRlciB0byB0cnVlLgoKPWl0ZW0gKiBtYXhfYXJnX2xlbmd0aCA9PiAkaW50ZWdlcgoKQnkgZGVmYXVsdCwgRGV2ZWw6OlN0YWNrVHJhY2Ugd2lsbCBkaXNwbGF5IHRoZSBlbnRpcmUgYXJndW1lbnQgZm9yIGVhY2gKc3Vicm91dGluZSBjYWxsLiBTZXR0aW5nIHRoaXMgcGFyYW1ldGVyIGNhdXNlcyB0cnVuY2F0ZXMgZWFjaCBzdWJyb3V0aW5lCmFyZ3VtZW50J3Mgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGlmIGl0IGlzIGxvbmdlciB0aGFuIHRoaXMgbnVtYmVyIG9mCmNoYXJhY3RlcnMuCgo9aXRlbSAqIG1lc3NhZ2UgPT4gJHN0cmluZwoKQnkgZGVmYXVsdCwgRGV2ZWw6OlN0YWNrVHJhY2Ugd2lsbCB1c2UgJ1RyYWNlIGJlZ3VuJyBhcyB0aGUgbWVzc2FnZSBmb3IgdGhlCmZpcnN0IHN0YWNrIGZyYW1lIHdoZW4geW91IGNhbGwgQzxhc19zdHJpbmc+LiBZb3UgY2FuIHN1cHBseSBhbiBhbHRlcm5hdGl2ZQptZXNzYWdlIHVzaW5nIHRoaXMgb3B0aW9uLgoKPWl0ZW0gKiBpbmRlbnQgPT4gJGJvb2xlYW4KCklmIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIGVhY2ggc3RhY2sgZnJhbWUgYWZ0ZXIgdGhlIGZpcnN0IHdpbGwgc3RhcnQgd2l0aCBhCnRhYiBjaGFyYWN0ZXIsIGp1c3QgbGlrZSBDPENhcnA6OmNvbmZlc3MoKT4uCgo9YmFjawoKPWhlYWQyICR0cmFjZS0+bmV4dF9mcmFtZSgpCgpSZXR1cm5zIHRoZSBuZXh0IEw8RGV2ZWw6OlN0YWNrVHJhY2U6OkZyYW1lPiBvYmplY3Qgb24gdGhlIHN0YWNrLCBnb2luZwpkb3duLiBJZiB0aGlzIG1ldGhvZCBoYXNuJ3QgYmVlbiBjYWxsZWQgYmVmb3JlIGl0IHJldHVybnMgdGhlIGZpcnN0IGZyYW1lLiBJdApyZXR1cm5zIEM8dW5kZWY+IHdoZW4gaXQgcmVhY2hlcyB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayBhbmQgdGhlbiByZXNldHMgaXRzCnBvaW50ZXIgc28gdGhlIG5leHQgY2FsbCB0byBDPDwgJHRyYWNlLT5uZXh0X2ZyYW1lKCkgPj4gb3IgQzw8CiR0cmFjZS0+cHJldl9mcmFtZSgpID4+IHdpbGwgd29yayBwcm9wZXJseS4KCj1oZWFkMiAkdHJhY2UtPnByZXZfZnJhbWUoKQoKUmV0dXJucyB0aGUgbmV4dCBMPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4gb2JqZWN0IG9uIHRoZSBzdGFjaywgZ29pbmcgdXAuIElmCnRoaXMgbWV0aG9kIGhhc24ndCBiZWVuIGNhbGxlZCBiZWZvcmUgaXQgcmV0dXJucyB0aGUgbGFzdCBmcmFtZS4gSXQgcmV0dXJucwp1bmRlZiB3aGVuIGl0IHJlYWNoZXMgdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kIHRoZW4gcmVzZXRzIGl0cyBwb2ludGVyIHNvIHRoZQpuZXh0IGNhbGwgdG8gQzw8ICR0cmFjZS0+bmV4dF9mcmFtZSgpID4+IG9yIEM8PCAkdHJhY2UtPnByZXZfZnJhbWUoKSA+PiB3aWxsCndvcmsgcHJvcGVybHkuCgo9aGVhZDIgJHRyYWNlLT5yZXNldF9wb2ludGVyCgpSZXNldHMgdGhlIHBvaW50ZXIgc28gdGhhdCB0aGUgbmV4dCBjYWxsIHRvIEM8PCAkdHJhY2UtPm5leHRfZnJhbWUoKSA+PiBvciBDPDwKJHRyYWNlLT5wcmV2X2ZyYW1lKCkgPj4gd2lsbCBzdGFydCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgc3RhY2ssIGFzCmFwcHJvcHJpYXRlLgoKPWhlYWQyICR0cmFjZS0+ZnJhbWVzKCkKCldoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCBpdCByZXR1cm5zIGEgbGlzdCBvZgpMPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4gb2JqZWN0cy4gVGhleSBhcmUgcmV0dXJuZWQgaW4gb3JkZXIgZnJvbSB0b3AgKG1vc3QKcmVjZW50KSB0byBib3R0b20uCgpUaGlzIG1ldGhvZCBjYW4gYWxzbyBiZSB1c2VkIHRvIHNldCB0aGUgb2JqZWN0J3MgZnJhbWVzIGlmIHlvdSBwYXNzIGl0IGEgbGlzdApvZiBMPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4gb2JqZWN0cy4KClRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGZpbHRlciB0aGUgbGlzdCBvZiBmcmFtZXMgaW4gd2F5cyB0aGF0IGFyZSBtb3JlCmNvbXBsZXggdGhhbiBjYW4gYmUgaGFuZGxlZCBieSB0aGUgQzw8ICR0cmFjZS0+ZmlsdGVyX2ZyYW1lcygpID4+IG1ldGhvZDoKCiAgJHN0YWNrdHJhY2UtPmZyYW1lcyggbXlfZmlsdGVyKCAkc3RhY2t0cmFjZS0+ZnJhbWVzKCkgKSApOwoKPWhlYWQyICR0cmFjZS0+ZnJhbWUoJGluZGV4KQoKR2l2ZW4gYW4gaW5kZXgsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHJlbGV2YW50IGZyYW1lLCBvciB1bmRlZiBpZiB0aGVyZSBpcwpubyBmcmFtZSBhdCB0aGF0IGluZGV4LiBUaGUgaW5kZXggaXMgZXhhY3RseSBsaWtlIGEgUGVybCBhcnJheS4gVGhlIGZpcnN0CmZyYW1lIGlzIDAgYW5kIG5lZ2F0aXZlIGluZGV4ZXMgYXJlIGFsbG93ZWQuCgo9aGVhZDIgJHRyYWNlLT5mcmFtZV9jb3VudCgpCgpSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSB0cmFjZSBvYmplY3QuCgo9aGVhZDIgJHRyYWNlLT5hc19zdHJpbmcoXCVwKQoKQ2FsbHMgQzw8ICRmcmFtZS0+YXNfc3RyaW5nKCkgPj4gb24gZWFjaCBmcmFtZSBmcm9tIHRvcCB0byBib3R0b20sIHByb2R1Y2luZwpvdXRwdXQgcXVpdGUgc2ltaWxhciB0byB0aGUgQ2FycCBtb2R1bGUncyBjbHVjay9jb25mZXNzIG1ldGhvZHMuCgpUaGUgb3B0aW9uYWwgQzxcJXA+IHBhcmFtZXRlciBvbmx5IGhhcyBvbmUgb3B0aW9uLiBUaGUgQzxtYXhfYXJnX2xlbmd0aD4KcGFyYW1ldGVyIHRydW5jYXRlcyBlYWNoIHN1YnJvdXRpbmUgYXJndW1lbnQncyBzdHJpbmcgcmVwcmVzZW50YXRpb24gaWYgaXQgaXMKbG9uZ2VyIHRoYW4gdGhpcyBudW1iZXIgb2YgY2hhcmFjdGVycy4KCj1oZWFkMSBTVVBQT1JUCgpQbGVhc2Ugc3VibWl0IGJ1Z3MgdG8gdGhlIENQQU4gUlQgc3lzdGVtIGF0Cmh0dHA6Ly9ydC5jcGFuLm9yZy9Ob0F1dGgvUmVwb3J0QnVnLmh0bWw/UXVldWU9RGV2ZWwlM0ElM0FTdGFja1RyYWNlCm9yIHZpYSBlbWFpbCBhdCBidWctZGV2ZWwtc3RhY2t0cmFjZUBydC5jcGFuLm9yZy4KCj1oZWFkMSBBVVRIT1IKCkRhdmUgUm9sc2t5IDxhdXRhcmNoQHVydGgub3JnPgoKPWhlYWQxIENPTlRSSUJVVE9SUwoKPWZvciBzdG9wd29yZHMgRGFnZmlubiBJbG1hcmkgTWFubnPDpWtlciBEYXZpZCBDYW50cmVsbCBHcmFoYW0gS25vcCBNYXJrIEZvd2xlciBSaWNhcmRvIFNpZ25lcwoKPW92ZXIgNAoKPWl0ZW0gKgoKRGFnZmlubiBJbG1hcmkgTWFubnPDpWtlciA8aWxtYXJpQGlsbWFyaS5vcmc+Cgo9aXRlbSAqCgpEYXZpZCBDYW50cmVsbCA8ZGF2aWRAY2FudHJlbGwub3JnLnVrPgoKPWl0ZW0gKgoKR3JhaGFtIEtub3AgPGhhYXJnQGhhYXJnLm9yZz4KCj1pdGVtICoKCk1hcmsgRm93bGVyIDxtYXJrQHR3b3Nob3J0cGxhbmtzLmNvbT4KCj1pdGVtICoKClJpY2FyZG8gU2lnbmVzIDxyamJzQGNwYW4ub3JnPgoKPWJhY2sKCj1oZWFkMSBDT1BZUklHSFQgQU5EIExJQ0VOU0UKClRoaXMgc29mdHdhcmUgaXMgQ29weXJpZ2h0IChjKSAyMDAwIC0gMjAxNiBieSBEYXZpZCBSb2xza3kuCgpUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGxpY2Vuc2VkIHVuZGVyOgoKICBUaGUgQXJ0aXN0aWMgTGljZW5zZSAyLjAgKEdQTCBDb21wYXRpYmxlKQoKPWN1dAo=
cGFja2FnZSBEZXZlbDo6U3RhY2tUcmFjZTo6RnJhbWU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJFZFUlNJT04gPSAnMi4wMSc7CgojIENyZWF0ZSBhY2Nlc3NvciByb3V0aW5lcwpCRUdJTiB7CiAgICAjIyBubyBjcml0aWMgKFRlc3RpbmdBbmREZWJ1Z2dpbmc6OlByb2hpYml0Tm9TdHJpY3QpCiAgICBubyBzdHJpY3QgJ3JlZnMnOwogICAgZm9yZWFjaCBteSAkZiAoCiAgICAgICAgcXcoIHBhY2thZ2UgZmlsZW5hbWUgbGluZSBzdWJyb3V0aW5lIGhhc2FyZ3MKICAgICAgICB3YW50YXJyYXkgZXZhbHRleHQgaXNfcmVxdWlyZSBoaW50cyBiaXRtYXNrIGFyZ3MgKQogICAgICAgICkgewogICAgICAgIG5leHQgaWYgJGYgZXEgJ2FyZ3MnOwogICAgICAgICp7JGZ9ID0gc3ViIHsgbXkgJHMgPSBzaGlmdDsgcmV0dXJuICRzLT57JGZ9IH07CiAgICB9Cn0KCnsKICAgIG15IEBmaWVsZHMgPSAoCiAgICAgICAgcXcoIHBhY2thZ2UgZmlsZW5hbWUgbGluZSBzdWJyb3V0aW5lIGhhc2FyZ3Mgd2FudGFycmF5CiAgICAgICAgICAgIGV2YWx0ZXh0IGlzX3JlcXVpcmUgaGludHMgYml0bWFzayApCiAgICApOwoKICAgIHN1YiBuZXcgewogICAgICAgIG15ICRwcm90byA9IHNoaWZ0OwogICAgICAgIG15ICRjbGFzcyA9IHJlZiAkcHJvdG8gfHwgJHByb3RvOwoKICAgICAgICBteSAkc2VsZiA9IGJsZXNzIHt9LCAkY2xhc3M7CgogICAgICAgIEB7JHNlbGZ9e0BmaWVsZHN9ID0gQHsgc2hpZnQoKSB9OwoKICAgICAgICAjIGZpeHVwIHVuaXgtc3R5bGUgcGF0aHMgb24gd2luMzIKICAgICAgICAkc2VsZi0+e2ZpbGVuYW1lfSA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCggJHNlbGYtPntmaWxlbmFtZX0gKTsKCiAgICAgICAgJHNlbGYtPnthcmdzfSA9IHNoaWZ0OwoKICAgICAgICAkc2VsZi0+e3Jlc3BlY3Rfb3ZlcmxvYWR9ID0gc2hpZnQ7CgogICAgICAgICRzZWxmLT57bWF4X2FyZ19sZW5ndGh9ID0gc2hpZnQ7CgogICAgICAgICRzZWxmLT57bWVzc2FnZX0gPSBzaGlmdDsKCiAgICAgICAgJHNlbGYtPntpbmRlbnR9ID0gc2hpZnQ7CgogICAgICAgIHJldHVybiAkc2VsZjsKICAgIH0KfQoKc3ViIGFyZ3MgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gQHsgJHNlbGYtPnthcmdzfSB9Owp9CgpzdWIgYXNfc3RyaW5nIHsKICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgbXkgJGZpcnN0ID0gc2hpZnQ7CiAgICBteSAkcCAgICAgPSBzaGlmdDsKCiAgICBteSAkc3ViID0gJHNlbGYtPnN1YnJvdXRpbmU7CgogICAgIyBUaGlzIGNvZGUgc3RvbGVuIHN0cmFpZ2h0IGZyb20gQ2FycC5wbSBhbmQgdGhlbiB0d2Vha2VkLiAgQWxsCiAgICAjIGVycm9ycyBhcmUgcHJvYmFibHkgbXkgZmF1bHQgIC1kYXZlCiAgICBpZiAoJGZpcnN0KSB7CiAgICAgICAgJHN1YgogICAgICAgICAgICA9IGRlZmluZWQgJHNlbGYtPnttZXNzYWdlfQogICAgICAgICAgICA/ICRzZWxmLT57bWVzc2FnZX0KICAgICAgICAgICAgOiAnVHJhY2UgYmVndW4nOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgQnVpbGQgYSBzdHJpbmcsICRzdWIsIHdoaWNoIG5hbWVzIHRoZSBzdWItcm91dGluZSBjYWxsZWQuCiAgICAgICAgIyBUaGlzIG1heSBhbHNvIGJlICJyZXF1aXJlIC4uLiIsICJldmFsICcuLi4nIG9yICJldmFsIHsuLi59IgogICAgICAgIGlmICggbXkgJGV2YWwgPSAkc2VsZi0+ZXZhbHRleHQgKSB7CiAgICAgICAgICAgIGlmICggJHNlbGYtPmlzX3JlcXVpcmUgKSB7CiAgICAgICAgICAgICAgICAkc3ViID0gInJlcXVpcmUgJGV2YWwiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJGV2YWwgPX4gcy8oW1xcXCddKS9cXCQxL2c7CiAgICAgICAgICAgICAgICAkc3ViID0gImV2YWwgJyRldmFsJyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkc3ViIGVxICcoZXZhbCknICkgewogICAgICAgICAgICAkc3ViID0gJ2V2YWwgey4uLn0nOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGVyZSBhcmUgYW55IGFyZ3VtZW50cyBpbiB0aGUgc3ViLXJvdXRpbmUgY2FsbCwgZm9ybWF0CiAgICAgICAgIyB0aGVtIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IHZhcmlhYmxlcyBkZWZpbmVkIGVhcmxpZXIgaW4KICAgICAgICAjIHRoaXMgZmlsZSBhbmQgam9pbiB0aGVtIG9udG8gdGhlICRzdWIgc3ViLXJvdXRpbmUgc3RyaW5nCiAgICAgICAgIwogICAgICAgICMgV2UgY29weSB0aGVtIGJlY2F1c2UgdGhleSdyZSBnb2luZyB0byBiZSBtb2RpZmllZC4KICAgICAgICAjCiAgICAgICAgaWYgKCBteSBAYSA9ICRzZWxmLT5hcmdzICkgewogICAgICAgICAgICBmb3IgKEBhKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgYXJncyB0byB0aGUgc3RyaW5nICJ1bmRlZiIgaWYgdW5kZWZpbmVkCiAgICAgICAgICAgICAgICB1bmxlc3MgKCBkZWZpbmVkICRfICkgewogICAgICAgICAgICAgICAgICAgICRfID0gJ3VuZGVmJzsKICAgICAgICAgICAgICAgICAgICBuZXh0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgaGFjayEKICAgICAgICAgICAgICAgICMjIG5vIGNyaXRpYyAoU3Vicm91dGluZXM6OlByb3RlY3RQcml2YXRlU3VicykKICAgICAgICAgICAgICAgICRfID0gJHNlbGYtPkRldmVsOjpTdGFja1RyYWNlOjpfcmVmX3RvX3N0cmluZygkXykKICAgICAgICAgICAgICAgICAgICBpZiByZWYgJF87CiAgICAgICAgICAgICAgICAjIyB1c2UgY3JpdGljOwoKICAgICAgICAgICAgICAgICMjIG5vIGNyaXRpYyAoVmFyaWFibGVzOjpSZXF1aXJlSW5pdGlhbGl6YXRpb25Gb3JMb2NhbFZhcnMpCiAgICAgICAgICAgICAgICBsb2NhbCAkU0lHe19fRElFX199OwogICAgICAgICAgICAgICAgbG9jYWwgJEA7CiAgICAgICAgICAgICAgICAjIyB1c2UgY3JpdGljOwoKICAgICAgICAgICAgICAgICMjIG5vIGNyaXRpYyAoRXJyb3JIYW5kbGluZzo6UmVxdWlyZUNoZWNraW5nUmV0dXJuVmFsdWVPZkV2YWwpCiAgICAgICAgICAgICAgICBldmFsIHsKICAgICAgICAgICAgICAgICAgICBteSAkbWF4X2FyZ19sZW5ndGgKICAgICAgICAgICAgICAgICAgICAgICAgPSBleGlzdHMgJHAtPnttYXhfYXJnX2xlbmd0aH0KICAgICAgICAgICAgICAgICAgICAgICAgPyAkcC0+e21heF9hcmdfbGVuZ3RofQogICAgICAgICAgICAgICAgICAgICAgICA6ICRzZWxmLT57bWF4X2FyZ19sZW5ndGh9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRtYXhfYXJnX2xlbmd0aAogICAgICAgICAgICAgICAgICAgICAgICAmJiBsZW5ndGggJF8gPiAkbWF4X2FyZ19sZW5ndGggKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICMjIG5vIGNyaXRpYyAoQnVpbHRpbkZ1bmN0aW9uczo6UHJvaGliaXRMdmFsdWVTdWJzdHIpCiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJF8sICRtYXhfYXJnX2xlbmd0aCApID0gJy4uLic7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzLycvXFwnL2c7CgogICAgICAgICAgICAgICAgICAgICMgJ3F1b3RlJyBhcmcgdW5sZXNzIGl0IGxvb2tzIGxpa2UgYSBudW1iZXIKICAgICAgICAgICAgICAgICAgICAkXyA9ICInJF8nIiB1bmxlc3MgL14tP1tcZC5dKyQvOwoKICAgICAgICAgICAgICAgICAgICAjIHByaW50IGNvbnRyb2wvaGlnaCBBU0NJSSBjaGFycyBhcyAnTS08Y2hhcj4nIG9yICdePGNoYXI+JwogICAgICAgICAgICAgICAgICAgIHMvKFtcMjAwLVwzNzddKS9zcHJpbnRmKCJNLSVjIixvcmQoJDEpJjAxNzcpL2VnOwogICAgICAgICAgICAgICAgICAgIHMvKFtcMC1cMzdcMTc3XSkvc3ByaW50ZigiXiVjIixvcmQoJDEpXjY0KS9lZzsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAjIyB1c2UgY3JpdGljCgogICAgICAgICAgICAgICAgaWYgKCBteSAkZSA9ICRAICkgewogICAgICAgICAgICAgICAgICAgICRfID0gJGUgPX4gL21hbGZvcm1lZCB1dGYtOC9pID8gJyhiYWQgdXRmLTgpJyA6ICc/JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhcHBlbmQgKCdhbGwnLCAndGhlJywgJ2FyZ3VtZW50cycpIHRvIHRoZSAkc3ViIHN0cmluZwogICAgICAgICAgICAkc3ViIC49ICcoJyAuIGpvaW4oICcsICcsIEBhICkgLiAnKSc7CiAgICAgICAgICAgICRzdWIgLj0gJyBjYWxsZWQnOwogICAgICAgIH0KICAgIH0KCiAgICAjIElmIHRoZSB1c2VyIG9wdGVkIGludG8gaW5kZW50YXRpb24gKGEgbGEgQ2FycDo6Y29uZmVzcyksIHByZS1hZGQgYSB0YWIKICAgIG15ICR0YWIgPSAkc2VsZi0+e2luZGVudH0gJiYgISRmaXJzdCA/ICJcdCIgOiBxe307CgogICAgcmV0dXJuICIke3RhYn0kc3ViIGF0ICIgLiAkc2VsZi0+ZmlsZW5hbWUgLiAnIGxpbmUgJyAuICRzZWxmLT5saW5lOwp9CgoxOwoKIyBBQlNUUkFDVDogQSBzaW5nbGUgZnJhbWUgaW4gYSBzdGFjayB0cmFjZQoKX19FTkRfXwoKPXBvZAoKPWhlYWQxIE5BTUUKCkRldmVsOjpTdGFja1RyYWNlOjpGcmFtZSAtIEEgc2luZ2xlIGZyYW1lIGluIGEgc3RhY2sgdHJhY2UKCj1oZWFkMSBWRVJTSU9OCgp2ZXJzaW9uIDIuMDEKCj1oZWFkMSBERVNDUklQVElPTgoKU2VlIEw8RGV2ZWw6OlN0YWNrVHJhY2U+IGZvciBkZXRhaWxzLgoKPWZvciBQb2Q6OkNvdmVyYWdlIG5ldwoKPWhlYWQxIE1FVEhPRFMKClNlZSBQZXJsJ3MgQzxjYWxsZXIoKT4gZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB3aGF0IHRoZXNlCm1ldGhvZHMgcmV0dXJuLgoKPWhlYWQyICRmcmFtZS0+cGFja2FnZSgpCgo9aGVhZDIgJGZyYW1lLT5maWxlbmFtZSgpCgo9aGVhZDIgJGZyYW1lLT5saW5lKCkKCj1oZWFkMiAkZnJhbWUtPnN1YnJvdXRpbmUoKQoKPWhlYWQyICRmcmFtZS0+aGFzYXJncygpCgo9aGVhZDIgJGZyYW1lLT53YW50YXJyYXkoKQoKPWhlYWQyICRmcmFtZS0+ZXZhbHRleHQoKQoKUmV0dXJucyB1bmRlZiBpZiB0aGUgZnJhbWUgd2FzIG5vdCBwYXJ0IG9mIGFuIGV2YWwuCgo9aGVhZDIgJGZyYW1lLT5pc19yZXF1aXJlKCkKClJldHVybnMgdW5kZWYgaWYgdGhlIGZyYW1lIHdhcyBub3QgcGFydCBvZiBhIHJlcXVpcmUuCgo9aGVhZDIgJGZyYW1lLT5hcmdzKCkKClJldHVybnMgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZyYW1lLiAgTm90ZSB0aGF0IGFueSBhcmd1bWVudHMgdGhhdCBhcmUKcmVmZXJlbmNlcyBhcmUgcmV0dXJuZWQgYXMgcmVmZXJlbmNlcywgbm90IGNvcGllcy4KCj1oZWFkMiAkZnJhbWUtPmhpbnRzKCkKCj1oZWFkMiAkZnJhbWUtPmJpdG1hc2soKQoKPWhlYWQyICRmcmFtZS0+YXNfc3RyaW5nKCkKClJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmcmFtZS4KCj1oZWFkMSBBVVRIT1IKCkRhdmUgUm9sc2t5IDxhdXRhcmNoQHVydGgub3JnPgoKPWhlYWQxIENPUFlSSUdIVCBBTkQgTElDRU5TRQoKVGhpcyBzb2Z0d2FyZSBpcyBDb3B5cmlnaHQgKGMpIDIwMDAgLSAyMDE2IGJ5IERhdmlkIFJvbHNreS4KClRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgbGljZW5zZWQgdW5kZXI6CgogIFRoZSBBcnRpc3RpYyBMaWNlbnNlIDIuMCAoR1BMIENvbXBhdGlibGUpCgo9Y3V0Cg==
cGFja2FnZSBUZXh0Ojp2RmlsZTo6YXNEYXRhOwp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cm5vIHdhcm5pbmdzICd1bmluaXRpYWxpemVkJzsKdXNlIGJhc2UgcXcoIENsYXNzOjpBY2Nlc3Nvcjo6Q2hhaW5lZDo6RmFzdCApOwpfX1BBQ0tBR0VfXy0+bWtfYWNjZXNzb3JzKHF3KCBwcmVzZXJ2ZV9wYXJhbXMgKSk7Cm91ciAkVkVSU0lPTiA9ICcwLjA4JzsKCj1oZWFkMSBOQU1FCgpUZXh0Ojp2RmlsZTo6YXNEYXRhIC0gcGFyc2UgdkZpbGUgZm9ybWF0dGVkIGZpbGVzIGludG8gZGF0YSBzdHJ1Y3R1cmVzCgo9aGVhZDEgU1lOT1BTSVMKCiAgdXNlIFRleHQ6OnZGaWxlOjphc0RhdGE7CiAgb3BlbiBteSAkZmgsICJmb28uaWNzIgogICAgb3IgZGllICJjb3VsZG4ndCBvcGVuIGljczogJCEiOwogIG15ICRkYXRhID0gVGV4dDo6dkZpbGU6OmFzRGF0YS0+bmV3LT5wYXJzZSggJGZoICk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KClRleHQ6OnZGaWxlOjphc0RhdGEgcmVhZHMgdkZpbGUgZm9ybWF0IGZpbGVzLCBzdWNoIGFzIHZDYXJkIChSRkMgMjQyNikgYW5kCnZDYWxlbmRhciAoUkZDIDI0NDUpLgoKPWN1dAoKc3ViIF91bndyYXBfbGluZXMgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15IEBsaW5lczsKICAgIGZvciAoQF8pIHsKICAgICAgICBteSAkbGluZSA9ICRfOyAjICRfIG1heSBiZSByZWFkb25seQogICAgICAgICRsaW5lID1+IHN7W1xyXG5dKyR9e307ICMgbGluZXMgU0hPVUxEIGVuZCBDUkxGCiAgICAgICAgaWYgKCRsaW5lID1+IC9eWyBcdF0oLiopLykgeyAjIENvbnRpbnVhdGlvbiBsaW5lIChSRkMgU2VjdC4gNC4xKQogICAgICAgICAgICBkaWUgIkNvbnRpbnVhdGlvbiBsaW5lLCBidXQgbm8gcHJlY2VkaW5nIGxpbmUiIHVubGVzcyBAbGluZXM7CiAgICAgICAgICAgICRsaW5lc1stMV0gLj0gJDE7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQogICAgICAgIHB1c2ggQGxpbmVzLCAkbGluZTsKICAgIH0KICAgIHJldHVybiBAbGluZXM7Cn0KCnN1YiBwYXJzZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGZoID0gc2hpZnQ7CiAgICByZXR1cm4gJHNlbGYtPnBhcnNlX2xpbmVzKCA8JGZoPiApOwp9CgojIGxpa2UgVGV4dDo6UGFyc2VXb3JkcycgcGFyc2VfbGluZSwgb25seSBDLXN0eWxlIHNvIHRoZSByZWdleCBlbmdpbmUgZG9lc24ndAojIGJsb3cgaXRzIHN0YWNrLCBhbmQgaXQncyBhbHNvIGdvdCBhICRsaW1pdCBsaWtlIHNwbGl0CgojIHRoaXMgb25seSB0b29rIGEgdHJhaW5yaWRlLCBzbyBJJ20gcHJldHR5IHN1cmUgdGhlcmUgYXJlIGx1cmtpbmcKIyBjb3JuZXIgY2FzZXMgLSB3aGVuIEkgZ2V0IGEgdHVpdCBJJ2xsIHRha2UgdGhlIFRleHQ6OlBhcnNlV29yZHMKIyB0ZXN0cyBhbmQgcnVuIHRoZW0gdGhyb3VnaCBpdAoKc3ViIHBhcnNlX2xpbmUgewogICAgbXkgKCRkZWxpbSwgJGtlZXAsICR0ZXh0LCAkbGltaXQpID0gQF87CgogICAgbXkgKCRjdXJyZW50LCBAcGFydHMpOwogICAgbXkgKCRxdW90ZSwgJGVzY2FwZWQpOwogICAgd2hpbGUgKGxlbmd0aCAkdGV4dCkgewogICAgICAgIGlmICgkdGV4dCA9fiBze14oXFwpfXt9KSB7CiAgICAgICAgICAgICRjdXJyZW50IC49ICQxIGlmICRlc2NhcGVkIHx8ICRrZWVwOwogICAgICAgICAgICAkZXNjYXBlZCA9ICEkZXNjYXBlZDsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CiAgICAgICAgaWYgKCEkcXVvdGUgJiYgISRlc2NhcGVkICYmICR0ZXh0ID1+IHN7XiRkZWxpbX17fSkgewogICAgICAgICAgICBwdXNoIEBwYXJ0cywgJGN1cnJlbnQ7CiAgICAgICAgICAgICRjdXJyZW50ID0gdW5kZWY7CiAgICAgICAgICAgIGlmIChkZWZpbmVkICRsaW1pdCAmJiBAcGFydHMgPT0gJGxpbWl0IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQHBhcnRzLCAkdGV4dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIyBwdWxsIHRoZSBjaGFyYWN0ZXIgb2ZmIHRvIHRha2UgYSBsb29rc2VlCiAgICAgICAgICAgICR0ZXh0ID1+IHN7KC4pfXt9OwogICAgICAgICAgICBteSAkY2hhciA9ICQxOwogICAgICAgICAgICBpZiAoJGNoYXIgZXEgJyInICYmICEkZXNjYXBlZCkgewogICAgICAgICAgICAgICAgIyBlaXRoZXIgaXQncyBkZWZpbmVkIGFuZCBtYXRjaGVzLCBpbiB3aGljaCBjYXNlIHdlCiAgICAgICAgICAgICAgICAjIGNsZWFyIHRoZSBxdW90ZSB2YXJpYWJsZSwgb3IgaXQncyB1bmRlZmluZWQgd2hpY2gKICAgICAgICAgICAgICAgICMgbWFrZXMgdGhpcyBxdW90ZSBhbiBvcGVuaW5nIHF1b3RlCiAgICAgICAgICAgICAgICAkcXVvdGUgPSAhJHF1b3RlOwogICAgICAgICAgICAgICAgJGN1cnJlbnQgLj0gJGNoYXIgaWYgJGtlZXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkY3VycmVudCAuPSAkY2hhcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkZXNjYXBlZCA9IDA7CiAgICB9CgogICAgcmV0dXJuIEBwYXJ0cywgJGN1cnJlbnQ7Cn0KCnN1YiBwYXJzZV9saW5lcyB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIG15IEBwYXRoOwogICAgbXkgJGN1cnJlbnQ7CiAgICBmb3IgKCRzZWxmLT5fdW53cmFwX2xpbmVzKCBAXyApKSB7CiAgICAgICAgIyBJZ25vcmUgbGVhZGluZyBvciB0cmFpbGluZyBibGFuayBsaW5lcyBhdCB0aGUgdG9wL2JvdHRvbSBvZiB0aGUKICAgICAgICAjIGlucHV0LiAgTm90IHN1cmUgYWJvdXQgY29tcGxldGVseSBibGFuayBsaW5lcyB3aXRoaW4gdGhlIGlucHV0CiAgICAgICAgbmV4dCBpZiBzY2FsYXIgQHBhdGggPT0gMCBhbmQgJF8gPX4gL15ccyokLzsKCiAgICAgICAgaWYgKC9eQkVHSU46KC4qKS9pKSB7CiAgICAgICAgICAgIHB1c2ggQHBhdGgsICRjdXJyZW50OwogICAgICAgICAgICAkY3VycmVudCA9IHsgdHlwZSA9PiAkMSB9OwogICAgICAgICAgICBwdXNoIEB7ICRwYXRoWy0xXXtvYmplY3RzfSB9LCAkY3VycmVudDsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CiAgICAgICAgaWYgKC9eRU5EOiguKikvaSkgewogICAgICAgICAgICBkaWUgIkVORCAkMSBpbiAkY3VycmVudC0+e3R5cGV9IgogICAgICAgICAgICAgIHVubGVzcyBsYyAkY3VycmVudC0+e3R5cGV9IGVxIGxjICQxOwogICAgICAgICAgICAkY3VycmVudCA9IHBvcCBAcGF0aDsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CgogICAgICAgICMgd2UnZCB1c2UgVGV4dDo6UGFyc2VXb3JkcyBoZXJlLCBidXQgaXQgbGlrZXMgdG8gc2VnZmF1bHQuCiAgICAgICAgbXkgKCRuYW1lLCAkdmFsdWUpID0gcGFyc2VfbGluZSggJzonLCAxLCAkXywgMik7CiAgICAgICAgJHZhbHVlID0gJycgdW5sZXNzIGRlZmluZWQgJHZhbHVlOwogICAgICAgIG15IEBwYXJhbXMgPSBwYXJzZV9saW5lKCAnOycsIDAsICRuYW1lICk7CiAgICAgICAgJG5hbWUgPSBzaGlmdCBAcGFyYW1zOwoKICAgICAgICAkdmFsdWUgPSB7IHZhbHVlID0+ICR2YWx1ZSB9OwoKICAgICAgICBmb3JlYWNoIG15ICRwYXJhbSAoQHBhcmFtcykgewogICAgICAgICAgICBteSAoJHBfbmFtZSwgJHBfdmFsdWUpID0gc3BsaXQgLz0vLCAkcGFyYW07CiAgICAgICAgICAgIHB1c2ggQHsgJHZhbHVlLT57cGFyYW1zfSB9LCB7ICRwX25hbWUgPT4gJHBfdmFsdWUgfQogICAgICAgICAgICAgIGlmICRzZWxmLT5wcmVzZXJ2ZV9wYXJhbXM7CiAgICAgICAgICAgICR2YWx1ZS0+e3BhcmFtfXsgJHBfbmFtZSB9ID0gJHBfdmFsdWU7CiAgICAgICAgfQogICAgICAgIHB1c2ggQHsgJGN1cnJlbnQtPntwcm9wZXJ0aWVzfXsgJG5hbWUgfSB9LCAkdmFsdWU7CiAgICB9CgogICAgIyBzb21ldGhpbmcgZGlkIGEgQkVHSU4gYnV0IG5vIEVORCAtIFRPRE8sIHVud2luZCB0aGlzIG5pY2VseSBhcwogICAgIyBpdCBtYXkgYmUgbW9yZSB0aGFuIG9uZSBsZXZlbAogICAgZGllICJCRUdJTiAkY3VycmVudC0+e3R5cGV9IHdpdGhvdXQgbWF0Y2hpbmcgRU5EIgogICAgICBpZiBAcGF0aDsKCiAgICByZXR1cm4gJGN1cnJlbnQ7Cn0KCiMgdGhpcyBtaWdodCBub3Qgc3RyaWN0bHkgY29tcGx5CnN1YiBnZW5lcmF0ZV9saW5lcyB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJHRoaXMgPSBzaGlmdDsKCiAgICBteSBAbGluZXM7CiAgICAjIFhYWCBhbGwgdGhlIGV4aXN0ZW5jZSBjaGVja3MgYXJlIHRvIHByZXZlbnQgYXV0by12aXZpZmljYXRpb24KICAgICMgYnJlYWtpbmcgaWZfZGlmZiB0ZXN0cyAtIGRvIHdlIG1pbmQsIG9yIHNob3VsZCB0aGUgZmllbGRzIGhhdmUgYmVlbgogICAgIyB0aGVyZSBhbnl3YXk/CgogICAgcHVzaCBAbGluZXMsICJCRUdJTjokdGhpcy0+e3R5cGV9IiBpZiBleGlzdHMgJHRoaXMtPnt0eXBlfTsKICAgIGlmIChleGlzdHMgJHRoaXMtPntwcm9wZXJ0aWVzfSkgewogICAgICAgIHdoaWxlIChteSAoJG5hbWUsICR2KSA9IGVhY2ggJXsgJHRoaXMtPntwcm9wZXJ0aWVzfSB9ICkgewogICAgICAgICAgICBmb3IgbXkgJHZhbHVlIChAJHYpIHsKICAgICAgICAgICAgICAgICMgWFhYIHNvIHdlJ3JlIHRha2luZyBwYXJhbXMgaW4gcHJlZmVyZW5jZSB0byBwYXJhbSwKICAgICAgICAgICAgICAgICMgbGV0J3MgYmUgc3VyZSB0byBkb2N1bWVudCB0aGF0IHdoZW4gd2UgZG9jdW1lbnQgdGhpcwogICAgICAgICAgICAgICAgIyBtZXRob2QKICAgICAgICAgICAgICAgIG15ICRwYXJhbSA9IGpvaW4gJzsnLCAnJywgbWFwIHsKICAgICAgICAgICAgICAgICAgICBteSAkaGFzaCA9ICRfOwogICAgICAgICAgICAgICAgICAgIG1hcCB7CiAgICAgICAgICAgICAgICAgICAgICAgICIkXyIgLiAoZGVmaW5lZCAkaGFzaC0+eyRffSA/ICAiPSIgLiAkaGFzaC0+eyRffSA6ICIiKQogICAgICAgICAgICAgICAgICAgIH0ga2V5cyAlJGhhc2gKICAgICAgICAgICAgICAgIH0gQHsgJHZhbHVlLT57cGFyYW1zfSB8fCBbICR2YWx1ZS0+e3BhcmFtfSBdIH07CiAgICAgICAgICAgICAgICBteSAkbGluZSA9ICIkbmFtZSRwYXJhbTokdmFsdWUtPnt2YWx1ZX0iOwogICAgICAgICAgICAgICAgIyB3cmFwcGluZywgYnV0IGRvbmUgdWdseQogICAgICAgICAgICAgICAgbXkgQGNodW5rcyA9ICRsaW5lID1+IG0vKC57MSw3Mn0pL2c7CiAgICAgICAgICAgICAgICBwdXNoIEBsaW5lcywgc2hpZnQgQGNodW5rczsKICAgICAgICAgICAgICAgIHB1c2ggQGxpbmVzLCBtYXAgeyAiICRfIiB9IEBjaHVua3M7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKGV4aXN0cyAkdGhpcy0+e29iamVjdHN9KSB7CiAgICAgICAgcHVzaCBAbGluZXMsICRzZWxmLT5nZW5lcmF0ZV9saW5lcyggJF8gKSBmb3IgQHsgJHRoaXMtPntvYmplY3RzfSB9CiAgICB9CiAgICBwdXNoIEBsaW5lcywgIkVORDokdGhpcy0+e3R5cGV9IiBpZiBleGlzdHMgJHRoaXMtPnt0eXBlfTsKICAgIHJldHVybiBAbGluZXM7Cn0KCgoxOwpfX0VORF9fCgo9aGVhZDEgREFUQSBTVFJVQ1RVUkUKCkEgdkZpbGUgY29udGFpbnMgb25lIG9yIG1vcmUgb2JqZWN0cywgZGVsaW1pdGVkIGJ5IEJFR0lOIGFuZCBFTkQgdGFncy4KCiAgQkVHSU46VkNBUkQKICAuLi4KICBFTkQ6VkNBUkQKCk9iamVjdHMgbWF5IGNvbnRhaW4gc3ViLW9iamVjdHM7CgogIEJFR0lOOlZDQUxFTkRBUgogIC4uLgogIEJFR0lOOlZFVkVOVAogIC4uLgogIEVORDpWRVZFTlQKICAuLi4KICBFTlY6VkNBTEVOREFSCgpFYWNoIG9iamVjdCBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzLiAgRWFjaCBwcm9wZXJ0eQpjb25zaXN0cyBvZiBhIG5hbWUsIHplcm8gb3IgbW9yZSBvcHRpb25hbCBwYXJhbWV0ZXJzLCBhbmQgdGhlbiBhCnZhbHVlLiAgVGhpcyBmcmFnbWVudDoKCiAgRFRTVEFSVDtWQUxVRT1EQVRFOjE5OTcwMzE3CgppZGVudGlmaWVzIGEgcHJvcGVydHkgd2l0aCB0aGUgbmFtZSwgQzxEU1RBUlQ+LCB0aGUgcGFyYW1ldGVyCkM8VkFMVUU+LCB3aGljaCBoYXMgdGhlIHZhbHVlIEM8REFURT4sIGFuZCB0aGUgcHJvcGVydHkncyB2YWx1ZSBpcwpDPDE5OTcwMzE3Pi4gIFRob3NlIG9mIHlvdSB3aXRoIGFuIFhNTCBiZW50IG1pZ2h0IGZpbmQgdGhpcyBtb3JlCnJlY29nbmlzYWJsZSBhczoKCiAgPGR0c3RhcnQgdmFsdWU9ImRhdGUiPjE5OTcwMzE3PC9kdHN0YXJ0PgoKVGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBDPHBhcnNlKCk+IG1ldGhvZCBpcyBhIGhhc2ggcmVmLgoKVGhlIHRvcCBsZXZlbCBrZXksIEM8b2JqZWN0cz4sIHJlZmVycyB0byBhbiBhcnJheSByZWYuICBFYWNoIGVudHJ5IGluIHRoZQphcnJheSByZWYgaXMgYSBoYXNoIHJlZiB3aXRoIHR3byBvciB0aHJlZSBrZXlzLgoKVGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBrZXksIEM8dHlwZT4sIGlzIGEgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlCnR5cGUgb2YgdGhlIG9iamVjdC4gIEUuZy4sIEM8VkNBUkQ+LCBDPFZFVkVOVD4sIGFuZCBzbyBvbi4KClRoZSB2YWx1ZSBvZiB0aGUgc2Vjb25kIGtleSwgQzxwcm9wZXJ0aWVzPiwgaXMgYSBoYXNoIHJlZiwgd2l0aCBwcm9wZXJ0eQpuYW1lcyBhcyBrZXlzLCBhbmQgYW4gYXJyYXkgcmVmIG9mIHRob3NlIHByb3BlcnR5IHZhbHVlcy4gIEl0J3MgYW4gYXJyYXkKcmVmLCBiZWNhdXNlIHNvbWUgcHJvcGVydGllcyBtYXkgYXBwZWFyIHdpdGhpbiBhbiBvYmplY3QgbXVsdGlwbGUgdGltZXMKd2l0aCBkaWZmZXJlbnQgdmFsdWVzLiAgRm9yIGV4YW1wbGU7CgogIEJFR0lOOlZFVkVOVAogIEFUVEVOREVFO0NOPSJOaWsgQ2xheXRvbiI6bWFpbHRvOm5pa0BGcmVlQlNELm9yZwogIEFUVEVOREVFO0NOPSJSaWNoYXJkIENsYW1wIjptYWlsdG86cmljaGFyZGNAdW5peGJlYXJkLm5ldAogIC4uLgogIEVORDpWRVZFTlQKCkVhY2ggZW50cnkgaW4gdGhlIGFycmF5IHJlZiBpcyBhIGhhc2ggcmVmIHdpdGggb25lIG9yIHR3byBrZXlzLgoKVGhlIGZpcnN0IGtleSwgQzx2YWx1ZT4sIGNvcnJlc3BvbmRzIHRvIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLgoKVGhlIHNlY29uZCBrZXksIEM8cGFyYW0+LCBjb250YWlucyBhIGhhc2ggcmVmIG9mIHRoZSBwcm9wZXJ0eSdzCnBhcmFtZXRlcnMuICBLZXlzIGluIHRoaXMgaGFzaCByZWYgYXJlIHRoZSBwYXJhbWV0ZXIncyBuYW1lLCB0aGUgdmFsdWUKaXMgdGhlIHBhcmFtZXRlcidzIHZhbHVlLiAgKElmIHlvdSBlbmFibGUgdGhlIEM8cHJlc2VydmVfcGFyYW1zPgpvcHRpb24gdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBrZXkgcG9wdWxhdGVkLCBjYWxsZWQgQzxwYXJhbXM+LiAgSXQgaXMKYW4gYXJyYXkgcmVmIG9mIGhhc2ggcmVmcywgZWFjaCBoYXNoIHJlZiBpcyB0aGUgcGFyYW1ldGVyJ3MgbmFtZSBhbmQKdGhlIHBhcmFtZXRlcidzIHZhbHVlIC0gdGhlc2UgYXJlIGNvbGxlY3RlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUKZW5jb3VudGVyZWQgdG8gcHJldmVudCBoYXNoIGNvbGxpc2lvbnMgYXMgc2VlbiBpbiBzb21lIHZDYXJkIGZpbGVzKQpsaW5lLikKClRoZSB0aGlyZCBrZXkgaW4gdGhlIHRvcCBsZXZlbCBDPG9iamVjdHM+IGhhc2ggcmVmIGlzIEM8b2JqZWN0cz4uICBJZgppdCBleGlzdHMsIGl0IGluZGljYXRlcyB0aGF0IHN1Yi1vYmplY3RzIHdlcmUgZm91bmQuICBUaGUgdmFsdWUgb2YKdGhpcyBrZXkgaXMgYW4gYXJyYXkgcmVmIG9mIHN1Yi1vYmplY3RzLCB3aXRoIGlkZW50aWNhbCBrZXlzIGFuZApiZWhhdmlvdXIgdG8gdGhhdCBvZiB0aGUgdG9wIGxldmVsIEM8b2JqZWN0cz4ga2V5LiAgVGhpcyByZWN1cnNpdmUKc3RydWN0dXJlIGNvbnRpbnVlcywgbmVzdGluZyBhcyBkZWVwbHkgYXMgdGhlcmUgd2VyZSBzdWItb2JqZWN0cyBpbgp0aGUgaW5wdXQgZmlsZS4KClRoZSBDPGJpbi92MnlhbWw+IHNjcmlwdCB0aGF0IGNvbWVzIHdpdGggdGhpcyBkaXN0cmlidXRpb24gZGlzcGxheXMgdGhlCmZvcm1hdCBvZiBhIHZGaWxlIGFzIFlBTUwuICBDPHQvMDN1c2FnZS50PiBoYXMgZXhhbXBsZXMgb2YgcGlja2luZyBvdXQKdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIGZyb20gdGhlIGRhdGEgc3RydWN0dXJlLgoKPWhlYWQxIEFVVEhPUlMKClJpY2hhcmQgQ2xhbXAgPHJpY2hhcmRjQHVuaXhiZWFyZC5uZXQ+IGFuZCBOaWsgQ2xheXRvbiA8bmlrQEZyZWVCU0Qub3JnPgoKPWhlYWQxIENPUFlSSUdIVAoKQ29weXJpZ2h0IDIwMDQsIDIwMTAsIDIwMTMgUmljaGFyZCBDbGFtcCBhbmQgTmlrIENsYXl0b24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CmFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCgo9aGVhZDEgQ0FWRUFUUwoKV2UgZG9uJ3QgZG8gYW55IGRlY29kaW5nIG9mIHByb3BlcnR5IHZhbHVlcywgaW5jbHVkaW5nIGRlc2NhcGluZwpDPFwsPiwgd2UncmUgc3RpbGwgdW5kZWNpZGVkIGFzIHRvIHdoZXRoZXIgdGhpcyBpcyBhIGJ1Zy4KCj1oZWFkMSBCVUdTCgpBc2lkZSBmcm9tIHRoZSBUT0RPIGxpc3QgaXRlbXMsIG5vbmUga25vd24uCgo9aGVhZDEgU0VFIEFMU08KClRleHQ6OnZGaWxlIC0gcGFyc2VzIHRvIG9iamVjdHMsIGRvZXNuJ3QgaGFuZGxlIG5lc3RlZCBpdGVtcwoKUkZDIDI0MjYgLSB2Q2FyZCBzcGVjaWZpY2F0aW9uCgpSRkMgMjQ0NSAtIHZDYWxlbmRhciBzcGVjaWZpY2F0aW9uCgo9Y3V0CgojIEVtYWNzIGxvY2FsIHZhcmlhYmxlcyB0byBrZWVwIHRoZSBzdHlsZSBjb25zaXN0ZW50CgogIExvY2FsIFZhcmlhYmxlczoKICBjcGVybC1pbmRlbnQtbGV2ZWw6IDQKICBFbmQ6Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnVmVyd2FsdHVuZyB2b24gVGVybWluYmVuYWNocmljaHRpZ3VuZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnSGllciBrw7ZubmVuIFNpZSBlaW5lIEtvbmZpZ3VyYXRpb25zZGF0ZWkgaG9jaGxhZGVuLCBtaXQgZGVyIFRlcm1pbmJlbmFjaHJpY2h0aWd1bmdlbiBpbSBTeXN0ZW0gaW1wb3J0aWVydCB3ZXJkZW4ga8O2bm5lbi4gRGllIERhdGVpIG11c3MgaW0gLnltbC1Gb3JtYXQgdm9ybGllZ2VuLCBzbyB3aWUgc2llIGF1Y2ggdm9tIFRlcm1pbmJlbmFjaHJpY2h0aWd1bmdzbW9kdWwgZXhwb3J0aWVydCB3aXJkLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ0hpZXIga8O2bm5lbiBTaWUgYXVzd8OkaGxlbiwgd2VsY2hlIEVyZWlnbmlzc2UgZGllc2UgQmVuYWNocmljaHRpZ3VuZyBhdXNsw7ZzZW4uIEVpbiB6dXPDpHR6bGljaGVyIFRlcm1pbmZpbHRlciBrYW5uIHdlaXRlciB1bnRlbiBlaW5nZXN0ZWxsdCB3ZXJkZW4sIHVtIGRpZSBCZW5hY2hyaWNodGlndW5nZW4gbnVyIGbDvHIgVGVybWluZSBtaXQgYmVzdGltbXRlbiBNZXJrbWFsZW4genUgdmVyc2VuZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdUZXJtaW5maWx0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ1RlYW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UnfSA9ICdSZXNvdXJjZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ051ciBlaW5tYWwgYW0gVGFnIHBybyBUZXJtaW4gdW5kIEJlbmFjaHJpY2h0aWd1bmdzLVRyYW5zcG9ydG1ldGhvZGUgdmVyc2VuZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ0JlbmFjaHJpY2h0aWd1bmdlbiB3dXJkZW4gYW4gZWluZW4gQWdlbnRlbiB2ZXJzZW5kZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICdEaWUgZXJzdGVuIDIwIFplaWNoZW4gZGVzIFRlcm1pbmJldHJlZmZzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ0RpZSBUZXJtaW4tQXR0cmlidXRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnRGllIEthbGVuZGVyLUF0dHJpYnV0ZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VuZGEgT3ZlcnZpZXcnfSA9ICdBZ2VuZGHDvGJlcnNpY2h0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdLYWxlbmRlciB2ZXJ3YWx0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnVGVybWluIGhpbnp1ZsO8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnRmFyYmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIGRhdGUnfSA9ICdFbmR6ZWl0cHVua3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwZWF0J30gPSAnV2llZGVyaG9sdW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ0tlaW5lIEthbGVuZGVyIGdlZnVuZGVuLiBCaXR0ZSBsZWdlbiBTaWUgenVlcnN0IGVpbmVuIEthbGVuZGVyIMO8YmVyIGRpZSBLYWxlbmRlcnZlcndhbHR1bmcgYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAnVGVybWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdEaWVzZXIgVGVybWluIHdpZWRlcmhvbHQgc2ljaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJ03DtmNodGVuIFNpZSBudXIgZGllc2VuIFRlcm1pbiBvZGVyIGFsbGUgVm9ya29tbW5pc3NlIGJlYXJiZWl0ZW4/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ0FsbGUgVm9ya29tbW5pc3NlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAnTnVyIGRpZXNlbiBUZXJtaW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgTWFuYWdlbWVudCd9ID0gJ0thbGVuZGVydmVyd2FsdHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ0thbGVuZGVyw7xiZXJzaWNodCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IENhbGVuZGFyJ30gPSAnRWluZW4gbmV1ZW4gS2FsZW5kZXIgYW5sZWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICdOZXVlbiBLYWxlbmRlciBhbmxlZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICdUZXJtaW5lIGltcG9ydGllcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ0thbGVuZGVyIGltcG9ydGllcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLid9ID0KICAgICAgICAnSGllciBrw7ZubmVuIFNpZSBlaW5lIEtvbmZpZ3VyYXRpb25zZGF0ZWkgaG9jaGxhZGVuLCB1bSBlaW5lbiBLYWxlbmRlciBpbiBJaHIgU3lzdGVtIHp1IGltcG9ydGllcmVuLiBEaWUgRGF0ZWkgbXVzcyBpbSAueW1sIEZvcm1hdCB2b3JsaWVnZW4sIHNvIHdpZSBzaWUgaW4gZGVyIEthbGVuZGVydmVyd2FsdHVuZyBleHBvcnRpZXJ0IHd1cmRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbid9ID0gJ0thbGVuZGVyLUtvbmZpZ3VyYXRpb24gaG9jaGxhZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBDYWxlbmRhcid9ID0gJ0thbGVuZGVyIGltcG9ydGllcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAnRmlsdGVyIGbDvHIgS2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwZW5kaW5nIG9uIHRoZSBncm91cCBmaWVsZCwgdGhlIHN5c3RlbSB3aWxsIGFsbG93IHVzZXJzIHRoZSBhY2Nlc3MgdG8gdGhlIGNhbGVuZGFyIGFjY29yZGluZyB0byB0aGVpciBwZXJtaXNzaW9uIGxldmVsLid9ID0KICAgICAgICAnQWJow6RuZ2lnIHZvbiBkZXIgR3J1cHBlbnp1Z2Vow7ZyaWdrZWl0IHdpcmQgZGFzIFN5c3RlbSBCZW51dHplcm4gZGVuIFp1Z3JpZmYgYW5oYW5kIGlocmVyIEJlcmVjaHRpZ3VuZ2VuIGVybGF1YmVuIGJ6dy4gdmVyd2VpZ2Vybi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCBvbmx5OiB1c2VycyBjYW4gc2VlIGFuZCBleHBvcnQgYWxsIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdSTzogQmVudXR6ZXIga8O2bm5lbiBUZXJtaW5lIHNlaGVuIHVuZCBLYWxlbmRlciBleHBvcnRpZXJlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBpbnRvOiB1c2VycyBjYW4gbW9kaWZ5IGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIsIGJ1dCB3aXRob3V0IGNoYW5naW5nIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24uJ30gPQogICAgICAgICdWZXJzY2hpZWJlbiBpbjogQmVudXR6ZXIga8O2bm5lbiBUZXJtaW5lIGlubmVyaGFsYiBlaW5lcyBLYWxlbmRlcnMgYmVhcmJlaXRlbiwgZGllc2UgamVkb2NoIG5pY2h0IGluIGFuZGVyZSBLYWxlbmRlciB2ZXJzY2hpZWJlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ0Vyc3RlbGxlbjogQmVudXR6ZXIga8O2bm5lbiBUZXJtaW5lIGltIEthbGVuZGVyIGVyc3RlbGxlbiB1bmQgbMO2c2NoZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICdSTzogQmVudXR6ZXIga8O2bm5lbiBkaWUgS2FsZW5kZXIgYW4gc2ljaCB2ZXJ3YWx0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdLYWxlbmRlciBleHBvcnRpZXJlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3dubG9hZCBjYWxlbmRhcid9ID0gJ0thbGVuZGVyIGhlcnVudGVybGFkZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAnw5ZmZmVudGxpY2hlIEthbGVuZGVyIFVSTCBrb3BpZXJlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBuYW1lJ30gPSAnS2FsZW5kZXJuYW1lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLid9ID0gJ0VpbiBLYWxlbmRlciBtaXQgZ2xlaWNoZW0gTmFtZW4gZXhpc3RpZXJ0IGJlcmVpdHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Blcm1pc3Npb24gZ3JvdXAnfSA9ICdCZXJlY2h0aWd1bmdzZ3J1cHBlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICdUaWNrZXQgVGVybWluZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAnUmVnZWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnVmVyd2VuZGVuIFNpZSBkaWUgZm9sZ2VuZGVuIE9wdGlvbmVuLCAgdW0gZWluenVncmVuemVuIHdlbGNoZSBUaWNrZXQtVGVybWluZSBhdXRvbWF0aXNjaCBlcnN0ZWxsdCB3ZXJkZW4gc29sbGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnQml0dGUgd8OkaGxlbiBTaWUgZWluZSBnw7xsdGlnZSBRdWV1ZSBhdXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhdHRyaWJ1dGVzJ30gPSAnU3VjaGF0dHJpYnV0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgcnVsZXMgZm9yIGNyZWF0aW5nIGF1dG9tYXRpYyBhcHBvaW50bWVudHMgaW4gdGhpcyBjYWxlbmRhciBiYXNlZCBvbiB0aWNrZXQgZGF0YS4nfSA9CiAgICAgICAgJ0RlZmluaXRpb24gdm9uIFJlZ2VsbiwgdW0gYXV0b21hdGlzY2ggVGVybWluZSBpbiBkaWVzZW0gS2FsZW5kZXIgenUgZXJzdGVsbGVuLCB3ZWxjaGUgYXVmIFRpY2tldGRhdGVuIGJhc2llcmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgUnVsZSd9ID0gJ1JlZ2VsIGhpbnp1ZsO8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vcmUnfSA9ICdNZWhyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xlc3MnfSA9ICdXZW5pZ2VyJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ0VpbmVuIG5ldWVuIFRlcm1pbiBhbmxlZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0thbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYW4gb3ZlcnZpZXcgcGFnZSBmb3IgdGhlIEFwcG9pbnRtZW50IENhbGVuZGFyLid9ID0gJ0RpZXMgaXN0IGVpbmUgw5xiZXJzaWNodCBmw7xyIGRpZSBUZXJtaW5rYWxlbmRlci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycyd9ID0gJ1p1dmllbGUgYWt0aXZlIEthbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBlaXRoZXIgdHVybiBzb21lIG9mZiBmaXJzdCBvciBpbmNyZWFzZSB0aGUgbGltaXQgaW4gY29uZmlndXJhdGlvbi4nfSA9CiAgICAgICAgJ0JpdHRlIGRlYWt0aXZpZXJlbiBTaWUgenVlcnN0IGVpbmlnZSBvZGVyIGVyaMO2aGVuIFNpZSBkYXMgTGltaXQgaW4gZGVyIEtvbmZpZ3VyYXRpb24uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICdXb2NoZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ1plaXRzdHJhaGwgTW9uYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ1plaXRzdHJhaGwgV29jaGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgRGF5J30gPSAnWmVpdHN0cmFobCBUYWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ1NwcmluZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICdWZXJ3ZXJmZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ0FuemVpZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Jhc2ljIGluZm9ybWF0aW9uJ30gPSAnR3J1bmRsZWdlbmRlIEluZm9ybWF0aW9uZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRGF0dW0vWmVpdCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBiZWZvcmUgRW5kIGRhdGUuJ30gPSAnQml0dGUgc2V0emVuIFNpZSBlaW5lbiBXZXJ0IHZvciBkZW0gRW5kZGF0dW0uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ0JpdHRlIHNldHplbiBTaWUgZWluZW4gV2VydCBuYWNoIGRlbSBTdGFydGRhdHVtLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAnRGllcyBpc3QgZWluIFZvcmtvbW1uaXMgZWluZXMgc2ljaCB3aWVkZXJob2xlbmRlbiBUZXJtaW5zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0tsaWNrZW4gU2llIGhpZXIsIHVtIGRlbiBFbHRlcm4tVGVybWluIGFuenV6ZWlnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0tsaWNrZW4gU2llIGhpZXIsIHVtIGRlbiBFbHRlcm4tVGVybWluIHp1IGJlYXJiZWl0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJ0ZyZXF1ZW56JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5J30gPSAnQWxsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnUmVsYXRpdmVyIFplaXRwdW5rdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJ30gPQogICAgICAgICdNw7ZjaHRlbiBTaWUgZGllc2VuIFRlcm1pbiB3aXJrbGljaCBsw7ZzY2hlbj8gRGllc2Ugw4RuZGVydW5nIGthbm4gbmljaHQgcsO8Y2tnw6RuZ2lnIGdlbWFjaHQgd2VyZGVuLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnVGVybWluZSBpbXBvcnRpZXJlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ0RpZSBob2NoZ2VsYWRlbmUgRGF0ZWkgbXVzcyBpbiBlaW5lbSBnw7xsdGlnZW4gaUNhbC1Gb3JtYXQgKC5pY3MpIHZvcmxpZWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgZGVzaXJlZCBDYWxlbmRhciBpcyBub3QgbGlzdGVkIGhlcmUsIHBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBhdCBsZWFzdCBcJ2NyZWF0ZVwnIHBlcm1pc3Npb25zLid9ID0KICAgICAgICAnU29sbHRlIGVpbiBnZXfDvG5zY2h0ZXIgS2FsZW5kZXIgaGllciBuaWNodCBhdWZnZWxpc3RldCBzZWluLCBzdGVsbGVuIFNpZSBiaXR0ZSBzaWNoZXIsIGRhc3MgU2llIG1pbmRlc3RlbnMgZGllIEJlcmVjaHRpZ3VuZyB6dW0gRXJzdGVsbGVuIHZvbiBLYWxlbmRlcm4gYmVzaXR6ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSBleGlzdGluZyBhcHBvaW50bWVudHM/J30gPSAnRXhpc3RpZXJlbmRlIFRlcm1pbmUgw7xiZXJzY2hyZWliZW4/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAnQWxsZSBleGlzdGllcmVuZGVuIFRlcm1pbmUgbWl0IGRlciBzZWxiZW4gIlVuaXF1ZUlEIiBpbSBlbnRzcHJlY2hlbmRlbiBLYWxlbmRlciB3ZXJkZW4gw7xiZXJzY2hyaWViZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ0thbGVuZGVyIGhvY2hsYWRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAnVGVybWluZSBpbXBvcnRpZXJlbic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICdOZXVlciBUZXJtaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ0RlbW7DpGNoc3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSBUYWdlJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJ0JlbmFjaHJpY2h0aWd1bmdzbmFtZSBleGlzdGllcnQgYmVyZWl0cyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgKHJlc291cmNlcyksIHdobyBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSBhcHBvaW50bWVudCd9ID0gJ0FnZW50ZW4gKFJlc291cmNlbiksIHdlbGNoZSBpbm5lcmhhbGIgZGVzIFRlcm1pbnMgYXVzZ2V3w6RobHQgd3VyZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ0FsbGUgQWdlbnRlbiBtaXQgKG1pbmRlc3RlbnMpIExlc2ViZXJlY2h0aWd1bmcgZsO8ciBkZW4gVGVybWluKGthbGVuZGVyKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ0FsbGUgQWdlbnRlbiBtaXQgU2NocmVpYmJlcmVjaHRpZ3VuZyBmw7xyIGRlbiBUZXJtaW4oa2FsZW5kZXIpJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICdEYXMgU3lzdGVtIGtvbm50ZW4gZGVuIEthbGVuZGVyIG5pY2h0IGVyc3RlbGxlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJ30gPSAnQml0dGUga29udGFrdGllcmVuIFNpZSBkZW4gQWRtaW5pc3RyYXRvci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdLZWluZSBDYWxlbmRlcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdTaWUgaGFiZW4ga2VpbmUgWnVncmlmZnNiZXJlY2h0aWd1bmcgYXVmIGRpZXNlbiBLYWxlbmRlciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ0thbGVuZGVyIGJlYXJiZWl0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3IgdXBkYXRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0ZlaGxlciBiZWltIEFrdHVhbGlzaWVyZW4gZGVzIEthbGVuZGVycyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ0thbGVuZGVyIEtvbmZpZ3VyYXRpb25zZGF0ZWkga29ubnRlIG5pY2h0IGdlbGVzZW4gd2VyZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICdCaXR0ZSBzdGVsbGVuIFNpZSBzaWNoZXIsIGRhc3MgZGllIERhdGVpIGfDvGx0aWcgaXN0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICdLYWxlbmRlciBrb25udGUgbmljaHQgaW1wb3J0aWVydCB3ZXJkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ0thbGVuZGVyIHd1cmRlIGltcG9ydGllcnQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICdDYWxlbmRhcklEIHdpcmQgYmVuw7Z0aWd0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJ0RhdGVuIGtvbm50ZW4gbmljaHQgYWJnZXJ1ZmVuIHdlcmRlbiBmw7xyIENhbGVuZGFySUQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ0VzIHd1cmRlKG4pICVzIFRlcm1pbihlKSBlcmZvbGdyZWljaCBpbiBLYWxlbmRlciAlcyBpbXBvcnRpZXJ0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUgTWludXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSBNaW51dGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnKzMwIE1pbnV0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzEgaG91cid9ID0gJysxIFN0dW5kZSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICdBbGxlIFRlcm1pbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJ30gPSAnTWlyIHp1Z2V3aWVzZW5lIFRlcm1pbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ0VzIHdlcmRlbiBudXIgVGVybWluZSBhbmdlemVpZ3QsIGRpZSBJaG5lbiB6dWdld2llc2VuIHNpbmQhIEVpbnN0ZWxsdW5nZW4gw6RuZGVybic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICdUZXJtaW4gd3VyZGUgbmljaHQgZ2VmdW5kZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAnTmllbWFscyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICdKZWRlbiBUYWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ0plZGUgV29jaGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICdKZWRlbiBNb25hdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBZZWFyJ30gPSAnSmVkZXMgSmFocic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICdCZW51dHplcmRlZmluaWVydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ3TDpGdsaWNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ3fDtmNoZW50bGljaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAnbW9uYXRsaWNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ2rDpGhybGljaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydldmVyeSd9ID0gJ2FsbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICdmw7xyICVzIFdpZWRlcmhvbHVuZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ2JpcyAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAnZsO8ciAuLi4gV2llZGVyaG9sdW5nZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgJXMnfSA9ICdiaXMgJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAnS2VpbmUgQmVuYWNocmljaHRpZ3VuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXMgTWludXRlKG4pIHZvcmhlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBob3VyKHMpIGJlZm9yZSd9ID0gJyVzIFN0dW5kZShuKSB2b3JoZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgZGF5KHMpIGJlZm9yZSd9ID0gJyVzIFRhZyhlKSB2b3JoZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgd2VlayBiZWZvcmUnfSA9ICclcyBXb2NoZShuKSB2b3JoZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICdiZXZvciBkZXIgVGVybWluIGJlZ2lubnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICduYWNoZGVtIGRlciBUZXJtaW4gYmVnb25uZW4gaGF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ2Jldm9yIGRlciBUZXJtaW4gZW5kZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAnbmFjaGRlbSBkZXIgVGVybWluIGdlZW5kZXQgaGF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAnS2VpbmUgQmVyZWNodGlndW5nISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBjb3VsZCBub3QgYmUgZGVsZXRlZCEnfSA9ICdMaW5rcyBrb25udGVuIG5pY2h0IGdlbMO2c2NodCB3ZXJkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgY291bGQgbm90IGJlIGNyZWF0ZWQhJ30gPSAnTGlua3Mga29ubnRlbiBuaWNodCBlcnN0ZWxsdCB3ZXJkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ1RpY2tldC1UZXJtaW4ga29ubnRlIG5pY2h0IGdlbMO2c2NodCB3ZXJkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ0tlaW5lIEJlcmVjaHRpZ3VuZyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAnS2VpbmUgQmVyZWNodGlndW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ0RhcyBTeXN0ZW0ga29ubnRlIGRpZSBEYXRlaSBuaWNodCBpbXBvcnRpZXJlbiEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJyslZCBtZWhyJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAnS2VpbiAlcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJ0tlaW4gQmVudXR6ZXIgZ2VmdW5kZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAnVW5nw7xsdGlnZXIgS2FsZW5kZXIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ1VuZ8O8bHRpZ2UgVVJMISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdFcyBpc3QgZWluIEZlaGxlciBiZWltIEV4cG9ydGllcmVuIGRlcyBLYWxlbmRlcnMgYXVmZ2V0cmV0ZW4hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAnQWt0dWFsaXNpZXJ1bmcgKE1pbnV0ZW4pJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICdUZXJtaW5rYWxlbmRlciDDnGJlcnNpY2h0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnMnfSA9ICdUZXJtaW5iZW5hY2hyaWNodGlndW5nZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgcHJlcGFyZXMgbm90aWZpY2F0aW9uIGVudHJpZXMgZm9yIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ1Rlcm1pbmthbGVuZGVyIEV2ZW50LU1vZHVsLCB3ZWxjaGVzIEJlbmFjaHJpY2h0aWd1bmdzZWludHLDpGdlIGbDvHIgVGVybWluZSB2b3JiZXJlaXRldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJ1Rlcm1pbi1LYWxlbmRlciBFdmVudG1vZHVsLCB3ZWxjaGVzIFRpY2tldHMgbWl0IERhdGVuIGF1cyBUaWNrZXQtVGVybWluZW4gYWt0dWFsaXNpZXJ0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICdUZXJtaW5iZWFyYmVpdHVuZ3NhbnNpY2h0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICdUZXJtaW5saXN0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ1Rlcm1pbmxpc3RlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnVGVybWluYmVuYWNocmljaHRpZ3VuZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ1Rlcm1pbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbWFuYWdlIHNjcmVlbi4nfSA9ICdLYWxlbmRlcnZlcndhbHR1bmdzYW5zaWNodCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICdGw7xyIHdlbGNoZSBWZXLDpG5kZXJ1bmdlbiBhbiBUZXJtaW5lbiBtw7ZjaHRlbiBTaWUgQmVuYWNocmljaHRpZ3VuZ2VuIGVyaGFsdGVuPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSBuZXcgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoaXMgdGlja2V0J30gPSAnRXJzdGVsbHQgZWluZW4gbmV1ZW4gVGVybWluIGluIGVpbmVtIEthbGVuZGVyLCB3ZWxjaGVyIGRpcmVrdCBtaXQgZGllc2VtIFRpY2tldCB2ZXJrbsO8cGZ0IGlzdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ1Rlcm1pbmJlbmFjaHJpY2h0aWd1bmdlbiBlcnN0ZWxsZW4gdW5kIHZlcndhbHRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICdFaW5lbiBuZXVlbiBUZXJtaW4gZXJzdGVsbGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAnTGVndCBmZXN0IHdlbGNoZSBTcGFsdGVuIGltIFRlcm1pbnZlcmtuw7xwZnVuZ3MtV2lkZ2V0IGFuZ2V6ZWlndCB3ZXJkZW4gKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gTcO2Z2xpY2hlIEVpbnN0ZWxsdW5nZW46IDAgPSBEZWFrdGl2aWVydCwgMSA9IFZlcmbDvGdiYXIsIDIgPSBTdGFuZGFyZG3DpMOfaWcgYWt0aXZpZXJ0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICdCZXNjaHJlaWJ0IGVpbiBTeW1ib2wgbWl0IFZlcmtuw7xwZnVuZyB6dXIgR29vZ2xlIE1hcHMgV2Vic2VpdGUgbWl0IGRlbSBha3R1ZWxsZW4gU3RhbmRvcnQgYWxzIGVudHNwcmVjaGVuZGVzIFppZWwgaW4gZGVyIFRlcm1pbmJlYXJiZWl0dW5ncy1PYmVyZmzDpGNoZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICdMZWd0IGRpZSBFdmVudC1PYmpla3R0eXBlbiBmZXN0LCB3ZWxjaGUgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCB2ZXJhcmJlaXRldCB3ZXJkZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLid9ID0KICAgICAgICAnTGVndCBkaWUgTGlzdGUgZGVyIFBhcmFtZXRlciBmZXN0LCB3ZWxjaGUgbWl0IGRlciBUaWNrZXRzdWNoZnVua3Rpb24gdmVyd2VuZGV0IHdlcmRlbiBrYW5uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuJ30gPQogICAgICAgICdCZXNjaHJlaWJ0IGRlbiBUaWNrZXQtVGVybWluLUJhY2tlbmQgVHlwIGbDvHIgRGF0dW0vVWhyemVpdCBkdXJjaCBkeW5hbWlzY2hlIEZlbGRlci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGVzY2FsYXRpb24gdGltZS4nfSA9CiAgICAgICAgJ0Jlc2NocmVpYnQgZGVuIFRpY2tldC1UZXJtaW4tQmFja2VuZCBUeXAgZsO8ciBUaWNrZXRlc2thbGF0aW9uZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICdCZXNjaHJlaWJ0IGRlbiBUaWNrZXQtVGVybWluLUJhY2tlbmQgVHlwIGbDvHIgVGlja2V0cGVuZGluZ3plaXRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJ0xlZ3QgZGFzIFRpY2tldC1QbHVnaW4gZsO8ciBUZXJtaW5lIGZlc3QuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJ0R5bmFtaWNGaWVsZF8lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAnVGVybWluIGJlYXJiZWl0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlyc3QgcmVzcG9uc2UgdGltZSd9ID0gJ1plaXQgZsO8ciBlcnN0ZSBSZWFrdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICdUZXJtaW4tSW1wb3J0IE9iZXJmbMOkY2hlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJ1Zlcmtuw7xwZnQgVGVybWluZSB1bmQgVGlja2V0cyBtaXQgZWluZW0gTGluayB2b20gVHlwICJOb3JtYWwiLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnTGlzdGUgYWxsZXIgVGVybWluLUV2ZW50cywgd2VsY2hlIGluIGRlciBHVUkgYW5nZXplaWd0IHdlcmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ0xpc3RlIGFsbGVyIEthbGVuZGVyZXJlaWduaXNzZSwgd2VsY2hlIGluIGRlciBncmFmaXNjaGVuIEJlbnV0emVyb2JlcmZsw6RjaGUgYW5nZXplaWd0IHdlcmRlbiBzb2xsZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAnTGlzdGUgYW4gRmFyYmVuIGluIEhleGFkZXppbWFsIFJHQiwgd2VsY2hlIHZlcnNjaGllZGVuZW4gQmVudXR6ZXJrYWxlbmRlcm4genVnZXdpZXNlbiB3ZXJkZW4uIFN0ZWxsZW4gU2llIHNpY2hlciwgZGFzcyBkaWUgRmFyYmVuIGR1bmtlbCBnZW51ZyBzaW5kLCB1bSB3ZWnDn2VuIFRleHQgZGFyYXVmIGRhcnp1c3RlbGxlbi4gU29mZXJuIGRpZSBBbnphaGwgZGVyIEthbGVuZGVyIGRpZSBBbnphaGwgZGVyIHZlcmbDvGdiYXJlbiBGYXJiZW4gw7xiZXJzY2hyZWl0ZXQsIHdpcmQgZGllc2UgTGlzdGUgZXJuZXV0IHZvbiBBbmZhbmcgYW4gZ2VudXR6dC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAnVmVyc2NoaWVkZW5lIEthbGVuZGVyIHZlcndhbHRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJ01heGltYWxlIEFuemFobCBhbiBha3RpdmVuIEthbGVuZGVybiBpbiBkZXIgS2FsZW5kZXLDvGJlcnNpY2h0IG9kZXIgUmVzb3VyY2Vuw7xiZXJzaWNodC4gQml0dGUgYmVhY2h0ZW4gU2llLCBkYXNzIHNpY2ggenV2aWVsZSBnbGVpY2h6ZWl0aWcgYWt0aXZlIEthbGVuZGVyIGF1ZmdydW5kIHZpZWxlciBnbGVpY2h6ZWl0aWdlciBBbmZyYWdlbiBhdWYgZGllIFBlcmZvcm1hbmNlIGRlcyBTeXN0ZW1zIGF1c3dpcmtlbiBrYW5uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICdPVFJTIHVudGVyc3TDvHR6dCBrZWluZSB3aWVkZXJob2xlbmRlbiBUZXJtaW5lIG9obmUgRW5kZGF0dW0gb2RlciBBbnphaGwgZGVyIER1cmNobMOkdWZlLiBXw6RocmVuZCBkZXMgSW1wb3J0aWVydW5nc3Byb3plc3NlcyBrYW5uIGVzIHZvcmtvbW1lbiwgZGFzcyBkaWUgZW50c3ByZWNoZW5kZSBJQ1MtRGF0ZWkgc29sY2hlIFRlcm1pbiBlbnRow6RsdC4gU3RhdHRkZXNzZW4gd2lyZCBkYXMgU3lzdGVtIGFsbGUgdmVyZ2FuZ2VuZW4gVGVybWluZSBlcnN0ZWxsZW4sIHNvd2llIHp1c8OkdHpsaWNoIFRlcm1pbmUgZsO8ciBkaWUga29tbWVuZGVuIG4gTW9uYXRlICgxMjAgTW9uYXRlIC8gMTAgSmFocmUgc3RhbmRhcmRtw6TDn2lnKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICfDnGJlcnNpY2h0IGFsbGVyIFRlcm1pbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAnV2FydGVuIGJpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoJ30gPSAnUGx1Z2luc3VjaGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICdNb2R1bGUgenVyIFBsdWdpbnN1Y2hlIGbDvHIgZGllIEF1dG92ZXJ2b2xsc3TDpG5kaWd1bmcuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBDYWxlbmRhcid9ID0gJ8OWZmZlbnRsaWNoZXIgS2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIGNhbGVuZGFyLid9ID0gJ8OWZmZlbnRsaWNoZXIgS2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICdSZXNvdXJjZW7DvGJlcnNpY2h0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSd9ID0gJ1Jlc291cmNlbsO8YmVyc2ljaHQgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSBmb3IgY3JlYXRpbmcgYSBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhlIHRpY2tldCBkaXJlY3RseSBmcm9tIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIEFkZGl0aW9uYWwgYWNjZXNzIGNvbnRyb2wgdG8gc2hvdyBvciBub3Qgc2hvdyB0aGlzIGxpbmsgY2FuIGJlIGRvbmUgYnkgdXNpbmcgS2V5ICJHcm91cCIgYW5kIENvbnRlbnQgbGlrZSAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBUbyBjbHVzdGVyIG1lbnUgaXRlbXMgdXNlIGZvciBLZXkgIkNsdXN0ZXJOYW1lIiBhbmQgZm9yIHRoZSBDb250ZW50IGFueSBuYW1lIHlvdSB3YW50IHRvIHNlZSBpbiB0aGUgVUkuIFVzZSAiQ2x1c3RlclByaW9yaXR5IiB0byBjb25maWd1cmUgdGhlIG9yZGVyIG9mIGEgY2VydGFpbiBjbHVzdGVyIHdpdGhpbiB0aGUgdG9vbGJhci4nfSA9CiAgICAgICAgJ1plaWd0IGVpbmVuIExpbmsgaW0gTWVuw7wgZGVyIFRpY2tldFpvb20tQW5zaWNodCBpbSBBZ2VudGVuLUludGVyZmFjZSBhbiwgdW0gVGVybWluZSB6dSBlcnN0ZWxsZW4sIHdlbGNoZSBkaXJla3QgbWl0IGRlbSBlbnRzcHJlY2hlbmRlbiBUaWNrZXQgdmVya27DvHBmdCBzaW5kLiBadXPDpHR6bGljaGUgWnVncmlmZnNrb250cm9sbGUsIG9iIGRlciBNZW7DvHB1bmt0IGFuZ2V6ZWlndCB3aXJkIG9kZXIgbmljaHQsIGthbm4gbWl0IGRlbSBTY2hsw7xzc2VsICJHcnVwcGUiIHVuZCAiSW5oYWx0IiB3aWUgei5CLiAoInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIikgZXJyZWljaHQgd2VyZGVuLiBVbSBNZW7DvGVpbnRyw6RnZSB6dSBncnVwcGllcmVuLCB2ZXJ3ZW5kZW4gU2llIGRlbiBTY2hsw7xzc2VsICJDbHVzdGVyTmFtZSIgdW5kIGltIEluaGFsdCBkZW4gTmFtZW4sIHdlbGNoZW4gU2llIGluIGRlciBBbnNpY2h0IHZlcndlbmRlbiBtw7ZjaHRlbi4gVmVyd2VuZGVuIFNpZSAiQ2x1c3RlclByaW9yaXR5IiB1bSBkaWUgUmVpaGVuZm9sZ2UgaW4gZGVyIGpld2VpbGlnZW4gR3J1cHBpZXJ1bmcgenUgYmVlaW5mbHVzc2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2x1dGlvbiB0aW1lJ30gPSAnTMO2c3VuZ3N6ZWl0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnVHJhbnNwb3J0YXVzd2FobCBmw7xyIFRlcm1pbmJlbmFjaHJpY2h0aWd1bmdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICdTdMO2w590IGRhcyBIaW56dWbDvGdlbiBvZGVyIEFrdHVhbGlzaWVyZW4gdm9uIGF1dG9tYXRpc2NoZW4gVGVybWluZW4gYW4sIGJhc2llcmVuZCBhdWYgVGlja2V0emVpdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ0FrdHVhbGlzaWVydW5nc3plaXQnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfQ09fT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnR2VzdGnDs24gZGUgTm90aWZpY2FjaW9uZXMgZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgdGhlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbiBtb2R1bGUuJ30gPQogICAgICAgICdBcXXDrSBlcyBwb3NpYmxlIGNhcmdhciB1biBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIHBhcmEgaW1wb3J0YXIgbGFzIG5vdGlmaWNhY2lvbmVzIGRlIGxhcyBjaXRhcyBhIHN1IHNpc3RlbWEuIEVsIGFyY2hpdm8gbmVjZXNpdGEgZXN0YXIgZW4gZWwgZm9ybWF0byAueW1sIGNvbW8gbG9zIGV4cG9ydGFkb3MgcG9yIGVsIG3Ds2R1bG8gZGUgbm90aWZpY2FjaW9uZXMgZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBlbGVnaXIgbG9zIGV2ZW50b3MgcXVlIGluaWNpYXLDoW4gZXN0YSBub3RpZmljYWNpw7NuLiBVbiBmaWx0cm8gYWRpY2lvbmFsIGRlIGxhIGNpdGEgc2UgcHVlZGUgYXBsaWNhciBhIGNvbnRpbnVhY2nDs24gcGFyYSBlbnZpYXIgc8OzbG8gcGFyYSBjaXRhcyBjb24gY2llcnRvcyBjcml0ZXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJ0ZpbHRybyBkZSBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAnRXF1aXBvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAnUmVjdXJzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ05vdGlmaWNhciBhbCB1c3VhcmlvIHNvbG8gdW5hIHZleiBhbCBkw61hIGFjZXJjYSBkZSB1bmEgc29sYSBjaXRhIHVzYW5kbyBlbCB0cmFuc3BvcnRlIHNlbGVjY2lvbmFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICdMYXMgbm90aWZpY2FjaW9uZXMgc2UgZW52w61hbiBhIHVuIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ1BhcmEgb2J0ZW5lciBsb3MgcHJpbWVyb3MgMjAgY2FyYWN0ZXJlcyBkZWwgdMOtdHVsbyBkZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAnUGFyYSBvYnRlbmVyIGVsIGF0cmlidXRvIGRlIGxhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICdQYXJhIG9idGVuZXIgZWwgYXRyaWJ1dG8gZGVsIGNhbGVuZGFyaW8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbmRhIE92ZXJ2aWV3J30gPSAnUmVzdW1lbiBkZSBsYSBBZ2VuZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ0dlc3Rpb25hciBDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICdBw7FhZGlyIENpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb3InfSA9ICdDb2xvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ0ZlY2hhIGRlIHTDqXJtaW5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ1JlcGV0aWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ05vIHNlIGVuY29udHJhcm9uIGNhbGVuZGFyaW8uIFBvciBmYXZvciBwcmltZXJvIGHDsWFkYSB1biBjYWxlbmRhcmlvIHV0aWxpemFkbyBsYSBwYWdpbmEgZGUgR2VzdGlvbmFyIENhbGVuZGFyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ0NpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ0VzdGEgZXMgdW5hIGNpdGEgcmVwZXRpdGl2YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJ0Rlc2VhIGVkaXRhciBzb2xvIGVzdGEgbyB0b2RhcyBsYXMgb2N1cnJlbmNpYXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnVG9kYXMgbGFzIG9jdXJyZW5jaWFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAnU29sbyBlc3RhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICdHZXN0acOzbiBkZSBDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ0HDsWFkaXIgdW4gQ2FsZW5kYXJpbyBudWV2byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICdBw7FhZGlyIENhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGFyIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ0ltcG9ydGFyIENhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICdBcXXDrSBlcyBwb3NpYmxlIGNhcmdhciB1biBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIHBhcmEgaW1wb3J0YXIgdW4gY2FsZW5kYXJpbyBhIHN1IHNpc3RlbWEuIEVsIGFyY2hpdm8gbmVjZXNpdGEgZXN0YXIgZW4gZWwgZm9ybWF0byAueW1sIHBhcmEgcG9kZXIgc2VyIGV4cG9ydGFkbyBwb3IgZWwgbcOzZHVsbyBkZSBnZXN0acOzbiBkZSBjYWxlbmRhcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICdDYXJnYXIgY29uZmlndXJhY2nDs24gZGUgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQ2FsZW5kYXInfSA9ICdJbXBvcnRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAnRmlsdHJvIHBhcmEgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwZW5kaW5nIG9uIHRoZSBncm91cCBmaWVsZCwgdGhlIHN5c3RlbSB3aWxsIGFsbG93IHVzZXJzIHRoZSBhY2Nlc3MgdG8gdGhlIGNhbGVuZGFyIGFjY29yZGluZyB0byB0aGVpciBwZXJtaXNzaW9uIGxldmVsLid9ID0KICAgICAgICAnRGVwZW5kaWVuZG8gZGVsIGNhbXBvIGRlIGdydXBvLCBlbCBzaXN0ZW1hIHBlcm1pdGUgZWwgYWNjZXNvIGEgdXN1YXJpb3MgYWwgY2FsZW5kYXJpbyBkZSBhY3VlcmRvIGEgc3VzIG5pdmVsZXMgZGUgcGVybWlzb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQgb25seTogdXNlcnMgY2FuIHNlZSBhbmQgZXhwb3J0IGFsbCBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnUk86IHVzdWFyaW9zIHF1ZSBwdWVkZW4gdmVyIHkgZXhwb3J0YXIgdG9kYXMgbGFzIGNpdGFzIGVuIGVsIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAnTW92ZXJfQTogdXN1YXJpb3MgcXVlIHB1ZWRlbiBtb2RpZmljYXIgY2l0YXMgZW4gZWwgY2FsZW5kYXJpbywgcGVybyBzaW4gY2FtYmlhciBsYSBzZWxlY2Npw7NuIGRlIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdDcmVhcjogdXN1YXJpb3MgcXVlIHB1ZWRlbiBjcmVhciB5IGJvcnJhciBjaXRhcyBlbiBlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAnUlc6IHVzdWFyaW8gcXVlIHB1ZWRlbiBnZXN0aW9uYXIgZWwgY2FsZW5kYXJpbyBlbiBzw60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAnVVJMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ0V4cG9ydGFyIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICdEZXNjYXJnYXIgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdDb3BpYXIgVVJMIHDDumJsaWNhIGRlIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ05vbWJyZSBkZWwgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICdZYSBleGlzdGUgdW4gY2FsZW5kYXJpbyBjb24gZWwgbWlzbW8gbm9tYnJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAnR3J1cG8gZGUgcGVybWlzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ0NpdGFzIGRlIFRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAnUmVnbGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnVXNlIGxhcyBvcGNpb25lcyBtb3N0cmFkYXMgYWJham8gcGFyYSBhY29ydGFyIGxhcyBjaXRhcyBkZSB0aWNrZXRzIHNlcsOhbiBjcmVhZGFzIGF1dG9tw6F0aWNhbWVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBxdWV1ZS4nfSA9ICdQb29yIGZhdm9yIHNlbGVjY2lvbmUgdW5hIGZpbGEgdsOhbGlkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ0F0cmlidXRvcyBkZSBiw7pzcXVlZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICdEZWZpbmUgcmVnbGFzIHBhcmEgY3JlYWNpw7NuIGRlIGNpdGFzIGF1dG9tw6F0aWNhcyBlbiBlc3RlIGNhbGVuZGFyaW8gYmFzYWRhcyBlbiBsb3MgZGF0b3MgZGUgbG9zIHRpY2tldHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAnQcOxYWRpciByZWdsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAnTcOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAnTWVub3MnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAnQcOxYWRpciBudWV2YSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0NhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYW4gb3ZlcnZpZXcgcGFnZSBmb3IgdGhlIEFwcG9pbnRtZW50IENhbGVuZGFyLid9ID0gJ0VzdGEgZXMgdW5hIHDDoWdpbmEgZGUgcmVzdW1lbiBwYXJhIGVsIENhbGVuZGFyaW8gZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycyd9ID0gJ0RlbWFzaWFkb3MgY2FsZW5kYXJpb3MgYWN0aXZvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICdQb3IgZmF2b3IgZGVzYWN0aXZlIGFsZ3Vub3MgcHJpbWVybyBvIGluY3JlbWVudGUgZWwgbMOtbWl0ZSBlbiBsYSBjb25maWd1cmFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrJ30gPSAnU2VtYW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIE1vbnRoJ30gPSAnTMOtbmVhIGRlIHRpZW1wbyBNZW5zdWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIFdlZWsnfSA9ICdMw61uZWEgZGUgdGllbXBvIFNlbWFuYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgRGF5J30gPSAnTMOtbmVhIGRlIHRpZW1wbyBEaWFyaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ1NhbHRhciBhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICdEZXNjYXJ0YXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ01vc3RyYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICdJbmZvcm1hY2nDs24gYsOhc2ljYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlL1RpbWUnfSA9ICdGZWNoYS9Ib3JhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICdQb3IgZmF2b3IgZmlqZSBlc3RlIHZhbG9yIGFudGVzIGRlIGxhIGZlY2hhIGRlIHTDqXJtaW5vLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4nfSA9ICdQb3IgZmF2b3IgZmlqZSBlc3RlIHZhbG9yIGRlc3B1w6lzIGRlIGxhIGZlY2hhIGRlIGluaWNpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAnRXN0YSBlcyB1bmEgb2N1cnJlbmNpYSBkZSB1bmEgY2l0YSByZXBldGl0aXZhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ1ByZWNpb25lIGFxdcOtICBwYXJhIHZlciBsYSBjaXRhIHBhZHJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdQcmVjaW9uZSBhcXXDrSAgcGFyYSBlZGl0YXIgbGEgY2l0YSBwYWRyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlcXVlbmN5J30gPSAnRnJlY3VlbmNpYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ0NhZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVsYXRpdmUgcG9pbnQgb2YgdGltZSd9ID0gJ1B1bnRvIGRlIHRpZW1wbyByZWxhdGl2by4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnwr9Fc3TDoSBzZWd1cm8gZGUgcXVlIGRlc2VhIGVsaW1pbmFyIGVzdGEgY2l0YT8gRXN0YSBvcGVyYWNpw7NuIG5vIHNlIHB1ZWRlIGRlc2hhY2VyLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnSW1wb3J0YXIgQ2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ0VsIGFyY2hpdm8gY2FyZ2FkbyB0aWVuZSBxdWUgZXN0YXIgZW4gdW4gZm9ybWF0byBpQ2FsIHbDoWxpZG8gKC5pY3MpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ1NpIGVsIENhbGVuZGFyaW8gZGVzZWFkbyBubyBhcGFyZWNlIGVuIGxhIGxpc3RhLCBwb3IgZmF2b3IgYXNlZ8O6cmVzZSBkZSBxdWUgdGVuZ2EgYWwgbWVub3MgZWwgcGVybWlzbyBkZSAiY3JlYXIiJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSBleGlzdGluZyBhcHBvaW50bWVudHM/J30gPSAnwr9BY3R1YWxpemFyIGxhcyBjaXRhcyBleGlzdGVudGVzPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJ1RvZGFzIGxhcyBjaXRhcyBleGlzdGVudGVzIGVuIGVsIGNhbGVuZGFyaW8gY29uIGVsIG1pc21vIFVuaXF1ZUlEIHNlIHNvYnJlc2NyaWJpcsOhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICdDYXJnYXIgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAnSW1wb3J0YXIgY2l0YXMnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnTnVldmEgQ2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAnUHJvbnRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzUgZMOtYXMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAnRWwgbm9tYnJlIGRlIGxhIG5vdGlmaWNhY2nDs24geWEgZXhpc3RlISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCAocmVzb3VyY2VzKSwgd2hvIGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIGFwcG9pbnRtZW50J30gPSAnQWdlbnRlcyAocmVjdXJzb3MpLCBxdWUgcHVlZGVuIHNlciBzZWxlY2Npb25hZG9zIGRlbnRybyBkZSB1bmEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdBZ2VudGVzIGNvbiAoYWwgbWVub3MpIHBlcm1pc29zIGRlIGxlY3R1cmEgcGFyYSBsYSBjaXRhIChjYWxlbmRhcmlvKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ1RvZG9zIGxvcyBhZ2VudGVzIGNvbiBwZXJtaXNvcyBkZSBlc2NyaXR1cmEgcGFyYSBsYSBjaXRhIChjYWxlbmRhcmlvKSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAnRWwgc2lzdGVtYSBubyBwdWRvIGNyZWFyIGVsIENhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLid9ID0gJ1BvciBmYXZvciBjb250YWN0ZSBlbCBhZG1pbmlzdHJhZG9yLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDYWxlbmRhcklEISd9ID0gJ05vIHNlIHRpZW5lIGVsIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ05vIHRpZW5lIGFjY2VzbyBhIGVzdGUgY2FsZW5kYXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ0VkaXRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdFcnJvciBhbCBhY3R1YWxpemVyIGVsIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkblwndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4nfSA9ICdObyBzZSBwdWVkZSBsZWVyIGVsIGFyY2hpdm8gZGUgY29uZmlndXJhY2nDs24gZGVsIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJ1BvciBmYXZvciBhc2Vnw7pyZXNlIGRlIHF1ZSBlbCBhcmNoaXZvIGVzIHbDoWxpZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ05vIHNlIHB1ZWRlIGltcG9ydGFyIGVsIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ0NhbGVuZGFyaW8gaW1wb3J0YWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAnU2UgbmVjZXNpdGEgQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICdOb3Qgc2UgcHVlZGVuIG9idGVuZXIgbG9zIGRhdG9zIHBhcmEgZWwgQ2FsZW5kYXJJRCBlc3BlY2lmaWNhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ1NlIGhhbiBpbXBvcnRhZG8gJXMgY2l0YShzKSBhbCBjYWxlbmRhcmlvICVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUgbWludXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSBtaW51dG9zICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMCBtaW51dG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMSBob3JhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ1RvZGFzIGxhcyBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICdDaXRhcyBhc2lnbmFkYXMgYSBtw60gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICdNb3N0cmFuZG8gc29sbyBjaXRhcyBhc2lnbmFkYXMgYSB0w60hIENhbWJpYXIgY29uZmlndXJhY2nDs24nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAnTGEgY2l0YSBubyBmdWUgZW5jb250cmFkYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICdOdW5jYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICdDYWRhIETDrWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ0NhZGEgU2VtYW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAnQ2FkYSBNZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ0NhZGEgQcOxbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICdQZXJzb25hbGl6YWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhaWx5J30gPSAnRGlhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ1NlbWFuYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ01lbnN1YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAnQW51YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICdjYWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAncG9yICVzIHZleihjZXMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ2hhc3RhIC4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgLi4uIHRpbWUocyknfSA9ICdwb3IgLi4uIHZleihjZXMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAnaGFzdGEgJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAnU2luIG5vdGlmaWNhY2lvbmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBtaW51dG8ocykgYW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyBob3JhKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyBkw61hKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMgc2VtYW5hcyBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ2FudGVzIGRlIHF1ZSBsYSBjaXRhIGluaWNpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCd9ID0gJ2Rlc3B1w6lzIGRlIHF1ZSBsYSBjaXRhIGhhbGxhIGluaWNpYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ2FudGVzIGRlIHF1ZSB0ZXJtaW5lIGxhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAnZGVzcHXDqXMgZGUgcXVlIGxhIGNpdGEgaGFsbGEgZmluYWxpemFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ05vIHRpZW5lIHBlcm1pc29zISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBjb3VsZCBub3QgYmUgZGVsZXRlZCEnfSA9ICdMb3MgdsOtbmN1bG9zIG5vIHB1ZGllcm9uIHNlciBib3JyYWRvcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayBjb3VsZCBub3QgYmUgY3JlYXRlZCEnfSA9ICdFbCB2w61uY3VsbyBubyBwdWRvIHNlciBib3JyYWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICdMYSBjaXRhIG5vIHB1ZWRlIHNlciBib3JyYWRhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICdObyB0aWVuZSBwZXJtaXNvcyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAnTm8gdGllbmUgcGVybWlzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAnRWwgc2lzdGVtYSBubyBwdWRvIGltcG9ydGFyIGVsIGFyY2hpdm8hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcrJWQgbcOhcyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ05vIHNlIHRpZW5lICVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAnTm8gZXhpc3RlIGVsIHVzdWFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAnQ2FsZW5kYXJpbyBpbnbDoWxpZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAnVVJMIGludsOhbGlkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnU2UgcHJvZHVqbyB1biBlcnJvciBhbCBleHBvcnRhciBlbCBjYWxlbmRhcmlvISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ0FjdHVhbGl6YXRpb24gKG1pbnV0b3MpJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICdQw6FnaW5hIGRlIHJlc3VtZW4gZGVsIENhbGVuZGFyaW8gZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ05vdGlmaWNhY2lvbmVzIGRlIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdNw7NkdWxvIGRlIGV2ZW50b3MgZGVsIGNhbGVuZGFyaW8gZGUgY2l0YXMgcXVlIHByZXBhcmEgZW50cmFkYXMgcGFyYSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJ03Ds2R1bG8gZGUgZXZlbnRvcyBkZSBjYWxlbmRhcmlvIHF1ZSBhY3R1YWxpemEgbG9zIGRhdG9zIGRlbCB0aWNrZXQgZGVzZGUgdW5hIGNpdGEgZGUgdGlja2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICdQYW50YWxsYSBkZSBlZGljacOzbiBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ0xpc3RhIGRlIGNpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAnTGlzdGEgZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICdOb3RpZmljYWNpb25lcyBkZSBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICdDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ1BhbnRhbGxhIGRlIGdlc3Rpw7NuIGRlIENhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJ0VsaWphIGVsIHRpcG8gZGUgY2FtYmlvcyBlbiBsYXMgY2l0YXMgcGFyIGxhcyBjdWFsZXMgZGVzZWEgcmVjaWJpciBub3RpZmljYWNpb25lcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ0NyZWFyIHVuYSBudWV2YSBjaXRhIGRlIGNhbGVuZGFyaW8gdmluY3VsYWRhIGEgZXN0ZSB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdDcmVhciB5IGdlc3Rpb25hciBub3RpZmljYWNpb25lcyBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICdDcmVhciBudWV2YSBjaXRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJ0RlZmluZSBjdWFsZXMgY29sdW1uYXMgc2Vyw6FuIG1vc3RyYWRhcyBlbiB3aWRnZXQgZGUgY2l0YXMgdmluY3VsYWRhcyAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxlamEiKS4gUG9zaWJsZXMgYWp1c3RlczogMCA9IERlc2hhYml0YWRhLCAxID0gSGFiaWxpdGFkYSwgMiA9IEhhYmlsaXRhZGEgcG9yIG9taXNpw7NuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICdEZWZpbmUgdW4gaWNvbm8gZGUgdsOtbmN1bG8gYSBsYSBwYWdpbmEgZGUgZ29vZ2xlIG1hcCBkZSBsYSB1YmljYWNpw7NuIGFjdHVhbCBlbiBsYSBwYW50YWxsYSBkZSBlZGljacOzbiBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICdEZWZpbmUgbG9zIHRpcG9zIGRlIG9iamV0byBkZSBldmVudG8gcXVlIHNlIG1hbmVqYW4gYSB0cmF2w6lzIGRlbCBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLid9ID0KICAgICAgICAnRGVmaW5lIGxhIGxpc3RhIGRlIHBhcsOhbWV0cm9zIHF1ZSBwdWVkZW4gc2VyIGVudmlhZG9zIGEgbGEgZnVuY2nDs24gZGUgYsO6c3F1ZWRhIGRlIHRpY2tldHMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHRpcG8gZGUgYmFja2VkIGRlIGNpdGEgZGUgdGlja2V0IHBhcmEgY2FtcG9zIGRpbsOhbWljb3MgZGUgdGlja2V0IGRlIHRpcG8gZmVjaGEgeSBob3JhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBiYWNrZWQgZGUgY2l0YSBkZSB0aWNrZXQgcGFyYSBlbCB0aWVtcG8gZGUgZXNjYWxhbWllbnRvIGRlIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgcGVuZGluZyB0aW1lLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHRpcG8gZGUgYmFja2VkIGRlIGNpdGEgZGUgdGlja2V0IHBhcmEgZWwgdGllbXBvIGRlIGVzcGVyYSBkZSB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJ0RlZmluZSBlbCBwbHVnaW4gZGUgdGlja2V0IHBhcmEgbGFzIGNpdGFzIGRlIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJ0NhbXBvRGluw6FtaWNvXyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgYXBwb2ludG1lbnQnfSA9ICdFZGl0YXIgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAnVGllbXBvIGRlIHByaW1lcmEgcmVzcHVlc3RhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ1BhbnRhbGxhIGRlIGltcG9ydGFjacOzbiBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAnVmluY3VsYXIgY2l0YXMgeSB0aWNrZXRzIGNvbiBlbCB0aXBvIGRlIHbDrW5jdWxvICJOb3JtYWwiLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnTGlzdGEgZGUgdG9kb3MgbG9zIGV2ZW50b3MgZGUgY2l0YXMgcXVlIHNvbiBkZXNwbGVnYW9zIGVuIGxhIEdVSS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ0xpc3RhIGRlIHRvZG9zIGxvcyBldmVudG9zIGRlIGNhbGVuZGFyaW8gcXVlIHNvbiBkZXNwbGVnYWRvcyBlbiBsYSBHVUkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAnTGlzdGEgZGUgY29sb3JlcyBlbiBoZXhhZGVjaW1hbCBSR0IgcXVlIGVzdGFyw6FuIGRpc3BvbmlibGVzIHBhcmEgc3Ugc2VsZWNjacOzbiBkdXJhbnRlIGxhIGNyZWFjacOzbiBkZSBjYWxlbmRhcmlvcy4gQXNlZ8O6cmVzZSBxdWUgbG9zIGNvbG9yZXMgc2VhbiBzdWZpY2llbnRlbWVudGUgb2JzY3Vyb3MgcGFyYSBxdWUgZWwgdGV4dG8gYmFuY28gc2UgdmVhIGNvcnJlY3RhbWVudGUgc29icmUgZWxsb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJ0dlc3Rpb25hciBkaWZlcmVudGVzIGNhbGVuZGFyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJ051bWVybyBtw6F4aW1vIGRlIGNhbGVuZGFyaW9zIGFjdGl2b3MgZW4gbGFzIHBhbnRhbGxhcyBkZSByZXN1bWVuLiBQb3IgZmF2b3Igbm90ZSBxdWUgdW4gbnVtZXJvIGdyYW5kZSBkZSBjYWxlbmRhcmlvcyBhY3Rpdm9zIHB1ZWRlIHRlbmVyIHVuIGltcGFjdG8gbmVnYXRpdm8gZW4gZWwgZGVzZW1wZcOxbyBkZWwgc2Vydmlkb3IgZGViaWRvIGEgdW5hIGdyYW4gY2FudGlkYWQgZGUgbGxhbWFkYXMgc2ltdWx0w6FuZWFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICdPVFJTIG5vIGFkbWl0ZSBjaXRhcyByZWN1cnJlbnRlcyBzaW4gZmVjaGEgZGUgZmluYWxpemFjacOzbiBvIHNpbiBuw7ptZXJvIGRlIGl0ZXJhY2lvbmVzLiBEdXJhbnRlIGVsIHByb2Nlc28gZGUgaW1wb3J0YWNpw7NuLCBwdWVkZSBvY3VycmlyIHF1ZSBlbCBhcmNoaXZvIElDUyBjb250ZW5nYSBkaWNoYXMgY2l0YXMuIEVuIHN1IGx1Z2FyLCBlbCBzaXN0ZW1hIGNyZWEgdG9kYXMgbGFzIGNpdGFzIGVuIGVsIHBhc2FkbywgYWRlbcOhcyBkZSBjaXRhcyBwYXJhIGxvcyBwcsOzeGltb3MgbiBtZXNlcyAoMTIwIG1lc2VzIC8gMTAgYcOxb3MgcG9yIGRlZmVjdG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLid9ID0gJ1Jlc3VtZW4gZGUgdG9kYXMgbGFzIGNpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlbmRpbmcgdGltZSd9ID0gJ1RpZW1wbyBkZSBlc3BlcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJ0LDunNxdWVkYSBkZSBwbHVnLWlucyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJ03Ds2R1bG8gUGx1Zy1pbiBkZSBiw7pzcXVlZGEgcGFyYSBhdXRvLWNvbXBsZXRhci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAnQ2FsZW5kYXJpbyBQw7pwbGljbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAnQ2FsZW5kYXJpbyBww7pibGljby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICdSZXN1bWVuIGRlIFJlY3Vyc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSd9ID0gJ1Jlc3VtZW4gZGUgUmVjdXJzb3MgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSBmb3IgY3JlYXRpbmcgYSBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhlIHRpY2tldCBkaXJlY3RseSBmcm9tIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIEFkZGl0aW9uYWwgYWNjZXNzIGNvbnRyb2wgdG8gc2hvdyBvciBub3Qgc2hvdyB0aGlzIGxpbmsgY2FuIGJlIGRvbmUgYnkgdXNpbmcgS2V5ICJHcm91cCIgYW5kIENvbnRlbnQgbGlrZSAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBUbyBjbHVzdGVyIG1lbnUgaXRlbXMgdXNlIGZvciBLZXkgIkNsdXN0ZXJOYW1lIiBhbmQgZm9yIHRoZSBDb250ZW50IGFueSBuYW1lIHlvdSB3YW50IHRvIHNlZSBpbiB0aGUgVUkuIFVzZSAiQ2x1c3RlclByaW9yaXR5IiB0byBjb25maWd1cmUgdGhlIG9yZGVyIG9mIGEgY2VydGFpbiBjbHVzdGVyIHdpdGhpbiB0aGUgdG9vbGJhci4nfSA9CiAgICAgICAgJ011ZXN0cmEgdW4gdsOtbmN1bG8gZW4gZWwgbWVuw7ogcGFyYSBjcmVhciB1bmEgY2l0YSBkZSBjYWxlbmRhcmlvIHZpbmN1bGFkYSBhbCB0aWNrZXQgZGlyZWN0byBkZXNkZSAgbGEgdmlzdGEgZGUgZGV0YWxsZSBkZSB0aWNrZXQgZGUgbGEgaW50ZXJmYWNlIGRlbCBhZ2VudGUuIEFkaWNpb25hbG1lbnRlIHNlIHB1ZWRlIGhhY2VyIGluIGNvbnRyb2wgZGUgYWNjZXNvIHBhcmEgbW9zdHJhciBvIG5vIGVzdGUgdsOtbmN1bG8gdXNhbmRvIGxhIENsYXZlICJHcm91cCIgeSBlbCBDb250ZW5pZG8gY29tbyAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBQYXJhIGFncnVwYXIgZWxlbWVudG8gZGVsIG1lbsO6IHVzZSBsYSBDbGF2ZSAiQ2x1c3Rlck5hbWUiIHBhcmEgZWwgQ29udGVuaWRvIGN1YWxxdWllciBub21icmUgcXVlIGRlc2VlIHZlciBlbiBsYSBpbnRlcmZhY2UgZGVsIHVzdWFyaW8uIFV0aWxpemUgIkNsdXN0ZXJQcmlvcml0eSIgcGFyYSBjb25maWd1cmFyIGVsIG9yZGVuIGRlIHVuIGNpZXJ0byBncnVwbyBkZW50cm8gZGUgbGEgYmFycmEgZGUgaGVycmFtaWVudGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2x1dGlvbiB0aW1lJ30gPSAnVGllbXBvIGRlIFNvbHVjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ1NlbGVjdGlvbiBkZSB0cmFuc3BvcnRlIHBhcmEgbm90aWZpY2FjaW9uZXMgZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy4nfSA9CiAgICAgICAgJ0Rpc3BhcmEgbGEgYWNjacOzbiBkZSBhw7FhZGlyIG8gYWN0dWFsaXphciBjaXRhcyBhdXRvbcOhdGljYXMgZGUgY2FsZW5kYXJpb3MgYmFzYWRhcyBlbiBjaWVydG9zIHRpZW1wb3MgZGUgdGlja2V0cy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICdUaWVtcG8gZGUgQWN0dWFsaXphY2nDs24nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfTVhfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnR2VzdGnDs24gZGUgTm90aWZpY2FjaW9uZXMgZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgdGhlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbiBtb2R1bGUuJ30gPQogICAgICAgICdBcXXDrSBlcyBwb3NpYmxlIGNhcmdhciB1biBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIHBhcmEgaW1wb3J0YXIgbGFzIG5vdGlmaWNhY2lvbmVzIGRlIGxhcyBjaXRhcyBhIHN1IHNpc3RlbWEuIEVsIGFyY2hpdm8gbmVjZXNpdGEgZXN0YXIgZW4gZWwgZm9ybWF0byAueW1sIGNvbW8gbG9zIGV4cG9ydGFkb3MgcG9yIGVsIG3Ds2R1bG8gZGUgbm90aWZpY2FjaW9uZXMgZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBlbGVnaXIgbG9zIGV2ZW50b3MgcXVlIGluaWNpYXLDoW4gZXN0YSBub3RpZmljYWNpw7NuLiBVbiBmaWx0cm8gYWRpY2lvbmFsIGRlIGxhIGNpdGEgc2UgcHVlZGUgYXBsaWNhciBhIGNvbnRpbnVhY2nDs24gcGFyYSBlbnZpYXIgc8OzbG8gcGFyYSBjaXRhcyBjb24gY2llcnRvcyBjcml0ZXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJ0ZpbHRybyBkZSBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAnRXF1aXBvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAnUmVjdXJzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ05vdGlmaWNhciBhbCB1c3VhcmlvIHNvbG8gdW5hIHZleiBhbCBkw61hIGFjZXJjYSBkZSB1bmEgc29sYSBjaXRhIHVzYW5kbyBlbCB0cmFuc3BvcnRlIHNlbGVjY2lvbmFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICdMYXMgbm90aWZpY2FjaW9uZXMgc2UgZW52w61hbiBhIHVuIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ1BhcmEgb2J0ZW5lciBsb3MgcHJpbWVyb3MgMjAgY2FyYWN0ZXJlcyBkZWwgdMOtdHVsbyBkZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAnUGFyYSBvYnRlbmVyIGVsIGF0cmlidXRvIGRlIGxhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICdQYXJhIG9idGVuZXIgZWwgYXRyaWJ1dG8gZGVsIGNhbGVuZGFyaW8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbmRhIE92ZXJ2aWV3J30gPSAnUmVzdW1lbiBkZSBsYSBBZ2VuZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ0dlc3Rpb25hciBDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICdBw7FhZGlyIENpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb3InfSA9ICdDb2xvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ0ZlY2hhIGRlIHTDqXJtaW5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ1JlcGV0aWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ05vIHNlIGVuY29udHJhcm9uIGNhbGVuZGFyaW8uIFBvciBmYXZvciBwcmltZXJvIGHDsWFkYSB1biBjYWxlbmRhcmlvIHV0aWxpemFkbyBsYSBwYWdpbmEgZGUgR2VzdGlvbmFyIENhbGVuZGFyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ0NpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ0VzdGEgZXMgdW5hIGNpdGEgcmVwZXRpdGl2YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJ0Rlc2VhIGVkaXRhciBzb2xvIGVzdGEgbyB0b2RhcyBsYXMgb2N1cnJlbmNpYXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnVG9kYXMgbGFzIG9jdXJyZW5jaWFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAnU29sbyBlc3RhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICdHZXN0acOzbiBkZSBDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ0HDsWFkaXIgdW4gQ2FsZW5kYXJpbyBudWV2byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICdBw7FhZGlyIENhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGFyIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ0ltcG9ydGFyIENhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICdBcXXDrSBlcyBwb3NpYmxlIGNhcmdhciB1biBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIHBhcmEgaW1wb3J0YXIgdW4gY2FsZW5kYXJpbyBhIHN1IHNpc3RlbWEuIEVsIGFyY2hpdm8gbmVjZXNpdGEgZXN0YXIgZW4gZWwgZm9ybWF0byAueW1sIHBhcmEgcG9kZXIgc2VyIGV4cG9ydGFkbyBwb3IgZWwgbcOzZHVsbyBkZSBnZXN0acOzbiBkZSBjYWxlbmRhcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICdDYXJnYXIgY29uZmlndXJhY2nDs24gZGUgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQ2FsZW5kYXInfSA9ICdJbXBvcnRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAnRmlsdHJvIHBhcmEgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwZW5kaW5nIG9uIHRoZSBncm91cCBmaWVsZCwgdGhlIHN5c3RlbSB3aWxsIGFsbG93IHVzZXJzIHRoZSBhY2Nlc3MgdG8gdGhlIGNhbGVuZGFyIGFjY29yZGluZyB0byB0aGVpciBwZXJtaXNzaW9uIGxldmVsLid9ID0KICAgICAgICAnRGVwZW5kaWVuZG8gZGVsIGNhbXBvIGRlIGdydXBvLCBlbCBzaXN0ZW1hIHBlcm1pdGUgZWwgYWNjZXNvIGEgdXN1YXJpb3MgYWwgY2FsZW5kYXJpbyBkZSBhY3VlcmRvIGEgc3VzIG5pdmVsZXMgZGUgcGVybWlzb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQgb25seTogdXNlcnMgY2FuIHNlZSBhbmQgZXhwb3J0IGFsbCBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnUk86IHVzdWFyaW9zIHF1ZSBwdWVkZW4gdmVyIHkgZXhwb3J0YXIgdG9kYXMgbGFzIGNpdGFzIGVuIGVsIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAnTW92ZXJfQTogdXN1YXJpb3MgcXVlIHB1ZWRlbiBtb2RpZmljYXIgY2l0YXMgZW4gZWwgY2FsZW5kYXJpbywgcGVybyBzaW4gY2FtYmlhciBsYSBzZWxlY2Npw7NuIGRlIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdDcmVhcjogdXN1YXJpb3MgcXVlIHB1ZWRlbiBjcmVhciB5IGJvcnJhciBjaXRhcyBlbiBlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAnUlc6IHVzdWFyaW8gcXVlIHB1ZWRlbiBnZXN0aW9uYXIgZWwgY2FsZW5kYXJpbyBlbiBzw60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAnVVJMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ0V4cG9ydGFyIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICdEZXNjYXJnYXIgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdDb3BpYXIgVVJMIHDDumJsaWNhIGRlIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ05vbWJyZSBkZWwgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICdZYSBleGlzdGUgdW4gY2FsZW5kYXJpbyBjb24gZWwgbWlzbW8gbm9tYnJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAnR3J1cG8gZGUgcGVybWlzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ0NpdGFzIGRlIFRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAnUmVnbGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnVXNlIGxhcyBvcGNpb25lcyBtb3N0cmFkYXMgYWJham8gcGFyYSBhY29ydGFyIGxhcyBjaXRhcyBkZSB0aWNrZXRzIHNlcsOhbiBjcmVhZGFzIGF1dG9tw6F0aWNhbWVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBxdWV1ZS4nfSA9ICdQb29yIGZhdm9yIHNlbGVjY2lvbmUgdW5hIGZpbGEgdsOhbGlkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ0F0cmlidXRvcyBkZSBiw7pzcXVlZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICdEZWZpbmUgcmVnbGFzIHBhcmEgY3JlYWNpw7NuIGRlIGNpdGFzIGF1dG9tw6F0aWNhcyBlbiBlc3RlIGNhbGVuZGFyaW8gYmFzYWRhcyBlbiBsb3MgZGF0b3MgZGUgbG9zIHRpY2tldHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAnQcOxYWRpciByZWdsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAnTcOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAnTWVub3MnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAnQcOxYWRpciBudWV2YSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0NhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYW4gb3ZlcnZpZXcgcGFnZSBmb3IgdGhlIEFwcG9pbnRtZW50IENhbGVuZGFyLid9ID0gJ0VzdGEgZXMgdW5hIHDDoWdpbmEgZGUgcmVzdW1lbiBwYXJhIGVsIENhbGVuZGFyaW8gZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycyd9ID0gJ0RlbWFzaWFkb3MgY2FsZW5kYXJpb3MgYWN0aXZvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICdQb3IgZmF2b3IgZGVzYWN0aXZlIGFsZ3Vub3MgcHJpbWVybyBvIGluY3JlbWVudGUgZWwgbMOtbWl0ZSBlbiBsYSBjb25maWd1cmFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrJ30gPSAnU2VtYW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIE1vbnRoJ30gPSAnTMOtbmVhIGRlIHRpZW1wbyBNZW5zdWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIFdlZWsnfSA9ICdMw61uZWEgZGUgdGllbXBvIFNlbWFuYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgRGF5J30gPSAnTMOtbmVhIGRlIHRpZW1wbyBEaWFyaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ1NhbHRhciBhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICdEZXNjYXJ0YXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ01vc3RyYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICdJbmZvcm1hY2nDs24gYsOhc2ljYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlL1RpbWUnfSA9ICdGZWNoYS9Ib3JhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICdQb3IgZmF2b3IgZmlqZSBlc3RlIHZhbG9yIGFudGVzIGRlIGxhIGZlY2hhIGRlIHTDqXJtaW5vLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4nfSA9ICdQb3IgZmF2b3IgZmlqZSBlc3RlIHZhbG9yIGRlc3B1w6lzIGRlIGxhIGZlY2hhIGRlIGluaWNpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAnRXN0YSBlcyB1bmEgb2N1cnJlbmNpYSBkZSB1bmEgY2l0YSByZXBldGl0aXZhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ1ByZWNpb25lIGFxdcOtICBwYXJhIHZlciBsYSBjaXRhIHBhZHJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdQcmVjaW9uZSBhcXXDrSAgcGFyYSBlZGl0YXIgbGEgY2l0YSBwYWRyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlcXVlbmN5J30gPSAnRnJlY3VlbmNpYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ0NhZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVsYXRpdmUgcG9pbnQgb2YgdGltZSd9ID0gJ1B1bnRvIGRlIHRpZW1wbyByZWxhdGl2by4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnwr9Fc3TDoSBzZWd1cm8gZGUgcXVlIGRlc2VhIGVsaW1pbmFyIGVzdGEgY2l0YT8gRXN0YSBvcGVyYWNpw7NuIG5vIHNlIHB1ZWRlIGRlc2hhY2VyLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnSW1wb3J0YXIgQ2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ0VsIGFyY2hpdm8gY2FyZ2FkbyB0aWVuZSBxdWUgZXN0YXIgZW4gdW4gZm9ybWF0byBpQ2FsIHbDoWxpZG8gKC5pY3MpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ1NpIGVsIENhbGVuZGFyaW8gZGVzZWFkbyBubyBhcGFyZWNlIGVuIGxhIGxpc3RhLCBwb3IgZmF2b3IgYXNlZ8O6cmVzZSBkZSBxdWUgdGVuZ2EgYWwgbWVub3MgZWwgcGVybWlzbyBkZSAiY3JlYXIiJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSBleGlzdGluZyBhcHBvaW50bWVudHM/J30gPSAnwr9BY3R1YWxpemFyIGxhcyBjaXRhcyBleGlzdGVudGVzPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJ1RvZGFzIGxhcyBjaXRhcyBleGlzdGVudGVzIGVuIGVsIGNhbGVuZGFyaW8gY29uIGVsIG1pc21vIFVuaXF1ZUlEIHNlIHNvYnJlc2NyaWJpcsOhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICdDYXJnYXIgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAnSW1wb3J0YXIgY2l0YXMnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnTnVldmEgQ2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAnUHJvbnRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzUgZMOtYXMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAnRWwgbm9tYnJlIGRlIGxhIG5vdGlmaWNhY2nDs24geWEgZXhpc3RlISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCAocmVzb3VyY2VzKSwgd2hvIGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIGFwcG9pbnRtZW50J30gPSAnQWdlbnRlcyAocmVjdXJzb3MpLCBxdWUgcHVlZGVuIHNlciBzZWxlY2Npb25hZG9zIGRlbnRybyBkZSB1bmEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdBZ2VudGVzIGNvbiAoYWwgbWVub3MpIHBlcm1pc29zIGRlIGxlY3R1cmEgcGFyYSBsYSBjaXRhIChjYWxlbmRhcmlvKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ1RvZG9zIGxvcyBhZ2VudGVzIGNvbiBwZXJtaXNvcyBkZSBlc2NyaXR1cmEgcGFyYSBsYSBjaXRhIChjYWxlbmRhcmlvKSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAnRWwgc2lzdGVtYSBubyBwdWRvIGNyZWFyIGVsIENhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLid9ID0gJ1BvciBmYXZvciBjb250YWN0ZSBlbCBhZG1pbmlzdHJhZG9yLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDYWxlbmRhcklEISd9ID0gJ05vIHNlIHRpZW5lIGVsIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ05vIHRpZW5lIGFjY2VzbyBhIGVzdGUgY2FsZW5kYXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ0VkaXRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdFcnJvciBhbCBhY3R1YWxpemVyIGVsIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkblwndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4nfSA9ICdObyBzZSBwdWVkZSBsZWVyIGVsIGFyY2hpdm8gZGUgY29uZmlndXJhY2nDs24gZGVsIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJ1BvciBmYXZvciBhc2Vnw7pyZXNlIGRlIHF1ZSBlbCBhcmNoaXZvIGVzIHbDoWxpZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ05vIHNlIHB1ZWRlIGltcG9ydGFyIGVsIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ0NhbGVuZGFyaW8gaW1wb3J0YWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAnU2UgbmVjZXNpdGEgQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICdOb3Qgc2UgcHVlZGVuIG9idGVuZXIgbG9zIGRhdG9zIHBhcmEgZWwgQ2FsZW5kYXJJRCBlc3BlY2lmaWNhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ1NlIGhhbiBpbXBvcnRhZG8gJXMgY2l0YShzKSBhbCBjYWxlbmRhcmlvICVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUgbWludXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSBtaW51dG9zICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMCBtaW51dG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMSBob3JhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ1RvZGFzIGxhcyBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICdDaXRhcyBhc2lnbmFkYXMgYSBtw60gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICdNb3N0cmFuZG8gc29sbyBjaXRhcyBhc2lnbmFkYXMgYSB0w60hIENhbWJpYXIgY29uZmlndXJhY2nDs24nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAnTGEgY2l0YSBubyBmdWUgZW5jb250cmFkYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICdOdW5jYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICdDYWRhIETDrWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ0NhZGEgU2VtYW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAnQ2FkYSBNZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ0NhZGEgQcOxbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICdQZXJzb25hbGl6YWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhaWx5J30gPSAnRGlhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ1NlbWFuYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ01lbnN1YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAnQW51YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICdjYWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAncG9yICVzIHZleihjZXMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ2hhc3RhIC4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgLi4uIHRpbWUocyknfSA9ICdwb3IgLi4uIHZleihjZXMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAnaGFzdGEgJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAnU2luIG5vdGlmaWNhY2lvbmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBtaW51dG8ocykgYW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyBob3JhKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyBkw61hKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMgc2VtYW5hcyBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ2FudGVzIGRlIHF1ZSBsYSBjaXRhIGluaWNpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCd9ID0gJ2Rlc3B1w6lzIGRlIHF1ZSBsYSBjaXRhIGhhbGxhIGluaWNpYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ2FudGVzIGRlIHF1ZSB0ZXJtaW5lIGxhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAnZGVzcHXDqXMgZGUgcXVlIGxhIGNpdGEgaGFsbGEgZmluYWxpemFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ05vIHRpZW5lIHBlcm1pc29zISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBjb3VsZCBub3QgYmUgZGVsZXRlZCEnfSA9ICdMb3MgdsOtbmN1bG9zIG5vIHB1ZGllcm9uIHNlciBib3JyYWRvcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayBjb3VsZCBub3QgYmUgY3JlYXRlZCEnfSA9ICdFbCB2w61uY3VsbyBubyBwdWRvIHNlciBib3JyYWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICdMYSBjaXRhIG5vIHB1ZWRlIHNlciBib3JyYWRhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICdObyB0aWVuZSBwZXJtaXNvcyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAnTm8gdGllbmUgcGVybWlzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAnRWwgc2lzdGVtYSBubyBwdWRvIGltcG9ydGFyIGVsIGFyY2hpdm8hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcrJWQgbcOhcyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ05vIHNlIHRpZW5lICVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAnTm8gZXhpc3RlIGVsIHVzdWFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAnQ2FsZW5kYXJpbyBpbnbDoWxpZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAnVVJMIGludsOhbGlkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnU2UgcHJvZHVqbyB1biBlcnJvciBhbCBleHBvcnRhciBlbCBjYWxlbmRhcmlvISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ0FjdHVhbGl6YXRpb24gKG1pbnV0b3MpJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICdQw6FnaW5hIGRlIHJlc3VtZW4gZGVsIENhbGVuZGFyaW8gZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ05vdGlmaWNhY2lvbmVzIGRlIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdNw7NkdWxvIGRlIGV2ZW50b3MgZGVsIGNhbGVuZGFyaW8gZGUgY2l0YXMgcXVlIHByZXBhcmEgZW50cmFkYXMgcGFyYSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJ03Ds2R1bG8gZGUgZXZlbnRvcyBkZSBjYWxlbmRhcmlvIHF1ZSBhY3R1YWxpemEgbG9zIGRhdG9zIGRlbCB0aWNrZXQgZGVzZGUgdW5hIGNpdGEgZGUgdGlja2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICdQYW50YWxsYSBkZSBlZGljacOzbiBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ0xpc3RhIGRlIGNpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAnTGlzdGEgZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICdOb3RpZmljYWNpb25lcyBkZSBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICdDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ1BhbnRhbGxhIGRlIGdlc3Rpw7NuIGRlIENhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJ0VsaWphIGVsIHRpcG8gZGUgY2FtYmlvcyBlbiBsYXMgY2l0YXMgcGFyIGxhcyBjdWFsZXMgZGVzZWEgcmVjaWJpciBub3RpZmljYWNpb25lcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ0NyZWFyIHVuYSBudWV2YSBjaXRhIGRlIGNhbGVuZGFyaW8gdmluY3VsYWRhIGEgZXN0ZSB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdDcmVhciB5IGdlc3Rpb25hciBub3RpZmljYWNpb25lcyBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICdDcmVhciBudWV2YSBjaXRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJ0RlZmluZSBjdWFsZXMgY29sdW1uYXMgc2Vyw6FuIG1vc3RyYWRhcyBlbiB3aWRnZXQgZGUgY2l0YXMgdmluY3VsYWRhcyAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxlamEiKS4gUG9zaWJsZXMgYWp1c3RlczogMCA9IERlc2hhYml0YWRhLCAxID0gSGFiaWxpdGFkYSwgMiA9IEhhYmlsaXRhZGEgcG9yIG9taXNpw7NuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICdEZWZpbmUgdW4gaWNvbm8gZGUgdsOtbmN1bG8gYSBsYSBwYWdpbmEgZGUgZ29vZ2xlIG1hcCBkZSBsYSB1YmljYWNpw7NuIGFjdHVhbCBlbiBsYSBwYW50YWxsYSBkZSBlZGljacOzbiBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICdEZWZpbmUgbG9zIHRpcG9zIGRlIG9iamV0byBkZSBldmVudG8gcXVlIHNlIG1hbmVqYW4gYSB0cmF2w6lzIGRlbCBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLid9ID0KICAgICAgICAnRGVmaW5lIGxhIGxpc3RhIGRlIHBhcsOhbWV0cm9zIHF1ZSBwdWVkZW4gc2VyIGVudmlhZG9zIGEgbGEgZnVuY2nDs24gZGUgYsO6c3F1ZWRhIGRlIHRpY2tldHMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHRpcG8gZGUgYmFja2VkIGRlIGNpdGEgZGUgdGlja2V0IHBhcmEgY2FtcG9zIGRpbsOhbWljb3MgZGUgdGlja2V0IGRlIHRpcG8gZmVjaGEgeSBob3JhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBiYWNrZWQgZGUgY2l0YSBkZSB0aWNrZXQgcGFyYSBlbCB0aWVtcG8gZGUgZXNjYWxhbWllbnRvIGRlIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgcGVuZGluZyB0aW1lLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHRpcG8gZGUgYmFja2VkIGRlIGNpdGEgZGUgdGlja2V0IHBhcmEgZWwgdGllbXBvIGRlIGVzcGVyYSBkZSB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJ0RlZmluZSBlbCBwbHVnaW4gZGUgdGlja2V0IHBhcmEgbGFzIGNpdGFzIGRlIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJ0NhbXBvRGluw6FtaWNvXyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgYXBwb2ludG1lbnQnfSA9ICdFZGl0YXIgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAnVGllbXBvIGRlIHByaW1lcmEgcmVzcHVlc3RhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ1BhbnRhbGxhIGRlIGltcG9ydGFjacOzbiBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAnVmluY3VsYXIgY2l0YXMgeSB0aWNrZXRzIGNvbiBlbCB0aXBvIGRlIHbDrW5jdWxvICJOb3JtYWwiLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnTGlzdGEgZGUgdG9kb3MgbG9zIGV2ZW50b3MgZGUgY2l0YXMgcXVlIHNvbiBkZXNwbGVnYW9zIGVuIGxhIEdVSS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ0xpc3RhIGRlIHRvZG9zIGxvcyBldmVudG9zIGRlIGNhbGVuZGFyaW8gcXVlIHNvbiBkZXNwbGVnYWRvcyBlbiBsYSBHVUkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAnTGlzdGEgZGUgY29sb3JlcyBlbiBoZXhhZGVjaW1hbCBSR0IgcXVlIGVzdGFyw6FuIGRpc3BvbmlibGVzIHBhcmEgc3Ugc2VsZWNjacOzbiBkdXJhbnRlIGxhIGNyZWFjacOzbiBkZSBjYWxlbmRhcmlvcy4gQXNlZ8O6cmVzZSBxdWUgbG9zIGNvbG9yZXMgc2VhbiBzdWZpY2llbnRlbWVudGUgb2JzY3Vyb3MgcGFyYSBxdWUgZWwgdGV4dG8gYmFuY28gc2UgdmVhIGNvcnJlY3RhbWVudGUgc29icmUgZWxsb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJ0dlc3Rpb25hciBkaWZlcmVudGVzIGNhbGVuZGFyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJ051bWVybyBtw6F4aW1vIGRlIGNhbGVuZGFyaW9zIGFjdGl2b3MgZW4gbGFzIHBhbnRhbGxhcyBkZSByZXN1bWVuLiBQb3IgZmF2b3Igbm90ZSBxdWUgdW4gbnVtZXJvIGdyYW5kZSBkZSBjYWxlbmRhcmlvcyBhY3Rpdm9zIHB1ZWRlIHRlbmVyIHVuIGltcGFjdG8gbmVnYXRpdm8gZW4gZWwgZGVzZW1wZcOxbyBkZWwgc2Vydmlkb3IgZGViaWRvIGEgdW5hIGdyYW4gY2FudGlkYWQgZGUgbGxhbWFkYXMgc2ltdWx0w6FuZWFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICdPVFJTIG5vIGFkbWl0ZSBjaXRhcyByZWN1cnJlbnRlcyBzaW4gZmVjaGEgZGUgZmluYWxpemFjacOzbiBvIHNpbiBuw7ptZXJvIGRlIGl0ZXJhY2lvbmVzLiBEdXJhbnRlIGVsIHByb2Nlc28gZGUgaW1wb3J0YWNpw7NuLCBwdWVkZSBvY3VycmlyIHF1ZSBlbCBhcmNoaXZvIElDUyBjb250ZW5nYSBkaWNoYXMgY2l0YXMuIEVuIHN1IGx1Z2FyLCBlbCBzaXN0ZW1hIGNyZWEgdG9kYXMgbGFzIGNpdGFzIGVuIGVsIHBhc2FkbywgYWRlbcOhcyBkZSBjaXRhcyBwYXJhIGxvcyBwcsOzeGltb3MgbiBtZXNlcyAoMTIwIG1lc2VzIC8gMTAgYcOxb3MgcG9yIGRlZmVjdG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLid9ID0gJ1Jlc3VtZW4gZGUgdG9kYXMgbGFzIGNpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlbmRpbmcgdGltZSd9ID0gJ1RpZW1wbyBkZSBlc3BlcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJ0LDunNxdWVkYSBkZSBwbHVnLWlucyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJ03Ds2R1bG8gUGx1Zy1pbiBkZSBiw7pzcXVlZGEgcGFyYSBhdXRvLWNvbXBsZXRhci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAnQ2FsZW5kYXJpbyBQw7pwbGljbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAnQ2FsZW5kYXJpbyBww7pibGljby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICdSZXN1bWVuIGRlIFJlY3Vyc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSd9ID0gJ1Jlc3VtZW4gZGUgUmVjdXJzb3MgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSBmb3IgY3JlYXRpbmcgYSBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhlIHRpY2tldCBkaXJlY3RseSBmcm9tIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIEFkZGl0aW9uYWwgYWNjZXNzIGNvbnRyb2wgdG8gc2hvdyBvciBub3Qgc2hvdyB0aGlzIGxpbmsgY2FuIGJlIGRvbmUgYnkgdXNpbmcgS2V5ICJHcm91cCIgYW5kIENvbnRlbnQgbGlrZSAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBUbyBjbHVzdGVyIG1lbnUgaXRlbXMgdXNlIGZvciBLZXkgIkNsdXN0ZXJOYW1lIiBhbmQgZm9yIHRoZSBDb250ZW50IGFueSBuYW1lIHlvdSB3YW50IHRvIHNlZSBpbiB0aGUgVUkuIFVzZSAiQ2x1c3RlclByaW9yaXR5IiB0byBjb25maWd1cmUgdGhlIG9yZGVyIG9mIGEgY2VydGFpbiBjbHVzdGVyIHdpdGhpbiB0aGUgdG9vbGJhci4nfSA9CiAgICAgICAgJ011ZXN0cmEgdW4gdsOtbmN1bG8gZW4gZWwgbWVuw7ogcGFyYSBjcmVhciB1bmEgY2l0YSBkZSBjYWxlbmRhcmlvIHZpbmN1bGFkYSBhbCB0aWNrZXQgZGlyZWN0byBkZXNkZSAgbGEgdmlzdGEgZGUgZGV0YWxsZSBkZSB0aWNrZXQgZGUgbGEgaW50ZXJmYWNlIGRlbCBhZ2VudGUuIEFkaWNpb25hbG1lbnRlIHNlIHB1ZWRlIGhhY2VyIGluIGNvbnRyb2wgZGUgYWNjZXNvIHBhcmEgbW9zdHJhciBvIG5vIGVzdGUgdsOtbmN1bG8gdXNhbmRvIGxhIENsYXZlICJHcm91cCIgeSBlbCBDb250ZW5pZG8gY29tbyAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBQYXJhIGFncnVwYXIgZWxlbWVudG8gZGVsIG1lbsO6IHVzZSBsYSBDbGF2ZSAiQ2x1c3Rlck5hbWUiIHBhcmEgZWwgQ29udGVuaWRvIGN1YWxxdWllciBub21icmUgcXVlIGRlc2VlIHZlciBlbiBsYSBpbnRlcmZhY2UgZGVsIHVzdWFyaW8uIFV0aWxpemUgIkNsdXN0ZXJQcmlvcml0eSIgcGFyYSBjb25maWd1cmFyIGVsIG9yZGVuIGRlIHVuIGNpZXJ0byBncnVwbyBkZW50cm8gZGUgbGEgYmFycmEgZGUgaGVycmFtaWVudGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2x1dGlvbiB0aW1lJ30gPSAnVGllbXBvIGRlIFNvbHVjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ1NlbGVjdGlvbiBkZSB0cmFuc3BvcnRlIHBhcmEgbm90aWZpY2FjaW9uZXMgZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy4nfSA9CiAgICAgICAgJ0Rpc3BhcmEgbGEgYWNjacOzbiBkZSBhw7FhZGlyIG8gYWN0dWFsaXphciBjaXRhcyBhdXRvbcOhdGljYXMgZGUgY2FsZW5kYXJpb3MgYmFzYWRhcyBlbiBjaWVydG9zIHRpZW1wb3MgZGUgdGlja2V0cy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICdUaWVtcG8gZGUgQWN0dWFsaXphY2nDs24nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnR2VzdGnDs24gZGUgTm90aWZpY2FjaW9uZXMgZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgdGhlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbiBtb2R1bGUuJ30gPQogICAgICAgICdBcXXDrSBlcyBwb3NpYmxlIGNhcmdhciB1biBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIHBhcmEgaW1wb3J0YXIgbGFzIG5vdGlmaWNhY2lvbmVzIGRlIGxhcyBjaXRhcyBhIHN1IHNpc3RlbWEuIEVsIGFyY2hpdm8gbmVjZXNpdGEgZXN0YXIgZW4gZWwgZm9ybWF0byAueW1sIGNvbW8gbG9zIGV4cG9ydGFkb3MgcG9yIGVsIG3Ds2R1bG8gZGUgbm90aWZpY2FjaW9uZXMgZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBlbGVnaXIgbG9zIGV2ZW50b3MgcXVlIGluaWNpYXLDoW4gZXN0YSBub3RpZmljYWNpw7NuLiBVbiBmaWx0cm8gYWRpY2lvbmFsIGRlIGxhIGNpdGEgc2UgcHVlZGUgYXBsaWNhciBhIGNvbnRpbnVhY2nDs24gcGFyYSBlbnZpYXIgc8OzbG8gcGFyYSBjaXRhcyBjb24gY2llcnRvcyBjcml0ZXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJ0ZpbHRybyBkZSBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAnRXF1aXBvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAnUmVjdXJzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ05vdGlmaWNhciBhbCB1c3VhcmlvIHNvbG8gdW5hIHZleiBhbCBkw61hIGFjZXJjYSBkZSB1bmEgc29sYSBjaXRhIHVzYW5kbyBlbCB0cmFuc3BvcnRlIHNlbGVjY2lvbmFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICdMYXMgbm90aWZpY2FjaW9uZXMgc2UgZW52w61hbiBhIHVuIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ1BhcmEgb2J0ZW5lciBsb3MgcHJpbWVyb3MgMjAgY2FyYWN0ZXJlcyBkZWwgdMOtdHVsbyBkZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAnUGFyYSBvYnRlbmVyIGVsIGF0cmlidXRvIGRlIGxhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICdQYXJhIG9idGVuZXIgZWwgYXRyaWJ1dG8gZGVsIGNhbGVuZGFyaW8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbmRhIE92ZXJ2aWV3J30gPSAnUmVzdW1lbiBkZSBsYSBBZ2VuZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ0dlc3Rpb25hciBDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICdBw7FhZGlyIENpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb3InfSA9ICdDb2xvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ0ZlY2hhIGRlIHTDqXJtaW5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ1JlcGV0aWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ05vIHNlIGVuY29udHJhcm9uIGNhbGVuZGFyaW8uIFBvciBmYXZvciBwcmltZXJvIGHDsWFkYSB1biBjYWxlbmRhcmlvIHV0aWxpemFkbyBsYSBwYWdpbmEgZGUgR2VzdGlvbmFyIENhbGVuZGFyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ0NpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ0VzdGEgZXMgdW5hIGNpdGEgcmVwZXRpdGl2YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJ0Rlc2VhIGVkaXRhciBzb2xvIGVzdGEgbyB0b2RhcyBsYXMgb2N1cnJlbmNpYXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnVG9kYXMgbGFzIG9jdXJyZW5jaWFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAnU29sbyBlc3RhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICdHZXN0acOzbiBkZSBDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ0HDsWFkaXIgdW4gQ2FsZW5kYXJpbyBudWV2byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICdBw7FhZGlyIENhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGFyIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ0ltcG9ydGFyIENhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICdBcXXDrSBlcyBwb3NpYmxlIGNhcmdhciB1biBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIHBhcmEgaW1wb3J0YXIgdW4gY2FsZW5kYXJpbyBhIHN1IHNpc3RlbWEuIEVsIGFyY2hpdm8gbmVjZXNpdGEgZXN0YXIgZW4gZWwgZm9ybWF0byAueW1sIHBhcmEgcG9kZXIgc2VyIGV4cG9ydGFkbyBwb3IgZWwgbcOzZHVsbyBkZSBnZXN0acOzbiBkZSBjYWxlbmRhcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICdDYXJnYXIgY29uZmlndXJhY2nDs24gZGUgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQ2FsZW5kYXInfSA9ICdJbXBvcnRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAnRmlsdHJvIHBhcmEgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwZW5kaW5nIG9uIHRoZSBncm91cCBmaWVsZCwgdGhlIHN5c3RlbSB3aWxsIGFsbG93IHVzZXJzIHRoZSBhY2Nlc3MgdG8gdGhlIGNhbGVuZGFyIGFjY29yZGluZyB0byB0aGVpciBwZXJtaXNzaW9uIGxldmVsLid9ID0KICAgICAgICAnRGVwZW5kaWVuZG8gZGVsIGNhbXBvIGRlIGdydXBvLCBlbCBzaXN0ZW1hIHBlcm1pdGUgZWwgYWNjZXNvIGEgdXN1YXJpb3MgYWwgY2FsZW5kYXJpbyBkZSBhY3VlcmRvIGEgc3VzIG5pdmVsZXMgZGUgcGVybWlzb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQgb25seTogdXNlcnMgY2FuIHNlZSBhbmQgZXhwb3J0IGFsbCBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnUk86IHVzdWFyaW9zIHF1ZSBwdWVkZW4gdmVyIHkgZXhwb3J0YXIgdG9kYXMgbGFzIGNpdGFzIGVuIGVsIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAnTW92ZXJfQTogdXN1YXJpb3MgcXVlIHB1ZWRlbiBtb2RpZmljYXIgY2l0YXMgZW4gZWwgY2FsZW5kYXJpbywgcGVybyBzaW4gY2FtYmlhciBsYSBzZWxlY2Npw7NuIGRlIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdDcmVhcjogdXN1YXJpb3MgcXVlIHB1ZWRlbiBjcmVhciB5IGJvcnJhciBjaXRhcyBlbiBlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAnUlc6IHVzdWFyaW8gcXVlIHB1ZWRlbiBnZXN0aW9uYXIgZWwgY2FsZW5kYXJpbyBlbiBzw60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAnVVJMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ0V4cG9ydGFyIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICdEZXNjYXJnYXIgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdDb3BpYXIgVVJMIHDDumJsaWNhIGRlIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ05vbWJyZSBkZWwgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICdZYSBleGlzdGUgdW4gY2FsZW5kYXJpbyBjb24gZWwgbWlzbW8gbm9tYnJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAnR3J1cG8gZGUgcGVybWlzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ0NpdGFzIGRlIFRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAnUmVnbGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnVXNlIGxhcyBvcGNpb25lcyBtb3N0cmFkYXMgYWJham8gcGFyYSBhY29ydGFyIGxhcyBjaXRhcyBkZSB0aWNrZXRzIHNlcsOhbiBjcmVhZGFzIGF1dG9tw6F0aWNhbWVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBxdWV1ZS4nfSA9ICdQb29yIGZhdm9yIHNlbGVjY2lvbmUgdW5hIGZpbGEgdsOhbGlkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ0F0cmlidXRvcyBkZSBiw7pzcXVlZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICdEZWZpbmUgcmVnbGFzIHBhcmEgY3JlYWNpw7NuIGRlIGNpdGFzIGF1dG9tw6F0aWNhcyBlbiBlc3RlIGNhbGVuZGFyaW8gYmFzYWRhcyBlbiBsb3MgZGF0b3MgZGUgbG9zIHRpY2tldHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAnQcOxYWRpciByZWdsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAnTcOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAnTWVub3MnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAnQcOxYWRpciBudWV2YSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0NhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYW4gb3ZlcnZpZXcgcGFnZSBmb3IgdGhlIEFwcG9pbnRtZW50IENhbGVuZGFyLid9ID0gJ0VzdGEgZXMgdW5hIHDDoWdpbmEgZGUgcmVzdW1lbiBwYXJhIGVsIENhbGVuZGFyaW8gZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycyd9ID0gJ0RlbWFzaWFkb3MgY2FsZW5kYXJpb3MgYWN0aXZvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICdQb3IgZmF2b3IgZGVzYWN0aXZlIGFsZ3Vub3MgcHJpbWVybyBvIGluY3JlbWVudGUgZWwgbMOtbWl0ZSBlbiBsYSBjb25maWd1cmFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrJ30gPSAnU2VtYW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIE1vbnRoJ30gPSAnTMOtbmVhIGRlIHRpZW1wbyBNZW5zdWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIFdlZWsnfSA9ICdMw61uZWEgZGUgdGllbXBvIFNlbWFuYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgRGF5J30gPSAnTMOtbmVhIGRlIHRpZW1wbyBEaWFyaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ1NhbHRhciBhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICdEZXNjYXJ0YXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ01vc3RyYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICdJbmZvcm1hY2nDs24gYsOhc2ljYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlL1RpbWUnfSA9ICdGZWNoYS9Ib3JhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICdQb3IgZmF2b3IgZmlqZSBlc3RlIHZhbG9yIGFudGVzIGRlIGxhIGZlY2hhIGRlIHTDqXJtaW5vLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4nfSA9ICdQb3IgZmF2b3IgZmlqZSBlc3RlIHZhbG9yIGRlc3B1w6lzIGRlIGxhIGZlY2hhIGRlIGluaWNpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAnRXN0YSBlcyB1bmEgb2N1cnJlbmNpYSBkZSB1bmEgY2l0YSByZXBldGl0aXZhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ1ByZWNpb25lIGFxdcOtICBwYXJhIHZlciBsYSBjaXRhIHBhZHJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdQcmVjaW9uZSBhcXXDrSAgcGFyYSBlZGl0YXIgbGEgY2l0YSBwYWRyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlcXVlbmN5J30gPSAnRnJlY3VlbmNpYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ0NhZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVsYXRpdmUgcG9pbnQgb2YgdGltZSd9ID0gJ1B1bnRvIGRlIHRpZW1wbyByZWxhdGl2by4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnwr9Fc3TDoSBzZWd1cm8gZGUgcXVlIGRlc2VhIGVsaW1pbmFyIGVzdGEgY2l0YT8gRXN0YSBvcGVyYWNpw7NuIG5vIHNlIHB1ZWRlIGRlc2hhY2VyLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnSW1wb3J0YXIgQ2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ0VsIGFyY2hpdm8gY2FyZ2FkbyB0aWVuZSBxdWUgZXN0YXIgZW4gdW4gZm9ybWF0byBpQ2FsIHbDoWxpZG8gKC5pY3MpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ1NpIGVsIENhbGVuZGFyaW8gZGVzZWFkbyBubyBhcGFyZWNlIGVuIGxhIGxpc3RhLCBwb3IgZmF2b3IgYXNlZ8O6cmVzZSBkZSBxdWUgdGVuZ2EgYWwgbWVub3MgZWwgcGVybWlzbyBkZSAiY3JlYXIiJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSBleGlzdGluZyBhcHBvaW50bWVudHM/J30gPSAnwr9BY3R1YWxpemFyIGxhcyBjaXRhcyBleGlzdGVudGVzPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJ1RvZGFzIGxhcyBjaXRhcyBleGlzdGVudGVzIGVuIGVsIGNhbGVuZGFyaW8gY29uIGVsIG1pc21vIFVuaXF1ZUlEIHNlIHNvYnJlc2NyaWJpcsOhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICdDYXJnYXIgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAnSW1wb3J0YXIgY2l0YXMnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnTnVldmEgQ2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAnUHJvbnRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzUgZMOtYXMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAnRWwgbm9tYnJlIGRlIGxhIG5vdGlmaWNhY2nDs24geWEgZXhpc3RlISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCAocmVzb3VyY2VzKSwgd2hvIGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIGFwcG9pbnRtZW50J30gPSAnQWdlbnRlcyAocmVjdXJzb3MpLCBxdWUgcHVlZGVuIHNlciBzZWxlY2Npb25hZG9zIGRlbnRybyBkZSB1bmEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdBZ2VudGVzIGNvbiAoYWwgbWVub3MpIHBlcm1pc29zIGRlIGxlY3R1cmEgcGFyYSBsYSBjaXRhIChjYWxlbmRhcmlvKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ1RvZG9zIGxvcyBhZ2VudGVzIGNvbiBwZXJtaXNvcyBkZSBlc2NyaXR1cmEgcGFyYSBsYSBjaXRhIChjYWxlbmRhcmlvKSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAnRWwgc2lzdGVtYSBubyBwdWRvIGNyZWFyIGVsIENhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLid9ID0gJ1BvciBmYXZvciBjb250YWN0ZSBlbCBhZG1pbmlzdHJhZG9yLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDYWxlbmRhcklEISd9ID0gJ05vIHNlIHRpZW5lIGVsIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ05vIHRpZW5lIGFjY2VzbyBhIGVzdGUgY2FsZW5kYXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ0VkaXRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdFcnJvciBhbCBhY3R1YWxpemVyIGVsIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkblwndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4nfSA9ICdObyBzZSBwdWVkZSBsZWVyIGVsIGFyY2hpdm8gZGUgY29uZmlndXJhY2nDs24gZGVsIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJ1BvciBmYXZvciBhc2Vnw7pyZXNlIGRlIHF1ZSBlbCBhcmNoaXZvIGVzIHbDoWxpZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ05vIHNlIHB1ZWRlIGltcG9ydGFyIGVsIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ0NhbGVuZGFyaW8gaW1wb3J0YWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAnU2UgbmVjZXNpdGEgQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICdOb3Qgc2UgcHVlZGVuIG9idGVuZXIgbG9zIGRhdG9zIHBhcmEgZWwgQ2FsZW5kYXJJRCBlc3BlY2lmaWNhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ1NlIGhhbiBpbXBvcnRhZG8gJXMgY2l0YShzKSBhbCBjYWxlbmRhcmlvICVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUgbWludXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSBtaW51dG9zICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMCBtaW51dG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMSBob3JhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ1RvZGFzIGxhcyBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICdDaXRhcyBhc2lnbmFkYXMgYSBtw60gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICdNb3N0cmFuZG8gc29sbyBjaXRhcyBhc2lnbmFkYXMgYSB0w60hIENhbWJpYXIgY29uZmlndXJhY2nDs24nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAnTGEgY2l0YSBubyBmdWUgZW5jb250cmFkYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICdOdW5jYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICdDYWRhIETDrWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ0NhZGEgU2VtYW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAnQ2FkYSBNZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ0NhZGEgQcOxbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICdQZXJzb25hbGl6YWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhaWx5J30gPSAnRGlhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ1NlbWFuYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ01lbnN1YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAnQW51YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICdjYWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAncG9yICVzIHZleihjZXMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ2hhc3RhIC4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgLi4uIHRpbWUocyknfSA9ICdwb3IgLi4uIHZleihjZXMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAnaGFzdGEgJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAnU2luIG5vdGlmaWNhY2lvbmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBtaW51dG8ocykgYW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyBob3JhKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyBkw61hKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMgc2VtYW5hcyBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ2FudGVzIGRlIHF1ZSBsYSBjaXRhIGluaWNpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCd9ID0gJ2Rlc3B1w6lzIGRlIHF1ZSBsYSBjaXRhIGhhbGxhIGluaWNpYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ2FudGVzIGRlIHF1ZSB0ZXJtaW5lIGxhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAnZGVzcHXDqXMgZGUgcXVlIGxhIGNpdGEgaGFsbGEgZmluYWxpemFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ05vIHRpZW5lIHBlcm1pc29zISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBjb3VsZCBub3QgYmUgZGVsZXRlZCEnfSA9ICdMb3MgdsOtbmN1bG9zIG5vIHB1ZGllcm9uIHNlciBib3JyYWRvcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayBjb3VsZCBub3QgYmUgY3JlYXRlZCEnfSA9ICdFbCB2w61uY3VsbyBubyBwdWRvIHNlciBib3JyYWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICdMYSBjaXRhIG5vIHB1ZWRlIHNlciBib3JyYWRhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICdObyB0aWVuZSBwZXJtaXNvcyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAnTm8gdGllbmUgcGVybWlzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAnRWwgc2lzdGVtYSBubyBwdWRvIGltcG9ydGFyIGVsIGFyY2hpdm8hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcrJWQgbcOhcyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ05vIHNlIHRpZW5lICVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAnTm8gZXhpc3RlIGVsIHVzdWFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAnQ2FsZW5kYXJpbyBpbnbDoWxpZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAnVVJMIGludsOhbGlkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnU2UgcHJvZHVqbyB1biBlcnJvciBhbCBleHBvcnRhciBlbCBjYWxlbmRhcmlvISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ0FjdHVhbGl6YXRpb24gKG1pbnV0b3MpJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICdQw6FnaW5hIGRlIHJlc3VtZW4gZGVsIENhbGVuZGFyaW8gZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ05vdGlmaWNhY2lvbmVzIGRlIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdNw7NkdWxvIGRlIGV2ZW50b3MgZGVsIGNhbGVuZGFyaW8gZGUgY2l0YXMgcXVlIHByZXBhcmEgZW50cmFkYXMgcGFyYSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJ03Ds2R1bG8gZGUgZXZlbnRvcyBkZSBjYWxlbmRhcmlvIHF1ZSBhY3R1YWxpemEgbG9zIGRhdG9zIGRlbCB0aWNrZXQgZGVzZGUgdW5hIGNpdGEgZGUgdGlja2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICdQYW50YWxsYSBkZSBlZGljacOzbiBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ0xpc3RhIGRlIGNpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAnTGlzdGEgZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICdOb3RpZmljYWNpb25lcyBkZSBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICdDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ1BhbnRhbGxhIGRlIGdlc3Rpw7NuIGRlIENhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJ0VsaWphIGVsIHRpcG8gZGUgY2FtYmlvcyBlbiBsYXMgY2l0YXMgcGFyIGxhcyBjdWFsZXMgZGVzZWEgcmVjaWJpciBub3RpZmljYWNpb25lcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ0NyZWFyIHVuYSBudWV2YSBjaXRhIGRlIGNhbGVuZGFyaW8gdmluY3VsYWRhIGEgZXN0ZSB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdDcmVhciB5IGdlc3Rpb25hciBub3RpZmljYWNpb25lcyBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICdDcmVhciBudWV2YSBjaXRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJ0RlZmluZSBjdWFsZXMgY29sdW1uYXMgc2Vyw6FuIG1vc3RyYWRhcyBlbiB3aWRnZXQgZGUgY2l0YXMgdmluY3VsYWRhcyAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxlamEiKS4gUG9zaWJsZXMgYWp1c3RlczogMCA9IERlc2hhYml0YWRhLCAxID0gSGFiaWxpdGFkYSwgMiA9IEhhYmlsaXRhZGEgcG9yIG9taXNpw7NuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICdEZWZpbmUgdW4gaWNvbm8gZGUgdsOtbmN1bG8gYSBsYSBwYWdpbmEgZGUgZ29vZ2xlIG1hcCBkZSBsYSB1YmljYWNpw7NuIGFjdHVhbCBlbiBsYSBwYW50YWxsYSBkZSBlZGljacOzbiBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICdEZWZpbmUgbG9zIHRpcG9zIGRlIG9iamV0byBkZSBldmVudG8gcXVlIHNlIG1hbmVqYW4gYSB0cmF2w6lzIGRlbCBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLid9ID0KICAgICAgICAnRGVmaW5lIGxhIGxpc3RhIGRlIHBhcsOhbWV0cm9zIHF1ZSBwdWVkZW4gc2VyIGVudmlhZG9zIGEgbGEgZnVuY2nDs24gZGUgYsO6c3F1ZWRhIGRlIHRpY2tldHMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHRpcG8gZGUgYmFja2VkIGRlIGNpdGEgZGUgdGlja2V0IHBhcmEgY2FtcG9zIGRpbsOhbWljb3MgZGUgdGlja2V0IGRlIHRpcG8gZmVjaGEgeSBob3JhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBiYWNrZWQgZGUgY2l0YSBkZSB0aWNrZXQgcGFyYSBlbCB0aWVtcG8gZGUgZXNjYWxhbWllbnRvIGRlIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgcGVuZGluZyB0aW1lLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHRpcG8gZGUgYmFja2VkIGRlIGNpdGEgZGUgdGlja2V0IHBhcmEgZWwgdGllbXBvIGRlIGVzcGVyYSBkZSB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJ0RlZmluZSBlbCBwbHVnaW4gZGUgdGlja2V0IHBhcmEgbGFzIGNpdGFzIGRlIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJ0NhbXBvRGluw6FtaWNvXyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgYXBwb2ludG1lbnQnfSA9ICdFZGl0YXIgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAnVGllbXBvIGRlIHByaW1lcmEgcmVzcHVlc3RhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ1BhbnRhbGxhIGRlIGltcG9ydGFjacOzbiBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAnVmluY3VsYXIgY2l0YXMgeSB0aWNrZXRzIGNvbiBlbCB0aXBvIGRlIHbDrW5jdWxvICJOb3JtYWwiLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnTGlzdGEgZGUgdG9kb3MgbG9zIGV2ZW50b3MgZGUgY2l0YXMgcXVlIHNvbiBkZXNwbGVnYW9zIGVuIGxhIEdVSS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ0xpc3RhIGRlIHRvZG9zIGxvcyBldmVudG9zIGRlIGNhbGVuZGFyaW8gcXVlIHNvbiBkZXNwbGVnYWRvcyBlbiBsYSBHVUkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAnTGlzdGEgZGUgY29sb3JlcyBlbiBoZXhhZGVjaW1hbCBSR0IgcXVlIGVzdGFyw6FuIGRpc3BvbmlibGVzIHBhcmEgc3Ugc2VsZWNjacOzbiBkdXJhbnRlIGxhIGNyZWFjacOzbiBkZSBjYWxlbmRhcmlvcy4gQXNlZ8O6cmVzZSBxdWUgbG9zIGNvbG9yZXMgc2VhbiBzdWZpY2llbnRlbWVudGUgb2JzY3Vyb3MgcGFyYSBxdWUgZWwgdGV4dG8gYmFuY28gc2UgdmVhIGNvcnJlY3RhbWVudGUgc29icmUgZWxsb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJ0dlc3Rpb25hciBkaWZlcmVudGVzIGNhbGVuZGFyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJ051bWVybyBtw6F4aW1vIGRlIGNhbGVuZGFyaW9zIGFjdGl2b3MgZW4gbGFzIHBhbnRhbGxhcyBkZSByZXN1bWVuLiBQb3IgZmF2b3Igbm90ZSBxdWUgdW4gbnVtZXJvIGdyYW5kZSBkZSBjYWxlbmRhcmlvcyBhY3Rpdm9zIHB1ZWRlIHRlbmVyIHVuIGltcGFjdG8gbmVnYXRpdm8gZW4gZWwgZGVzZW1wZcOxbyBkZWwgc2Vydmlkb3IgZGViaWRvIGEgdW5hIGdyYW4gY2FudGlkYWQgZGUgbGxhbWFkYXMgc2ltdWx0w6FuZWFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICdPVFJTIG5vIGFkbWl0ZSBjaXRhcyByZWN1cnJlbnRlcyBzaW4gZmVjaGEgZGUgZmluYWxpemFjacOzbiBvIHNpbiBuw7ptZXJvIGRlIGl0ZXJhY2lvbmVzLiBEdXJhbnRlIGVsIHByb2Nlc28gZGUgaW1wb3J0YWNpw7NuLCBwdWVkZSBvY3VycmlyIHF1ZSBlbCBhcmNoaXZvIElDUyBjb250ZW5nYSBkaWNoYXMgY2l0YXMuIEVuIHN1IGx1Z2FyLCBlbCBzaXN0ZW1hIGNyZWEgdG9kYXMgbGFzIGNpdGFzIGVuIGVsIHBhc2FkbywgYWRlbcOhcyBkZSBjaXRhcyBwYXJhIGxvcyBwcsOzeGltb3MgbiBtZXNlcyAoMTIwIG1lc2VzIC8gMTAgYcOxb3MgcG9yIGRlZmVjdG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLid9ID0gJ1Jlc3VtZW4gZGUgdG9kYXMgbGFzIGNpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlbmRpbmcgdGltZSd9ID0gJ1RpZW1wbyBkZSBlc3BlcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJ0LDunNxdWVkYSBkZSBwbHVnLWlucyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJ03Ds2R1bG8gUGx1Zy1pbiBkZSBiw7pzcXVlZGEgcGFyYSBhdXRvLWNvbXBsZXRhci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAnQ2FsZW5kYXJpbyBQw7pwbGljbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAnQ2FsZW5kYXJpbyBww7pibGljby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICdSZXN1bWVuIGRlIFJlY3Vyc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSd9ID0gJ1Jlc3VtZW4gZGUgUmVjdXJzb3MgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSBmb3IgY3JlYXRpbmcgYSBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhlIHRpY2tldCBkaXJlY3RseSBmcm9tIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIEFkZGl0aW9uYWwgYWNjZXNzIGNvbnRyb2wgdG8gc2hvdyBvciBub3Qgc2hvdyB0aGlzIGxpbmsgY2FuIGJlIGRvbmUgYnkgdXNpbmcgS2V5ICJHcm91cCIgYW5kIENvbnRlbnQgbGlrZSAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBUbyBjbHVzdGVyIG1lbnUgaXRlbXMgdXNlIGZvciBLZXkgIkNsdXN0ZXJOYW1lIiBhbmQgZm9yIHRoZSBDb250ZW50IGFueSBuYW1lIHlvdSB3YW50IHRvIHNlZSBpbiB0aGUgVUkuIFVzZSAiQ2x1c3RlclByaW9yaXR5IiB0byBjb25maWd1cmUgdGhlIG9yZGVyIG9mIGEgY2VydGFpbiBjbHVzdGVyIHdpdGhpbiB0aGUgdG9vbGJhci4nfSA9CiAgICAgICAgJ011ZXN0cmEgdW4gdsOtbmN1bG8gZW4gZWwgbWVuw7ogcGFyYSBjcmVhciB1bmEgY2l0YSBkZSBjYWxlbmRhcmlvIHZpbmN1bGFkYSBhbCB0aWNrZXQgZGlyZWN0byBkZXNkZSAgbGEgdmlzdGEgZGUgZGV0YWxsZSBkZSB0aWNrZXQgZGUgbGEgaW50ZXJmYWNlIGRlbCBhZ2VudGUuIEFkaWNpb25hbG1lbnRlIHNlIHB1ZWRlIGhhY2VyIGluIGNvbnRyb2wgZGUgYWNjZXNvIHBhcmEgbW9zdHJhciBvIG5vIGVzdGUgdsOtbmN1bG8gdXNhbmRvIGxhIENsYXZlICJHcm91cCIgeSBlbCBDb250ZW5pZG8gY29tbyAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBQYXJhIGFncnVwYXIgZWxlbWVudG8gZGVsIG1lbsO6IHVzZSBsYSBDbGF2ZSAiQ2x1c3Rlck5hbWUiIHBhcmEgZWwgQ29udGVuaWRvIGN1YWxxdWllciBub21icmUgcXVlIGRlc2VlIHZlciBlbiBsYSBpbnRlcmZhY2UgZGVsIHVzdWFyaW8uIFV0aWxpemUgIkNsdXN0ZXJQcmlvcml0eSIgcGFyYSBjb25maWd1cmFyIGVsIG9yZGVuIGRlIHVuIGNpZXJ0byBncnVwbyBkZW50cm8gZGUgbGEgYmFycmEgZGUgaGVycmFtaWVudGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2x1dGlvbiB0aW1lJ30gPSAnVGllbXBvIGRlIFNvbHVjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ1NlbGVjdGlvbiBkZSB0cmFuc3BvcnRlIHBhcmEgbm90aWZpY2FjaW9uZXMgZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy4nfSA9CiAgICAgICAgJ0Rpc3BhcmEgbGEgYWNjacOzbiBkZSBhw7FhZGlyIG8gYWN0dWFsaXphciBjaXRhcyBhdXRvbcOhdGljYXMgZGUgY2FsZW5kYXJpb3MgYmFzYWRhcyBlbiBjaWVydG9zIHRpZW1wb3MgZGUgdGlja2V0cy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICdUaWVtcG8gZGUgQWN0dWFsaXphY2nDs24nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6aHVfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnw4lydGVrZXpsZXQtw6lydGVzw610w6lzIGtlemVsw6lzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnSXR0IHR1ZCBlZ3kgYmXDoWxsw610w7Nmw6FqbHQgZmVsdMO2bHRlbmkgYXogw6lydGVrZXpsZXQtw6lydGVzw610w6lzZWsgaW1wb3J0w6Fsw6Fzw6Fob3ogYSByZW5kc3plcnJlLiBBIGbDoWpsbmFrIC55bWwgZm9ybcOhdHVtYmFuIGtlbGwgbGVubmllLCBhaG9neSBheiDDqXJ0ZWtlemxldC3DqXJ0ZXPDrXTDqXMgbW9kdWwgZXhwb3J0w6FsdGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnSXR0IHbDoWxhc3p0aGF0amEga2ksIGhvZ3kgbWVseSBlc2Vtw6lueWVrIGZvZ2rDoWsgYWt0aXbDoWxuaSBlenQgYXogw6lydGVzw610w6lzdC4gRWd5IHRvdsOhYmJpIMOpcnRla2V6bGV0c3rFsXLFkSBhbGthbG1hemhhdMOzIGxlbnQgYSBjc2FrIGVneSBiaXpvbnlvcyBmZWx0w6l0ZWxsZWwgcmVuZGVsa2V6xZEgw6lydGVrZXpsZXRla27DqWwgdMO2cnTDqW7FkSBrw7xsZMOpc2hlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgRmlsdGVyJ30gPSAnw4lydGVrZXpsZXQgc3rFsXLFkSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAnQ3NhcGF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAnRXLFkWZvcnLDoXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICdBIGZlbGhhc3puw6Fsw7Mgw6lydGVzw610w6lzZSBjc2FrIGVneXN6ZXIgZWd5IG5hcCBlZ3kgZWd5ZWTDvGxpIMOpcnRla2V6bGV0csWRbCBlZ3kga2l2w6FsYXN6dG90dCDDoXR2aXRlbCBoYXN6bsOhbGF0w6F2YWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdG8gYW4gYWdlbnQuJ30gPSAnQXogw6lydGVzw610w6lzZWsgZWd5IMO8Z3lpbnTDqXrFkW5layBrZXLDvGxuZWsgZWxrw7xsZMOpc3JlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGZpcnN0IDIwIGNoYXJhY3RlciBvZiB0aGUgYXBwb2ludG1lbnQgdGl0bGUuJ30gPSAnQXogw6lydGVrZXpsZXQgY8OtbWUgZWxzxZEgMjAga2FyYWt0ZXLDqW5layBsZWvDqXLDqXPDqWhlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBhcHBvaW50bWVudCBhdHRyaWJ1dGUnfSA9ICdBeiDDqXJ0ZWtlemxldCBqZWxsZW16xZFqw6luZWsgbGVrw6lyw6lzw6loZXonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICdBIG5hcHTDoXIgamVsbGVtesWRasOpbmVrIGxla8OpcsOpc8OpaGV6JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ05hcGlyZW5kIMOhdHRla2ludMWRJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdOYXB0w6FyYWsga2V6ZWzDqXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBBcHBvaW50bWVudCd9ID0gJ8OJcnRla2V6bGV0IGhvenrDoWFkw6FzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvcid9ID0gJ1N6w61uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuZCBkYXRlJ30gPSAnQmVmZWplesOpc2kgZMOhdHVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ0lzbcOpdGzDqXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAnTmVtIHRhbMOhbGhhdMOzayBuYXB0w6FyYWsuIEVsxZFzesO2ciBhZGpvbiBob3p6w6EgZWd5IG5hcHTDoXJhdCBhIG5hcHTDoXJhayBrZXplbMOpc2Ugb2xkYWwgaGFzem7DoWxhdMOhdmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ8OJcnRla2V6bGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdFeiBlZ3kgaXNtw6l0bMWRZMWRIMOpcnRla2V6bGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyd9ID0KICAgICAgICAnQ3NhayBlenQgYXogZWzFkWZvcmR1bMOhc3Qgc3plcmV0bsOpIHN6ZXJrZXN6dGVuaSB2YWd5IGF6IMO2c3N6ZXNldD8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnw5Zzc3plcyBlbMWRZm9yZHVsw6FzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAnQ3NhayBleiBheiBlbMWRZm9yZHVsw6FzJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICdOYXB0w6Fya2V6ZWzDqXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICdOYXB0w6FyIMOhdHRla2ludMWRJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICfDmmogbmFwdMOhciBob3p6w6FhZMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhbGVuZGFyJ30gPSAnTmFwdMOhciBob3p6w6FhZMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ8OJcnRla2V6bGV0ZWsgaW1wb3J0w6Fsw6FzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICdOYXB0w6FyIGltcG9ydMOhbMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICdJdHQgdMO2bHRoZXQgZmVsIGVneSBiZcOhbGzDrXTDs2bDoWpsdCBlZ3kgbmFwdMOhciBpbXBvcnTDoWzDoXPDoWhveiBhIHJlbmRzemVycmUuIEEgZsOhamxuYWsgLnltbCBmb3Jtw6F0dW1iYW4ga2VsbCBsZW5uaWUsIGFob2d5IGEgbmFwdMOhcmtlemVsxZEgbW9kdWwgZXhwb3J0w6FsdGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAnTmFwdMOhcmJlw6FsbMOtdMOhcyBmZWx0w7ZsdMOpc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAnTmFwdMOhciBpbXBvcnTDoWzDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAnU3rFsXLFkSBhIG5hcHTDoXJha2hveic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuJ30gPQogICAgICAgICdBIGNzb3BvcnRtZXrFkXTFkWwgZsO8Z2fFkWVuIGEgcmVuZHN6ZXIgYSBmZWxoYXN6bsOhbMOza2F0IGEgam9nb3N1bHRzw6FnaSBzemludGrDvGsgYWxhcGrDoW4gZm9namEgZW5nZWRuaSBob3p6w6Fmw6lybmkgYSBuYXB0w6FyaG96Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ0NzYWsgb2x2YXPDoXM6IGEgZmVsaGFzem7DoWzDs2sgbMOhdGhhdGrDoWsgw6lzIGV4cG9ydMOhbGhhdGrDoWsgYSBuYXB0w6FyYmFuIGzDqXbFkSDDtnNzemVzIMOpcnRla2V6bGV0ZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAnw4F0bW96Z2F0w6FzOiBhIGZlbGhhc3puw6Fsw7NrIG3Ds2Rvc8OtdGhhdGrDoWsgYXogw6lydGVrZXpsZXRla2V0IGEgbmFwdMOhcmJhbiwgZGUgYSBuYXB0w6FydsOhbGFzenTDoXMgbWVndsOhbHRvenRhdMOhc2EgbsOpbGvDvGwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdMw6l0cmVob3rDoXM6IGEgZmVsaGFzem7DoWzDs2sgbMOpdHJlaG96aGF0bmFrIMOpcyB0w7Zyw7ZsaGV0bmVrIMOpcnRla2V6bGV0ZWtldCBhIG5hcHTDoXJiYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICfDjXLDoXMsIG9sdmFzw6FzOiBhIGZlbGhhc3puw6Fsw7NrIG1hZ8OhdCBhIG5hcHTDoXJhdCBrZXplbGhldGlrLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVUkwnfSA9ICdVUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0IGNhbGVuZGFyJ30gPSAnTmFwdMOhciBleHBvcnTDoWzDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAnTmFwdMOhciBsZXTDtmx0w6lzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdOeWlsdsOhbm9zIG5hcHTDoXIgVVJMIG3DoXNvbMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ05hcHTDoXIgbmV2ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICdNw6FyIGzDqXRlemlrIGVneSBpbHllbiBuZXbFsSBuYXB0w6FyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAnSm9nb3N1bHRzw6FnaSBjc29wb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICdKZWd5w6lydGVrZXpsZXRlayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAnU3phYsOhbHknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnSGFzem7DoWxqYSBhIGxlbnRpIGxlaGV0xZFzw6lnZWtldCBhbm5hayBsZXN6xbFrw610w6lzw6loZXosIGhvZ3kgbWVseSBqZWd5ZWsgw6lydGVrZXpsZXRlaSBsZWd5ZW5layBhdXRvbWF0aWt1c2FuIGzDqXRyZWhvenZhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnVsOhbGFzc3pvbiBlZ3kgw6lydsOpbnllcyB2w6Fyw7NsaXN0w6F0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ0tlcmVzw6lzaSBhdHRyaWLDunR1bW9rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAnU3phYsOhbHlvayBtZWdoYXTDoXJvesOhc2EgYXV0b21hdGlrdXMgw6lydGVrZXpsZXRlayBsw6l0cmVob3rDoXPDoWhveiBlYmJlbiBhIG5hcHTDoXJiYW4gYSBqZWd5YWRhdG9rIGFsYXBqw6FuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgUnVsZSd9ID0gJ1N6YWLDoWx5IGhvenrDoWFkw6FzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAnVMO2YmInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ0tldmVzZWJiJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ8OaaiDDqXJ0ZWtlemxldCBob3p6w6FhZMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAnTmFwdMOhcmFrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYW4gb3ZlcnZpZXcgcGFnZSBmb3IgdGhlIEFwcG9pbnRtZW50IENhbGVuZGFyLid9ID0gJ0V6IGVneSDDoXR0ZWtpbnTFkSBvbGRhbCBheiDDqXJ0ZWtlemxldCBuYXB0w6FyaG96Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAnVMO6bCBzb2sgYWt0w612IG5hcHTDoXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAnVmFneSBrYXBjc29sam9uIGtpIG7DqWjDoW55YXQgZWzFkXN6w7ZyLCB2YWd5IG7DtnZlbGplIGEga29ybMOhdG90IGEgYmXDoWxsw610w6Fzb2tiYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICdIw6l0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIE1vbnRoJ30gPSAnSGF2aSBpZMWRdm9uYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ0hldGkgaWTFkXZvbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ05hcGkgaWTFkXZvbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1bXAnfSA9ICdVZ3LDoXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJ0VsdMO8bnRldMOpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93J30gPSAnTWVnamVsZW7DrXTDqXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICdBbGFwIGluZm9ybcOhY2nDs2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRMOhdHVtL2lkxZEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ8OBbGzDrXRzYSBlenQgZWd5IGJlZmVqZXrDqXNpIGTDoXR1bSBlbMWRdHRpIMOpcnTDqWtyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAnw4FsbMOtdHNhIGV6dCBlZ3kga2V6ZMOpc2kgZMOhdHVtIHV0w6FuaSDDqXJ0w6lrcmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICdFeiBlZ3kgaXNtw6l0bMWRZMWRIMOpcnRla2V6bGV0IGVsxZFmb3JkdWzDoXNhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0thdHRpbnRzb24gaWRlIGEgc3rDvGzFkSDDqXJ0ZWtlemxldCBtZWd0ZWtpbnTDqXPDqWhlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnS2F0dGludHNvbiBpZGUgYSBzesO8bMWRIMOpcnRla2V6bGV0IHN6ZXJrZXN6dMOpc8OpaGV6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdHeWFrb3Jpc8OhZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ01pbmRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnUmVsYXTDrXYgaWTFkXBvbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnQml6dG9zYW4gdMO2csO2bG5pIHN6ZXJldG7DqSBlenQgYXogw6lydGVrZXpsZXRldD8gRXp0IGEgbcWxdmVsZXRldCBuZW0gbGVoZXQgdmlzc3phdm9ubmkuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICfDiXJ0ZWtlemxldCBpbXBvcnTDoWzDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAnQSBmZWx0w7ZsdMO2dHQgZsOhamxuYWsgw6lydsOpbnllcyBpQ2FsIGZvcm3DoXR1bWJhbiAoLmljcykga2VsbCBsZW5uaWUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ0hhIGEga8OtdsOhbnQgbmFwdMOhciBuaW5jcyBpdHQgZmVsc29yb2x2YSwgYWtrb3IgZ3nFkXrFkWRqw7ZuIG1lZyBhcnLDs2wsIGhvZ3kgdmFuLWUgbGVnYWzDoWJiIOKAnmzDqXRyZWhvesOhc+KAnSBqb2dvc3VsdHPDoWdhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJ0ZyaXNzw610aSBhIG1lZ2zDqXbFkSDDqXJ0ZWtlemxldGVrZXQ/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAnQSBuYXB0w6FyYmFuIGzDqXbFkSBpbHllbiBlZ3llZGkgYXpvbm9zw610w7N2YWwgcmVuZGVsa2V6xZEgw7Zzc3plcyBtZWdsw6l2xZEgw6lydGVrZXpsZXQgZmVsw7xsIGxlc3ogw61ydmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ05hcHTDoXIgZmVsdMO2bHTDqXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMnfSA9ICfDiXJ0ZWtlemxldGVrIGltcG9ydMOhbMOhc2EnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnw5pqIMOpcnRla2V6bGV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nvb24nfSA9ICdIYW1hcm9zYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSBuYXAnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAnQXogw6lydGVzw610w6lzIG5ldmUgbcOhciBsw6l0ZXppayEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgKHJlc291cmNlcyksIHdobyBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSBhcHBvaW50bWVudCd9ID0gJ8OcZ3lpbnTDqXrFkSAoZXLFkWZvcnLDoXNvayksIGFraSBheiDDqXJ0ZWtlemxldGVuIGJlbMO8bCBraSBsZXR0IGplbMO2bHZlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ0F6IMO2c3N6ZXMgw7xneWludMOpesWRLCBha2lrbmVrIChsZWdhbMOhYmIpIG9sdmFzw6FzaSBqb2dvc3VsdHPDoWd1ayB2YW4gYXogw6lydGVrZXpsZXRoZXogKG5hcHTDoXJob3opJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnQXogw7Zzc3plcyDDvGd5aW50w6l6xZEsIGFraWtuZWsgw61yw6FzaSBqb2dvc3VsdHPDoWd1ayB2YW4gYXogw6lydGVrZXpsZXRoZXogKG5hcHTDoXJob3opJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICdBIHJlbmRzemVyIG5lbSB0dWR0YSBsw6l0cmVob3puaSBhIG5hcHTDoXJhdCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJ30gPSAnVmVneWUgZmVsIGEga2FwY3NvbGF0b3QgYSByZW5kc3plcmdhemTDoXZhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdOaW5jcyBuYXB0w6FyLWF6b25vc8OtdMOzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdOaW5jcyBob3p6w6Fmw6lyw6lzZSBlaGhleiBhIG5hcHTDoXJob3ohJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdOYXB0w6FyIHN6ZXJrZXN6dMOpc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3IgdXBkYXRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0hpYmEgYSBuYXB0w6FyIGZyaXNzw610w6lzZWtvciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ05lbSBzaWtlcsO8bHQgYmVvbHZhc25pIGEgbmFwdMOhcmJlw6FsbMOtdMOzIGbDoWpsdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGZpbGUgaXMgdmFsaWQuJ30gPSAnR3nFkXrFkWRqw7ZuIG1lZyBhcnLDs2wsIGhvZ3kgYSBmw6FqbCDDqXJ2w6lueWVzLWUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ05lbSBzaWtlcsO8bHQgaW1wb3J0w6FsbmkgYSBuYXB0w6FyYXQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ05hcHTDoXIgaW1wb3J0w6FsdmEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICdOYXB0w6FyLWF6b25vc8OtdMOzIHN6w7xrc8OpZ2VzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJ05lbSBzaWtlcsO8bHQgbGVrw6lybmkgYXogYWRhdG9rYXQgYSBtZWdhZG90dCBuYXB0w6FyLWF6b25vc8OtdMOzaG96JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICclcyDDqXJ0ZWtlemxldCBzaWtlcmVzZW4gaW1wb3J0w6FsdmEgYSh6KSAlcyBuYXB0w6FyYmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jys1IG1pbnV0ZXMnfSA9ICcrNSBwZXJjJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxNSBtaW51dGVzJ30gPSAnKzE1IHBlcmMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzAgcGVyYyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzEgw7NyYSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICdNaW5kZW4gw6lydGVrZXpsZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJ30gPSAnSG96esOhbSByZW5kZWx0IMOpcnRla2V6bGV0ZWsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ0NzYWsgYXogw7ZuaMO2eiByZW5kZWx0IMOpcnRla2V6bGV0ZWsgdmFubmFrIG1lZ2plbGVuw610dmUhIEJlw6FsbMOtdMOhc29rIG1lZ3bDoWx0b3p0YXTDoXNhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ0F6IMOpcnRla2V6bGV0IG5lbSB0YWzDoWxoYXTDsyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICdTb2hhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IERheSd9ID0gJ01pbmRlbiBuYXAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ01pbmRlbiBow6l0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICdNaW5kZW4gaMOzbmFwYmFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFllYXInfSA9ICdNaW5kZW4gw6l2YmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbSd9ID0gJ0VnecOpbmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICdOYXBpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ0hldGknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ0hhdmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAnw4l2ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICdtaW5kZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICclcyBhbGthbG9tbWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ2VkZGlnOiDigKYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAn4oCmIGFsa2Fsb21tYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgJXMnfSA9ICdlZGRpZzogJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAnTmluY3Mgw6lydGVzw610w6lzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBwZXJjY2VsIGVsxZF0dGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyDDs3LDoXZhbCBlbMWRdHRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyBuYXBwYWwgZWzFkXR0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzIGjDqXR0ZWwgZWzFkXR0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ2F6IMOpcnRla2V6bGV0IGtlemRldGUgZWzFkXR0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAnbWl1dMOhbiBheiDDqXJ0ZWtlemxldCBlbGtlemTFkWTDtnR0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ2F6IMOpcnRla2V6bGV0IHbDqWdlIGVsxZF0dCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gZW5kZWQnfSA9ICdtaXV0w6FuIGF6IMOpcnRla2V6bGV0IHbDqWdldCDDqXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAnTmluY3Mgam9nb3N1bHRzw6FnISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBjb3VsZCBub3QgYmUgZGVsZXRlZCEnfSA9ICdBIGthcGNzb2xhdG9rYXQgbmVtIHNpa2Vyw7xsdCB0w7Zyw7ZsbmkhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgY291bGQgbm90IGJlIGNyZWF0ZWQhJ30gPSAnQSBrYXBjc29sYXRvdCBuZW0gc2lrZXLDvGx0IGzDqXRyZWhvem5pISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICdOZW0gbGVoZXQgdMO2csO2bG5pIGEgamVnecOpcnRla2V6bGV0ZXQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ05pbmNzZW5layBqb2dvc3VsdHPDoWdvayEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAnTmluY3NlbmVrIGpvZ29zdWx0c8OhZ29rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ0EgcmVuZHN6ZXIgbmVtIHR1ZHRhIGltcG9ydMOhbG5pIGEgZsOhamx0ISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAndG92w6FiYmkgKyVkJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAnTmluY3MgJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICdOaW5jcyBpbHllbiBmZWxoYXN6bsOhbMOzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJ8OJcnbDqW55dGVsZW4gbmFwdMOhciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAnw4lydsOpbnl0ZWxlbiBVUkwhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0hpYmEgdMO2cnTDqW50IGEgbmFwdMOhciBleHBvcnTDoWzDoXNha29yISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ0ZyaXNzw610w6lzIChwZXJjKSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuJ30gPSAnw4lydGVrZXpsZXQgbmFwdMOhciDDoXR0ZWtpbnTFkSBvbGRhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ8OJcnRla2V6bGV0LcOpcnRlc8OtdMOpc2VrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICfDiXJ0ZWtlemxldCBuYXB0w6FyIGVzZW3DqW55IG1vZHVsLCBhbWVseSBlbMWRa8Opc3rDrXRpIGF6IMOpcnRlc8OtdMOpc2kgYmVqZWd5esOpc2VrZXQgYXogw6lydGVrZXpsZXRla2hlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJ8OJcnRla2V6bGV0IG5hcHTDoXIgZXNlbcOpbnkgbW9kdWwsIGFtZWx5IGZyaXNzw610aSBhIGplZ3nDqXJ0ZWtlemxldGLFkWwgc3rDoXJtYXrDsyBhZGF0b2trYWwgcmVuZGVsa2V6xZEgamVneWV0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICfDiXJ0ZWtlemxldC1zemVya2VzenTDqXMga8OpcGVybnnFkS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ8OJcnRla2V6bGV0bGlzdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICfDiXJ0ZWtlemxldGxpc3RhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnw4lydGVrZXpsZXQtw6lydGVzw610w6lzZWsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnw4lydGVrZXpsZXRlayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ05hcHTDoXJrZXplbMOpcyBrw6lwZXJuecWRLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICdWw6FsYXNzemEga2ksIGhvZ3kgbWlseWVuIHTDrXB1c8O6IMOpcnRla2V6bGV0LXbDoWx0b3p0YXTDoXNyw7NsIHN6ZXJldG5lIMOpcnRlc8OtdMOpc2VrZXQga2FwbmkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICdFenplbCBhIGplZ2d5ZWwgw7Zzc3pla2FwY3NvbHQgw7pqIG5hcHTDoXIgw6lydGVrZXpsZXQgbMOpdHJlaG96w6FzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ8OJcnRla2V6bGV0LcOpcnRlc8OtdMOpc2VrIGzDqXRyZWhvesOhc2Egw6lzIGtlemVsw6lzZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICfDmmogw6lydGVrZXpsZXQgbMOpdHJlaG96w6FzYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICdBbm5hayBtZWdoYXTDoXJvesOhc2EsIGhvZ3kgbWVseSBvc3psb3BvayBsZWd5ZW5layBsw6F0aGF0w7NrIGEga2FwY3NvbHQgw6lydGVrZXpsZXQgZmVsw7xsZXRpIGVsZW1lbiAoTGlua09iamVjdDo6Vmlld01vZGUgPSDigJ7DtnNzemV0ZXR04oCdKS4gTGVoZXRzw6lnZXMgYmXDoWxsw610w6Fzb2s6IDAgPSBsZXRpbHR2YSwgMSA9IGVsw6lyaGV0xZEsIDIgPSBhbGFww6lydGVsbWV6ZXR0ZW4gZW5nZWTDqWx5ZXpldHQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gaWNvbiB3aXRoIGxpbmsgdG8gdGhlIGdvb2dsZSBtYXAgcGFnZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96IGVneSBpa29udCBhIGplbGVubGVnaSBoZWx5IEdvb2dsZSBUw6lya8OpcCBvbGRhbMOhcmEgbXV0YXTDsyBoaXZhdGtvesOhc3NhbCBheiDDqXJ0ZWtlemxldC1zemVya2VzenTDqXMga8OpcGVybnnFkW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBhem9rYXQgYXogZXNlbcOpbnlvYmpla3R1bSB0w61wdXNva2F0LCBhbWVseWVrIGF6IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCBtb2R1bG9uIGtlcmVzenTDvGwgbGVzem5layBrZXplbHZlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgYXpva25hayBhIHBhcmFtw6l0ZXJla25layBhIGxpc3TDoWrDoXQsIGFtZWx5ZWsgw6F0YWRoYXTDs2sgYSBqZWd5a2VyZXPDqXMgZnVua2Npw7NuYWsuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgYSBqZWd5w6lydGVrZXpsZXQgdMOtcHVzw6FuYWsgaMOhdHTDqXJwcm9ncmFtasOhdCBhIGplZ3kgZMOhdHVtIMOpcyBpZMWRIGRpbmFtaWt1cyBtZXrFkWrDqWhlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGVzY2FsYXRpb24gdGltZS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgYSBqZWd5w6lydGVrZXpsZXQgdMOtcHVzw6FuYWsgaMOhdHTDqXJwcm9ncmFtasOhdCBhIGplZ3kgZXN6a2Fsw6FjacOzcyBpZGVqw6loZXouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGEgamVnecOpcnRla2V6bGV0IHTDrXB1c8OhbmFrIGjDoXR0w6lycHJvZ3JhbWrDoXQgYSBqZWd5IGbDvGdnxZFiZW4gbMOpdsWRIGlkZWrDqWhlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJ01lZ2hhdMOhcm96emEgYSBqZWd5YsWRdsOtdG3DqW55dCBhIG5hcHTDoXIgw6lydGVrZXpsZXRla2hlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnRHluYW1pY0ZpZWxkXyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgYXBwb2ludG1lbnQnfSA9ICfDiXJ0ZWtlemxldCBzemVya2VzenTDqXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICdFbHPFkSB2w6FsYXN6aWTFkSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICfDiXJ0ZWtlemxldGVrIGltcG9ydMOhbMOhc2Ega8OpcGVybnnFkS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAnw5Zzc3pla2FwY3NvbGphIGF6IMOpcnRla2V6bGV0ZWtldCDDqXMgamVneWVrZXQgZWd5IOKAnk5vcm3DoWzigJ0gdMOtcHVzw7ogaGl2YXRrb3rDoXNzYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdBeiDDtnNzemVzIMOpcnRla2V6bGV0IGVzZW3DqW55IGxpc3TDoWphLCBhbWVseWVrIG1lZ2plbGVubmVrIGEgZ3JhZmlrdXMgZmVsw7xsZXRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ0F6IMO2c3N6ZXMgbmFwdMOhcmVzZW3DqW55IGxpc3TDoWphLCBhbWVseWVrIG1lZ2plbGVubmVrIGEgZ3JhZmlrdXMgZmVsw7xsZXRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICdTesOtbmVrIGxpc3TDoWphIGhleGFkZWNpbcOhbGlzIFJHQiBmb3Jtw6FiYW4sIGFtZWx5ZWsgZWzDqXJoZXTFkWsgbGVzem5layBhIGtpdsOhbGFzenTDoXNob3ogYSBuYXB0w6FyIGzDqXRyZWhvesOhc2Ega8O2emJlbi4gR3nFkXrFkWRqw7ZuIG1lZyBhcnLDs2wsIGhvZ3kgYSBzesOtbmVrIGVsw6lnIHPDtnTDqXRlay1lIGFoaG96LCBob2d5IGEgdmlsw6Fnb3Mgc3rDtnZlZyBtZWdqZWxlbsOtdGhldMWRIGxlZ3llbiByYWp0dWsuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJ0vDvGzDtm5iw7Z6xZEgbmFwdMOhcmFrIGtlemVsw6lzZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICdBeiBha3TDrXYgbmFwdMOhcmFrIGxlZ25hZ3lvYmIgc3rDoW1hIGF6IMOhdHRla2ludMWRIGvDqXBlcm55xZFrw7ZuLiBOZSBmZWxlZGplLCBob2d5IGF6IGFrdMOtdiBuYXB0w6FyYWsgbmFneSBzesOhbWEgdGVsamVzw610bcOpbnliZWxpIGhhdMOhc3NhbCBsZWhldCBhIGtpc3pvbGfDoWzDs2rDoXJhIGEgdMO6bCBzb2sgZWd5aWRlasWxIGjDrXbDoXMgaW5kw610w6Fzw6F2YWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgZG9lc25cJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS4nfSA9CiAgICAgICAgJ0F6IE9UUlMgbmVtIHTDoW1vZ2F0amEgYSBiZWZlamV6w6lzaSBkw6F0dW0gdmFneSBheiBpc23DqXRsw6lzZWsgc3rDoW1hIG7DqWxrw7xsaSBpc23DqXRsxZFkxZEgw6lydGVrZXpsZXRla2V0LiBBeiBpbXBvcnTDoWzDoXNpIGZvbHlhbWF0IHNvcsOhbiBlbMWRZm9yZHVsaGF0LCBob2d5IGF6IElDUy1mw6FqbCBpbHllbiDDqXJ0ZWtlemxldGVrZXQgdGFydGFsbWF6LiBFaGVseWV0dCBhIHJlbmRzemVyIGF6IMO2c3N6ZXMgw6lydGVrZXpsZXRldCBhIG3Dumx0YmFuIGhvenphIGzDqXRyZSwgdmFsYW1pbnQgYSBrw7Z2ZXRrZXrFkSBuIGjDs25hcGJhbiAoMTIwIGjDs25hcC8xMCDDqXYgYWxhcMOpcnRlbG1lemV0dGVuKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICdBeiDDtnNzemVzIMOpcnRla2V6bGV0IMOhdHRla2ludMWRamUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlbmRpbmcgdGltZSd9ID0gJ1bDoXJha296w6FzaSBpZMWRJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICdCxZF2w610bcOpbnkga2VyZXPDqXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICdCxZF2w610bcOpbnkga2VyZXPDqXNpIG1vZHVsIGF6IGF1dG9tYXRpa3VzIGtpZWfDqXN6w610w6lzaGV6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICdOeWlsdsOhbm9zIG5hcHTDoXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIGNhbGVuZGFyLid9ID0gJ055aWx2w6Fub3MgbmFwdMOhci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICdFcsWRZm9ycsOhcyDDoXR0ZWtpbnTFkSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknfSA9ICdFcsWRZm9ycsOhcyDDoXR0ZWtpbnTFkSAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAnRWd5IGhpdmF0a296w6FzdCBqZWxlbsOtdCBtZWcgYSBtZW7DvGJlbiBhIGplZ2d5ZWwgw7Zzc3pla2FwY3NvbHQgbmFwdMOhciDDqXJ0ZWtlemxldCBsw6l0cmVob3rDoXPDoWhveiBrw7Z6dmV0bGVuw7xsIGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgamVneW5hZ3nDrXTDoXMgbsOpemV0w6lixZFsLiBFemVuIGhpdmF0a296w6FzIG1lZ2plbGVuw610w6lzw6loZXogdmFneSBtZWcgbmVtIGplbGVuw610w6lzw6loZXogdG92w6FiYmkgaG96esOhZsOpcsOpc2kgdmV6w6lybMWRdCBsZWhldCBrw6lzesOtdGVuaSBhIOKAnkdyb3Vw4oCdIGt1bGNzIMOpcyBheiDigJ5ydzpjc29wb3J0MTttb3ZlX2ludG86Y3NvcG9ydDLigJ0gdGFydGFsb21ob3ogaGFzb25sw7MgaGFzem7DoWxhdMOhdmFsLiBBIG1lbsO8cG9udG9rIGNzb3BvcnRva2JhIHJlbmRlesOpc8OpaGV6IGhhc3puw6FsamEgYSDigJ5DbHVzdGVyTmFtZeKAnSBrdWxjc290IGLDoXJtaWx5ZW4gb2x5YW4gdGFydGFsb21tYWwsIGFtZWx5ZXQgYSBmZWxoYXN6bsOhbMOzaSBmZWzDvGxldGVuIGzDoXRuaSBzemVyZXRuZS4gSGFzem7DoWxqYSBhIOKAnkNsdXN0ZXJQcmlvcml0eeKAnSBrdWxjc290IGVneSBiaXpvbnlvcyBmw7xydCBzb3JyZW5kasOpbmVrIGJlw6FsbMOtdMOhc8OhaG96IGF6IGVzemvDtnp0w6Fyb24gYmVsw7xsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2x1dGlvbiB0aW1lJ30gPSAnTWVnb2xkw6FzaSBpZMWRJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnw4F0dml0ZWxraXbDoWxhc3p0w6FzIGF6IMOpcnRla2V6bGV0LcOpcnRlc8OtdMOpc2VraGV6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICdBa3RpdsOhbGphIGF6IGF1dG9tYXRpa3VzIG5hcHTDoXIgw6lydGVrZXpsZXRlayBob3p6w6FhZMOhc8OhdCB2YWd5IGZyaXNzw610w6lzw6l0IGJpem9ueW9zIGplZ3lpZMWRayBhbGFwasOhbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICdGcmlzc8OtdMOpc2kgaWTFkSc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnR2VyZW5jaWFtZW50byBkZSBub3RpZmljYcOnw6NvIGRvIGNvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnQXF1aSB2b2PDqiBwb2RlIGZhemVyIHVwbG9hZCBkZSB1bSBhcnF1aXZvIGRlIGNvbmZpZ3VyYcOnw6NvIHBhcmEgaW1wb3J0YXIgbm90aWZpY2HDp8O1ZXMgZGUgY29tcHJvbWlzc28gcGFyYSBvIHNldSBzaXN0ZW1hLiBPIGFycXVpdm8gZGV2ZSBlc3RhciBubyBmb3JtYXRvIC55bWwgY29tbyBleHBvcnRhZG8gcGVsbyBtw7NkdWxvIGRlIG5vdGlmaWNhw6fDo28gZGUgY29tcHJvbWlzc28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnQXF1aSB2b2PDqiBwb2RlIGVzY29saGVyIHF1YWlzIGV2ZW50b3MgaXLDo28gYWNpb25hciBlc3NhIG5vdGlmaWNhw6fDo28uIFVtIGZpbHRybyBkZSBjb21wcm9taXNzbyBhZGljaW9uYWwgcG9kZSBzZXIgYXBsaWNhZG8gYWJhaXhvIHBhcmEgZW52aWFyIGFwZW5hcyBjb21wcm9taXNzb3MgY29tIGRldGVybWluYWRvcyBjcml0w6lyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdGaWx0cmFyIENvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlYW0nfSA9ICdUaW1lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAnUmVjdXJzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ05vdGlmaWNhciBvIHVzdcOhcmlvIGFwZW5hcyB1bWEgdmV6IHBvciBkaWEgc29icmUgdW0gw7puaWNvIGNvbXByb21pc3NvIHVzYW5kbyB1bSB0cmFuc3BvcnRlIHNlbGVjaW9uYWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ0FzIG5vdGlmaWNhw6fDtWVzIHPDo28gZW52aWFkYXMgYSB1bSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICdQYXJhIG9idGVyIG9zIDIwIHByaW1laXJvcyBjYXJhY3RlcmVzIGRvIHTDrXR1bG8gZG8gY29tcHJvbWlzc28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAnUGFyYSBvYnRlciBvIGF0cmlidXRvIGNvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnUGFyYSBvYnRlciBvIGF0cmlidXRvIGNhbGVuZMOhcmlvJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ1Zpc8OjbyBnZXJhbCBkYSBBZ2VuZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ0dlcmVuY2lhciBDYWxlbmTDoXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnQWRpY2lvbmFyIENvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnQ29yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuZCBkYXRlJ30gPSAnRGF0YSBmaW5hbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICdSZXBldGlyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ05lbmh1bSBjYWxlbmTDoXJpbyBlbmNvbnRyYWRvLiBQb3IgZmF2b3IsIHByaW1laXJvIGFkaWNpb25lIHVtIGNhbGVuZMOhcmlvIHVzYW5kbyBhIHDDoWdpbmEgZGUgR2VyZW5jaWFtZW50byBkZSBDYWxlbmTDoXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAnQ29tcHJvbWlzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ0VzdGUgw6kgdW0gY29tcHJvbWlzc28gcmVwZXRpZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICdWb2PDqiBkZXNlamEgZWRpdGFyIGFwZW5hcyBlc3NhIG9jb3Jyw6puY2lhIG91IHRvZGFzIGFzIG9jb3Jyw6puY2lhcz8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnVG9kYXMgYXMgb2NvcnLDqm5jaWFzICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdXN0IHRoaXMgb2NjdXJyZW5jZSd9ID0gJ0FwZW5hcyBlc3NhIG9jb3Jyw6puY2lhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICdHZXJlbmNpYW1lbnRvIGRlIENhbGVuZMOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE92ZXJ2aWV3J30gPSAnVmlzw6NvIGdlcmFsIGRlIENhbGVuZMOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdBZGljaW9uYXIgbm92byBDYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICdBZGljaW9uYXIgQ2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGFyIENvbXByb21pc3Nvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICdJbXBvcnRhciBDYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhIGNhbGVuZGFyIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSBjYWxlbmRhciBtYW5hZ2VtZW50IG1vZHVsZS4nfSA9CiAgICAgICAgJ0FxdWkgdm9jw6ogcG9kZSBjYXJyZWdhciB1bSBhcnF1aXZvIGRlIGNvbmZpZ3VyYcOnw6NvIHBhcmEgaW1wb3J0YXIgdW0gY2FsZW5kw6FyaW8gcGFyYSBzZXUgc2lzdGVtYS4gTyBhcnF1aXZvIHByZWNpc2Egc2VyIGVtIC55bWwgIGNvbW8gbyBleHBvcnRhZG8gcGVsbyBtw7NkdWxvIGRlIGdlcmVuY2lhbWVudG8gZGUgY2FsZW5kw6FyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAnQ2FycmVnYXIgY29uZmlndXJhw6fDo28gZG8gY2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAnSW1wb3J0YXIgQ2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBjYWxlbmRhcnMnfSA9ICdGaWx0cm8gcGFyYSBjYWxlbmTDoXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwZW5kaW5nIG9uIHRoZSBncm91cCBmaWVsZCwgdGhlIHN5c3RlbSB3aWxsIGFsbG93IHVzZXJzIHRoZSBhY2Nlc3MgdG8gdGhlIGNhbGVuZGFyIGFjY29yZGluZyB0byB0aGVpciBwZXJtaXNzaW9uIGxldmVsLid9ID0KICAgICAgICAnRGVwZW5kZW5kbyBkbyBjYW1wbyBncnVwbywgbyBzaXN0ZW1hIGxpYmVyYXLDoSB1c3XDoXJpbyBwYXJhIGFjZXNzYXIgbyBjYWxlbmTDoXJpbyBkZSBhY29yZG8gY29tIG8gbsOtdmVsIGRlIHBlcm1pc3PDo28gZGVsZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQgb25seTogdXNlcnMgY2FuIHNlZSBhbmQgZXhwb3J0IGFsbCBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnQXBlbmFzIGxlaXR1cmE6IFVzdcOhcmlvcyBwb2RlbSB2ZXIgZSBleHBvcnRhciB0b2RhcyBvcyBjb21wcm9taXNzb3MgbmVzc2UgY2FsZW5kw6FyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAnTW92ZXIgcGFyYTogVXN1w6FyaW8gcG9kZXLDo28gbW9kaWZpY2FyIGNvbXByb21pc3NvcyBubyBjYWxlbmTDoXJpbywgbWFzIHNlbSBhbHRlcmFyIGEgc2VsZcOnw6NvIGRvIGNhbGVuZMOhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnQ3JpYXI6IHVzdcOhcmlvcyBwb2RlbSBjcmlhciBlIGV4Y2x1aXIgY29tcHJvbWlzc29zIG5vIGNhbGVuZMOhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAnTGVpdHVyYS9lc2NyaXRhOiBvcyB1c3XDoXJpb3MgcG9kZW0gZ2VyZW5jaWFyIG8gcHLDs3ByaW8gY2FsZW5kw6FyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdFeHBvcnRhciBjYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3dubG9hZCBjYWxlbmRhcid9ID0gJ0JhaXhhciBjYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdDb3BpYXIgVVJMIHB1YmxpY2EgZG8gY2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ05vbWUgZG8gY2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAnQ2FsZW5kw6FyaW8gY29tIG1lc21vIG5vbWUgasOhIGV4aXN0ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ0dydXBvIGRlIHBlcm1pc3PDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ0NvbXByb21pc3NvcyBkZSBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICdSZWdyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuJ30gPQogICAgICAgICdVc2UgYXMgb3DDp8O1ZXMgYWJhaXhvIHBhcmEgZGltaW51aXIgcXVhaXMgY29tcHJvbWlzc29zIGRlIGNoYW1hZG8gc2Vyw6NvIGNyaWFkb3MgYXV0b21hdGljYW1lbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnUG9yIGZhdm9yLCBzZWxlY2lvbmUgdW1hIGZpbGEgdsOhbGlkYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGF0dHJpYnV0ZXMnfSA9ICdBdHJpYnV0b3MgZGEgcGVzcXVpc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICdEZWZpbmlyIHJlZ3JhcyBwYXJhIGNyaWHDp8OjbyBhdXRvbcOhdGljYSBkZSBjb21wcm9taXNzb3MgbmVzdGUgY2FsZW5kw6FyaW8gYmFzZWFkbyBlbSBkYWRvcyBkZSBjaGFtYWRvLiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFJ1bGUnfSA9ICdBZGljaW9uYXIgcmVncmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ01haXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ01lbm9zJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ0FkaWNpb25hciBub3ZvIENvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0NhbGVuZMOhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGlzIGFuIG92ZXJ2aWV3IHBhZ2UgZm9yIHRoZSBBcHBvaW50bWVudCBDYWxlbmRhci4nfSA9ICdFc3RhIHDDoWdpbmEgw6kgdW1hIGRlIHZpc8OjbyBnZXJhbCBwYXJhIG8gY2FsZW5kw6FyaW8gZGUgY29tcHJvbWlzc29zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAnTXVpdG9zIGNhbGVuZMOhcmlvcyBhdGl2b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAnUG9yIGZhdm9yLCBkZXNsaWd1ZSBhbGd1bnMgcHJpbWVpcm8gb3UgYXVtZW50ZSBvIGxpbWl0ZSBuYSBjb25maWd1cmHDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vlayd9ID0gJ1NlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ0xpbmhhIGRlIHRlbXBvIGRvIG3DqnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ0xpbmhhIGRlIHRlbXBvIGRhIHNlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICdMaW5oYSBkZSB0ZW1wbyBkbyBkaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ1B1bGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICdSZWN1c2FyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICdNb3N0cmFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Jhc2ljIGluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYcOnw6NvIGLDoXNpY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRGF0YS9Ib3JhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICdQb3IgZmF2b3IsIGNvbmZpZ3VyZSBvIHZhbG9yIGFudGVzIGRhIGRhdGEgZmluYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ1BvciBmYXZvciwgY29uZmlndXJlIG8gdmFsb3IgYW50ZXMgZGEgZGF0YSBpbmljaWFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAnRXN0YSB1bWEgb2NvcnLDqm5jaWEgZGUgdW0gY29tcHJvbWlzc28gZGUgcmVwZXRpw6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gc2VlIHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnQ2xpcXVlIGFxdWkgcGFyYSB2ZXIgbyBjb21wcm9taXNzbyBwYWkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0NsaXF1ZSBhcXVpIHBhcmEgZWRpdGFyIG8gY29tcHJvbWlzc28gcGFpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdGcmVxdcOqbmNpYSAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnknfSA9ICdUb2Rvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnUG9udG8gZGUgdGVtcG8gcmVsYXRpdm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnVGVtIGNlcnRlemEgcXVlIGRlc2VqYSByZW1vdmVyIGVzc2UgY29tcHJvbWlzc28/IEVzc2Egb3BlcmHDp8OjbyBuw6NvIHBvZGUgc2VyIGRlc2ZlaXRhLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnSW1wb3J0YcOnw6NvIGRlIGNvbXByb21pc3Nvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ08gYXJxdWl2byBlbnZpYWRvIGRldmUgZXN0YXIgbm8gZm9ybWF0byB2w6FsaWRvIGlDYWwgKC5pY3MpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICdTZSBvIENhbGVuZMOhcmlvIGRlc2VqYWRvIG7Do28gZXN0aXZlciBsaXN0YWRvIGFxdWksIHBvciBmYXZvciBjZXJ0aWZpcXVlLXNlIHF1ZSB2b2PDqiB0ZW5oYSwgcGVsbyBtZW5vcyBwZXJtaXNzw7VlcyAiQ3JpYXIiLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJ0F0dWFsaXphciBjb21wcm9taXNzb3MgZXhpc3RlbnRlcz8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGV4aXN0aW5nIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIgd2l0aCBzYW1lIFVuaXF1ZUlEIHdpbGwgYmUgb3ZlcndyaXR0ZW4uJ30gPQogICAgICAgICdUb2RvcyBvcyBjb21wcm9taXNzb3Mgbm8gY2FsZW5kw6FyaW8gY29tIG8gbWVzbW8gVW5pcXVlSUQgc2Vyw6NvIHNvYnJlc2NyaXRvLiAgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ0NhcnJlZ2FyIGNhbGVuZMOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMnfSA9ICdJbXBvcnRhciBjb21wcm9taXNzb3MnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnTm92byBDb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAnRW0gYnJldmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSBkaWFzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJ05vbWUgZGEgbm90aWZpY2HDp8OjbyBqw6EgZXhpc3RlISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCAocmVzb3VyY2VzKSwgd2hvIGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIGFwcG9pbnRtZW50J30gPSAnQXRlbmRlbnRlIChyZWN1cnNvcyksIHF1ZSBzw6NvIHNlbGVjaW9uYWRvcyBkZW50cm8gZG8gY29tcHJvbWlzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIChhdCBsZWFzdCkgcmVhZCBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnVG9kb3Mgb3MgYWdlbnRlcyBjb20gKG5vIG3DrW5pbW8pIHBlcm1pc3PDo28gZGUgbGVpdHVyYSBkbyBjb21wcm9taXNzbyAoY2FsZW5kw6FyaW8pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnVG9kb3Mgb3MgYXRlbmRlbnRlcyBjb20gcGVybWlzc8OjbyBkZSBlc2NyaXRhIG5vIGNvbXByb21pc3NvIChjYWxlbmTDoXJpbyknOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyISd9ID0gJ1Npc3RlbWEgbsOjbyBmb2kgY2FwYXogZGUgY3JpYXIgbyBDYWxlbmTDoXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJ30gPSAnUG9yIGZhdm9yLCBlbnRyZSBlbSBjb250YXRvIGNvbSBvIGFkbWluaXN0cmFkb3IuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAnTmVuaHVtIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ1ZvY8OqIG7Do28gdGVtIGFjZXNzbyBhIGVzdGUgY2FsZW5kw6FyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdFZGl0YXIgQ2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3IgdXBkYXRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0Vycm8gYW8gYXR1YWxpemFyIG8gY2FsZW5kw6FyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkblwndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4nfSA9ICdOw6NvIGZvaSBwb3Nzw612ZWwgbGVyIGFycXVpdm8gZGUgY29uZmlndXJhw6fDo28gZG8gY2FsZW5kw6FyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJ1BvciBmYXZvciwgdmVyaWZpcXVlIHNlIG8gc2V1IGFycXVpdm8gw6kgdsOhbGlkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGltcG9ydCB0aGUgY2FsZW5kYXIhJ30gPSAnTsOjbyBmb2kgcG9zc8OtdmVsIGltcG9ydGFyIG8gY2FsZW5kw6FyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ0NhbGVuZMOhcmlvIGltcG9ydGFkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZCBDYWxlbmRhcklEISd9ID0gJ05lY2Vzc8OhcmlvIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCByZXRyaWV2ZSBkYXRhIGZvciBnaXZlbiBDYWxlbmRhcklEJ30gPSAnTsOjbyBmb2kgcG9zc8OtdmVsIG9idGVyIGRhZG9zIHBhcmEgZGV0ZXJtaW5hZG8gQ2FsZW5kYXJJRCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzZnVsbHkgaW1wb3J0ZWQgJXMgYXBwb2ludG1lbnQocykgdG8gY2FsZW5kYXIgJXMuJ30gPSAnSW1wb3J0YWRvIGNvbSBzdWNlc3NvICVzIGNvbXByb21pc3NvKHMpIHBhcmEgbyBjYWxlbmTDoXJpbyAlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJys1IG1pbnV0b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzE1IG1pbnV0ZXMnfSA9ICcrMTUgbWludXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMCBtaW51dG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMSBob3JhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ1RvZG9zIG9zIGNvbXByb21pc3Nvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICdDb21wcm9taXNzb3MgYXRyaWJ1w61kb3MgYSBtaW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ01vc3RyYXIgYXBlbmFzIGNvbXByb21pc3NvcyBhc3NpbmFkb3MgYSB2b2PDqiEgQWx0ZXJhciBjb25maWd1cmHDp8O1ZXMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAnQ29tcHJvbWlzc28gbsOjbyBlbmNvbnRyYWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXZlcid9ID0gJ051bmNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IERheSd9ID0gJ1RvZG8gZGlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICdUb2RvIHNlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBNb250aCd9ID0gJ1RvZG8gTcOqcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBZZWFyJ30gPSAnVG9kbyBBbm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAnQ3VzdG9taXphZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICdEacOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ1NlbWFuYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ01lbnNhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZZWFybHknfSA9ICdBbnVhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydldmVyeSd9ID0gJ3RvZG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAnZGUgJXMgdGVtcG8ocyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgLi4uJ30gPSAnYXTDqSAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAnZGUgLi4uIHRlbXBvKHMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAnYXTDqSAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBub3RpZmljYXRpb24nfSA9ICdOZW5odW1hIG5vdGlmaWNhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgbWludXRlKHMpIGJlZm9yZSd9ID0gJyVzIG1pbnV0byhzKSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBob3VyKHMpIGJlZm9yZSd9ID0gJyVzIGhvcmEocykgYW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgZGF5KHMpIGJlZm9yZSd9ID0gJyVzIGRpYShzKSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzIHNlbWFuYSBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ2FudGVzIGRvIGNvbXByb21pc3NvIGluaWNpYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICdkZXBvaXMgcXVlIG8gY29tcHJvbWlzc28gZm9pIGluaWNpYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ2FudGVzIGRvIGNvbXByb21pc3NvIGVuY2VycmFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ2RlcG9pcyBxdWUgbyBjb21wcm9taXNzbyBmb2kgZW5jZXJyYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAnU2VtIHBlcm1pc3PDo28hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGNvdWxkIG5vdCBiZSBkZWxldGVkISd9ID0gJ09zIGxpbmtzIG7Do28gcG9kZSBzZXIgYXBhZ2FkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayBjb3VsZCBub3QgYmUgY3JlYXRlZCEnfSA9ICdPIExpbmsgbsOjbyBwb2RlIHNlciBjcmlhZG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ07Do28gw6kgcG9zc8OtdmVsIGV4Y2x1aXIgbyBjb21wcm9taXNzbyBkbyBjaGFtYWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICdTZW0gcGVybWlzc8O1ZXMhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ1NlbSBwZXJtaXNzw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ1Npc3RlbWEgbsOjbyBmb2kgY2FwYXogZGUgaW1wb3J0YXIgYXJxdWl2byEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJyslZCBtYWlzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAnTmVuaHVtICVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAnVXN1w6FyaW8gbsOjbyBlbmNvbnRyYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAnQ2FsZW5kw6FyaW8gaW52YWxpZG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ1VSTCBpbnbDoWxpZGEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0hvdXZlIHVtIGVycm8gYW8gZXhwb3J0YXIgbyBjYWxlbmTDoXJpbyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICdBdHVhbGl6YcOnw6NvIChtaW51dG9zKSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuJ30gPSAnUMOhZ2luYSBkZSB2aXPDo28gZ2VyYWwgZGUgY2FsZW5kw6FyaW8gZGUgY29tcHJvbWlzc29zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAnTm90aWZpY2HDp8O1ZXMgZGUgY29tcHJvbWlzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgcHJlcGFyZXMgbm90aWZpY2F0aW9uIGVudHJpZXMgZm9yIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ03Ds2R1bG8gZGUgZXZlbnRvIGRvIGNhbGVuZMOhcmlvIGRlIGNvbXByb21pc3NvcyBxdWUgcHJlcGFyYSBhIGVudHJhZGEgZGUgbm90aWZpY2HDp8OjbyBwYXJhIGFwb250YW1lbnRvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJ03Ds2R1bG8gZGUgZXZlbnRvIGRvIGNhbGVuZMOhcmlvIGRlIGNvbXByb21pc3NvcyBxdWUgYXR1YWxpemEgbyBjaGFtYWRvIGNvbSBkYWRvcyBkbyBjb21wcm9taXNzbyBkZSBjaGFtYWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICdUZWxhIGRlIGVkacOnw6NvIGRlIGNvbXByb21pc3NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAnTGlzdGEgZGUgY29tcHJvbWlzc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAnTGlzdGEgZGUgY29tcHJvbWlzc29zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnTm90aWZpY2HDp8O1ZXMgZGUgY29tcHJvbWlzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnQ29tcHJvbWlzc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAnVGVsYSBkZSBnZXJlbmNpYW1lbnRvIGRlIGNhbGVuZMOhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICdFc2NvbGhhIHBhcmEgYSBxdWFsIHRpcG8gZGUgYWx0ZXJhw6fDtWVzIG5vIGNvbXByb21pc3NvIHZvY8OqIGRlc2VqYSByZWNlYmVyIG5vdGlmaWNhw6fDtWVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSBuZXcgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoaXMgdGlja2V0J30gPSAnQ3JpYXIgdW0gbm92byBjb21wcm9taXNzbyBkZSBjYWxlbmTDoXJpbyBhc3NvY2lhZG8gYSBlc3NlIGNoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdDcmlhciBlIGdlcmVuY2lhciBub3RpZmljYcOnw7VlcyBkZSBjb21wcm9taXNzby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICdDcmlhciBub3ZvIGNvbXByb21pc3NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJ0RlZmluZSBxdWFpcyBjb2x1bmFzIHNlcsOjbyBleGliaWRhcyBubyB3aWRnZXQgZGUgY29tcHJvbWlzc29zIGFzc29jaWFkb3MgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gQ29uZmlndXJhw6fDtWVzIHBvc3PDrXZlaXM6IDAgPSBEZXNhYmlsaXRhZG8gLCAxID0gRGlzcG9uw612ZWwsIDIgPSBBdGl2YWRvIHBvciBwYWRyw6NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICdEZWZpbmUgdW0gw61jb25lIGNvbSBsaW5rIHBhcmEgYSBww6FnaW5hIGNvbSBtYXBhIGRvIGdvb2dsZSBkYSBsb2NhbGl6YcOnw6NvIGF0dWFsIG5hIHRlbGEgZGUgZWRpw6fDo28gZGUgY29tcHJvbWlzc28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAnRGVmaW5lIG9zIHRpcG9zIGRlIGV2ZW50b3MgZGUgb2JqZXRvcyBxdWUgc2Vyw6NvIHRyYXRhZGFzIGF0cmF2w6lzIGRlIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICdEZWZpbmUgYSBsaXN0YSBkZSBwYXLDom1ldHJvcyBxdWUgcG9kZW0gc2VyIHBhc3NhZG9zIHBhcmEgYSBmdW7Dp8OjbyBkZSBidXNjYSBkbyB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgcGFyYSBvIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGVzY2FsYXRpb24gdGltZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgcGFyYSBvIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIHBhcmEgbyB0aWNrZXQgcGVuZGluZyB0aW1lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAnRGVmaW5lIG8gcGx1Z2luIGRvIHRpY2tldCBwYXJhIGNvbXByb21pc3NvcyBkbyBjYWxlbmTDoXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnRHluYW1pY0ZpZWxkXyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgYXBwb2ludG1lbnQnfSA9ICdFZGl0YXIgY29tcHJvbWlzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlyc3QgcmVzcG9uc2UgdGltZSd9ID0gJ1RlbXBvIGRlIHByaW1laXJhIHJlc3Bvc3RhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ1RlbGEgZGUgaW1wb3J0YcOnw6NvIGRlIGNvbXByb21pc3Nvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICdBc3NvY2lhciBjb21wcm9taXNzb3MgZSBjaGFtYWRvcyBjb21vIHVtYSB0aXBvICJOb3JtYWwiLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnTGlzdGEgZGUgdG9kb3Mgb3MgZXZlbnRvcyBkZSBjb21wcm9taXNzbyBxdWUgc2Vyw6NvIGV4aWJpZG8gbmEgR1VJLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnTGlzdGEgZGUgdG9kb3Mgb3MgZXZlbnRvcyBkbyBjYWxlbmTDoXJpbyBhIHNlciBleGliaWRvIG5hIEdVSS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICdMaXN0YSBkZSBjb3JlcyBlbSBSR0IgaGV4YWRlY2ltYWwgcXVlIGVzdGFyw6NvIGRpc3BvbsOtdmVpcyBwYXJhIHNlbGXDp8OjbyBkdXJhbnRlIGEgY3JpYcOnw6NvIGRvIGNhbGVuZMOhcmlvLiBDZXJ0aWZpcXVlLXNlIGRlIGFzIGNvcmVzIHPDo28gZXNjdXJhcyBvIHN1ZmljaWVudGUsIHRleHRvIGJyYW5jYXMgcG9kZW0gc2VyIHNvYnJlcG9zdG9zLiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAnR2VyZW5jaWFyIGNhbGVuZMOhcmlvIGRpZmVyZW50ZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAnTsO6bWVybyBtw6F4aW1vIGRlIGNhbGVuZMOhcmlvIGF0aXZvcyBuYXMgdmlzw7VlcyBnZXJhaXMuIFBvciBmYXZvciwgbm90ZSBxdWUgdW0gbnVtZXJvIGdyYW5kZSBkZSBjYWxlbmTDoXJpbyBhdGl2b3Mgdm9jw6ogcG9kZXLDoSB0ZXIgaW1wYWN0b3MgbmEgcGVyZm9ybWFuY2UgZG8gc2Vydmlkb3IgZGV2aWRvIGEgbXVpdGFzIGNoYW1hZGFzIHNpbXVsdMOibmVhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnTyBPVFJTIG7Do28gc3Vwb3J0YSBjb21wcm9taXNzb3MgcmVjb3JyZW50ZXMsIHNlbSBkYXRhIGRlIHTDqXJtaW5vIG91IG8gbsO6bWVybyBkZSBpdGVyYcOnw7Vlcy4gRHVyYW50ZSBvIHByb2Nlc3NvIGRlIGltcG9ydGHDp8OjbywgcG9kZSBhY29udGVjZXIgZG8gYXJxdWl2byBJQ1MsIGNvbnRlciBlc3NlcyBjb21wcm9taXNzb3MuIEVtIHZleiBkaXNzbywgbyBzaXN0ZW1hIGNyaWEgdG9kb3Mgb3MgY29tcHJvbWlzc29zIG5vIHBhc3NhZG8sIGFsw6ltIGRlIGNvbXByb21pc3NvcyBwYXJhIG9zIHByw7N4aW1vcyBuIG1lc2VzICgxMjAgbWVzZXMvMTAgYW5vcyBwb3IgcGFkcsOjbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAnVmlzw6NvIGdlcmFsIGRlIHRvZG9zIG9zIGNvbXByb21pc3Nvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAnRGF0YSBkZSBwZW5kw6puY2lhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICdQZXNxdWlzYXIgUGx1Z2luJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAnTcOzZHVsbyBkZSBwZXNxdWlzYSBkZSBhdXRvY29tcGxldGFyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICdDYWxlbmTDoXJpbyBww7pibGljbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAnQ2FsZW5kw6FyaW8gcMO6YmxpY28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICdWaXPDo28gZ2VyYWwgZGUgcmVjdXJzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAnVmlzw6NvIGdlcmFsIGRlIHJlY3Vyc28gKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSBmb3IgY3JlYXRpbmcgYSBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhlIHRpY2tldCBkaXJlY3RseSBmcm9tIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIEFkZGl0aW9uYWwgYWNjZXNzIGNvbnRyb2wgdG8gc2hvdyBvciBub3Qgc2hvdyB0aGlzIGxpbmsgY2FuIGJlIGRvbmUgYnkgdXNpbmcgS2V5ICJHcm91cCIgYW5kIENvbnRlbnQgbGlrZSAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBUbyBjbHVzdGVyIG1lbnUgaXRlbXMgdXNlIGZvciBLZXkgIkNsdXN0ZXJOYW1lIiBhbmQgZm9yIHRoZSBDb250ZW50IGFueSBuYW1lIHlvdSB3YW50IHRvIHNlZSBpbiB0aGUgVUkuIFVzZSAiQ2x1c3RlclByaW9yaXR5IiB0byBjb25maWd1cmUgdGhlIG9yZGVyIG9mIGEgY2VydGFpbiBjbHVzdGVyIHdpdGhpbiB0aGUgdG9vbGJhci4nfSA9CiAgICAgICAgJ01vc3RyYSB1bSBsaW5rIG5vIG1lbnUgcGFyYSBjcmlhciB1bSBjb21wcm9taXNzbyBkZSBjYWxlbmTDoXJpbyB2aW5jdWxhZG8gYW8gY2hhbWFkbyBuYSB2aXPDo28gdGlja2V0IHpvb20gbmEgaW50ZXJmYWNlIGRvIGF0ZW5kZW50ZS4gQ29udHJvbGUgZGUgYWNlc3NvIGFkaWNpb25hbCBwYXJhIG1vc3RyYXIgb3UgbsOjbyBvIHbDrW5jdWxvIHBvZGUgc2VyIGZlaXRvIHVzYW5kbyBhIGNoYXZlICJHcm91cCIgZSBvIGNvbnRlw7pkbyBjb21vICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFBhcmEgYWdydXBhciBpdGVucyBkZSBtZW51IHVzZSBhIGNoYXZlICJDbHVzdGVyTmFtZSIgZSBwYXJhIG8gY29udGXDumRvIHF1YWxxdWVyIG5vbWUgcXVlIGRlc2VqZSB2ZXIgbmEgaW50ZXJmYWNlIGRvIHVzdcOhcmlvLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgcGFyYSBjb25maWd1cmFyIGEgb3JkZW0gZGUgdW0gZGV0ZXJtaW5hZG8gY29uanVudG8gZGVudHJvIGRvIHRvb2xiYXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvbHV0aW9uIHRpbWUnfSA9ICdUZW1wbyBkZSBzb2x1w6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJhbnNwb3J0IHNlbGVjdGlvbiBmb3IgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdTZWxlw6fDo28gZGUgdHJhbnNwb3J0ZSBwYXJhIG5vdGlmaWNhw6fDtWVzIGRlIGNvbXByb21pc3NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICdEaXNwYXJhIGFkacOnw6NvIG91IGF0dWFsaXphw6fDo28gZGUgY29tcHJvbWlzc29zIGRvIGNhbGVuZMOhcmlvIGF1dG9tw6F0aWNvIGNvbSBiYXNlIGVtIGRldGVybWluYWRvcyB0ZW1wb3MgZG8gdGlja2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ1RlbXBvIGRlIGF0dWFsaXphw6fDo28nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAn0JrQvtC80LDQvdC00LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UnfSA9ICfQoNC10YHRg9GA0YHRiyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGZpcnN0IDIwIGNoYXJhY3RlciBvZiB0aGUgYXBwb2ludG1lbnQgdGl0bGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ9Ce0LHQt9C+0YAg0L/QvtCy0LXRgdGC0LrQuCDQtNC90Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ9Cj0L/RgNCw0LLQu9GP0YLRjCDQutCw0LvQtdC90LTQsNGA0Y/QvNC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBBcHBvaW50bWVudCd9ID0gJ9CU0L7QsdCw0LLQuNGC0Ywg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvcid9ID0gJ9Cm0LLQtdGCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuZCBkYXRlJ30gPSAn0JTQsNGC0LAg0L7QutC+0L3Rh9Cw0L3QuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ9Cf0L7QstGC0L7RgNC10L3QuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ9Cd0LUg0L3QsNC30L3QsNGH0LXQvSDQutCw0LvQtdC90LTQsNGA0YwuINCU0L7QsdCw0LLRjNGC0LUg0LrQsNC70LXQvdC00LDRgNGMINC40YHQv9C+0LvRjNC30YPRjyDRjdC60YDQsNC9INGD0L/RgNCw0LLQu9C10L3QuNGPINC60LDQu9C10L3QtNCw0YDRj9C80LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAn0JzQtdGA0L7Qv9GA0LjRj9GC0LjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50J30gPSAn0K3RgtC+INC/0L7QstGC0L7RgNGP0Y7RidC10LXRgdGPINC80LXRgNC+0L/RgNC40Y/RgtC40LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICfQktGLINC20LXQu9Cw0LXRgtC1INGA0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINGC0L7Qu9GM0LrQviDRgtC10LrRg9GJ0LXQtSDQvNC10YDQvtC/0YDQuNGP0YLQuNC1INC40LvQuCDQstGB0LUg0LXQs9C+INC/0L7QstGC0L7RgNC10L3QuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ9CS0YHQtSDQstGF0L7QttC00LXQvdC40Y8v0LrQvtC/0LjQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdXN0IHRoaXMgb2NjdXJyZW5jZSd9ID0gJ9Ci0L7Qu9GM0LrQviDRjdGC0YMg0LrQvtC/0LjRjic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBNYW5hZ2VtZW50J30gPSAn0KPQv9GA0LDQstC70LXQvdC40LUg0LrQsNC70LXQvdC00LDRgNGP0LzQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ9Ce0LHQt9C+0YAg0LrQsNC70LXQvdC00LDRgNC10LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ9CU0L7QsdCw0LLQuNGC0Ywg0L3QvtCy0YvQuSDQutCw0LvQtdC90LTQsNGA0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhbGVuZGFyJ30gPSAn0JTQvtCx0LDQstC40YLRjCDQutCw0LvQtdC90LTQsNGA0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ9CY0LzQv9C+0YDRgtC40YDQvtCy0LDRgtGMINC80LXRgNC+0L/RgNC40Y/RgtC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgSW1wb3J0J30gPSAn0JjQvNC/0L7RgNGCINC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhIGNhbGVuZGFyIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSBjYWxlbmRhciBtYW5hZ2VtZW50IG1vZHVsZS4nfSA9CiAgICAgICAgJ9CX0LTQtdGB0Ywg0LLRiyDQvNC+0LbQtdGC0LUg0LfQsNCz0YDRg9C30LjRgtGMINGE0LDQudC7INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQuCDQtNC70Y8g0LjQvNC/0L7RgNGC0LAg0LrQsNC70LXQvdC00LDRgNGPINCyINCy0LDRiNGDINGB0LjRgdGC0LXQvNGDLiDQpNCw0LnQuyDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0LIg0YTQvtGA0LzQsNGC0LUgLnltbCDRhNCw0LnQuyDRjdC60YHQv9C+0YDRgtCwINC40Lcg0LzQvtC00YPQu9GPINGD0L/RgNCw0LLQu9C10L3QuNGPINC60LDQu9C10L3QtNCw0YDRj9C80LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAn0JfQsNCz0YDRg9C30LjRgtGMINC60L7QvdGE0LjQs9GD0YDQsNGG0LjRjiDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAn0JjQvNC/0L7RgNGC0LjRgNC+0LLQsNGC0Ywg0LrQsNC70LXQvdC00LDRgNGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAn0KTQuNC70YzRgtGAINC00LvRjyDQmtCw0LvQtdC90LTQsNGA0LXQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuJ30gPQogICAgICAgICfQkiDQt9Cw0LLQuNGB0LjQvNC+0YHRgtC4INC+0YIg0LfQvdCw0YfQtdC90LjRjyDQsiDQv9C+0LvQtSBncm91cCwg0YHQuNGB0YLQtdC80LAg0L/RgNC10LTQvtGB0YLQsNCy0LvRj9C10YIg0LDQs9C10L3RgtCw0Lwg0LTQvtGB0YLRg9C/INC6INC60LDQu9C10L3QtNCw0YDRjiDQsiDQsiDRgdC+0L7RgtCy0LXRgtGB0YLQstC40Lgg0YEg0YPRgNC+0LLQvdC10Lwg0LXQs9C+INC/0L7Qu9C90L7QvNC+0YfQuNC5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ9Ci0L7Qu9GM0LrQviDRh9GC0LXQvdC40LU6INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvQuCDQvNC+0LPRg9GCINGB0LzQvtGC0YDQtdGC0Ywg0Lgg0Y3QutGB0L/QvtGA0YLQuNGA0L7QstCw0YLRjCDQstGB0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQutCw0LvQtdC90LTQsNGA0Y8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAn0J/QtdGA0LXQvNC10YHRgtC40YLRjCDQsjog0L/QvtC70YzQt9C+0LLQsNGC0LXQu9C4INC80L7Qs9GD0YIg0LjQt9C80LXQvdGP0YLRjCDQvNC10YDQvtC/0YDQuNGP0YLQuNGPINCyINC60LDQu9C10L3QtNCw0YDQtSwg0L3QviDQsdC10Lcg0LLRi9Cx0L7RgNCwINC60LDQu9C10L3QtNCw0YDRjyAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ9Ch0L7Qt9C00LDRgtGMOiDQv9C+0LvRjNC30L7QstCw0YLQtdC70Lgg0LzQvtCz0YPRgiDRgdC+0LfQtNCw0LLQsNGC0Ywg0Lgg0YPQtNCw0LvRj9GC0Ywg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQsiDQutCw0LvQtdC90LTQsNGA0LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICfQl9Cw0L/QuNGB0Ywv0YfRgtC10L3QuNC1OiDQv9C+0LvRjNC30L7QstCw0YLQtdC70Lgg0LjQvNC10Y7RgiDQv9C+0LvQvdC+0LUg0YPQv9GA0LDQstC70LXQvdC40LUg0LrQsNC70LXQvdC00LDRgNC10LwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICfQrdC60YHQv9C+0YDRgiDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICfQl9Cw0LPRgNGD0LfQutCwINC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICfQmtC+0L/QuNGA0L7QstCw0YLRjCDQv9GD0LHQu9C40YfQvdGL0LkgVVJMINC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBuYW1lJ30gPSAn0JjQvNGPINC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICfQmtCw0LvQtdC90LTQsNGA0Ywg0YEg0YLQsNC60LjQvCDQuNC80LXQvdC10Lwg0YPQttC1INGB0YPRidC10YHRgtCy0YPQtdGCLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAn0JPRgNGD0L/Qv9C+0LLRi9C1INC/0YDQsNCy0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ9Cc0LXRgNC+0L/RgNC40Y/RgtC40Y8g0LfQsNGP0LLQutC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICfQn9GA0LDQstC40LvQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuJ30gPQogICAgICAgICfQmNGB0L/QvtC70YzQt9GD0LnRgtC1INC+0L/RhtC40Lgg0L3QuNC20LUsINGH0YLQvtCx0Ysg0YPQutCw0LfQsNGC0YwsINC60LDQutC40LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQt9Cw0Y/QstC+0Log0LHRg9C00YPRgiDRgdC+0LfQtNCw0L3RiyDQsNCy0YLQvtC80LDRgtC40YfQtdGB0LrQuC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJ9CS0YvQsdC10YDQuNGC0LUg0L/RgNCw0LLQuNC70YzQvdGD0Y4g0L7Rh9C10YDQtdC00YwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhdHRyaWJ1dGVzJ30gPSAn0JDRgtGA0LjQsdGD0YLRiyDQv9C+0LjRgdC60LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICfQl9Cw0LTQsNGC0Ywg0L/RgNCw0LLQuNC70LAg0LTQu9GPINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC+0LPQviDRgdC+0LfQtNCw0L3QuNGPINC80LXRgNC+0L/RgNC40Y/RgtC40Lkg0LIg0Y3RgtC+0Lwg0LrQsNC70LXQvdC00LDRgNC1LCDQvtGB0L3QvtCy0LDQvdC90YvRhSDQvdCwINC00LDQvdC90YvRhSDQt9Cw0Y/QstC60LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAn0JTQvtCx0LDQstC40YLRjCDQv9GA0LDQstC40LvQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAn0JHQvtC70LXQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAn0JzQtdC90LXQtSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQXBwb2ludG1lbnQnfSA9ICfQlNC+0LHQsNCy0LjRgtGMINC90L7QstC+0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhcnMnfSA9ICfQmtCw0LvQtdC90LTQsNGA0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhbiBvdmVydmlldyBwYWdlIGZvciB0aGUgQXBwb2ludG1lbnQgQ2FsZW5kYXIuJ30gPSAn0K3RgtC+INGB0YLRgNCw0L3QuNGG0LAg0L7QsdC30L7RgNCwINCc0LXRgNC+0L/RgNC40Y/RgtC40Lkg0LrQsNC70LXQvdC00LDRgNGPLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAn0KHQu9C40YjQutC+0Lwg0LzQvdC+0LPQviDQsNC60YLQuNCy0L3Ri9GFINC60LDQu9C10L3QtNCw0YDQtdC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBlaXRoZXIgdHVybiBzb21lIG9mZiBmaXJzdCBvciBpbmNyZWFzZSB0aGUgbGltaXQgaW4gY29uZmlndXJhdGlvbi4nfSA9CiAgICAgICAgJ9Cf0L7QttCw0LvRg9C50YHRgtCwINC40LvQuCDQvtGC0LrQu9GO0YfQuNGC0LUg0L3QtdC60L7RgtC+0YDRi9C1INC40LvQuCDRg9Cy0LXQu9C40YfRjNGC0LUg0L/RgNC10LTQtdC70YzQvdC+0LUg0LrQvtC70LjRh9C10YHRgtCy0L4g0LIg0L3QsNGB0YLRgNC+0LnQutCw0YUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICfQndC10LTQtdC70Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICfQnNC10YHRj9GH0L3Ri9C5INCz0YDQsNGE0LjQuic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBXZWVrJ30gPSAn0J3QtdC00LXQu9GM0L3Ri9C5INCz0YDQsNGE0LjQuic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICfQk9GA0LDRhNC40Log0LTQvdGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1bXAnfSA9ICfQn9C10YDQtdC50YLQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNtaXNzJ30gPSAn0J7RgtC60LvQvtC90LjRgtGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICfQn9C+0LrQsNC30LDRgtGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Jhc2ljIGluZm9ybWF0aW9uJ30gPSAn0J7RgdC90L7QstC90YvQtSDQtNCw0L3QvdGL0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAn0JTQsNGC0LAv0JLRgNC10LzRjyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBiZWZvcmUgRW5kIGRhdGUuJ30gPSAn0J/QvtC20LDQu9GD0LnRgdGC0LAsINGD0YHRgtCw0L3QvtCy0LjRgtC1INGN0YLQviDQt9C90LDRh9C10L3QuNC1INC00L4g0LLRgNC10LzQtdC90Lgg0L7QutC+0L3Rh9Cw0L3QuNGPLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4nfSA9ICfQn9C+0LbQsNC70YPQudGB0YLQsCwg0YPRgdGC0LDQvdC+0LLQuNGC0LUg0Y3RgtC+INC30L3QsNGH0LXQvdC40LUg0L/QvtGB0LvQtSDQstGA0LXQvNC10L3QuCDQvdCw0YfQsNC70LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICfQrdGC0L4g0YDRj9C0INC/0L7QstGC0L7RgNGP0Y7RidC40YXRgdGPINC80LXRgNC+0L/RgNC40Y/RgtC40LkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gc2VlIHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAn0JrQu9C40LrQvdC40YLQtSDRgdGO0LTQsCDRh9GC0L7QsdGLINC+0YLQutGA0YvRgtGMINGA0L7QtNC40YLQtdC70YzRgdC60L7QtSDQvNC10YDQvtC/0YDQuNGP0YLQuNC1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICfQmtC70LjQutC90LjRgtC1INGB0Y7QtNCwINGH0YLQvtCx0Ysg0YDQtdC00LDQutGC0LjRgNC+0LLQsNGC0Ywg0YDQvtC00LjRgtC10LvRjNGB0LrQvtC1INC80LXRgNC+0L/RgNC40Y/RgtC40LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJ9Cn0LDRgdGC0L7RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5J30gPSAn0JrQsNC20LTRi9C1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbGF0aXZlIHBvaW50IG9mIHRpbWUnfSA9ICfQntGC0L3QvtGB0LjRgtC10LvRjNC90LDRjyDRgtC+0YfQutCwINCy0YDQtdC80LXQvdC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nfSA9CiAgICAgICAgJ9CS0Ysg0LTQtdC50YHRgtCy0LjRgtC10LvRjNC90L4g0LbQtdC70LDQtdGC0LUg0YPQtNCw0LvQuNGC0Ywg0Y3RgtC+INC80LXRgNC+0L/RgNC40Y/RgtC40LU/INCt0YLQsCDQvtC/0LXRgNCw0YbQuNGPINC90LUg0LzQvtC20LXRgiDQsdGL0YLRjCDQvtGC0LzQtdC90LXQvdCwLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAn0JjQvNC/0L7RgNGCINC80LXRgNC+0L/RgNC40Y/RgtC40LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkZWQgZmlsZSBtdXN0IGJlIGluIHZhbGlkIGlDYWwgZm9ybWF0ICguaWNzKS4nfSA9ICfQl9Cw0LPRgNGD0LbQsNC10LzRi9C5INGE0LDQudC7INC00L7Qu9C20LXQvSDQuNC80LXRgtGMINC/0YDQsNCy0LjQu9GM0L3Ri9C5IGlDYWwg0YTQvtGA0LzQsNGCICguaWNzKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgZGVzaXJlZCBDYWxlbmRhciBpcyBub3QgbGlzdGVkIGhlcmUsIHBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBhdCBsZWFzdCBcJ2NyZWF0ZVwnIHBlcm1pc3Npb25zLid9ID0KICAgICAgICAn0JXRgdC70Lgg0LbQtdC70LDQtdC80YvQuSDQutCw0LvQtdC90LTQsNGA0Ywg0L7RgtGB0YPRgtGB0YLQstGD0LXRgiDQsiDRgdC/0LjRgdC60LUsINGD0LHQtdC00LjRgtC10YHRjCwg0YfRgtC+INGDINCy0LDRgSDQtdGB0YLRjCDRhdC+0YLRjyDQsdGLINC/0YDQsNCy0LAg0L3QsCDRgdC+0LfQtNCw0L3QuNC1IC0gXCdjcmVhdGVcJy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICfQntCx0L3QvtCy0LjRgtGMINGB0YPRidC10YHRgtCy0YPRjtGJ0LXQtSDQvNC10YDQvtC/0YDQuNGP0YLQuNC1Pyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJ9CS0YHQtSDRgdGD0YnQtdGB0YLQstGD0Y7RidC40LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQsiDQutCw0LvQtdC90LTQsNGA0LUg0YEg0L7QtNC40L3QsNC60L7QstGL0LwgVW5pcXVlSUQg0LHRg9C00YPRgiDQv9C10YDQtdC30LDQv9C40YHQsNC90YsuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ9CX0LDQs9GA0YPQt9C40YLRjCDQutCw0LvQtdC90LTQsNGA0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ9CY0LzQv9C+0YDRgtC40YDQvtCy0LDRgtGMINC80LXRgNC+0L/RgNC40Y/RgtC40Y8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAn0J3QvtCy0L7QtSDQvNC10YDQvtC/0YDQuNGP0YLQuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nvb24nfSA9ICfQodC60L7RgNC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzUg0LTQvdC10LknOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIChhdCBsZWFzdCkgcmVhZCBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICfQodC40YHRgtC10LzQtSDQvdC1INGD0LTQsNC70L7RgdGMINGB0L7Qt9C00LDRgtGMINC60LDQu9C10L3QtNCw0YDRjCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJ30gPSAn0KHQstGP0LbQuNGC0LXRgdGMINGBINCw0LTQvNC40L3QuNGB0YLRgNCw0YLQvtGA0L7QvC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICfQntGC0YHRg9GC0YHRgtCy0YPQtdGCIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ9CjINCy0LDRgSDQvdC10YIg0L/RgNCw0LIg0L3QsCDQtNC+0YHRgtGD0L8g0Log0Y3RgtC+0LzRgyDQutCw0LvQtdC90LTQsNGA0Y4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICfQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDQutCw0LvQtdC90LTQsNGA0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3IgdXBkYXRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ9Ce0YjQuNCx0LrQuCDQv9GA0Lgg0L7QsdC90L7QstC70LXQvdC40Lgg0LrQsNC70LXQvdC00LDRgNGPISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAn0J3QtdCy0L7Qt9C80L7QttC90L4g0L/RgNC+0YfQuNGC0LDRgtGMINGE0LDQudC7INC90LDRgdGC0YDQvtC10Log0LrQsNC70LXQvdC00LDRgNGPLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICfQo9Cx0LXQtNC40YLQtdGB0YwsINC/0L7QttCw0LvRg9C50YHRgtCwLCDRh9GC0L4g0YTQsNC50Lsg0LjQvNC10LXRgiDQv9GA0LDQstC40LvRjNC90YvQuSDRhNC+0YDQvNCw0YIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ9Cd0LXQstC+0LfQvNC+0LbQvdC+INC40LzQv9C+0YDRgtC40YDQvtCy0LDRgtGMINC60LDQu9C10L3QtNCw0YDRjCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgaW1wb3J0ZWQhJ30gPSAn0JrQsNC70LXQvdC00LDRgNGMINC40LzQv9C+0YDRgtC40YDQvtCy0LDQvSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZCBDYWxlbmRhcklEISd9ID0gJ9Ci0YDQtdCx0YPQtdGC0YHRjyBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJ9Cd0LXQstC+0LfQvNC+0LbQvdC+INC/0L7Qu9GD0YfQuNGC0Ywg0LTQsNC90L3Ri9C1INC00LvRjyDRg9C60LDQt9Cw0L3QvdC+0LPQviBDYWxlbmRhcklEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICfQo9GB0L/QtdGI0L3QviDQuNC80L/QvtGA0YLQuNGA0L7QstCw0L3RiyAlcyDQvNC10YDQvtC/0YDQuNGP0YLQuNC5INCyINC60LDQu9C10L3QtNCw0YDRjCAlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJyArNSDQvNC40L3Rg9GCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxNSBtaW51dGVzJ30gPSAnKzE1INC80LjQvdGD0YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzAg0LzQuNC90YPRgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzEg0YfQsNGBJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ9CS0YHQtSDQvNC10YDQvtC/0YDQuNGP0YLQuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ9Cc0LXRgNC+0L/RgNC40Y/RgtC40Y8g0L3QsNC30L3QsNGH0LXQvdC90YvQtSDQvNC90LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ9Cf0L7QutCw0LfQsNC90Ysg0YLQvtC70YzQutC+INC80LXRgNC+0L/RgNC40Y/RgtC40Y8g0L3QsNC30L3QsNGH0LXQvdC90YvQtSDQktCw0LwhINCY0LfQvNC10L3QuNGC0LUg0L3QsNGB0YLRgNC+0LnQutC4JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ9Cc0LXRgNC+0L/RgNC40Y/RgtC40Y8g0L3QtSDQvdCw0LnQtNC10L3RiyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICfQndC40LrQvtCz0LTQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICfQmtCw0LbQtNGL0Lkg0LTQtdC90YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ9Ca0LDQttC00YPRjiDQvdC10LTQtdC70Y4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICfQmtCw0LbQtNGL0Lkg0LzQtdGB0Y/Rhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBZZWFyJ30gPSAn0JrQsNC20LTRi9C5INCz0L7QtCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICfQn9C+0LvRjNC30L7QstCw0YLQtdC70YzRgdC60LjQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ9CV0LbQtdC00L3QtdCy0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICfQldC20LXQvdC10LTQtdC70YzQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICfQldC20LXQvNC10YHRj9GH0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZZWFybHknfSA9ICfQldC20LXQs9C+0LTQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAn0LrQsNC20LTRi9C1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAn0L/QvtCy0YLQvtGA0LjRgtGMICVzINGA0LDQtyjQsCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgLi4uJ30gPSAn0LTQviAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAn0L/QvtCy0YLQvtGA0LjRgtGMIC4uLiDRgNCw0Lco0LApJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAn0LTQviAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBub3RpZmljYXRpb24nfSA9ICfQndC1INGD0LLQtdC00L7QvNC70Y/RgtGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICfQt9CwICVzINC80LjQvdGD0YIo0YMpINC00L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICfQt9CwICVzINGH0LDRgSjQvtCyKSDQtNC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICfQt9CwICVzINC00LXQvdGMKNC00L3QtdC5KSDQtNC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAn0LfQsCAlcyDQvdC10LTQtdC70Y4g0LTQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ9C00L4g0L3QsNGH0LDQu9CwINC80LXRgNC+0L/RgNC40Y/RgtC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICfQv9C+0YHQu9C1INC90LDRh9Cw0LvQsCDQvNC10YDQvtC/0YDQuNGP0YLQuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ9C00L4g0L7QutC+0L3Rh9Cw0L3QuNGPINC80LXRgNC+0L/RgNC40Y/RgtC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAn0L/QvtGB0LvQtSDQvtC60L7QvdGH0LDQvdC40Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ9Cd0LXRgiDQv9GA0LDQsiDQtNC+0YHRgtGD0L/QsCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgY291bGQgbm90IGJlIGRlbGV0ZWQhJ30gPSAn0KHQstGP0LfRjCDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0YPQtNCw0LvQtdC90LAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgY291bGQgbm90IGJlIGNyZWF0ZWQhJ30gPSAn0KHQstGP0LfRjCDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0YHQvtC30LTQsNC90LAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ9Cd0LXQstC+0LfQvNC+0LbQvdC+INGD0LTQsNC70LjRgtGMINC80LXRgNC+0L/RgNC40Y/RgtC40LUg0LfQsNGP0LLQutC4ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICfQndC10YIg0L/RgNCw0LIg0LTQvtGB0YLRg9C/0LAhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ9Cd0LXRgiDQv9GA0LDQsiDQtNC+0YHRgtGD0L/QsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICfQodC40YHRgtC10LzQtSDQvdC1INGD0LTQsNC70L7RgdGMINC40LzQv9C+0YDRgtC40YDQvtCy0LDRgtGMINGE0LDQudC7ISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnKyVkINC10YnQtSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ9Ce0YLRgdGD0YLRgdGC0LLRg9C10YIgJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICfQotCw0LrQvtC5INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjCDQvdC1INGB0YPRidC10YHRgtCy0YPQtdGCISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJ9Cd0LXQtNC10LnRgdGC0LLQuNGC0LXQu9GM0L3Ri9C5INC60LDQu9C10L3QtNCw0YDRjCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAn0J3QtdCy0LXRgNC90YvQuSBVUkwhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ9Cf0YDQvtC40LfQvtGI0LvQsCDQvtGI0LjQsdC60LAg0L/RgNC4INGN0LrRgdC/0L7RgNGC0LUg0LrQsNC70LXQvdC00LDRgNGPISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ9CY0L3RgtC10YDQstCw0Lsg0L7QsdC90L7QstC70LXQvdC40Y8gKNCyINC80LjQvdGD0YLQsNGFKSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuJ30gPSAn0KHRgtGA0LDQvdC40YbQsCDQvtCx0LfQvtGA0LAg0JrQsNC70LXQvdC00LDRgNGPINC80LXRgNC+0L/RgNC40Y/RgtC40LkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgcHJlcGFyZXMgbm90aWZpY2F0aW9uIGVudHJpZXMgZm9yIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ9Cc0L7QtNGD0LvRjCDRg9C/0YDQsNCy0LvQtdC90LjRjyDRgdC+0LHRi9GC0LjRj9C80Lgg0JrQsNC70LXQvdC00LDRgNGPINC80LXRgNC+0L/RgNC40Y/RgtC40LksINC60L7RgtC+0YDRi9C5INC/0L7QtNCz0L7RgtCw0LLQu9C40LLQsNC10YIg0YPQstC10LTQvtC80LvQtdC90LjRjyDQtNC70Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJ9Cc0L7QtNGD0LvRjCDRg9C/0YDQsNCy0LvQtdC90LjRjyDRgdC+0LHRi9GC0LjRj9C80Lgg0JrQsNC70LXQvdC00LDRgNGPINC80LXRgNC+0L/RgNC40Y/RgtC40LksINC60L7RgtC+0YDRi9C5INC+0LHQvdC+0LLQu9GP0LXRgiDQt9Cw0Y/QstC60Lgg0YEg0LTQsNC90L3Ri9C80Lgg0LjQtyDQvNC10YDQvtC/0YDQuNGP0YLQuNC5INC30LDRj9Cy0LrQuC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAn0K3QutGA0LDQvSDRgNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNGPINCc0LXRgNC+0L/RgNC40Y/RgtC40LkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICfQodC/0LjRgdC+0Log0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ9Ch0L/QuNGB0L7QuiDQvNC10YDQvtC/0YDQuNGP0YLQuNC5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ9Cc0LXRgNC+0L/RgNC40Y/RgtC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbWFuYWdlIHNjcmVlbi4nfSA9ICfQrdC60YDQsNC9INCj0L/RgNCw0LLQu9C10L3QuNC1INC60LDQu9C10L3QtNCw0YDRj9C80LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSBuZXcgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoaXMgdGlja2V0J30gPSAn0KHQvtC30LTQsNGC0Ywg0L3QvtCy0L7QtSDQvNC10YDQvtC/0YDQuNGP0YLQuNC1INC60LDQu9C10L3QtNCw0YDRjyDRgdCy0Y/Qt9Cw0L3QvdC+0LUg0YEg0Y3RgtC+0Lkg0LfQsNGP0LLQutC+0LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICfQodC+0LfQtNCw0YLRjCDQvdC+0LLQvtC1INC80LXRgNC+0L/RgNC40Y/RgtC40LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAn0JfQsNC00LDQudGC0LUsINC60LDQutC40LUg0LrQvtC70L7QvdC60Lgg0L7RgtC+0LHRgNCw0LbQsNGC0Ywg0LIg0YHQstGP0LfQsNC90L3QvtC8INCy0LjQtNC20LXRgtC1INC80LXRgNC+0L/RgNC40Y/RgtC40LkgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4g0JLQvtC30LzQvtC20L3Ri9C1INC30L3QsNGH0LXQvdC40Y86IDAgPSDQntGC0LrQu9GO0YfQtdC90L4sIDEgPSDQlNCwLCAyID0g0JLQutC70Y7Rh9C10L3QsCDQv9C+INGD0LzQvtC70YfQsNC90LjRji4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINC40LrQvtC90LrRgyDRgdC+INGB0YHRi9C70LrQvtC5INC90LAg0YHRgtGA0LDQvdC40YbRgyDRgtC10LrRg9GJ0LXQs9C+INC80LXRgdGC0L7Qv9C+0LvQvtC20LXQvdC40Y8g0LIgR29vZ2xlIE1hcCDQvdCwINGN0LrRgNCw0L3QtSDRgNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNGPINC80LXRgNC+0L/RgNC40Y/RgtC40LkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINC/0LXRgNC10YfQtdC90Ywg0LDRgtGA0LjQsdGD0YLQvtCyLCDQutC+0YLQvtGA0YvQtSDQvNC+0LPRg9GCINC40YHQv9C+0LvRjNC30L7QstCw0YLRjNGB0Y8g0L/RgNC4INC/0L7QuNGB0LrQtSDQt9Cw0Y/QstC+0LouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJ9CX0LDQtNCw0LXRgiDQv9C70LDQs9C40L0g0L7QsdGA0LDQsdC+0YLQutC4INC30LDRj9Cy0L7QuiDQtNC70Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSDQutCw0LvQtdC90LTQsNGA0Y8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJ0R5bmFtaWNGaWVsZF8lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAn0KDQtdC00LDQutGC0LjRgNC+0LLQsNGC0Ywg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAn0JLRgNC10LzRjyDQtNC+INC/0LXRgNCy0L7Qs9C+INC+0YLQstC10YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICfQrdC60YDQsNC9INC40LzQv9C+0YDRgtCwINC80LXRgNC+0L/RgNC40Y/RgtC40LkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJ9Ch0LLRj9C30YvQstCw0LXRgiDQvNC10YDQvtC/0YDQuNGP0YLQuNGPINGBINC30LDRj9Cy0LrQsNC80Lgg0YHQstGP0LfRjNGOINGC0LjQv9CwICJOb3JtYWwv0J7QsdGL0YfQvdCw0Y8iLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAn0KHQv9C40YHQvtC6INCy0YHQtdGFINGB0L7QsdGL0YLQuNC5LCDQtNC70Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSwg0L7RgtC+0LHRgNCw0LbQsNC10LzRi9GFINCyINC40L3RgtC10YDRhNC10LnRgdC1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAn0KHQv9C40YHQvtC6INGG0LLQtdGC0L7QsiDQsiDRiNC10YHRgtC90LDQtNGG0LDRgtC10YDQuNGH0L3QvtC8IFJHQiDQtNC+0YHRgtGD0L/QvdGL0YUg0LTQu9GPINCy0YvQsdC+0YDQsCDQv9GA0Lgg0YHQvtC30LTQsNC90LjQuCDQutCw0LvQtdC90LTQsNGA0Y8uINCj0LHQtdC00LjRgtC10YHRjCDQv9GA0Lgg0LLRi9Cx0L7RgNC1LCDRh9GC0L4g0YbQstC10YIg0YTQvtC90LAg0LTQvtGB0YLQsNGC0L7Rh9C90L4g0YLQtdC80L3Ri9C5LCDRh9GC0L7QsdGLINCx0LXQu9GL0Lkg0YLQtdC60YHRgiDQsdGL0Lsg0L3QsCDQvdC10Lwg0LLQuNC00LXQvS/Rh9C40YLQsNC10LwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJ9Cj0L/RgNCw0LLQu9GP0YLRjCDRgNCw0LfQu9C40YfQvdGL0LzQuCDQutCw0LvQtdC90LTQsNGA0Y/QvNC4Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJ9Cc0LDQutGB0LjQvNCw0LvRjNC90L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDQsNC60YLQuNCy0L3Ri9GFINC60LDQu9C10L3QtNCw0YDQtdC5INC90LAg0Y3QutGA0LDQvdCw0YUg0L7QsdC30L7RgNCwLiDQn9C+0LzQvdC40YLQtSwg0YfRgtC+INCx0L7Qu9GM0YjQvtC1INGH0LjRgdC70L4g0LDQutGC0LjQstC90YvRhSDQutCw0LvQtdC90LTQsNGA0LXQuSDQvNC+0LbQtdGCINC+0LrQsNC30LDRgtGMINCy0LvQuNGP0L3QuNC1INC90LAg0L/RgNC+0LjQt9Cy0L7QtNC40YLQtdC70YzQvdC+0YHRgtGMINGB0LXRgNCy0LXRgNCwLCDQtNC10LvQsNGPINGB0LvQuNGI0LrQvtC8INC80L3QvtCz0L4g0L7QtNC90L7QstGA0LXQvNC10L3QvdGL0YUg0LLRi9C30L7QstC+0LIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgZG9lc25cJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS4nfSA9CiAgICAgICAgJ09UUlMg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YIg0L/QvtCy0YLQvtGA0Y/RjtGJ0LjQtdGB0Y8g0JzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQsdC10Lcg0LTQsNGC0Ysg0L7QutC+0L3Rh9Cw0L3QuNGPINC40LvQuCDQutC+0LvQuNGH0LXRgdGC0LLQsCDQv9C+0LLRgtC+0YDQtdC90LjQuS4g0J/RgNC4INC40LzQv9C+0YDRgtC1INC80L7QttC10YIg0YLQsNC6INGB0LvRg9GH0LjRgtGM0YHRjywg0YfRgtC+IElDUyDRhNCw0LnQuyDRgdC+0LTQtdGA0LbQuNGCINC/0L7QtNC+0LHQvdGL0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjy4g0JIg0YDQtdC30YPQu9GM0YLQsNGC0LUg0LzQvtC20LXRgiDRgtCw0Log0YHQu9GD0YfQuNGC0YzRgdGPLCDRh9GC0L4g0YHQuNGB0YLQtdC80LAg0YHQvtC30LTQsNGB0YIg0LLRgdC1INC80LXRgNC+0L/RgNC40Y/RgtC40Y8g0LIg0L/RgNC+0YjQu9C+0Lwg0LgsINC00L7Qv9C+0LvQvdC40YLQtdC70YzQvdC+LCDQtNC70Y8g0L/QvtGB0LvQtdC00YPRjtGJ0LjRhSBuINC80LXRgdGP0YbQtdCyICgxMjAg0LzQtdGB0Y/RhtC10LIvMTAg0LvQtdGCINC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICfQntCx0LfQvtGAINCy0YHQtdGFINC80LXRgNC+0L/RgNC40Y/RgtC40LkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlbmRpbmcgdGltZSd9ID0gJ9CS0YDQtdC80Y8g0LIg0L7QttC40LTQsNC90LjQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoJ30gPSAn0J/QvtC40YHQutC+0LLRi9C5INC/0LvQsNCz0LjQvSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJ9Cf0L7QuNGB0LrQvtCy0YvQuSDQv9C70LDQs9C40L0g0LTQu9GPINCw0LLRgtC+0LfQsNCy0LXRgNGI0LXQvdC40Y8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBDYWxlbmRhcid9ID0gJ9Ce0LHRidC10LTQvtGB0YLRg9C/0L3Ri9C5INC60LDQu9C10L3QtNCw0YDRjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAn0J7QsdGJ0LXQtNC+0YHRgtGD0L/QvdGL0Lkg0LrQsNC70LXQvdC00LDRgNGMLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ9Ce0LHQt9C+0YAg0YDQtdGB0YPRgNGB0L7Qsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknfSA9ICfQntCx0LfQvtGAINGA0LXRgdGD0YDRgdC+0LIgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSBmb3IgY3JlYXRpbmcgYSBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhlIHRpY2tldCBkaXJlY3RseSBmcm9tIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIEFkZGl0aW9uYWwgYWNjZXNzIGNvbnRyb2wgdG8gc2hvdyBvciBub3Qgc2hvdyB0aGlzIGxpbmsgY2FuIGJlIGRvbmUgYnkgdXNpbmcgS2V5ICJHcm91cCIgYW5kIENvbnRlbnQgbGlrZSAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBUbyBjbHVzdGVyIG1lbnUgaXRlbXMgdXNlIGZvciBLZXkgIkNsdXN0ZXJOYW1lIiBhbmQgZm9yIHRoZSBDb250ZW50IGFueSBuYW1lIHlvdSB3YW50IHRvIHNlZSBpbiB0aGUgVUkuIFVzZSAiQ2x1c3RlclByaW9yaXR5IiB0byBjb25maWd1cmUgdGhlIG9yZGVyIG9mIGEgY2VydGFpbiBjbHVzdGVyIHdpdGhpbiB0aGUgdG9vbGJhci4nfSA9CiAgICAgICAgJ9Ce0YLQvtCx0YDQsNC20LDQtdGCINGB0YHRi9C70LrRgy/Qv9GD0L3QutGCINC80LXQvdGOINC00LvRjyDRgdC+0LfQtNCw0L3QuNGPINC80LXRgNC+0L/RgNC40Y/RgtC40Y8g0LrQsNC70LXQvdC00LDRgNGPLCDRgdCy0Y/Qt9Cw0L3QvdC+0LPQviDRgSDQt9Cw0Y/QstC60L7QuSDQvdC10L/QvtGB0YDQtdC00YHRgtCy0LXQvdC90L4g0LjQtyDQv9C+0LTRgNC+0LHQvdC+0LPQviDQv9GA0L7RgdC80L7RgtGA0LAg0LfQsNGP0LLQutC4L1RpY2tldFpvb20g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLiDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Qviwg0LzQvtC20L3QviDQvtCz0YDQsNC90LjRh9C40YLRjCDQtNC+0YHRgtGD0L8g0Log0Y3RgtC+0LzRgyDQv9GD0L3QutGC0YMg0LzQtdC90Y4sINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC10Lwg0LrQu9GO0YfQsCAiR3JvdXAiLCDQs9C00LUg0LIg0YHQvtC00LXRgNC20LDQvdC40Lgg0YPQutCw0LfRi9Cy0LDQtdGC0YHRjyDQv9C10YDQtdGH0LXQvdGMINCz0YDRg9C/0L8sINC60L7RgtC+0YDRi9C8INGN0YLQsCDQutC90L7Qv9C60LAg0LHRg9C00LXRgiDQtNC+0YHRgtGD0L/QvdCwICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuINCU0LvRjyDQvtGA0LPQsNC90LjQt9Cw0YbQuNC4INC/0YPQvdC60YLQvtCyINC80LXQvdGOINCyINCz0YDRg9C/0L/Riy/QutC70LDRgdGC0LXRgNGLINC40YHQv9C+0LvRjNC30YPQudGC0LUg0LIg0LrQsNGH0LXRgdGC0LLQtSDQutC70Y7Rh9CwICJDbHVzdGVyTmFtZSIg0Lgg0LIg0YHQvtC00LXRgNC20LDQvdC40Lgg0YPQutCw0LbQuNGC0LUg0YLQviDQuNC80Y8sINC60L7RgtC+0YDQvtC1INC20LXQu9Cw0LXRgtC1INGD0LLQuNC00LXRgtGMINCyINGB0YLRgNC+0LrQtSDQvNC10L3Rji4g0JjRgdC/0L7Qu9GM0LfRg9C50YLQtSAiQ2x1c3RlclByaW9yaXR5IiDQtNC70Y8g0L3QsNGB0YLRgNC+0LnQutC4INC/0L7RgNGP0LTQutCwINC+0YLQvtCx0YDQsNC20LXQvdC40Y8g0LPRgNGD0L/Qvy/QutC70LDRgdGC0LXRgNC+0LIg0LIg0LzQtdC90Y4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvbHV0aW9uIHRpbWUnfSA9ICfQktGA0LXQvNGPINGA0LXRiNC10L3QuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy4nfSA9CiAgICAgICAgJ9Cf0LXRgNC10LrQu9GO0YfQsNC10YIg0LTQvtCx0LDQstC40YLRjCDQuNC70Lgg0LjQt9C80LXQvdC40YLRjCDQsNCy0YLQvtC80LDRgtC40YfQtdGB0LrQvtC1INGB0L7Qt9C00LDQvdC40LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSDQutCw0LvQtdC90LTQsNGA0Y8sINC+0YHQvdC+0LLQsNC90L3QvtC1INC90LAg0L7Qv9GA0LXQtNC10LvQtdC90L3Ri9GFINCy0YDQtdC80LXQvdCd0YvRhSDQv9Cw0YDQsNC80LXRgtGA0LDRhSDQt9Cw0Y/QstC60LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICfQktGA0LXQvNGPINC40LfQvNC10L3QtdC90LjRjyDQt9Cw0Y/QstC60LgnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6c3JfQ3lybF9PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICfQo9C/0YDQsNCy0ZnQsNGa0LUg0L7QsdCw0LLQtdGI0YLQtdGa0LjQvNCwINC+INGC0LXRgNC80LjQvdC40LzQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJ9Ce0LLQtNC1INC80L7QttC10YLQtSDQv9C+0YHQu9Cw0YLQuCDQutC+0L3RhNC40LPRg9GA0LDRhtC40L7QvdGDINC00LDRgtC+0YLQtdC60YMg0LfQsCDRg9Cy0L7QtyDQvtCx0LDQstC10YjRgtC10ZrQsCDQviDRgtC10YDQvNC40L3RgyDRgyDQstCw0Ygg0YHQuNGB0YLQtdC8LiDQlNCw0YLQvtGC0LXQutCwINC80L7RgNCwINCx0LjRgtC4INGDINC40YHRgtC+0LwgLnltbCDRhNC+0YDQvNCw0YLRgyDQutC+0ZjQuCDRmNC1INC80L7Qs9GD0ZvQtSDQtNC+0LHQuNGC0Lgg0LjQt9Cy0L7Qt9C+0Lwg0YMg0LXQutGA0LDQvdGDINGD0L/RgNCw0LLRmdCw0ZrQsCDQvtCx0LDQstC10YjRgtC10ZrQuNC80LAg0L4g0YLQtdGA0LzQuNC90LjQvNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ9Ce0LLQtNC1INC80L7QttC10YLQtSDQuNC30LDQsdGA0LDRgtC4INC60L7RmNC4INC00L7Qs9Cw0ZLQsNGY0Lgg0ZvQtSDQv9C+0LrRgNC10L3Rg9GC0Lgg0L7QsdCw0LLQtdGI0YLQsNCy0LDRmtC1LiDQlNC+0LTQsNGC0L3QuCDRhNC40LvRgtC10YAg0LfQsCDRgtC10YDQvNC40L3QtSDQvNC+0LbQtSDQsdC40YLQuCDQv9GA0LjQvNC10ZrQtdC9INGA0LDQtNC4INGB0LvQsNGa0LAg0YHQsNC80L4g0LfQsCDRgtC10YDQvNC40L3QtSDQv9C+INC+0LTRgNC10ZLQtdC90L7QvCDQutGA0LjRgtC10YDQuNGY0YPQvNGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICfQpNC40LvRgtC10YAg0YLQtdGA0LzQuNC90LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ9Ci0LjQvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ9Cg0LXRgdGD0YDRgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ9Ce0LHQsNCy0LXRgdGC0Lgg0LrQvtGA0LjRgdC90LjQutCwINGB0LDQvNC+INGY0LXQtNC90L7QvCDQtNC90LXQstC90L4g0L4g0L/QvtGY0LXQtNC40L3QsNGH0L3QvtC8INGC0LXRgNC80LjQvdGDINC60L7RgNC40YjRm9C10ZrQtdC8INC40LfQsNCx0YDQsNC90L7QsyDRgtGA0LDQvdGB0L/QvtGA0YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICfQntCx0LDQstC10YjRgtC10ZrQtSDRm9C1INCx0LjRgtC4INC/0L7RgdC70LDRgtC+INC+0L/QtdGA0LDRgtC10YDRgy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ9CU0LAg0LLQuNC00LjRgtC1INC/0YDQstC40YUgMjAg0LrQsNGA0LDQutGC0LXRgNCwINC90LDRgdC70L7QstCwINGC0LXRgNC80LjQvdCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ9CU0LAg0LLQuNC00LjRgtC1INCw0YLRgNC40LHRg9GC0LUg0YLQtdGA0LzQuNC90LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICfQlNCwINCy0LjQtNC40YLQtSDQsNGC0YDQuNCx0YPRgtC1INC60LDQu9C10L3QtNCw0YDQsCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VuZGEgT3ZlcnZpZXcnfSA9ICfQn9GA0LXQs9C70LXQtCDQtNC90LXQstC90L7QsyDRgNC10LTQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgQ2FsZW5kYXJzJ30gPSAn0KPQv9GA0LDQstGZ0LDRmtC1INC60LDQu9C10L3QtNCw0YDQuNC80LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAn0JTQvtC00LDRmCDRgtC10YDQvNC40L0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb3InfSA9ICfQkdC+0ZjQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ9CU0LDRgtGD0Lwg0LrRgNCw0ZjQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICfQn9C+0L3QsNCy0ZnQsNGa0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAn0J3QuNGY0LUg0L/RgNC+0L3QsNGS0LXQvSDQvdC40ZjQtdC00LDQvSDQutCw0LvQtdC90LTQsNGALiDQnNC+0LvQuNC80L4g0L/RgNCy0L4g0LTQvtC00LDRmNGC0LUg0LrQsNC70LXQvdC00LDRgCDQutC+0YDQuNGI0ZvQtdGa0LXQvCDQtdC60YDQsNC90LAg0KPQv9GA0LDQstGZ0LDRmtC1INC60LDQu9C10L3QtNCw0YDQuNC80LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAn0KLQtdGA0LzQuNC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICfQntCy0LDRmCDRgtC10YDQvNC40L0g0YHQtSDQv9C+0L3QsNCy0ZnQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJ9CU0LAg0LvQuCDQttC10LvQuNGC0LUg0LTQsCDQuNC30LzQtdC90Lgg0YHQsNC80L4g0L7QstC+INC40LvQuCDRgdCy0LAg0L/QvtC90LDQstGZ0LDRmtCwPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgb2NjdXJyZW5jZXMnfSA9ICfQodCy0LAg0L/QvtC90LDQstGZ0LDRmtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAn0KHQsNC80L4g0L7QstC+INC/0L7QvdCw0LLRmdCw0ZrQtSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBNYW5hZ2VtZW50J30gPSAn0KPQv9GA0LDQstGZ0LDRmtC1INC60LDQu9C10L3QtNCw0YDQuNC80LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgT3ZlcnZpZXcnfSA9ICfQn9GA0LXQs9C70LXQtCDQutCw0LvQtdC90LTQsNGA0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ9CU0L7QtNCw0Zgg0L3QvtCy0Lgg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICfQlNC+0LTQsNGYINC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ9Cj0LLQtdC30Lgg0YLQtdGA0LzQuNC90LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgSW1wb3J0J30gPSAn0KPQstC+0Lcg0LrQsNC70LXQvdC00LDRgNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLid9ID0KICAgICAgICAn0J7QstC00LUg0LzQvtC20LXRgtC1INGD0YfQuNGC0LDRgtC4INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90YMg0LTQsNGC0L7RgtC10LrRgyDQt9CwINGD0LLQvtC3INC60LDQu9C10L3QtNCw0YDQsCDRgyDQstCw0Ygg0YHQuNGB0YLQtdC8LiDQlNCw0YLQvtGC0LXQutCwINC80L7RgNCwINCx0LjRgtC4INGDIC55bWwg0YTQvtGA0LzQsNGC0YMg0LjQt9Cy0LXQt9C10L3QsCDQvtC0INGB0YLRgNCw0L3QtSDQvNC+0LTRg9C70LAg0LfQsCDRg9C/0YDQsNCy0ZnQsNGa0LUg0LrQsNC70LXQvdC00LDRgNC40LzQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICfQo9GH0LjRgtCw0Zgg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNGY0YMg0LrQsNC70LXQvdC00LDRgNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBDYWxlbmRhcid9ID0gJ9Cj0LLQtdC30Lgg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ9Ck0LjQu9GC0LXRgCDQt9CwINC60LDQu9C10L3QtNCw0YDQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuJ30gPQogICAgICAgICfQoyDQt9Cw0LLQuNGB0L3QvtGB0YLQuCDQvtC0INC/0L7RmdCwINCz0YDRg9C/0LUsINGB0LjRgdGC0LXQvCDRm9C1INC00L7Qt9Cy0L7Qu9C40YLQuCDQv9GA0LjRgdGC0YPQvyDQutCw0LvQtdC90LTQsNGA0YMg0L7Qv9C10YDQsNGC0LXRgNC40LzQsCDQv9GA0LXQvNCwINGa0LjRhdC+0LLQvtC8INC90LjQstC+0YMg0L/RgNC40YHRgtGD0L/QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCBvbmx5OiB1c2VycyBjYW4gc2VlIGFuZCBleHBvcnQgYWxsIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdSTzog0L7Qv9C10YDQsNGC0LXRgNC4INC80L7Qs9GDINC/0YDQtdCz0LvQtdC00LDRgtC4INC4INC10LrRgdC/0L7RgNGC0L7QstCw0YLQuCDRgdCy0LUg0YLQtdGA0LzQuNC90LUg0YMg0LrQsNC70LXQvdC00LDRgNGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJ9Cf0YDQtdC80LXRgdGC0Lgg0YM6INC+0L/QtdGA0LDRgtC10YDQuCDQvNC+0LPRgyDQvNC+0LTQuNGE0LjQutC+0LLQsNGC0Lgg0YLQtdGA0LzQuNC90LUg0YMg0LrQsNC70LXQvdC00LDRgNGDLCDQsNC70Lgg0LHQtdC3INC/0YDQvtC80LXQvdC1INC60L7QvCDQutCw0LvQtdC90LTQsNGA0YMg0L/RgNC40L/QsNC00LDRmNGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAn0JrRgNC10LjRgNCw0ZrQtTog0L7Qv9C10YDQsNGC0LXRgNC4INC80L7Qs9GDINC60YDQtdC40YDQsNGC0Lgg0Lgg0LHRgNC40YHQsNGC0Lgg0YLQtdGA0LzQuNC90LUg0YMg0LrQsNC70LXQvdC00LDRgNGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAnUlc6INC+0L/QtdGA0LDRgtC10YDQuCDQvNC+0LPRgyDQsNC00LzQuNC90LjRgdGC0YDQuNGA0LDRgtC4INC4INGB0LDQvCDQutCw0LvQtdC90LTQsNGALic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVUkwnfSA9ICfQkNC00YDQtdGB0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0IGNhbGVuZGFyJ30gPSAn0JjQt9Cy0LXQt9C4INC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICfQn9GA0LXRg9C30LzQuCDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvcHkgcHVibGljIGNhbGVuZGFyIFVSTCd9ID0gJ9CY0YHQutC+0L/QuNGA0LDRmCDRmNCw0LLQvdGDINCw0LTRgNC10YHRgyDQutCw0LvQtdC90LTQsNGA0LAgKFVSTCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ9Cd0LDQt9C40LIg0LrQsNC70LXQvdC00LDRgNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLid9ID0gJ9Ca0LDQu9C10L3QtNCw0YAg0YHQsCDQuNGB0YLQuNC8INC90LDQt9C40LLQvtC8INCy0LXRmyDQv9C+0YHRgtC+0ZjQuC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ9CT0YDRg9C/0LAg0L/RgNC40YHRgtGD0L/QsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgQXBwb2ludG1lbnRzJ30gPSAn0KLQtdGA0LzQuNC90Lgg0YLQuNC60LXRgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICfQn9GA0LDQstC40LvQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuJ30gPQogICAgICAgICfQmtC+0YDQuNGB0YLQtdGb0Lgg0L7Qv9GG0LjRmNC1INC40YHQv9C+0LQg0LjQt9Cw0LHQtdGA0LjRgtC1INC30LAg0LrQvtGY0LUg0YLQuNC60LXRgtC1INGb0LUg0YLQtdGA0LzQuNC90Lgg0LHQuNGC0Lgg0LDRg9GC0L7QvNCw0YLRgdC60Lgg0LrRgNC10LjRgNCw0L3QuC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJ9Cc0L7Qu9C40LzQviDQtNCwINC+0LTQsNCx0LXRgNC10YLQtSDQstCw0LbQtdGb0Lgg0YDQtdC0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ9CQ0YLRgNC40LHRg9GC0Lgg0L/RgNC10YLRgNCw0LPQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgcnVsZXMgZm9yIGNyZWF0aW5nIGF1dG9tYXRpYyBhcHBvaW50bWVudHMgaW4gdGhpcyBjYWxlbmRhciBiYXNlZCBvbiB0aWNrZXQgZGF0YS4nfSA9CiAgICAgICAgJ9CU0LXRhNC40L3QuNGI0LjRgtC1INC/0YDQsNCy0LjQu9CwINC30LAg0LrRgNC10LjRgNCw0ZrQtSDQsNGD0YLQvtC80LDRgtGB0LrQuNGFINGC0LXRgNC80LjQvdCwINGDINC+0LLQvtC8INC60LDQu9C10L3QtNCw0YDRgyDQvdCwINC+0YHQvdC+0LLRgyDRgtC40LrQtdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAn0JTQvtC00LDRmCDQv9GA0LDQstC40LvQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAn0JLQuNGI0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ9Cc0LDRmtC1JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ9CU0L7QtNCw0Zgg0L3QvtCy0Lgg0YLQtdGA0LzQuNC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ9Ca0LDQu9C10L3QtNCw0YDQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGlzIGFuIG92ZXJ2aWV3IHBhZ2UgZm9yIHRoZSBBcHBvaW50bWVudCBDYWxlbmRhci4nfSA9ICfQntCy0LAg0YHRgtGA0LDQvdC40YbQsCDRgdC70YPQttC4INC30LAg0L/RgNC10LPQu9C10LQg0LrQsNC70LXQvdC00LDRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAn0J/RgNC10LLQuNGI0LUg0LDQutGC0LjQstC90LjRhSDQutCw0LvQtdC90LTQsNGA0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAn0JjQu9C4INC/0YDQstC+INC40YHQutGZ0YPRh9C40YLQtSDQv9GA0LjQutCw0Lcg0L3QtdC60L7QsyDQutCw0LvQtdC90LTQsNGA0LAg0LjQu9C4INC/0L7QstC10ZvQsNGY0YLQtSDQu9C40LzQuNGCINGDINC60L7QvdGE0LjQs9GD0YDQsNGG0LjRmNC4Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrJ30gPSAn0KHQtdC00LzQuNGG0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICfQnNC10YHQtdGH0L3QsCDQvtGB0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ9Ch0LXQtNC80LjRh9C90LAg0L7RgdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ9CU0L3QtdCy0L3QsCDQvtGB0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ9Ch0LrQvtGH0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJ9Cf0L7QvdC40YjRgtC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICfQn9GA0LjQutCw0LbQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ9Ce0YHQvdC+0LLQvdC1INC40L3RhNC+0YDQvNCw0YbQuNGY0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAn0JTQsNGC0YPQvC/QstGA0LXQvNC1JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICfQnNC+0LvQuNC80L4g0L/QvtGB0YLQsNCy0LjRgtC1INC+0LLQsNGYINC00LDRgtGD0Lwg0L/RgNC1INC60YDQsNGY0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ9Cc0L7Qu9C40LzQviDQv9C+0YHRgtCw0LLQuNGC0LUg0L7QstCw0Zgg0LTQsNGC0YPQvCDQv9C+0YHQu9C1INC/0L7Rh9C10YLQutCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAn0J7QstC+INGY0LUg0YLQtdGA0LzQuNC9INC60L7RmNC4INGB0LUg0L/QvtC90LDQstGZ0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gc2VlIHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAn0JrQu9C40LrQvdC40YLQtSDQvtCy0LTQtSDQt9CwINC/0YDQtdCz0LvQtdC0INC80LDRgtC40YfQvdC+0LMg0YLQtdGA0LzQuNC90LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ9Ca0LvQuNC60L3QuNGC0LUg0L7QstC00LUg0LfQsCDQuNC30LzQtdC90YMg0LzQsNGC0LjRh9C90L7QsyDRgtC10YDQvNC40L3QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlcXVlbmN5J30gPSAn0KPRh9C10YHRgtCw0LvQvtGB0YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnknfSA9ICfQodCy0LDQutC+0LMo0LUpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbGF0aXZlIHBvaW50IG9mIHRpbWUnfSA9ICfQoNC10LvQsNGC0LjQstC90L4g0LLRgNC10LzQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJ30gPQogICAgICAgICfQlNCwINC70Lgg0YHRgtC1INGB0LjQs9GD0YDQvdC4INC00LAg0LbQtdC70LjRgtC1INC00LAg0LjQt9Cx0YDQuNGI0LXRgtC1INC+0LLQsNGYINGC0LXRgNC80LjQvT8g0J7QstGDINC+0L/QtdGA0LDRhtC40ZjRgyDQvdC40ZjQtSDQvNC+0LPRg9Gb0LUg0L7Qv9C+0LfQstCw0YLQuC4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRJbXBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEltcG9ydCd9ID0gJ9Cj0LLQvtC3INGC0LXRgNC80LjQvdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAn0J/QvtGB0LvQsNGC0Lgg0YTQsNGY0Lsg0LzQvtGA0LAg0LHQuNGC0Lgg0YMg0LjRgdC/0YDQsNCy0L3QvtC8IGlDYWwg0YTQvtGA0LzQsNGC0YMgKC5pY3MpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICfQo9C60L7Qu9C40LrQviDQttC10ZnQtdC90Lgg0LrQsNC70LXQvdC00LDRgCDQvdC40ZjQtSDQuNC30LvQuNGB0YLQsNC9LCDQv9GA0L7QstC10YDQuNGC0LUg0LTQsCDQu9C4INC40LzQsNGC0LUg0L3QuNCy0L4g0L/RgNC40YHRgtGD0L/QsCBcJ9C60YDQtdC40YDQsNGa0LVcJyDQt9CwINCz0YDRg9C/0YMg0LrQsNC70LXQvdC00LDRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJ9Ce0YHQstC10LbQuCDQv9C+0YHRgtC+0ZjQtdGb0LUg0YLQtdGA0LzQuNC90LU/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAn0KHQstC4INC/0L7RgdGC0L7RmNC10ZvQuCDRgtC10YDQvNC40L3QuCDRgyDQutCw0LvQtdC90LTQsNGA0YMg0YHQsCDQuNGB0YLQuNC8IFVuaXF1ZUlEINC/0L7RmdC10Lwg0ZvQtSDQsdC40YLQuCDQv9GA0LXQsdGA0LjRgdCw0L3QuC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyJ30gPSAn0J/QvtGI0LDRmdC4INC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ9Cj0LLQtdC30Lgg0YLQtdGA0LzQuNC90LUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAn0J3QvtCy0Lgg0YLQtdGA0LzQuNC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nvb24nfSA9ICfQo9GB0LrQvtGA0L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSDQtNCw0L3QsCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnfSA9ICfQntCx0LDQstC10YjRgtC10ZrQtSDRgdCwINC+0LLQuNC8INC90LDQt9C40LLQvtC8INCy0LXRmyDQv9C+0YHRgtC+0ZjQuCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgKHJlc291cmNlcyksIHdobyBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSBhcHBvaW50bWVudCd9ID0gJ9Ce0L/QtdGA0LDRgtC10YAgKNGA0LXRgdGD0YDRgSksINC60L7RmNC4INGY0LUg0LjQt9Cw0LHRgNCw0L0g0YMg0YLQtdGA0LzQuNC90YMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIChhdCBsZWFzdCkgcmVhZCBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAn0KHQstC4INC+0L/QtdGA0LDRgtC10YDQuCDRgdCwICjQvdCw0ZjQvNCw0ZrQtSkg0LTQvtC30LLQvtC70L7QvCDQv9GA0LXQs9C70LXQtNCwINGC0LXRgNC80LjQvdCwICjQutCw0LvQtdC90LTQsNGA0LApJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAn0KHQstC4INC+0L/QtdGA0LDRgtC10YDQuCDRgdCwINC00L7Qt9Cy0L7Qu9C+0Lwg0L/QuNGB0LDRmtCwINGDINGC0LXRgNC80LjQvdGDICjQutCw0LvQtdC90LTQsNGA0YMpJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICfQodC40YHRgtC10Lwg0L3QuNGY0LUg0YPRgdC/0LXQviDQtNCwINC60YDQtdC40YDQsCDQutCw0LvQtdC90LTQsNGAISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nfSA9ICfQnNC+0LvQuNC80L4g0LrQvtC90YLQsNC60YLQuNGA0LDRmNGC0LUg0LDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YDQsCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICfQndC10LzQsCBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICfQndC10LzQsNGC0LUg0L/RgNC40YHRgtGD0L8g0L7QstC+0Lwg0LrQsNC70LXQvdC00LDRgNGDISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IENhbGVuZGFyJ30gPSAn0JjQt9C80LXQvdC4INC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3IgdXBkYXRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ9CT0YDQtdGI0LrQsCDQv9GA0LjQu9C40LrQvtC8INC40LfQvNC10L3QtSDQutCw0LvQtdC90LTQsNGA0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ9Cj0YfQuNGC0LDQstCw0ZrQtSDQutC+0L3RhNC40LPRg9GA0LDRhtC40ZjQtSDQutCw0LvQtdC90LTQsNGA0LAg0L3QuNGY0LUg0LHQuNC70L4g0LzQvtCz0YPRm9C1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICfQnNC+0LvQuNC80L4g0LLQsNGBINC00LAg0L/RgNC+0LLQtdGA0LjRgtC1INC00LAg0LvQuCDRmNC1INCy0LDRiCDRhNCw0ZjQuyDQuNGB0L/RgNCw0LLQsNC9Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICfQndC40ZjQtSDQvNC+0LPRg9GbINGD0LLQvtC3INC60LDQu9C10L3QtNCw0YDQsCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgaW1wb3J0ZWQhJ30gPSAn0JrQsNC70LXQvdC00LDRgCDRmNC1INGD0LLQtdC30LXQvSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZCBDYWxlbmRhcklEISd9ID0gJ9Cf0L7RgtGA0LXQsdCw0L0g0JjQlCDQutCw0LvQtdC90LTQsNGA0LAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCByZXRyaWV2ZSBkYXRhIGZvciBnaXZlbiBDYWxlbmRhcklEJ30gPSAn0J3QtSDQvNC+0LPRgyDQv9GA0LjQsdCw0LLQuNGC0Lgg0L/QvtC00LDRgtC60LUg0LfQsCDQtNCw0YLQuCBDYWxlbmRhcklEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICfQo9GB0L/QtdGI0L3QviDRg9Cy0LXQt9C10L3QviAlcyDRgtC10YDQvNC40L0o0LApINGDINC60LDQu9C10L3QtNCw0YAgJXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jys1IG1pbnV0ZXMnfSA9ICcrNSDQvNC40L3Rg9GC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzE1IG1pbnV0ZXMnfSA9ICcrMTUg0LzQuNC90YPRgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnKzMwINC80LjQvdGD0YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzEg0YHQsNGCJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ9Ch0LLQuCDRgtC10YDQvNC40L3QuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICfQotC10YDQvNC40L3QuCDQtNC+0LTQtdGZ0LXQvdC4INC80LXQvdC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICfQn9GA0LjQutCw0Lcg0YHQsNC80L4g0YLQtdGA0LzQuNC90LAg0LTQvtC00LXRmdC10L3QuNGFINCy0LDQvNCwISDQmNC30LzQtdC90LjRgtC1INC/0L7QtNC10YjQsNCy0LDRmtCwJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ9Ci0LXRgNC80LjQvSDQvdC40ZjQtSDQv9GA0L7QvdCw0ZLQtdC9ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXZlcid9ID0gJ9Cd0LjQutCw0LTQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICfQodCy0LDQutC4INC00LDQvSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBXZWVrJ30gPSAn0KHQstCw0LrQtSDRgdC10LTQvNC40YbQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBNb250aCd9ID0gJ9Ch0LLQsNC60L7QsyDQvNC10YHQtdGG0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ9Ch0LLQsNC60LUg0LPQvtC00LjQvdC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbSd9ID0gJ9Cf0YDQuNC70LDQs9C+0ZLQtdC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICfQlNC90LXQstC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vla2x5J30gPSAn0KHQtdC00LzQuNGH0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAn0JzQtdGB0LXRh9C90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAn0JPQvtC00LjRiNGa0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICfRgdCy0LDQutC+0LMo0LUpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAn0YPQutGD0L/QvdC+ICVzINC/0YPRgijQsCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgLi4uJ30gPSAn0LTQviAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAn0YPQutGD0L/QvdC+IC4uLiDQv9GD0YIo0LApJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAn0LTQviAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBub3RpZmljYXRpb24nfSA9ICfQkdC10Lcg0L7QsdCw0LLQtdGI0YLQtdGa0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgbWludXRlKHMpIGJlZm9yZSd9ID0gJyVzINC80LjQvdGD0YIo0LApINC/0YDQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBob3VyKHMpIGJlZm9yZSd9ID0gJyVzINGB0LDRgijQsCkg0L/RgNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyDQtNCw0L0o0LApINC/0YDQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzINC90LXQtNC10ZnQsCDQv9GA0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICfQv9GA0LUg0L3QtdCz0L4g0YjRgtC+INGC0LXRgNC80LjQvSDQt9Cw0L/QvtGH0L3QtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCd9ID0gJ9C/0L7RiNGC0L4g0YLQtdGA0LzQuNC9INC30LDQv9C+0YfQvdC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ9C/0YDQtSDQvdC10LPQviDRiNGC0L4g0YHQtSDRgtC10YDQvNC40L0g0LfQsNCy0YDRiNC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ9C/0L7RiNGC0L4g0YHQtSDRgtC10YDQvNC40L0g0LfQsNCy0YDRiNC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAn0JHQtdC3INC00L7Qt9Cy0L7Qu9C1ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBjb3VsZCBub3QgYmUgZGVsZXRlZCEnfSA9ICfQktC10LfQtSDQvdC1INC80L7Qs9GDINCx0LjRgtC4INC+0LHRgNC40YHQsNC90LUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgY291bGQgbm90IGJlIGNyZWF0ZWQhJ30gPSAn0JLQtdC30LAg0L3QuNGY0LUg0LzQvtCz0LvQsCDQsdC40YLQuCDQutGA0LXQuNGA0LDQvdCwISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICfQndC40ZjQtSDQvNC+0LPRg9Gb0LUg0L7QsdGA0LjRgdCw0YLQuCDRgtC10YDQvNC40L0g0YLQuNC60LXRgtCwISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICfQkdC10Lcg0LTQvtC30LLQvtC70LUhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ9CR0LXQtyDQtNC+0LfQstC+0LvQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICfQodC40YHRgtC10Lwg0L3QuNGY0LUg0YPRgdC/0LXQviDQtNCwINGD0LLQtdC30LUg0YTQsNGY0LshJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcrJWQg0LLQuNGI0LUnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0NhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyEnfSA9ICfQkdC10LcgJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICfQndC10L/QvtC30L3QsNGCINC60L7RgNC40YHQvdC40LohJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAn0J3QtdC40YHQv9GA0LDQstCw0L0g0LrQsNC70LXQvdC00LDRgCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAn0J3QtdC40YHQv9GA0LDQstC90LAg0LDQtNGA0LXRgdCwISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICfQk9GA0LXRiNC60LAg0L/RgNC40LvQuNC60L7QvCDQtdC60YHQv9C+0YDRgtC+0LLQsNGa0LAg0LrQsNC70LXQvdC00LDRgNCwISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ9Ce0YHQstC10LbQuCAo0LzQuNC90YPRgtCwKSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuJ30gPSAn0KHRgtGA0LDQvdC40YbQsCDQt9CwINC/0YDQtdCz0LvQtdC0INC60LDQu9C10L3QtNCw0YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ9Ce0LHQsNCy0LXRiNGC0LXRmtCwINC+INGC0LXRgNC80LjQvdGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICfQnNC+0LTRg9C7INC00L7Qs9Cw0ZLQsNGY0LAg0LrQsNC70LXQvdC00LDRgNCwINC30LAg0L/RgNC40L/RgNC10LzRgyDQvtCx0LDQstC10YjRgtC10ZrQsCDQviDRgtC10YDQvNC40L3QuNC80LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIHRpY2tldCB3aXRoIGRhdGEgZnJvbSB0aWNrZXQgYXBwb2ludG1lbnQuJ30gPQogICAgICAgICfQnNC+0LTRg9C7INC00L7Qs9Cw0ZLQsNGY0LAg0LrQsNC70LXQvdC00LDRgNCwINC30LAg0L7RgdCy0LXQttCw0LLQsNGa0LUg0YLQuNC60LXRgtCwINC/0L7QtNCw0YbQuNC80LAg0LjQtyDRgtC10YDQvNC40L3QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAn0KHRgtGA0LDQvdC40YbQsCDQt9CwINC40LfQvNC10L3RgyDQutCw0LvQtdC90LTQsNGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICfQm9C40YHRgtCwINGC0LXRgNC80LjQvdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAn0JvQuNGB0YLQsCDRgtC10YDQvNC40L3QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyd9ID0gJ9Ce0LHQsNCy0LXRiNGC0LXRmtCwINC+INGC0LXRgNC80LjQvdGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ9Ci0LXRgNC80LjQvdC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAn0KHRgtGA0LDQvdC40YbQsCDQt9CwINGD0L/RgNCw0LLRmdCw0ZrQtSDQutCw0LvQtdC90LTQsNGA0LjQvNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICfQmNC30LDQsdC10YDQuCDQt9CwINC60LDQutCy0LUg0L/RgNC+0LzQtdC90LUg0YLQtdGA0LzQuNC90LAg0LbQtdC70LjRiCDQtNCwINC/0YDQuNC80LjRiCDQvtCx0LDQstC10YjRgtC10ZrQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ9Ca0YDQtdC40YDQsCDQvdC+0LLQuCDRgtC10YDQvNC40L0g0YMg0LrQsNC70LXQvdC00LDRgNGDINC/0L7QstC10LfQsNC9INGB0LAg0L7QstC40Lwg0YLQuNC60LXRgtC+0LwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICfQmtGA0LXQuNGA0LDRmtC1INC4INGD0L/RgNCw0LLRmdCw0ZrQtSDQvtCx0LDQstC10YjRgtC10ZrQuNC80LAg0LfQsCDRgtC10YDQvNC40L3QtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICfQmtGA0LXQuNGA0LAg0L3QvtCy0Lgg0YLQtdGA0LzQuNC9Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJ9CU0LXRhNC40L3QuNGI0LUg0LrQvtGY0LUg0LrQvtC70L7QvdC1INGb0LUg0LHQuNGC0Lgg0L/RgNC40LrQsNC30LDQvdC1INGDINCw0L/Qu9C40LrQsNGC0LjQstC90L7QvCDQtNC+0LTQsNGC0LrRgyDQu9C40L3QutC+0LLQsNC90LjRhSDRgtC10YDQvNC40L3QsCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiDQnNC+0LPRg9Gb0LAg0L/QvtC00LXRiNCw0LLQsNGa0LA6IDAgPSDQntC90LXQvNC+0LPRg9Gb0LXQvdC+LCAxID0g0J7QvNC+0LPRg9Gb0LXQvdC+LCAyID0g0J/QvtC00YDQsNC30YPQvNC10LLQsNC90L4g0L7QvNC+0LPRg9Gb0LXQvdC+Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICfQlNC10YTQuNC90LjRiNC1INC40LrQvtC90YMg0YHQsCDQu9C40L3QutC+0Lwg0L3QsCBHb29nbGUg0LzQsNC/0YMg0YLRgNC10L3Rg9GC0L3QtSDQu9C+0LrQsNGG0LjRmNC1INGDINC10LrRgNCw0L3RgyDQt9CwINC40LfQvNC10L3RgyDRgtC10YDQvNC40L3QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICfQlNC10YTQuNC90LjRiNC1INGC0LjQv9C+0LLQtSDQvtCx0ZjQtdC60YLQsCDQtNC+0LPQsNGS0LDRmNCwINC60L7RmNC4INGb0LUg0LHQuNGC0Lgg0L/RgNC+0YbQtdGB0LjRgNCw0L3QuCDQv9GD0YLQtdC8IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICfQlNC10YTQuNC90LjRiNC1INC70LjRgdGC0YMg0L/QsNGA0LDQvNC10YLQsNGA0LAg0LrQvtGY0Lgg0LzQvtCz0YMg0LHQuNGC0Lgg0L/RgNC+0YHQu9C10ZLQtdC90Lgg0YTRg9C90LrRhtC40ZjQuCDQv9GA0LXRgtGA0LDQs9C1INGC0LjQutC10YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDQv9C+0LfQsNC00LjQvdGB0LrQuCDQvNC+0LTRg9C7INGC0LXRgNC80LjQvdCwINGC0LjQutC10YLQsCDQt9CwINC00LjQvdCw0LzQuNGH0LrQviDQv9C+0ZnQtSDQtNCw0YLRg9C80LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICfQlNC10YTQuNC90LjRiNC1INC/0L7Qt9Cw0LTQuNC90YHQutC4INC80L7QtNGD0Lsg0YLQtdGA0LzQuNC90LAg0YLQuNC60LXRgtCwINC30LAg0LLRgNC10LzQtSDQtdGB0LrQsNC70LDRhtC40ZjQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJ9CU0LXRhNC40L3QuNGI0LUg0L/QvtC30LDQtNC40L3RgdC60Lgg0LzQvtC00YPQuyDRgtC10YDQvNC40L3QsCDRgtC40LrQtdGC0LAg0LfQsCDQstGA0LXQvNC1INGH0LXQutCw0ZrQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJ9CU0LXRhNC40L3QuNGI0LUg0YLQuNC60LXRgiDQvNC+0LTRg9C7INC30LAg0LrQsNC70LXQvdC00LDRgNGB0LrQtSDRgtC10YDQvNC40L3QtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnRHluYW1pY0ZpZWxkXyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgYXBwb2ludG1lbnQnfSA9ICfQmNC30LzQtdC90LAg0YLQtdGA0LzQuNC90LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlyc3QgcmVzcG9uc2UgdGltZSd9ID0gJ9CS0YDQtdC80LUg0L/RgNCy0L7QsyDQvtC00LPQvtCy0L7RgNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ9CV0LrRgNCw0L0g0LfQsCDRg9Cy0L7QtyDRgtC10YDQvNC40L3QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAn0J/QvtCy0LXQt9GD0ZjQtSDRgtC10YDQvNC40L3QtSDQuCDRgtC40LrQtdGC0LUgItCd0L7RgNC80LDQu9C90LjQvCIg0LLRgNGB0YLQsNC80LAg0LLQtdC30LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICfQm9C40YHRgtCwINGB0LLQuNGFINC+0LHQsNCy0LXRiNGC0LXRmtCwINC+INGC0LXRgNC80LjQvdC40LzQsCDQt9CwINC/0YDQuNC60LDQtyDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ9Cb0LjRgdGC0LAg0YHQstC40YUg0LTQvtCz0LDRktCw0ZjQsCDQvdCwINC60LDQu9C10L3QtNCw0YDQuNC80LAg0LrQvtGY0LAg0ZvQtSDQsdC40YLQuCDQv9GA0LjQutCw0LfQsNC90LAg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAn0JvQuNGB0YLQsCDQsdC+0ZjQsCDRgyDRhdC10LrRgdCw0LTQtdGG0LjQvNCw0LvQvdC+0LwgUkdCINC30LDQv9C40YHRgyDQutC+0ZjQtSDRm9C1INCx0LjRgtC4INC00L7RgdGC0YPQv9C90LUg0LfQsCDQuNC30LHQvtGAINC/0YDQuNC70LjQutC+0Lwg0L/RgNCw0LLRmdC10ZrQsCDQutCw0LvQtdC90LTQsNGA0LAuINCe0LHRgNCw0YLQuNGC0LUg0L/QsNC20ZrRgyDQtNCwINGB0YMg0LHQvtGY0LUg0LTQvtCy0L7RmdC90L4g0YLQsNC80L3QtSDRgtCw0LrQviDQtNCwINCx0LXQu9C4INGC0LXQutGB0YIg0LzQvtC20LUg0LHQuNGC0Lgg0LjRgdC/0LjRgdCw0L0g0L3QsCDRmtC40LzQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAn0KPQv9GA0LDQstGZ0LDRmtC1INGA0LDQt9C70LjRh9C40YLQuNC8INC60LDQu9C10L3QtNCw0YDQuNC80LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAn0JzQsNC60YHQuNC80LDQu9C90Lgg0LHRgNC+0Zgg0LDQutGC0LjQstC90LjRhSDQutCw0LvQtdC90LTQsNGA0LAg0YMg0LXQutGA0LDQvdC40LzQsCDQt9CwINC/0YDQtdCz0LvQtdC0LiDQntCx0YDQsNGC0LjRgtC1INC/0LDQttGa0YMg0LTQsCDQstC10LvQuNC60Lgg0LHRgNC+0Zgg0LDQutGC0LjQstC90LjRhSDQutCw0LvQtdC90LTQsNGA0LAg0LzQvtC20LUg0LjQvNCw0YLQuCDRg9GC0LjRhtCw0Zgg0L3QsCDQv9C10YDRhNC+0YDQvNCw0L3RgdC1INCy0LDRiNC10LMg0YHQtdGA0LLQtdGA0LAg0L/RgNCw0LLRmdC10ZrQtdC8INC/0YDQtdCy0LjRiNC1INGB0LjQvNGD0LvRgtCw0L3QuNGFINC30LDRhdGC0LXQstCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICdPVFJTINC90LUg0L/QvtC00YDQttCw0LLQsCDRgtC10YDQvNC40L3QtSDQutC+0ZjQuCDRgdC1INC/0L7QvdCw0LLRmdCw0ZjRgyDQsdC10Lcg0LrRgNCw0ZjRmtC10LMg0LTQsNGC0YPQvNCwINC40LvQuCDQsdGA0L7RmNCwINC40YLQtdGA0LDRhtC40ZjQsC4g0J/RgNC40LvQuNC60L7QvCDRg9Cy0L7Qt9CwINC60LDQu9C10L3QtNCw0YDQsCwg0LzQvtC20LUg0YHQtSDQtNC+0LPQvtC00LjRgtC4INC00LAgSUNTINGE0LDRmNC7INGB0LDQtNGA0LbQuCDRgtCw0LrQstC1IFwn0LHQtdGB0LrQvtC90LDRh9C90LVcJyDRgtC10YDQvNC40L3QtS4g0KPQvNC10YHRgtC+INGC0LDQutCy0L7QsyDQv9C+0L3QsNGI0LDRmtCwLCDRgdC40YHRgtC10Lwg0ZvQtSDQutGA0LXQuNGA0LDRgtC4INGB0LLQtSDRgtC10YDQvNC40L3QtSDQuNC3INC/0YDQvtGI0LvQvtGB0YLQuCwg0LrQsNC+INC4INGC0LXRgNC80LjQvdC1INC30LAg0YHQu9C10LTQtdGb0LggbiDQsdGA0L7RmCDQvNC10YHQtdGG0LggKNC/0L7QtNGA0LDQt9GD0LzQtdCy0LDQvdC+IDEyMCDQvNC10YHQtdGG0LgvMTAg0LPQvtC00LjQvdCwKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICfQn9GA0LXQs9C70LXQtCDRgdCy0LjRhSDRgtC10YDQvNC40L3QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAn0JLRgNC10LzQtSDRh9C10LrQsNGa0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJ9Cc0L7QtNGD0Lsg0L/RgNC10YLRgNCw0LPQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJ9Cc0L7QtNGD0Lsg0L/RgNC10YLRgNCw0LPQtSDQt9CwINCw0YPRgtC+0LzQsNGC0YHQutC+INC00L7Qv9GD0ZrQsNCy0LDRmtC1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICfQiNCw0LLQvdC4INC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIGNhbGVuZGFyLid9ID0gJ9CI0LDQstC90Lgg0LrQsNC70LXQvdC00LDRgC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICfQn9GA0LXQs9C70LXQtCDRgNC10YHRg9GA0YHQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknfSA9ICfQn9GA0LXQs9C70LXQtCDRgNC10YHRg9GA0YHQsCAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAn0J/RgNC40LrQsNC30YPRmNC1INCy0LXQt9GDINGDINC80LXQvdC40ZjRgyDRgtC40LrQtdGC0LAg0LfQsCDQutGA0LXQuNGA0LDRmtC1INGC0LXRgNC80LjQvdCwINGDINC60LDQu9C10L3QtNCw0YDRgyDQv9C+0LLQtdC30LDQvdC+0LMg0YHQsCDRgtC40Lwg0YLQuNC60LXRgtC+0LwuINCU0L7QtNCw0YLQvdCwINC60L7QvdGC0YDQvtC70LAg0L/RgNC40LrQsNC30LAg0L7QstC1INCy0LXQt9C1INC80L7QttC1INGB0LUg0L/QvtGB0YLQuNGb0Lgg0LrQvtGA0LjRiNGb0LXRmtC10Lwg0LrRmdGD0YfQsCAiR3JvdXAiINGB0LAg0YHQsNC00YDQttCw0ZjQtdC8ICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuINCX0LAg0LfQtNGA0YPQttC40LLQsNGa0LUg0LLQtdC30LAg0YMg0LzQtdC90LjRmNGDINC/0L7QtNC10YHQuNGC0LUg0LrRmdGD0YcgIkNsdXN0ZXJOYW1lIiDRgdCwINGB0LDQtNGA0LbQsNGY0LXQvCDQutC+0ZjQuCDRm9C1INCx0LjRgtC4INC90LDQt9C40LIg0LrQvtGY0Lgg0LbQtdC70LjRgtC1INC00LAg0LLQuNC00LjRgtC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDLiDQmtC+0YDQuNGB0YLQuNGC0LUg0LrRmdGD0YcgIkNsdXN0ZXJQcmlvcml0eSIg0LfQsCDQuNC30LzQtdC90YMg0YDQtdC00L7RgdC70LXQtNCwINCz0YDRg9C/0LAg0YMg0LzQtdC90LjRmNGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2x1dGlvbiB0aW1lJ30gPSAn0JLRgNC10LzQtSDRgNC10YjQsNCy0LDRmtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAn0JjQt9Cx0L7RgCDRgtGA0LDQvdGB0L/QvtGA0YLQsCDQt9CwINC+0LHQsNCy0LXRiNGC0LXRmtCwINC+INGC0LXRgNC80LjQvdGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICfQkNC60YLQuNCy0LjRgNCwINC00L7QtNCw0LLQsNGa0LUg0LjQu9C4INC+0YHQstC10LbQsNCy0LDRmtC1INCw0YPRgtC+0LzQsNGC0YHQutC40YUg0YLQtdGA0LzQuNC90LAg0L3QsCDQvtGB0L3QvtCy0YMg0LLRgNC10LzQtdC90LAg0YLQuNC60LXRgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ9CS0YDQtdC80LUg0LDQttGD0YDQuNGA0LDRmtCwJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6c3JfTGF0bl9PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICdVcHJhdmxqYW5qZSBvYmF2ZcWhdGVuamltYSBvIHRlcm1pbmltYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJ092ZGUgbW/FvmV0ZSBwb3NsYXRpIGtvbmZpZ3VyYWNpb251IGRhdG90ZWt1IHphIHV2b3ogb2JhdmXFoXRlbmphIG8gdGVybWludSB1IHZhxaEgc2lzdGVtLiBEYXRvdGVrYSBtb3JhIGJpdGkgdSBpc3RvbSAueW1sIGZvcm1hdHUga29qaSBqZSBtb2d1xIdlIGRvYml0aSBpenZvem9tIHUgZWtyYW51IHVwcmF2bGphbmphIG9iYXZlxaF0ZW5qaW1hIG8gdGVybWluaW1hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ092ZGUgbW/FvmV0ZSBpemFicmF0aSBrb2ppIGRvZ2HEkWFqaSDEh2UgcG9rcmVudXRpIG9iYXZlxaF0YXZhbmplLiBEb2RhdG5pIGZpbHRlciB6YSB0ZXJtaW5lIG1vxb5lIGJpdGkgcHJpbWVuamVuIHJhZGkgc2xhbmphIHNhbW8gemEgdGVybWluZSBwbyBvZHJlxJFlbm9tIGtyaXRlcmlqdW11Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdGaWx0ZXIgdGVybWluYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAnVGltJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAnUmVzdXJzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmeSB1c2VyIGp1c3Qgb25jZSBwZXIgZGF5IGFib3V0IGEgc2luZ2xlIGFwcG9pbnRtZW50IHVzaW5nIGEgc2VsZWN0ZWQgdHJhbnNwb3J0Lid9ID0KICAgICAgICAnT2JhdmVzdGkga29yaXNuaWthIHNhbW8gamVkbm9tIGRuZXZubyBvIHBvamVkaW5hxI1ub20gdGVybWludSBrb3JpxaHEh2VuamVtIGl6YWJyYW5vZyB0cmFuc3BvcnRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ09iYXZlxaF0ZW5qZSDEh2UgYml0aSBwb3NsYXRvIG9wZXJhdGVydS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ0RhIHZpZGl0ZSBwcnZpaCAyMCBrYXJha3RlcmEgbmFzbG92YSB0ZXJtaW5hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ0RhIHZpZGl0ZSBhdHJpYnV0ZSB0ZXJtaW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnRGEgdmlkaXRlIGF0cmlidXRlIGthbGVuZGFyYSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VuZGEgT3ZlcnZpZXcnfSA9ICdQcmVnbGVkIGRuZXZub2cgcmVkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgQ2FsZW5kYXJzJ30gPSAnVXByYXZsamFuamUga2FsZW5kYXJpbWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnRG9kYWogdGVybWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnQm9qYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ0RhdHVtIGtyYWphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ1BvbmF2bGphbmplJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ05pamUgcHJvbmHEkWVuIG5pamVkYW4ga2FsZW5kYXIuIE1vbGltbyBwcnZvIGRvZGFqdGUga2FsZW5kYXIga29yacWhxIdlbmplbSBla3JhbmEgVXByYXZsamFuamUga2FsZW5kYXJpbWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAnVGVybWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdPdmFqIHRlcm1pbiBzZSBwb25hdmxqYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJ0RhIGxpIMW+ZWxpdGUgZGEgaXptZW5pIHNhbW8gb3ZvIGlsaSBzdmEgcG9uYXZsamFuamE/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ1N2YSBwb25hdmxqYW5qYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdXN0IHRoaXMgb2NjdXJyZW5jZSd9ID0gJ1NhbW8gb3ZvIHBvbmF2bGphbmplJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICdVcHJhdmxqYW5qZSBrYWxlbmRhcmltYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ1ByZWdsZWQga2FsZW5kYXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdEb2RhaiBub3ZpIGthbGVuZGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYWxlbmRhcid9ID0gJ0RvZGFqIGthbGVuZGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICdVdmV6aSB0ZXJtaW5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ1V2b3oga2FsZW5kYXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLid9ID0KICAgICAgICAnT3ZkZSBtb8W+ZXRlIHXEjWl0YXRpIGtvbmZpZ3VyYWNpb251IGRhdG90ZWt1IHphIHV2b3oga2FsZW5kYXJhIHUgdmHFoSBzaXN0ZW0uIERhdG90ZWthIG1vcmEgYml0aSB1IC55bWwgZm9ybWF0dSBpenZlemVuYSBvZCBzdHJhbmUgbW9kdWxhIHphIHVwcmF2bGphbmplIGthbGVuZGFyaW1hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbid9ID0gJ1XEjWl0YWoga29uZmlndXJhY2lqdSBrYWxlbmRhcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAnVXZlemkga2FsZW5kYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBjYWxlbmRhcnMnfSA9ICdGaWx0ZXIgemEga2FsZW5kYXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJ1UgemF2aXNub3N0aSBvZCBwb2xqYSBncnVwZSwgc2lzdGVtIMSHZSBkb3p2b2xpdGkgcHJpc3R1cCBrYWxlbmRhcnUgb3BlcmF0ZXJpbWEgcHJlbWEgbmppaG92b20gbml2b3UgcHJpc3R1cGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQgb25seTogdXNlcnMgY2FuIHNlZSBhbmQgZXhwb3J0IGFsbCBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnUk86IG9wZXJhdGVyaSBtb2d1IHByZWdsZWRhdGkgaSBla3Nwb3J0b3ZhdGkgc3ZlIHRlcm1pbmUgdSBrYWxlbmRhcnUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAnUHJlbWVzdGkgdTogb3BlcmF0ZXJpIG1vZ3UgbW9kaWZpa292YXRpIHRlcm1pbmUgdSBrYWxlbmRhcnUsIGFsaSBiZXogcHJvbWVuZSBrb20ga2FsZW5kYXJ1IHByaXBhZGFqdS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ0tyZWlyYW5qZTogb3BlcmF0ZXJpIG1vZ3Uga3JlaXJhdGkgaSBicmlzYXRpIHRlcm1pbmUgdSBrYWxlbmRhcnUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICdSVzogb3BlcmF0ZXJpIG1vZ3UgYWRtaW5pc3RyaXJhdGkgaSBzYW0ga2FsZW5kYXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ0FkcmVzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdJenZlemkga2FsZW5kYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICdQcmV1em1pIGthbGVuZGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvcHkgcHVibGljIGNhbGVuZGFyIFVSTCd9ID0gJ0lza29waXJhaiBqYXZudSBhZHJlc3Uga2FsZW5kYXJhIChVUkwpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG5hbWUnfSA9ICdOYXppdiBrYWxlbmRhcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAnS2FsZW5kYXIgc2EgaXN0aW0gbmF6aXZvbSB2ZcSHIHBvc3RvamkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Blcm1pc3Npb24gZ3JvdXAnfSA9ICdHcnVwYSBwcmlzdHVwYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgQXBwb2ludG1lbnRzJ30gPSAnVGVybWluaSB0aWtldGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVsZSd9ID0gJ1ByYXZpbG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnS29yaXN0ZcSHaSBvcGNpamUgaXNwb2QgaXphYmVyaXRlIHphIGtvamUgdGlrZXRlIMSHZSB0ZXJtaW5pIGJpdGkgYXV0b21hdHNraSBrcmVpcmFuaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJ01vbGltbyBkYSBvZGFiZXJldGUgdmHFvmXEh2kgcmVkLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ0F0cmlidXRpIHByZXRyYWdlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAnRGVmaW5pxaFpdGUgcHJhdmlsYSB6YSBrcmVpcmFuamUgYXV0b21hdHNraWggdGVybWluYSB1IG92b20ga2FsZW5kYXJ1IG5hIG9zbm92dSB0aWtldGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAnRG9kYWogcHJhdmlsbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAnVmnFoWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ01hbmplJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ0RvZGFqIG5vdmkgdGVybWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0thbGVuZGFyaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGlzIGFuIG92ZXJ2aWV3IHBhZ2UgZm9yIHRoZSBBcHBvaW50bWVudCBDYWxlbmRhci4nfSA9ICdPdmEgc3RyYW5pY2Egc2x1xb5pIHphIHByZWdsZWQga2FsZW5kYXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAnUHJldmnFoWUgYWt0aXZuaWgga2FsZW5kYXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBlaXRoZXIgdHVybiBzb21lIG9mZiBmaXJzdCBvciBpbmNyZWFzZSB0aGUgbGltaXQgaW4gY29uZmlndXJhdGlvbi4nfSA9CiAgICAgICAgJ0lsaSBwcnZvIGlza2xqdcSNaXRlIHByaWtheiBuZWtvZyBrYWxlbmRhcmEgaWxpIHBvdmXEh2FqdGUgbGltaXQgdSBrb25maWd1cmFjaWppLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrJ30gPSAnU2VkbWljYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ01lc2XEjW5hIG9zYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBXZWVrJ30gPSAnU2VkbWnEjW5hIG9zYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICdEbmV2bmEgb3NhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1bXAnfSA9ICdTa2/EjWknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJ1BvbmnFoXRpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICdQcmlrYcW+aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ09zbm92bmUgaW5mb3JtYWNpamUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRGF0dW0vdnJlbWUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ01vbGltbyBwb3N0YXZpdGUgb3ZhaiBkYXR1bSBwcmUga3JhamEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ01vbGltbyBwb3N0YXZpdGUgb3ZhaiBkYXR1bSBwb3NsZSBwb8SNZXRrYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50Lid9ID0gJ092byBqZSB0ZXJtaW4ga29qaSBzZSBwb25hdmxqYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdLbGlrbml0ZSBvdmRlIHphIHByZWdsZWQgbWF0acSNbm9nIHRlcm1pbmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0tsaWtuaXRlIG92ZGUgemEgaXptZW51IG1hdGnEjW5vZyB0ZXJtaW5hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdVxI1lc3RhbG9zdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ1N2YWtvZyhlKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnUmVsYXRpdm5vIHZyZW1lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nfSA9CiAgICAgICAgJ0RhIGxpIHN0ZSBzaWd1cm5pIGRhIMW+ZWxpdGUgZGEgaXpicmnFoWV0ZSBvdmFqIHRlcm1pbj8gT3Z1IG9wZXJhY2lqdSBuaWplIG1vZ3XEh2Ugb3BvenZhdGkuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICdVdm96IHRlcm1pbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkZWQgZmlsZSBtdXN0IGJlIGluIHZhbGlkIGlDYWwgZm9ybWF0ICguaWNzKS4nfSA9ICdQb3NsYXRpIGZhamwgbW9yYSBiaXRpIHUgaXNwcmF2bm9tIGlDYWwgZm9ybWF0dSAoLmljcykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ1Vrb2xpa28gxb5lbGplbmkga2FsZW5kYXIgbmlqZSBpemxpc3RhbiwgcHJvdmVyaXRlIGRhIGxpIGltYXRlIG5pdm8gcHJpc3R1cGEgXCdrcmVpcmFuamVcJyB6YSBncnVwdSBrYWxlbmRhcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSBleGlzdGluZyBhcHBvaW50bWVudHM/J30gPSAnT3N2ZcW+aSBwb3N0b2plxIdlIHRlcm1pbmU/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAnU3ZpIHBvc3RvamXEh2kgdGVybWluaSB1IGthbGVuZGFydSBzYSBpc3RpbSBVbmlxdWVJRCBwb2xqZW0gxIdlIGJpdGkgcHJlYnJpc2FuaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyJ30gPSAnUG/FoWFsamkga2FsZW5kYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ1V2ZXppIHRlcm1pbmUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnTm92aSB0ZXJtaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ1Vza29ybyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyc1IGRheXMnfSA9ICc1IGRhbmEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAnT2JhdmXFoXRlbmplIHNhIG92aW0gbmF6aXZvbSB2ZcSHIHBvc3RvamkhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICdPcGVyYXRlciAocmVzdXJzKSwga29qaSBqZSBpemFicmFuIHUgdGVybWludSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdTdmkgb3BlcmF0ZXJpIHNhIChuYWptYW5qZSkgZG96dm9sb20gcHJlZ2xlZGEgdGVybWluYSAoa2FsZW5kYXJhKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ1N2aSBvcGVyYXRlcmkgc2EgZG96dm9sb20gcGlzYW5qYSB1IHRlcm1pbnUgKGthbGVuZGFydSknOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyISd9ID0gJ1Npc3RlbSBuaWplIHVzcGVvIGRhIGtyZWlyYSBrYWxlbmRhciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJ30gPSAnTW9saW1vIGtvbnRha3RpcmFqdGUgYWRtaW5pc3RyYXRvcmEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAnTmVtYSBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdOZW1hdGUgcHJpc3R1cCBvdm9tIGthbGVuZGFydSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ0l6bWVuaSBrYWxlbmRhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnR3JlxaFrYSBwcmlsaWtvbSBpem1lbmUga2FsZW5kYXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkblwndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4nfSA9ICdVxI1pdGF2YW5qZSBrb25maWd1cmFjaWplIGthbGVuZGFyYSBuaWplIGJpbG8gbW9ndcSHZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGZpbGUgaXMgdmFsaWQuJ30gPSAnTW9saW1vIHZhcyBkYSBwcm92ZXJpdGUgZGEgbGkgamUgdmHFoSBmYWpsIGlzcHJhdmFuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICdOaWplIG1vZ3XEhyB1dm96IGthbGVuZGFyYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgaW1wb3J0ZWQhJ30gPSAnS2FsZW5kYXIgamUgdXZlemVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAnUG90cmViYW4gSUQga2FsZW5kYXJhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJ05lIG1vZ3UgcHJpYmF2aXRpIHBvZGF0a2UgemEgZGF0aSBDYWxlbmRhcklEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICdVc3BlxaFubyB1dmV6ZW5vICVzIHRlcm1pbihhKSB1IGthbGVuZGFyICVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUgbWludXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxNSBtaW51dGVzJ30gPSAnKzE1IG1pbnV0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMCBtaW51dGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzEgaG91cid9ID0gJysxIHNhdCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICdTdmkgdGVybWluaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICdUZXJtaW5pIGRvZGVsamVuaSBtZW5pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICdQcmlrYXogc2FtbyB0ZXJtaW5hIGRvZGVsamVuaWggdmFtYSEgSXptZW5pdGUgcG9kZcWhYXZhbmphJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ1Rlcm1pbiBuaWplIHByb25hxJFlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICdOaWthZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAnU3Zha2kgZGFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICdTdmFrZSBzZWRtaWNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAnU3Zha29nIG1lc2VjYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBZZWFyJ30gPSAnU3Zha2UgZ29kaW5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbSd9ID0gJ1ByaWxhZ2/EkWVubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ0RuZXZubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICdTZWRtacSNbm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ01lc2XEjW5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ0dvZGnFoW5qZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydldmVyeSd9ID0gJ3N2YWtvZyhlKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJ3VrdXBubyAlcyBwdXQoYSknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgLi4uJ30gPSAnZG8gLi4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAuLi4gdGltZShzKSd9ID0gJ3VrdXBubyAuLi4gcHV0KGEpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAnZG8gJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAnQmV6IG9iYXZlxaF0ZW5qYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXMgbWludXQoYSkgcHJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAnJXMgc2F0KGEpIHByZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXMgZGFuKGEpIHByZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzIG5lZGVsamEgcHJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJ30gPSAncHJlIG5lZ28gxaF0byB0ZXJtaW4gemFwb8SNbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICdwb8WhdG8gdGVybWluIHphcG/EjW5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ3ByZSBuZWdvIMWhdG8gc2UgdGVybWluIHphdnLFoWknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAncG/FoXRvIHNlIHRlcm1pbiB6YXZyxaFpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAnQmV6IGRvenZvbGUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGNvdWxkIG5vdCBiZSBkZWxldGVkISd9ID0gJ1ZlemUgbmUgbW9ndSBiaXRpIG9icmlzYW5lISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIGNvdWxkIG5vdCBiZSBjcmVhdGVkISd9ID0gJ1ZlemEgbmlqZSBtb2dsYSBiaXRpIGtyZWlyYW5hISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICdOaWplIG1vZ3XEh2Ugb2JyaXNhdGkgdGVybWluIHRpa2V0YSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAnQmV6IGRvenZvbGUhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ0JleiBkb3p2b2xlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ1Npc3RlbSBuaWplIHVzcGVvIGRhIHV2ZXplIGZhamwhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcrJWQgdmnFoWUnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0NhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyEnfSA9ICdCZXogJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICdOZXBvem5hdCBrb3Jpc25payEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICdOZWlzcHJhdmFuIGthbGVuZGFyISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIFVSTCEnfSA9ICdOZWlzcHJhdm5hIGFkcmVzYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnR3JlxaFrYSBwcmlsaWtvbSBla3Nwb3J0b3ZhbmphIGthbGVuZGFyYSEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICdPc3Zlxb5pIChtaW51dGEpJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICdTdHJhbmljYSB6YSBwcmVnbGVkIGthbGVuZGFyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ09iYXZlxaF0ZW5qYSBvIHRlcm1pbnUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgcHJlcGFyZXMgbm90aWZpY2F0aW9uIGVudHJpZXMgZm9yIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ01vZHVsIGRvZ2HEkWFqYSBrYWxlbmRhcmEgemEgcHJpcHJlbXUgb2JhdmXFoXRlbmphIG8gdGVybWluaW1hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAnTW9kdWwgZG9nYcSRYWphIGthbGVuZGFyYSB6YSBvc3Zlxb5hdmFuamUgdGlrZXRhIHBvZGFjaW1hIGl6IHRlcm1pbmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ1N0cmFuaWNhIHphIGl6bWVudSBrYWxlbmRhcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICdMaXN0YSB0ZXJtaW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAnTGlzdGEgdGVybWluYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyd9ID0gJ09iYXZlxaF0ZW5qYSBvIHRlcm1pbnUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnVGVybWluaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ1N0cmFuaWNhIHphIHVwcmF2bGphbmplIGthbGVuZGFyaW1hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICdJemFiZXJpIHphIGtha3ZlIHByb21lbmUgdGVybWluYSDFvmVsacWhIGRhIHByaW1pxaEgb2JhdmXFoXRlbmphLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSBuZXcgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoaXMgdGlja2V0J30gPSAnS3JlaXJhIG5vdmkgdGVybWluIHUga2FsZW5kYXJ1IHBvdmV6YW4gc2Egb3ZpbSB0aWtldG9tJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnS3JlaXJhbmplIGkgdXByYXZsamFuamUgb2JhdmXFoXRlbmppbWEgemEgdGVybWluZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICdLcmVpcmEgbm92aSB0ZXJtaW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAnRGVmaW5pxaFlIGtvamUga29sb25lIMSHZSBiaXRpIHByaWthemFuZSB1IGFwbGlrYXRpdm5vbSBkb2RhdGt1IGxpbmtvdmFuaWggdGVybWluYSAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBNb2d1xIdhIHBvZGXFoWF2YW5qYTogMCA9IE9uZW1vZ3XEh2VubywgMSA9IE9tb2d1xIdlbm8sIDIgPSBQb2RyYXp1bWV2YW5vIG9tb2d1xIdlbm8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gaWNvbiB3aXRoIGxpbmsgdG8gdGhlIGdvb2dsZSBtYXAgcGFnZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9CiAgICAgICAgJ0RlZmluacWhZSBpa29udSBzYSBsaW5rb20gbmEgR29vZ2xlIG1hcHUgdHJlbnV0bmUgbG9rYWNpamUgdSBla3JhbnUgemEgaXptZW51IHRlcm1pbmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAnRGVmaW5pxaFlIHRpcG92ZSBvYmpla3RhIGRvZ2HEkWFqYSBrb2ppIMSHZSBiaXRpIHByb2Nlc2lyYW5pIHB1dGVtIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICdEZWZpbmnFoWUgbGlzdHUgcGFyYW1ldGFyYSBrb2ppIG1vZ3UgYml0aSBwcm9zbGXEkWVuaSBmdW5rY2lqaSBwcmV0cmFnZSB0aWtldGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJ0RlZmluacWhZSBwb3phZGluc2tpIG1vZHVsIHRlcm1pbmEgdGlrZXRhIHphIGRpbmFtacSNa28gcG9samUgZGF0dW1hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnRGVmaW5pxaFlIHBvemFkaW5za2kgbW9kdWwgdGVybWluYSB0aWtldGEgemEgdnJlbWUgZXNrYWxhY2lqZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJ0RlZmluacWhZSBwb3phZGluc2tpIG1vZHVsIHRlcm1pbmEgdGlrZXRhIHphIHZyZW1lIMSNZWthbmphLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAnRGVmaW5pxaFlIHRpa2V0IG1vZHVsIHphIGthbGVuZGFyc2tlIHRlcm1pbmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJ0R5bmFtaWNGaWVsZF8lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAnSXptZW5hIHRlcm1pbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlyc3QgcmVzcG9uc2UgdGltZSd9ID0gJ1ZyZW1lIHBydm9nIG9kZ292b3JhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ0VrcmFuIHphIHV2b3ogdGVybWluYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAnUG92ZXp1amUgdGVybWluZSBpIHRpa2V0ZSAiTm9ybWFsbmltIiB2cnN0YW1hIHZlemEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0YSBzdmloIG9iYXZlxaF0ZW5qYSBvIHRlcm1pbmltYSB6YSBwcmlrYXogdSBpbnRlcmZlanN1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnTGlzdGEgc3ZpaCBkb2dhxJFhamEgbmEga2FsZW5kYXJpbWEga29qYSDEh2UgYml0aSBwcmlrYXphbmEgdSBpbnRlcmZlanN1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJ0xpc3RhIGJvamEgdSBoZWtzYWRlY2ltYWxub20gUkdCIHphcGlzdSBrb2plIMSHZSBiaXRpIGRvc3R1cG5lIHphIGl6Ym9yIHByaWxpa29tIHByYXZsamVuamEga2FsZW5kYXJhLiBPYnJhdGl0ZSBwYcW+bmp1IGRhIHN1IGJvamUgZG92b2xqbm8gdGFtbmUgdGFrbyBkYSBiZWxpIHRla3N0IG1vxb5lIGJpdGkgaXNwaXNhbiBuYSBuamltYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAnVXByYXZsamFuamUgcmF6bGnEjWl0aW0ga2FsZW5kYXJpbWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAnTWFrc2ltYWxuaSBicm9qIGFrdGl2bmloIGthbGVuZGFyYSB1IGVrcmFuaW1hIHphIHByZWdsZWQuIE9icmF0aXRlIHBhxb5uanUgZGEgdmVsaWtpIGJyb2ogYWt0aXZuaWgga2FsZW5kYXJhIG1vxb5lIGltYXRpIHV0aWNhaiBuYSBwZXJmb3JtYW5zZSB2YcWhZWcgc2VydmVyYSBwcmF2bGplbmplbSBwcmV2acWhZSBzaW11bHRhbmloIHphaHRldmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgZG9lc25cJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS4nfSA9CiAgICAgICAgJ09UUlMgbmUgcG9kcsW+YXZhIHRlcm1pbmUga29qaSBzZSBwb25hdmxqYWp1IGJleiBrcmFqbmplZyBkYXR1bWEgaWxpIGJyb2phIGl0ZXJhY2lqYS4gUHJpbGlrb20gdXZvemEga2FsZW5kYXJhLCBtb8W+ZSBzZSBkb2dvZGl0aSBkYSBJQ1MgZmFqbCBzYWRyxb5pIHRha3ZlIFwnYmVza29uYcSNbmVcJyB0ZXJtaW5lLiBVbWVzdG8gdGFrdm9nIHBvbmHFoWFuamEsIHNpc3RlbSDEh2Uga3JlaXJhdGkgc3ZlIHRlcm1pbmUgaXogcHJvxaFsb3N0aSwga2FvIGkgdGVybWluZSB6YSBzbGVkZcSHaSBuIGJyb2ogbWVzZWNpIChwb2RyYXp1bWV2YW5vIDEyMCBtZXNlY2kvMTAgZ29kaW5hKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICdQcmVnbGVkIHN2aWggdGVybWluYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAnVnJlbWUgxI1la2FuamEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJ01vZHVsIHByZXRyYWdlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAnTW9kdWwgcHJldHJhZ2UgemEgYXV0b21hdHNrbyBkb3B1bmphdmFuamUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBDYWxlbmRhcid9ID0gJ0phdm5pIGthbGVuZGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICdKYXZuaSBrYWxlbmRhci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICdQcmVnbGVkIHJlc3Vyc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAnUHJlZ2xlZCByZXN1cnNhIChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICdQcmlrYXp1amUgdmV6dSB1IG1lbmlqdSB0aWtldGEgemEga3JlaXJhbmplIHRlcm1pbmEgdSBrYWxlbmRhcnUgcG92ZXphbm9nIHNhIHRpbSB0aWtldG9tLiBEb2RhdG5hIGtvbnRyb2xhIHByaWthemEgb3ZlIHZlemUgbW/FvmUgc2UgcG9zdGnEh2kga29yacWhxIdlbmplbSBrbGp1xI1hICJHcm91cCIgc2Egc2FkcsW+YWplbSAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBaYSB6ZHJ1xb5pdmFuamUgdmV6YSB1IG1lbmlqdSBwb2Rlc2l0ZSBrbGp1xI0gIkNsdXN0ZXJOYW1lIiBzYSBzYWRyxb5hamVtIGtvamkgxIdlIGJpdGkgbmF6aXYga29qaSDFvmVsaXRlIGRhIHZpZGl0ZSB1IGludGVyZmVqc3UuIEtvcmlzdGl0ZSBrbGp1xI0gIkNsdXN0ZXJQcmlvcml0eSIgemEgaXptZW51IHJlZG9zbGVkYSBncnVwYSB1IG1lbmlqdS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ1ZyZW1lIHJlxaFhdmFuamEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJhbnNwb3J0IHNlbGVjdGlvbiBmb3IgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdJemJvciB0cmFuc3BvcnRhIHphIG9iYXZlxaF0ZW5qYSBvIHRlcm1pbnUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy4nfSA9CiAgICAgICAgJ0FrdGl2aXJhIGRvZGF2YW5qZSBpbGkgb3N2ZcW+YXZhbmplIGF1dG9tYXRza2loIHRlcm1pbmEgbmEgb3Nub3Z1IHZyZW1lbmEgdGlrZXRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ1ZyZW1lIGHFvnVyaXJhbmphJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6emhfQ05fT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAn5Zui6ZifJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAn6LWE5rqQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmeSB1c2VyIGp1c3Qgb25jZSBwZXIgZGF5IGFib3V0IGEgc2luZ2xlIGFwcG9pbnRtZW50IHVzaW5nIGEgc2VsZWN0ZWQgdHJhbnNwb3J0Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdG8gYW4gYWdlbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBhcHBvaW50bWVudCBhdHRyaWJ1dGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbmRhIE92ZXJ2aWV3J30gPSAn5pel56iL5qaC6KeIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICfnrqHnkIbml6XljoYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAn5re75Yqg6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAn6aKc6ImyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuZCBkYXRlJ30gPSAn57uT5p2f5pel5pyfJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ+mHjeWkjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICfmsqHmnInmib7liLDml6XljobjgILor7flhYjpgJrov4fnrqHnkIbml6XljobnlYzpnaLmt7vliqDkuIDkuKrml6XljobjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQnfSA9ICfpooTnuqYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ+i/meaYr+S4gOS4qumHjeWkjeeahOmihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJ+S9oOaDs+S7hee8lui+keacrOasoemihOe6pueahOaXtumXtOi/mOaYr+mHjeWkjemihOe6puaJgOacieeahOaXtumXtO+8nyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgb2NjdXJyZW5jZXMnfSA9ICfmiYDmnInpooTnuqYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVzdCB0aGlzIG9jY3VycmVuY2UnfSA9ICfku4XmnKzmrKEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgTWFuYWdlbWVudCd9ID0gJ+aXpeWOhueuoeeQhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ+aXpeWOhuamguiniCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IENhbGVuZGFyJ30gPSAn5re75Yqg5paw55qE5pel5Y6GJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYWxlbmRhcid9ID0gJ+a3u+WKoOaXpeWOhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQXBwb2ludG1lbnRzJ30gPSAn5a+85YWl6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ+aXpeWOhuWvvOWFpSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhIGNhbGVuZGFyIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSBjYWxlbmRhciBtYW5hZ2VtZW50IG1vZHVsZS4nfSA9CiAgICAgICAgJ+S9oOWPr+S7peWcqOi/memHjOS4iuS8oOS4gOS4qumFjee9ruaWh+S7tuadpeWvvOWFpeS4gOS4quaXpeWOhuWIsOezu+e7n+S4reOAgui/meS4quaWh+S7tuW/hemhu+aYr+exu+S8vOmAmui/h+aXpeWOhueuoeeQhuaooeWdl+WvvOWHuueahC55bWzmoLzlvI/jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICfkuIrkvKDml6XljobphY3nva4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAn5a+85YWl5pel5Y6GJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAn6L+H5ruk5pel5Y6GJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJ+agueaNrue7hOWtl+aute+8jOezu+e7n+mAmui/h+eUqOaIt+eahOadg+mZkOe6p+WIq+adpeWFgeiuuOeUqOaIt+iDveWkn+iuv+mXrueahOaXpeWOhuOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ+WPquivu++8mueUqOaIt+WPr+S7peeci+WIsOWSjOWvvOWHuuaXpeWOhuS4reaJgOacieeahOmihOe6puOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJ+i9rOenu++8mueUqOaIt+WPr+S7peS/ruaUueaXpeWOhuS4reeahOmihOe6pu+8jOS9huS4jeiDveS/ruaUuemAieaLqeeahOaXpeWOhuOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAn5Yib5bu677ya55So5oi35Y+v5Lul5Yib5bu65ZKM5Yig6Zmk5pel5Y6G5Lit55qE6aKE57qm44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICfor7vlhpnvvJrnlKjmiLflj6/ku6XnrqHnkIbml6XljobjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAn572R5Z2AJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ+WvvOWHuuaXpeWOhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3dubG9hZCBjYWxlbmRhcid9ID0gJ+S4i+i9veaXpeWOhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICflpI3liLblhazlhbHml6XljobnvZHlnYAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ+aXpeWOhuWQjeensCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICflt7LmnInlkIzlkI3nmoTml6XljobjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ+adg+mZkOe7hCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgQXBwb2ludG1lbnRzJ30gPSAn5bel5Y2V6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICfop4TliJknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAn5L2/55So5LiL6Z2i55qE6YCJ6aG55p2l5YeP5bCR6Ieq5Yqo5Yib5bu655qE5bel5Y2V6aKE57qm44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBxdWV1ZS4nfSA9ICfor7fpgInmi6nkuIDkuKrmnInmlYjnmoTpmJ/liJfjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGF0dHJpYnV0ZXMnfSA9ICfmkJzntKLlsZ7mgKcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICflrprkuYnlnKjov5nkuKrml6XljobkuK3ln7rkuo7lt6XljZXmlbDmja7oh6rliqjliJvlu7rpooTnuqbnmoTop4TliJnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFJ1bGUnfSA9ICfmt7vliqDop4TliJknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ+abtOWkmic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAn5pu05bCRJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ+a3u+WKoOaWsOeahOmihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhcnMnfSA9ICfml6XljoYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhbiBvdmVydmlldyBwYWdlIGZvciB0aGUgQXBwb2ludG1lbnQgQ2FsZW5kYXIuJ30gPSAn6L+Z5piv6aKE57qm5pel5Y6G55qE5qaC6KeI6aG16Z2i44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICfmv4DmtLvnmoTml6XljoblpKrlpJonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAn6K+35YWz6Zet5LiA5Lqb5pel5Y6G5oiW6ICF5Zyo6YWN572u5Lit5aKe5Yqg6ZmQ5Yi25pWw44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICflkagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICfmnIjml7bpl7TooagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ+WRqOaXtumXtOihqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICfmr4/ml6Xml7bpl7TooagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ+i3s+i9rCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNtaXNzJ30gPSAn5Y+W5raIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICfmmL7npLonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICfln7rmnKzkv6Hmga8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAn5pel5pyfIC8g5pe26Ze0JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICfor7forr7nva7ov5nkuKrlgLzkuLrnu5PmnZ/ml6XmnJ/kuYvliY3jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAn6K+36K6+572u6L+Z5Liq5YC85Li65byA5aeL5pel5pyf5LmL5ZCO44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICfngrnlh7vov5nph4zmn6XnnIvniLbpooTnuqbjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAn54K55Ye76L+Z6YeM57yW6L6R54i26aKE57qm44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJ+mikeeOhyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ+avjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAn55u45a+555qE5pe26Ze0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nfSA9CiAgICAgICAgJ+S9oOecn+eahOimgeWIoOmZpOi/meS4qumihOe6puWQl++8n+i/meS4quaTjeS9nOaXoOazleWbnumAgOOAgic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAn6aKE57qm5a+85YWlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAn5LiK5Lyg5paH5Lu25b+F6aG75piv5pyJ5pWI55qEaUNhbOagvOW8jyguaWNzKeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICflpoLmnpzmnJ/mnJvnmoTml6XljobmsqHmnInlnKjov5nph4zvvIzor7fnoa7kv53kvaDoh7PlsJHmnInigJzliJvlu7rigJ3mnYPpmZDjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICfmm7TmlrDlt7LmnInnmoTpooTnuqblkJfvvJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGV4aXN0aW5nIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIgd2l0aCBzYW1lIFVuaXF1ZUlEIHdpbGwgYmUgb3ZlcndyaXR0ZW4uJ30gPQogICAgICAgICfnm7jlkIxVbmlxdWVJROeahOaXpeWOhuS4reaJgOacieW3suacieeahOmihOe6pumDveS8muiiq+imhuebluOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICfkuIrkvKDml6XljoYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ+WvvOWFpemihOe6pic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICfmlrDnmoTpooTnuqYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ+W+iOW/qyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyc1IGRheXMnfSA9ICc15aSpJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCAocmVzb3VyY2VzKSwgd2hvIGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIGFwcG9pbnRtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAn57O757uf5LiN6IO95Yib5bu65pel5Y6G77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLid9ID0gJ+ivt+iBlOezu+ezu+e7n+euoeeQhuWRmOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDYWxlbmRhcklEISd9ID0gJ+ayoeacieaXpeWOhklE77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ+S9oOaXoOadg+iuv+mXrui/meS4quaXpeWOhu+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IENhbGVuZGFyJ30gPSAn57yW6L6R5pel5Y6GJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICfmm7TmlrDml6Xljoblh7rplJnvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGltcG9ydCB0aGUgY2FsZW5kYXIhJ30gPSAn5peg5rOV5a+85YWl6L+Z5Liq5pel5Y6G77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ+aXpeWOhuW3suWvvOWFpe+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAn6ZyA6KaB5pel5Y6GSUTvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICfml6Dms5Xov5Tlm57nu5nlrprnmoTml6XljoZJROeahOaVsOaNric7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzZnVsbHkgaW1wb3J0ZWQgJXMgYXBwb2ludG1lbnQocykgdG8gY2FsZW5kYXIgJXMuJ30gPSAn5oiQ5Yqf5bCG6aKE57qmJXPlr7zlhaXliLDml6XljoYlc+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzXliIbpkp8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzE1IG1pbnV0ZXMnfSA9ICcrMTXliIbpkp8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzDliIbpkp8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzEgaG91cid9ID0gJysx5bCP5pe2JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ+aJgOaciemihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICfliIbphY3nu5nmiJHnmoTpooTnuqYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ+S7heaYvuekuuWIhumFjee7meS9oOeahOmihOe6pu+8geS/ruaUueiuvue9ric7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICfmsqHmnInmib7liLDpooTnuqbvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICfmsLjkuI0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAn5q+P5aSpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICfmr4/lkagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICfmr4/mnIgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ+avj+W5tCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICflrprliLYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICfmr4/lpKnkuIDmrKEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vla2x5J30gPSAn5q+P5ZGo5LiA5qyhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICfmr4/mnIjkuIDmrKEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAn5q+P5bm05LiA5qyhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAn5q+PJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAnJXPmrKEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgLi4uJ30gPSAn55u05YiwLi4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAuLi4gdGltZShzKSd9ID0gJy4uLuasoSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ+ebtOWIsCVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ+ayoeaciemAmuefpSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXPliIbpkp/liY0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclc+Wwj+aXtuWJjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXPlpKnliY0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgd2VlayBiZWZvcmUnfSA9ICclc+WRqOWJjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ+WcqOmihOe6puW8gOWni+WJjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCd9ID0gJ+WcqOmihOe6puW8gOWni+WQjic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnfSA9ICflnKjpooTnuqbnu5PmnZ/liY0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAn5Zyo6aKE57qm57uT5p2f5ZCOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAn5rKh5pyJ5p2D6ZmQ77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGNvdWxkIG5vdCBiZSBkZWxldGVkISd9ID0gJ+S4jeiDveWIoOmZpOmTvuaOpe+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIGNvdWxkIG5vdCBiZSBjcmVhdGVkISd9ID0gJ+S4jeiDveWIm+W7uumTvuaOpe+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICfkuI3og73liKDpmaTlt6XljZXpooTnuqbvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAn5rKh5pyJ5p2D6ZmQ77yBJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ+ayoeacieadg+mZkCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICfns7vnu5/ml6Dms5Xlr7zlhaXmlofku7bvvIEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJ+WkmuS6jislZCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAn5rKh5pyJ6L+Z5Liq55So5oi377yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAn5peg5pWI5pel5Y6G77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ+aXoOaViOe9keWdgO+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICflr7zlh7rml6Xljobml7blh7rplJnvvIEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICfliLfmlrDvvIjliIbpkp/vvIknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ+mihOe6puaXpeWOhuamguiniOmhtemdouOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICfpooTnuqbml6Xljobkuovku7bmqKHlnZfvvIzlh4blpIfpooTnuqbnmoTpgJrnn6Xmtojmga/jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJ+mihOe6puaXpeWOhuS6i+S7tuaooeWdl++8jOabtOaWsOW3peWNleeahOmihOe6puaVsOaNruOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICfpooTnuqbnvJbovpHnqpflj6PjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ+mihOe6puWIl+ihqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ+mihOe6puWIl+ihqOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ+mihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ+aXpeWOhueuoeeQhueql+WPo+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ+WIm+W7uuS4gOS4quaWsOeahOaXpeWOhumihOe6puWIsOi/meS4quW3peWNleOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ+WIm+W7uuaWsOeahOmihOe6puOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICflrprkuYnkuIDkuKrlm77moIfvvIzpk77mjqXpooTnuqbnvJbovpHnqpflj6PkuK3nmoTlvZPliY3kvY3nva7liLDosLfmrYzlnLDlm77pobXpnaLjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICflrprkuYnog73kvKDpgJLliLDlt6XljZXmkJzntKLlip/og73nmoTlj4LmlbDmuIXljZXjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAn5a6a5LmJ5bel5Y2V6aKE57qm57G75Z6L5ZCO56uv77yM55So5LqO5bel5Y2V5Yqo5oCB5a2X5q615pel5pyf5pe26Ze044CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICflrprkuYnlt6XljZXpooTnuqbnsbvlnovlkI7nq6/vvIznlKjkuo7lt6XljZXljYfnuqfml7bpl7TjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJ+WumuS5ieW3peWNlemihOe6puexu+Wei+WQjuerr++8jOeUqOS6juW3peWNleaMgui1t+aXtumXtOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAn5a6a5LmJ5pel5Y6G6aKE57qm55qE5bel5Y2V5o+S5Lu244CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJ0R5bmFtaWNGaWVsZF8lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAn57yW6L6R6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICfpppbmrKHlk43lupTml7bpl7QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAn5a+85YWl6aKE57qm56qX5Y+j44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJ+WwhumihOe6puWSjOW3peWNlemTvuaOpeS4uuKAnOaZrumAmuKAneexu+Wei+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAn5YiX5Ye66KaB5Zyo5Zu+5b2i55WM6Z2i5pi+56S655qE5omA5pyJ6aKE57qm5LqL5Lu244CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICflnKjliJvlu7rml6Xljobml7blj6/nlKjkuo7pgInmi6nnmoQxNui/m+WItlJHQuminOiJsuWIl+ihqOOAguivt+S9v+eUqOi2s+Wkn+a3seiJsueahOminOiJsu+8jOS7peehruS/neiDveWkn+aYvuekuuS4iumdoueZveiJsueahOaWh+acrOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICfnrqHnkIbkuI3lkIznmoTml6XljobjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICfml6XljobmpoLop4jnqpflj6Pog73mv4DmtLvnmoTml6XljobmnIDlpKfmlbDjgILor7fms6jmhI/vvJrlpKfph4/nmoTmv4DmtLvml6XljobkvJrlr7nmnI3liqHlmajkuqfnlJ/lpKrlpJrnmoTlkIzmraXosIPnlKjvvIzlj6/og73kvJrmnInmgKfog73lvbHlk43jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAn5omA5pyJ6aKE57qm55qE5qaC6KeI44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlbmRpbmcgdGltZSd9ID0gJ+aMgui1t+aXtumXtCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoJ30gPSAn5pCc57Si5o+S5Lu2JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAn55So5LqO6Ieq5Yqo5a6M5oiQ55qE5pCc57Si5o+S5Lu25qih5Z2X44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBDYWxlbmRhcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3J30gPSAn6LWE5rqQ5qaC6KeIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSd9ID0gJ+i1hOa6kOamguiniO+8iE9UUlPllYbkuJrniYjvvIknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAn5Zyo5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V6K+m5oOF56qX5Y+j77yM5Zyo6I+c5Y2V5LiK5pi+56S65LiA5Liq6ZO+5o6l77yM5Lul5Yib5bu65LiA5Liq5pel5Y6G6aKE57qm5bm255u05o6l6ZO+5o6l5Yiw5q2k5bel5Y2V44CC5Y+v6YCa6L+H6ZSu4oCcR3JvdXDigJ3lkozlgLzlpoLigJxydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMuKAnei/m+ihjOmineWklueahOiuv+mXruaOp+WItu+8jOS7peaYvuekuuaIluS4jeaYvuekuui/meS4qumTvuaOpeOAguWmguaenOimgeaUvuWIsOiPnOWNlee7hOS4re+8jOS9v+eUqOmUruKAnENsdXN0ZXJOYW1l4oCd77yM5YC85Y+v5Lul5piv55WM6Z2i5LiK6IO955yL5Yiw55qE5Lu75oSP5ZCN56ew44CC5L2/55So6ZSu4oCcQ2x1c3RlclByaW9yaXR54oCd5p2l6YWN572u6I+c5Y2V57uE5Zyo5bel5YW35qCP5Lit5pi+56S655qE6aG65bqP44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvbHV0aW9uIHRpbWUnfSA9ICfop6PlhrPml7bpl7QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJhbnNwb3J0IHNlbGVjdGlvbiBmb3IgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAn5Z+65LqO5p+Q5Lqb5bel5Y2V5pe26Ze05re75Yqg5oiW5pu05paw6Ieq5Yqo5pel5Y6G6aKE57qm55qE6Kem5Y+R5Zmo44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSB0aW1lJ30gPSAn5pu05paw5pe26Ze0JzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXc7CgojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6Ok1pZ3JhdGlvbnM6Ok9UUlM2OjpUaW1lWm9uZU9mZnNldCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBzZXQgZGVidWcKICAgICRTZWxmLT57RGVidWd9ID0gMDsKCiAgICAkU2VsZi0+e1ZpZXd9ID0gJ0FnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldyc7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgZmlsdGVycyBzdG9yZWQgaW4gdGhlIHVzZXIgcHJlZmVyZW5jZXMKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgbXkgJExhc3RGaWx0ZXJLZXkgPSAnVXNlckxhc3RGaWx0ZXItJyAuICRTZWxmLT57Vmlld307CiAgICBteSAkTGFzdEZpbHRlciA9ICRQcmVmZXJlbmNlc3skTGFzdEZpbHRlcktleX0gfHwgJ1dlZWsnOwoKICAgIG15ICVGaWx0ZXJzID0gKAogICAgICAgIE1vbnRoID0+IHsKICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ01vbnRoJyksCiAgICAgICAgICAgIFByaW8gPT4gMTAwLAogICAgICAgIH0sCiAgICAgICAgV2VlayA9PiB7CiAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdXZWVrJyksCiAgICAgICAgICAgIFByaW8gPT4gMjAwLAogICAgICAgIH0sCiAgICAgICAgRGF5ID0+IHsKICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ0RheScpLAogICAgICAgICAgICBQcmlvID0+IDMwMCwKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBjdXJyZW50IGZpbHRlcgogICAgJFBhcmFte0ZpbHRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRmlsdGVyJyApIHx8ICRMYXN0RmlsdGVyOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBpZiBmaWx0ZXIgaXMgdmFsaWQKICAgIGlmICggISRGaWx0ZXJzeyAkUGFyYW17RmlsdGVyfSB9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnSW52YWxpZCBGaWx0ZXI6ICVzIScsICRQYXJhbXtGaWx0ZXJ9ICksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHByZXBhcmUgZmlsdGVycwogICAgbXkgJU5hdkJhckZpbHRlcjsKICAgIGZvciBteSAkRmlsdGVyQ29sdW1uICggc29ydCBrZXlzICVGaWx0ZXJzICkgewogICAgICAgICROYXZCYXJGaWx0ZXJ7ICRGaWx0ZXJzeyRGaWx0ZXJDb2x1bW59LT57UHJpb30gfSA9IHsKICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXJDb2x1bW4sCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJDb2x1bW59IH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGdldCBjYWxlbmRhciBoZWxwZXIgb2JqZWN0CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICMgY3VycmVudCB0aW1lIGluIHRoZSB2aWV3CiAgICAkUGFyYW17U3RhcnR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N0YXJ0JyApCiAgICAgICAgfHwgJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50VGltZXN0YW1wR2V0KCk7CgogICAgIyBoYW5kbGUganVtcAogICAgJFBhcmFte0p1bXB9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0p1bXAnICkgfHwgJyc7CiAgICBpZiAoICRQYXJhbXtKdW1wfSApIHsKICAgICAgICBteSAkSnVtcE9mZnNldCA9IDA7CiAgICAgICAgaWYgKCAkUGFyYW17RmlsdGVyfSBlcSAnV2VlaycgKSB7CiAgICAgICAgICAgICRKdW1wT2Zmc2V0ID0gNjAgKiA2MCAqIDI0ICogNzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17RmlsdGVyfSBlcSAnRGF5JyApIHsKICAgICAgICAgICAgJEp1bXBPZmZzZXQgPSA2MCAqIDYwICogMjQ7CiAgICAgICAgfQoKICAgICAgICAjIGNhbGN1bGF0ZSBkZXN0aW5hdGlvbiB0aW1lCiAgICAgICAgbXkgJFN0YXJ0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0fSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRQYXJhbXtGaWx0ZXJ9IGVxICdNb250aCcgKSB7CiAgICAgICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRQYXJhbXtKdW1wfSBlcSAnUHJldicgKSB7CiAgICAgICAgICAgICAgICAkTW9udGggLT0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtKdW1wfSBlcSAnTmV4dCcgKSB7CiAgICAgICAgICAgICAgICAkTW9udGggKz0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRNb250aCA8IDEgKSB7CiAgICAgICAgICAgICAgICAkTW9udGggPSAxMjsKICAgICAgICAgICAgICAgICRZZWFyIC09IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkTW9udGggPiAxMiApIHsKICAgICAgICAgICAgICAgICRNb250aCA9IDE7CiAgICAgICAgICAgICAgICAkWWVhciArPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTdGFydCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZTJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgWWVhciAgPT4gJFllYXIsCiAgICAgICAgICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgICAgICAgICBEYXkgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17SnVtcH0gZXEgJ1ByZXYnICkgewogICAgICAgICAgICAgICAgJFN0YXJ0IC09ICRKdW1wT2Zmc2V0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFBhcmFte0p1bXB9IGVxICdOZXh0JyApIHsKICAgICAgICAgICAgICAgICRTdGFydCArPSAkSnVtcE9mZnNldDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1N0YXJ0fSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydCwKICAgICAgICApOwogICAgfQoKICAgICMgY2FsY3VsYXRlIGRhdGUgYm91bmRhcmllcwogICAgaWYgKCAkUGFyYW17RmlsdGVyfSBlcSAnTW9udGgnICkgewoKICAgICAgICAjIGdldCBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoCiAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydH0sCiAgICAgICAgKTsKICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtTdGFydFRpbWV9ID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkIiwgJFllYXIsICRNb250aCwgMSApIC4gJyAwMDowMDowMCc7CgogICAgICAgICMgZ2V0IGxhc3QgZGF5IG9mIHRoZSBtb250aAogICAgICAgICRNb250aCArPSAxOwogICAgICAgIGlmICggJE1vbnRoID4gMTIgKSB7CiAgICAgICAgICAgICRNb250aCA9IDE7CiAgICAgICAgICAgICRZZWFyICs9IDE7CiAgICAgICAgfQogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFllYXIgID0+ICRZZWFyLAogICAgICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgICAgIERheSAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU3lzdGVtVGltZSAtPSAxOyAgICAjIHN1YnRyYWN0IG9uZSBzZWNvbmQKICAgICAgICAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17RW5kVGltZX0gPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQiLCAkWWVhciwgJE1vbnRoLCAkRGF5ICkgLiAnIDIzOjU5OjU5JzsKCiAgICAgICAgIyBnZXQgdHJhbnNsYXRlZCBuYW1lIG9mIHRoZSBtb250aAogICAgICAgIG15IEBNb250aEFycmF5ID0gKAogICAgICAgICAgICAnJywKICAgICAgICAgICAgJ0phbnVhcnknLAogICAgICAgICAgICAnRmVicnVhcnknLAogICAgICAgICAgICAnTWFyY2gnLAogICAgICAgICAgICAnQXByaWwnLAogICAgICAgICAgICAnTWF5X2xvbmcnLAogICAgICAgICAgICAnSnVuZScsCiAgICAgICAgICAgICdKdWx5JywKICAgICAgICAgICAgJ0F1Z3VzdCcsCiAgICAgICAgICAgICdTZXB0ZW1iZXInLAogICAgICAgICAgICAnT2N0b2JlcicsCiAgICAgICAgICAgICdOb3ZlbWJlcicsCiAgICAgICAgICAgICdEZWNlbWJlcicsCiAgICAgICAgKTsKICAgICAgICBteSAkVHJhbnNsYXRlTW9udGggPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRNb250aEFycmF5WyRNb250aF0gKTsKCiAgICAgICAgJFBhcmFte0hlYWRlclRpdGxlfSA9ICIkVHJhbnNsYXRlTW9udGggJFllYXIiOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17RmlsdGVyfSBlcSAnV2VlaycgKSB7CiAgICAgICAgbXkgJENhbGVuZGFyV2Vla0RheVN0YXJ0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdDYWxlbmRhcldlZWtEYXlTdGFydCcpIHx8IDc7CiAgICAgICAgbXkgJENhbGVuZGFyV2Vla0RheUVuZCA9ICggJENhbGVuZGFyV2Vla0RheVN0YXJ0IC0gMSApIHx8IDc7CgogICAgICAgICMgZ2V0IHN0YXJ0IG9mIHRoZSB3ZWVrCiAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydH0sCiAgICAgICAgKTsKICAgICAgICBteSAoICRXZWVrRGF5LCAkQ1cgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSwKICAgICAgICApOwogICAgICAgIHdoaWxlICggJFdlZWtEYXkgIT0gJENhbGVuZGFyV2Vla0RheVN0YXJ0ICkgewogICAgICAgICAgICAkU3RhcnRUaW1lIC09IDYwICogNjAgKiAyNDsKICAgICAgICAgICAgKCAkV2Vla0RheSwgJENXICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPldlZWtEZXRhaWxzR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U3RhcnRUaW1lfSA9CiAgICAgICAgICAgIHN1YnN0ciggJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSApLCAwLCAxMCApCiAgICAgICAgICAgIC4gJyAwMDowMDowMCc7CgogICAgICAgICMgZ2V0IGVuZCBvZiB0aGUgd2VlawogICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0fSwKICAgICAgICApOwogICAgICAgICggJFdlZWtEYXksICRDVyApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5XZWVrRGV0YWlsc0dldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICApOwogICAgICAgIHdoaWxlICggJFdlZWtEYXkgIT0gJENhbGVuZGFyV2Vla0RheUVuZCApIHsKICAgICAgICAgICAgJEVuZFRpbWUgKz0gNjAgKiA2MCAqIDI0OwogICAgICAgICAgICAoICRXZWVrRGF5LCAkQ1cgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17RW5kVGltZX0gPQogICAgICAgICAgICBzdWJzdHIoICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KCBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lICksIDAsIDEwICkKICAgICAgICAgICAgLiAnIDIzOjU5OjU5JzsKCiAgICAgICAgJFBhcmFte0hlYWRlclRpdGxlfSA9CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoICRQYXJhbXtTdGFydFRpbWV9LCAnRGF0ZUZvcm1hdFNob3J0JyApCiAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgIC4gY2hyKDgyMTEpCiAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZyggJFBhcmFte0VuZFRpbWV9LCAnRGF0ZUZvcm1hdFNob3J0JyApOwogICAgICAgICRQYXJhbXtIZWFkZXJUaXRsZUNXfSA9ICIjJENXIjsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0ZpbHRlcn0gZXEgJ0RheScgKSB7CiAgICAgICAgJFBhcmFte1N0YXJ0VGltZX0gPSBzdWJzdHIoICRQYXJhbXtTdGFydH0sIDAsIDEwICkgLiAnIDAwOjAwOjAwJzsKICAgICAgICAkUGFyYW17RW5kVGltZX0gICA9IHN1YnN0ciggJFBhcmFte1N0YXJ0fSwgMCwgMTAgKSAuICcgMjM6NTk6NTknOwoKICAgICAgICAjIGdldCBzdGFydCBvZiB0aGUgd2VlawogICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnR9LAogICAgICAgICk7CiAgICAgICAgbXkgKCAkV2Vla0RheSwgJENXICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPldlZWtEZXRhaWxzR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte0hlYWRlclRpdGxlfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoICRQYXJhbXtTdGFydFRpbWV9LCAnRGF0ZUZvcm1hdFNob3J0JyApOwogICAgICAgICRQYXJhbXtIZWFkZXJUaXRsZUNXfSA9ICIjJENXIjsKICAgIH0KCiAgICAjIGRpc3BsYXkgZmlsdGVyIGJ1dHRvbnMKICAgIG15IEBOYXZCYXJGaWx0ZXJzOwogICAgZm9yIG15ICRQcmlvICggc29ydCBrZXlzICVOYXZCYXJGaWx0ZXIgKSB7CiAgICAgICAgcHVzaCBATmF2QmFyRmlsdGVycywgJE5hdkJhckZpbHRlcnskUHJpb307CiAgICB9CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhckZpbHRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVGaWx0ZXJzLAogICAgICAgIH0sCiAgICApOwogICAgbXkgJENvdW50ID0gMDsKICAgIGZvciBteSAkRmlsdGVyIChATmF2QmFyRmlsdGVycykgewogICAgICAgICRDb3VudCsrOwogICAgICAgIGlmICggJENvdW50ID09IHNjYWxhciBATmF2QmFyRmlsdGVycyApIHsKICAgICAgICAgICAgJEZpbHRlci0+e0NTU30gPSAnTGFzdCc7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhckZpbHRlckl0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICV7JEZpbHRlcn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICRGaWx0ZXItPntGaWx0ZXJ9IGVxICRQYXJhbXtGaWx0ZXJ9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAleyRGaWx0ZXJ9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWROb3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICV7JEZpbHRlcn0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjYWxlbmRhciBvYmplY3QKICAgIG15ICRDYWxlbmRhck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwoKICAgICMgZ2V0IGFsbCB1c2VyJ3MgdmFsaWQgY2FsZW5kYXJzCiAgICBteSAkVmFsaWRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCgKICAgICAgICBWYWxpZCA9PiAndmFsaWQnLAogICAgKTsKICAgIG15IEBDYWxlbmRhcnMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyTGlzdCgKICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBWYWxpZElEID0+ICRWYWxpZElELAogICAgKTsKCiAgICAjIGNoZWNrIGlmIHdlIGZvdW5kIHNvbWUKICAgIGlmIChAQ2FsZW5kYXJzKSB7CgogICAgICAgIGZvciBteSAkQ2FsZW5kYXIgKEBDYWxlbmRhcnMpIHsKICAgICAgICAgICAgJFBhcmFte0NhbGVuZGFyRGF0YX0tPnsgJENhbGVuZGFyLT57Q2FsZW5kYXJJRH0gfSA9IHsKICAgICAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAkQ2FsZW5kYXItPntDYWxlbmRhck5hbWV9LAogICAgICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICRDYWxlbmRhci0+e0NvbG9yfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcHBvaW50bWVudENyZWF0ZUJ1dHRvbicsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXBwb2ludG1lbnQgb2JqZWN0CiAgICAgICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKICAgICAgICBteSBAVmlld2FibGVBcHBvaW50bWVudHM7CiAgICAgICAgZm9yIG15ICRDYWxlbmRhciAoQENhbGVuZGFycykgewogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhci0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBWaWV3YWJsZUFwcG9pbnRtZW50cywgQEFwcG9pbnRtZW50czsKICAgICAgICB9CgogICAgICAgIGlmIChAVmlld2FibGVBcHBvaW50bWVudHMpIHsKCiAgICAgICAgICAgICMgc29ydCBieSBzdGFydCBkYXRlCiAgICAgICAgICAgIEBWaWV3YWJsZUFwcG9pbnRtZW50cyA9IHNvcnQgeyAkYS0+e1N0YXJ0VGltZX0gY21wICRiLT57U3RhcnRUaW1lfSB9IEBWaWV3YWJsZUFwcG9pbnRtZW50czsKCiAgICAgICAgICAgIG15ICRMYXN0RGF5ID0gJyc7CiAgICAgICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBWaWV3YWJsZUFwcG9pbnRtZW50cykgewoKICAgICAgICAgICAgICAgICMgc2F2ZSB0aW1lIHN0YW1wcyBmb3IgZGlzcGxheSBiZWZvcmUgY2FsY3VsYXRpb24KICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1N0YXJ0RGF0ZX0gPSAkQXBwb2ludG1lbnQtPntTdGFydFRpbWV9OwogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57RW5kRGF0ZX0gICA9ICRBcHBvaW50bWVudC0+e0VuZFRpbWV9OwoKICAgICAgICAgICAgICAgICMgZW5kIHRpbWVzIGZvciBhbGwgZGF5IGFwcG9pbnRtZW50cyBhcmUgaW5jbHVzaXZlLCBzdWJ0cmFjdCB3aG9sZSBkYXkKICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50LT57QWxsRGF5fSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50LT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkRW5kVGltZSAtPSA4NjQwMDsKICAgICAgICAgICAgICAgICAgICBpZiAoICRFbmRUaW1lIDwgJFN0YXJ0VGltZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVuZFRpbWUgPSAkU3RhcnRUaW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntFbmREYXRlfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBmb3JtYXR0ZWQgZGF0ZS90aW1lIHN0cmluZ3MgdXNlZCBpbiBkaXNwbGF5CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntTdGFydERhdGV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntTdGFydERhdGV9LAogICAgICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JyAuICggJEFwcG9pbnRtZW50LT57QWxsRGF5fSA/ICdTaG9ydCcgOiAnJyApCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57RW5kRGF0ZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e0VuZERhdGV9LAogICAgICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JyAuICggJEFwcG9pbnRtZW50LT57QWxsRGF5fSA/ICdTaG9ydCcgOiAnJyApCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZm9ybWF0dGVkIG5vdGlmaWNhdGlvbiBkYXRlIHVzZWQgaW4gZGlzcGxheQogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57Tm90aWZpY2F0aW9uRGF0ZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e05vdGlmaWNhdGlvbkRhdGV9LAogICAgICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JwogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGN1dCB0aGUgdGltZSBwb3J0aW9uCiAgICAgICAgICAgICAgICAkUGFyYW17U3RhcnREYXl9ID0gc3Vic3RyKCAkQXBwb2ludG1lbnQtPntTdGFydFRpbWV9LCAwLCAxMCApOwoKICAgICAgICAgICAgICAgIGlmICggJExhc3REYXkgbmUgJFBhcmFte1N0YXJ0RGF5fSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXBwb2ludG1lbnRHcm91cCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudERheSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXRTaG9ydCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkTGFzdERheSA/ICcnIDogJ0ZpcnN0JywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkTGFzdERheSA9ICRQYXJhbXtTdGFydERheX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnQtPntBbGxEYXl9ICkgewogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1N0YXJ0VGltZX0gPSAkUGFyYW17U3RhcnREYXRlfTsKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntFbmRUaW1lfSAgID0gJFBhcmFte0VuZERhdGV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FwcG9pbnRtZW50QWN0aW9uUm93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAleyRBcHBvaW50bWVudH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXBwb2ludG1lbnROb0RhdGFSb3cnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDYWxlbmRhcnNOb3RGb3VuZCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0YXJ0IG91dHB1dAogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAjIGdldCBwYWdlIGZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKSBpZiAkU2VsZi0+e1N1YmFjdGlvbn0gbmUgJ0FKQVhGaWx0ZXJVcGRhdGUnOwogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFJpY2hUZXh0ICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0Jyk7CgogICAgaWYgKCAkUmljaFRleHQgJiYgISRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OkFkbWluOjokU2VsZi0+e0FjdGlvbn0iKS0+e1JpY2hUZXh0fSApIHsKICAgICAgICAkUmljaFRleHQgPSAwOwogICAgfQoKICAgICMgc2V0IHR5cGUgZm9yIG5vdGlmaWNhdGlvbnMKICAgIG15ICRDb250ZW50VHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgIGlmICgkUmljaFRleHQpIHsKICAgICAgICAkQ29udGVudFR5cGUgPSAndGV4dC9odG1sJzsKICAgIH0KCiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnKTsKICAgIG15ICRNYWluT2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBnZXQgcmVnaXN0ZXJlZCB0cmFuc3BvcnQgbGF5ZXJzCiAgICBteSAlUmVnaXN0ZXJlZFRyYW5zcG9ydHMgPSAleyAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uOjpUcmFuc3BvcnQnKSB8fCB7fSB9OwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2hhbmdlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlJyApIHsKCiAgICAgICAgIyBnZXQgbm90aWZpY2F0aW9uIGlkCiAgICAgICAgbXkgJElEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApIHx8ICcnOwoKICAgICAgICAjIGdldCBub3RpZmljYXRpb24gZGF0YQogICAgICAgIG15ICVEYXRhID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25HZXQoCiAgICAgICAgICAgIElEID0+ICRJRCwKICAgICAgICApOwoKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgQWN0aW9uICAgPT4gJ0NoYW5nZScsCiAgICAgICAgICAgIFJpY2hUZXh0ID0+ICRSaWNoVGV4dCwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjaGFuZ2UgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICAgICAgcXcoSUQgTmFtZSBDb21tZW50IFZhbGlkSUQgRXZlbnRzIFRyYW5zcG9ydHMpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgUEFSQU1FVEVSOgogICAgICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICAgICAgcXcoUmVjaXBpZW50cyBSZWNpcGllbnRBZ2VudHMgUmVjaXBpZW50R3JvdXBzIFJlY2lwaWVudFJvbGVzCiAgICAgICAgICAgIEV2ZW50cyBDYWxlbmRhcklEIFRlYW1JRCBSZXNvdXJjZUlEIFRpdGxlIExvY2F0aW9uCiAgICAgICAgICAgIFRyYW5zcG9ydHMgT25jZVBlckRheSBTZW5kT25PdXRPZk9mZmljZQogICAgICAgICAgICBWaXNpYmxlRm9yQWdlbnQgVmlzaWJsZUZvckFnZW50VG9vbHRpcCBMYW5ndWFnZUlEIEFnZW50RW5hYmxlZEJ5RGVmYXVsdCkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgQERhdGEgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSIGlmICFARGF0YTsKICAgICAgICAgICAgJEdldFBhcmFte0RhdGF9LT57JFBhcmFtZXRlcn0gPSBcQERhdGE7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgc3ViamVjdCBhbmQgYm9keSBmb3IgYWxsIGxhbmd1YWdlcwogICAgICAgIGZvciBteSAkTGFuZ3VhZ2VJRCAoIEB7ICRHZXRQYXJhbXtEYXRhfS0+e0xhbmd1YWdlSUR9IH0gKSB7CgogICAgICAgICAgICBteSAkU3ViamVjdCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRMYW5ndWFnZUlEIC4gJ19TdWJqZWN0JyApIHx8ICcnOwogICAgICAgICAgICBteSAkQm9keSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRMYW5ndWFnZUlEIC4gJ19Cb2R5JyApICAgIHx8ICcnOwoKICAgICAgICAgICAgJEdldFBhcmFte01lc3NhZ2V9LT57JExhbmd1YWdlSUR9ID0gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgPT4gJFN1YmplY3QsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICA9PiAkQm9keSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRDb250ZW50VHlwZSwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICMgc2V0IHNlcnZlciBlcnJvciBmbGFnIGlmIGZpZWxkIGlzIGVtcHR5CiAgICAgICAgICAgIGlmICggISRTdWJqZWN0ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkTGFuZ3VhZ2VJRCAuICdfU3ViamVjdFNlcnZlckVycm9yJyB9ID0gIlNlcnZlckVycm9yIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkQm9keSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJExhbmd1YWdlSUQgLiAnX0JvZHlTZXJ2ZXJFcnJvcicgfSA9ICJTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHRyYW5zcG9ydCBzZXR0aW5ncyB2YWx1ZXMKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVJlZ2lzdGVyZWRUcmFuc3BvcnRzICkgKSB7CgogICAgICAgICAgICBUUkFOU1BPUlQ6CiAgICAgICAgICAgIGZvciBteSAkVHJhbnNwb3J0ICggc29ydCBrZXlzICVSZWdpc3RlcmVkVHJhbnNwb3J0cyApIHsKCiAgICAgICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fSApOwogICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQgaWYgISRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e01vZHVsZX07CgogICAgICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e01vZHVsZX0sIFNpbGVudCA9PiAxICkgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBnZXQgdHJhbnNwb3J0IHNldHRpbmdzIHN0cmluZyBmcm9tIHRyYW5zcG9ydCBvYmplY3QKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e01vZHVsZX0gKS0+VHJhbnNwb3J0UGFyYW1TZXR0aW5nc0dldCgKICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUKICAgICAgICBteSAkT2s7CiAgICAgICAgbXkgJER1cGxpY2F0ZWRFbnRyeSA9IDA7CgogICAgICAgICRHZXRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblR5cGV9ID0gWydBcHBvaW50bWVudCddOwoKICAgICAgICAjIEdldCBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBub3RpZmljYXRpb25zIGFuZCBjaGVjayBpZiBhIG5vdGlmaWNhdGlvbiB3aXRoIHRoZQogICAgICAgICMgc2FtZSBuYW1lIGFuZCBhbm90aGVyIHR5cGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGRhdGFiYXNlLgogICAgICAgIG15ICVOb3RpZmljYXRpb25MaXN0ID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25MaXN0KAogICAgICAgICAgICBUeXBlICAgID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgICAgIERldGFpbHMgPT4gMSwKICAgICAgICAgICAgQWxsICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIE5PVElGSUNBVElPTklEOgogICAgICAgIGZvciBteSAkTm90aWZpY2F0aW9uSUQgKCBzb3J0IGtleXMgJU5vdGlmaWNhdGlvbkxpc3QgKSB7CgogICAgICAgICAgICBuZXh0IE5PVElGSUNBVElPTklEIGlmICEkTm90aWZpY2F0aW9uSUQ7CiAgICAgICAgICAgIG5leHQgTk9USUZJQ0FUSU9OSUQgaWYgJEdldFBhcmFte05hbWV9IG5lICROb3RpZmljYXRpb25MaXN0eyROb3RpZmljYXRpb25JRH0tPntOYW1lfTsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOYW1lfSBlcSAkTm90aWZpY2F0aW9uTGlzdHskTm90aWZpY2F0aW9uSUR9LT57TmFtZX0KICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtJRH0gbmUgJE5vdGlmaWNhdGlvbklECiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICREdXBsaWNhdGVkRW50cnkgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkRHVwbGljYXRlZEVudHJ5ICkgewogICAgICAgICAgICAkT2sgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvblVwZGF0ZSgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJE9rKSB7CiAgICAgICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoKTsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdOb3RpZmljYXRpb24gdXBkYXRlZCEnKSApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50JywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoTmFtZSBFdmVudHMgVHJhbnNwb3J0cykpIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJE5lZWRlZCAuICJTZXJ2ZXJFcnJvciIgfSA9ICIiOwogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17JE5lZWRlZH0gZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkTmVlZGVkIC4gIlNlcnZlckVycm9yIiB9ID0gIlNlcnZlckVycm9yIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgICAgIGlmICgkRHVwbGljYXRlZEVudHJ5KSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEluZm8gICAgID0+IFRyYW5zbGF0YWJsZSgnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJykKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBQcmlvcml0eSA9PiAnRXJyb3InICk7CiAgICAgICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICdDaGFuZ2UnLAogICAgICAgICAgICAgICAgUmljaFRleHQgPT4gJFJpY2hUZXh0LAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50JywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQWRkJyApIHsKCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uICAgPT4gJ0FkZCcsCiAgICAgICAgICAgIFJpY2hUZXh0ID0+ICRSaWNoVGV4dCwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBhZGQgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQWRkQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICAgICAgcXcoTmFtZSBDb21tZW50IFZhbGlkSUQgRXZlbnRzIFRyYW5zcG9ydHMpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgUEFSQU1FVEVSOgogICAgICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICAgICAgcXcoUmVjaXBpZW50cyBSZWNpcGllbnRBZ2VudHMgUmVjaXBpZW50Um9sZXMgUmVjaXBpZW50R3JvdXBzIEV2ZW50cwogICAgICAgICAgICBDdXN0b21lcklEIEN1c3RvbWVyVXNlcklEIFRyYW5zcG9ydHMgT25jZVBlckRheSBTZW5kT25PdXRPZk9mZmljZQogICAgICAgICAgICBWaXNpYmxlRm9yQWdlbnQgVmlzaWJsZUZvckFnZW50VG9vbHRpcCBMYW5ndWFnZUlEIEFnZW50RW5hYmxlZEJ5RGVmYXVsdCkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgQERhdGEgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSIGlmICFARGF0YTsKICAgICAgICAgICAgJEdldFBhcmFte0RhdGF9LT57JFBhcmFtZXRlcn0gPSBcQERhdGE7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgc3ViamVjdCBhbmQgYm9keSBmb3IgYWxsIGxhbmd1YWdlcwogICAgICAgIGZvciBteSAkTGFuZ3VhZ2VJRCAoIEB7ICRHZXRQYXJhbXtEYXRhfS0+e0xhbmd1YWdlSUR9IH0gKSB7CgogICAgICAgICAgICBteSAkU3ViamVjdCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRMYW5ndWFnZUlEIC4gJ19TdWJqZWN0JyApIHx8ICcnOwogICAgICAgICAgICBteSAkQm9keSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRMYW5ndWFnZUlEIC4gJ19Cb2R5JyApICAgIHx8ICcnOwoKICAgICAgICAgICAgJEdldFBhcmFte01lc3NhZ2V9LT57JExhbmd1YWdlSUR9ID0gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgPT4gJFN1YmplY3QsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICA9PiAkQm9keSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRDb250ZW50VHlwZSwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICMgc2V0IHNlcnZlciBlcnJvciBmbGFnIGlmIGZpZWxkIGlzIGVtcHR5CiAgICAgICAgICAgIGlmICggISRTdWJqZWN0ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkTGFuZ3VhZ2VJRCAuICdfU3ViamVjdFNlcnZlckVycm9yJyB9ID0gIlNlcnZlckVycm9yIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkQm9keSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJExhbmd1YWdlSUQgLiAnX0JvZHlTZXJ2ZXJFcnJvcicgfSA9ICJTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHRyYW5zcG9ydCBzZXR0aW5ncyB2YWx1ZXMKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVJlZ2lzdGVyZWRUcmFuc3BvcnRzICkgKSB7CgogICAgICAgICAgICBUUkFOU1BPUlQ6CiAgICAgICAgICAgIGZvciBteSAkVHJhbnNwb3J0ICggc29ydCBrZXlzICVSZWdpc3RlcmVkVHJhbnNwb3J0cyApIHsKCiAgICAgICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fSApOwogICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQgaWYgISRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e01vZHVsZX07CgogICAgICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e01vZHVsZX0sIFNpbGVudCA9PiAxICkgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBnZXQgdHJhbnNwb3J0IHNldHRpbmdzIHN0cmluZyBmcm9tIHRyYW5zcG9ydCBvYmplY3QKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e01vZHVsZX0gKS0+VHJhbnNwb3J0UGFyYW1TZXR0aW5nc0dldCgKICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQKICAgICAgICBteSAkSUQ7CiAgICAgICAgbXkgJER1cGxpY2F0ZWRFbnRyeSA9IDA7CgogICAgICAgICRHZXRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblR5cGV9ID0gWydBcHBvaW50bWVudCddOwoKICAgICAgICAjIEdldCBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBub3RpZmljYXRpb25zIGFuZCBjaGVjayBpZiBhIG5vdGlmaWNhdGlvbiB3aXRoIHRoZQogICAgICAgICMgc2FtZSBuYW1lIGFuZCBhbm90aGVyIHR5cGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGRhdGFiYXNlLgogICAgICAgIG15ICVOb3RpZmljYXRpb25MaXN0ID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25MaXN0KAogICAgICAgICAgICBUeXBlICAgID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgICAgIERldGFpbHMgPT4gMSwKICAgICAgICAgICAgQWxsICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIE5PVElGSUNBVElPTklEOgogICAgICAgIGZvciBteSAkTm90aWZpY2F0aW9uSUQgKCBzb3J0IGtleXMgJU5vdGlmaWNhdGlvbkxpc3QgKSB7CgogICAgICAgICAgICBuZXh0IE5PVElGSUNBVElPTklEIGlmICEkTm90aWZpY2F0aW9uSUQ7CiAgICAgICAgICAgIG5leHQgTk9USUZJQ0FUSU9OSUQgaWYgJEdldFBhcmFte05hbWV9IG5lICROb3RpZmljYXRpb25MaXN0eyROb3RpZmljYXRpb25JRH0tPntOYW1lfTsKCiAgICAgICAgICAgICREdXBsaWNhdGVkRW50cnkgPSAxOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJER1cGxpY2F0ZWRFbnRyeSApIHsKICAgICAgICAgICAgJElEID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25BZGQoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJEdldFBhcmFte0RhdGF9LT57VHJhbnNwb3J0c30gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtUcmFuc3BvcnRTZXJ2ZXJFcnJvcn0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRJRCkgewogICAgICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KCk7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+IFRyYW5zbGF0YWJsZSgnTm90aWZpY2F0aW9uIGFkZGVkIScpICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZvciBteSAkTmVlZGVkIChxdyhOYW1lIEV2ZW50cyBUcmFuc3BvcnRzKSkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkTmVlZGVkIC4gIlNlcnZlckVycm9yIiB9ID0gIiI7CiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXskTmVlZGVkfSBlcSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICROZWVkZWQgLiAiU2VydmVyRXJyb3IiIH0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAgICAgaWYgKCREdXBsaWNhdGVkRW50cnkpIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gVHJhbnNsYXRhYmxlKCdOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIFByaW9yaXR5ID0+ICdFcnJvcicgKTsKICAgICAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJ0FkZCcsCiAgICAgICAgICAgICAgICBSaWNoVGV4dCA9PiAkUmljaFRleHQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWxldGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWxldGUnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAlR2V0UGFyYW07CiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KElEKSkgewogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICBteSAkRGVsZXRlID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25EZWxldGUoCiAgICAgICAgICAgIElEICAgICA9PiAkR2V0UGFyYW17SUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJERlbGV0ZSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgTm90aWZpY2F0aW9uRXhwb3J0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTm90aWZpY2F0aW9uRXhwb3J0JyApIHsKCiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApIHx8ICcnOwogICAgICAgIG15ICROb3RpZmljYXRpb25EYXRhOwogICAgICAgIG15ICVOb3RpZmljYXRpb25TaW5nbGVEYXRhOwogICAgICAgIG15ICRGaWxlbmFtZSA9ICdFeHBvcnRfTm90aWZpY2F0aW9uLnltbCc7CgogICAgICAgIGlmICgkTm90aWZpY2F0aW9uSUQpIHsKCiAgICAgICAgICAgICVOb3RpZmljYXRpb25TaW5nbGVEYXRhID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25HZXQoCiAgICAgICAgICAgICAgICBJRCAgICAgPT4gJE5vdGlmaWNhdGlvbklELAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCBcJU5vdGlmaWNhdGlvblNpbmdsZURhdGEgKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdUaGVyZSB3YXMgYW4gZXJyb3IgZ2V0dGluZyBkYXRhIGZvciBOb3RpZmljYXRpb24gd2l0aCBJRDolcyEnLCAkTm90aWZpY2F0aW9uSUQgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25OYW1lID0gJE5vdGlmaWNhdGlvblNpbmdsZURhdGF7TmFtZX07CiAgICAgICAgICAgICROb3RpZmljYXRpb25OYW1lID1+IHN7W15hLXpBLVowLTktX119e199eG1zZzsgICAgIyBjbGVhbnVwIG5hbWUgZm9yIHNhdmluZwoKICAgICAgICAgICAgJEZpbGVuYW1lICAgICAgICAgPSAnRXhwb3J0X05vdGlmaWNhdGlvbl8nIC4gJE5vdGlmaWNhdGlvbk5hbWUgLiAnLnltbCc7CiAgICAgICAgICAgICROb3RpZmljYXRpb25EYXRhID0gWyBcJU5vdGlmaWNhdGlvblNpbmdsZURhdGEgXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICBteSAlTm90aWZpY2F0aW9uZGV0YWlscyA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uTGlzdCgKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgRGV0YWlscyA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgQERhdGE7CiAgICAgICAgICAgIGZvciBteSAkSXRlbUlEICggc29ydCBrZXlzICVOb3RpZmljYXRpb25kZXRhaWxzICkgewogICAgICAgICAgICAgICAgcHVzaCBARGF0YSwgJE5vdGlmaWNhdGlvbmRldGFpbHN7JEl0ZW1JRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkRhdGEgPSBcQERhdGE7CiAgICAgICAgfQoKICAgICAgICAjIGNvbnZlcnQgdGhlIE5vdGlmaWNhdGlvbiBkYXRhIGhhc2ggdG8gc3RyaW5nCiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbkRhdGFZQU1MID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OllBTUwnKS0+RHVtcCggRGF0YSA9PiAkTm90aWZpY2F0aW9uRGF0YSApOwoKICAgICAgICAjIHNlbmQgdGhlIHJlc3VsdCB0byB0aGUgYnJvd3NlcgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICROb3RpZmljYXRpb25EYXRhWUFNTCwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIE5vdGlmaWNhdGlvbkNvcHkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdOb3RpZmljYXRpb25Db3B5JyApIHsKCiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApIHx8ICcnOwoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCBOb3RpZmljYXRpb24gZGF0YQogICAgICAgIG15ICVOb3RpZmljYXRpb25EYXRhID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25HZXQoCiAgICAgICAgICAgIElEICAgICA9PiAkTm90aWZpY2F0aW9uSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVOb3RpZmljYXRpb25EYXRhICkgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnVW5rbm93biBOb3RpZmljYXRpb24gJXMhJywgJE5vdGlmaWNhdGlvbklEICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBuZXcgTm90aWZpY2F0aW9uIG5hbWUKICAgICAgICBteSAkTm90aWZpY2F0aW9uTmFtZSA9CiAgICAgICAgICAgICROb3RpZmljYXRpb25EYXRhe05hbWV9CiAgICAgICAgICAgIC4gJyAoJwogICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ29weScpCiAgICAgICAgICAgIC4gJyknOwoKICAgICAgICAjIG90aGVyd2lzZSBzYXZlIGNvbmZpZ3VyYXRpb24gYW5kIHJldHVybiB0byBvdmVydmlldyBzY3JlZW4KICAgICAgICBteSAkTmV3Tm90aWZpY2F0aW9uSUQgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkFkZCgKICAgICAgICAgICAgJU5vdGlmaWNhdGlvbkRhdGEsCiAgICAgICAgICAgIE5hbWUgICA9PiAkTm90aWZpY2F0aW9uTmFtZSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgZXJyb3IgaWYgY2FuJ3QgY3JlYXRlCiAgICAgICAgaWYgKCAhJE5ld05vdGlmaWNhdGlvbklEICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgiVGhlcmUgd2FzIGFuIGVycm9yIGNyZWF0aW5nIHRoZSBOb3RpZmljYXRpb24iKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcmV0dXJuIHRvIG92ZXJ2aWV3CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIE5vdGlmaWNhdGlvbkltcG9ydAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ05vdGlmaWNhdGlvbkltcG9ydCcgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICRGb3JtSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApIHx8ICcnOwogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSAgPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICAgICBTb3VyY2UgPT4gJ3N0cmluZycsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJE92ZXJ3cml0ZUV4aXN0aW5nTm90aWZpY2F0aW9ucyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPdmVyd3JpdGVFeGlzdGluZ05vdGlmaWNhdGlvbnMnICkgfHwgJyc7CgogICAgICAgIG15ICROb3RpZmljYXRpb25JbXBvcnQgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkltcG9ydCgKICAgICAgICAgICAgQ29udGVudCAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVcGxvYWRTdHVmZntDb250ZW50fSwKICAgICAgICAgICAgT3ZlcndyaXRlRXhpc3RpbmdOb3RpZmljYXRpb25zID0+ICRPdmVyd3JpdGVFeGlzdGluZ05vdGlmaWNhdGlvbnMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJE5vdGlmaWNhdGlvbkltcG9ydC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICBteSAkTWVzc2FnZSA9ICROb3RpZmljYXRpb25JbXBvcnQtPntNZXNzYWdlfQogICAgICAgICAgICAgICAgfHwgVHJhbnNsYXRhYmxlKAogICAgICAgICAgICAgICAgJ05vdGlmaWNhdGlvbnMgY291bGQgbm90IGJlIEltcG9ydGVkIGR1ZSB0byBhIHVua25vd24gZXJyb3IsIHBsZWFzZSBjaGVjayBPVFJTIGxvZ3MgZm9yIG1vcmUgaW5mb3JtYXRpb24nCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkTm90aWZpY2F0aW9uSW1wb3J0LT57QWRkZWROb3RpZmljYXRpb25zfSApIHsKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17Tm90aWZ5RGF0YX0gfSwgewogICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgTm90aWZpY2F0aW9ucyBoYXZlIGJlZW4gYWRkZWQgc3VjY2Vzc2Z1bGx5OiAlcycsCiAgICAgICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkltcG9ydC0+e0FkZGVkTm90aWZpY2F0aW9uc30KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICggJE5vdGlmaWNhdGlvbkltcG9ydC0+e1VwZGF0ZWROb3RpZmljYXRpb25zfSApIHsKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17Tm90aWZ5RGF0YX0gfSwgewogICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgTm90aWZpY2F0aW9ucyBoYXZlIGJlZW4gdXBkYXRlZCBzdWNjZXNzZnVsbHk6ICVzJywKICAgICAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uSW1wb3J0LT57VXBkYXRlZE5vdGlmaWNhdGlvbnN9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBpZiAoICROb3RpZmljYXRpb25JbXBvcnQtPntOb3RpZmljYXRpb25FcnJvcnN9ICkgewogICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtOb3RpZnlEYXRhfSB9LCB7CiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdUaGVyZSB3aGVyZSBlcnJvcnMgYWRkaW5nL3VwZGF0aW5nIHRoZSBmb2xsb3dpbmcgTm90aWZpY2F0aW9uczogJXMuIFBsZWFzZSBjaGVjayB0aGUgbG9nIGZpbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywKICAgICAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uSW1wb3J0LT57Tm90aWZpY2F0aW9uRXJyb3JzfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoKTsKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc2hvdyBub3RpZmljYXRpb25zIGlmIGFueQogICAgICAgIGlmICggJFBhcmFte05vdGlmeURhdGF9ICkgewogICAgICAgICAgICBmb3IgbXkgJE5vdGlmaWNhdGlvbiAoIEB7ICRQYXJhbXtOb3RpZnlEYXRhfSB9ICkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgJXskTm90aWZpY2F0aW9ufSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoKTsKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCn0KCnN1YiBfRWRpdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CgogICAgJFBhcmFte1JlY2lwaWVudHNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBBcHBvaW50bWVudEFnZW50cyA9PiBUcmFuc2xhdGFibGUoJ0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnKSwKICAgICAgICAgICAgQXBwb2ludG1lbnRBZ2VudFJlYWRQZXJtaXNzaW9ucyA9PgogICAgICAgICAgICAgICAgVHJhbnNsYXRhYmxlKCdBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJyksCiAgICAgICAgICAgIEFwcG9pbnRtZW50QWdlbnRXcml0ZVBlcm1pc3Npb25zID0+CiAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGUoJ0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKScpLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnUmVjaXBpZW50cycsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gOCwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtEYXRhfS0+e1JlY2lwaWVudHN9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBXNzVwYycsCiAgICApOwoKICAgIG15ICVBbGxBZ2VudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CiAgICAkUGFyYW17UmVjaXBpZW50QWdlbnRzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlQWxsQWdlbnRzLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1JlY2lwaWVudEFnZW50cycsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gNCwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtEYXRhfS0+e1JlY2lwaWVudEFnZW50c30sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplIFc3NXBjJywKICAgICk7CgogICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgJFBhcmFte1JlY2lwaWVudEdyb3Vwc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiB7ICRHcm91cE9iamVjdC0+R3JvdXBMaXN0KCBWYWxpZCA9PiAxICkgfSwKICAgICAgICBTaXplICAgICAgID0+IDYsCiAgICAgICAgTmFtZSAgICAgICA9PiAnUmVjaXBpZW50R3JvdXBzJywKICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17RGF0YX0tPntSZWNpcGllbnRHcm91cHN9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBXNzVwYycsCiAgICApOwogICAgJFBhcmFte1JlY2lwaWVudFJvbGVzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IHsgJEdyb3VwT2JqZWN0LT5Sb2xlTGlzdCggVmFsaWQgPT4gMSApIH0sCiAgICAgICAgU2l6ZSAgICAgICA9PiA2LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1JlY2lwaWVudFJvbGVzJywKICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17RGF0YX0tPntSZWNpcGllbnRSb2xlc30sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplIFc3NXBjJywKICAgICk7CgogICAgIyBTZXQgY2xhc3MgbmFtZSBmb3IgZXZlbnQgc3RyaW5nLi4uCiAgICBteSAkRXZlbnRDbGFzcyA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICBpZiAoICRQYXJhbXtFdmVudHNTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgJEV2ZW50Q2xhc3MgLj0gJyAnIC4gJFBhcmFte0V2ZW50c1NlcnZlckVycm9yfTsKICAgIH0KCiAgICBteSAkTm90aWZpY2F0aW9uQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6QWRtaW46OkFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiByZWdpc3RlcmVkIGV2ZW50cwogICAgbXkgJVJlZ2lzdGVyZWRFdmVudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RXZlbnQnKS0+RXZlbnRMaXN0KAogICAgICAgIE9iamVjdFR5cGVzID0+ICROb3RpZmljYXRpb25Db25maWctPntFdmVudE9iamVjdFR5cGVzfSwKICAgICk7CgogICAgbXkgQEV2ZW50czsKICAgIGZvciBteSAkT2JqZWN0VHlwZSAoIHNvcnQga2V5cyAlUmVnaXN0ZXJlZEV2ZW50cyApIHsKICAgICAgICBwdXNoIEBFdmVudHMsIEB7ICRSZWdpc3RlcmVkRXZlbnRzeyRPYmplY3RUeXBlfSB8fCBbXSB9OwogICAgfQoKICAgICMgU3VwcHJlc3MgdGhlc2UgZXZlbnRzIGJlY2F1c2Ugb2YgZGFuZ2VyIG9mIGVuZGxlc3MgbG9vcHMuCiAgICBteSAlRXZlbnRCbGFja2xpc3QgPSAoCiAgICAgICAgQXJ0aWNsZUFnZW50Tm90aWZpY2F0aW9uICAgID0+IDEsCiAgICAgICAgQXJ0aWNsZUN1c3RvbWVyTm90aWZpY2F0aW9uID0+IDEsCiAgICApOwoKICAgIEBFdmVudHMgPSBncmVwIHsgISRFdmVudEJsYWNrbGlzdHskX30gfSBARXZlbnRzOwoKICAgICMgQnVpbGQgdGhlIGxpc3QuLi4KICAgICRQYXJhbXtFdmVudHNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gXEBFdmVudHMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnRXZlbnRzJywKICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgU2l6ZSAgICAgICA9PiAxMCwKICAgICAgICBDbGFzcyAgICAgID0+ICRFdmVudENsYXNzIC4gJyBNb2Rlcm5pemUgVzc1cGMnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0RhdGF9LT57RXZlbnRzfSwKICAgICk7CgogICAgbXkgJENhbGVuZGFyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgogICAgbXkgQENhbGVuZGFyTGlzdCA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJMaXN0KAogICAgICAgIFVzZXJJRCAgICAgPT4gNCwKICAgICAgICBQZXJtaXNzaW9uID0+ICdybycsCiAgICAgICAgVmFsaWRJRCAgICA9PiAwLAogICAgKTsKCiAgICBteSAlQ2FsZW5kYXJMaXN0OwoKICAgIENBTEVOREFSOgogICAgZm9yIG15ICRDYWxlbmRhciAoQENhbGVuZGFyTGlzdCkgewoKICAgICAgICBuZXh0IENBTEVOREFSIGlmICEkQ2FsZW5kYXI7CiAgICAgICAgbmV4dCBDQUxFTkRBUiBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJENhbGVuZGFyKTsKCiAgICAgICAgJENhbGVuZGFyTGlzdHsgJENhbGVuZGFyLT57Q2FsZW5kYXJJRH0gfSA9ICRDYWxlbmRhci0+e0NhbGVuZGFyTmFtZX07CiAgICB9CgogICAgJFBhcmFte0NhbGVuZGFyU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlQ2FsZW5kYXJMaXN0LAogICAgICAgIE5hbWUgICAgICAgPT4gJ0NhbGVuZGFySUQnLAogICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICBTaXplICAgICAgID0+IDUsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17RGF0YX0tPntDYWxlbmRhcklEfSwKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgVzc1cGMnLAogICAgKTsKCiAgICAkUGFyYW17UmVzb3VyY2VTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gXCVBbGxBZ2VudHMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnUmVzb3VyY2VJRCcsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gNSwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtEYXRhfS0+e1Jlc291cmNlSUR9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBXNzVwYycsCiAgICApOwoKICAgICRQYXJhbXtUaXRsZX0gICAgPSAkUGFyYW17RGF0YX0tPntUaXRsZX0tPlswXSAgICB8fCAnJzsKICAgICRQYXJhbXtMb2NhdGlvbn0gPSAkUGFyYW17RGF0YX0tPntMb2NhdGlvbn0tPlswXSB8fCAnJzsKCiAgICAjIGdldCB2YWxpZCBsaXN0CiAgICBteSAlVmFsaWRMaXN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwoKICAgICRQYXJhbXtWYWxpZE9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlVmFsaWRMaXN0LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1ZhbGlkSUR9IHx8ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgVzUwcGMnLAogICAgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3VXBkYXRlJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgdHJ5IHRvIGxvYWQgdGhlIHRlYW0gYmFja2VuZAogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKCiAgICAgICAgIyBpbnN0YW5jaWF0ZSBhIG5ldyB0ZWFtIG9iamVjdAogICAgICAgIG15ICRUZWFtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtLT5uZXcoKTsKCiAgICAgICAgIyBnZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSAocmVhZGFibGUpIHRlYW1zCiAgICAgICAgbXkgJVRlYW1MaXN0ID0gJFRlYW1PYmplY3QtPlRlYW1MaXN0KAogICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVRlYW1MaXN0ICkgKSB7CgogICAgICAgICAgICAjIGJ1aWxkIHRlYW0gc2VsZWN0aW9uCiAgICAgICAgICAgIG15ICRUZWFtU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVRlYW1MaXN0LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnVGVhbUlEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0RhdGF9LT57VGVhbUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBXNzVwYycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFjdGl2YXRlIHRoZSB0ZWFtIHNlY3Rpb24KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1VwZGF0ZVRlYW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGVhbVN0cmcgPT4gJFRlYW1TdHJnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93cyBoZWFkZXIKICAgIGlmICggJFBhcmFte0FjdGlvbn0gZXEgJ0NoYW5nZScgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0hlYWRlckVkaXQnICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnSGVhZGVyQWRkJyApOwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKCiAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OkFkbWluOjokU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJENvbmZpZy0+e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGxhbmd1YWdlIGlkcyBmcm9tIG1lc3NhZ2UgcGFyYW1ldGVyLCB1c2UgRW5nbGlzaCBpZiBubyBtZXNzYWdlIGlzIGdpdmVuCiAgICAjIG1ha2Ugc3VyZSBFbmdsaXNoIGlzIHRoZSBmaXJzdCBsYW5ndWFnZQogICAgbXkgQExhbmd1YWdlSURzOwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte01lc3NhZ2V9ICkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17TWVzc2FnZX0tPntlbn0gKSB7CiAgICAgICAgICAgIHB1c2ggQExhbmd1YWdlSURzLCAnZW4nOwogICAgICAgIH0KICAgICAgICBMQU5HVUFHRUlEOgogICAgICAgIGZvciBteSAkTGFuZ3VhZ2VJRCAoIHNvcnQga2V5cyAleyAkUGFyYW17TWVzc2FnZX0gfSApIHsKICAgICAgICAgICAgbmV4dCBMQU5HVUFHRUlEIGlmICRMYW5ndWFnZUlEIGVxICdlbic7CiAgICAgICAgICAgIHB1c2ggQExhbmd1YWdlSURzLCAkTGFuZ3VhZ2VJRDsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBATGFuZ3VhZ2VJRHMgPSAoJ2VuJyk7CiAgICB9CgogICAgIyBnZXQgbmFtZXMgb2YgbGFuZ3VhZ2VzIGluIEVuZ2xpc2gKICAgIG15ICVEZWZhdWx0VXNlZExhbmd1YWdlcyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnRGVmYXVsdFVzZWRMYW5ndWFnZXMnKSB8fCB7fSB9OwoKICAgICMgZ2V0IG5hdGl2ZSBuYW1lcyBvZiBsYW5ndWFnZXMKICAgIG15ICVEZWZhdWx0VXNlZExhbmd1YWdlc05hdGl2ZSA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnRGVmYXVsdFVzZWRMYW5ndWFnZXNOYXRpdmUnKSB8fCB7fSB9OwoKICAgIG15ICVMYW5ndWFnZXM7CiAgICBMQU5HVUFHRUlEOgogICAgZm9yIG15ICRMYW5ndWFnZUlEICggc29ydCBrZXlzICVEZWZhdWx0VXNlZExhbmd1YWdlcyApIHsKCiAgICAgICAgIyBuZXh0IGxhbmd1YWdlIGlmIHRoZXJlIGlzIG5vdCBzZXQgYW55IG5hbWUgZm9yIGN1cnJlbnQgbGFuZ3VhZ2UKICAgICAgICBpZiAoICEkRGVmYXVsdFVzZWRMYW5ndWFnZXN7JExhbmd1YWdlSUR9ICYmICEkRGVmYXVsdFVzZWRMYW5ndWFnZXNOYXRpdmV7JExhbmd1YWdlSUR9ICkgewogICAgICAgICAgICBuZXh0IExBTkdVQUdFSUQ7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0ZXh0cyBpbiBuYXRpdmUgYW5kIGRlZmF1bHQgbGFuZ3VhZ2UKICAgICAgICBteSAkVGV4dCAgICAgICAgPSAkRGVmYXVsdFVzZWRMYW5ndWFnZXNOYXRpdmV7JExhbmd1YWdlSUR9IHx8ICcnOwogICAgICAgIG15ICRUZXh0RW5nbGlzaCA9ICREZWZhdWx0VXNlZExhbmd1YWdlc3skTGFuZ3VhZ2VJRH0gICAgICAgfHwgJyc7CgogICAgICAgICMgdHJhbnNsYXRlIHRvIGN1cnJlbnQgdXNlcidzIGxhbmd1YWdlCiAgICAgICAgbXkgJFRleHRUcmFuc2xhdGVkID0KICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJFRleHRFbmdsaXNoKTsKCiAgICAgICAgaWYgKCAkVGV4dFRyYW5zbGF0ZWQgJiYgJFRleHRUcmFuc2xhdGVkIG5lICRUZXh0ICkgewogICAgICAgICAgICAkVGV4dCAuPSAnIC0gJyAuICRUZXh0VHJhbnNsYXRlZDsKICAgICAgICB9CgogICAgICAgICMgbmV4dCBsYW5ndWFnZSBpZiB0aGVyZSBpcyBub3Qgc2V0IEVuZ2xpc2ggbm9yIG5hdGl2ZSBuYW1lIG9mIGxhbmd1YWdlLgogICAgICAgIG5leHQgTEFOR1VBR0VJRCBpZiAhJFRleHQ7CgogICAgICAgICRMYW5ndWFnZXN7JExhbmd1YWdlSUR9ID0gJFRleHQ7CiAgICB9CgogICAgIyBjb3B5IG9yaWdpbmFsIGxpc3Qgb2YgbGFuZ3VhZ2VzIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgcmVidWlsZGluZyBsYW5ndWFnZSBzZWxlY3Rpb24KICAgIG15ICVPcmlnaW5hbERlZmF1bHRVc2VkTGFuZ3VhZ2VzID0gJUxhbmd1YWdlczsKCiAgICBteSAkSFRNTFV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpOwoKICAgIGZvciBteSAkTGFuZ3VhZ2VJRCAoQExhbmd1YWdlSURzKSB7CgogICAgICAgICMgZm9ybWF0IHRoZSBjb250ZW50IGFjY29yZGluZyB0byB0aGUgY29udGVudCB0eXBlCiAgICAgICAgaWYgKCAkUGFyYW17UmljaFRleHR9ICkgewoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQgKGlmIGJvZHkgaXMgYmFzZWQgb24gY29uZmlnKQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkUGFyYW17TWVzc2FnZX0tPnskTGFuZ3VhZ2VJRH0tPntDb250ZW50VHlwZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfS0+e0NvbnRlbnRUeXBlfSA9fiBte3RleHRcL3BsYWlufXhtc2kKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFBhcmFte01lc3NhZ2V9LT57JExhbmd1YWdlSUR9LT57Qm9keX0gPSAkSFRNTFV0aWxzT2JqZWN0LT5Ub0hUTUwoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfS0+e0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgcmVmb3JtYXQgZnJvbSBIVE1MIHRvIHBsYWluCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfS0+e0NvbnRlbnRUeXBlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte01lc3NhZ2V9LT57JExhbmd1YWdlSUR9LT57Q29udGVudFR5cGV9ID1+IG17dGV4dFwvaHRtbH14bXNpCiAgICAgICAgICAgICAgICAmJiAkUGFyYW17TWVzc2FnZX0tPnskTGFuZ3VhZ2VJRH0tPntCb2R5fQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUGFyYW17TWVzc2FnZX0tPnskTGFuZ3VhZ2VJRH0tPntCb2R5fSA9ICRIVE1MVXRpbHNPYmplY3QtPlRvQXNjaWkoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfS0+e0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRoZSBub3RpZmljYXRpb24gZm9yIHRoaXMgbGFuZ3VhZ2UKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm90aWZpY2F0aW9uTGFuZ3VhZ2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gJFBhcmFte01lc3NhZ2V9LT57JExhbmd1YWdlSUR9LT57U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICAgICBCb2R5ICAgID0+ICRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfS0+e0JvZHl9ICAgIHx8ICcnLAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VJRCAgICAgICAgID0+ICRMYW5ndWFnZUlELAogICAgICAgICAgICAgICAgTGFuZ3VhZ2UgICAgICAgICAgID0+ICRMYW5ndWFnZXN7JExhbmd1YWdlSUR9LAogICAgICAgICAgICAgICAgU3ViamVjdFNlcnZlckVycm9yID0+ICRQYXJhbXsgJExhbmd1YWdlSUQgLiAnX1N1YmplY3RTZXJ2ZXJFcnJvcicgfSB8fCAnJywKICAgICAgICAgICAgICAgIEJvZHlTZXJ2ZXJFcnJvciAgICA9PiAkUGFyYW17ICRMYW5ndWFnZUlEIC4gJ19Cb2R5U2VydmVyRXJyb3InIH0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IHRoZSBidXR0b24gdG8gcmVtb3ZlIGEgbm90aWZpY2F0aW9uIG9ubHkgaWYgaXQgaXMgbm90IHRoZSBFbmdsaXNoIG5vdGlmaWNhdGlvbgogICAgICAgIGlmICggJExhbmd1YWdlSUQgbmUgJ2VuJyApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdOb3RpZmljYXRpb25MYW5ndWFnZVJlbW92ZUJ1dHRvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgTGFuZ3VhZ2VJRCA9PiAkTGFuZ3VhZ2VJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBsYW5ndWFnZSBmcm9tIGRyb3AtZG93biBsaXN0IGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBzaG93bgogICAgICAgIGRlbGV0ZSAkTGFuZ3VhZ2VzeyRMYW5ndWFnZUlEfTsKICAgIH0KCiAgICAkUGFyYW17TGFuZ3VhZ2VTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcJUxhbmd1YWdlcywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ0xhbmd1YWdlJywKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBXNTBwYyBMYW5ndWFnZUFkZCcsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgSFRNTFF1b3RlICAgID0+IDAsCiAgICApOwogICAgJFBhcmFte0xhbmd1YWdlT3JpZ1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlT3JpZ2luYWxEZWZhdWx0VXNlZExhbmd1YWdlcywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ0xhbmd1YWdlT3JpZycsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgSFRNTFF1b3RlICAgID0+IDAsCiAgICApOwoKICAgICMgdGFrZSBvdmVyIGRhdGEgZmllbGRzCiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgcXcoVmlzaWJsZUZvckFnZW50IFZpc2libGVGb3JBZ2VudFRvb2x0aXAgQ3VzdG9tZXJJRCBDdXN0b21lclVzZXJJRCkKICAgICAgICApCiAgICB7CiAgICAgICAgbmV4dCBLRVkgaWYgISRQYXJhbXtEYXRhfS0+eyRLZXl9OwogICAgICAgIG5leHQgS0VZIGlmICFkZWZpbmVkICRQYXJhbXtEYXRhfS0+eyRLZXl9LT5bMF07CiAgICAgICAgJFBhcmFteyRLZXl9ID0gJFBhcmFte0RhdGF9LT57JEtleX0tPlswXTsKICAgIH0KCiAgICAjIHNldCBzZW5kIG9uIG91dCBvZiBvZmZpY2UgY2hlY2tlZCB2YWx1ZQogICAgJFBhcmFte1NlbmRPbk91dE9mT2ZmaWNlQ2hlY2tlZH0gPSAoICRQYXJhbXtEYXRhfS0+e1NlbmRPbk91dE9mT2ZmaWNlfSA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApOwoKICAgICMgc2V0IG9uY2UgcGVyIGRheSBjaGVja2VkIHZhbHVlCiAgICAkUGFyYW17T25jZVBlckRheUNoZWNrZWR9ID0gKCAkUGFyYW17RGF0YX0tPntPbmNlUGVyRGF5fSA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApOwoKICAgICRQYXJhbXtWaXNpYmxlRm9yQWdlbnRTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAwID0+IFRyYW5zbGF0YWJsZSgnTm8nKSwKICAgICAgICAgICAgMSA9PiBUcmFuc2xhdGFibGUoJ1llcycpLAogICAgICAgICAgICAyID0+IFRyYW5zbGF0YWJsZSgnWWVzLCBidXQgcmVxdWlyZSBhdCBsZWFzdCBvbmUgYWN0aXZlIG5vdGlmaWNhdGlvbiBtZXRob2QnKSwKICAgICAgICB9LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1Zpc2libGVGb3JBZ2VudCcsCiAgICAgICAgU29ydCAgICAgICA9PiAnTnVtZXJpY0tleScsCiAgICAgICAgU2l6ZSAgICAgICA9PiAxLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1Zpc2libGVGb3JBZ2VudH0sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplIFc1MHBjJywKICAgICk7CgogICAgIyBpbmNsdWRlIHJlYWQtb25seSBhdHRyaWJ1dGUKICAgIGlmICggISRQYXJhbXtWaXNpYmxlRm9yQWdlbnR9ICkgewogICAgICAgICRQYXJhbXtWaXNpYmxlRm9yQWdlbnRUb29sdGlwUmVhZG9ubHl9ID0gJ3JlYWRvbmx5PSJyZWFkb25seSInOwogICAgfQoKICAgICMgZ2V0IHJlZ2lzdGVyZWQgdHJhbnNwb3J0IGxheWVycwogICAgbXkgJVJlZ2lzdGVyZWRUcmFuc3BvcnRzID0gJXsgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdBcHBvaW50bWVudE5vdGlmaWNhdGlvbjo6VHJhbnNwb3J0JykgfHwge30gfTsKCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVJlZ2lzdGVyZWRUcmFuc3BvcnRzICkgKSB7CgogICAgICAgIG15ICRNYWluT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwogICAgICAgIG15ICRPVFJTQnVzaW5lc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6T1RSU0J1c2luZXNzJyk7CgogICAgICAgIFRSQU5TUE9SVDoKICAgICAgICBmb3IgbXkgJFRyYW5zcG9ydCAoCiAgICAgICAgICAgIHNvcnQgeyAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JGF9LT57UHJpb30gPD0+ICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skYn0tPntQcmlvfSB9CiAgICAgICAgICAgIGtleXMgJVJlZ2lzdGVyZWRUcmFuc3BvcnRzCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fSApOwogICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhJFJlZ2lzdGVyZWRUcmFuc3BvcnRzeyRUcmFuc3BvcnR9LT57TW9kdWxlfTsKCiAgICAgICAgICAgICMgdHJhbnNwb3J0CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJhbnNwb3J0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydCAgICAgPT4gJFRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnROYW1lID0+ICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e05hbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9LCBTaWxlbnQgPT4gMSApICkgewoKICAgICAgICAgICAgICAgICMgYmFja2VuZCBmb3IgdGhpcyB0cmFuc3BvcnQgaXMgbm90IGF2YWlsYWJsZQogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJhbnNwb3J0Um93RGlzYWJsZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnQgICAgID0+ICRUcmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydE5hbWUgPT4gJFJlZ2lzdGVyZWRUcmFuc3BvcnRzeyRUcmFuc3BvcnR9LT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBpZiBub3Qgc3RhbmRhcmQgdHJhbnNwb3J0CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntJc09UUlNCdXNpbmVzc1RyYW5zcG9ydH0KICAgICAgICAgICAgICAgICAgICAmJiAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntJc09UUlNCdXNpbmVzc1RyYW5zcG9ydH0gZXEgJzEnCiAgICAgICAgICAgICAgICAgICAgJiYgISRPVFJTQnVzaW5lc3NPYmplY3QtPk9UUlNCdXNpbmVzc0lzSW5zdGFsbGVkKCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICMgdHJhbnNwb3J0CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RyYW5zcG9ydFJvd1JlY29tbWVuZGF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnQgICAgID0+ICRUcmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnROYW1lID0+ICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteSAkVHJhbnNwb3J0Q2hlY2tlZCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJFRyYW5zcG9ydCB9IEB7ICRQYXJhbXtEYXRhfS0+e1RyYW5zcG9ydHN9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFRyYW5zcG9ydENoZWNrZWQgPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2V0IEVtYWlsIHRyYW5zcG9ydCBzZWxlY3RlZCBvbiBhZGQgc2NyZWVuCiAgICAgICAgICAgICAgICBpZiAoICRUcmFuc3BvcnQgZXEgJ0VtYWlsJyAmJiAhJFBhcmFte0lEfSApIHsKICAgICAgICAgICAgICAgICAgICAkVHJhbnNwb3J0Q2hlY2tlZCA9ICdjaGVja2VkPSJjaGVja2VkIicKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCB0cmFuc3BvcnQgc2V0dGluZ3Mgc3RyaW5nIGZyb20gdHJhbnNwb3J0IG9iamVjdAogICAgICAgICAgICAgICAgbXkgJFRyYW5zcG9ydFNldHRpbmdzID0KICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9ICktPlRyYW5zcG9ydFNldHRpbmdzRGlzcGxheUdldCgKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGl0IHNob3VsZCBkZWNpZGUgaWYgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQogICAgICAgICAgICAgICAgIyBub3RpZmljYXRpb24gb24gQWdlbnRQcmVmZXJlbmNlcyBpcyBlbmFibGVkIG9yIG5vdAogICAgICAgICAgICAgICAgbXkgJEFnZW50RW5hYmxlZEJ5RGVmYXVsdCA9IDA7CiAgICAgICAgICAgICAgICBpZiAoIGdyZXAgeyAkXyBlcSAkVHJhbnNwb3J0IH0gQHsgJFBhcmFte0RhdGF9LT57QWdlbnRFbmFibGVkQnlEZWZhdWx0fSB9ICkgewogICAgICAgICAgICAgICAgICAgICRBZ2VudEVuYWJsZWRCeURlZmF1bHQgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAhJFBhcmFte0lEfSAmJiBkZWZpbmVkICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e0FnZW50RW5hYmxlZEJ5RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEFnZW50RW5hYmxlZEJ5RGVmYXVsdCA9ICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e0FnZW50RW5hYmxlZEJ5RGVmYXVsdH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkQWdlbnRFbmFibGVkQnlEZWZhdWx0Q2hlY2tlZCA9ICggJEFnZW50RW5hYmxlZEJ5RGVmYXVsdCA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApOwoKICAgICAgICAgICAgICAgICMgdHJhbnNwb3J0CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUcmFuc3BvcnRSb3dFbmFibGVkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0ICAgICAgICAgICAgICAgICAgICA9PiAkVHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnROYW1lICAgICAgICAgICAgICAgID0+ICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRDaGVja2VkICAgICAgICAgICAgID0+ICRUcmFuc3BvcnRDaGVja2VkLAogICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1N0cmluZyAgICAgICAgICAgICAgID0+ICRUcmFuc3BvcnRTZXR0aW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgQWdlbnRFbmFibGVkQnlEZWZhdWx0Q2hlY2tlZCA9PiAkQWdlbnRFbmFibGVkQnlEZWZhdWx0Q2hlY2tlZCwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0c1NlcnZlckVycm9yICAgICAgICA9PiAkUGFyYW17VHJhbnNwb3J0c1NlcnZlckVycm9yfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgbm8gdHJhbnNwb3J0cwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0RhdGFGb3VuZE1zZ1RyYW5zcG9ydCcsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9PdmVydmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uQWRkJyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkltcG9ydCcgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdCcsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBteSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnKTsKCiAgICBteSAlTGlzdCA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uTGlzdCggVHlwZSA9PiAnQXBwb2ludG1lbnQnICk7CgogICAgbXkgJE5vdGlmaWNhdGlvbkNvbmZpZwogICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGcm9udGVuZDo6QWRtaW46OkFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiByZWdpc3RlcmVkIGV2ZW50cwogICAgbXkgJVJlZ2lzdGVyZWRFdmVudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RXZlbnQnKS0+RXZlbnRMaXN0KAogICAgICAgIE9iamVjdFR5cGVzID0+ICROb3RpZmljYXRpb25Db25maWctPntFdmVudE9iamVjdFR5cGVzfSwKICAgICk7CgogICAgIyBnZXQgYSBsaXN0IG9mIGFsbCBub3RpZmljYXRpb25zIGFmZmVjdGVkIGJ5IHRoZSBzdXBwb3J0ZWQgZXZlbnRzCiAgICBteSAlTm90aWZpY2F0aW9uSURzOwoKICAgICMgaWYgdGhlcmUgYXJlIGFueSBub3RpZmljYXRpb25zLCB0aGV5IGFyZSBzaG93bgogICAgaWYgKCVMaXN0KSB7CgogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgICAgIGZvciAoIHNvcnQgeyAkTGlzdHskYX0gY21wICRMaXN0eyRifSB9IGtleXMgJUxpc3QgKSB7CgogICAgICAgICAgICBteSAlRGF0YSA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJF8sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbGlkID0+ICRWYWxpZExpc3R7ICREYXRhe1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG90aGVyd2lzZSBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZSBpcyBkaXNwbGF5ZWQKICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0RhdGFGb3VuZE1zZycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7Cgp1c2UgYmFzZSBxdyhLZXJuZWw6OlN5c3RlbTo6QXN5bmNocm9ub3VzRXhlY3V0b3IpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgbmFtZXMgb2YgYWxsIHBhcmFtZXRlcnMKICAgIG15IEBQYXJhbU5hbWVzID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCk7CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICBQQVJBTU5BTUU6CiAgICBmb3IgbXkgJEtleSAoQFBhcmFtTmFtZXMpIHsKCiAgICAgICAgIyBxdWV1ZSBpcyBtdWx0aXBsZSBzZWxlY3Rpb24gZmllbGQsIGdldCBhcnJheSBpbnN0ZWFkCiAgICAgICAgaWYgKCAkS2V5ID1+IC9eUXVldWVJRF8vICkgewogICAgICAgICAgICBteSBAUGFyYW1BcnJheSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gXEBQYXJhbUFycmF5OwogICAgICAgICAgICBuZXh0IFBBUkFNTkFNRTsKICAgICAgICB9CgogICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgIH0KCiAgICBteSAkTGF5b3V0T2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ2FsZW5kYXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTmV3JyApIHsKCiAgICAgICAgbXkgJEdyb3VwU2VsZWN0aW9uICAgICA9ICRTZWxmLT5fR3JvdXBTZWxlY3Rpb25HZXQoKTsKICAgICAgICBteSAkQ29sb3JQYWxldHRlICAgICAgID0gJFNlbGYtPl9Db2xvclBhbGV0dGVHZXQoKTsKICAgICAgICBteSAkVmFsaWRTZWxlY3Rpb24gICAgID0gJFNlbGYtPl9WYWxpZFNlbGVjdGlvbkdldCgpOwogICAgICAgIG15ICVUaWNrZXRBcHBvaW50bWVudHMgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50cygpOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJFZGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwU2VsZWN0aW9uLAogICAgICAgICAgICAgICAgQ29sb3JQYWxldHRlID0+ICRDb2xvclBhbGV0dGUsCiAgICAgICAgICAgICAgICBWYWxpZElEICAgICAgPT4gJFZhbGlkU2VsZWN0aW9uLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uICAgID0+ICdTdG9yZU5ldycsCiAgICAgICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJENvbG9yUGFsZXR0ZS0+WyBpbnQgcmFuZCggc2NhbGFyIEB7JENvbG9yUGFsZXR0ZX0gKSBdLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnQWRkIG5ldyBDYWxlbmRhcicpLAogICAgICAgICAgICAgICAgV2lkZ2V0U3RhdHVzID0+ICdDb2xsYXBzZWQnLAogICAgICAgICAgICAgICAgJVRpY2tldEFwcG9pbnRtZW50cywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlTmV3JyApIHsKCiAgICAgICAgbXkgJUVycm9yOwoKICAgICAgICAjIGNoZWNrIG5hbWUKICAgICAgICBpZiAoICEkR2V0UGFyYW17Q2FsZW5kYXJOYW1lfSApIHsKICAgICAgICAgICAgJEVycm9yeydDYWxlbmRhck5hbWVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlcmUgaXMgYSBjYWxlbmRhciB3aXRoIHNhbWUgbmFtZQogICAgICAgICAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICRHZXRQYXJhbXtDYWxlbmRhck5hbWV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCVDYWxlbmRhcikgewogICAgICAgICAgICAgICAgJEVycm9ye0NhbGVuZGFyTmFtZUludmFsaWR9ID0gIlNlcnZlckVycm9yIjsKICAgICAgICAgICAgICAgICRFcnJvcntDYWxlbmRhck5hbWVFeGlzdHN9ICA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRHZXRQYXJhbXtUaWNrZXRBcHBvaW50bWVudHN9ID0gJFNlbGYtPl9HZXRUaWNrZXRBcHBvaW50bWVudFBhcmFtcyglR2V0UGFyYW0pOwoKICAgICAgICAjIEdldCBxdWV1ZSBjcmVhdGUgcGVybWlzc2lvbnMgZm9yIHRoZSB1c2VyLgogICAgICAgIG15ICVVc2VyR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ2NyZWF0ZScsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFZhbGlkSURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CgogICAgICAgIG15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwoKICAgICAgICAjIFF1ZXVlIGZpZWxkIGluIHRpY2tldCBhcHBvaW50bWVudHMgaXMgbWFuZGF0b3J5LCBjaGVjayBpZiBpdCdzIHByZXNlbnQgYW5kIHZhbGlkLgogICAgICAgIGZvciBteSAkUnVsZSAoIEB7ICRHZXRQYXJhbXtUaWNrZXRBcHBvaW50bWVudHN9IH0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkUnVsZS0+e1F1ZXVlSUR9ICYmIElzQXJyYXlSZWZXaXRoRGF0YSggJFJ1bGUtPntRdWV1ZUlEfSApICkgewoKICAgICAgICAgICAgICAgIFFVRVVFX0lEOgogICAgICAgICAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBAeyAkUnVsZS0+e1F1ZXVlSUR9IHx8IFtdIH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJVF1ZXVlRGF0YSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoIElEID0+ICRRdWV1ZUlEICk7CgogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgIWdyZXAgeyAkXyBlcSAkUXVldWVEYXRhe1ZhbGlkSUR9IH0gQFZhbGlkSURzCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEkVXNlckdyb3Vwc3sgJFF1ZXVlRGF0YXtHcm91cElEfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJFJ1bGUtPntSdWxlSUR9IH0tPntRdWV1ZUlESW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFFVRVVFX0lEOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJFJ1bGUtPntSdWxlSUR9IH0tPntRdWV1ZUlESW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIGdldCBzZWxlY3Rpb25zCiAgICAgICAgICAgIG15ICRHcm91cFNlbGVjdGlvbiAgICAgPSAkU2VsZi0+X0dyb3VwU2VsZWN0aW9uR2V0KCVHZXRQYXJhbSk7CiAgICAgICAgICAgIG15ICRDb2xvclBhbGV0dGUgICAgICAgPSAkU2VsZi0+X0NvbG9yUGFsZXR0ZUdldCgpOwogICAgICAgICAgICBteSAkVmFsaWRTZWxlY3Rpb24gICAgID0gJFNlbGYtPl9WYWxpZFNlbGVjdGlvbkdldCglR2V0UGFyYW0pOwogICAgICAgICAgICBteSAlVGlja2V0QXBwb2ludG1lbnRzID0gJFNlbGYtPl9UaWNrZXRBcHBvaW50bWVudHMoKTsKCiAgICAgICAgICAgICMgZ2V0IHJ1bGUgY291bnQKICAgICAgICAgICAgbXkgJFJ1bGVDb3VudCA9IHNjYWxhciBAeyAkR2V0UGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSB8fCBbXSB9OwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDYWxlbmRhckVkaXQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwU2VsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgIENvbG9yUGFsZXR0ZSA9PiAkQ29sb3JQYWxldHRlLAogICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAkVmFsaWRTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uICAgID0+ICdTdG9yZU5ldycsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnQWRkIG5ldyBDYWxlbmRhcicpLAogICAgICAgICAgICAgICAgICAgIFdpZGdldFN0YXR1cyA9PiAkUnVsZUNvdW50ID8gJ0V4cGFuZGVkJyA6ICdDb2xsYXBzZWQnLAogICAgICAgICAgICAgICAgICAgICVUaWNrZXRBcHBvaW50bWVudHMsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTaG93IGFsbCB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZSBibG9ja3MuCiAgICAgICAgICAgIG15ICRSdWxlTnVtYmVyID0gMTsKICAgICAgICAgICAgZm9yIG15ICRSdWxlICggQHsgJEdldFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gfHwgW10gfSApIHsKICAgICAgICAgICAgICAgICRSdWxlLT57RXJyb3J9ID0gJEVycm9yeyAkUnVsZS0+e1J1bGVJRH0gfTsKICAgICAgICAgICAgICAgIG15ICVUaWNrZXRBcHBvaW50bWVudFJ1bGUgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50cyggJXskUnVsZX0gKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEFwcG9pbnRtZW50UnVsZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFJ1bGVOdW1iZXIgPT4gJFJ1bGVOdW1iZXIrKywKICAgICAgICAgICAgICAgICAgICAgICAgJXskUnVsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICVUaWNrZXRBcHBvaW50bWVudFJ1bGUsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBTaG93IGFueSBzZWFyY2ggcGFyYW1ldGVyIGJsb2NrcyB0b28uCiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtTmFtZSAoIHNvcnQga2V5cyAleyAkUnVsZS0+e1NlYXJjaFBhcmFtfSAvLyB7fSB9ICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRBcHBvaW50bWVudFJ1bGVTZWFyY2hQYXJhbScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1OYW1lICA9PiAkUGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1WYWx1ZSA9PiAkUnVsZS0+e1NlYXJjaFBhcmFtfS0+eyRQYXJhbU5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXskUnVsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fTWFzayglUGFyYW0pOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgY2FsZW5kYXIKICAgICAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJUNhbGVuZGFyICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyIScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBQcm9jZXNzIHRpY2tldCBhcHBvaW50bWVudHMgaW4gYXN5bmMgY2FsbCB0byBjb3JlIG1vZHVsZSBtZXRob2QuCiAgICAgICAgJFNlbGYtPkFzeW5jQ2FsbCgKICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAgICAgICAgIEZ1bmN0aW9uTmFtZSAgID0+ICdUaWNrZXRBcHBvaW50bWVudFByb2Nlc3NDYWxlbmRhcicsCiAgICAgICAgICAgIEZ1bmN0aW9uUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEdldFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIiwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0VkaXQnICkgewoKICAgICAgICAjIGdldCBkYXRhCiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgICRHZXRQYXJhbXtDYWxlbmRhcklEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDYWxlbmRhcklEJyApIHx8ICcnOwoKICAgICAgICBpZiAoICEkR2V0UGFyYW17Q2FsZW5kYXJJRH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBDYWxlbmRhcklEIScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY2FsZW5kYXIgZGF0YQogICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEdldFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICElQ2FsZW5kYXIgKSB7CgogICAgICAgICAgICAjIGZha2UgbWVzc2FnZQogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnWW91IGhhdmUgbm8gYWNjZXNzIHRvIHRoaXMgY2FsZW5kYXIhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzZWxlY3Rpb25zCiAgICAgICAgbXkgJEdyb3VwU2VsZWN0aW9uICAgICA9ICRTZWxmLT5fR3JvdXBTZWxlY3Rpb25HZXQoJUNhbGVuZGFyKTsKICAgICAgICBteSAkQ29sb3JQYWxldHRlICAgICAgID0gJFNlbGYtPl9Db2xvclBhbGV0dGVHZXQoKTsKICAgICAgICBteSAkVmFsaWRTZWxlY3Rpb24gICAgID0gJFNlbGYtPl9WYWxpZFNlbGVjdGlvbkdldCglQ2FsZW5kYXIpOwogICAgICAgIG15ICVUaWNrZXRBcHBvaW50bWVudHMgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50cygpOwoKICAgICAgICBteSAkUnVsZUNvdW50ID0gc2NhbGFyIEB7ICRDYWxlbmRhcntUaWNrZXRBcHBvaW50bWVudHN9IHx8IFtdIH07CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDYWxlbmRhckVkaXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVDYWxlbmRhciwKICAgICAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICBDb2xvclBhbGV0dGUgPT4gJENvbG9yUGFsZXR0ZSwKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAkVmFsaWRTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gICAgPT4gJ1VwZGF0ZScsCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdFZGl0IENhbGVuZGFyJyksCiAgICAgICAgICAgICAgICBSdWxlQ291bnQgICAgPT4gJFJ1bGVDb3VudCwKICAgICAgICAgICAgICAgIFdpZGdldFN0YXR1cyA9PiAkUnVsZUNvdW50ID8gJ0V4cGFuZGVkJyA6ICdDb2xsYXBzZWQnLAogICAgICAgICAgICAgICAgJVRpY2tldEFwcG9pbnRtZW50cywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIFNob3cgYWxsIHRpY2tldCBhcHBvaW50bWVudCBydWxlIGJsb2Nrcy4KICAgICAgICBteSAkUnVsZU51bWJlciA9IDE7CiAgICAgICAgZm9yIG15ICRSdWxlICggQHsgJENhbGVuZGFye1RpY2tldEFwcG9pbnRtZW50c30gfHwgW10gfSApIHsKICAgICAgICAgICAgbXkgJVRpY2tldEFwcG9pbnRtZW50UnVsZSA9ICRTZWxmLT5fVGlja2V0QXBwb2ludG1lbnRzKCAleyRSdWxlfSApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEFwcG9pbnRtZW50UnVsZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBSdWxlTnVtYmVyID0+ICRSdWxlTnVtYmVyKyssCiAgICAgICAgICAgICAgICAgICAgJXskUnVsZX0sCiAgICAgICAgICAgICAgICAgICAgJVRpY2tldEFwcG9pbnRtZW50UnVsZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNob3cgYW55IHNlYXJjaCBwYXJhbWV0ZXIgYmxvY2tzIHRvby4KICAgICAgICAgICAgZm9yIG15ICRQYXJhbU5hbWUgKCBzb3J0IGtleXMgJXsgJFJ1bGUtPntTZWFyY2hQYXJhbX0gLy8ge30gfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEFwcG9pbnRtZW50UnVsZVNlYXJjaFBhcmFtJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1OYW1lICA9PiAkUGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBQYXJhbVZhbHVlID0+ICRSdWxlLT57U2VhcmNoUGFyYW19LT57JFBhcmFtTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFJ1bGV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGluaXRpYWxpemUgYnV0dG9uIGJlaGF2aW9yCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QXBwb2ludG1lbnRSdWxlSW5pdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRSdWxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1VwZGF0ZScgKSB7CgogICAgICAgIG15ICVFcnJvcjsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBDYWxlbmRhck5hbWUgQ29sb3IgR3JvdXBJRCkpIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeyAkTmVlZGVkIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwoKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X01hc2soICVQYXJhbSwgJUdldFBhcmFtLCAlRXJyb3IgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgY2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUKICAgICAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gJEdldFBhcmFte0NhbGVuZGFyTmFtZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRDYWxlbmRhcntDYWxlbmRhcklEfSAmJiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0gIT0gJEdldFBhcmFte0NhbGVuZGFySUR9ICkgewogICAgICAgICAgICAkRXJyb3J7Q2FsZW5kYXJOYW1lSW52YWxpZH0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgICAgICAkRXJyb3J7Q2FsZW5kYXJOYW1lRXhpc3RzfSAgPSAxOwogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gPSAkU2VsZi0+X0dldFRpY2tldEFwcG9pbnRtZW50UGFyYW1zKCVHZXRQYXJhbSk7CgogICAgICAgICMgR2V0IHF1ZXVlIGNyZWF0ZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHVzZXIuCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICApOwoKICAgICAgICBteSBAVmFsaWRJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKCiAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgICAgICMgUXVldWUgZmllbGQgaW4gdGlja2V0IGFwcG9pbnRtZW50cyBpcyBtYW5kYXRvcnksIGNoZWNrIGlmIGl0J3MgcHJlc2VudCBhbmQgdmFsaWQuCiAgICAgICAgZm9yIG15ICRSdWxlICggQHsgJEdldFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gfSApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRSdWxlLT57UXVldWVJRH0gJiYgSXNBcnJheVJlZldpdGhEYXRhKCAkUnVsZS0+e1F1ZXVlSUR9ICkgKSB7CgogICAgICAgICAgICAgICAgUVVFVUVfSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IEB7ICRSdWxlLT57UXVldWVJRH0gfHwgW10gfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAlUXVldWVEYXRhID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldCggSUQgPT4gJFF1ZXVlSUQgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAhZ3JlcCB7ICRfIGVxICRRdWV1ZURhdGF7VmFsaWRJRH0gfSBAVmFsaWRJRHMKICAgICAgICAgICAgICAgICAgICAgICAgfHwgISRVc2VyR3JvdXBzeyAkUXVldWVEYXRhe0dyb3VwSUR9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkUnVsZS0+e1J1bGVJRH0gfS0+e1F1ZXVlSURJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUVVFVUVfSUQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEVycm9yeyAkUnVsZS0+e1J1bGVJRH0gfS0+e1F1ZXVlSURJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICMgZ2V0IHNlbGVjdGlvbnMKICAgICAgICAgICAgbXkgJEdyb3VwU2VsZWN0aW9uICAgICA9ICRTZWxmLT5fR3JvdXBTZWxlY3Rpb25HZXQoJUdldFBhcmFtKTsKICAgICAgICAgICAgbXkgJENvbG9yUGFsZXR0ZSAgICAgICA9ICRTZWxmLT5fQ29sb3JQYWxldHRlR2V0KCk7CiAgICAgICAgICAgIG15ICRWYWxpZFNlbGVjdGlvbiAgICAgPSAkU2VsZi0+X1ZhbGlkU2VsZWN0aW9uR2V0KCVHZXRQYXJhbSk7CiAgICAgICAgICAgIG15ICVUaWNrZXRBcHBvaW50bWVudHMgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50cygpOwoKICAgICAgICAgICAgbXkgJFJ1bGVDb3VudCA9IHNjYWxhciBAeyAkR2V0UGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSB8fCBbXSB9OwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDYWxlbmRhckVkaXQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwU2VsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgIENvbG9yUGFsZXR0ZSA9PiAkQ29sb3JQYWxldHRlLAogICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAkVmFsaWRTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uICAgID0+ICdVcGRhdGUnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0VkaXQgQ2FsZW5kYXInKSwKICAgICAgICAgICAgICAgICAgICBSdWxlQ291bnQgICAgPT4gJFJ1bGVDb3VudCwKICAgICAgICAgICAgICAgICAgICAlVGlja2V0QXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU2hvdyBhbGwgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUgYmxvY2tzLgogICAgICAgICAgICBteSAkUnVsZU51bWJlciA9IDE7CiAgICAgICAgICAgIGZvciBteSAkUnVsZSAoIEB7ICRHZXRQYXJhbXtUaWNrZXRBcHBvaW50bWVudHN9IHx8IFtdIH0gKSB7CiAgICAgICAgICAgICAgICAkUnVsZS0+e0Vycm9yfSA9ICRFcnJvcnsgJFJ1bGUtPntSdWxlSUR9IH07CiAgICAgICAgICAgICAgICBteSAlVGlja2V0QXBwb2ludG1lbnRSdWxlID0gJFNlbGYtPl9UaWNrZXRBcHBvaW50bWVudHMoICV7JFJ1bGV9ICk7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRBcHBvaW50bWVudFJ1bGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBSdWxlTnVtYmVyID0+ICRSdWxlTnVtYmVyKyssCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFJ1bGV9LAogICAgICAgICAgICAgICAgICAgICAgICAlVGlja2V0QXBwb2ludG1lbnRSdWxlLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgU2hvdyBhbnkgc2VhcmNoIHBhcmFtZXRlciBibG9ja3MgdG9vLgogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbU5hbWUgKCBzb3J0IGtleXMgJXsgJFJ1bGUtPntTZWFyY2hQYXJhbX0gLy8ge30gfSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QXBwb2ludG1lbnRSdWxlU2VhcmNoUGFyYW0nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtTmFtZSAgPT4gJFBhcmFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtVmFsdWUgPT4gJFJ1bGUtPntTZWFyY2hQYXJhbX0tPnskUGFyYW1OYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JFJ1bGV9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X01hc2soJVBhcmFtKTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIGNhbGVuZGFyCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyVXBkYXRlKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFByb2Nlc3MgdGlja2V0IGFwcG9pbnRtZW50cyBpbiBhc3luYyBjYWxsIHRvIGNvcmUgbW9kdWxlIG1ldGhvZC4KICAgICAgICAkU2VsZi0+QXN5bmNDYWxsKAogICAgICAgICAgICBPYmplY3ROYW1lICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJywKICAgICAgICAgICAgRnVuY3Rpb25OYW1lICAgPT4gJ1RpY2tldEFwcG9pbnRtZW50UHJvY2Vzc0NhbGVuZGFyJywKICAgICAgICAgICAgRnVuY3Rpb25QYXJhbXMgPT4gewogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkR2V0UGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2FsZW5kYXJJbXBvcnQnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCB0aGUgdXBsb2FkZWQgZmlsZSBjb250ZW50CiAgICAgICAgbXkgJEZvcm1JRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICkgfHwgJyc7CiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICApOwogICAgICAgIG15ICRDb250ZW50ID0gJFVwbG9hZFN0dWZme0NvbnRlbnR9OwoKICAgICAgICAjIGNoZWNrIGZvciBvdmVyd3JpdGluZyBvcHRpb24KICAgICAgICBteSAkT3ZlcndyaXRlRXhpc3RpbmdFbnRpdGllcyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzJyApIHx8IDA7CgogICAgICAgICMgZXh0cmFjdCB0aGUgdGVhbSBkYXRhIGZyb20gdGhlIHVwbG9hZGVkIGZpbGUKICAgICAgICBteSAkQ2FsZW5kYXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OllBTUwnKS0+TG9hZCggRGF0YSA9PiAkQ29udGVudCApOwogICAgICAgIGlmICggcmVmICRDYWxlbmRhckRhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgiQ291bGRuJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuIiksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGZpbGUgaXMgdmFsaWQuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGltcG9ydCB0aGUgY2FsZW5kYXIKICAgICAgICBteSAkU3VjY2VzcyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJJbXBvcnQoCiAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFyRGF0YSwKICAgICAgICAgICAgT3ZlcndyaXRlRXhpc3RpbmdFbnRpdGllcyA9PiAkT3ZlcndyaXRlRXhpc3RpbmdFbnRpdGllcywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZnlNZXNzYWdlfSA9IHsKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IFRyYW5zbGF0YWJsZSgnRXJyb3InKSwKICAgICAgICAgICAgICAgIEluZm8gICAgID0+IFRyYW5zbGF0YWJsZSgnQ291bGQgbm90IGltcG9ydCB0aGUgY2FsZW5kYXIhJyksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17Tm90aWZ5TWVzc2FnZX0gPSB7CiAgICAgICAgICAgICAgICBJbmZvID0+IFRyYW5zbGF0YWJsZSgnQ2FsZW5kYXIgaW1wb3J0ZWQhJyksCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAlUGFyYW0gPSAkU2VsZi0+X092ZXJ2aWV3KCVQYXJhbSk7CiAgICB9CgogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NhbGVuZGFyRXhwb3J0JyApIHsKCiAgICAgICAgIyBjaGVjayBmb3IgQ2FsZW5kYXJJRAogICAgICAgIG15ICRDYWxlbmRhcklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NhbGVuZGFySUQnICkgfHwgJyc7CiAgICAgICAgaWYgKCAhJENhbGVuZGFySUQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdOZWVkIENhbGVuZGFySUQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjYWxlbmRhciBkYXRhCiAgICAgICAgbXkgJUNhbGVuZGFyRGF0YSA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJFeHBvcnQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCBcJUNhbGVuZGFyRGF0YSApICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY29udmVydCB0aGUgY2FsZW5kYXIgZGF0YSBoYXNoIHRvIHN0cmluZwogICAgICAgIG15ICRDYWxlbmRhckRhdGFZQU1MID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OllBTUwnKS0+RHVtcCggRGF0YSA9PiBcJUNhbGVuZGFyRGF0YSApOwoKICAgICAgICAjIHByZXBhcmUgY2FsZW5kYXIgbmFtZSB0byBiZSBwYXJ0IG9mIHRoZSBmaWxlbmFtZQogICAgICAgIG15ICRDYWxlbmRhck5hbWUgPSAkQ2FsZW5kYXJEYXRhe0NhbGVuZGFyRGF0YX0tPntDYWxlbmRhck5hbWV9OwogICAgICAgICRDYWxlbmRhck5hbWUgPX4gcy9ccysvXy9nOwoKICAgICAgICAjIHNlbmQgdGhlIHJlc3VsdCB0byB0aGUgYnJvd3NlcgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRDYWxlbmRhckRhdGFZQU1MLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdFeHBvcnRfQ2FsZW5kYXJfJyAuICRDYWxlbmRhck5hbWUgLiAnLnltbCcsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICBlbHNlIHsKCiAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSW1wb3J0QXBwb2ludG1lbnRzU3VjY2VzcycgKSB8fCAnJyApIHsKICAgICAgICAgICAgJFBhcmFte05vdGlmeU1lc3NhZ2V9ID0gewogICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nLAogICAgICAgICAgICAgICAgICAgICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb3VudCcgKSB8fCAwLAogICAgICAgICAgICAgICAgICAgICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOYW1lJyApICB8fCAnJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAlUGFyYW0gPSAkU2VsZi0+X092ZXJ2aWV3KCVQYXJhbSk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT5fTWFzayglUGFyYW0pOwp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENhbGVuZGFyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgogICAgIyBnZXQgYWxsIGNhbGVuZGFycyB1c2VyIGhhcyBSVyBhY2Nlc3MgdG8KICAgIG15IEBDYWxlbmRhcnMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyTGlzdCgKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBQZXJtaXNzaW9uID0+ICdydycsCiAgICApOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJGaWx0ZXInLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnQ2FsZW5kYXJzJyksCiAgICAgICAgfSwKICAgICk7CgogICAgJFBhcmFte1ZhbGlkQ291bnR9ID0gMDsKICAgIGZvciBteSAkQ2FsZW5kYXIgKEBDYWxlbmRhcnMpIHsKCiAgICAgICAgIyBncm91cCBuYW1lCiAgICAgICAgJENhbGVuZGFyLT57R3JvdXB9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgICAgICBHcm91cElEID0+ICRDYWxlbmRhci0+e0dyb3VwSUR9LAogICAgICAgICk7CgogICAgICAgICMgdmFsaWQgdGV4dAogICAgICAgICRDYWxlbmRhci0+e1ZhbGlkfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCgKICAgICAgICAgICAgVmFsaWRJRCA9PiAkQ2FsZW5kYXItPntWYWxpZElEfSwKICAgICAgICApOwogICAgICAgIGlmICggJENhbGVuZGFyLT57VmFsaWRJRH0gPT0gMSApIHsKICAgICAgICAgICAgJFBhcmFte1ZhbGlkQ291bnR9Kys7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhY2Nlc3MgdG9rZW5zCiAgICAgICAgJENhbGVuZGFyLT57QWNjZXNzVG9rZW59ID0gJENhbGVuZGFyT2JqZWN0LT5HZXRBY2Nlc3NUb2tlbigKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXItPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVXNlckxvZ2luICA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NhbGVuZGFyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRDYWxlbmRhcn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoIHNjYWxhciBAQ2FsZW5kYXJzID09IDAgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NhbGVuZGFyTm9EYXRhUm93JywKICAgICAgICApOwogICAgfQogICAgJFBhcmFte092ZXJ2aWV3fSA9IDE7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTWFpbkFjdGlvbnMnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkltcG9ydCcgKTsKCiAgICByZXR1cm4gJVBhcmFtOwp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIG91dHB1dCBwYWdlCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICBpZiAoICRQYXJhbXtOb3RpZnlNZXNzYWdlfSApIHsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgJXsgJFBhcmFte05vdGlmeU1lc3NhZ2V9IH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFZGl0IENhbGVuZGFyJyksCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9Hcm91cFNlbGVjdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxpc3Qgb2YgZ3JvdXBzIHdoZXJlIHVzZXIgaGFzIFJXIHBlcm1pc3Npb25zCiAgICBteSAlR3JvdXBMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICApOwoKICAgIG15ICRHcm91cFNlbGVjdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiBcJUdyb3VwTGlzdCwKICAgICAgICBOYW1lICAgICAgID0+ICdHcm91cElEJywKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtHcm91cElEfSB8fCAnJywKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgVmFsaWRhdGVfUmVxdWlyZWQnLAogICAgKTsKCiAgICByZXR1cm4gJEdyb3VwU2VsZWN0aW9uOwp9CgpzdWIgX0NvbG9yUGFsZXR0ZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbG9yIHBhbGV0dGUKICAgIG15ICRDYWxlbmRhckNvbG9ycyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQXBwb2ludG1lbnRDYWxlbmRhcjo6Q2FsZW5kYXJDb2xvcnMnKSB8fCBbCiAgICAgICAgJyMwMDAwMDAnLCAnIzFFMUUxRScsICcjM0EzQTNBJywgJyM1NDU0NTMnLCAnIzZFNkU2RScsICcjODc4Njg3JywgJyM4ODg3ODcnLCAnI0EwOUZBMCcsCiAgICAgICAgJyNCOEI4QjgnLCAnI0QwRDBEMCcsICcjRThFOEU4JywgJyNGRkZGRkYnLCAnIzg5MTEwMCcsICcjODk0ODAwJywgJyM4ODg1MDEnLCAnIzQ1ODQwMScsCiAgICAgICAgJyMwMjg0MDEnLCAnIzAxODQ0OCcsICcjMDA4Njg4JywgJyMwMDRBODgnLCAnIzAwMTg4OCcsICcjNDkxQTg4JywgJyM4OTFFODgnLCAnIzg5MTY0OCcsCiAgICAgICAgJyNGRjIxMDEnLCAnI0ZGODgwMicsICcjRkZGQTAzJywgJyM4M0Y5MDInLCAnIzA1RjgwMicsICcjMDNGOTg3JywgJyMwMEZERkYnLCAnIzAwOENGRicsCiAgICAgICAgJyMwMDJFRkYnLCAnIzg5MzFGRicsICcjRkYzOUZGJywgJyNGRjI5ODcnLCAnI0ZGNzI2RScsICcjRkZDRTZFJywgJyNGRkZCNkQnLCAnI0NFRkE2RScsCiAgICAgICAgJyM2OEY5NkUnLCAnIzY4RkRGRicsICcjNjhGQkQwJywgJyM2QUNGRkYnLCAnIzZFNzZGRicsICcjRDI3OEZGJywgJyNGRjdBRkYnLCAnI0ZGN0ZEMycsCiAgICBdOwoKICAgIHJldHVybiAkQ2FsZW5kYXJDb2xvcnM7Cn0KCnN1YiBfVmFsaWRTZWxlY3Rpb25HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlVmFsaWQgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICBteSAkVmFsaWRTZWxlY3Rpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyktPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gXCVWYWxpZCwKICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICBJRCAgICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgVmFsaWRhdGVfUmVxdWlyZWQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1ZhbGlkSUR9IHx8IDEsCiAgICAgICAgVGl0bGUgICAgICA9PiBUcmFuc2xhdGFibGUoIlZhbGlkIiksCiAgICApOwoKICAgIHJldHVybiAkVmFsaWRTZWxlY3Rpb247Cn0KCnN1YiBfVGlja2V0QXBwb2ludG1lbnRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgZmllbGQgaWQgc3VmZml4CiAgICBteSAkRmllbGRJRCA9ICcnOwogICAgaWYgKCAkUGFyYW17UnVsZUlEfSApIHsKICAgICAgICAkRmllbGRJRCA9ICdfJyAuICRQYXJhbXtSdWxlSUR9OwogICAgfQoKICAgIG15ICVUaWNrZXRBcHBvaW50bWVudHM7CgogICAgIyBnZXQgY3JlYXRlIHBlcm1pc3Npb24gcXVldWVzCiAgICBteSAlVXNlckdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICk7CgogICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgbXkgJVF1ZXVlcyA9ICRRdWV1ZU9iamVjdC0+UXVldWVMaXN0KCk7CiAgICBteSAlQXZhaWxhYmxlUXVldWVzOwoKICAgICMgYnVpbGQgc2VsZWN0aW9uIHN0cmluZwogICAgUVVFVUVJRDoKICAgIGZvciBteSAkUXVldWVJRCAoIHNvcnQga2V5cyAlUXVldWVzICkgewogICAgICAgIG15ICVRdWV1ZURhdGEgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2ssIGNhbiB3ZSBjcmVhdGUgbmV3IHRpY2tldHMgaW4gcXVldWUKICAgICAgICBuZXh0IFFVRVVFSUQgaWYgISRVc2VyR3JvdXBzeyAkUXVldWVEYXRhe0dyb3VwSUR9IH07CgogICAgICAgICRBdmFpbGFibGVRdWV1ZXN7JFF1ZXVlSUR9ID0gJFF1ZXVlRGF0YXtOYW1lfTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRUaWNrZXRBcHBvaW50bWVudHN7UXVldWVJRFN0cmd9ID0gJExheW91dE9iamVjdC0+QWdlbnRRdWV1ZUxpc3RPcHRpb24oCiAgICAgICAgQ2xhc3MgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSAnIC4gKCAkUGFyYW17RXJyb3J9LT57UXVldWVJREludmFsaWR9IC8vICcnICksCiAgICAgICAgRGF0YSA9PiBcJUF2YWlsYWJsZVF1ZXVlcywKICAgICAgICBNdWx0aXBsZSAgICAgICAgICAgPT4gMSwKICAgICAgICBTaXplICAgICAgICAgICAgICAgPT4gMCwKICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ1F1ZXVlSUQnIC4gJEZpZWxkSUQsCiAgICAgICAgVHJlZVZpZXcgICAgICAgICAgID0+ICRUcmVlVmlldywKICAgICAgICBPbkNoYW5nZVN1Ym1pdCAgICAgPT4gMCwKICAgICAgICBTZWxlY3RlZElEUmVmQXJyYXkgPT4gJFBhcmFte1F1ZXVlSUR9LAogICAgKTsKCiAgICAjIGdldCB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZXMKICAgIG15ICRUaWNrZXRBcHBvaW50bWVudENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnQXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRUeXBlJykgLy8ge307CiAgICBteSBAQXBwb2ludG1lbnRUeXBlczsKICAgIG15IEBEeW5hbWljRmllbGRUeXBlczsKCiAgICBUWVBFOgogICAgZm9yIG15ICRUeXBlS2V5ICggc29ydCBrZXlzICV7JFRpY2tldEFwcG9pbnRtZW50Q29uZmlnfSApIHsKICAgICAgICBuZXh0IFRZUEUgaWYgISRUaWNrZXRBcHBvaW50bWVudENvbmZpZy0+eyRUeXBlS2V5fS0+e0tleX07CiAgICAgICAgbmV4dCBUWVBFIGlmICEkVGlja2V0QXBwb2ludG1lbnRDb25maWctPnskVHlwZUtleX0tPntOYW1lfTsKCiAgICAgICAgaWYgKCAkVHlwZUtleSA9fiAvRHluYW1pY0ZpZWxkJC8gKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CgogICAgICAgICAgICAjIGdldCBsaXN0IG9mIGFsbCB2YWxpZCBkYXRlIGFuZCBkYXRlL3RpbWUgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyREeW5hbWljRmllbGRMaXN0fSApIHsKICAgICAgICAgICAgICAgIGlmICggJER5bmFtaWNGaWVsZC0+e0ZpZWxkVHlwZX0gbmUgJ0RhdGUnICYmICREeW5hbWljRmllbGQtPntGaWVsZFR5cGV9IG5lICdEYXRlVGltZScgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkVHlwZXMsIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiBzcHJpbnRmKCAkVGlja2V0QXBwb2ludG1lbnRDb25maWctPnskVHlwZUtleX0tPntLZXl9LCAgJER5bmFtaWNGaWVsZC0+e05hbWV9ICksCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gc3ByaW50ZiggJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57TmFtZX0sICREeW5hbWljRmllbGQtPntOYW1lfSApLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBUWVBFOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAQXBwb2ludG1lbnRUeXBlcywgewogICAgICAgICAgICBLZXkgICA9PiAkVGlja2V0QXBwb2ludG1lbnRDb25maWctPnskVHlwZUtleX0tPntLZXl9LAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0QXBwb2ludG1lbnRDb25maWctPnskVHlwZUtleX0tPntOYW1lfSwKICAgICAgICB9OwogICAgfQoKICAgIG15IEBTdGFydERhdGVUeXBlcyA9ICggQEFwcG9pbnRtZW50VHlwZXMsIEBEeW5hbWljRmllbGRUeXBlcyApOwogICAgJFRpY2tldEFwcG9pbnRtZW50c3tTdGFydERhdGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgRGF0YSAgICAgICA9PiBcQFN0YXJ0RGF0ZVR5cGVzLAogICAgICAgIE11bHRpcGxlICAgPT4gMCwKICAgICAgICBTaXplICAgICAgID0+IDAsCiAgICAgICAgTmFtZSAgICAgICA9PiAnU3RhcnREYXRlJyAuICRGaWVsZElELAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1N0YXJ0RGF0ZX0sCiAgICApOwoKICAgIG15IEBFbmRQbHVzVHlwZXMgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnUGx1c181JywKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCcrNSBtaW51dGVzJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdQbHVzXzE1JywKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCcrMTUgbWludXRlcycpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnUGx1c18zMCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnKzMwIG1pbnV0ZXMnKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ1BsdXNfNjAnLAogICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJysxIGhvdXInKSwKICAgICAgICB9LAogICAgKTsKCiAgICBteSBARW5kRGF0ZVR5cGVzID0gKCBARW5kUGx1c1R5cGVzLCBARHluYW1pY0ZpZWxkVHlwZXMgKTsKICAgICRUaWNrZXRBcHBvaW50bWVudHN7RW5kRGF0ZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICBEYXRhICAgICAgID0+IFxARW5kRGF0ZVR5cGVzLAogICAgICAgIE11bHRpcGxlICAgPT4gMCwKICAgICAgICBTaXplICAgICAgID0+IDAsCiAgICAgICAgTmFtZSAgICAgICA9PiAnRW5kRGF0ZScgLiAkRmllbGRJRCwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtFbmREYXRlfSwKICAgICk7CgogICAgbXkgJFNlYXJjaFBhcmFtc0NvbmZpZyA9CiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudFNlYXJjaFBhcmFtcycpIC8vIFtdOwoKICAgIG15IEBTZWFyY2hQYXJhbXM7CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAoIEB7JFNlYXJjaFBhcmFtc0NvbmZpZ30gKSB7CiAgICAgICAgcHVzaCBAU2VhcmNoUGFyYW1zLCB7CiAgICAgICAgICAgIEtleSAgICAgID0+ICRQYXJhbU5hbWUsCiAgICAgICAgICAgIFZhbHVlICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkUGFyYW1OYW1lKSwKICAgICAgICAgICAgRGlzYWJsZWQgPT4gJFBhcmFte1NlYXJjaFBhcmFtfS0+eyRQYXJhbU5hbWV9IHx8IDAsCiAgICAgICAgfTsKICAgIH0KCiAgICAkVGlja2V0QXBwb2ludG1lbnRze1NlYXJjaFBhcmFtc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgQ2xhc3MgICAgPT4gJ1NlYXJjaFBhcmFtcyBNb2Rlcm5pemUnLAogICAgICAgIERhdGEgICAgID0+IFxAU2VhcmNoUGFyYW1zLAogICAgICAgIE11bHRpcGxlID0+IDAsCiAgICAgICAgU2l6ZSAgICAgPT4gMCwKICAgICAgICBOYW1lICAgICA9PiAnU2VhcmNoUGFyYW1zJyAuICRGaWVsZElELAogICAgKTsKCiAgICByZXR1cm4gJVRpY2tldEFwcG9pbnRtZW50czsKfQoKc3ViIF9HZXRUaWNrZXRBcHBvaW50bWVudFBhcmFtcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG1haW4gb2JqZWN0CiAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBjcmVhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgIG15ICVUaWNrZXRBcHBvaW50bWVudFBhcmFtczsKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVQYXJhbSApIHsKICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhTdGFydERhdGUgRW5kRGF0ZSBRdWV1ZUlEIFNlYXJjaFBhcmFtKSkgewogICAgICAgICAgICBpZiAoICRLZXkgPX4gL14ke0ZpZWxkfV8oW0EtWmEtejAtOV0rKS8gKSB7CiAgICAgICAgICAgICAgICBteSAkUnVsZUlEID0gJDE7CgogICAgICAgICAgICAgICAgIyBpZiBydWxlIGlkIGlzIGludGVnZXIsIGdlbmVyYXRlIHJhbmRvbSBndWlkCiAgICAgICAgICAgICAgICBpZiAoIElzSW50ZWdlcigkUnVsZUlEKSApIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRQYXJhbXN7JFJ1bGVJRH0tPntSdWxlSUR9ID0gJE1haW5PYmplY3QtPkdlbmVyYXRlUmFuZG9tU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGggICAgID0+IDMyLAogICAgICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5ID0+IFsgMCAuLiA5LCAnYScgLi4gJ2YnIF0sICAgICMgaGV4YWRlY2ltYWwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlLCB1c2UgaXQgYXMtaXMKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRUaWNrZXRBcHBvaW50bWVudFBhcmFtc3skUnVsZUlEfS0+e1J1bGVJRH0gPSAkUnVsZUlEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkRmllbGQgZXEgJ1NlYXJjaFBhcmFtJyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRLZXkgPX4gL15TZWFyY2hQYXJhbV8ke1J1bGVJRH1fKFtBLVphLXpdKykkLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFNlYXJjaFBhcmFtID0gJDE7CiAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXRBcHBvaW50bWVudFBhcmFtc3skUnVsZUlEfS0+e1NlYXJjaFBhcmFtfS0+eyRTZWFyY2hQYXJhbX0gPSAkUGFyYW17JEtleX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFRpY2tldEFwcG9pbnRtZW50UGFyYW1zeyRSdWxlSUR9LT57JEZpZWxkfSA9ICRQYXJhbXskS2V5fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHRyYW5zZm9ybSB0byBhcnJheQogICAgbXkgQFRpY2tldEFwcG9pbnRtZW50RGF0YTsKICAgIGZvciBteSAkUnVsZUlEICggc29ydCBrZXlzICVUaWNrZXRBcHBvaW50bWVudFBhcmFtcyApIHsKICAgICAgICBwdXNoIEBUaWNrZXRBcHBvaW50bWVudERhdGEsICRUaWNrZXRBcHBvaW50bWVudFBhcmFtc3skUnVsZUlEfTsKICAgIH0KCiAgICByZXR1cm4gXEBUaWNrZXRBcHBvaW50bWVudERhdGE7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntPdmVydmlld1NjcmVlbn0gPSAnQ2FsZW5kYXJPdmVydmlldyc7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYWxsIHVzZXIncyB2YWxpZCBjYWxlbmRhcnMKICAgIG15ICRWYWxpZElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTG9va3VwKAogICAgICAgIFZhbGlkID0+ICd2YWxpZCcsCiAgICApOwoKICAgIG15ICRDYWxlbmRhck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwoKICAgIG15IEBDYWxlbmRhcnMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyTGlzdCgKICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBWYWxpZElEID0+ICRWYWxpZElELAogICAgKTsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgaWYgd2UgZm91bmQgc29tZQogICAgaWYgKEBDYWxlbmRhcnMpIHsKCiAgICAgICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICAgICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAgICAgIyBuZXcgYXBwb2ludG1lbnQgZGlhbG9nCiAgICAgICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FwcG9pbnRtZW50Q3JlYXRlJyApIHsKICAgICAgICAgICAgJFBhcmFte0FwcG9pbnRtZW50Q3JlYXRlfSA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTdGFydCAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N0YXJ0JyApICAgICAvLyB1bmRlZiwKICAgICAgICAgICAgICAgICAgICBFbmQgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VuZCcgKSAgICAgICAvLyB1bmRlZiwKICAgICAgICAgICAgICAgICAgICBQbHVnaW5LZXkgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1BsdWdpbktleScgKSAvLyB1bmRlZiwKICAgICAgICAgICAgICAgICAgICBTZWFyY2ggICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlYXJjaCcgKSAgICAvLyB1bmRlZiwKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ09iamVjdElEJyApICAvLyB1bmRlZiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgc2V0dGluZ3MgZGlhbG9nCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NhbGVuZGFyU2V0dGluZ3NTaG93JyApIHsKICAgICAgICAgICAgJFBhcmFte0NhbGVuZGFyU2V0dGluZ3NTaG93fSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGVkaXQgYXBwb2ludG1lbnQgZGlhbG9nCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtBcHBvaW50bWVudElEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdBcHBvaW50bWVudElEJyApIC8vIHVuZGVmOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlQnV0dG9uJywKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJEaXYnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENhbGVuZGFyV2lkdGggPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDYWxlbmRhcldpZGdldCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdXNlciBwcmVmZXJlbmNlcwogICAgICAgIG15ICVQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFByZWZlcmVuY2VzKAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgdXNlciBwcmVmZXJlbmNlIGtleQogICAgICAgIG15ICRTaG93bkFwcG9pbnRtZW50c1ByZWZLZXkgPSAnVXNlcicgLiAkU2VsZi0+e092ZXJ2aWV3U2NyZWVufSAuICdTaG93bkFwcG9pbnRtZW50cyc7CiAgICAgICAgbXkgJFNob3duQXBwb2ludG1lbnRzUHJlZlZhbCA9ICRQcmVmZXJlbmNlc3skU2hvd25BcHBvaW50bWVudHNQcmVmS2V5fSB8fCAxOwoKICAgICAgICAjIHNob3duIGFwcG9pbnRtZW50cyBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17U2hvd25BcHBvaW50bWVudHNTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0FsbCBhcHBvaW50bWVudHMnKSwKICAgICAgICAgICAgICAgIDIgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTaG93bkFwcG9pbnRtZW50cycsCiAgICAgICAgICAgIElEICAgICAgICAgICA9PiAnU2hvd25BcHBvaW50bWVudHMnLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2hvd25BcHBvaW50bWVudHNQcmVmVmFsLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgb25seSBhc3NpZ25lZCBhcHBvaW50bWVudHMgdG8gY3VycmVudCB1c2VyCiAgICAgICAgaWYgKCAkU2hvd25BcHBvaW50bWVudHNQcmVmVmFsID09IDIgKSB7CiAgICAgICAgICAgICRQYXJhbXtSZXNvdXJjZUlEfSA9ICRTZWxmLT57VXNlcklEfTsKCiAgICAgICAgICAgICMgZGlzcGxheSBub3RpZnkgbGluZQogICAgICAgICAgICAkUGFyYW17Tm90aWZ5TGluZX0gPSB7CiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnV2FybmluZycsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBUcmFuc2xhdGFibGUoJ1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnKSwKICAgICAgICAgICAgICAgIExpbmsgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9CiAgICAgICAgICAgICAgICAgICAgLiAnQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O1N1YmFjdGlvbj1DYWxlbmRhclNldHRpbmdzU2hvdycsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBteSAkQ2FsZW5kYXJMaW1pdCA9IGludCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXI6OkNhbGVuZGFyTGltaXRPdmVydmlldycpIHx8IDEwOwogICAgICAgIG15ICRDYWxlbmRhclNlbGVjdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkRlY29kZSgKICAgICAgICAgICAgRGF0YSA9PiAkUHJlZmVyZW5jZXN7ICdVc2VyJyAuICRTZWxmLT57T3ZlcnZpZXdTY3JlZW59IC4gJ0NhbGVuZGFyU2VsZWN0aW9uJyB9IHx8ICdbXScsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEN1cnJlbnRDYWxlbmRhciA9IDE7CiAgICAgICAgZm9yIG15ICRDYWxlbmRhciAoQENhbGVuZGFycykgewoKICAgICAgICAgICAgIyBjaGVjayB0aGUgY2FsZW5kYXIgaWYgc3RvcmVkIGluIHByZWZlcmVuY2VzCiAgICAgICAgICAgIGlmICggc2NhbGFyIEB7JENhbGVuZGFyU2VsZWN0aW9ufSApIHsKICAgICAgICAgICAgICAgIGlmICggZ3JlcCB7ICRfID09ICRDYWxlbmRhci0+e0NhbGVuZGFySUR9IH0gQHskQ2FsZW5kYXJTZWxlY3Rpb259ICkgewogICAgICAgICAgICAgICAgICAgICRDYWxlbmRhci0+e0NoZWNrZWR9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiICcgaWYgJEN1cnJlbnRDYWxlbmRhciA8PSAkQ2FsZW5kYXJMaW1pdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBjYWxlbmRhciBieSBkZWZhdWx0IGlmIGxpbWl0IGlzIG5vdCB5ZXQgcmVhY2hlZAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDYWxlbmRhci0+e0NoZWNrZWR9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiICcgaWYgJEN1cnJlbnRDYWxlbmRhciA8PSAkQ2FsZW5kYXJMaW1pdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgYWNjZXNzIHRva2VucwogICAgICAgICAgICAkQ2FsZW5kYXItPntBY2Nlc3NUb2tlbn0gPSAkQ2FsZW5kYXJPYmplY3QtPkdldEFjY2Vzc1Rva2VuKAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXItPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiAgPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjYWxlbmRhciBjaGVja2JveCBpbiB0aGUgd2lkZ2V0CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJTd2l0Y2gnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskQ2FsZW5kYXJ9LAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNhbGN1bGF0ZSBiZXN0IHRleHQgY29sb3IKICAgICAgICAgICAgJFBhcmFte1RleHRDb2xvcn0gPSAkQ2FsZW5kYXJPYmplY3QtPkdldFRleHRDb2xvcigKICAgICAgICAgICAgICAgIEJhY2tncm91bmQgPT4gJENhbGVuZGFyLT57Q29sb3J9LAogICAgICAgICAgICApIHx8ICcjRkZGRkZGJzsKCiAgICAgICAgICAgICMgY2FsZW5kYXIgc291cmNlIChKU09OKQogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NhbGVuZGFyU291cmNlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JENhbGVuZGFyfSwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NhbGVuZGFyU291cmNlQ29tbWEnLAogICAgICAgICAgICApIGlmICRDdXJyZW50Q2FsZW5kYXIgPCBzY2FsYXIgQENhbGVuZGFyczsKCiAgICAgICAgICAgICRDdXJyZW50Q2FsZW5kYXIrKzsKICAgICAgICB9CgogICAgICAgICMgc2V0IGluaXRpYWwgdmlldwogICAgICAgICRQYXJhbXtEZWZhdWx0Vmlld30gPSAkUHJlZmVyZW5jZXN7ICdVc2VyJyAuICRTZWxmLT57T3ZlcnZpZXdTY3JlZW59IC4gJ0RlZmF1bHRWaWV3JyB9CiAgICAgICAgICAgIHx8ICd0aW1lbGluZVdlZWsnOwoKICAgICAgICAjIGNoZWNrIGlmIHRlYW0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQKICAgICAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewoKICAgICAgICAgICAgIyBzaG93IHJlc291cmNlIGJsb2NrIGluIHRvb2x0aXBzCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVG9vbHRpcFRlbXBsYXRlUmVzb3VyY2UnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGx1Z2luIGxpc3QKICAgICAgICAkUGFyYW17UGx1Z2luTGlzdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbicpLT5QbHVnaW5MaXN0KCk7CgogICAgICAgICMgZ2V0IHJlZ2lzdGVyZWQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGVzCiAgICAgICAgbXkgJVRpY2tldEFwcG9pbnRtZW50VHlwZXMgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50VHlwZXNHZXQoKTsKCiAgICAgICAgbXkgJEN1cnJlbnRUeXBlID0gMTsKICAgICAgICBmb3IgbXkgJFR5cGUgKCBzb3J0IGtleXMgJVRpY2tldEFwcG9pbnRtZW50VHlwZXMgKSB7CiAgICAgICAgICAgIG15ICROb0RyYWcgPSAwOwoKICAgICAgICAgICAgIyBwcmV2ZW50IGRyYWdnaW5nIG9mIHRpY2tldCBlc2NhbGF0aW9uIGFwcG9pbnRtZW50cwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkVHlwZSBlcSAnRmlyc3RSZXNwb25zZVRpbWUnCiAgICAgICAgICAgICAgICB8fCAkVHlwZSBlcSAnVXBkYXRlVGltZScKICAgICAgICAgICAgICAgIHx8ICRUeXBlIGVxICdTb2x1dGlvblRpbWUnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICROb0RyYWcgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCBjb25maWd1cmVkIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIG1hcmsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRBcHBvaW50bWVudE1hcmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRUeXBlID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50TWFyayA9PiBsYyBzdWJzdHIoICRUaWNrZXRBcHBvaW50bWVudFR5cGVzeyRUeXBlfS0+e01hcmt9LCAwLCAxICksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRDdXJyZW50VHlwZSA8IHNjYWxhciBrZXlzICVUaWNrZXRBcHBvaW50bWVudFR5cGVzICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QXBwb2ludG1lbnRNYXJrQ29tbWEnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgY29uZmlndXJlZCB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBkcmFnZ2FiaWxpdHkKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRBcHBvaW50bWVudE5vRHJhZycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudFR5cGUgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgTm9EcmFnICAgICAgICAgID0+ICROb0RyYWcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRDdXJyZW50VHlwZSA8IHNjYWxhciBrZXlzICVUaWNrZXRBcHBvaW50bWVudFR5cGVzICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QXBwb2ludG1lbnROb0RyYWdDb21tYScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQ3VycmVudFR5cGUrKzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHdvcmtpbmcgaG91ciBhcHBvaW50bWVudHMKICAgICAgICBteSBAV29ya2luZ0hvdXJzID0gJFNlbGYtPl9HZXRXb3JraW5nSG91cnMoKTsKCiAgICAgICAgbXkgJEN1cnJlbnRBcHBvaW50bWVudCA9IDE7CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQFdvcmtpbmdIb3VycykgewoKICAgICAgICAgICAgIyBzb3J0IGRheXMgb2YgdGhlIHdlZWsKICAgICAgICAgICAgbXkgQERvVyA9IHNvcnQgQHsgJEFwcG9pbnRtZW50LT57RG9XfSB9OwoKICAgICAgICAgICAgIyBvdXRwdXQgYmxvY2sKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JraW5nSG91cnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskQXBwb2ludG1lbnR9LAogICAgICAgICAgICAgICAgICAgIERvVyA9PiAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKCBEYXRhID0+IFxARG9XICksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtpbmdIb3Vyc0NvbW1hJywKICAgICAgICAgICAgKSBpZiAkQ3VycmVudEFwcG9pbnRtZW50IDwgc2NhbGFyIEBXb3JraW5nSG91cnM7CgogICAgICAgICAgICAkQ3VycmVudEFwcG9pbnRtZW50Kys7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBubyBjYWxlbmRhciBmb3VuZCBtZXNzYWdlCiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9DYWxlbmRhcicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0ZXh0IGRpcmVjdGlvbiBmcm9tIGxhbmd1YWdlIG9iamVjdAogICAgbXkgJFRleHREaXJlY3Rpb24gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT57VGV4dERpcmVjdGlvbn0gfHwgJyc7CgogICAgIyBvdXRwdXQgcGFnZQogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgaWYgKCAkUGFyYW17Tm90aWZ5TGluZX0gKSB7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICV7ICRQYXJhbXtOb3RpZnlMaW5lfSB9LAogICAgICAgICk7CiAgICB9CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldycsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgRWRpdEFjdGlvbiAgICAgICAgPT4gJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgRWRpdE1hc2tTdWJhY3Rpb24gPT4gJ0VkaXRNYXNrJywKICAgICAgICAgICAgUHJlZlN1YmFjdGlvbiAgICAgPT4gJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgTGlzdEFjdGlvbiAgICAgICAgPT4gJ0FnZW50QXBwb2ludG1lbnRMaXN0JywKICAgICAgICAgICAgRGF5c1N1YmFjdGlvbiAgICAgPT4gJ0FwcG9pbnRtZW50RGF5cycsCiAgICAgICAgICAgIEZpcnN0RGF5ICAgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKSB8fCAwLAogICAgICAgICAgICBJc1JUTExhbmd1YWdlICAgICA9PiAoICRUZXh0RGlyZWN0aW9uIGVxICdydGwnICkgPyAndHJ1ZScgOiAnZmFsc2UnLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfR2V0V29ya2luZ0hvdXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgd29ya2luZyBob3VycyBmcm9tIHN5c2NvbmZpZwogICAgbXkgJFdvcmtpbmdIb3Vyc0NvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGltZVdvcmtpbmdIb3VycycpOwoKICAgICMgY3JlYXRlIHdvcmtpbmcgaG91ciBhcHBvaW50bWVudHMgZm9yIGVhY2ggZGF5CiAgICBteSBAV29ya2luZ0hvdXJzOwogICAgZm9yIG15ICREYXlOYW1lICggc29ydCBrZXlzICV7JFdvcmtpbmdIb3Vyc0NvbmZpZ30gKSB7CgogICAgICAgICMgZGF5IG9mIHRoZSB3ZWVrCiAgICAgICAgbXkgJERvVyA9IDA7ICAgICMgU3VuCiAgICAgICAgaWYgKCAkRGF5TmFtZSBlcSAnTW9uJyApIHsKICAgICAgICAgICAgJERvVyA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJERheU5hbWUgZXEgJ1R1ZScgKSB7CiAgICAgICAgICAgICREb1cgPSAyOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICREYXlOYW1lIGVxICdXZWQnICkgewogICAgICAgICAgICAkRG9XID0gMzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRGF5TmFtZSBlcSAnVGh1JyApIHsKICAgICAgICAgICAgJERvVyA9IDQ7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJERheU5hbWUgZXEgJ0ZyaScgKSB7CiAgICAgICAgICAgICREb1cgPSA1OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICREYXlOYW1lIGVxICdTYXQnICkgewogICAgICAgICAgICAkRG9XID0gNjsKICAgICAgICB9CgogICAgICAgIG15ICRTdGFydFRpbWUgPSAwOwogICAgICAgIG15ICRFbmRUaW1lICAgPSAwOwoKICAgICAgICBTVEFSVF9USU1FOgogICAgICAgIGZvciAoICRTdGFydFRpbWUgPSAwOyAkU3RhcnRUaW1lIDwgMjQ7ICRTdGFydFRpbWUrKyApIHsKCiAgICAgICAgICAgICMgaXMgdGhpcyB3b3JraW5nIGhvdXI/CiAgICAgICAgICAgIGlmICggZ3JlcCB7ICRfIGVxICRTdGFydFRpbWUgfSBAeyAkV29ya2luZ0hvdXJzQ29uZmlnLT57JERheU5hbWV9IH0gKSB7CgogICAgICAgICAgICAgICAgIyBnbyB0byB0aGUgZW5kIG9mIHRoZSB3b3JraW5nIGhvdXJzCiAgICAgICAgICAgICAgICBmb3IgKCBteSAkRW5kSG91ciA9ICRTdGFydFRpbWU7ICRFbmRIb3VyIDwgMjQ7ICRFbmRIb3VyKysgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhZ3JlcCB7ICRfIGVxICRFbmRIb3VyIH0gQHsgJFdvcmtpbmdIb3Vyc0NvbmZpZy0+eyREYXlOYW1lfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRW5kVGltZSA9ICRFbmRIb3VyOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgYXBwb2ludG1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRW5kVGltZSA+ICRTdGFydFRpbWUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBXb3JraW5nSG91cnMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydFRpbWUgPT4gc3ByaW50ZiggJyUwMmQ6MDA6MDAnLCAkU3RhcnRUaW1lICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kVGltZSAgID0+IHNwcmludGYoICclMDJkOjAwOjAwJywgJEVuZFRpbWUgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb1cgICAgICAgPT4gWyREb1ddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBza2lwIHNvbWUgaG91cnMKICAgICAgICAgICAgICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRFbmRIb3VyOwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBTVEFSVF9USU1FOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNvbGxhcHNlIGFwcG9pbnRtZW50cyB3aXRoIHNhbWUgc3RhcnQgYW5kIGVuZCB0aW1lcwogICAgZm9yIG15ICRBcHBvaW50bWVudEEgKEBXb3JraW5nSG91cnMpIHsKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50QiAoQFdvcmtpbmdIb3VycykgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRBLT57U3RhcnRUaW1lfSAmJiAkQXBwb2ludG1lbnRCLT57U3RhcnRUaW1lfQogICAgICAgICAgICAgICAgJiYgJEFwcG9pbnRtZW50QS0+e1N0YXJ0VGltZX0gZXEgJEFwcG9pbnRtZW50Qi0+e1N0YXJ0VGltZX0KICAgICAgICAgICAgICAgICYmICRBcHBvaW50bWVudEEtPntFbmRUaW1lfSBlcSAkQXBwb2ludG1lbnRCLT57RW5kVGltZX0KICAgICAgICAgICAgICAgICYmICRBcHBvaW50bWVudEEtPntEb1d9IG5lICRBcHBvaW50bWVudEItPntEb1d9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHB1c2ggQHsgJEFwcG9pbnRtZW50QS0+e0RvV30gfSwgQHsgJEFwcG9pbnRtZW50Qi0+e0RvV30gfTsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudEIgPSB1bmRlZjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHJldHVybiBvbmx5IG5vbi1lbXB0eSBhcHBvaW50bWVudHMKICAgIHJldHVybiBncmVwIHsgc2NhbGFyIGtleXMgJXskX30gfSBAV29ya2luZ0hvdXJzOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEFwcG9pbnRtZW50RWRpdDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntFbXB0eVN0cmluZ30gPSAnLSc7CgogICAgIyBnZXQgdGltZSB6b25lIG9mZnNldAogICAgJFNlbGYtPntUaW1lWm9uZX0gPSAkU2VsZi0+e1VzZXJUaW1lWm9uZX0gfHwgMDsKICAgICRTZWxmLT57VGltZVNlY0RpZmZ9ID0gJFNlbGYtPntUaW1lWm9uZX0gKiAzNjAwOyAgICAjIDYwICogNjAKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0OwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IG5hbWVzIG9mIGFsbCBwYXJhbWV0ZXJzCiAgICBteSBAUGFyYW1OYW1lcyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgUEFSQU1OQU1FOgogICAgZm9yIG15ICRLZXkgKEBQYXJhbU5hbWVzKSB7CgogICAgICAgICMgc2tpcCB0aGUgQWN0aW9uIHBhcmFtZXRlciwgaXQncyBnaXZpbmcgQnVpbGREYXRlU2VsZWN0aW9uIHByb2JsZW1zIGZvciBzb21lIHJlYXNvbgogICAgICAgIG5leHQgUEFSQU1OQU1FIGlmICRLZXkgZXEgJ0FjdGlvbic7CgogICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgbXkgJFBsdWdpbk9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW4nKTsKCiAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoIERhdGEgPT4gW10gKTsKCiAgICBteSAlUGVybWlzc2lvbkxldmVsID0gKAogICAgICAgICdybycgICAgICAgID0+IDEsCiAgICAgICAgJ21vdmVfaW50bycgPT4gMiwKICAgICAgICAnY3JlYXRlJyAgICA9PiAzLAogICAgICAgICdub3RlJyAgICAgID0+IDQsCiAgICAgICAgJ293bmVyJyAgICAgPT4gNSwKICAgICAgICAncHJpb3JpdHknICA9PiA2LAogICAgICAgICdydycgICAgICAgID0+IDcsCiAgICApOwoKICAgIG15ICRQZXJtaXNzaW9ucyA9ICdydyc7CgogICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sKICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGVkaXQgbWFzawogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0VkaXRNYXNrJyApIHsKCiAgICAgICAgIyBnZXQgYWxsIHVzZXIncyB2YWxpZCBjYWxlbmRhcnMKICAgICAgICBteSAkVmFsaWRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCgKICAgICAgICAgICAgVmFsaWQgPT4gJ3ZhbGlkJywKICAgICAgICApOwogICAgICAgIG15IEBDYWxlbmRhcnMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyTGlzdCgKICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0cmFuc2Zvcm0gZGF0YSBmb3Igc2VsZWN0IGJveAogICAgICAgIG15IEBDYWxlbmRhckRhdGEgPSBtYXAgewogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAkXy0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJF8tPntDYWxlbmRhck5hbWV9LAogICAgICAgICAgICB9CiAgICAgICAgfSBAQ2FsZW5kYXJzOwoKICAgICAgICAjIHRyYW5zZm9ybSBkYXRhIGZvciBJRCBsb29rdXAKICAgICAgICBteSAlQ2FsZW5kYXJMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0NhbGVuZGFySUR9ID0+ICRfLT57Q2FsZW5kYXJOYW1lfQogICAgICAgIH0gQENhbGVuZGFyczsKCiAgICAgICAgZm9yIG15ICRDYWxlbmRhciAoQENhbGVuZGFyRGF0YSkgewoKICAgICAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgICAgICAgICBteSAkQ2FsZW5kYXJQZXJtaXNzaW9uID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhci0+e0tleX0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb25MZXZlbHskQ2FsZW5kYXJQZXJtaXNzaW9ufSA8IDMgKSB7CgogICAgICAgICAgICAgICAgIyBwZXJtaXNzaW9ucyA8IGNyZWF0ZQogICAgICAgICAgICAgICAgJENhbGVuZGFyLT57RGlzYWJsZWR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkZWZpbmUgeWVhciBib3VuZGFyaWVzCiAgICAgICAgbXkgKCAlWWVhclBlcmlvZFBhc3QsICVZZWFyUGVyaW9kRnV0dXJlICk7CiAgICAgICAgZm9yIG15ICRGaWVsZCAocXcgKFN0YXJ0IEVuZCBSZWN1cnJlbmNlVW50aWwpKSB7CiAgICAgICAgICAgICRZZWFyUGVyaW9kUGFzdHskRmllbGR9ID0gJFllYXJQZXJpb2RGdXR1cmV7JEZpZWxkfSA9IDU7CiAgICAgICAgfQoKICAgICAgICAjIGRvIG5vdCB1c2UgZGF0ZSBzZWxlY3Rpb24gdGltZSB6b25lIGNhbGN1bGF0aW9uIGJ5IGRlZmF1bHQKICAgICAgICBteSAkT3ZlcnJpZGVUaW1lWm9uZSA9IDE7CgogICAgICAgIG15ICVBcHBvaW50bWVudDsKICAgICAgICBpZiAoICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKICAgICAgICAgICAgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBub24tZXhpc3RlbnQgYXBwb2ludG1lbnQKICAgICAgICAgICAgaWYgKCAhJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdBcHBvaW50bWVudCBub3QgZm91bmQhJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHVzZSB0aW1lIHpvbmUgY2FsY3VsYXRpb24gaWYgZWRpdGluZyBleGlzdGluZyBhcHBvaW50bWVudHMKICAgICAgICAgICAgIyBidXQgb25seSBpZiBub3QgZGVhbGluZyB3aXRoIGFuIGFsbCBkYXkgYXBwb2ludG1lbnQKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkT3ZlcnJpZGVUaW1lWm9uZSA9ICRBcHBvaW50bWVudHtBbGxEYXl9IHx8IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgICAgICAgICAgJFBlcm1pc3Npb25zID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgc3RhcnQgdGltZSBjb21wb25lbnRzCiAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBteSAkU3RhcnRTZWNvbmQsICRBcHBvaW50bWVudHtTdGFydE1pbnV0ZX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRIb3VyfSwgJEFwcG9pbnRtZW50e1N0YXJ0RGF5fSwgJEFwcG9pbnRtZW50e1N0YXJ0TW9udGh9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0WWVhcn0sICRBcHBvaW50bWVudHtTdGFydFdlZWtEYXl9CiAgICAgICAgICAgICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSApOwoKICAgICAgICAgICAgIyBnZXQgZW5kIHRpbWUgY29tcG9uZW50cwogICAgICAgICAgICBteSAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7RW5kVGltZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGVuZCB0aW1lcyBmb3IgYWxsIGRheSBhcHBvaW50bWVudHMgYXJlIGluY2x1c2l2ZSwgc3VidHJhY3Qgd2hvbGUgZGF5CiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e0FsbERheX0gKSB7CiAgICAgICAgICAgICAgICAkRW5kVGltZSAtPSA4NjQwMDsKICAgICAgICAgICAgICAgIGlmICggJEVuZFRpbWUgPCAkU3RhcnRUaW1lICkgewogICAgICAgICAgICAgICAgICAgICRFbmRUaW1lID0gJFN0YXJ0VGltZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgbXkgJEVuZFNlY29uZCwgJEFwcG9pbnRtZW50e0VuZE1pbnV0ZX0sICRBcHBvaW50bWVudHtFbmRIb3VyfSwgJEFwcG9pbnRtZW50e0VuZERheX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kTW9udGh9LCAkQXBwb2ludG1lbnR7RW5kWWVhcn0KICAgICAgICAgICAgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCggU3lzdGVtVGltZSA9PiAkRW5kVGltZSApOwoKICAgICAgICAgICAgIyBnZXQgcmVjdXJyZW5jZSB1bnRpbCBjb21wb25lbnRzCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbH0gKSB7CiAgICAgICAgICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWxTZWNvbmQsICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWxNaW51dGV9LCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsSG91cn0sCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbERheX0sICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWxNb250aH0sCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbFllYXJ9CiAgICAgICAgICAgICAgICApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KCBTeXN0ZW1UaW1lID0+ICRSZWN1cnJlbmNlVW50aWwgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZWNhbGN1bGF0ZSB5ZWFyIGJvdW5kYXJpZXMKICAgICAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKHF3KFN0YXJ0IEVuZCBSZWN1cnJlbmNlVW50aWwpKSB7CiAgICAgICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHsiJHtGaWVsZH1ZZWFyIn0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJERpZmYgPSAkQXBwb2ludG1lbnR7IiR7RmllbGR9WWVhciJ9IC0gJFllYXI7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGlmZiA+IDAgJiYgYWJzICREaWZmID4gJFllYXJQZXJpb2RGdXR1cmV7JEZpZWxkfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFllYXJQZXJpb2RGdXR1cmV7JEZpZWxkfSA9IGFicyAkRGlmZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRGlmZiA8IDAgJiYgYWJzICREaWZmID4gJFllYXJQZXJpb2RQYXN0eyRGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRZZWFyUGVyaW9kUGFzdHskRmllbGR9ID0gYWJzICREaWZmOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyaW5nfSApIHsKICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVHlwZSA9ICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gfHwgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfTsKCiAgICAgICAgICAgICAgICBpZiAoICRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tV2Vla2x5JyApIHsKCiAgICAgICAgICAgICAgICAgICAgbXkgJERheU9mZnNldCA9ICRTZWxmLT5fRGF5T2Zmc2V0R2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lID0+ICRBcHBvaW50bWVudHtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17RGF5c30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0RheXN9ID0gJEdldFBhcmFte0RheXN9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQERheXMgPSBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGlzcGxheSBzZWxlY3RlZCBkYXlzIGFjY29yZGluZyB0byB1c2VyIHRpbWV6b25lCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkRGF5T2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJERheSAoQERheXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF5ICs9ICREYXlPZmZzZXQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJERheSA9PSA4ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF5ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtEYXlzfSA9IGpvaW4oICIsIiwgQERheXMgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tTW9udGhseScgKSB7CgogICAgICAgICAgICAgICAgICAgIG15ICREYXlPZmZzZXQgPSAkU2VsZi0+X0RheU9mZnNldEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte01vbnRoRGF5c30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoRGF5c30gPSAkR2V0UGFyYW17TW9udGhEYXlzfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBNb250aERheXMgPSBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGlzcGxheSBzZWxlY3RlZCBkYXlzIGFjY29yZGluZyB0byB1c2VyIHRpbWV6b25lCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkRGF5T2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE1vbnRoRGF5IChATW9udGhEYXlzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE1vbnRoRGF5ICs9ICREYXlPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE1vbnRoRGF5ID0gMSBpZiAkRGF5ID09IDMyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtNb250aERheXN9ID0gam9pbiggIiwiLCBATW9udGhEYXlzICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUmVjdXJyZW5jZVR5cGUgZXEgJ0N1c3RvbVllYXJseScgKSB7CgogICAgICAgICAgICAgICAgICAgIG15ICREYXlPZmZzZXQgPSAkU2VsZi0+X0RheU9mZnNldEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte01vbnRoc30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoc30gPSAkR2V0UGFyYW17TW9udGhzfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBNb250aHMgPSBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoc30gPSBqb2luKCAiLCIsIEBNb250aHMgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ2hlY2sgaWYgZGVhbGluZyB3aXRoIHRpY2tldCBhcHBvaW50bWVudC4KICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldElEfSA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRUaWNrZXRJRCgKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJFJ1bGUgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50UnVsZUdldCgKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICBSdWxlSUQgICAgID0+ICRBcHBvaW50bWVudHtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgR2V0IGRhdGUgdHlwZXMgZnJvbSB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUuCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRSdWxlKSApIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFN0YXJ0RGF0ZSBFbmREYXRlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUnVsZS0+eyRUeXBlfSBlcSAnRmlyc3RSZXNwb25zZVRpbWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkUnVsZS0+eyRUeXBlfSBlcSAnVXBkYXRlVGltZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRSdWxlLT57JFR5cGV9IGVxICdTb2x1dGlvblRpbWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWFkT25seVN0YXJ0fSAgICA9IDEgaWYgJFR5cGUgZXEgJ1N0YXJ0RGF0ZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVhZE9ubHlEdXJhdGlvbn0gPSAxIGlmICRUeXBlIGVxICdFbmREYXRlJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRSdWxlLT57JFR5cGV9ID1+IC9eUGx1c19bMC05XSskLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWFkT25seUR1cmF0aW9ufSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlbGVjdGVkIHRpbWVzdGFtcAogICAgICAgIG15ICRTZWxlY3RlZFRpbWVzdGFtcCA9IHNwcmludGYoCiAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAwMDowMDowMCIsCiAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydFllYXJ9ICAvLyAkR2V0UGFyYW17U3RhcnRZZWFyfSwKICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0TW9udGh9IC8vICRHZXRQYXJhbXtTdGFydE1vbnRofSwKICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0RGF5fSAgIC8vICRHZXRQYXJhbXtTdGFydERheX0KICAgICAgICApOwoKICAgICAgICAjIGdldCBjdXJyZW50IGRheQogICAgICAgIG15ICRTZWxlY3RlZFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkU2VsZWN0ZWRUaW1lc3RhbXAsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQERhdGVJbmZvID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxlY3RlZFN5c3RlbVRpbWUsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgd2VlayBkYXkgaWYgbm90IHNldAogICAgICAgIGlmICggISRBcHBvaW50bWVudHtEYXlzfSApIHsKICAgICAgICAgICAgJEFwcG9pbnRtZW50e0RheXN9ID0gJERhdGVJbmZvWzZdOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbW9udGggZGF5IGlmIG5vdCBzZXQKICAgICAgICBpZiAoICEkQXBwb2ludG1lbnR7TW9udGhEYXlzfSApIHsKICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoRGF5c30gPSAkRGF0ZUluZm9bM107CiAgICAgICAgfQoKICAgICAgICAjIHNldCBtb250aCBpZiBub3Qgc2V0CiAgICAgICAgaWYgKCAhJEFwcG9pbnRtZW50e01vbnRoc30gKSB7CiAgICAgICAgICAgICRBcHBvaW50bWVudHtNb250aHN9ID0gJERhdGVJbmZvWzRdOwogICAgICAgIH0KCiAgICAgICAgIyBjYWxlbmRhciBJRCBzZWxlY3Rpb24KICAgICAgICBteSAkQ2FsZW5kYXJJRCA9ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSAvLyAkR2V0UGFyYW17Q2FsZW5kYXJJRH07CgogICAgICAgICMgY2FsZW5kYXIgbmFtZQogICAgICAgIGlmICgkQ2FsZW5kYXJJRCkgewogICAgICAgICAgICAkUGFyYW17Q2FsZW5kYXJOYW1lfSA9ICRDYWxlbmRhckxvb2t1cHskQ2FsZW5kYXJJRH07CiAgICAgICAgfQoKICAgICAgICAjIGNhbGVuZGFyIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtDYWxlbmRhcklEU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxAQ2FsZW5kYXJEYXRhLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJENhbGVuZGFySUQsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2FsZW5kYXJJRCcsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgYWxsIGRheQogICAgICAgIGlmICgKICAgICAgICAgICAgJEdldFBhcmFte0FsbERheX0gfHwKICAgICAgICAgICAgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gJiYgJEFwcG9pbnRtZW50e0FsbERheX0gKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17QWxsRGF5U3RyaW5nfSAgPSBUcmFuc2xhdGFibGUoJ1llcycpOwogICAgICAgICAgICAkUGFyYW17QWxsRGF5Q2hlY2tlZH0gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwoKICAgICAgICAgICAgIyBzdGFydCBkYXRlCiAgICAgICAgICAgICRQYXJhbXtTdGFydERhdGV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCIsCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRZZWFyfSAgLy8gJEdldFBhcmFte1N0YXJ0WWVhcn0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRNb250aH0gLy8gJEdldFBhcmFte1N0YXJ0TW9udGh9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0RGF5fSAgIC8vICRHZXRQYXJhbXtTdGFydERheX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGVuZCBkYXRlCiAgICAgICAgICAgICRQYXJhbXtFbmREYXRlfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQiLAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZFllYXJ9ICAvLyAkR2V0UGFyYW17RW5kWWVhcn0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kTW9udGh9IC8vICRHZXRQYXJhbXtFbmRNb250aH0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kRGF5fSAgIC8vICRHZXRQYXJhbXtFbmREYXl9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte0FsbERheVN0cmluZ30gID0gVHJhbnNsYXRhYmxlKCdObycpOwogICAgICAgICAgICAkUGFyYW17QWxsRGF5Q2hlY2tlZH0gPSAnJzsKCiAgICAgICAgICAgICMgc3RhcnQgZGF0ZQogICAgICAgICAgICAkUGFyYW17U3RhcnREYXRlfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjAwIiwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydFllYXJ9ICAgLy8gJEdldFBhcmFte1N0YXJ0WWVhcn0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRNb250aH0gIC8vICRHZXRQYXJhbXtTdGFydE1vbnRofSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydERheX0gICAgLy8gJEdldFBhcmFte1N0YXJ0RGF5fSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydEhvdXJ9ICAgLy8gJEdldFBhcmFte1N0YXJ0SG91cn0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRNaW51dGV9IC8vICRHZXRQYXJhbXtTdGFydE1pbnV0ZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGVuZCBkYXRlCiAgICAgICAgICAgICRQYXJhbXtFbmREYXRlfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjAwIiwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmRZZWFyfSAgIC8vICRHZXRQYXJhbXtFbmRZZWFyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmRNb250aH0gIC8vICRHZXRQYXJhbXtFbmRNb250aH0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kRGF5fSAgICAvLyAkR2V0UGFyYW17RW5kRGF5fSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmRIb3VyfSAgIC8vICRHZXRQYXJhbXtFbmRIb3VyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmRNaW51dGV9IC8vICRHZXRQYXJhbXtFbmRNaW51dGV9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzdGFydCBkYXRlIHN0cmluZwogICAgICAgICRQYXJhbXtTdGFydERhdGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgICAgID0+ICdTdGFydCcsCiAgICAgICAgICAgIFN0YXJ0SG91ciAgICAgICAgICAgICAgICA9PiAkQXBwb2ludG1lbnR7U3RhcnRIb3VyfSAvLyAkR2V0UGFyYW17U3RhcnRIb3VyfSwKICAgICAgICAgICAgU3RhcnRNaW51dGUgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtTdGFydE1pbnV0ZX0gLy8gJEdldFBhcmFte1N0YXJ0TWludXRlfSwKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgVmFsaWRhdGVEYXRlQmVmb3JlUHJlZml4ID0+ICdFbmQnLAogICAgICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgICAgID0+ICRZZWFyUGVyaW9kUGFzdHtTdGFydH0sCiAgICAgICAgICAgIFllYXJQZXJpb2RGdXR1cmUgICAgICAgICA9PiAkWWVhclBlcmlvZEZ1dHVyZXtTdGFydH0sCiAgICAgICAgICAgIE92ZXJyaWRlVGltZVpvbmUgICAgICAgICA9PiAkT3ZlcnJpZGVUaW1lWm9uZSwKICAgICAgICApOwoKICAgICAgICAjIGVuZCBkYXRlIHN0cmluZwogICAgICAgICRQYXJhbXtFbmREYXRlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQXBwb2ludG1lbnQsCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgICAgICAgID0+ICdFbmQnLAogICAgICAgICAgICBFbmRIb3VyICAgICAgICAgICAgICAgICA9PiAkQXBwb2ludG1lbnR7RW5kSG91cn0gLy8gJEdldFBhcmFte0VuZEhvdXJ9LAogICAgICAgICAgICBFbmRNaW51dGUgICAgICAgICAgICAgICA9PiAkQXBwb2ludG1lbnR7RW5kTWludXRlfSAvLyAkR2V0UGFyYW17RW5kTWludXRlfSwKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBWYWxpZGF0ZURhdGVBZnRlclByZWZpeCA9PiAnU3RhcnQnLAogICAgICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBZZWFyUGVyaW9kUGFzdCAgICAgICAgICA9PiAkWWVhclBlcmlvZFBhc3R7RW5kfSwKICAgICAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgICAgPT4gJFllYXJQZXJpb2RGdXR1cmV7RW5kfSwKICAgICAgICAgICAgT3ZlcnJpZGVUaW1lWm9uZSAgICAgICAgPT4gJE92ZXJyaWRlVGltZVpvbmUsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbWFpbiBvYmplY3QKICAgICAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgICAgICMgY2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZAogICAgICAgIGlmICggJE1haW5PYmplY3QtPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewoKICAgICAgICAgICAgbXkgJFRlYW1JRHMgPSAkQXBwb2ludG1lbnR7VGVhbUlEfTsKICAgICAgICAgICAgaWYgKCAhJFRlYW1JRHMgKSB7CiAgICAgICAgICAgICAgICBteSBAVGVhbUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdUZWFtSURbXScgKTsKICAgICAgICAgICAgICAgICRUZWFtSURzID0gXEBUZWFtSURzOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkUmVzb3VyY2VJRHMgPSAkQXBwb2ludG1lbnR7UmVzb3VyY2VJRH07CiAgICAgICAgICAgIGlmICggISRSZXNvdXJjZUlEcyApIHsKICAgICAgICAgICAgICAgIG15IEBSZXNvdXJjZUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdSZXNvdXJjZUlEW10nICk7CiAgICAgICAgICAgICAgICAkUmVzb3VyY2VJRHMgPSBcQFJlc291cmNlSURzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgICAgICBteSAkVGVhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScpOwogICAgICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICAgICAjIGdldCBhbGxvd2VkIHRlYW0gbGlzdCBmb3IgY3VycmVudCB1c2VyCiAgICAgICAgICAgIG15ICVUZWFtTGlzdCA9ICRUZWFtT2JqZWN0LT5BbGxvd2VkVGVhbUxpc3QoCiAgICAgICAgICAgICAgICBQcmV2ZW50RW1wdHkgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHRlYW0gbmFtZXMKICAgICAgICAgICAgbXkgQFRlYW1OYW1lczsKICAgICAgICAgICAgZm9yIG15ICRUZWFtSUQgKCBAeyRUZWFtSURzfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFRlYW1OYW1lcywgJFRlYW1MaXN0eyRUZWFtSUR9IGlmICRUZWFtTGlzdHskVGVhbUlEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHNjYWxhciBAVGVhbU5hbWVzICkgewogICAgICAgICAgICAgICAgJFBhcmFte1RlYW1OYW1lc30gPSBqb2luKCAnPGJyPicsIEBUZWFtTmFtZXMgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtUZWFtTmFtZXN9ID0gJFNlbGYtPntFbXB0eVN0cmluZ307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGVhbSBsaXN0IHN0cmluZwogICAgICAgICAgICAkUGFyYW17VGVhbUlEU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVRlYW1MaXN0LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZWFtSURzLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUZWFtSUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaXRlcmF0ZSB0aHJvdWdoIHNlbGVjdGVkIHRlYW1zCiAgICAgICAgICAgIG15ICVUZWFtVXNlckxpc3RBbGw7CiAgICAgICAgICAgIFRFQU1JRDoKICAgICAgICAgICAgZm9yIG15ICRUZWFtSUQgKCBAeyRUZWFtSURzfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVEVBTUlEIGlmICEkVGVhbUlEOwoKICAgICAgICAgICAgICAgICMgZ2V0IGxpc3Qgb2YgdGVhbSBtZW1iZXJzCiAgICAgICAgICAgICAgICBteSAlVGVhbVVzZXJMaXN0ID0gJFRlYW1PYmplY3QtPlRlYW1Vc2VyTGlzdCgKICAgICAgICAgICAgICAgICAgICBUZWFtSUQgPT4gJFRlYW1JRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVUZWFtVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFRlYW1Vc2VyTGlzdHskVXNlcklEfSA9ICRVc2Vye1VzZXJGdWxsbmFtZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJVRlYW1Vc2VyTGlzdEFsbCA9ICggJVRlYW1Vc2VyTGlzdEFsbCwgJVRlYW1Vc2VyTGlzdCApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlc291cmNlIG5hbWVzCiAgICAgICAgICAgIG15IEBSZXNvdXJjZU5hbWVzOwogICAgICAgICAgICBmb3IgbXkgJFJlc291cmNlSUQgKCBAeyRSZXNvdXJjZUlEc30gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBSZXNvdXJjZU5hbWVzLCAkVGVhbVVzZXJMaXN0QWxseyRSZXNvdXJjZUlEfSBpZiAkVGVhbVVzZXJMaXN0QWxseyRSZXNvdXJjZUlEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHNjYWxhciBAUmVzb3VyY2VOYW1lcyApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXNvdXJjZU5hbWVzfSA9IGpvaW4oICc8YnI+JywgQFJlc291cmNlTmFtZXMgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXNvdXJjZU5hbWVzfSA9ICRTZWxmLT57RW1wdHlTdHJpbmd9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRlYW0gdXNlciBsaXN0IHN0cmluZwogICAgICAgICAgICAkUGFyYW17UmVzb3VyY2VJRFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVUZWFtVXNlckxpc3RBbGwsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFJlc291cmNlSURzLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdSZXNvdXJjZUlEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSAgICAgICA9IDA7CiAgICAgICAgbXkgJFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGUgPSAnQ3VzdG9tRGFpbHknOyAgICAjIGRlZmF1bHQKCiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyaW5nfSApIHsKCiAgICAgICAgICAgICMgZnJvbSBhcHBvaW50bWVudAogICAgICAgICAgICAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSA9ICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gfHwgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfTsKICAgICAgICAgICAgaWYgKCAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSA9fiAvQ3VzdG9tLyApIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFJlY3VycmVuY2VDdXN0b21UeXBlID0gJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGU7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSAgICAgICA9ICdDdXN0b20nOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY3VycmVuY2UgdHlwZQogICAgICAgIG15IEBSZWN1cnJlbmNlVHlwZXMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICcwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnTmV2ZXInKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0RhaWx5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnRXZlcnkgRGF5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdXZWVrbHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdFdmVyeSBXZWVrJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdNb250aGx5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnRXZlcnkgTW9udGgnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1llYXJseScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0V2ZXJ5IFllYXInKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0N1c3RvbScpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJVJlY3VycmVuY2VUeXBlTG9va3VwID0gbWFwIHsKICAgICAgICAgICAgJF8tPntLZXl9ID0+ICRfLT57VmFsdWV9CiAgICAgICAgfSBAUmVjdXJyZW5jZVR5cGVzOwogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAkUmVjdXJyZW5jZVR5cGVMb29rdXB7JFNlbGVjdGVkUmVjdXJyZW5jZVR5cGV9LAogICAgICAgICk7CgogICAgICAgICMgcmVjdXJyZW5jZSB0eXBlIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVHlwZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxAUmVjdXJyZW5jZVR5cGVzLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGUsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnUmVjdXJyZW5jZVR5cGUnLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHJlY3VycmVuY2UgY3VzdG9tIHR5cGUKICAgICAgICBteSBAUmVjdXJyZW5jZUN1c3RvbVR5cGVzID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tRGFpbHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdEYWlseScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tV2Vla2x5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnV2Vla2x5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21Nb250aGx5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnTW9udGhseScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tWWVhcmx5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnWWVhcmx5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAlUmVjdXJyZW5jZUN1c3RvbVR5cGVMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBSZWN1cnJlbmNlQ3VzdG9tVHlwZXM7CiAgICAgICAgbXkgJFJlY3VycmVuY2VDdXN0b21UeXBlID0gJFJlY3VycmVuY2VDdXN0b21UeXBlTG9va3VweyRTZWxlY3RlZFJlY3VycmVuY2VDdXN0b21UeXBlfTsKICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVZhbHVlfSAuPSAnLCAnIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICBsYyAkUmVjdXJyZW5jZUN1c3RvbVR5cGUsCiAgICAgICAgKSBpZiAkUmVjdXJyZW5jZUN1c3RvbVR5cGUgJiYgJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGUgZXEgJ0N1c3RvbSc7CgogICAgICAgICMgcmVjdXJyZW5jZSBjdXN0b20gdHlwZSBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17UmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXEBSZWN1cnJlbmNlQ3VzdG9tVHlwZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGUsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1JlY3VycmVuY2VDdXN0b21UeXBlJywKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAjIHJlY3VycmVuY2UgaW50ZXJ2YWwKICAgICAgICBteSAkU2VsZWN0ZWRJbnRlcnZhbCA9ICRHZXRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9IHx8ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSW50ZXJ2YWx9IHx8IDE7CiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUludGVydmFsfSApIHsKICAgICAgICAgICAgbXkgJVJlY3VycmVuY2VJbnRlcnZhbExvb2t1cCA9ICgKICAgICAgICAgICAgICAgICdDdXN0b21EYWlseScgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdkYXkocyknLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICdDdXN0b21XZWVrbHknID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnd2VlayhzKScsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJ0N1c3RvbU1vbnRobHknID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnbW9udGgocyknLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICdDdXN0b21ZZWFybHknID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAneWVhcihzKScsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkUmVjdXJyZW5jZUN1c3RvbVR5cGUgJiYgJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGUgZXEgJ0N1c3RvbScgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVZhbHVlfSAuPSAnLCAnCiAgICAgICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2V2ZXJ5JykKICAgICAgICAgICAgICAgICAgICAuICcgJyAuICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSW50ZXJ2YWx9IC4gJyAnCiAgICAgICAgICAgICAgICAgICAgLiAkUmVjdXJyZW5jZUludGVydmFsTG9va3VweyRTZWxlY3RlZFJlY3VycmVuY2VDdXN0b21UeXBlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgaW50ZXJ2YWwgc2VsZWN0aW9uICgxLTMxKQogICAgICAgIG15IEBSZWN1cnJlbmNlQ3VzdG9tSW50ZXJ2YWw7CiAgICAgICAgZm9yICggbXkgJERheU51bWJlciA9IDE7ICREYXlOdW1iZXIgPCAzMjsgJERheU51bWJlcisrICkgewogICAgICAgICAgICBwdXNoIEBSZWN1cnJlbmNlQ3VzdG9tSW50ZXJ2YWwsIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICREYXlOdW1iZXIsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkRGF5TnVtYmVyLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAkUGFyYW17UmVjdXJyZW5jZUludGVydmFsU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFxAUmVjdXJyZW5jZUN1c3RvbUludGVydmFsLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRTZWxlY3RlZEludGVydmFsLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdSZWN1cnJlbmNlSW50ZXJ2YWwnLAogICAgICAgICk7CgogICAgICAgICMgcmVjdXJyZW5jZSBsaW1pdAogICAgICAgIG15ICRSZWN1cnJlbmNlTGltaXQgPSAxOwogICAgICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VDb3VudH0gKSB7CiAgICAgICAgICAgICRSZWN1cnJlbmNlTGltaXQgPSAyOwoKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFJlY3VycmVuY2VUeXBlKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVZhbHVlfSAuPSAnLCAnIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdmb3IgJXMgdGltZShzKScsICRBcHBvaW50bWVudHtSZWN1cnJlbmNlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWN1cnJlbmNlIGxpbWl0IHN0cmluZwogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlTGltaXRTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCd1bnRpbCAuLi4nKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gMiwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ2ZvciAuLi4gdGltZShzKScpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRSZWN1cnJlbmNlTGltaXQsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnUmVjdXJyZW5jZUxpbWl0JywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbERpZmZUaW1lID0gMDsKICAgICAgICBpZiAoICEkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGN1cnJlbnQgYW5kIHN0YXJ0IHRpbWUgZm9yIGRpZmZlcmVuY2UKICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgIG15ICRTdGFydFRpbWUgID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICBZZWFyICAgPT4gJEFwcG9pbnRtZW50e1N0YXJ0WWVhcn0gICAvLyAkR2V0UGFyYW17U3RhcnRZZWFyfSwKICAgICAgICAgICAgICAgIE1vbnRoICA9PiAkQXBwb2ludG1lbnR7U3RhcnRNb250aH0gIC8vICRHZXRQYXJhbXtTdGFydE1vbnRofSwKICAgICAgICAgICAgICAgIERheSAgICA9PiAkQXBwb2ludG1lbnR7U3RhcnREYXl9ICAgIC8vICRHZXRQYXJhbXtTdGFydERheX0sCiAgICAgICAgICAgICAgICBIb3VyICAgPT4gJEFwcG9pbnRtZW50e1N0YXJ0SG91cn0gICAvLyAkR2V0UGFyYW17U3RhcnRIb3VyfSwKICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiAkQXBwb2ludG1lbnR7U3RhcnRNaW51dGV9IC8vICRHZXRQYXJhbXtTdGFydE1pbnV0ZX0sCiAgICAgICAgICAgICAgICBTZWNvbmQgPT4gMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFJlY3VycmVuY2VVbnRpbERpZmZUaW1lID0gJFN0YXJ0VGltZSAtICRTeXN0ZW1UaW1lICsgNjAgKiA2MCAqIDI0ICogMzsgICAgIyBzdGFydCArMyBkYXlzCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQiLAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbFllYXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbE1vbnRofSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWxEYXl9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFJlY3VycmVuY2VUeXBlKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVZhbHVlfSAuPSAnLCAnIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICd1bnRpbCAlcycsICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWN1cnJlbmNlIHVudGlsIGRhdGUgc3RyaW5nCiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VVbnRpbFN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICAgICA9PiAnUmVjdXJyZW5jZVVudGlsJywKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsCiAgICAgICAgICAgIERpZmZUaW1lICAgICAgICAgICAgICAgID0+ICRSZWN1cnJlbmNlVW50aWxEaWZmVGltZSwKICAgICAgICAgICAgVmFsaWRhdGVEYXRlQWZ0ZXJQcmVmaXggPT4gJ1N0YXJ0JywKICAgICAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgICAgPT4gJFllYXJQZXJpb2RQYXN0e1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgIFllYXJQZXJpb2RGdXR1cmUgICAgICAgID0+ICRZZWFyUGVyaW9kRnV0dXJle1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgIE92ZXJyaWRlVGltZVpvbmUgICAgICAgID0+ICRPdmVycmlkZVRpbWVab25lLAogICAgICAgICk7CgogICAgICAgICMgbm90aWZpY2F0aW9uIHRlbXBsYXRlCiAgICAgICAgbXkgQE5vdGlmaWNhdGlvblRlbXBsYXRlcyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyBub3RpZmljYXRpb24nKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIG1pbnV0ZShzKSBiZWZvcmUnLCAwICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICczMDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgbWludXRlKHMpIGJlZm9yZScsIDUgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzkwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBtaW51dGUocykgYmVmb3JlJywgMTUgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzE4MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgbWludXRlKHMpIGJlZm9yZScsIDMwICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICczNjAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGhvdXIocykgYmVmb3JlJywgMSApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnNzIwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBob3VyKHMpIGJlZm9yZScsIDIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzQzMjAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGhvdXIocykgYmVmb3JlJywgMTIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzg2NDAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGRheShzKSBiZWZvcmUnLCAxICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICcxNzI4MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgZGF5KHMpIGJlZm9yZScsIDIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzYwNDgwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyB3ZWVrIGJlZm9yZScsIDEgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0N1c3RvbScpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJU5vdGlmaWNhdGlvblRlbXBsYXRlTG9va3VwID0gbWFwIHsKICAgICAgICAgICAgJF8tPntLZXl9ID0+ICRfLT57VmFsdWV9CiAgICAgICAgfSBATm90aWZpY2F0aW9uVGVtcGxhdGVzOwogICAgICAgIG15ICRTZWxlY3RlZE5vdGlmaWNhdGlvblRlbXBsYXRlID0gJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvblRlbXBsYXRlfSB8fCAnMCc7CiAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvblZhbHVlfSA9ICROb3RpZmljYXRpb25UZW1wbGF0ZUxvb2t1cHskU2VsZWN0ZWROb3RpZmljYXRpb25UZW1wbGF0ZX07CgogICAgICAgICMgbm90aWZpY2F0aW9uIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBOb3RpZmljYXRpb25UZW1wbGF0ZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWROb3RpZmljYXRpb25UZW1wbGF0ZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOb3RpZmljYXRpb25UZW1wbGF0ZScsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSB1bml0cwogICAgICAgIG15IEBOb3RpZmljYXRpb25DdXN0b21Vbml0cyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdtaW51dGUocyknKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnaG91cihzKScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnZGF5cycsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2RheShzKScpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJU5vdGlmaWNhdGlvbkN1c3RvbVVuaXRMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBOb3RpZmljYXRpb25DdXN0b21Vbml0czsKICAgICAgICBteSAkU2VsZWN0ZWROb3RpZmljYXRpb25DdXN0b21Vbml0ID0gJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0gfHwgJ21pbnV0ZXMnOwoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gdW5pdHMgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVVuaXRzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxATm90aWZpY2F0aW9uQ3VzdG9tVW5pdHMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWROb3RpZmljYXRpb25DdXN0b21Vbml0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCcsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSB1bml0cyBwb2ludCBvZiB0aW1lCiAgICAgICAgbXkgQE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzUG9pbnRPZlRpbWUgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcycpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gZW5kZWQnKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICVOb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWVMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBOb3RpZmljYXRpb25DdXN0b21Vbml0c1BvaW50T2ZUaW1lOwogICAgICAgIG15ICRTZWxlY3RlZE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRQb2ludE9mVGltZSA9ICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfQogICAgICAgICAgICB8fCAnYmVmb3Jlc3RhcnQnOwoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gdW5pdHMgcG9pbnQgb2YgdGltZSBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tVW5pdHNQb2ludE9mVGltZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzUG9pbnRPZlRpbWUsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWROb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWUsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZScsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZGF0ZSB1bml0cyBmb3IgdGhlIGN1c3RvbSBkYXRlIHNlbGVjdGlvbgogICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKTsKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0gKSB7CgogICAgICAgICAgICAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gZGF0ZSBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVZZWFyICAgPT4gJFllYXIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGggID0+ICRNb250aCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVEYXkgICAgPT4gJERheSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyICAgPT4gJEhvdXIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlID0+ICRNaW51dGUsCiAgICAgICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgICAgICAgICAgICAgPT4gJFllYXJQZXJpb2RQYXN0e1N0YXJ0fSwKICAgICAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgICAgICAgICAgICAgPT4gJFllYXJQZXJpb2RGdXR1cmV7U3RhcnR9LAogICAgICAgICk7CgogICAgICAgICMgcHJlcGFyZSByYWRpbyBidXR0b24gZm9yIGN1c3RvbSBkYXRlIHRpbWUgYW5kIHJlbGF0aXZlIGlucHV0CiAgICAgICAgJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbX0gfHw9ICcnOwoKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b219IGVxICdkYXRldGltZScgKSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0UmFkaW99ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b219IGVxICdyZWxhdGl2ZScgKSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0UmFkaW99ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0UmFkaW99ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSBzdHJpbmcgdmFsdWUKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b219IGVxICdkYXRldGltZScgKSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25WYWx1ZX0gLj0gJywgJyAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXQnCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbX0gZXEgJ3JlbGF0aXZlJyApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0KICAgICAgICAgICAgICAgICYmICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9IHx8PSAwOwogICAgICAgICAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvblZhbHVlfSAuPSAnLCAnCiAgICAgICAgICAgICAgICAgICAgLiAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9CiAgICAgICAgICAgICAgICAgICAgLiAnICcKICAgICAgICAgICAgICAgICAgICAuICROb3RpZmljYXRpb25DdXN0b21Vbml0TG9va3VweyRTZWxlY3RlZE5vdGlmaWNhdGlvbkN1c3RvbVVuaXR9CiAgICAgICAgICAgICAgICAgICAgLiAnICcKICAgICAgICAgICAgICAgICAgICAuICROb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWVMb29rdXB7JFNlbGVjdGVkTm90aWZpY2F0aW9uQ3VzdG9tVW5pdFBvaW50T2ZUaW1lfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGx1Z2luIGxpc3QKICAgICAgICAkUGFyYW17UGx1Z2luTGlzdH0gPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaXN0KCk7CgogICAgICAgICMgbmV3IGFwcG9pbnRtZW50IHBsdWdpbiBzZWFyY2gKICAgICAgICBpZiAoICRHZXRQYXJhbXtQbHVnaW5LZXl9ICYmICggJEdldFBhcmFte1NlYXJjaH0gfHwgJEdldFBhcmFte09iamVjdElEfSApICkgewoKICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJEdldFBhcmFte1BsdWdpbktleX0gfSBrZXlzICV7ICRQYXJhbXtQbHVnaW5MaXN0fSB9ICkgewoKICAgICAgICAgICAgICAgICMgc2VhcmNoIHVzaW5nIHBsdWdpbgogICAgICAgICAgICAgICAgbXkgJFJlc3VsdExpc3QgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5TZWFyY2goCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRQYXJhbXtQbHVnaW5EYXRhfS0+eyAkR2V0UGFyYW17UGx1Z2luS2V5fSB9ID0gW107CiAgICAgICAgICAgICAgICBteSBATGlua0FycmF5ID0gc29ydCBrZXlzICV7JFJlc3VsdExpc3R9OwoKICAgICAgICAgICAgICAgICMgYWRkIHBvc3NpYmxlIGxpbmtzCiAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmtJRCAoQExpbmtBcnJheSkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte1BsdWdpbkRhdGF9LT57ICRHZXRQYXJhbXtQbHVnaW5LZXl9IH0gfSwgewogICAgICAgICAgICAgICAgICAgICAgICBMaW5rSUQgICA9PiAkTGlua0lELAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rTmFtZSA9PiAkUmVzdWx0TGlzdC0+eyRMaW5rSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rVVJMICA9PiBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1BsdWdpbkxpc3R9LT57ICRHZXRQYXJhbXtQbHVnaW5LZXl9IH0tPntQbHVnaW5VUkx9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJExpbmtJRAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFBhcmFte1BsdWdpbkxpc3R9LT57ICRHZXRQYXJhbXtQbHVnaW5LZXl9IH0tPntMaW5rTGlzdH0gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXEBMaW5rQXJyYXksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGVkaXQgYXBwb2ludG1lbnQgcGx1Z2luIGxpbmtzCiAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CgogICAgICAgICAgICBmb3IgbXkgJFBsdWdpbktleSAoIHNvcnQga2V5cyAleyAkUGFyYW17UGx1Z2luTGlzdH0gfSApIHsKICAgICAgICAgICAgICAgIG15ICRMaW5rTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtMaXN0KAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSBATGlua0FycmF5OwoKICAgICAgICAgICAgICAgICRQYXJhbXtQbHVnaW5EYXRhfS0+eyRQbHVnaW5LZXl9ID0gW107CiAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmtJRCAoIHNvcnQga2V5cyAleyRMaW5rTGlzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17UGx1Z2luRGF0YX0tPnskUGx1Z2luS2V5fSB9LCAkTGlua0xpc3QtPnskTGlua0lEfTsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBMaW5rQXJyYXksICRMaW5rTGlzdC0+eyRMaW5rSUR9LT57TGlua0lEfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUGFyYW17UGx1Z2luTGlzdH0tPnskUGx1Z2luS2V5fS0+e0xpbmtMaXN0fSA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcQExpbmtBcnJheSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaHRtbCBtYXNrIG91dHB1dAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFZGl0TWFzaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgUGVybWlzc2lvbkxldmVsID0+ICRQZXJtaXNzaW9uTGV2ZWx7JFBlcm1pc3Npb25zfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCByZWdpc3RlcmVkIGxvY2F0aW9uIGxpbmtzCiAgICAgICAgbXkgJExvY2F0aW9uTGlua0NvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnQWdlbnRBcHBvaW50bWVudEVkaXQ6OkxvY2F0aW9uOjpMaW5rJykgLy8ge307CiAgICAgICAgZm9yIG15ICRDb25maWdLZXkgKCBzb3J0IGtleXMgJXskTG9jYXRpb25MaW5rQ29uZmlnfSApIHsKCiAgICAgICAgICAgICMgc2hvdyBsaW5rIGljb24KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMb2NhdGlvbkxpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTG9jYXRpb24gPT4gJEFwcG9pbnRtZW50e0xvY2F0aW9ufSAvLyAnJywKICAgICAgICAgICAgICAgICAgICAleyAkTG9jYXRpb25MaW5rQ29uZmlnLT57JENvbmZpZ0tleX0gfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRhdGVwaWNrZXIgaW5pdGlhbGl6YXRpb24KICAgICAgICAjIG9ubHkgaWYgdXNlciBoYXMgcGVybWlzc2lvbnMgbW92ZV9pbnRvIGFuZCBhYm92ZQogICAgICAgIGlmICggJFBlcm1pc3Npb25zICYmICggJFBlcm1pc3Npb25MZXZlbHskUGVybWlzc2lvbnN9IDwgMiApID8gMCA6IDEgKSB7CgogICAgICAgICAgICAjIGdldCB0ZXh0IGRpcmVjdGlvbgogICAgICAgICAgICBteSAkVGV4dERpcmVjdGlvbiA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPntUZXh0RGlyZWN0aW9ufSB8fCAnJzsKCiAgICAgICAgICAgICMgZ2V0IHZhY2F0aW9uIGRheXMKICAgICAgICAgICAgbXkgJFZhY2F0aW9uRGF5c0pTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiAkTGF5b3V0T2JqZWN0LT5EYXRlcGlja2VyR2V0VmFjYXRpb25EYXlzKCksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBmaXJzdCBkYXkgb2YgdGhlIHdlZWsKICAgICAgICAgICAgbXkgJFdlZWtEYXlTdGFydCA9ICRDb25maWdPYmplY3QtPkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKSB8fCAxOwoKICAgICAgICAgICAgIyBzb21lIGdlbmVyYWwgZGF0ZXBpY2tlciBjb2RlCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRGF0ZXBpY2tlckRhdGEnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFjYXRpb25EYXlzICA9PiAkVmFjYXRpb25EYXlzSlNPTiwKICAgICAgICAgICAgICAgICAgICBJc1JUTExhbmd1YWdlID0+ICggJFRleHREaXJlY3Rpb24gZXEgJ3J0bCcgKSA/IDEgOiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaW5pdGlhbGl6ZSBkYXRlcGlja2VycyBmb3IgZGlmZmVyZW50IGRhdGUgZmllbGRzCiAgICAgICAgICAgIGZvciBteSAkUHJlZml4IChxdyhTdGFydCBFbmQgUmVjdXJyZW5jZVVudGlsIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lKSkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRGF0ZXBpY2tlckluaXQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcmVmaXggICAgICAgPT4gJFByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgV2Vla0RheVN0YXJ0ID0+ICRXZWVrRGF5U3RhcnQsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDaGFyc2V0ICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkT3V0cHV0LAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkL2VkaXQgYXBwb2ludG1lbnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdFZGl0QXBwb2ludG1lbnQnICkgewogICAgICAgIG15ICVBcHBvaW50bWVudDsKICAgICAgICBpZiAoICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKICAgICAgICAgICAgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgICAgICAgICAkUGVybWlzc2lvbnMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkUmVxdWlyZWRQZXJtaXNzaW9uID0gMjsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17Q2FsZW5kYXJJRH0gJiYgJEdldFBhcmFte0NhbGVuZGFySUR9ICE9ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSApIHsKCiAgICAgICAgICAgICAgICAjIGluIG9yZGVyIHRvIG1vdmUgYXBwb2ludG1lbnQgdG8gYW5vdGhlciBjYWxlbmRhciwgdXNlciBuZWVkcyAiY3JlYXRlIiBwZXJtaXNzaW9uCiAgICAgICAgICAgICAgICAkUmVxdWlyZWRQZXJtaXNzaW9uID0gMzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbkxldmVseyRQZXJtaXNzaW9uc30gPCAkUmVxdWlyZWRQZXJtaXNzaW9uICkgewoKICAgICAgICAgICAgICAgICMgbm8gcGVybWlzc2lvbgoKICAgICAgICAgICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAgICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAgID0+IFRyYW5zbGF0YWJsZSgnTm8gcGVybWlzc2lvbiEnKSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QWxsRGF5fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1N0YXJ0VGltZX0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIDAwOjAwOjAwIiwKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFllYXJ9LCAkR2V0UGFyYW17U3RhcnRNb250aH0sICRHZXRQYXJhbXtTdGFydERheX0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEdldFBhcmFte0VuZFRpbWV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAwMDowMDowMCIsCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kWWVhcn0sICRHZXRQYXJhbXtFbmRNb250aH0sICRHZXRQYXJhbXtFbmREYXl9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17RW5kVGltZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHByZXZlbnQgc3RvcmluZyBlbmQgdGltZSBiZWZvcmUgc3RhcnQgdGltZQogICAgICAgICAgICBpZiAoICRFbmRUaW1lIDwgJFN0YXJ0VGltZSApIHsKICAgICAgICAgICAgICAgICRFbmRUaW1lID0gJFN0YXJ0VGltZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBtYWtlIGVuZCB0aW1lIGluY2x1c2l2ZSwgYWRkIHdob2xlIGRheQogICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWUgKyA4NjQwMCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17UmVjdXJyaW5nfSAmJiAkR2V0UGFyYW17VXBkYXRlVHlwZX0gJiYgJEdldFBhcmFte1VwZGF0ZURlbHRhfSApIHsKCiAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtFbmRUaW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2FsY3VsYXRlIG5ldyBzdGFydC9lbmQgdGltZXMKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VXBkYXRlVHlwZX0gZXEgJ1N0YXJ0VGltZScgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSArICRHZXRQYXJhbXtVcGRhdGVEZWx0YX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte1VwZGF0ZVR5cGV9IGVxICdFbmRUaW1lJyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWUgKyAkR2V0UGFyYW17VXBkYXRlRGVsdGF9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lICsgJEdldFBhcmFte1VwZGF0ZURlbHRhfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lICsgJEdldFBhcmFte1VwZGF0ZURlbHRhfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0WWVhcn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0TW9udGh9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtTdGFydERheX0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0SG91cn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0TWludXRlfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1N0YXJ0WWVhcn0sICRHZXRQYXJhbXtTdGFydE1vbnRofSwgJEdldFBhcmFte1N0YXJ0RGF5fSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRIb3VyfSwgJEdldFBhcmFte1N0YXJ0TWludXRlfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIENvbnZlcnQgc3RhcnQgdGltZSB0byBsb2NhbCB0aW1lLgogICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0YXJ0VGltZSAtPSAkU2VsZi0+e1RpbWVTZWNEaWZmfTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gJEFwcG9pbnRtZW50e1N0YXJ0VGltZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJEdldFBhcmFte0VuZFllYXJ9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtFbmRNb250aH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0VuZERheX0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0VuZEhvdXJ9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtFbmRNaW51dGV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0VuZFllYXJ9LCAkR2V0UGFyYW17RW5kTW9udGh9LCAkR2V0UGFyYW17RW5kRGF5fSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kSG91cn0sICRHZXRQYXJhbXtFbmRNaW51dGV9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgQ29udmVydCBlbmQgdGltZSB0byBsb2NhbCB0aW1lLgogICAgICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtFbmRUaW1lfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRW5kVGltZSAtPSAkU2VsZi0+e1RpbWVTZWNEaWZmfTsKCiAgICAgICAgICAgICAgICAjIFByZXZlbnQgc3RvcmluZyBlbmQgdGltZSBiZWZvcmUgc3RhcnQgdGltZS4KICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEVuZFRpbWUgPCAkU3RhcnRUaW1lICkgewogICAgICAgICAgICAgICAgICAgICRFbmRUaW1lID0gJFN0YXJ0VGltZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9ICRBcHBvaW50bWVudHtFbmRUaW1lfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBwcmV2ZW50IHJlY3VycmVuY2UgdW50aWwgZGF0ZXMgYmVmb3JlIHN0YXJ0IHRpbWUKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJpbmd9ICYmICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWx9ICkgewogICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRSZWN1cnJlbmNlVW50aWwgPCAkU3RhcnRUaW1lICkgewogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbH0gPSAkR2V0UGFyYW17U3RhcnRUaW1lfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWN1cnJpbmcgYXBwb2ludG1lbnQKICAgICAgICBpZiAoICRHZXRQYXJhbXtSZWN1cnJpbmd9ICYmICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gKSB7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdEYWlseScKICAgICAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ1dlZWtseScKICAgICAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ01vbnRobHknCiAgICAgICAgICAgICAgICB8fCAkR2V0UGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdZZWFybHknCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbScgKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UmVjdXJyZW5jZUN1c3RvbVR5cGV9IGVxICdDdXN0b21XZWVrbHknICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0RheXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSBARGF5cyA9IHNwbGl0KCAiLCIsICRHZXRQYXJhbXtEYXlzfSApOwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBcQERheXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQERhdGVJbmZvID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9ID0gWyAkRGF0ZUluZm9bNl0gXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZX0gZXEgJ0N1c3RvbU1vbnRobHknICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte01vbnRoRGF5c30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBNb250aERheXMgPSBzcGxpdCggIiwiLCAkR2V0UGFyYW17TW9udGhEYXlzfSApOwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBcQE1vbnRoRGF5czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBteSBARGF0ZUluZm8gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBbICREYXRlSW5mb1szXSBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte1JlY3VycmVuY2VDdXN0b21UeXBlfSBlcSAnQ3VzdG9tWWVhcmx5JyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtNb250aHN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSBATW9udGhzID0gc3BsaXQoICIsIiwgJEdldFBhcmFte01vbnRoc30gKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9ID0gXEBNb250aHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQERhdGVJbmZvID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9ID0gWyAkRGF0ZUluZm9bNF0gXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSA9ICRHZXRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdW50aWwgLi4uCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlTGltaXR9IGVxICcxJwogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbFllYXJ9CiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsTW9udGh9CiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsRGF5fQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIDAwOjAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsWWVhcn0sICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWxNb250aH0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbERheX0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBwcmV2ZW50IHJlY3VycmVuY2UgdW50aWwgZGF0ZXMgYmVmb3JlIHN0YXJ0IHRpbWUKICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWwgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFJlY3VycmVuY2VVbnRpbCA8ICRTdGFydFRpbWUgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbH0gPSAkR2V0UGFyYW17U3RhcnRUaW1lfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUNvdW50fSA9IHVuZGVmOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZvciAuLi4gdGltZShzKQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlTGltaXR9IGVxICcyJyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWx9ID0gdW5kZWY7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgRGV0ZXJtaW5lIG5vdGlmaWNhdGlvbiBjdXN0b20gdHlwZSwgaWYgc3VwcGxpZWQuCiAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtOb3RpZmljYXRpb25UZW1wbGF0ZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05vdGlmaWNhdGlvblRlbXBsYXRlfSBuZSAnQ3VzdG9tJyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b219ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tfSA9ICdyZWxhdGl2ZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tfSA9ICdkYXRldGltZSc7CgogICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhcn0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGh9LAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZURheX0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSG91cn0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgQ29udmVydCB0byBsb2NhbCB0aW1lLgogICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lIC09ICRTZWxmLT57VGltZVNlY0RpZmZ9OwoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdGVhbQogICAgICAgIGlmICggJEdldFBhcmFteydUZWFtSURbXSd9ICkgewogICAgICAgICAgICBteSBAVGVhbUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdUZWFtSURbXScgKTsKICAgICAgICAgICAgJEdldFBhcmFte1RlYW1JRH0gPSBcQFRlYW1JRHM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkR2V0UGFyYW17VGVhbUlEfSA9IHVuZGVmOwogICAgICAgIH0KCiAgICAgICAgIyByZXNvdXJjZXMKICAgICAgICBpZiAoICRHZXRQYXJhbXsnUmVzb3VyY2VJRFtdJ30gKSB7CiAgICAgICAgICAgIG15IEBSZXNvdXJjZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1Jlc291cmNlSURbXScgKTsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc291cmNlSUR9ID0gXEBSZXNvdXJjZUlEOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc291cmNlSUR9ID0gdW5kZWY7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGlmIGRlYWxpbmcgd2l0aCB0aWNrZXQgYXBwb2ludG1lbnQuCiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9ICkgewoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgcmVhZG9ubHkgdmFsdWVzIHN0YXkgdW5jaGFuZ2VkLgogICAgICAgICAgICAkR2V0UGFyYW17VGl0bGV9ICAgICAgPSAkQXBwb2ludG1lbnR7VGl0bGV9OwogICAgICAgICAgICAkR2V0UGFyYW17Q2FsZW5kYXJJRH0gPSAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH07CiAgICAgICAgICAgICRHZXRQYXJhbXtBbGxEYXl9ICAgICA9IHVuZGVmOwogICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyaW5nfSAgPSB1bmRlZjsKCiAgICAgICAgICAgIG15ICRSdWxlID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFJ1bGVHZXQoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgPT4gJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgUmVjYWxjdWxhdGUgZW5kIHRpbWUgYmFzZWQgb24gdGltZSBwcmVzZXQuCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFJ1bGUpICkgewogICAgICAgICAgICAgICAgaWYgKCAkUnVsZS0+e0VuZERhdGV9ID1+IC9eUGx1c18oWzAtOV0rKSQvICYmICRHZXRQYXJhbXtTdGFydFRpbWV9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRQcmVzZXQgPSBpbnQgJDE7CgogICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIENhbGN1bGF0ZSBlbmQgdGltZSB1c2luZyBwcmVzZXQgdmFsdWUuCiAgICAgICAgICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkU3RhcnRUaW1lICsgNjAgKiAkUHJlc2V0OwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRTdWNjZXNzOwoKICAgICAgICAjIHJlc2V0IGVtcHR5IHBhcmFtZXRlcnMKICAgICAgICBmb3IgbXkgJFBhcmFtICggc29ydCBrZXlzICVHZXRQYXJhbSApIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyRQYXJhbX0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtfSA9IHVuZGVmOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHBhc3MgY3VycmVudCB1c2VyIElECiAgICAgICAgJEdldFBhcmFte1VzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CgogICAgICAgIGlmICglQXBwb2ludG1lbnQpIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50VXBkYXRlKAogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gPyAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gOiAkU3VjY2VzczsKCiAgICAgICAgaWYgKCRBcHBvaW50bWVudElEKSB7CgogICAgICAgICAgICAjIEdldCBwYXNzZWQgcGx1Z2luIHBhcmFtZXRlcnMuCiAgICAgICAgICAgIG15IEBQbHVnaW5QYXJhbXMgPSBncmVwIHsgJF8gPX4gL15QbHVnaW5fLyB9IGtleXMgJUdldFBhcmFtOwoKICAgICAgICAgICAgIyBDb250aW51ZSBvbmx5IGlmIGNvbWluZyBmcm9tIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICMgICAodGhlcmUgaXMgYXQgbGVhc3Qgb25lIHBhc3NlZCBwbHVnaW4gcGFyYW1ldGVyKS4KICAgICAgICAgICAgaWYgKEBQbHVnaW5QYXJhbXMpIHsKCiAgICAgICAgICAgICAgICAjIFJlbW92ZSBhbGwgZXhpc3RpbmcgbGlua3MuCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBUcmFuc2xhdGFibGUoJ0xpbmtzIGNvdWxkIG5vdCBiZSBkZWxldGVkIScpLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFByb2Nlc3MgcGFzc2VkIHBsdWdpbiBwYXJhbWV0ZXJzLgogICAgICAgICAgICAgICAgZm9yIG15ICRQbHVnaW5QYXJhbSAoQFBsdWdpblBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIG15ICRQbHVnaW5EYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKS0+RGVjb2RlKAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRHZXRQYXJhbXskUGx1Z2luUGFyYW19LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJFBsdWdpbktleSA9ICRQbHVnaW5QYXJhbTsKICAgICAgICAgICAgICAgICAgICAkUGx1Z2luS2V5ID1+IHMvXlBsdWdpbl8vLzsKCiAgICAgICAgICAgICAgICAgICAgIyBFeGVjdXRlIGxpbmsgYWRkIG1ldGhvZCBvZiB0aGUgcGx1Z2luLgogICAgICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRQbHVnaW5EYXRhKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRMaW5rSUQgKCBAeyRQbHVnaW5EYXRhfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRMaW5rID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbHVnaW5EYXRhICAgID0+ICRMaW5rSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRMaW5rICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiBUcmFuc2xhdGFibGUoJ0xpbmsgY291bGQgbm90IGJlIGNyZWF0ZWQhJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+ICRTdWNjZXNzID8gMSA6IDAsCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWxldGUgbWFzawogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZUFwcG9pbnRtZW50JyApIHsKCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gMDsKICAgICAgICAgICAgbXkgJEVycm9yICAgPSAnJzsKCiAgICAgICAgICAgICMgUHJldmVudCBkZWxldGluZyB0aWNrZXQgYXBwb2ludG1lbnQuCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSApIHsKICAgICAgICAgICAgICAgICRFcnJvciA9IFRyYW5zbGF0YWJsZSgnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU3VjY2VzcyA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yID0gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9ucyEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgID0+ICRTdWNjZXNzLAogICAgICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgPT4gJEVycm9yLAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB1cGRhdGUgcHJlZmVyZW5jZXMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdVcGRhdGVQcmVmZXJlbmNlcycgKSB7CgogICAgICAgIG15ICRTdWNjZXNzID0gMDsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkR2V0UGFyYW17T3ZlcnZpZXdTY3JlZW59ICYmICgKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEZWZhdWx0Vmlld30gfHwgJEdldFBhcmFte0NhbGVuZGFyU2VsZWN0aW9ufQogICAgICAgICAgICAgICAgfHwgKCAkR2V0UGFyYW17U2hvd25SZXNvdXJjZXN9ICYmICRHZXRQYXJhbXtUZWFtSUR9ICkKICAgICAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtTaG93bkFwcG9pbnRtZW50c30KICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkUHJlZmVyZW5jZUtleTsKICAgICAgICAgICAgbXkgJFByZWZlcmVuY2VLZXlTdWZmaXggPSAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0RlZmF1bHRWaWV3fSApIHsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5ID0gJ0RlZmF1bHRWaWV3JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtDYWxlbmRhclNlbGVjdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleSA9ICdDYWxlbmRhclNlbGVjdGlvbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17U2hvd25SZXNvdXJjZXN9ICYmICRHZXRQYXJhbXtUZWFtSUR9ICkgewogICAgICAgICAgICAgICAgJFByZWZlcmVuY2VLZXkgICAgICAgPSAnU2hvd25SZXNvdXJjZXMnOwogICAgICAgICAgICAgICAgJFByZWZlcmVuY2VLZXlTdWZmaXggPSAiLSRHZXRQYXJhbXtUZWFtSUR9IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtTaG93bkFwcG9pbnRtZW50c30gKSB7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleSA9ICdTaG93bkFwcG9pbnRtZW50cyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlcicgLiAkR2V0UGFyYW17T3ZlcnZpZXdTY3JlZW59IC4gJFByZWZlcmVuY2VLZXkgLiAkUHJlZmVyZW5jZUtleVN1ZmZpeCwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkR2V0UGFyYW17JFByZWZlcmVuY2VLZXl9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGVsc2lmICggJEdldFBhcmFte092ZXJ2aWV3U2NyZWVufSAmJiAkR2V0UGFyYW17UmVzdG9yZURlZmF1bHRTZXR0aW5nc30gKSB7CiAgICAgICAgICAgIG15ICRQcmVmZXJlbmNlS2V5OwogICAgICAgICAgICBteSAkUHJlZmVyZW5jZUtleVN1ZmZpeCA9ICcnOwoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UmVzdG9yZURlZmF1bHRTZXR0aW5nc30gZXEgJ1Nob3duUmVzb3VyY2VzJyAmJiAkR2V0UGFyYW17VGVhbUlEfSApIHsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5ICAgICAgID0gJ1Nob3duUmVzb3VyY2VzJzsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5U3VmZml4ID0gIi0kR2V0UGFyYW17VGVhbUlEfSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYmxhbmsgdXNlciBwcmVmZXJlbmNlcwogICAgICAgICAgICAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VyJyAuICRHZXRQYXJhbXtPdmVydmlld1NjcmVlbn0gLiAkUHJlZmVyZW5jZUtleSAuICRQcmVmZXJlbmNlS2V5U3VmZml4LAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICcnLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAkU3VjY2VzcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVhbSBsaXN0IHNlbGVjdGlvbiB1cGRhdGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZWFtVXNlckxpc3QnICkgewogICAgICAgIG15IEBUZWFtSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1RlYW1JRFtdJyApOwogICAgICAgIG15ICVUZWFtVXNlckxpc3RBbGw7CgogICAgICAgICMgQ2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZC4KICAgICAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICAgICBteSAkVGVhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScpOwogICAgICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICAgICBURUFNSUQ6CiAgICAgICAgICAgIGZvciBteSAkVGVhbUlEIChAVGVhbUlEcykgewogICAgICAgICAgICAgICAgbmV4dCBURUFNSUQgaWYgISRUZWFtSUQ7CgogICAgICAgICAgICAgICAgIyBnZXQgbGlzdCBvZiB0ZWFtIG1lbWJlcnMKICAgICAgICAgICAgICAgIG15ICVUZWFtVXNlckxpc3QgPSAkVGVhbU9iamVjdC0+VGVhbVVzZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFRlYW1JRCA9PiAkVGVhbUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVRlYW1Vc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkVGVhbVVzZXJMaXN0eyRVc2VySUR9ID0gJFVzZXJ7VXNlckZ1bGxuYW1lfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlVGVhbVVzZXJMaXN0QWxsID0gKCAlVGVhbVVzZXJMaXN0QWxsLCAlVGVhbVVzZXJMaXN0ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGVhbVVzZXJMaXN0ID0+IFwlVGVhbVVzZXJMaXN0QWxsLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgfQoKICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICApOwp9CgpzdWIgX0RheU9mZnNldEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGltZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjYWxlbmRhciBoZWxwZXIgb2JqZWN0CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICMgY29udmVydCB0aW1lc3RhbXAgdG8gdW5peCB0aW1lCiAgICBteSAkT3JpZ2luYWxUaW1lU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17VGltZX0sCiAgICApOwoKICAgICMgZ2V0IG9yaWdpbmFsIGRhdGUgaW5mbwogICAgbXkgQE9yaWdpbmFsRGF0ZUluZm8gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkT3JpZ2luYWxUaW1lU3lzdGVtLAogICAgKTsKCiAgICAjIGNhbGN1bGF0ZSBkZXN0aW5hdGlvbiB0aW1lIChhY2NvcmRpbmcgdG8gdXNlciB0aW1lem9uZSkKICAgIG15ICREZXN0aW5hdGlvblRpbWVTeXN0ZW0gPSAkT3JpZ2luYWxUaW1lU3lzdGVtICsgJFNlbGYtPntUaW1lU2VjRGlmZn07CgogICAgIyBnZXQgZGVzdGluYXRpb24gZGF0ZSBpbmZvCiAgICBteSBARGVzdGluYXRpb25EYXRlSW5mbyA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICREZXN0aW5hdGlvblRpbWVTeXN0ZW0sCiAgICApOwoKICAgICMgY29tcGFyZSBkYXlzIC0gYXJyYXlzIGNvbnRhaW5zIGZvbGxvd2luZyB2YWx1ZXM6IFNlY29uZCwgTWludXRlLCBIb3VyLCBEYXksIE1vbnRoLCBZZWFyIGFuZCBEYXlPZldlZWsKICAgIGlmICggJE9yaWdpbmFsRGF0ZUluZm9bM10gPT0gJERlc3RpbmF0aW9uRGF0ZUluZm9bM10gKSB7CgogICAgICAgICMgc2FtZSBkYXkKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGVsc2lmICggJE9yaWdpbmFsVGltZVN5c3RlbSA+ICREZXN0aW5hdGlvblRpbWVTeXN0ZW0gKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEFwcG9pbnRtZW50SW1wb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0ltcG9ydCcgKSB7CgogICAgICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAgICAgbXkgJEZvcm1JRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICkgfHwgJyc7CgogICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCkgaWYgISRGb3JtSUQ7CgogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSA9PiAiRmlsZVVwbG9hZCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCiAgICAgICAgbXkgJFVwZGF0ZUV4aXN0aW5nID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1VwZGF0ZUV4aXN0aW5nQXBwb2ludG1lbnRzJyApIHx8ICcnOwogICAgICAgIG15ICRDYWxlbmRhcklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NhbGVuZGFySUQnICkgfHwgJyc7CgogICAgICAgIG15ICVFcnJvcnM7CgogICAgICAgIGlmICggISRDYWxlbmRhcklEICkgewogICAgICAgICAgICAkRXJyb3Jze0NhbGVuZGFySURJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgZmlsZSBpbiB1cGxvYWQgY2FjaGUKICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgIG15ICRBZGRlZCA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkRm9ybUlELAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBpZiBmaWxlIGdvdCBub3QgYWRkZWQgdG8gc3RvcmFnZQogICAgICAgICAgICAjIChlLiBnLiBiZWNhdXNlIG9mIDEgTUIgbWF4X2FsbG93ZWRfcGFja2V0IE15U1FMIHByb2JsZW0pCiAgICAgICAgICAgIGlmICggISRBZGRlZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGNvbnRlbnQgZnJvbSB1cGxvYWQgY2FjaGUKICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRGb3JtSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggIUBBdHRhY2htZW50RGF0YSB8fCAoICRBdHRhY2htZW50RGF0YVswXSAmJiAhJXsgJEF0dGFjaG1lbnREYXRhWzBdIH0gKSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnN7RmlsZVVwbG9hZEludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiA9ICV7ICRBdHRhY2htZW50RGF0YVswXSB9OwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBlbXB0eQogICAgICAgIGlmICggISRVcGxvYWRTdHVmZntDb250ZW50fSApIHsKICAgICAgICAgICAgJEVycm9yc3tGaWxlVXBsb2FkSW52YWxpZH0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgIH0KCiAgICAgICAgaWYgKCVFcnJvcnMpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fT3ZlcnZpZXcoCiAgICAgICAgICAgICAgICAlRXJyb3JzLAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVDYWxlbmRhcjsKCiAgICAgICAgbXkgJENhbGVuZGFyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgogICAgICAgIGlmICgkQ2FsZW5kYXJJRCkgewogICAgICAgICAgICAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBjYWxlbmRhciBwZXJtaXNzaW9ucwogICAgICAgIGlmICggISVDYWxlbmRhciApIHsKCiAgICAgICAgICAgICMgbm8gcGVybWlzc2lvbnMKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyBwZXJtaXNzaW9ucycpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwZXJtaXNzaW9ucyBjaGVjawogICAgICAgIG15ICRQZXJtaXNzaW9uID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRQZXJtaXNzaW9uIG5lICdjcmVhdGUnICYmICRQZXJtaXNzaW9uIG5lICdydycgKSB7CgogICAgICAgICAgICAjIG5vIHBlcm1pc3Npb25zIHRvIGltcG9ydCB0byB0aGUgZXhpc3RpbmcgY2FsZW5kYXIKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyBwZXJtaXNzaW9ucycpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJENvdW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpJbXBvcnQ6OklDYWwnKS0+SW1wb3J0KAogICAgICAgICAgICBDYWxlbmRhcklEICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIElDYWwgICAgICAgICAgID0+ICRVcGxvYWRTdHVmZntDb250ZW50fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBVcGRhdGVFeGlzdGluZyA9PiAkVXBkYXRlRXhpc3RpbmcsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJENvdW50ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlIScpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBJbXBvcnQgb2sKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlO0ltcG9ydEFwcG9pbnRtZW50c1N1Y2Nlc3M9MTtDb3VudD0ke0NvdW50fTtOYW1lPSIKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+TGlua0VuY29kZSggJENhbGVuZGFye0NhbGVuZGFyTmFtZX0gKSwKICAgICAgICApOwoKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAkU2VsZi0+X092ZXJ2aWV3KCk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT5fTWFzayglUGFyYW0pOwp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkUGFyYW17VGl0bGV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJJbXBvcnQgQXBwb2ludG1lbnRzIik7CiAgICAkUGFyYW17Q2FsZW5kYXJJREludmFsaWR9IC8vPSAnJzsKCiAgICBteSBAQ2FsZW5kYXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyktPkNhbGVuZGFyTGlzdCgKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBQZXJtaXNzaW9uID0+ICdjcmVhdGUnLAogICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICk7CgogICAgbXkgQENhbGVuZGFyRGF0YSA9IG1hcCB7CiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkXy0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICBWYWx1ZSA9PiAkXy0+e0NhbGVuZGFyTmFtZX0sCiAgICAgICAgfQogICAgfSBzb3J0IHsgJGEtPntDYWxlbmRhck5hbWV9IGNtcCAkYi0+e0NhbGVuZGFyTmFtZX0gfSBAQ2FsZW5kYXJMaXN0OwoKICAgICRQYXJhbXtDYWxlbmRhcn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gXEBDYWxlbmRhckRhdGEsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdDYWxlbmRhcklEJywKICAgICAgICBJRCAgICAgICAgICAgPT4gJ0NhbGVuZGFySUQnLAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkICcgLiAkUGFyYW17Q2FsZW5kYXJJREludmFsaWR9LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFRpdGxlICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkNhbGVuZGFyIiksCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtDYWxlbmRhcklEfSB8fCAnJywKICAgICk7CgogICAgIyBnZXQgRm9ybUlEIGZyb20gcGFyYW1zCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICkgfHwgJyc7CgogICAgIyBnZW5lcmF0ZSBGb3JtSUQgaWYgZW1wdHkKICAgICRQYXJhbXtGb3JtSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKS0+Rm9ybUlEQ3JlYXRlKCkgaWYgISRQYXJhbXtGb3JtSUR9OwoKICAgIHJldHVybiAkU2VsZi0+X01hc2soJVBhcmFtKTsKfQoKc3ViIF9NYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIG91dHB1dCBwYWdlCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRBcHBvaW50bWVudEltcG9ydCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEFwcG9pbnRtZW50TGlzdDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgdGltZSB6b25lIG9mZnNldAogICAgJFNlbGYtPntUaW1lWm9uZX0gPSAkU2VsZi0+e1VzZXJUaW1lWm9uZX0gfHwgMDsKICAgICRTZWxmLT57VGltZVNlY0RpZmZ9ID0gJFNlbGYtPntUaW1lWm9uZX0gKiAzNjAwOyAgICAjIDYwICogNjAKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0OwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IG5hbWVzIG9mIGFsbCBwYXJhbWV0ZXJzCiAgICBteSBAUGFyYW1OYW1lcyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwoKICAgIEtFWToKICAgIGZvciBteSAkS2V5IChAUGFyYW1OYW1lcykgewogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0FwcG9pbnRtZW50SURzJzsKICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDYWxlbmRhck9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKICAgIG15ICRQbHVnaW5PYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6UGx1Z2luJyk7CgogICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKCBEYXRhID0+IFtdICk7CgogICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICMgY2hlY2sgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0xpc3RBcHBvaW50bWVudHMnICkgewoKICAgICAgICBpZiAoICRHZXRQYXJhbXtDYWxlbmRhcklEfSApIHsKCiAgICAgICAgICAgICMgYXBwZW5kIG1pZG5pZ2h0IHRvIHRoZSB0aW1lc3RhbXBzCiAgICAgICAgICAgIGZvciBteSAkVGltZXN0YW1wIChxdyhTdGFydFRpbWUgRW5kVGltZSkpIHsKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyRUaW1lc3RhbXB9ICYmICEoICRHZXRQYXJhbXskVGltZXN0YW1wfSA9fiAvXHNcZHsyfTpcZHsyfTpcZHsyfSQvICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRUaW1lc3RhbXB9ID0gJEdldFBhcmFteyRUaW1lc3RhbXB9IC4gJyAwMDowMDowMCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtFbmRUaW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY29udmVydCB0byBsb2NhbCB0aW1lCiAgICAgICAgICAgICRTdGFydFRpbWUgLT0gJFNlbGYtPntUaW1lU2VjRGlmZn07CiAgICAgICAgICAgICRFbmRUaW1lICAgLT0gJFNlbGYtPntUaW1lU2VjRGlmZn07CgogICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICApOwogICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlc2V0IGVtcHR5IHBhcmFtZXRlcnMKICAgICAgICAgICAgZm9yIG15ICRQYXJhbSAoIHNvcnQga2V5cyAlR2V0UGFyYW0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17JFBhcmFtfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtfSA9IHVuZGVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdvIHRocm91Z2ggYWxsIGFwcG9pbnRtZW50cwogICAgICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAQXBwb2ludG1lbnRzKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBmb3Igbm90aWZpY2F0aW9uIGRhdGUKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAhJEFwcG9pbnRtZW50LT57Tm90aWZpY2F0aW9uRGF0ZX0KICAgICAgICAgICAgICAgICAgICB8fCAkQXBwb2ludG1lbnQtPntOb3RpZmljYXRpb25EYXRlfSBlcSAnMDAwMC0wMC0wMCAwMDowMDowMCcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57Tm90aWZpY2F0aW9uRGF0ZX0gPSAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCBzeXN0ZW0gdGltZXMKICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudC0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudC0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNhdmUgdGltZSBzdGFtcHMgZm9yIGRpc3BsYXkgYmVmb3JlIGNhbGN1bGF0aW9uCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntTdGFydERhdGV9ID0gJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfTsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e0VuZERhdGV9ICAgPSAkQXBwb2ludG1lbnQtPntFbmRUaW1lfTsKCiAgICAgICAgICAgICAgICAjIGVuZCB0aW1lcyBmb3IgYWxsIGRheSBhcHBvaW50bWVudHMgYXJlIGluY2x1c2l2ZSwgc3VidHJhY3Qgd2hvbGUgZGF5CiAgICAgICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudC0+e0FsbERheX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVuZFRpbWUgLT0gODY0MDA7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRW5kVGltZSA8ICRTdGFydFRpbWUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFbmRUaW1lID0gJFN0YXJ0VGltZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57RW5kRGF0ZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIGxvY2FsIHRpbWVzIGZvciBjb250cm9sCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU3RhcnRUaW1lICs9ICRTZWxmLT57VGltZVNlY0RpZmZ9OwogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1N0YXJ0VGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICRFbmRUaW1lICs9ICRTZWxmLT57VGltZVNlY0RpZmZ9OwogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e0VuZFRpbWV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGZvcm1hdHRlZCBkYXRlL3RpbWUgc3RyaW5ncyB1c2VkIGluIGRpc3BsYXkKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1N0YXJ0RGF0ZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1N0YXJ0RGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXQnIC4gKCAkQXBwb2ludG1lbnQtPntBbGxEYXl9ID8gJ1Nob3J0JyA6ICcnICkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntFbmREYXRlfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57RW5kRGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXQnIC4gKCAkQXBwb2ludG1lbnQtPntBbGxEYXl9ID8gJ1Nob3J0JyA6ICcnICkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudC0+e05vdGlmaWNhdGlvbkRhdGV9ICkgewogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57Tm90aWZpY2F0aW9uRGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBpbmNsdWRlIHJlc291cmNlIGRhdGEKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1RlYW1OYW1lfSAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntSZXNvdXJjZU5hbWVzfSA9ICcnOwoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKAogICAgICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywKICAgICAgICAgICAgICAgICAgICAgICAgU2lsZW50ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudC0+e1RlYW1JRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUZWFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBUZWFtTmFtZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIFRFQU1JRDoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRUZWFtSUQgKCBAeyAkQXBwb2ludG1lbnQtPntUZWFtSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRFQU1JRCBpZiAhJFRlYW1JRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICVUZWFtID0gJFRlYW1PYmplY3QtPlRlYW1HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbUlEID0+ICRUZWFtSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBUZWFtTmFtZXMsICRUZWFte05hbWV9IGlmICVUZWFtOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIHRydW5jYXRlIG1vcmUgdGhhbiB0aHJlZSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICBteSAkVGVhbUNvdW50ID0gc2NhbGFyIEBUZWFtTmFtZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFRlYW1Db3VudCA+IDQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2UgQFRlYW1OYW1lcywgMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFRlYW1OYW1lcywgc3ByaW50ZiggVHJhbnNsYXRhYmxlKCcrJWQgbW9yZScpLCAkVGVhbUNvdW50IC0gMyApOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntUZWFtTmFtZXN9ID0gam9pbiggJ1xuJywgQFRlYW1OYW1lcyApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudC0+e1Jlc291cmNlSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBSZXNvdXJjZU5hbWVzOwogICAgICAgICAgICAgICAgICAgICAgICBSRVNPVVJDRUlEOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFJlc291cmNlSUQgKCBAeyAkQXBwb2ludG1lbnQtPntSZXNvdXJjZUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBSRVNPVVJDRUlEIGlmICEkUmVzb3VyY2VJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICVVc2VyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUmVzb3VyY2VJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBSZXNvdXJjZU5hbWVzLCAkVXNlcntVc2VyRnVsbG5hbWV9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIHRydW5jYXRlIG1vcmUgdGhhbiB0aHJlZSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICBteSAkUmVzb3VyY2VDb3VudCA9IHNjYWxhciBAUmVzb3VyY2VOYW1lczsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVzb3VyY2VDb3VudCA+IDQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2UgQFJlc291cmNlTmFtZXMsIDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBSZXNvdXJjZU5hbWVzLCBzcHJpbnRmKCBUcmFuc2xhdGFibGUoJyslZCBtb3JlJyksICRSZXNvdXJjZUNvdW50IC0gMyApOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntSZXNvdXJjZU5hbWVzfSA9IGpvaW4oICdcbicsIEBSZXNvdXJjZU5hbWVzICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgaW5jbHVkZSBwbHVnaW4gKGxpbmspIGRhdGEKICAgICAgICAgICAgICAgIG15ICRQbHVnaW5MaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlzdCgpOwogICAgICAgICAgICAgICAgZm9yIG15ICRQbHVnaW5LZXkgKCBzb3J0IGtleXMgJXskUGx1Z2luTGlzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJExpbmtMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0xpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSBATGlua0FycmF5OwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkTGlua0lEICggc29ydCBrZXlzICV7JExpbmtMaXN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBATGlua0FycmF5LCAkTGlua0xpc3QtPnskTGlua0lEfS0+e0xpbmtOYW1lfTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgdHJ1bmNhdGUgbW9yZSB0aGFuIHRocmVlIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgbXkgJExpbmtDb3VudCA9IHNjYWxhciBATGlua0FycmF5OwogICAgICAgICAgICAgICAgICAgIGlmICggJExpbmtDb3VudCA+IDQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNwbGljZSBATGlua0FycmF5LCAzOwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBMaW5rQXJyYXksIHNwcmludGYoIFRyYW5zbGF0YWJsZSgnKyVkIG1vcmUnKSwgJExpbmtDb3VudCAtIDMgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1BsdWdpbkRhdGF9LT57JFBsdWdpbktleX0gPSBqb2luKCAnXG4nLCBATGlua0FycmF5ICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBkZWFsaW5nIHdpdGggdGlja2V0IGFwcG9pbnRtZW50CiAgICAgICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudC0+e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkUnVsZSA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRSdWxlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudC0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBSdWxlSUQgICAgID0+ICRBcHBvaW50bWVudC0+e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGdldCB0eXBlcyBmcm9tIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZQogICAgICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFJ1bGUpICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntUaWNrZXRBcHBvaW50bWVudFN0YXJ0RGF0ZX0gPSAkUnVsZS0+e1N0YXJ0RGF0ZX07CiAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1RpY2tldEFwcG9pbnRtZW50RW5kRGF0ZX0gICA9ICRSdWxlLT57RW5kRGF0ZX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4gKAogICAgICAgICAgICAgICAgICAgIFxAQXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FwcG9pbnRtZW50RGF5cycgKSB7CgogICAgICAgICMgYXBwZW5kIG1pZG5pZ2h0IHRvIHRoZSB0aW1lc3RhbXBzCiAgICAgICAgZm9yIG15ICRUaW1lc3RhbXAgKHF3KFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXskVGltZXN0YW1wfSAmJiAhKCAkR2V0UGFyYW17JFRpbWVzdGFtcH0gPX4gL1xzXGR7Mn06XGR7Mn06XGR7Mn0kLyApICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyRUaW1lc3RhbXB9ID0gJEdldFBhcmFteyRUaW1lc3RhbXB9IC4gJyAwMDowMDowMCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVzZXQgZW1wdHkgcGFyYW1ldGVycwogICAgICAgIGZvciBteSAkUGFyYW0gKCBzb3J0IGtleXMgJUdldFBhcmFtICkgewogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17JFBhcmFtfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW19ID0gdW5kZWY7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVBcHBvaW50bWVudERheXMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGF5cygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gKAogICAgICAgICAgICAgICAgXCVBcHBvaW50bWVudERheXMsCiAgICAgICAgICAgICksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEFwcG9pbnRtZW50UGx1Z2luU2VhcmNoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgbmVlZGVkIHBhcmFtcwogICAgbXkgJFNlYXJjaCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZXJtJyApIHx8ICcnOwogICAgbXkgJFBsdWdpbktleSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQbHVnaW5LZXknICk7CiAgICBteSAkTWF4UmVzdWx0cyA9IGludCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ01heFJlc3VsdHMnICkgfHwgMjAgKTsKCiAgICAjIHdvcmthcm91bmQsIGFsbCBhdXRvIGNvbXBsZXRpb24gcmVxdWVzdHMgZ2V0IHBvc3RlZCBieSB1dGY4IGFueXdheQogICAgIyBjb252ZXJ0IGFueSB0byA4Yml0IHN0cmluZyBpZiBhcHBsaWNhdGlvbiBpcyBub3QgcnVubmluZyBpbiB1dGY4CiAgICAkU2VhcmNoID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5Db252ZXJ0MkNoYXJzZXRJbnRlcm5hbCgKICAgICAgICBUZXh0ID0+ICRTZWFyY2gsCiAgICAgICAgRnJvbSA9PiAndXRmLTgnLAogICAgKTsKCiAgICBteSAkUmVzdWx0TGlzdDsKCiAgICBpZiAoJFBsdWdpbktleSkgewoKICAgICAgICAjIGdldCBwbHVnaW4gb2JqZWN0CiAgICAgICAgbXkgJFBsdWdpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6UGx1Z2luJyk7CgogICAgICAgICRSZXN1bHRMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luU2VhcmNoKAogICAgICAgICAgICBTZWFyY2ggICAgPT4gJFNlYXJjaCwKICAgICAgICAgICAgUGx1Z2luS2V5ID0+ICRQbHVnaW5LZXksCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIGRhdGEKICAgIG15IEBEYXRhOwogICAgbXkgJE1heFJlc3VsdENvdW50ID0gJE1heFJlc3VsdHM7CgogICAgT0JKRUNUSUQ6CiAgICBmb3IgbXkgJE9iamVjdElEICgKICAgICAgICBzb3J0IHsgJFJlc3VsdExpc3QtPnskYX0gY21wICRSZXN1bHRMaXN0LT57JGJ9IH0KICAgICAgICBrZXlzICV7JFJlc3VsdExpc3R9CiAgICAgICAgKQogICAgewogICAgICAgIHB1c2ggQERhdGEsIHsKICAgICAgICAgICAgS2V5ICAgPT4gJE9iamVjdElELAogICAgICAgICAgICBWYWx1ZSA9PiAkUmVzdWx0TGlzdC0+eyRPYmplY3RJRH0sCiAgICAgICAgfTsKCiAgICAgICAgJE1heFJlc3VsdENvdW50LS07CiAgICAgICAgbGFzdCBPQkpFQ1RJRCBpZiAkTWF4UmVzdWx0Q291bnQgPD0gMDsKICAgIH0KCiAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgRGF0YSA9PiBcQERhdGEgfHwge30sCiAgICApOwoKICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OIHx8ICcnLAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICApOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpQdWJsaWNDYWxlbmRhcjsKCiN1c2UgQ0dJOjpBdXRoOjpCYXNpYzsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIE1JTUU6OkJhc2U2NCBxdygpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlR2V0UGFyYW07CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1ldGVycwogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQgVXNlciBUb2tlbikpIHsKICAgICAgICAkR2V0UGFyYW17JE5lZWRlZH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTmVlZGVkICk7CiAgICAgICAgaWYgKCAhJEdldFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ05vICVzIScsICROZWVkZWQgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdXNlcgogICAgbXkgJVVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VyICA9PiAkR2V0UGFyYW17VXNlcn0sCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CiAgICBpZiAoICElVXNlciApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBzdWNoIHVzZXIhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRDYWxlbmRhck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwoKICAgICMgZ2V0IGNhbGVuZGFyCiAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gJEdldFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJ7VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJUNhbGVuZGFyICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIHBlcm1pc3Npb24hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJENhbGVuZGFye1ZhbGlkSUR9ICE9IDEgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnSW52YWxpZCBjYWxlbmRhciEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBhY2Nlc3MgdG9rZW4KICAgIG15ICRBY2Nlc3NUb2tlbiA9ICRDYWxlbmRhck9iamVjdC0+R2V0QWNjZXNzVG9rZW4oCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkR2V0UGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgVXNlckxvZ2luICA9PiAkR2V0UGFyYW17VXNlcn0sCiAgICApOwoKICAgIGlmICggJEFjY2Vzc1Rva2VuIG5lICRHZXRQYXJhbXtUb2tlbn0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnSW52YWxpZCBVUkwhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGlDYWxlbmRhciBzdHJpbmcKICAgIG15ICRJQ2FsU3RyaW5nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFeHBvcnQ6OklDYWwnKS0+RXhwb3J0KAogICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJ7VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJElDYWxTdHJpbmcgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgcHJlcGFyZSB0aGUgZmlsZSBuYW1lCiAgICBteSAkRmlsZW5hbWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5GaWxlbmFtZUNsZWFuVXAoCiAgICAgICAgRmlsZW5hbWUgPT4gIiRDYWxlbmRhcntDYWxlbmRhck5hbWV9LmljcyIsCiAgICAgICAgVHlwZSAgICAgPT4gJ0F0dGFjaG1lbnQnLAogICAgKTsKCiAgICAjIHNlbmQgaUNhbCByZXNwb25zZQogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvY2FsZW5kYXInLAogICAgICAgIENoYXJzZXQgICAgID0+ICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSUNhbFN0cmluZywKICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICk7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3Q6OkFwcG9pbnRtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dDsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpKU09OJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3Q6OkFwcG9pbnRtZW50IC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIGxpbmsgb2JqZWN0IChhcHBvaW50bWVudCkuCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3Q6OkFwcG9pbnRtZW50LT5uZXcoCiAgICAgICAgVXNlckxhbmd1YWdlID0+ICdlbicsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVXNlckxhbmd1YWdlIFVzZXJJRCkpIHsKICAgICAgICAkU2VsZi0+eyROZWVkZWR9ID0gJFBhcmFteyROZWVkZWR9IHx8IGRpZSAiR290IG5vICROZWVkZWQhIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBvdXIgb3duIExheW91dE9iamVjdCBpbnN0YW5jZSB0byBhdm9pZCBibG9jayBkYXRhIGNvbGxpc2lvbnMgd2l0aCB0aGUgbWFpbiBwYWdlCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0gPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0LT5uZXcoICV7JFNlbGZ9ICk7CgogICAgIyBkZWZpbmUgbmVlZGVkIHZhcmlhYmxlcwogICAgJFNlbGYtPntPYmplY3REYXRhfSA9IHsKICAgICAgICBPYmplY3QgICAgID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgUmVhbG5hbWUgICA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIE9iamVjdE5hbWUgPT4gJ1RpY2tldElEJywKICAgIH07CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBUYWJsZUNyZWF0ZUNvbXBsZXgoKQoKcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIGJsb2NrIGRhdGEKClJldHVybgoKICAgICVCbG9ja0RhdGEgPSAoCiAgICAgICAgewogICAgICAgICAgICBPYmplY3QgICAgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICAgICAgQmxvY2tuYW1lID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgICAgIEhlYWRsaW5lICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnVGl0bGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdEZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICAgICAgV2lkdGggICA9PiAyMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1N0YXJ0IFRpbWUnLAogICAgICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTUwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdFbmQgVGltZScsCiAgICAgICAgICAgICAgICAgICAgV2lkdGggICA9PiAxNTAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJdGVtTGlzdCA9PiBbCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnQXBwb2ludG1lbnQgdGl0bGUnLAogICAgICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNzAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnQXBwb2ludG1lbnQgZGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMTYtMDEtMDEgMTI6MDA6MDAnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMTYtMDEtMDEgMTM6MDA6MDAnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICApOwoKICAgIEBCbG9ja0RhdGEgPSAkQmFja2VuZE9iamVjdC0+VGFibGVDcmVhdGVDb21wbGV4KAogICAgICAgIE9iamVjdExpbmtMaXN0V2l0aERhdGEgPT4gJE9iamVjdExpbmtMaXN0UmVmLAogICAgKTsKCj1jdXQKCnN1YiBUYWJsZUNyZWF0ZUNvbXBsZXggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IHx8IHJlZiAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBPYmplY3RMaW5rTGlzdFdpdGhEYXRhIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgY29udmVydCB0aGUgbGlzdAogICAgbXkgJUxpbmtMaXN0OwogICAgZm9yIG15ICRMaW5rVHlwZSAoIHNvcnQga2V5cyAleyAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gfSApIHsKCiAgICAgICAgIyBleHRyYWN0IGxpbmsgdHlwZSBMaXN0CiAgICAgICAgbXkgJExpbmtUeXBlTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX07CgogICAgICAgIGZvciBteSAkRGlyZWN0aW9uICggc29ydCBrZXlzICV7JExpbmtUeXBlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgZGlyZWN0aW9uIGxpc3QKICAgICAgICAgICAgbXkgJERpcmVjdGlvbkxpc3QgPSAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn07CgogICAgICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50SUQgKCBzb3J0IGtleXMgJXskRGlyZWN0aW9uTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgJExpbmtMaXN0eyRBcHBvaW50bWVudElEfS0+e0RhdGF9ID0gJERpcmVjdGlvbkxpc3QtPnskQXBwb2ludG1lbnRJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJENvbXBsZXhUYWJsZURhdGEgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkxpbmtPYmplY3Q6OkNvbXBsZXhUYWJsZSIpOwogICAgbXkgJERlZmF1bHRDb2x1bW5zOwogICAgaWYgKAogICAgICAgICRDb21wbGV4VGFibGVEYXRhCiAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoJENvbXBsZXhUYWJsZURhdGEpCiAgICAgICAgJiYgJENvbXBsZXhUYWJsZURhdGEtPntBcHBvaW50bWVudH0KICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJENvbXBsZXhUYWJsZURhdGEtPntBcHBvaW50bWVudH0gKQogICAgICAgICkKICAgIHsKICAgICAgICAkRGVmYXVsdENvbHVtbnMgPSAkQ29tcGxleFRhYmxlRGF0YS0+eyJBcHBvaW50bWVudCJ9LT57IkRlZmF1bHRDb2x1bW5zIn07CiAgICB9CgogICAgbXkgQFRpbWVMb25nVHlwZXMgPSAoCiAgICAgICAgIkNyZWF0ZWQiLAogICAgICAgICJDaGFuZ2VkIiwKICAgICAgICAiU3RhcnRUaW1lIiwKICAgICAgICAiRW5kVGltZSIsCiAgICAgICAgIk5vdGlmaWNhdGlvblRpbWUiLAogICAgKTsKCiAgICAjIGRlZmluZSB0aGUgYmxvY2sgZGF0YQogICAgbXkgQEhlYWRsaW5lID0gKAogICAgICAgIHsKICAgICAgICAgICAgQ29udGVudCA9PiAnVGl0bGUnLAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAjIGxvYWQgdXNlciBwcmVmZXJlbmNlcwogICAgbXkgJVByZWZlcmVuY2VzID0gJFVzZXJPYmplY3QtPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISREZWZhdWx0Q29sdW1ucyB8fCAhSXNIYXNoUmVmV2l0aERhdGEoJERlZmF1bHRDb2x1bW5zKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01pc3NpbmcgY29uZmlndXJhdGlvbiBmb3IgTGlua09iamVjdDo6Q29tcGxleFRhYmxlIyMjQXBwb2ludG1lbnQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIEdldCBkZWZhdWx0IGNvbHVtbiBwcmlvcml0eSBmcm9tIFN5c0NvbmZpZwogICAgIyBFYWNoIGNvbHVtbiBpbiB0YWJsZSAoVGl0bGUsIFN0YXJ0VGltZSwgRW5kVGltZSwuLi4pIGhhcyBkZWZpbmVkIFByaW9yaXR5IGluIFN5c0NvbmZpZy4KICAgICMgU3lzdGVtIHVzZSB0aGlzIHByaW9yaXR5IHRvIHNvcnQgY29sdW1ucywgaWYgdXNlciBkb2Vzbid0IGhhdmUgb3duIHNldHRpbmdzLgogICAgbXkgJVNvcnRPcmRlcjsKCiAgICBpZiAoCiAgICAgICAgJENvbXBsZXhUYWJsZURhdGEtPnsiQXBwb2ludG1lbnQifS0+eyJQcmlvcml0eSJ9CiAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDb21wbGV4VGFibGVEYXRhLT57IkFwcG9pbnRtZW50In0tPnsiUHJpb3JpdHkifSApCiAgICAgICAgKQogICAgewogICAgICAgICVTb3J0T3JkZXIgPSAleyAkQ29tcGxleFRhYmxlRGF0YS0+eyJBcHBvaW50bWVudCJ9LT57IlByaW9yaXR5In0gfTsKICAgIH0KCiAgICBteSAlVXNlckNvbHVtbnMgPSAleyREZWZhdWx0Q29sdW1uc307CgogICAgaWYgKCAkUHJlZmVyZW5jZXN7J0xpbmtPYmplY3Q6OkNvbXBsZXhUYWJsZS1BcHBvaW50bWVudCd9ICkgewogICAgICAgIG15ICRKU09OT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKTsKCiAgICAgICAgbXkgJENvbHVtbnNFbmFibGVkID0gJEpTT05PYmplY3QtPkRlY29kZSgKICAgICAgICAgICAgRGF0YSA9PiAkUHJlZmVyZW5jZXN7J0xpbmtPYmplY3Q6OkNvbXBsZXhUYWJsZS1BcHBvaW50bWVudCd9LAogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbHVtbnNFbmFibGVkCiAgICAgICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCRDb2x1bW5zRW5hYmxlZCkKICAgICAgICAgICAgJiYgJENvbHVtbnNFbmFibGVkLT57T3JkZXJ9CiAgICAgICAgICAgICYmIElzQXJyYXlSZWZXaXRoRGF0YSggJENvbHVtbnNFbmFibGVkLT57T3JkZXJ9ICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgIyBDbGVhciBzb3J0IG9yZGVyCiAgICAgICAgICAgICVTb3J0T3JkZXIgPSAoKTsKCiAgICAgICAgICAgIERFRkFVTFRDT0xVTU46CiAgICAgICAgICAgIGZvciBteSAkRGVmYXVsdENvbHVtbiAoIHNvcnQga2V5cyAlVXNlckNvbHVtbnMgKSB7CiAgICAgICAgICAgICAgICBteSAkSW5kZXggPSAwOwoKICAgICAgICAgICAgICAgIGZvciBteSAkVXNlclNldHRpbmcgKCBAeyAkQ29sdW1uc0VuYWJsZWQtPntPcmRlcn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAkSW5kZXgrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoICREZWZhdWx0Q29sdW1uIGVxICRVc2VyU2V0dGluZyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFVzZXJDb2x1bW5zeyREZWZhdWx0Q29sdW1ufSA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICRTb3J0T3JkZXJ7JERlZmF1bHRDb2x1bW59ICAgPSAkSW5kZXg7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IERFRkFVTFRDT0xVTU47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgbm90IGZvdW5kLCBtZWFucyB1c2VyIGNob3NlIHRvIGhpZGUgdGhpcyBpdGVtCiAgICAgICAgICAgICAgICBpZiAoICRVc2VyQ29sdW1uc3skRGVmYXVsdENvbHVtbn0gPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAkVXNlckNvbHVtbnN7JERlZmF1bHRDb2x1bW59ID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICEkU29ydE9yZGVyeyREZWZhdWx0Q29sdW1ufSApIHsKICAgICAgICAgICAgICAgICAgICAkU29ydE9yZGVyeyREZWZhdWx0Q29sdW1ufSA9IDA7ICAgICMgU2V0IDAsIGl0IHN5c3RlbSB3aWxsIGhpZGUgdGhpcyBpdGVtIGFueXdheXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICMgdXNlciBoYXMgbm8gb3duIHNldHRpbmdzCiAgICAgICAgZm9yIG15ICRDb2x1bW4gKCBzb3J0IGtleXMgJVVzZXJDb2x1bW5zICkgewogICAgICAgICAgICBpZiAoICEkU29ydE9yZGVyeyRDb2x1bW59ICkgewogICAgICAgICAgICAgICAgJFNvcnRPcmRlcnskQ29sdW1ufSA9IDA7ICAgICAgICAgICAgICAgIyBTZXQgMCwgaXQgc3lzdGVtIHdpbGwgaGlkZSB0aGlzIGl0ZW0gYW55d2F5cwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgRGVmaW5lIEhlYWRsaW5lIGNvbHVtbnMKCiAgICAjIFNvcnQKICAgIENPTFVNTjoKICAgIGZvciBteSAkQ29sdW1uICggc29ydCB7ICRTb3J0T3JkZXJ7JGF9IDw9PiAkU29ydE9yZGVyeyRifSB9IGtleXMgJVVzZXJDb2x1bW5zICkgewoKICAgICAgICBuZXh0IENPTFVNTiBpZiAkQ29sdW1uIGVxICdUaXRsZSc7ICAgICMgQWx3YXlzIHByZXNlbnQsIGFscmVhZHkgYWRkZWQuCgogICAgICAgICMgaWYgZW5hYmxlZCBieSBkZWZhdWx0CiAgICAgICAgaWYgKCAkVXNlckNvbHVtbnN7JENvbHVtbn0gPT0gMiApIHsKCiAgICAgICAgICAgICMgYXBwb2ludG1lbnQgZmllbGRzCiAgICAgICAgICAgIG15ICRDb2x1bW5OYW1lID0gJENvbHVtbjsKCiAgICAgICAgICAgIHB1c2ggQEhlYWRsaW5lLCB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRDb2x1bW5OYW1lLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgaXRlbSBsaXN0ICh0YWJsZSBjb250ZW50KQogICAgbXkgQEl0ZW1MaXN0OwoKICAgIEFQUE9JTlRNRU5USUQ6CiAgICBmb3IgbXkgJEFwcG9pbnRtZW50SUQgKAogICAgICAgIHNvcnQgeyAkTGlua0xpc3R7JGF9e0RhdGF9LT57QXBwb2ludG1lbnRJRH0gPD0+ICRMaW5rTGlzdHskYn17RGF0YX0tPntBcHBvaW50bWVudElEfSB9CiAgICAgICAga2V5cyAlTGlua0xpc3QKICAgICAgICApCiAgICB7CiAgICAgICAgbmV4dCBBUFBPSU5UTUVOVElEIGlmICEkQXBwb2ludG1lbnRJRDsKCiAgICAgICAgIyBleHRyYWN0IGFwcG9pbnRtZW50IGFuZCBjYWxlbmRhciBkYXRhCiAgICAgICAgbXkgJEFwcG9pbnRtZW50ID0gJExpbmtMaXN0eyRBcHBvaW50bWVudElEfXtEYXRhfTsKICAgICAgICBteSAlQ2FsZW5kYXIgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKS0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50LT57Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBUaXRsZSBiZSBwcmVzZW50IChzaW5jZSBpdCBjb250YWlucyBtYXN0ZXIgbGluayB0byB0aGUgYXBwb2ludG1lbnQpCiAgICAgICAgbXkgQEl0ZW1Db2x1bW5zID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgIEtleSAgICAgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRBcHBvaW50bWVudC0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIExpbmsgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QmFzZWxpbmt9CiAgICAgICAgICAgICAgICAgICAgLiAnQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9JwogICAgICAgICAgICAgICAgICAgIC4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNzAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBTb3J0CiAgICAgICAgQ09MVU1OOgogICAgICAgIGZvciBteSAkQ29sdW1uICggc29ydCB7ICRTb3J0T3JkZXJ7JGF9IDw9PiAkU29ydE9yZGVyeyRifSB9IGtleXMgJVVzZXJDb2x1bW5zICkgewoKICAgICAgICAgICAgbmV4dCBDT0xVTU4gaWYgJENvbHVtbiBlcSAnVGl0bGUnOyAgICAjIEFsd2F5cyBwcmVzZW50LCBhbHJlYWR5IGFkZGVkLgoKICAgICAgICAgICAgIyBpZiBlbmFibGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgaWYgKCAkVXNlckNvbHVtbnN7JENvbHVtbn0gPT0gMiApIHsKCiAgICAgICAgICAgICAgICBteSAlSGFzaDsKICAgICAgICAgICAgICAgIGlmICggZ3JlcCB7ICRfIGVxICRDb2x1bW4gfSBAVGltZUxvbmdUeXBlcyApIHsKICAgICAgICAgICAgICAgICAgICAkSGFzaHsnVHlwZSd9ID0gJ1RpbWVMb25nJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRIYXNoeydUeXBlJ30gPSAnVGV4dCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkQ29sdW1uIGVxICdOb3RpZmljYXRpb25UaW1lJyApIHsKICAgICAgICAgICAgICAgICAgICAkSGFzaHsnQ29udGVudCd9ID0gJEFwcG9pbnRtZW50LT57Tm90aWZpY2F0aW9uRGF0ZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRDb2x1bW4gZXEgJ0NyZWF0ZWQnICkgewogICAgICAgICAgICAgICAgICAgICRIYXNoeydDb250ZW50J30gPSAkQXBwb2ludG1lbnQtPntDcmVhdGVUaW1lfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJENvbHVtbiBlcSAnQ2hhbmdlZCcgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhhc2h7J0NvbnRlbnQnfSA9ICRBcHBvaW50bWVudC0+e0NoYW5nZVRpbWV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkQ29sdW1uIGVxICdDYWxlbmRhck5hbWUnICkgewogICAgICAgICAgICAgICAgICAgICRIYXNoeydDb250ZW50J30gPSAkQ2FsZW5kYXJ7Q2FsZW5kYXJOYW1lfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRIYXNoeydDb250ZW50J30gPSAkQXBwb2ludG1lbnQtPnskQ29sdW1ufTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdXNoIEBJdGVtQ29sdW1ucywgXCVIYXNoOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBJdGVtTGlzdCwgXEBJdGVtQ29sdW1uczsKICAgIH0KCiAgICByZXR1cm4gaWYgIUBJdGVtTGlzdDsKCiAgICBteSAlQmxvY2sgPSAoCiAgICAgICAgT2JqZWN0ICAgICA9PiAkU2VsZi0+e09iamVjdERhdGF9LT57T2JqZWN0fSwKICAgICAgICBCbG9ja25hbWUgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntSZWFsbmFtZX0sCiAgICAgICAgT2JqZWN0TmFtZSA9PiAkU2VsZi0+e09iamVjdERhdGF9LT57T2JqZWN0TmFtZX0sCiAgICAgICAgT2JqZWN0SUQgICA9PiAkUGFyYW17T2JqZWN0SUR9LAogICAgICAgIEhlYWRsaW5lICAgPT4gXEBIZWFkbGluZSwKICAgICAgICBJdGVtTGlzdCAgID0+IFxASXRlbUxpc3QsCiAgICApOwoKICAgIHJldHVybiAoIFwlQmxvY2sgKTsKfQoKPWl0ZW0gVGFibGVDcmVhdGVTaW1wbGUoKQoKcmV0dXJuIGEgaGFzaCB3aXRoIHRoZSBsaW5rIG91dHB1dCBkYXRhCgpSZXR1cm4KCiAgICAlTGlua091dHB1dERhdGEgPSAoCiAgICAgICAgTm9ybWFsOjpTb3VyY2UgPT4gewogICAgICAgICAgICBBcHBvaW50bWVudCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQToxJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdUaXRsZSBvZiBhcHBvaW50bWVudCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICApOwoKICAgICVMaW5rT3V0cHV0RGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5UYWJsZUNyZWF0ZVNpbXBsZSgKICAgICAgICBPYmplY3RMaW5rTGlzdFdpdGhEYXRhID0+ICRPYmplY3RMaW5rTGlzdFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgVGFibGVDcmVhdGVTaW1wbGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IHx8IHJlZiAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBPYmplY3RMaW5rTGlzdFdpdGhEYXRhIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJUxpbmtPdXRwdXREYXRhOwogICAgZm9yIG15ICRMaW5rVHlwZSAoIHNvcnQga2V5cyAleyAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gfSApIHsKCiAgICAgICAgIyBleHRyYWN0IGxpbmsgdHlwZSBMaXN0CiAgICAgICAgbXkgJExpbmtUeXBlTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX07CgogICAgICAgIGZvciBteSAkRGlyZWN0aW9uICggc29ydCBrZXlzICV7JExpbmtUeXBlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgZGlyZWN0aW9uIGxpc3QKICAgICAgICAgICAgbXkgJERpcmVjdGlvbkxpc3QgPSAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn07CgogICAgICAgICAgICBteSBASXRlbUxpc3Q7CiAgICAgICAgICAgIGZvciBteSAkQXBwb2ludG1lbnRJRCAoCiAgICAgICAgICAgICAgICBzb3J0IHsKICAgICAgICAgICAgICAgICAgICBsYyAkRGlyZWN0aW9uTGlzdC0+eyRhfS0+e05hbWVTaG9ydH0gY21wIGxjICREaXJlY3Rpb25MaXN0LT57JGJ9LT57TmFtZVNob3J0fQogICAgICAgICAgICAgICAgfSBrZXlzICV7JERpcmVjdGlvbkxpc3R9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgYXBwb2ludG1lbnQgZGF0YQogICAgICAgICAgICAgICAgbXkgJEFwcG9pbnRtZW50ID0gJERpcmVjdGlvbkxpc3QtPnskQXBwb2ludG1lbnRJRH07CgogICAgICAgICAgICAgICAgIyBkZWZpbmUgaXRlbSBkYXRhCiAgICAgICAgICAgICAgICBteSAlSXRlbSA9ICgKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICJBOiRBcHBvaW50bWVudElEIiwKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+IFRyYW5zbGF0YWJsZSgnQXBwb2ludG1lbnQnKSwKICAgICAgICAgICAgICAgICAgICBMaW5rICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jhc2VsaW5rfQogICAgICAgICAgICAgICAgICAgICAgICAuICdBY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0nCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDIwLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEBJdGVtTGlzdCwgXCVJdGVtOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBpdGVtIGxpc3QgdG8gbGluayBvdXRwdXQgZGF0YQogICAgICAgICAgICAkTGlua091dHB1dERhdGF7ICRMaW5rVHlwZSAuICc6OicgLiAkRGlyZWN0aW9uIH0tPntBcHBvaW50bWVudH0gPSBcQEl0ZW1MaXN0OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJUxpbmtPdXRwdXREYXRhOwp9Cgo9aXRlbSBDb250ZW50U3RyaW5nQ3JlYXRlKCkKCnJldHVybiBhIG91dHB1dCBzdHJpbmcKCiAgICBteSAkU3RyaW5nID0gJExheW91dE9iamVjdC0+Q29udGVudFN0cmluZ0NyZWF0ZSgKICAgICAgICBDb250ZW50RGF0YSA9PiAkSGFzaFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ29udGVudFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q29udGVudERhdGF9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb250ZW50RGF0YSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBTZWxlY3RhYmxlT2JqZWN0TGlzdCgpCgpyZXR1cm4gYW4gYXJyYXkgaGFzaCB3aXRoIHNlbGVjdGFibGUgb2JqZWN0cwoKUmV0dXJuCgogICAgQFNlbGVjdGFibGVPYmplY3RMaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICAgICAgVmFsdWUgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICB9LAogICAgKTsKCiAgICBAU2VsZWN0YWJsZU9iamVjdExpc3QgPSAkQmFja2VuZE9iamVjdC0+U2VsZWN0YWJsZU9iamVjdExpc3QoCiAgICAgICAgU2VsZWN0ZWQgPT4gJElkZW50aWZpZXIsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgU2VsZWN0YWJsZU9iamVjdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZWN0ZWQ7CiAgICBpZiAoICRQYXJhbXtTZWxlY3RlZH0gJiYgJFBhcmFte1NlbGVjdGVkfSBlcSAkU2VsZi0+e09iamVjdERhdGF9LT57T2JqZWN0fSApIHsKICAgICAgICAkU2VsZWN0ZWQgPSAxOwogICAgfQoKICAgICMgb2JqZWN0IHNlbGVjdCBsaXN0CiAgICBteSBAT2JqZWN0U2VsZWN0TGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3R9LAogICAgICAgICAgICBWYWx1ZSAgICA9PiAkU2VsZi0+e09iamVjdERhdGF9LT57UmVhbG5hbWV9LAogICAgICAgICAgICBTZWxlY3RlZCA9PiAkU2VsZWN0ZWQsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBPYmplY3RTZWxlY3RMaXN0Owp9Cgo9aXRlbSBTZWFyY2hPcHRpb25MaXN0KCkKCnJldHVybiBhbiBhcnJheSBoYXNoIHdpdGggc2VhcmNoIG9wdGlvbnMKClJldHVybgoKICAgIEBTZWFyY2hPcHRpb25MaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdBcHBvaW50bWVudFRpdGxlJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdUaXRsZScsCiAgICAgICAgICAgIElucHV0U3RyZyA9PiAkRm9ybVN0cmluZywKICAgICAgICAgICAgRm9ybURhdGEgID0+ICcxMjM0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdBcHBvaW50bWVudERlc2NyaXB0aW9uJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdEZXNjcmlwdGlvbicsCiAgICAgICAgICAgIElucHV0U3RyZyA9PiAkRm9ybVN0cmluZywKICAgICAgICAgICAgRm9ybURhdGEgID0+ICdCbGFCbGEnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0FwcG9pbnRtZW50Q2FsZW5kYXJJRCcsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnQ2FsZW5kYXInLAogICAgICAgICAgICBJbnB1dFN0cmcgPT4gJEZvcm1TdHJpbmcsCiAgICAgICAgICAgIEZvcm1EYXRhICA9PiAnQ2FsZW5kYXIxJywKICAgICAgICB9LAogICAgKTsKCiAgICBAU2VhcmNoT3B0aW9uTGlzdCA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hPcHRpb25MaXN0KAogICAgICAgIFN1Yk9iamVjdCA9PiAnQmxhJywgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hPcHRpb25MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtSG9vayA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpIb29rJykgfHwgJ1RpY2tldCMnOwoKICAgICMgc2VhcmNoIG9wdGlvbiBsaXN0CiAgICBteSBAU2VhcmNoT3B0aW9uTGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgPT4gJ0FwcG9pbnRtZW50VGl0bGUnLAogICAgICAgICAgICBOYW1lID0+IFRyYW5zbGF0YWJsZSgnVGl0bGUnKSwKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgPT4gJ0FwcG9pbnRtZW50RGVzY3JpcHRpb24nLAogICAgICAgICAgICBOYW1lID0+IFRyYW5zbGF0YWJsZSgnRGVzY3JpcHRpb24nKSwKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgPT4gJ0FwcG9pbnRtZW50Q2FsZW5kYXJJRCcsCiAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdDYWxlbmRhcicpLAogICAgICAgICAgICBUeXBlID0+ICdMaXN0JywKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb3Jta2V5CiAgICBmb3IgbXkgJFJvdyAoQFNlYXJjaE9wdGlvbkxpc3QpIHsKICAgICAgICAkUm93LT57Rm9ybUtleX0gPSAnU0VBUkNIOjonIC4gJFJvdy0+e0tleX07CiAgICB9CgogICAgIyBhZGQgZm9ybSBkYXRhIGFuZCBpbnB1dCBzdHJpbmcKICAgIFJPVzoKICAgIGZvciBteSAkUm93IChAU2VhcmNoT3B0aW9uTGlzdCkgewoKICAgICAgICBuZXh0IFJPVyBpZiAkUm93LT57VHlwZX0gZXEgJ0hpZGRlbic7CgogICAgICAgICMgUHJlcGFyZSB0ZXh0IGlucHV0IGZpZWxkcy4KICAgICAgICBpZiAoICRSb3ctPntUeXBlfSBlcSAnVGV4dCcgKSB7CgogICAgICAgICAgICAjIGdldCBmb3JtIGRhdGEKICAgICAgICAgICAgJFJvdy0+e0Zvcm1EYXRhfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICRSb3ctPntGb3JtS2V5fSApOwoKICAgICAgICAgICAgIyBwYXJzZSB0aGUgaW5wdXQgdGV4dCBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5wdXRUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRSb3ctPntGb3JtS2V5fSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUm93LT57Rm9ybURhdGF9IHx8ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIHRoZSBpbnB1dCBzdHJpbmcKICAgICAgICAgICAgJFJvdy0+e0lucHV0U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnTGlua09iamVjdCcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFByZXBhcmUgZHJvcCBkb3duIGxpc3RzLgogICAgICAgIGVsc2lmICggJFJvdy0+e1R5cGV9IGVxICdMaXN0JyApIHsKCiAgICAgICAgICAgICMgZ2V0IGZvcm0gZGF0YQogICAgICAgICAgICBteSBARm9ybURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldEFycmF5KCBQYXJhbSA9PiAkUm93LT57Rm9ybUtleX0gKTsKICAgICAgICAgICAgJFJvdy0+e0Zvcm1EYXRhfSA9IFxARm9ybURhdGE7CgogICAgICAgICAgICBpZiAoICRSb3ctPntLZXl9IGVxICdBcHBvaW50bWVudENhbGVuZGFySUQnICkgewogICAgICAgICAgICAgICAgbXkgQENhbGVuZGFyTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpLT5DYWxlbmRhckxpc3QoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiAncncnLAogICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgQENhbGVuZGFyRGF0YSA9IG1hcCB7CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkXy0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkXy0+e0NhbGVuZGFyTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBzb3J0IHsgJGEtPntDYWxlbmRhck5hbWV9IGNtcCAkYi0+e0NhbGVuZGFyTmFtZX0gfSBAQ2FsZW5kYXJMaXN0OwoKICAgICAgICAgICAgICAgICRSb3ctPntJbnB1dFN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFxAQ2FsZW5kYXJEYXRhLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFJvdy0+e0Zvcm1LZXl9LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFJvdy0+e0Zvcm1EYXRhfSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfQoKICAgIHJldHVybiBAU2VhcmNoT3B0aW9uTGlzdDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OlByZWZlcmVuY2VzOjpBcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBhbGwgbm90aWZpY2F0aW9uIHRyYW5zcG9ydHMKICAgIG15ICRUcmFuc3BvcnRDb25maWdSYXcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uOjpUcmFuc3BvcnQnKSB8fCB7fTsKCiAgICAjIGdldCBtYWluIG9iamVjdAogICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICMgc2tpcCBhbGwgbm9uIGV4ZWN1dGFibGUgdHJhbnNwb3J0cwogICAgVFJBTlNQT1JUOgogICAgZm9yIG15ICRUcmFuc3BvcnROYW1lICggc29ydCBrZXlzICV7JFRyYW5zcG9ydENvbmZpZ1Jhd30gKSB7CgogICAgICAgICMgZGlzY2FyZCBub24gYXZhaWxhYmxlIHRyYW5zcG9ydHMKICAgICAgICBteSAkVHJhbnNwb3J0TG9hZGVkID0gJE1haW5PYmplY3QtPlJlcXVpcmUoCiAgICAgICAgICAgICRUcmFuc3BvcnRDb25maWdSYXctPnskVHJhbnNwb3J0TmFtZX0tPntNb2R1bGV9LAogICAgICAgICAgICBTaWxlbnQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHNraXAgdHJhbnNwb3J0CiAgICAgICAgbmV4dCBUUkFOU1BPUlQgaWYgISRUcmFuc3BvcnRMb2FkZWQ7CgogICAgICAgICRTZWxmLT57VHJhbnNwb3J0Q29uZmlnfS0+eyRUcmFuc3BvcnROYW1lfSA9ICRUcmFuc3BvcnRDb25maWdSYXctPnskVHJhbnNwb3J0TmFtZX07CiAgICB9CgogICAgIyBnZXQgTm90aWZpY2F0aW9uRXZlbnQgb2JqZWN0CiAgICBteSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnKTsKCiAgICBteSAlTm90aWZpY2F0aW9uTGlzdCA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uTGlzdCggVHlwZSA9PiAnQXBwb2ludG1lbnQnICk7CgogICAgbXkgJE5vdGlmaWNhdGlvbkNvbmZpZwogICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGcm9udGVuZDo6QWRtaW46OkFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcpOwoKICAgICMgZ2V0IHZhbGlkIG9iamVjdAogICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CgogICAgTk9USUZJQ0FUSU9OOgogICAgZm9yIG15ICROb3RpZmljYXRpb25JRCAoIHNvcnQga2V5cyAlTm90aWZpY2F0aW9uTGlzdCApIHsKCiAgICAgICAgIyBnZXQgbm90aWZpY2F0aW9uIGRldGFpbHMKICAgICAgICBteSAlTm90aWZpY2F0aW9uID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25HZXQoCiAgICAgICAgICAgIElEID0+ICROb3RpZmljYXRpb25JRCwKICAgICAgICApOwoKICAgICAgICAjIGRpc2NhcmQgaW52YWxpZCBub3RpZmljYXRpb25zCiAgICAgICAgbXkgQFZhbGlkSURzID0gJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpOwogICAgICAgIG5leHQgTk9USUZJQ0FUSU9OIGlmICFncmVwIHsgJE5vdGlmaWNhdGlvbntWYWxpZElEfSA9PSAkXyB9IEBWYWxpZElEczsKCiAgICAgICAgIyBkaXNjYXJkIGFsbCBub24gY3VzdG9taXphYmxlIG5vdGlmaWNhdGlvbnMKICAgICAgICBuZXh0IE5PVElGSUNBVElPTiBpZiAhJE5vdGlmaWNhdGlvbntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudH07CiAgICAgICAgbmV4dCBOT1RJRklDQVRJT04gaWYgISROb3RpZmljYXRpb257RGF0YX0tPntWaXNpYmxlRm9yQWdlbnR9LT5bMF07CgogICAgICAgICMgcmVtZW1iZXIgbm90aWZpY2F0aW9uIGRhdGEKICAgICAgICAkU2VsZi0+e05vdGlmaWNhdGlvbkxpc3R9LT57JE5vdGlmaWNhdGlvbklEfSA9IFwlTm90aWZpY2F0aW9uOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFBhcmFtIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQFBhcmFtczsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgcHJpbnQgdGFibGUgaGVhZGVyCiAgICBmb3IgbXkgJE5hbWUgKAogICAgICAgIHNvcnQgeyAkU2VsZi0+e1RyYW5zcG9ydENvbmZpZ30tPnskYX0tPntQcmlvfSA8PT4gJFNlbGYtPntUcmFuc3BvcnRDb25maWd9LT57JGJ9LT57UHJpb30gfQogICAgICAgIGtleXMgJXsgJFNlbGYtPntUcmFuc3BvcnRDb25maWd9IH0KICAgICAgICApCiAgICB7CgogICAgICAgIG15ICRUcmFuc3BvcnRDb25maWcgPSAkU2VsZi0+e1RyYW5zcG9ydENvbmZpZ30tPnskTmFtZX07CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zcG9ydE5hbWUgPT4gJFRyYW5zcG9ydENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgVHJhbnNwb3J0SWNvbiA9PiAkVHJhbnNwb3J0Q29uZmlnLT57SWNvbn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCB0YWJsZSBib2R5CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fSApICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0RhdGFGb3VuZE1zZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sU3BhbiA9PiAoIHNjYWxhciBrZXlzICV7ICRTZWxmLT57VHJhbnNwb3J0Q29uZmlnfSB9ICkgKyAxLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgdGhlIHVzZXIgcHJlZmVyZW5jZXMgKHRoaXMgbmVlZHMgdG8gYmUgZG9uZSBvbmx5IG9uY2UpCiAgICAgICAgbXkgJFVzZXJOb3RpZmljYXRpb25UcmFuc3BvcnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpLT5EZWNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte1VzZXJEYXRhfS0+e0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uVHJhbnNwb3J0fSwKICAgICAgICApOwoKICAgICAgICBOT1RJRklDQVRJT046CiAgICAgICAgZm9yIG15ICROb3RpZmljYXRpb25JRCAoCiAgICAgICAgICAgIHNvcnQgeyAkU2VsZi0+e05vdGlmaWNhdGlvbkxpc3R9LT57JGF9LT57TmFtZX0gY21wICRTZWxmLT57Tm90aWZpY2F0aW9uTGlzdH0tPnskYn0tPntOYW1lfSB9CiAgICAgICAgICAgIGtleXMgJXsgJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fSB9CiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICBuZXh0IE5PVElGSUNBVElPTiBpZiAhJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fS0+eyROb3RpZmljYXRpb25JRH07CgogICAgICAgICAgICBteSAkTm90aWZpY2F0aW9uID0gJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fS0+eyROb3RpZmljYXRpb25JRH07CgogICAgICAgICAgICAjIGZpbGwgbm90aWZpY2F0aW9uIGNvbHVtbiBibG9jawogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JvZHlSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uTmFtZSAgPT4gJE5vdGlmaWNhdGlvbi0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRpdGxlID0+ICROb3RpZmljYXRpb24tPntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudFRvb2x0aXB9LT5bMF0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgVmlzaWJsZUZvckFnZW50ICAgPT4gJE5vdGlmaWNhdGlvbi0+e0RhdGF9LT57VmlzaWJsZUZvckFnZW50fS0+WzBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIFRSQU5TUE9SVDoKICAgICAgICAgICAgZm9yIG15ICRUcmFuc3BvcnROYW1lICgKICAgICAgICAgICAgICAgIHNvcnQgeyAkU2VsZi0+e1RyYW5zcG9ydENvbmZpZ30tPnskYX0tPntQcmlvfSA8PT4gJFNlbGYtPntUcmFuc3BvcnRDb25maWd9LT57JGJ9LT57UHJpb30gfQogICAgICAgICAgICAgICAga2V5cyAleyAkU2VsZi0+e1RyYW5zcG9ydENvbmZpZ30gfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgbXkgJElkZW50aWZpZXIgPSAiTm90aWZpY2F0aW9uLSROb3RpZmljYXRpb25JRC0kVHJhbnNwb3J0TmFtZSI7CgogICAgICAgICAgICAgICAgbXkgJFRyYW5zcG9ydEVuYWJsZWQgPSBncmVwIHsgJF8gZXEgJFRyYW5zcG9ydE5hbWUgfSBAeyAkTm90aWZpY2F0aW9uLT57RGF0YX0tPntUcmFuc3BvcnRzfSB9OwoKICAgICAgICAgICAgICAgIG15ICRBZ2VudEVuYWJsZWRCeURlZmF1bHQKICAgICAgICAgICAgICAgICAgICA9IGdyZXAgeyAkXyBlcSAkVHJhbnNwb3J0TmFtZSB9IEB7ICROb3RpZmljYXRpb24tPntEYXRhfS0+e0FnZW50RW5hYmxlZEJ5RGVmYXVsdH0gfTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIHByZWZlcmVuY2UgZm9yIHRoaXMgdHJhbnNwb3J0IGFuZCBub3RpZmljYXRpb24gb3IgZmFsbCBiYWNrIHRvCiAgICAgICAgICAgICAgICAjICAgbm90aWZpY2F0aW9uIGRlZmF1bHQgaWYgdGhlcmUgaXMgbm8gdXNlciBwcmVmZXJlbmNlCiAgICAgICAgICAgICAgICBteSAkVXNlID0gJFVzZXJOb3RpZmljYXRpb25UcmFuc3BvcnQtPnskSWRlbnRpZmllcn0gLy8gJEFnZW50RW5hYmxlZEJ5RGVmYXVsdDsKCiAgICAgICAgICAgICAgICBteSAkQ2hlY2tlZCAgICAgPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgICAgICAgICAgbXkgJEhpZGRlblZhbHVlID0gMTsKICAgICAgICAgICAgICAgIGlmICggISRVc2UgKSB7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrZWQgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJEhpZGRlblZhbHVlID0gMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGZpbGwgZWFjaCB0cmFuc3BvcnQgY29sdW1uCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdCb2R5VHJhbnNwb3J0Q29sdW1uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkVHJhbnNwb3J0RW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdCb2R5VHJhbnNwb3J0Q29sdW1uRW5hYmxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uTmFtZSA9PiAkTm90aWZpY2F0aW9uLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnROYW1lICAgID0+ICRUcmFuc3BvcnROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciAgICAgICA9PiAkSWRlbnRpZmllciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZWQgICAgICAgICAgPT4gJENoZWNrZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWRkZW5WYWx1ZSAgICAgID0+ICRIaWRkZW5WYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2VuZXJhdGUgSFRNTAogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ1ByZWZlcmVuY2VzTm90aWZpY2F0aW9uRXZlbnQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAjIGdlbmVyYXRlIHJldHVybiBzdHJ1Y3R1cmUgZm9yIGdlbmVyaWMgIk9wdGlvbiIgYmxvY2sgaW4gQWdlbnRQcmVmZXJlbmNlcwogICAgcHVzaCgKICAgICAgICBAUGFyYW1zLAogICAgICAgIHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBCbG9jayA9PiAnUmF3SFRNTCcsCiAgICAgICAgICAgIEhUTUwgID0+ICRPdXRwdXQsCiAgICAgICAgICAgIE5hbWUgID0+ICdOb3RpZmljYXRpb25FdmVudFRyYW5zcG9ydCcsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBQYXJhbXM7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBASWRlbnRpZmllckxpc3Q7CiAgICBteSBATWFuZGF0b3J5Tm90aWZpY2F0aW9uSURzOwoKICAgIE5PVElGSUNBVElPTjoKICAgIGZvciBteSAkTm90aWZpY2F0aW9uSUQgKCBzb3J0IGtleXMgJXsgJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fSB9ICkgewoKICAgICAgICBuZXh0IE5PVElGSUNBVElPTiBpZiAhJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fS0+eyROb3RpZmljYXRpb25JRH07CgogICAgICAgIG15ICROb3RpZmljYXRpb24gICAgICAgICAgPSAkU2VsZi0+e05vdGlmaWNhdGlvbkxpc3R9LT57JE5vdGlmaWNhdGlvbklEfTsKICAgICAgICBteSAkTm90aWZpY2F0aW9uTWFuZGF0b3J5ID0gMDsKICAgICAgICBpZiAoICROb3RpZmljYXRpb24tPntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudH0gJiYgJE5vdGlmaWNhdGlvbi0+e0RhdGF9LT57VmlzaWJsZUZvckFnZW50fS0+WzBdID09IDIgKSB7CiAgICAgICAgICAgICROb3RpZmljYXRpb25NYW5kYXRvcnkgPSAxOwogICAgICAgICAgICBwdXNoIEBNYW5kYXRvcnlOb3RpZmljYXRpb25JRHMsICROb3RpZmljYXRpb25JRDsKICAgICAgICB9CgogICAgICAgIFRSQU5TUE9SVDoKICAgICAgICBmb3IgbXkgJFRyYW5zcG9ydE5hbWUgKCBzb3J0IGtleXMgJXsgJFNlbGYtPntUcmFuc3BvcnRDb25maWd9IH0gKSB7CiAgICAgICAgICAgIG5leHQgVFJBTlNQT1JUIGlmICFncmVwIHsgJF8gZXEgJFRyYW5zcG9ydE5hbWUgfSBAeyAkTm90aWZpY2F0aW9uLT57RGF0YX0tPntUcmFuc3BvcnRzfSB9OwogICAgICAgICAgICBwdXNoIEBJZGVudGlmaWVyTGlzdCwgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIk5vdGlmaWNhdGlvbi0kTm90aWZpY2F0aW9uSUQtJFRyYW5zcG9ydE5hbWUiLAogICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uSUQgPT4gJE5vdGlmaWNhdGlvbklELAogICAgICAgICAgICAgICAgSXNNYW5kYXRvcnkgICAgPT4gJE5vdGlmaWNhdGlvbk1hbmRhdG9yeSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkVXNlck9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICVVc2VyTm90aWZpY2F0aW9uVHJhbnNwb3J0OwogICAgbXkgJU1hbmRhdG9yeUZ1bGZpbGxlZDsKICAgIGZvciBteSAkSWRlbnRpZmllciAoQElkZW50aWZpZXJMaXN0KSB7CiAgICAgICAgJFVzZXJOb3RpZmljYXRpb25UcmFuc3BvcnR7ICRJZGVudGlmaWVyLT57TmFtZX0gfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRJZGVudGlmaWVyLT57TmFtZX0gKSB8fCAwOwoKICAgICAgICAjIGNoZWNrIGlmIHRoaXMgaXMgYSBtYW5kYXRvcnkgbm90aWZpY2F0aW9uIGFuZCB0aGlzIHRyYW5zcG9ydCBpcyBzZWxlY3RlZAogICAgICAgIGlmICggJFVzZXJOb3RpZmljYXRpb25UcmFuc3BvcnR7ICRJZGVudGlmaWVyLT57TmFtZX0gfSA9PSAxICkgewogICAgICAgICAgICAkTWFuZGF0b3J5RnVsZmlsbGVkeyAkSWRlbnRpZmllci0+e05vdGlmaWNhdGlvbklEfSB9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIG5vdyBjaGVjayBpZiB0aGVyZSBhcmUgbm90aWZpY2F0aW9ucyBmb3Igd2hpY2ggbm8gdHJhbnNwb3J0IGhhcyBiZWVuIHNlbGVjdGVkCiAgICBmb3IgbXkgJE5vdGlmaWNhdGlvbklEIChATWFuZGF0b3J5Tm90aWZpY2F0aW9uSURzKSB7CiAgICAgICAgaWYgKCAkTWFuZGF0b3J5RnVsZmlsbGVkeyROb3RpZmljYXRpb25JRH0gIT0gMSApIHsKICAgICAgICAgICAgJFNlbGYtPntFcnJvcn0gPSBUcmFuc2xhdGFibGUoCiAgICAgICAgICAgICAgICAiUGxlYXNlIG1ha2Ugc3VyZSB5b3UndmUgY2hvc2VuIGF0IGxlYXN0IG9uZSB0cmFuc3BvcnQgbWV0aG9kIGZvciBtYW5kYXRvcnkgbm90aWZpY2F0aW9ucy4iCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFZhbHVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKS0+RW5jb2RlKAogICAgICAgIERhdGEgPT4gXCVVc2VyTm90aWZpY2F0aW9uVHJhbnNwb3J0LAogICAgKTsKCiAgICAjIHVwZGF0ZSB1c2VyIHByZWZlcmVuY2VzCiAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0RlbW9TeXN0ZW0nKSApIHsKICAgICAgICAkVXNlck9iamVjdC0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICdBcHBvaW50bWVudE5vdGlmaWNhdGlvblRyYW5zcG9ydCcsCiAgICAgICAgICAgIFZhbHVlICA9PiAkVmFsdWUgLy8gJycsCiAgICAgICAgKTsKICAgIH0KCiAgICAkU2VsZi0+e01lc3NhZ2V9ID0gVHJhbnNsYXRhYmxlKCdQcmVmZXJlbmNlcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseSEnKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIEVycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRTZWxmLT57RXJyb3J9IHx8ICcnOwp9CgpzdWIgTWVzc2FnZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e01lc3NhZ2V9IHx8ICcnOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxsYWJlbCBmb3I9IlJlY2lwaWVudEVtYWlsIj5bJSBUcmFuc2xhdGUoIkFkZGl0aW9uYWwgcmVjaXBpZW50IGVtYWlsIGFkZHJlc3NlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KPGRpdiBjbGFzcz0iRmllbGQiPgogICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlJlY2lwaWVudEVtYWlsIiBpZD0iUmVjaXBpZW50RW1haWwiIGNsYXNzPSJXNTBwYyIgdmFsdWU9IlslIERhdGEuUmVjaXBpZW50RW1haWwgfCBodG1sICVdIi8+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cgo8bGFiZWwgZm9yPSJUcmFuc3BvcnRFbWFpbFRlbXBsYXRlIj5bJSBUcmFuc2xhdGUoIkVtYWlsIHRlbXBsYXRlIikgfCBodG1sICVdOiA8L2xhYmVsPgo8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICBbJSBEYXRhLlRyYW5zcG9ydEVtYWlsVGVtcGxhdGVTdHJnICVdCiAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJVc2UgdGhpcyB0ZW1wbGF0ZSB0byBnZW5lcmF0ZSB0aGUgY29tcGxldGUgZW1haWwgKG9ubHkgZm9yIEhUTUwgZW1haWxzKS4iKSB8IGh0bWwgJV08L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFNFVCBPVFJTQnVzaW5lc3NMYWJlbCA9ICc8c3Ryb25nPk9UUlMgQnVzaW5lc3MgU29sdXRpb248L3N0cm9uZz7ihKInICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiQXBwb2ludG1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQiKSB8IGh0bWwgJV08L2gxPgoKICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25MaXN0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQWN0aW9ucyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9uTGlzdCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbk92ZXJ2aWV3IikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1sZWZ0Ij48L2k+WyUgVHJhbnNsYXRlKCJHbyB0byBvdmVydmlldyIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbk92ZXJ2aWV3IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uQWRkIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1BZGQiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLXBsdXMtc3F1YXJlIj48L2k+WyUgVHJhbnNsYXRlKCJBZGQgbm90aWZpY2F0aW9uIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPU5vdGlmaWNhdGlvbkV4cG9ydCIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtZG93bmxvYWQiPjwvaT5bJSBUcmFuc2xhdGUoIkV4cG9ydCBOb3RpZmljYXRpb25zIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aW9uQWRkIikgJV0KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aW9uTGlzdCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbkltcG9ydCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkNvbmZpZ3VyYXRpb24gSW1wb3J0IikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgdGhlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbiBtb2R1bGUuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iTm90aWZpY2F0aW9uSW1wb3J0Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJGaWxlVXBsb2FkIiBpZD0iRmlsZVVwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iMTgiIGNsYXNzPSJGaXhlZCBXMTAwcGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5GaWxlVXBsb2FkSW52YWxpZCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZpbGVVcGxvYWRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGaWxlVXBsb2FkU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJTZXBhcmF0ZWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9Ik92ZXJ3cml0ZUV4aXN0aW5nTm90aWZpY2F0aW9ucyIgbmFtZT0iT3ZlcndyaXRlRXhpc3RpbmdOb3RpZmljYXRpb25zIiB2YWx1ZT0iMSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJPdmVyd3JpdGVFeGlzdGluZ05vdGlmaWNhdGlvbnMiPlslIFRyYW5zbGF0ZSgiT3ZlcndyaXRlIGV4aXN0aW5nIG5vdGlmaWNhdGlvbnM/IikgfCBodG1sICVdPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiVXBsb2FkIE5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9uIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtdXBsb2FkIj48L2k+WyUgVHJhbnNsYXRlKCJJbXBvcnQgTm90aWZpY2F0aW9uIGNvbmZpZ3VyYXRpb24iKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkltcG9ydCIpICVdCiAgICA8L2Rpdj4KCgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3UmVzdWx0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiTGlzdCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iVzIwcGMiPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDb21tZW50IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlZhbGlkaXR5IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkNoYW5nZWQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciBXMTBwYyI+WyUgVHJhbnNsYXRlKCJFeHBvcnQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDZW50ZXIgVzEwcGMiPlslIFRyYW5zbGF0ZSgiQ29weSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciBXMTBwYyI+WyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1Jlc3VsdFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBbJSBJRiBEYXRhLlZhbGlkSUQgIT0gMSVdY2xhc3M9IkludmFsaWQiWyUgRU5EICVdPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1DaGFuZ2U7SUQ9WyUgRGF0YS5JRCB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9hPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuQ29tbWVudCB8IGh0bWwgJV0iPlslIERhdGEuQ29tbWVudCB8IHRydW5jYXRlKDI2KSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIFRyYW5zbGF0ZShEYXRhLlZhbGlkKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgRGF0YS5DcmVhdGVUaW1lIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj48YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249Tm90aWZpY2F0aW9uRXhwb3J0O0lEPVslIERhdGEuSUQgfCB1cmkgJV07WyUgRW52KCJDaGFsbGVuZ2VUb2tlblBhcmFtIikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtZG93bmxvYWQiPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJFeHBvcnQiKSB8IGh0bWwgJV08L3NwYW4+PC9hPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+PGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPU5vdGlmaWNhdGlvbkNvcHk7SUQ9WyUgRGF0YS5JRCB8IHVyaSAlXTtbJSBFbnYoIkNoYWxsZW5nZVRva2VuUGFyYW0iKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jb3B5Ij48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiQ29weSIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iVHJhc2hDYW4gTm90aWZpY2F0aW9uRGVsZXRlIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RGVsZXRlO0lEPVslIERhdGEuSUQgfCB1cmkgJV07WyUgRW52KCJDaGFsbGVuZ2VUb2tlblBhcmFtIikgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEZWxldGUgdGhpcyBub3RpZmljYXRpb24iKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtdHJhc2gtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld1Jlc3VsdFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiQoJy5Ob3RpZmljYXRpb25EZWxldGUnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewoKICAgIGlmICh3aW5kb3cuY29uZmlybShbJSBUcmFuc2xhdGUoIkRvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyBub3RpZmljYXRpb24/IikgfCBKU09OICVdKSkgewogICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICQodGhpcykuYXR0cignaHJlZicpOwogICAgfQoKICAgIC8vIGRvbid0IGludGVyZmVyZSB3aXRoIE1hc3RlckFjdGlvbgogICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgcmV0dXJuIGZhbHNlOwp9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgoKWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3UmVzdWx0IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3VXBkYXRlIikgJV0KCiAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSIgbmFtZT0iY29tcG9zZSIgaWQ9Ik5vdGlmaWNhdGlvbkV2ZW50Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkhlYWRlckFkZCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQWRkIE5vdGlmaWNhdGlvbiIpIHwgaHRtbCAlXTwvaDI+ClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJBZGQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJFZGl0IikgJV0KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IE5vdGlmaWNhdGlvbiIpIHwgaHRtbCAlXTwvaDI+ClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJFZGl0IikgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJbJSBEYXRhLkFjdGlvbiB8IHVyaSAlXUFjdGlvbiIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IklEIiB2YWx1ZT0iWyUgRGF0YS5JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOYW1lIiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiBpZD0iTmFtZSIgdmFsdWU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyBWYWxpZGF0ZV9SZXF1aXJlZCBbJSBEYXRhLk5hbWVTZXJ2ZXJFcnJvciAlXSIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNvbW1lbnQiPlslIFRyYW5zbGF0ZSgiQ29tbWVudCIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIGlkPSJDb21tZW50IiB2YWx1ZT0iWyUgRGF0YS5Db21tZW50IHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIiBtYXhsZW5ndGg9IjI1MCIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZpc2libGVGb3JBZ2VudCI+WyUgVHJhbnNsYXRlKCJTaG93IGluIGFnZW50IHByZWZlcmVuY2VzIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlZpc2libGVGb3JBZ2VudFN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZpc2libGVGb3JBZ2VudFRvb2x0aXAiPlslIFRyYW5zbGF0ZSgiQWdlbnQgcHJlZmVyZW5jZXMgdG9vbHRpcCIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlZpc2libGVGb3JBZ2VudFRvb2x0aXAiIGlkPSJWaXNpYmxlRm9yQWdlbnRUb29sdGlwIiBjbGFzcz0iVzUwcGMiIHZhbHVlPSJbJSBEYXRhLlZpc2libGVGb3JBZ2VudFRvb2x0aXAgfCBodG1sICVdIiBbJSBEYXRhLlZpc2libGVGb3JBZ2VudFRvb2x0aXBSZWFkb25seSAlXS8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJUaGlzIG1lc3NhZ2Ugd2lsbCBiZSBzaG93biBvbiB0aGUgYWdlbnQgcHJlZmVyZW5jZXMgc2NyZWVuIGFzIGEgdG9vbHRpcCBmb3IgdGhpcyBub3RpZmljYXRpb24uIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVmFsaWRJRCI+WyUgVHJhbnNsYXRlKCJWYWxpZGl0eSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5WYWxpZE9wdGlvbiAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkV2ZW50cyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJFdmVudHMiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRXZlbnQiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRXZlbnRzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRXZlbnRzRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJFdmVudHNTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIkhlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBTcGFjaW5nVG9wIENvbGxhcHNlZCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFwcG9pbnRtZW50IEZpbHRlciIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1VwZGF0ZVR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJUeXBlSUQiPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5UeXBlc1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3VXBkYXRlVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNhbGVuZGFySUQiPlslIFRyYW5zbGF0ZSgiQ2FsZW5kYXIiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2FsZW5kYXJTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJUaXRsZSI+WyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpdGxlIiBpZD0iVGl0bGUiIGNsYXNzPSJXNzVwYyIgdmFsdWU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJMb2NhdGlvbiI+WyUgVHJhbnNsYXRlKCJMb2NhdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkxvY2F0aW9uIiBpZD0iTG9jYXRpb24iIGNsYXNzPSJXNzVwYyIgdmFsdWU9IlslIERhdGEuTG9jYXRpb24gfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1VwZGF0ZVRlYW0iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJUZWFtSUQiPlslIFRyYW5zbGF0ZSgiVGVhbSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5UZWFtU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdVcGRhdGVUZWFtIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJlc291cmNlSUQiPlslIFRyYW5zbGF0ZSgiUmVzb3VyY2UiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVzb3VyY2VTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlJlY2lwaWVudHMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVjaXBpZW50cyI+WyUgVHJhbnNsYXRlKCJTZW5kIHRvIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY2lwaWVudHNTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSZWNpcGllbnRBZ2VudHMiPlslIFRyYW5zbGF0ZSgiU2VuZCB0byB0aGVzZSBhZ2VudHMiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVjaXBpZW50QWdlbnRzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVjaXBpZW50R3JvdXBzIj5bJSBUcmFuc2xhdGUoIlNlbmQgdG8gYWxsIGdyb3VwIG1lbWJlcnMiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVjaXBpZW50R3JvdXBzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVjaXBpZW50Um9sZXMiPlslIFRyYW5zbGF0ZSgiU2VuZCB0byBhbGwgcm9sZSBtZW1iZXJzIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY2lwaWVudFJvbGVzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VuZE9uT3V0T2ZPZmZpY2UiPlslIFRyYW5zbGF0ZSgiU2VuZCBvbiBvdXQgb2Ygb2ZmaWNlIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IlNlbmRPbk91dE9mT2ZmaWNlIiBpZD0iU2VuZE9uT3V0T2ZPZmZpY2UiIHZhbHVlPSIxIiBbJSBEYXRhLlNlbmRPbk91dE9mT2ZmaWNlQ2hlY2tlZCAlXSAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJBbHNvIHNlbmQgaWYgdGhlIHVzZXIgaXMgY3VycmVudGx5IG91dCBvZiBvZmZpY2UuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJPbmNlUGVyRGF5Ij5bJSBUcmFuc2xhdGUoIk9uY2UgcGVyIGRheSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJPbmNlUGVyRGF5IiBpZD0iT25jZVBlckRheSIgdmFsdWU9IjEiIFslIERhdGEuT25jZVBlckRheUNoZWNrZWQgJV0gLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIk5vdGlmaWNhdGlvbiBNZXRob2RzIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgVHJhbnNwb3J0c0NvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGVzZSBhcmUgdGhlIHBvc3NpYmxlIG1ldGhvZHMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZW5kIHRoaXMgbm90aWZpY2F0aW9uIHRvIGVhY2ggb2YgdGhlIHJlY2lwaWVudHMuIFBsZWFzZSBzZWxlY3QgYXQgbGVhc3Qgb25lIG1ldGhvZCBiZWxvdy4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRyYW5zcG9ydFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBEYXRhLlRyYW5zcG9ydE5hbWUgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUcmFuc3BvcnRSb3dFbmFibGVkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVHJhbnNwb3J0WyUgRGF0YS5UcmFuc3BvcnQgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRW5hYmxlIHRoaXMgbm90aWZpY2F0aW9uIG1ldGhvZCIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJUcmFuc3BvcnRzIiBpZD0iVHJhbnNwb3J0WyUgRGF0YS5UcmFuc3BvcnQgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5UcmFuc3BvcnQgfCBodG1sICVdIiBjbGFzcz0iVmFsaWRhdGVfT25lQ2hlY2tlZCBbJSBEYXRhLlRyYW5zcG9ydHNTZXJ2ZXJFcnJvciAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVHJhbnNwb3J0IikgJV06IFslIFRyYW5zbGF0ZShEYXRhLlRyYW5zcG9ydCkgJV0iIFslIERhdGEuVHJhbnNwb3J0Q2hlY2tlZCAlXSAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVHJhbnNwb3J0WyUgRGF0YS5UcmFuc3BvcnQgfCBodG1sICVdRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkF0IGxlYXN0IG9uZSBtZXRob2QgaXMgbmVlZGVkIHBlciBub3RpZmljYXRpb24uIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUcmFuc3BvcnRbJSBEYXRhLlRyYW5zcG9ydCB8IGh0bWwgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiQXQgbGVhc3Qgb25lIG1ldGhvZCBpcyBuZWVkZWQgcGVyIG5vdGlmaWNhdGlvbi4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkFnZW50RW5hYmxlZEJ5RGVmYXVsdFslIERhdGEuVHJhbnNwb3J0IHwgaHRtbCAlXSIgY2xhc3M9IkFnZW50RW5hYmxlZEJ5RGVmYXVsdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkFjdGl2ZSBieSBkZWZhdWx0IGluIGFnZW50IHByZWZlcmVuY2VzIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBBZ2VudEVuYWJsZWRCeURlZmF1bHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJBZ2VudEVuYWJsZWRCeURlZmF1bHQiIGlkPSJBZ2VudEVuYWJsZWRCeURlZmF1bHRbJSBEYXRhLlRyYW5zcG9ydCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLlRyYW5zcG9ydCB8IGh0bWwgJV0iICB0aXRsZT0iIiBbJSBEYXRhLkFnZW50RW5hYmxlZEJ5RGVmYXVsdENoZWNrZWQgJV0gLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIlRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGFzc2lnbmVkIHJlY2lwaWVudCBhZ2VudHMgd2hvIGRpZG4ndCBtYWtlIGEgY2hvaWNlIGZvciB0aGlzIG5vdGlmaWNhdGlvbiBpbiB0aGVpciBwcmVmZXJlbmNlcyB5ZXQuIElmIHRoZSBib3ggaXMgZW5hYmxlZCwgdGhlIG5vdGlmaWNhdGlvbiB3aWxsIGJlIHNlbnQgdG8gc3VjaCBhZ2VudHMuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZXR0aW5nc1N0cmluZyAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiVHJhbnNwb3J0Um93RW5hYmxlZCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRyYW5zcG9ydFJvd0Rpc2FibGVkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBub3QgYXZhaWxhYmxlLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyYW5zcG9ydFJvd0Rpc2FibGVkIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHJhbnNwb3J0Um93UmVjb21tZW5kYXRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBJbmZvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZG1pbk9UUlNCdXNpbmVzcyIgY2xhc3M9IkJ1dHRvbiI+PGkgY2xhc3M9ImZhIGZhLWFuZ2xlLWRvdWJsZS11cCI+PC9pPiBbJSBUcmFuc2xhdGUoIlVwZ3JhZGUgdG8gJXMiLCBPVFJTQnVzaW5lc3NMYWJlbCkgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVHJhbnNwb3J0Um93UmVjb21tZW5kYXRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyYW5zcG9ydFJvdyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk5vRGF0YUZvdW5kTXNnVHJhbnNwb3J0IikgJV0KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm8gbm90aWZpY2F0aW9uIG1ldGhvZCBmb3VuZC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+ClslIFJlbmRlckJsb2NrRW5kKCJOb0RhdGFGb3VuZE1zZ1RyYW5zcG9ydCIpICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkFkZE1ldGhvZCgiVmFsaWRhdGVfT25lQ2hlY2tlZCIsIGZ1bmN0aW9uKFZhbHVlLCBFbGVtZW50KSB7CiAgICAgICAgaWYoJCgiLlZhbGlkYXRlX09uZUNoZWNrZWQ6Y2hlY2tib3g6Y2hlY2tlZCIpLmxlbmd0aCA+IDApewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKCiAgICBDb3JlLkZvcm0uVmFsaWRhdGUuQWRkUnVsZSgiVmFsaWRhdGVfT25lQ2hlY2tlZCIsIHsKICAgICAgICBWYWxpZGF0ZV9PbmVDaGVja2VkOiB0cnVlCiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIk5vdGlmaWNhdGlvbiBUZXh0IikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3MgPSJOb3RpZmljYXRpb25MYW5ndWFnZUNvbnRhaW5lciI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSaWNoVGV4dCIpICVdClslIEluc2VydFRlbXBsYXRlKCJSaWNoVGV4dEVkaXRvci50dCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJSaWNoVGV4dCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb3RpZmljYXRpb25MYW5ndWFnZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik5vdGlmaWNhdGlvbkxhbmd1YWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBTcGFjaW5nVG9wIFslIElGICFEYXRhLkxhbmd1YWdlICVdIENvbGxhcHNlZCBbJSBFTkQgJV0gIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSB0aGlzIHdpZGdldCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9IlRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuTGFuZ3VhZ2UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuTGFuZ3VhZ2UpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iV2FybmluZyI+J1slIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV0nICZtZGFzaDsgWyUgVHJhbnNsYXRlKCJUaGlzIGxhbmd1YWdlIGlzIG5vdCBwcmVzZW50IG9yIGVuYWJsZWQgb24gdGhlIHN5c3RlbS4gVGhpcyBub3RpZmljYXRpb24gdGV4dCBjb3VsZCBiZSBkZWxldGVkIGlmIGl0IGlzIG5vdCBuZWVkZWQgYW55bW9yZS4iKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm90aWZpY2F0aW9uTGFuZ3VhZ2VSZW1vdmVCdXR0b24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBZGRpdGlvbmFsSW5mb3JtYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdmFsdWU9IlJlbW92ZSBMYW5ndWFnZSIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBMYW5ndWFnZVJlbW92ZSIgaWQ9IlslIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fTGFuZ3VhZ2VfUmVtb3ZlIiBocmVmPSIiIG5hbWU9IkRhdGEuTGFuZ3VhZ2VJRF9MYW5ndWFnZV9SZW1vdmUiPjxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPjxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSBOb3RpZmljYXRpb24gTGFuZ3VhZ2UiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vdGlmaWNhdGlvbkxhbmd1YWdlUmVtb3ZlQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTGFuZ3VhZ2VJRCIgY2xhc3M9Ikxhbmd1YWdlSUQiIHZhbHVlPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdIi8+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9TdWJqZWN0IiBpZD0iWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9MYWJlbF9TdWJqZWN0IiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9TdWJqZWN0IiBpZD0iWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9TdWJqZWN0IiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIgY2xhc3M9Ilc3NXBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuU3ViamVjdFNlcnZlckVycm9yIHwgaHRtbCAlXSIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX1N1YmplY3RFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlslIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fU3ViamVjdFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX0JvZHkiIGlkPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX0xhYmVsX0JvZHkiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRleHQiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IlslIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fQm9keSIgaWQ9IlslIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fQm9keSIgY2xhc3M9IlJpY2hUZXh0IFZhbGlkYXRlX1JlcXVpcmVkUmljaFRleHQgWyUgRGF0YS5Cb2R5U2VydmVyRXJyb3IgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJNZXNzYWdlIGJvZHkiKSB8IGh0bWwgJV0iIHJvd3M9IjE1IiBjb2xzPSJbJSBDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSIpICVdIj5bJSBEYXRhLkJvZHkgfCBodG1sICVdPC90ZXh0YXJlYT4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9Cb2R5RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX0JvZHlTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTm90aWZpY2F0aW9uTGFuZ3VhZ2UiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGlkZGVuIFRlbXBsYXRlIE5vdGlmaWNhdGlvbkxhbmd1YWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSB0aGlzIHdpZGdldCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9IlRpdGxlIj48L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBZGRpdGlvbmFsSW5mb3JtYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdmFsdWU9IlJlbW92ZSBMYW5ndWFnZSIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBMYW5ndWFnZVJlbW92ZSIgaWQ9IlRlbXBsYXRlX0xhbmd1YWdlX1JlbW92ZSIgaHJlZj0iIiBuYW1lPSJUZW1wbGF0ZV9MYW5ndWFnZV9SZW1vdmUiPjxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPjxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSBOb3RpZmljYXRpb24gTGFuZ3VhZ2UiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iIiBjbGFzcz0iTGFuZ3VhZ2VJRCIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGVtcGxhdGVfU3ViamVjdCIgaWQ9IlRlbXBsYXRlX0xhYmVsX1N1YmplY3QiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGVtcGxhdGVfU3ViamVjdCIgaWQ9IlRlbXBsYXRlX1N1YmplY3QiIHZhbHVlPSIiIGNsYXNzPSJXNzVwYyIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUZW1wbGF0ZV9TdWJqZWN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRlbXBsYXRlX0JvZHkiIGlkPSJUZW1wbGF0ZV9MYWJlbF9Cb2R5IiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGV4dCIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSaWNoVGV4dEZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlRlbXBsYXRlX0JvZHkiIGNsYXNzPSIiIG5hbWU9IlRlbXBsYXRlX0JvZHkiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1lc3NhZ2UgYm9keSIpIHwgaHRtbCAlXSIgcm93cz0iMTUiIGNvbHM9IlslIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIikgJV0iPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGVtcGxhdGVfQm9keUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJMYW5ndWFnZSI+WyUgVHJhbnNsYXRlKCJBZGQgbmV3IG5vdGlmaWNhdGlvbiBsYW5ndWFnZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhbmd1YWdlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGlkZGVuIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYW5ndWFnZU9yaWdTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwpDb3JlLkFnZW50LkFkbWluLk5vdGlmaWNhdGlvbkV2ZW50LkluaXQoewogICAgTG9jYWxpemF0aW9uOiB7CiAgICAgICAgRGVsZXRlTm90aWZpY2F0aW9uTGFuZ3VhZ2VNc2c6IFslIFRyYW5zbGF0ZSgiRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIG5vdGlmaWNhdGlvbiBsYW5ndWFnZT8iKSB8IEpTT04gJV0KICAgIH0KfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJTYXZlIENoYW5nZXMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgIDwvZm9ybT4KCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIFNwYWNpbmdUb3AgQ29sbGFwc2VkIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSB0aGlzIHdpZGdldCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlRhZyBSZWZlcmVuY2UiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4iKSB8IGh0bWwgJV08L3A+CgogICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJZb3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIHRhZ3MiKSB8IGh0bWwgJV06PC9wPgoKICAgICAgICAgICAgICAgIDxkbD4KICAgICAgICAgICAgICAgICAgICA8ZHQ+PGNvZGU+Jmx0O09UUlNfQVBQT0lOVE1FTlRfVElUTEVbMjBdJmd0OzwvY29kZT48L2R0PgogICAgICAgICAgICAgICAgICAgIDxkZD4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUbyBnZXQgdGhlIGZpcnN0IDIwIGNoYXJhY3RlciBvZiB0aGUgYXBwb2ludG1lbnQgdGl0bGUuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPC9kZD4KCiAgICAgICAgICAgICAgICAgICAgPGR0Pjxjb2RlPiZsdDtPVFJTX0FQUE9JTlRNRU5UXyomZ3Q7PC9jb2RlPjwvZHQ+CiAgICAgICAgICAgICAgICAgICAgPGRkPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIChbJSBUcmFuc2xhdGUoIiBlLiBnLiIpIHwgaHRtbCAlXSA8Y29kZT4mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OywgJmx0O09UUlNfQVBQT0lOVE1FTlRfU1RBUlRUSU1FJmd0OywgJmx0O09UUlNfQVBQT0lOVE1FTlRfREVTQ1JJUFRJT04mZ3Q7PC9jb2RlPikuCiAgICAgICAgICAgICAgICAgICAgPC9kZD4KCiAgICAgICAgICAgICAgICAgICAgPGR0Pjxjb2RlPiZsdDtPVFJTX0NBTEVOREFSXyomZ3Q7PC9jb2RlPjwvZHQ+CiAgICAgICAgICAgICAgICAgICAgPGRkPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIChbJSBUcmFuc2xhdGUoIiBlLiBnLiIpIHwgaHRtbCAlXSA8Y29kZT4mbHQ7T1RSU19DQUxFTkRBUl9DQUxFTkRBUklEJmd0OywgJmx0O09UUlNfQ0FMRU5EQVJfQ0FMRU5EQVJOQU1FJmd0OywgJmx0O09UUlNfQ0FMRU5EQVJfQ09MT1ImZ3Q7PC9jb2RlPikuCiAgICAgICAgICAgICAgICAgICAgPC9kZD4KCiAgICAgICAgICAgICAgICAgICAgPGR0Pjxjb2RlPiZsdDtPVFJTXyomZ3Q7PC9jb2RlPiBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdIDxjb2RlPiZsdDtPVFJTX05PVElGSUNBVElPTl9SRUNJUElFTlRfKiZndDs8L2NvZGU+PC9kdD4KICAgICAgICAgICAgICAgICAgICA8ZGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQXR0cmlidXRlcyBvZiB0aGUgcmVjaXBpZW50IHVzZXIgZm9yIHRoZSBub3RpZmljYXRpb24iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgKFslIFRyYW5zbGF0ZSgiIGUuIGcuIikgfCBodG1sICVdIDxjb2RlPiZsdDtPVFJTX1VzZXJGdWxsbmFtZSZndDs8L2NvZGU+IFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0gPGNvZGU+Jmx0O09UUlNfTk9USUZJQ0FUSU9OX1JFQ0lQSUVOVF9Vc2VyRnVsbG5hbWUmZ3Q7PC9jb2RlPikuCiAgICAgICAgICAgICAgICAgICAgPC9kZD4KCiAgICAgICAgICAgICAgICAgICAgPGR0Pjxjb2RlPiZsdDtPVFJTX0NPTkZJR18qJmd0OzwvY29kZT48L2R0PgogICAgICAgICAgICAgICAgICAgIDxkZD4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDb25maWcgb3B0aW9ucyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAoWyUgVHJhbnNsYXRlKCIgZS4gZy4iKSB8IGh0bWwgJV0gPGNvZGU+Jmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzwvY29kZT4pLgogICAgICAgICAgICAgICAgICAgIDwvZGQ+CiAgICAgICAgICAgICAgICA8L2RsPgoKICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkV4YW1wbGUgbm90aWZpY2F0aW9uIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3ViamVjdEV4YW1wbGUiPlslIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXTwvbGFiZWw+OgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3RFeGFtcGxlIiBpZD0iU3ViamVjdEV4YW1wbGUiIHZhbHVlPSJSZW1pbmRlcjogJmx0O09UUlNfQVBQT0lOVE1FTlRfVElUTEUmZ3Q7IiBzaXplPSI4MCIgbWF4bGVuZ3RoPSI4MCIgcmVhZG9ubHkgLz4KICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSZXNwb25zZUV4YW1wbGUiPlslIFRyYW5zbGF0ZSgiVGV4dCIpIHwgaHRtbCAlXTwvbGFiZWw+OgogICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSByb3dzPSIxMiIgY29scz0iNzAiIG5hbWU9IlJlc3BvbnNlRXhhbXBsZSIgaWQ9IlJlc3BvbnNlRXhhbXBsZSIgcmVhZG9ubHk+CkhpICZsdDtPVFJTX05PVElGSUNBVElPTl9SRUNJUElFTlRfVXNlckZpcnN0bmFtZSZndDssCgphcHBvaW50bWVudCAmcXVvdDsmbHQ7T1RSU19BUFBPSU5UTUVOVF9USVRMRSZndDsmcXVvdDsgaGFzIHJlYWNoZWQgaXRzIG5vdGlmaWNhdGlvbiB0aW1lLgoKRGVzY3JpcHRpb246ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0RFU0NSSVBUSU9OJmd0OwpMb2NhdGlvbjogJmx0O09UUlNfQVBQT0lOVE1FTlRfTE9DQVRJT04mZ3Q7CkNhbGVuZGFyOiAmbHQ7T1RSU19DQUxFTkRBUl9DQUxFTkRBUk5BTUUmZ3Q7ClN0YXJ0IGRhdGU6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1NUQVJUVElNRSZndDsKRW5kIGRhdGU6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0VORFRJTUUmZ3Q7CkFsbC1kYXk6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0FMTERBWSZndDsKUmVwZWF0OiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9SRUNVUlJJTkcmZ3Q7CgombHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OwoKLS0gJmx0O09UUlNfQ09ORklHX05vdGlmaWNhdGlvblNlbmRlck5hbWUmZ3Q7CiAgICAgICAgICAgICAgICA8L3RleHRhcmVhPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3VXBkYXRlIikgJV0KCiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlldyIpICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KPGRpdiBjbGFzcz0iT3ZlcnZpZXdCb3ggQVJJQVJvbGVNYWluIFslIERhdGEuVmlldyB8IGh0bWwgJV0iPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiQWdlbmRhIE92ZXJ2aWV3IikgfCBodG1sICVdPC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJPdmVydmlld0NvbnRyb2wiIGlkPSJPdmVydmlld0NvbnRyb2wiPgogICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRyb2xSb3ciPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXIiKSAlXQogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJUYWJzIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iQWN0aXZlIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07RmlsdGVyPVslIERhdGEuRmlsdGVyIHwgdXJpICVdO1N0YXJ0PVslIERhdGEuU3RhcnQgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZE5vdCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO0ZpbHRlcj1bJSBEYXRhLkZpbHRlciB8IHVyaSAlXTtTdGFydD1bJSBEYXRhLlN0YXJ0IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkTm90IikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbSIpICVdCiAgICAgICAgICAgICAgICA8L3VsPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXIiKSAlXQoKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJCdXR0b25zIEhlYWRlckxlZnQiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2U7U3ViYWN0aW9uPU92ZXJ2aWV3IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBJbmxpbmUiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FsZW5kYXItbyI+PC9pPiBbJSBUcmFuc2xhdGUoIk1hbmFnZSBDYWxlbmRhcnMiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9hPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcHBvaW50bWVudENyZWF0ZUJ1dHRvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgPGEgaWQ9IkFwcG9pbnRtZW50Q3JlYXRlQnV0dG9uIiBocmVmPSIjIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBJbmxpbmUiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUiPjwvaT4gWyUgVHJhbnNsYXRlKCJBZGQgQXBwb2ludG1lbnQiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXBwb2ludG1lbnRDcmVhdGVCdXR0b24iKSAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJCdXR0b25zIEhlYWRlclJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtGaWx0ZXI9WyUgRGF0YS5GaWx0ZXIgfCB1cmkgJV0iIGNsYXNzPSJDYWxsRm9yQWN0aW9uIElubGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiVG9kYXkiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO0ZpbHRlcj1bJSBEYXRhLkZpbHRlciB8IHVyaSAlXTtTdGFydD1bJSBEYXRhLlN0YXJ0IHwgdXJpICVdO0p1bXA9UHJldiIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gSW5saW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZhIGZhLWNoZXZyb24tbGVmdCI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtGaWx0ZXI9WyUgRGF0YS5GaWx0ZXIgfCB1cmkgJV07U3RhcnQ9WyUgRGF0YS5TdGFydCB8IHVyaSAlXTtKdW1wPU5leHQiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIElubGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmYSBmYS1jaGV2cm9uLXJpZ2h0Ij48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBEYXRhLkhlYWRlclRpdGxlIHwgaHRtbCAlXSA8c3BhbiBjbGFzcz0iV2Vla051bWJlciI+WyUgRGF0YS5IZWFkZXJUaXRsZUNXIHwgaHRtbCAlXTwvc3Bhbj48L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0iT3ZlcnZpZXdCb2R5IiBjbGFzcz0iT3ZlcnZpZXcgVGlja2V0TGlzdCI+CiAgICA8dGFibGUgY2xhc3M9IlRhYmxlU21hbGwgTm9DZWxsc3BhY2luZyI+CiAgICAgICAgPHRoZWFkPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ik92ZXJ2aWV3SGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDb2xvciIpIHwgaHRtbCAlXSI+PC9zcGFuPgogICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iT3ZlcnZpZXdIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxhPlslIFRyYW5zbGF0ZSgiQ2FsZW5kYXIiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJPdmVydmlld0hlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGE+WyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ik92ZXJ2aWV3SGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8YT5bJSBUcmFuc2xhdGUoIlN0YXJ0IGRhdGUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJPdmVydmlld0hlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGE+WyUgVHJhbnNsYXRlKCJFbmQgZGF0ZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ik92ZXJ2aWV3SGVhZGVyIFcxMHBjIj4KICAgICAgICAgICAgICAgICAgICA8YT5bJSBUcmFuc2xhdGUoIkFsbC1kYXkiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJPdmVydmlld0hlYWRlciBXMTBwYyI+CiAgICAgICAgICAgICAgICAgICAgPGE+WyUgVHJhbnNsYXRlKCJSZXBlYXQiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJPdmVydmlld0hlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGE+WyUgVHJhbnNsYXRlKCJOb3RpZmljYXRpb24iKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGhlYWQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFwcG9pbnRtZW50R3JvdXAiKSAlXQogICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgPHRyIGNsYXNzPSJEYXRlRGl2aWRlciBbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iOCI+WyUgRGF0YS5DdXJyZW50RGF5IHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90Ym9keT4KICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFwcG9pbnRtZW50QWN0aW9uUm93IikgJV0KICAgICAgICAgICAgPHRyIGlkPSJBcHBvaW50bWVudElEX1slIERhdGEuQXBwb2ludG1lbnRJRCB8IGh0bWwgJV0iIGNsYXNzPSJNYXN0ZXJBY3Rpb24iPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJGbGFncyBDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZsYWcgU21hbGwiIHRpdGxlPSJbJSBEYXRhLkNhbGVuZGFyRGF0YS4ke0RhdGEuQ2FsZW5kYXJJRH0uQ2FsZW5kYXJOYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJDYWxlbmRhckNvbG9yIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogWyUgRGF0YS5DYWxlbmRhckRhdGEuJHtEYXRhLkNhbGVuZGFySUR9LkNvbG9yIHwgaHRtbCAlXTsiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5DYWxlbmRhckRhdGEuJHtEYXRhLkNhbGVuZGFySUR9LkNhbGVuZGFyTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNhbGVuZGFyRGF0YS4ke0RhdGEuQ2FsZW5kYXJJRH0uQ2FsZW5kYXJOYW1lIHwgdHJ1bmNhdGUoMjEpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iTWFzdGVyQWN0aW9uTGluayIgZGF0YS1hcHBvaW50bWVudC1pZD0iWyUgRGF0YS5BcHBvaW50bWVudElEIHwgaHRtbCAlXSIgaHJlZj0iIyIgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5UaXRsZSB8IHRydW5jYXRlKDM2KSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhcnREYXRlIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkVuZERhdGUgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuQWxsRGF5ID09IDEgJV0KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJZZXMiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm8iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5SZWN1cnJpbmcgPT0gMSAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlllcyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLk5vdGlmaWNhdGlvbkRhdGUgJV0KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Ob3RpZmljYXRpb25EYXRlIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFwcG9pbnRtZW50QWN0aW9uUm93IikgJV0KICAgICAgICA8L3Rib2R5PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXBwb2ludG1lbnRHcm91cCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFwcG9pbnRtZW50Tm9EYXRhUm93IikgJV0KICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI3Ij4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGJvZHk+ClslIFJlbmRlckJsb2NrRW5kKCJBcHBvaW50bWVudE5vRGF0YVJvdyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNhbGVuZGFyc05vdEZvdW5kIikgJV0KICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI3Ij4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90Ym9keT4KWyUgUmVuZGVyQmxvY2tFbmQoIkNhbGVuZGFyc05vdEZvdW5kIikgJV0KICAgIDwvdGFibGU+CjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwoKQ29yZS5Db25maWcuU2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zTG9hZGluZycsIFslIFRyYW5zbGF0ZSgiTG9hZGluZy4uLiIpIHwgSlNPTiAlXSk7CkNvcmUuQ29uZmlnLlNldCgnQXBwb2ludG1lbnRDYWxlbmRhckFnZW5kYU92ZXJ2aWV3JywgdHJ1ZSk7Cgp2YXIgUGFyYW1zID0gewogICAgRGlhbG9nVGV4dDogewogICAgICAgIEVkaXRUaXRsZTogWyUgVHJhbnNsYXRlKCJBcHBvaW50bWVudCIpIHwgSlNPTiAlXSwKICAgICAgICBPY2N1cnJlbmNlVGl0bGU6IFslIFRyYW5zbGF0ZSgiVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCIpIHwgSlNPTiAlXSwKICAgICAgICBPY2N1cnJlbmNlVGV4dDogWyUgVHJhbnNsYXRlKCJXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8iKSB8IEpTT04gJV0sCiAgICAgICAgT2NjdXJyZW5jZUFsbDogWyUgVHJhbnNsYXRlKCJBbGwgb2NjdXJyZW5jZXMiKSB8IEpTT04gJV0sCiAgICAgICAgT2NjdXJyZW5jZUp1c3RUaGlzOiBbJSBUcmFuc2xhdGUoIkp1c3QgdGhpcyBvY2N1cnJlbmNlIikgfCBKU09OICVdCiAgICB9LAogICAgQ2FsbGJhY2tzOiB7CiAgICAgICAgRWRpdEFjdGlvbjogWyUgRGF0YS5FZGl0QWN0aW9uIHwgSlNPTiAlXSwKICAgICAgICBFZGl0TWFza1N1YmFjdGlvbjogWyUgRGF0YS5FZGl0TWFza1N1YmFjdGlvbiB8IEpTT04gJV0KICAgIH0KfTsKCiQoJyNBcHBvaW50bWVudENyZWF0ZUJ1dHRvbicpLm9mZignY2xpY2snKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuT3BlbkVkaXREaWFsb2coUGFyYW1zLCB7CiAgICAgICAgU3RhcnQ6ICQuZnVsbENhbGVuZGFyLm1vbWVudChbJSBEYXRhLlN0YXJ0IHwgSlNPTiAlXSkuYWRkKDEsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKSwKICAgICAgICBFbmQ6ICQuZnVsbENhbGVuZGFyLm1vbWVudChbJSBEYXRhLlN0YXJ0IHwgSlNPTiAlXSkuYWRkKDIsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKSwKICAgIH0pOwoKICAgIHJldHVybiBmYWxzZTsKfSk7CiQoJy5NYXN0ZXJBY3Rpb24nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgdmFyICRNYXN0ZXJBY3Rpb25MaW5rID0gJCh0aGlzKS5maW5kKCcuTWFzdGVyQWN0aW9uTGluaycpLAogICAgICAgIEFwcG9pbnRtZW50SUQgPSAkTWFzdGVyQWN0aW9uTGluay5kYXRhKCdhcHBvaW50bWVudElkJyk7CgogICAgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLk9wZW5FZGl0RGlhbG9nKFBhcmFtcywgewogICAgICAgIENhbEV2ZW50OiB7CiAgICAgICAgICAgIGlkOiBBcHBvaW50bWVudElECiAgICAgICAgfQogICAgfSk7CgogICAgcmV0dXJuIGZhbHNlOwp9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgoKICAgIDxoMSBjbGFzcz0iSGVhZGVyIj5bJSBUcmFuc2xhdGUoIkFwcG9pbnRtZW50IEltcG9ydCIpIHwgaHRtbCAlXTwvaDE+CgogICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFjdGlvbnMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0Ij4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJCYWNrIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkdvIGJhY2siKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWxlZnQiPjwvaT5bJSBUcmFuc2xhdGUoIkdvIGJhY2siKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkRlc2NyaXB0aW9uIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVXBsb2FkZWQgZmlsZSBtdXN0IGJlIGluIHZhbGlkIGlDYWwgZm9ybWF0ICguaWNzKS4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIklmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgJ2NyZWF0ZScgcGVybWlzc2lvbnMuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkltcG9ydCBBcHBvaW50bWVudHMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSW1wb3J0Ii8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJGaWxlVXBsb2FkIiBjbGFzcz0iTWFuZGF0b3J5Ij48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiVXBsb2FkIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJGaWxlVXBsb2FkIiBpZD0iRmlsZVVwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iMTgiIGNsYXNzPSJGaXhlZCBXMTAwcGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5GaWxlVXBsb2FkSW52YWxpZCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZpbGVVcGxvYWRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGaWxlVXBsb2FkU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNhbGVuZGFySUQiIGNsYXNzPSJNYW5kYXRvcnkiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJDYWxlbmRhciIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNhbGVuZGFyICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDYWxlbmRhcklERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2FsZW5kYXJJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJVcGRhdGVFeGlzdGluZ0FwcG9pbnRtZW50cyI+WyUgVHJhbnNsYXRlKCJVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9IjEiIG5hbWU9IlVwZGF0ZUV4aXN0aW5nQXBwb2ludG1lbnRzIiBpZD0iVXBkYXRlRXhpc3RpbmdBcHBvaW50bWVudHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQWxsIGV4aXN0aW5nIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIgd2l0aCBzYW1lIFVuaXF1ZUlEIHdpbGwgYmUgb3ZlcndyaXR0ZW4uIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJVcGxvYWQgY2FsZW5kYXIiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiSW1wb3J0IGFwcG9pbnRtZW50cyIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgoKICAgIDxoMSBjbGFzcz0iSGVhZGVyIj5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIE1hbmFnZW1lbnQiKSB8IGh0bWwgJV08L2gxPgoKICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgoKICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQWN0aW9ucyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KCiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgpbJSBJRiBFbnYoIlN1YmFjdGlvbiIpID09ICJPdmVydmlldyIgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJCYWNrIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXciIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiR28gYmFjayIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtbGVmdCI+PC9pPlslIFRyYW5zbGF0ZSgiR28gYmFjayIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIEVMU0lGIEVudigiU3ViYWN0aW9uIikgIT0gIiIgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJCYWNrIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkdvIGJhY2siKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWxlZnQiPjwvaT5bJSBUcmFuc2xhdGUoIkdvIGJhY2siKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iT3ZlcnZpZXciIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDYWxlbmRhciBPdmVydmlldyIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FsZW5kYXIiPjwvaT5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIE92ZXJ2aWV3IikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk1haW5BY3Rpb25zIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJBZGQiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2U7U3ViYWN0aW9uPU5ldyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJBZGQgbmV3IENhbGVuZGFyIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZSI+PC9pPlslIFRyYW5zbGF0ZSgiQWRkIENhbGVuZGFyIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICA8bGk+ClslIElGIERhdGEuVmFsaWRDb3VudCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iSW1wb3J0QXBwb2ludG1lbnRzIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudEltcG9ydCIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJJbXBvcnQgQXBwb2ludG1lbnRzIikgfCBodG1sICVdIj4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iSW1wb3J0QXBwb2ludG1lbnRzIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIgRGlzYWJsZWQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkltcG9ydCBBcHBvaW50bWVudHMiKSB8IGh0bWwgJV0iPgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS11cGxvYWQiPjwvaT5bJSBUcmFuc2xhdGUoIkltcG9ydCBBcHBvaW50bWVudHMiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiTWFpbkFjdGlvbnMiKSAlXQogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbkltcG9ydCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIEltcG9ydCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkhlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0IFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkNhbGVuZGFySW1wb3J0Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJGaWxlVXBsb2FkIiBpZD0iRmlsZVVwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iMTgiIGNsYXNzPSJGaXhlZCBXMTAwcGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5GaWxlVXBsb2FkSW52YWxpZCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZpbGVVcGxvYWRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGaWxlVXBsb2FkU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzSW1wb3J0IiBuYW1lPSJPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzIiB2YWx1ZT0iMSIgY2hlY2tlZD0iY2hlY2tlZCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzSW1wb3J0Ij5bJSBUcmFuc2xhdGUoIk92ZXJ3cml0ZSBleGlzdGluZyBlbnRpdGllcyIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIgU3BhY2luZ1RvcCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJVcGxvYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLXVwbG9hZCI+PC9pPlslIFRyYW5zbGF0ZSgiSW1wb3J0IENhbGVuZGFyIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25JbXBvcnQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDYWxlbmRhckZpbHRlciIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj48bGFiZWwgZm9yPSJGaWx0ZXJDYWxlbmRhcnMiPlslIFRyYW5zbGF0ZSgiRmlsdGVyIGZvciBjYWxlbmRhcnMiKSB8IGh0bWwgJV08L2xhYmVsPjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRmlsdGVyQ2FsZW5kYXJzIiBjbGFzcz0iRmlsdGVyQm94IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJKdXN0IHN0YXJ0IHR5cGluZyB0byBmaWx0ZXIuLi4iKSB8IGh0bWwgJV0iIG5hbWU9IkZpbHRlckNhbGVuZGFycyIgdmFsdWU9IiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRmlsdGVyIGZvciBjYWxlbmRhcnMiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNhbGVuZGFyRmlsdGVyIikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiRGVzY3JpcHRpb24iKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk1vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlJlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZShEYXRhLlRpdGxlKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSIgaWQ9IlVzZXIiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJOYW1lIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkdyb3VwIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlZhbGlkaXR5IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkNoYW5nZWQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciBXMTBwYyI+WyUgVHJhbnNsYXRlKCJFeHBvcnQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDZW50ZXIgVzEwcGMiPlslIFRyYW5zbGF0ZSgiRG93bmxvYWQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDZW50ZXIgVzEwcGMiPlslIFRyYW5zbGF0ZSgiVVJMIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2FsZW5kYXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHJbJSBJRiBEYXRhLlZhbGlkSUQgIT0gMSAlXSBjbGFzcz0iSW52YWxpZCJbJSBFTkQgJV0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkZsYWdzIENlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCIgdGl0bGU9IlslIERhdGEuQ2FsZW5kYXJOYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJDYWxlbmRhckNvbG9yIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogWyUgRGF0YS5Db2xvciB8IGh0bWwgJV07Ij48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2U7U3ViYWN0aW9uPUVkaXQ7Q2FsZW5kYXJJRD1bJSBEYXRhLkNhbGVuZGFySUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNhbGVuZGFyTmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuR3JvdXAgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBUcmFuc2xhdGUoRGF0YS5WYWxpZCkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLkNoYW5nZVRpbWUgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLkNyZWF0ZVRpbWUgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iRXhwb3J0TGluayIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZTtTdWJhY3Rpb249Q2FsZW5kYXJFeHBvcnQ7Q2FsZW5kYXJJRD1bJSBEYXRhLkNhbGVuZGFySUQgfCB1cmkgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkV4cG9ydCBjYWxlbmRhciIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1kb3dubG9hZCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJFeHBvcnQgY2FsZW5kYXIiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iRG93bmxvYWRMaW5rIiBocmVmPSJbJSBDb25maWcoIkh0dHBUeXBlIikgJV06Ly9bJSBDb25maWcoIkZRRE4iKSAlXS9bJSBDb25maWcoIlNjcmlwdEFsaWFzIikgJV1wdWJsaWMucGw/QWN0aW9uPVB1YmxpY0NhbGVuZGFyO0NhbGVuZGFySUQ9WyUgRGF0YS5DYWxlbmRhcklEIHwgdXJpICVdO1VzZXI9WyUgRW52KCJVc2VyTG9naW4iKSB8IHVyaSAlXTtUb2tlbj1bJSBEYXRhLkFjY2Vzc1Rva2VuIHwgdXJpICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEb3dubG9hZCBjYWxlbmRhciIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jbG91ZC1kb3dubG9hZCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJEb3dubG9hZCBjYWxlbmRhciIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IklubGluZUJ1dHRvbiBDb3B5VG9DbGlwYm9hcmQiIGRhdGEtY2xpcGJvYXJkLXRleHQ9IlslIENvbmZpZygiSHR0cFR5cGUiKSAlXTovL1slIENvbmZpZygiRlFETiIpICVdL1slIENvbmZpZygiU2NyaXB0QWxpYXMiKSAlXXB1YmxpYy5wbD9BY3Rpb249UHVibGljQ2FsZW5kYXI7Q2FsZW5kYXJJRD1bJSBEYXRhLkNhbGVuZGFySUQgfCB1cmkgJV07VXNlcj1bJSBFbnYoIlVzZXJMb2dpbiIpIHwgdXJpICVdO1Rva2VuPVslIERhdGEuQWNjZXNzVG9rZW4gfCB1cmkgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkNvcHkgcHVibGljIGNhbGVuZGFyIFVSTCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jbGlwYm9hcmQiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNhbGVuZGFyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2FsZW5kYXJOb0RhdGFSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iOSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNhbGVuZGFyTm9EYXRhUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJGaWx0ZXJNZXNzYWdlIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iOSIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmYgIWltcG9ydGFudDsiPlslIFRyYW5zbGF0ZSgiTm8gbWF0Y2hlcyBmb3VuZC4iKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuVUkuVGFibGUuSW5pdFRhYmxlRmlsdGVyKCQoJyNGaWx0ZXJDYWxlbmRhcnMnKSwgJCgnI1VzZXInKSk7CgogICAgdmFyIENsaXBib2FyZEpTID0gbmV3IENsaXBib2FyZCgnLkNvcHlUb0NsaXBib2FyZCcpOwogICAgQ2xpcGJvYXJkSlMub24oJ3N1Y2Nlc3MnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAkKEV2ZW50LnRyaWdnZXIpLmhpZGUoKQogICAgICAgICAgICAuZmFkZUluKCk7CiAgICAgICAgRXZlbnQuY2xlYXJTZWxlY3Rpb24oKTsKICAgIH0pOwoKICAgIENsaXBib2FyZEpTLm9uKCdlcnJvcicsIGZ1bmN0aW9uKEV2ZW50KSB7CiAgICAgICAgQ29yZS5Gb3JtLkVycm9yVG9vbHRpcHMuSW5pdFRvb2x0aXAoJChFdmVudC50cmlnZ2VyKSwgJ1ByZXNzIEN0cmwrQyAoQ21kK0MpIHRvIGNvcHkgdG8gY2xpcGJvYXJkJyk7CiAgICAgICAgJChFdmVudC50cmlnZ2VyKS5mb2N1cygpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDYWxlbmRhckVkaXQiKSAlXQogICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJDYWxlbmRhckZyb20iIGlkPSJDYWxlbmRhckZyb20iIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iWyUgRGF0YS5TdWJhY3Rpb24gfCBodG1sICVdIi8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNhbGVuZGFySUQiIHZhbHVlPSJbJSBEYXRhLkNhbGVuZGFySUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9yIGhpZGUgdGhlIGNvbnRlbnQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoRGF0YS5UaXRsZSkgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiQ2FsZW5kYXIiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNhbGVuZGFyTmFtZSIgY2xhc3M9Ik1hbmRhdG9yeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDYWxlbmRhciBuYW1lIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IkNhbGVuZGFyTmFtZSIgbmFtZT0iQ2FsZW5kYXJOYW1lIiB2YWx1ZT0iWyUgRGF0YS5DYWxlbmRhck5hbWUgfCBodG1sICVdIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJWYWxpZGF0ZV9SZXF1aXJlZCBXNTBwYyBbJSBEYXRhLkNhbGVuZGFyTmFtZUludmFsaWQgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2FsZW5kYXJOYW1lRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBJRiBEYXRhLkNhbGVuZGFyTmFtZUV4aXN0cyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2FsZW5kYXJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2FsZW5kYXJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNvbG9yIiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkNvbG9yIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IkNvbG9yIiBuYW1lPSJDb2xvciIgdmFsdWU9IlslIERhdGEuQ29sb3IgfCBodG1sICVdIiBjbGFzcz0iVmFsaWRhdGVfUmVxdWlyZWQgVzUwcGMiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDb2xvckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ikdyb3VwSUQiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiUGVybWlzc2lvbiBncm91cCIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Hcm91cElEICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWYWxpZElEIiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlZhbGlkaXR5IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlZhbGlkSUQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgWyUgRGF0YS5XaWRnZXRTdGF0dXMgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiVGlja2V0IEFwcG9pbnRtZW50cyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRBcHBvaW50bWVudFJ1bGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBpZD0iUnVsZV9bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV0iIGNsYXNzPSJUYWJsZUxpa2UgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsZWdlbmQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlJ1bGUiKSB8IGh0bWwgJV0gPHNwYW4gY2xhc3M9IlJ1bGVOdW1iZXIiPlslIERhdGEuUnVsZU51bWJlciB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IlJlbW92ZUJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVtb3ZlIHRoaXMgZW50cnkiKSB8IGh0bWwgJV0iIGhyZWY9IiMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sZWdlbmQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YXJ0RGF0ZV9bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTdGFydCBkYXRlIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YXJ0RGF0ZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkVuZERhdGVfWyUgRGF0YS5SdWxlSUQgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRW5kIGRhdGUiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRW5kRGF0ZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUXVldWVJRF9bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV0iIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiUXVldWVzIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlF1ZXVlSURTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJRdWV1ZUlEX1slIERhdGEuUnVsZUlEIHwgaHRtbCAlXUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlF1ZXVlSURfWyUgRGF0YS5SdWxlSUQgfCBodG1sICVdU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlBsZWFzZSBzZWxlY3QgYSB2YWxpZCBxdWV1ZS4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNlYXJjaFBhcmFtc19bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTZWFyY2ggYXR0cmlidXRlcyIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU2VhcmNoUGFyYW1zQ29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU2VhcmNoUGFyYW1zU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkFkZEJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQWRkIGVudHJ5IikgfCBodG1sICVdIiBocmVmPSIjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkFkZCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0QXBwb2ludG1lbnRSdWxlU2VhcmNoUGFyYW0iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZWFyY2hQYXJhbV9bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV1fWyUgRGF0YS5QYXJhbU5hbWUgfCBodG1sICVdIiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5QYXJhbU5hbWUgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJTZWFyY2hQYXJhbV9bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV1fWyUgRGF0YS5QYXJhbU5hbWUgfCBodG1sICVdIiBuYW1lPSJTZWFyY2hQYXJhbV9bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV1fWyUgRGF0YS5QYXJhbU5hbWUgfCBodG1sICVdIiBkYXRhLXBhcmFtPSJbJSBEYXRhLlBhcmFtTmFtZSB8IGh0bWwgJV0iIHR5cGU9InRleHQiIGNsYXNzPSJTZWFyY2hQYXJhbSBWYWxpZGF0ZV9SZXF1aXJlZCBXMjVwYyIgdmFsdWU9IlslIERhdGEuUGFyYW1WYWx1ZSB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZWFyY2hQYXJhbV9bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV1fWyUgRGF0YS5QYXJhbU5hbWUgfCBodG1sICVdRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJSZW1vdmVCdXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdIiBocmVmPSIjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldEFwcG9pbnRtZW50UnVsZVNlYXJjaFBhcmFtIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0QXBwb2ludG1lbnRSdWxlIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iQWRkUnVsZUJ1dHRvbiIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkFkZCBlbnRyeSIpIHwgaHRtbCAlXSIgaHJlZj0iIyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZSI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkFkZCBSdWxlIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlICI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdmFsdWU9IlNhdmUiIHR5cGU9InN1Ym1pdCIgaWQ9IlN1Ym1pdCIgY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgaWQ9IlRpY2tldEFwcG9pbnRtZW50UnVsZXNUZW1wbGF0ZSIgY2xhc3M9IkhpZGRlbiI+CiAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgPGxlZ2VuZD4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJSdWxlIikgfCBodG1sICVdIDxzcGFuIGNsYXNzPSJSdWxlTnVtYmVyIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJSZW1vdmVCdXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdIiBocmVmPSIjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgPC9sZWdlbmQ+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdGFydERhdGUiPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiU3RhcnQgZGF0ZSIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGFydERhdGVTdHJnICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkVuZERhdGUiPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRW5kIGRhdGUiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuRW5kRGF0ZVN0cmcgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlVzZSBvcHRpb25zIGJlbG93IHRvIG5hcnJvdyBkb3duIGZvciB3aGljaCB0aWNrZXRzIGFwcG9pbnRtZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlF1ZXVlSUQiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJRdWV1ZXMiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuUXVldWVJRFN0cmcgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJRdWV1ZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZWFyY2hQYXJhbXMiPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiU2VhcmNoIGF0dHJpYnV0ZXMiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU2VhcmNoUGFyYW1zQ29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNlYXJjaFBhcmFtc1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQWRkQnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJBZGQgZW50cnkiKSB8IGh0bWwgJV0iIGhyZWY9IiMiPgogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJBZGQiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iVGlja2V0QXBwb2ludG1lbnRTZWFyY2hQYXJhbVRlbXBsYXRlIiBjbGFzcz0iSGlkZGVuIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcFNtYWxsIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNlYXJjaFBhcmFtIiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iU2VhcmNoUGFyYW0iIG5hbWU9IlNlYXJjaFBhcmFtIiB0eXBlPSJ0ZXh0IiBjbGFzcz0iVmFsaWRhdGVfUmVxdWlyZWQiIC8+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZWFyY2hQYXJhbUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJSZW1vdmVCdXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdIiBocmVmPSIjIj4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5NYW5hZ2UuSW5pdFRpY2tldEFwcG9pbnRtZW50cyhbJSBEYXRhLlJ1bGVDb3VudCB8IEpTT04gJV0pOwpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRBcHBvaW50bWVudFJ1bGVJbml0IikgJV0KQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLk1hbmFnZS5Jbml0VGlja2V0QXBwb2ludG1lbnRSdWxlKFslIERhdGEuUnVsZUlEIHwgSlNPTiAlXSwgJCgnI1J1bGVfJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFslIERhdGEuUnVsZUlEIHwgSlNPTiAlXSkpKTsKWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldEFwcG9pbnRtZW50UnVsZUluaXQiKSAlXQokKCdpbnB1dCNDb2xvcicpLnNwZWN0cnVtKHsKICAgIGNvbG9yOiBbJSBEYXRhLkNvbG9yIHwgSlNPTiAlXSwKICAgIGNvbnRhaW5lckNsYXNzTmFtZTogJ0NvbG9yUGFsZXR0ZUNvbnRhaW5lcicsCiAgICBoaWRlQWZ0ZXJQYWxldHRlU2VsZWN0OiB0cnVlLAogICAgcHJlZmVycmVkRm9ybWF0OiAnaGV4JywKICAgIHJlcGxhY2VyQ2xhc3NOYW1lOiAnQ29sb3JQYWxldHRlQnV0dG9uJywKICAgIHNob3dJbnB1dDogdHJ1ZSwKICAgIHNob3dQYWxldHRlOiB0cnVlLAogICAgc2hvd1BhbGV0dGVPbmx5OiB0cnVlLAogICAgc2hvd1NlbGVjdGlvblBhbGV0dGU6IGZhbHNlLAogICAgdG9nZ2xlUGFsZXR0ZU9ubHk6IHRydWUsCiAgICB0b2dnbGVQYWxldHRlTW9yZVRleHQ6IFslIFRyYW5zbGF0ZSgiTW9yZSIpIHwgSlNPTiAlXSwKICAgIHRvZ2dsZVBhbGV0dGVMZXNzVGV4dDogWyUgVHJhbnNsYXRlKCJMZXNzIikgfCBKU09OICVdLAogICAgY2hvb3NlVGV4dDogWyUgVHJhbnNsYXRlKCJDb25maXJtIikgfCBKU09OICVdLAogICAgY2FuY2VsVGV4dDogWyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IEpTT04gJV0sCiAgICBwYWxldHRlOiBbCiAgICAgICAgJ1slIERhdGEuQ29sb3JQYWxldHRlLmpvaW4oIicsJyIpICVdJwogICAgXQp9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJDYWxlbmRhckVkaXQiKSAlXQogICAgPC9kaXY+CjwvZGl2Pgo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiQ2FsZW5kYXIgT3ZlcnZpZXciKSB8IGh0bWwgJV08L2gxPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIEVudigiVXNlckNoYWxsZW5nZVRva2VuIikgJV0iIG5hbWU9IkNoYWxsZW5nZVRva2VuIiBpZD0iQ2hhbGxlbmdlVG9rZW4iIC8+CiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQWN0aW9ucyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9uTGlzdCI+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2U7U3ViYWN0aW9uPU92ZXJ2aWV3IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNhbGVuZGFyLW8iPjwvaT5bJSBUcmFuc2xhdGUoIk1hbmFnZSBDYWxlbmRhcnMiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcHBvaW50bWVudENyZWF0ZUJ1dHRvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iQXBwb2ludG1lbnRDcmVhdGVCdXR0b24iIGhyZWY9IiMiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQWRkIG5ldyBBcHBvaW50bWVudCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUiPjwvaT5bJSBUcmFuc2xhdGUoIkFkZCBBcHBvaW50bWVudCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBcHBvaW50bWVudENyZWF0ZUJ1dHRvbiIpICVdCiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2FsZW5kYXJXaWRnZXQiKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJDYWxlbmRhcnMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IkZpbHRlckNhbGVuZGFycyIgY2xhc3M9IkZpbHRlckJveCIgcGxhY2Vob2xkZXI9IlslIFRyYW5zbGF0ZSgiSnVzdCBzdGFydCB0eXBpbmcgdG8gZmlsdGVyLi4uIikgfCBodG1sICVdIiBuYW1lPSJGaWx0ZXJDYWxlbmRhcnMiIHZhbHVlPSIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkZpbHRlciBmb3IgY2FsZW5kYXJzIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIFNwYWNpbmdUb3BTbWFsbCIgaWQ9IkNhbGVuZGFycyI+CiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlcxMHBjIj48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXMTBwYyI+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDZW50ZXIgVzEwcGMiPlslIFRyYW5zbGF0ZSgiVVJMIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2FsZW5kYXJTd2l0Y2giKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9IkNhbGVuZGFyU3dpdGNoIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJDYWxlbmRhclslIERhdGEuQ2FsZW5kYXJJRCB8IGh0bWwgJV0iIG5hbWU9IkNhbGVuZGFyWyUgRGF0YS5DYWxlbmRhcklEIHwgaHRtbCAlXSIgZGF0YS1pZD0iWyUgRGF0YS5DYWxlbmRhcklEIHwgaHRtbCAlXSIgWyUgRGF0YS5DaGVja2VkICVdLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkZsYWdzIENlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQ2FsZW5kYXJbJSBEYXRhLkNhbGVuZGFySUQgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCIgdGl0bGU9IlslIERhdGEuQ2FsZW5kYXJOYW1lIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iQ2FsZW5kYXJDb2xvciIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IFslIERhdGEuQ29sb3IgfCBodG1sICVdOyI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDYWxlbmRhclslIERhdGEuQ2FsZW5kYXJJRCB8IGh0bWwgJV0iIHRpdGxlPSJbJSBEYXRhLkNhbGVuZGFyTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNhbGVuZGFyTmFtZSB8IHRydW5jYXRlKDIxKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iQ29weVRvQ2xpcGJvYXJkIElubGluZUJ1dHRvbiIgZGF0YS1jbGlwYm9hcmQtdGV4dD0iWyUgQ29uZmlnKCJIdHRwVHlwZSIpICVdOi8vWyUgQ29uZmlnKCJGUUROIikgJV0vWyUgQ29uZmlnKCJTY3JpcHRBbGlhcyIpICVdcHVibGljLnBsP0FjdGlvbj1QdWJsaWNDYWxlbmRhcjtDYWxlbmRhcklEPVslIERhdGEuQ2FsZW5kYXJJRCB8IHVyaSAlXTtVc2VyPVslIEVudigiVXNlckxvZ2luIikgfCB1cmkgJV07VG9rZW49WyUgRGF0YS5BY2Nlc3NUb2tlbiB8IHVyaSAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNsaXBib2FyZCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNhbGVuZGFyU3dpdGNoIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJGaWx0ZXJNZXNzYWdlIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+WyUgVHJhbnNsYXRlKCJObyBtYXRjaGVzIGZvdW5kLiIpIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5VSS5UYWJsZS5Jbml0VGFibGVGaWx0ZXIoJCgnI0ZpbHRlckNhbGVuZGFycycpLCAkKCcjQ2FsZW5kYXJzJykpOwoKICAgIHZhciBDbGlwYm9hcmRKUyA9IG5ldyBDbGlwYm9hcmQoJy5Db3B5VG9DbGlwYm9hcmQnKTsKICAgIENsaXBib2FyZEpTLm9uKCdzdWNjZXNzJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgJChFdmVudC50cmlnZ2VyKS5oaWRlKCkKICAgICAgICAgICAgLmZhZGVJbigpOwogICAgICAgIEV2ZW50LmNsZWFyU2VsZWN0aW9uKCk7CiAgICB9KTsKCiAgICBDbGlwYm9hcmRKUy5vbignZXJyb3InLCBmdW5jdGlvbihFdmVudCkgewogICAgICAgIENvcmUuRm9ybS5FcnJvclRvb2x0aXBzLkluaXRUb29sdGlwKCQoRXZlbnQudHJpZ2dlciksICdQcmVzcyBDdHJsK0MgKENtZCtDKSB0byBjb3B5IHRvIGNsaXBib2FyZCcpOwogICAgICAgICQoRXZlbnQudHJpZ2dlcikuZm9jdXMoKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkNhbGVuZGFyV2lkZ2V0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiRGVzY3JpcHRpb24iKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGlzIGlzIGFuIG92ZXJ2aWV3IHBhZ2UgZm9yIHRoZSBBcHBvaW50bWVudCBDYWxlbmRhci4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgQ2FsZW5kYXJXaWRnZXQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWN0aW9uTWVudSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFNldHRpbmdzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IkNhbGVuZGFyU2V0dGluZ3NCdXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNldHRpbmdzIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jb2ciPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQ2FsZW5kYXIiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCAiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9DYWxlbmRhciIpICVdCiAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIk5vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJOb0NhbGVuZGFyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkNhbGVuZGFyRGl2IikgJV0KICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiBbJSBEYXRhLkNhbGVuZGFyV2lkdGggfCBodG1sICVdJTsgbWFyZ2luOiAwIGF1dG87IHotaW5kZXg6IDEwOyIgaWQ9ImNhbGVuZGFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNhbGVuZGFyRGl2IikgJV0KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCgpDb3JlLkNvbmZpZy5TZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNMb2FkaW5nJywgWyUgVHJhbnNsYXRlKCJMb2FkaW5nLi4uIikgfCBKU09OICVdKTsKQ29yZS5Db25maWcuU2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zVG9vTWFueUNhbGVuZGFyc0hlYWRsaW5lJywgWyUgVHJhbnNsYXRlKCJUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzIikgfCBKU09OICVdKTsKQ29yZS5Db25maWcuU2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zVG9vTWFueUNhbGVuZGFyc1RleHQnLCBbJSBUcmFuc2xhdGUoIlBsZWFzZSBlaXRoZXIgdHVybiBzb21lIG9mZiBmaXJzdCBvciBpbmNyZWFzZSB0aGUgbGltaXQgaW4gY29uZmlndXJhdGlvbi4iKSB8IEpTT04gJV0pOwpDb3JlLkNvbmZpZy5TZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNZZXMnLCBbJSBUcmFuc2xhdGUoIlllcyIpIHwgSlNPTiAlXSk7CkNvcmUuQ29uZmlnLlNldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1NldHRpbmdzJywgWyUgVHJhbnNsYXRlKCJTZXR0aW5ncyIpIHwgSlNPTiAlXSk7CkNvcmUuQ29uZmlnLlNldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1NhdmUnLCBbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IEpTT04gJV0pOwoKQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLkluaXQoewogICAgQ2hhbGxlbmdlVG9rZW46ICQoIiNDaGFsbGVuZ2VUb2tlbiIpLnZhbCgpLAogICAgQWxsRGF5VGV4dDogWyUgVHJhbnNsYXRlKCJBbGwtZGF5IikgfCBKU09OICVdLAogICAgSXNSVEw6IFslIERhdGEuSXNSVExMYW5ndWFnZSAlXSwKICAgIE1vbnRoTmFtZXM6IFsKICAgICAgICBbJSBUcmFuc2xhdGUoIkphbnVhcnkiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJGZWJydWFyeSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk1hcmNoIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiQXByaWwiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJNYXlfbG9uZyIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkp1bmUiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJKdWx5IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiQXVndXN0IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiU2VwdGVtYmVyIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiT2N0b2JlciIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk5vdmVtYmVyIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiRGVjZW1iZXIiKSB8IEpTT04gJV0KICAgIF0sCiAgICBNb250aE5hbWVzU2hvcnQ6IFsKICAgICAgICBbJSBUcmFuc2xhdGUoIkphbiIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkZlYiIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk1hciIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkFwciIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk1heSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkp1biIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkp1bCIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkF1ZyIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIlNlcCIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk9jdCIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk5vdiIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkRlYyIpIHwgSlNPTiAlXQogICAgXSwKICAgIERheU5hbWVzOiBbCiAgICAgICAgWyUgVHJhbnNsYXRlKCJTdW5kYXkiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJNb25kYXkiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJUdWVzZGF5IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiV2VkbmVzZGF5IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiVGh1cnNkYXkiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJGcmlkYXkiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJTYXR1cmRheSIpIHwgSlNPTiAlXQogICAgXSwKICAgIERheU5hbWVzU2hvcnQ6IFsKICAgICAgICBbJSBUcmFuc2xhdGUoIlN1biIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk1vbiIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIlR1ZSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIldlZCIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIlRodSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkZyaSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIlNhdCIpIHwgSlNPTiAlXQogICAgXSwKICAgIERheU5hbWVzTWluOiBbCiAgICAgICAgWyUgVHJhbnNsYXRlKCJTdSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk1vIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiVHUiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJXZSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIlRoIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiRnIiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJTYSIpIHwgSlNPTiAlXQogICAgXSwKICAgIEJ1dHRvblRleHQ6IHsKICAgICAgICB0b2RheTogWyUgVHJhbnNsYXRlKCJUb2RheSIpIHwgSlNPTiAlXSwKICAgICAgICBtb250aDogWyUgVHJhbnNsYXRlKCJNb250aCIpIHwgSlNPTiAlXSwKICAgICAgICB3ZWVrOiBbJSBUcmFuc2xhdGUoIldlZWsiKSB8IEpTT04gJV0sCiAgICAgICAgZGF5OiBbJSBUcmFuc2xhdGUoIkRheSIpIHwgSlNPTiAlXSwKICAgICAgICB0aW1lbGluZU1vbnRoOiBbJSBUcmFuc2xhdGUoIlRpbWVsaW5lIE1vbnRoIikgfCBKU09OICVdLAogICAgICAgIHRpbWVsaW5lV2VlazogWyUgVHJhbnNsYXRlKCJUaW1lbGluZSBXZWVrIikgfCBKU09OICVdLAogICAgICAgIHRpbWVsaW5lRGF5OiBbJSBUcmFuc2xhdGUoIlRpbWVsaW5lIERheSIpIHwgSlNPTiAlXSwKICAgICAgICBqdW1wOlslIFRyYW5zbGF0ZSgiSnVtcCIpIHwgSlNPTiAlXSwKICAgICAgICBwcmV2RGF0ZXBpY2tlcjogWyUgVHJhbnNsYXRlKCJQcmV2aW91cyIpIHwgSlNPTiAlXSwKICAgICAgICBuZXh0RGF0ZXBpY2tlcjogWyUgVHJhbnNsYXRlKCJOZXh0IikgfCBKU09OICVdCiAgICB9LAogICAgRmlyc3REYXk6IFslIERhdGEuRmlyc3REYXkgfCBodG1sICVdLAogICAgRGVmYXVsdFZpZXc6IFslIERhdGEuRGVmYXVsdFZpZXcgfCBKU09OICVdLAogICAgSGVhZGVyOiB7CiAgICAgICAgbGVmdDogJ21vbnRoLGFnZW5kYVdlZWssYWdlbmRhRGF5IHRpbWVsaW5lTW9udGgsdGltZWxpbmVXZWVrLHRpbWVsaW5lRGF5JywKICAgICAgICBjZW50ZXI6ICd0aXRsZScsCiAgICAgICAgcmlnaHQ6ICdqdW1wLHRvZGF5IHByZXYsbmV4dCcKICAgIH0sCiAgICBEaWFsb2dUZXh0OiB7CiAgICAgICAgRWRpdFRpdGxlOiBbJSBUcmFuc2xhdGUoIkFwcG9pbnRtZW50IikgfCBKU09OICVdLAogICAgICAgIE9jY3VycmVuY2VUaXRsZTogWyUgVHJhbnNsYXRlKCJUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50IikgfCBKU09OICVdLAogICAgICAgIE9jY3VycmVuY2VUZXh0OiBbJSBUcmFuc2xhdGUoIldvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyIpIHwgSlNPTiAlXSwKICAgICAgICBPY2N1cnJlbmNlQWxsOiBbJSBUcmFuc2xhdGUoIkFsbCBvY2N1cnJlbmNlcyIpIHwgSlNPTiAlXSwKICAgICAgICBPY2N1cnJlbmNlSnVzdFRoaXM6IFslIFRyYW5zbGF0ZSgiSnVzdCB0aGlzIG9jY3VycmVuY2UiKSB8IEpTT04gJV0sCiAgICAgICAgQ2xvc2U6IFslIFRyYW5zbGF0ZSgiQ2xvc2UiKSB8IEpTT04gJV0sCiAgICAgICAgRGlzbWlzczogWyUgVHJhbnNsYXRlKCJEaXNtaXNzIikgfCBKU09OICVdCiAgICB9LAogICAgT3ZlcnZpZXdTY3JlZW46ICdDYWxlbmRhck92ZXJ2aWV3JywKICAgIENhbGVuZGFyU2V0dGluZ3NCdXR0b246ICdDYWxlbmRhclNldHRpbmdzQnV0dG9uJywKICAgIENhbGVuZGFyU2V0dGluZ3NEaWFsb2dDb250YWluZXI6ICdDYWxlbmRhclNldHRpbmdzRGlhbG9nQ29udGFpbmVyJywKICAgIENhbGVuZGFyU2V0dGluZ3NTaG93OiBbJSBEYXRhLkNhbGVuZGFyU2V0dGluZ3NTaG93IHwgSlNPTiAlXSwKICAgIFRpY2tldEFwcG9pbnRtZW50TWFya3M6IHsKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0QXBwb2ludG1lbnRNYXJrIikgJV0KICAgICAgICBbJSBEYXRhLkFwcG9pbnRtZW50VHlwZSAlXTogWyUgRGF0YS5BcHBvaW50bWVudE1hcmsgfCBKU09OICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldEFwcG9pbnRtZW50TWFya0NvbW1hIikgJV0KICAgICAgICAsClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRBcHBvaW50bWVudE1hcmtDb21tYSIpICVdClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRBcHBvaW50bWVudE1hcmsiKSAlXQogICAgfSwKICAgIENhbGxiYWNrczogewogICAgICAgIEVkaXRBY3Rpb246IFslIERhdGEuRWRpdEFjdGlvbiB8IEpTT04gJV0sCiAgICAgICAgRWRpdE1hc2tTdWJhY3Rpb246IFslIERhdGEuRWRpdE1hc2tTdWJhY3Rpb24gfCBKU09OICVdLAogICAgICAgIEVkaXRTdWJhY3Rpb246IFslIERhdGEuRWRpdFN1YmFjdGlvbiB8IEpTT04gJV0sCiAgICAgICAgQWRkU3ViYWN0aW9uOiBbJSBEYXRhLkFkZFN1YmFjdGlvbiB8IEpTT04gJV0sCiAgICAgICAgUHJlZlN1YmFjdGlvbjogWyUgRGF0YS5QcmVmU3ViYWN0aW9uIHwgSlNPTiAlXSwKICAgICAgICBMaXN0QWN0aW9uOiBbJSBEYXRhLkxpc3RBY3Rpb24gfCBKU09OICVdLAogICAgICAgIERheXNTdWJhY3RvbjogWyUgRGF0YS5EYXlzU3ViYWN0aW9uIHwgSlNPTiAlXQogICAgfSwKICAgIEFwcG9pbnRtZW50OiB7CiAgICAgICAgQXBwb2ludG1lbnRDcmVhdGU6IFslIERhdGEuQXBwb2ludG1lbnRDcmVhdGUgfHwgIm51bGwiICVdLAogICAgICAgIEFwcG9pbnRtZW50SUQ6IFslIERhdGEuQXBwb2ludG1lbnRJRCB8IEpTT04gJV0sCiAgICAgICAgQXBwb2ludG1lbnRDcmVhdGVCdXR0b246ICdBcHBvaW50bWVudENyZWF0ZUJ1dHRvbicKICAgIH0sCiAgICBDYWxlbmRhcnM6IHsKICAgICAgICBTb3VyY2VzOiB7ClslIFJlbmRlckJsb2NrU3RhcnQoIkNhbGVuZGFyU291cmNlIikgJV0KICAgICAgICAgICAgWyUgRGF0YS5DYWxlbmRhcklEIHwgSlNPTiAlXTogewogICAgICAgICAgICAgICAgdXJsOiBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLAogICAgICAgICAgICAgICAgZGF0YTogewogICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCIjQ2hhbGxlbmdlVG9rZW4iKS52YWwoKSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50TGlzdCcsCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnTGlzdEFwcG9pbnRtZW50cycsCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRDogWyUgRGF0YS5DYWxlbmRhcklEIHwgSlNPTiAlXSwKICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUlEOiBbJSBEYXRhLlJlc291cmNlSUQgfCBKU09OICVdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgY29sb3I6IFslIERhdGEuQ29sb3IgfCBKU09OICVdLAogICAgICAgICAgICAgICAgdGV4dENvbG9yOiBbJSBEYXRhLlRleHRDb2xvciB8IEpTT04gJV0sCiAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMC4yKScsCiAgICAgICAgICAgICAgICBzdGFydFBhcmFtOiAnU3RhcnRUaW1lJywKICAgICAgICAgICAgICAgIGVuZFBhcmFtOiAnRW5kVGltZScsCgogICAgICAgICAgICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgcmVtb3ZlRXZlbnRTb3VyY2UKICAgICAgICAgICAgICAgIGdvb2dsZUNhbGVuZGFySWQ6IFslIERhdGEuQ2FsZW5kYXJJRCB8IEpTT04gJV0sCiAgICAgICAgICAgICAgICBldmVudERhdGFUcmFuc2Zvcm06IGZ1bmN0aW9uKEFwcG9pbnRtZW50RGF0YSkgewogICAgICAgICAgICAgICAgICAgIHZhciBUaWNrZXRBcHBvaW50bWVudE5vRHJhZyA9IHsKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0QXBwb2ludG1lbnROb0RyYWciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkFwcG9pbnRtZW50VHlwZSAlXTogcGFyc2VJbnQoWyUgRGF0YS5Ob0RyYWcgfCBKU09OICVdLCAxMCkgPyB0cnVlIDogZmFsc2UKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0QXBwb2ludG1lbnROb0RyYWdDb21tYSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICwKWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldEFwcG9pbnRtZW50Tm9EcmFnQ29tbWEiKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0QXBwb2ludG1lbnROb0RyYWciKSAlXQogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBBcHBvaW50bWVudERhdGEuQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SWQ6IEFwcG9pbnRtZW50RGF0YS5QYXJlbnRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IEFwcG9pbnRtZW50RGF0YS5TdGFydFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogQXBwb2ludG1lbnREYXRhLlN0YXJ0RGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBBcHBvaW50bWVudERhdGEuRW5kVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZTogQXBwb2ludG1lbnREYXRhLkVuZERhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBBcHBvaW50bWVudERhdGEuVGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBBcHBvaW50bWVudERhdGEuRGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBBcHBvaW50bWVudERhdGEuTG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFySWQ6IEFwcG9pbnRtZW50RGF0YS5DYWxlbmRhcklELAogICAgICAgICAgICAgICAgICAgICAgICBhbGxEYXk6IHBhcnNlSW50KEFwcG9pbnRtZW50RGF0YS5BbGxEYXksIDEwKSA/IHRydWUgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJyaW5nOiBwYXJzZUludChBcHBvaW50bWVudERhdGEuUmVjdXJyaW5nLCAxMCkgPyB0cnVlIDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHRlYW1JZHM6IEFwcG9pbnRtZW50RGF0YS5UZWFtSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIHRlYW1OYW1lczogQXBwb2ludG1lbnREYXRhLlRlYW1OYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJZHM6IEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZUlELAogICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWVzOiBBcHBvaW50bWVudERhdGEuUmVzb3VyY2VOYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luRGF0YTogQXBwb2ludG1lbnREYXRhLlBsdWdpbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyTmFtZTogWyUgRGF0YS5DYWxlbmRhck5hbWUgfCBKU09OICVdLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckNvbG9yOiBbJSBEYXRhLkNvbG9yIHwgSlNPTiAlXSwKICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uOiBBcHBvaW50bWVudERhdGEuTm90aWZpY2F0aW9uRGF0ZS5sZW5ndGggPyB0cnVlIDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkRhdGU6IEFwcG9pbnRtZW50RGF0YS5Ob3RpZmljYXRpb25EYXRlLAogICAgICAgICAgICAgICAgICAgICAgICB0aWNrZXRBcHBvaW50bWVudFR5cGU6IEFwcG9pbnRtZW50RGF0YS5UaWNrZXRBcHBvaW50bWVudFN0YXJ0RGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRFZGl0YWJsZTogVGlja2V0QXBwb2ludG1lbnROb0RyYWdbQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50U3RhcnREYXRlXSA/IGZhbHNlIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25FZGl0YWJsZTogdHlwZW9mIEFwcG9pbnRtZW50RGF0YS5UaWNrZXRBcHBvaW50bWVudEVuZERhdGUgPT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgVGlja2V0QXBwb2ludG1lbnROb0RyYWdbQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50RW5kRGF0ZV0gIT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDYWxlbmRhclNvdXJjZUNvbW1hIikgJV0KICAgICAgICAgICAgLApbJSBSZW5kZXJCbG9ja0VuZCgiQ2FsZW5kYXJTb3VyY2VDb21tYSIpICVdClslIFJlbmRlckJsb2NrRW5kKCJDYWxlbmRhclNvdXJjZSIpICVdCiAgICAgICAgfSwKICAgICAgICBTd2l0Y2hlczogJCgnLkNhbGVuZGFyU3dpdGNoIGlucHV0W3R5cGU9ImNoZWNrYm94Il0nKSwKICAgICAgICBMaW1pdDogWyUgQ29uZmlnKCJBcHBvaW50bWVudENhbGVuZGFyOjpDYWxlbmRhckxpbWl0T3ZlcnZpZXciKSB8fCAxMCAlXQogICAgfSwKICAgIFdvcmtpbmdIb3VyczogWwpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXb3JraW5nSG91cnMiKSAlXQogICAgICAgIHsKICAgICAgICAgICAgaWQ6ICd3b3JraW5nSG91cnMnLAogICAgICAgICAgICBzdGFydDogWyUgRGF0YS5TdGFydFRpbWUgfCBKU09OICVdLAogICAgICAgICAgICBlbmQ6IFslIERhdGEuRW5kVGltZSB8IEpTT04gJV0sCiAgICAgICAgICAgIGNvbG9yOiAnI0Q3RDdENycsCiAgICAgICAgICAgIHJlbmRlcmluZzogJ2ludmVyc2UtYmFja2dyb3VuZCcsCiAgICAgICAgICAgIGVkaXRhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZG93OiBbJSBEYXRhLkRvVyAlXQogICAgICAgIH0KWyUgUmVuZGVyQmxvY2tTdGFydCgiV29ya2luZ0hvdXJzQ29tbWEiKSAlXQogICAgICAgICwKWyUgUmVuZGVyQmxvY2tFbmQoIldvcmtpbmdIb3Vyc0NvbW1hIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIldvcmtpbmdIb3VycyIpICVdCiAgICBdCn0pOwoKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgIDxkaXYgaWQ9IkNhbGVuZGFyU2V0dGluZ3NEaWFsb2dDb250YWluZXIiIGNsYXNzPSJIaWRkZW4iPgogICAgICAgIDxmb3JtIGlkPSJDb250ZXh0U2V0dGluZ3NEaWFsb2dDYWxlbmRhck92ZXJ2aWV3IiBjbGFzcz0iIj4KICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNob3duQXBwb2ludG1lbnRzIj5bJSBUcmFuc2xhdGUoIlNob3ciKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNob3duQXBwb2ludG1lbnRzU3RyaW5nICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICA8L2Zvcm0+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJBcHBvaW50bWVudFRvb2x0aXBUZW1wbGF0ZSIgY2xhc3M9IkhpZGRlbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iSWNvbnMiPjwvZGl2PgogICAgICAgIDxmaWVsZHNldD4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIkJhc2ljIGluZm9ybWF0aW9uIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPiV0aXRsZSU8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlRpdGxlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4lZGVzY3JpcHRpb24lPC9wPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJEZXNjcmlwdGlvbiIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JWxvY2F0aW9uJTwvcD4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTG9jYXRpb24iKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkZsYWcgU21hbGwiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJDYWxlbmRhckNvbG9yIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogJWNhbGVuZGFyQ29sb3IlOyI+PC9zcGFuPgogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgJWNhbGVuZGFyTmFtZSUKICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDYWxlbmRhciIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPC9maWVsZHNldD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVG9vbHRpcFRlbXBsYXRlUmVzb3VyY2UiKSAlXQogICAgICAgIDxmaWVsZHNldD4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIlJlc291cmNlIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPiV0ZWFtTmFtZXMlPC9wPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJUZWFtIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4lcmVzb3VyY2VOYW1lcyU8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkFnZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICA8L2ZpZWxkc2V0PgpbJSBSZW5kZXJCbG9ja0VuZCgiVG9vbHRpcFRlbXBsYXRlUmVzb3VyY2UiKSAlXQogICAgICAgIDxmaWVsZHNldD4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIkRhdGUvVGltZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4lc3RhcnREYXRlJTwvcD4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU3RhcnQgZGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JWVuZERhdGUlPC9wPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJFbmQgZGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JWFsbERheSU8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkFsbC1kYXkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPiVyZWN1cnJpbmclPC9wPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJSZXBlYXQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZmllbGRzZXQ+ClslIElGIERhdGEuUGx1Z2luTGlzdCAlXQogICAgICAgIDxmaWVsZHNldD4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIkxpbmsiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+ClslIEZPUkVBQ0ggUGx1Z2luS2V5IElOIERhdGEuUGx1Z2luTGlzdC5rZXlzICVdCiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JVslIFBsdWdpbktleSAlXSU8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5QbHVnaW5MaXN0LiRQbHVnaW5LZXkuUGx1Z2luTmFtZSkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgRU5EICVdCiAgICAgICAgPC9maWVsZHNldD4KWyUgRU5EICVdCiAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiTm90aWZpY2F0aW9uIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPiVub3RpZmljYXRpb25EYXRlJTwvcD4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTm90aWZpY2F0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICA8L2ZpZWxkc2V0PgogICAgPC9kaXY+Cgo8L2Rpdj4K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFNFVCBPVFJTQnVzaW5lc3NMYWJlbCA9ICc8c3Ryb25nPk9UUlMgQnVzaW5lc3MgU29sdXRpb248L3N0cm9uZz7ihKInICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFZGl0TWFzayIpICVdCjxkaXYgY2xhc3M9IklubmVyQ29udGVudCI+CiAgICA8Zm9ybSBpZD0iRWRpdEFwcG9pbnRtZW50Rm9ybSIgY2xhc3M9IlZhbGlkYXRlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iQ2hhbGxlbmdlVG9rZW4iIG5hbWU9IkNoYWxsZW5nZVRva2VuIiB2YWx1ZT0iWyUgRW52KCJVc2VyQ2hhbGxlbmdlVG9rZW4iKSB8IGh0bWwgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iQWN0aW9uIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJTdWJhY3Rpb24iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkVkaXRBcHBvaW50bWVudCIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBcHBvaW50bWVudElEIiBuYW1lPSJBcHBvaW50bWVudElEIiB2YWx1ZT0iWyUgRGF0YS5BcHBvaW50bWVudElEIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJSZWN1cnJpbmciIG5hbWU9IlJlY3VycmluZyIgdmFsdWU9IlslIERhdGEuUmVjdXJyaW5nIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJSZWN1cnJlbmNlRGF5cyIgbmFtZT0iUmVjdXJyZW5jZURheXMiIHZhbHVlPSJbJSBEYXRhLlJlY3VycmVuY2VEYXlzIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJSZWN1cnJlbmNlTW9udGhzIiBuYW1lPSJSZWN1cnJlbmNlTW9udGhzIiB2YWx1ZT0iWyUgRGF0YS5SZWN1cnJlbmNlTW9udGhzIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJSZWN1cnJlbmNlTW9udGhEYXlzIiBuYW1lPSJSZWN1cnJlbmNlTW9udGhEYXlzIiB2YWx1ZT0iWyUgRGF0YS5SZWN1cnJlbmNlTW9udGhEYXlzIHwgaHRtbCAlXSIvPgogICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIkJhc2ljIGluZm9ybWF0aW9uIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgICAgICA8bGFiZWwgZm9yPSJUaXRsZSJbJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA+PSAyICVdIGNsYXNzPSJNYW5kYXRvcnkiWyUgRU5EICVdPlslIElGIERhdGEuUGVybWlzc2lvbkxldmVsID49IDIgJV08c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBFTkQgJV1bJSBUcmFuc2xhdGUoIlRpdGxlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5UaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlRpdGxlIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCAlXSI+WyUgRGF0YS5UaXRsZSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3A+ClslIEVMU0UgJV0KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iVGl0bGUiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJUaXRsZSIgbmFtZT0iVGl0bGUiIHZhbHVlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIgY2xhc3M9Ilc3NXBjIFZhbGlkYXRlX1JlcXVpcmVkIiAvPgogICAgICAgICAgICAgICAgPGRpdiBpZD0iVGl0bGVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpdGxlU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+ClslIEVORCAlXQpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iRGVzY3JpcHRpb24iPlslIFRyYW5zbGF0ZSgiRGVzY3JpcHRpb24iKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJEZXNjcmlwdGlvbiIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIERhdGEuRGVzY3JpcHRpb24gfHwgIi0iIHwgaHRtbCAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJEZXNjcmlwdGlvbiIgbmFtZT0iRGVzY3JpcHRpb24iIGNsYXNzPSJXNzVwYyIgcm93cz0iNCI+WyUgRGF0YS5EZXNjcmlwdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iTG9jYXRpb24iPlslIFRyYW5zbGF0ZSgiTG9jYXRpb24iKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJMb2NhdGlvbiIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIERhdGEuTG9jYXRpb24gfHwgIi0iIHwgaHRtbCAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJMb2NhdGlvbiIgbmFtZT0iTG9jYXRpb24iIHZhbHVlPSJbJSBEYXRhLkxvY2F0aW9uIHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIiAvPgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTG9jYXRpb25MaW5rIikgJV0KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJMb2NhdGlvbkxpbmsgSGlkZGVuIFslIERhdGEuQ1NTQ2xhc3MgfCBodG1sICVdIiBocmVmPSJbJSBEYXRhLlVSTCB8IGh0bWwgJV1bJSBEYXRhLkxvY2F0aW9uIHwgdXJpICVdIiBkYXRhLWJhc2UtdXJsPSJbJSBEYXRhLlVSTCB8IGh0bWwgJV0iIHRpdGxlPSJbJSBEYXRhLlRleHQgfCBodG1sICVdIiB0YXJnZXQ9IlslIERhdGEuVGFyZ2V0IHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIFslIERhdGEuSWNvbk5hbWUgfCBodG1sICVdIj48L2k+CiAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJMb2NhdGlvbkxpbmsiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJDYWxlbmRhcklEIlslIElGICFEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICYmIERhdGEuUGVybWlzc2lvbkxldmVsID49IDMgJV0gY2xhc3M9Ik1hbmRhdG9yeSJbJSBFTkQgJV0+ClslIElGICFEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICYmIERhdGEuUGVybWlzc2lvbkxldmVsID49IDMgJV0KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+ClslIEVORCAlXQogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDYWxlbmRhciIpIHwgaHRtbCAlXToKICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEIHx8IERhdGEuUGVybWlzc2lvbkxldmVsIDwgMyAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IkNhbGVuZGFySUQiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkNhbGVuZGFyTmFtZSB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIFslIERhdGEuQ2FsZW5kYXJJRFN0cmcgJV0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNhbGVuZGFySURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNhbGVuZGFySURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiUmVzb3VyY2UiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+ClslIElGIERhdGEuVGVhbUlEU3RyZyAlXQogICAgICAgICAgICA8bGFiZWwgZm9yPSJUZWFtSUQiPlslIFRyYW5zbGF0ZSgiVGVhbSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGIERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlRlYW1JRCIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIERhdGEuVGVhbU5hbWVzICVdPC9wPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICBbJSBEYXRhLlRlYW1JRFN0cmcgJV0KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJlc291cmNlSUQiPlslIFRyYW5zbGF0ZSgiQWdlbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJSZXNvdXJjZUlEIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5SZXNvdXJjZU5hbWVzICVdPC9wPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICBbJSBEYXRhLlJlc291cmNlSURTdHJnICVdClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgRUxTRSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGlzIGZlYXR1cmUgaXMgY3VycmVudGx5IG5vdCBhdmFpbGFibGUuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBJbmZvIj4KICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZG1pbk9UUlNCdXNpbmVzcyIgY2xhc3M9IkJ1dHRvbiI+PGkgY2xhc3M9ImZhIGZhLWFuZ2xlLWRvdWJsZS11cCI+PC9pPiBbJSBUcmFuc2xhdGUoIlVwZ3JhZGUgdG8gJXMiLCBPVFJTQnVzaW5lc3NMYWJlbCkgJV08L2E+CiAgICAgICAgICAgIDwvZGl2PgpbJSBFTkQgJV0KICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIkRhdGUvVGltZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3RhcnREYXkiPlslIFRyYW5zbGF0ZSgiU3RhcnQgZGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGICggRGF0YS5UaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAmJiBEYXRhLlJlYWRPbmx5U3RhcnQgKSB8fCBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJTdGFydERheSIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIERhdGEuU3RhcnREYXRlIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlN0YXJ0RGF5RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgZGF0ZSEiKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgWyUgRGF0YS5TdGFydERhdGVTdHJpbmcgJV0KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkVuZERheSI+WyUgVHJhbnNsYXRlKCJFbmQgZGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGICggRGF0YS5UaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAmJiBEYXRhLlJlYWRPbmx5RHVyYXRpb24gKSB8fCBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJFbmREYXkiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkVuZERhdGUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPGRpdiBpZD0iRW5kRGF5RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgZGF0ZSEiKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIFslIERhdGEuRW5kRGF0ZVN0cmluZyAlXQpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iQWxsRGF5Ij5bJSBUcmFuc2xhdGUoIkFsbC1kYXkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEIHx8IERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IkFsbERheSIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIFRyYW5zbGF0ZShEYXRhLkFsbERheVN0cmluZykgfCBodG1sICVdPC9wPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJBbGxEYXkiIG5hbWU9IkFsbERheSIgWyUgRGF0YS5BbGxEYXlDaGVja2VkICVdIC8+ClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJSZWN1cnJlbmNlVHlwZSI+WyUgVHJhbnNsYXRlKCJSZXBlYXQiKSB8IGh0bWwgJV06PC9sYWJlbD4KWyUgSUYgRGF0YS5UaWNrZXRBcHBvaW50bWVudFJ1bGVJRCB8fCBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlBhcmVudElEICVdCiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4iKSB8IGh0bWwgJV08YnI+CiAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iRWRpdFBhcmVudCI+WyUgVHJhbnNsYXRlKCJDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50LiIpIHwgaHRtbCAlXTwvYT4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlJlY3VycmVuY2VUeXBlIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5SZWN1cnJlbmNlVmFsdWUgfCBodG1sICVdPC9wPgpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+ClslIEVMU0UgJV0KWyUgSUYgRGF0YS5QYXJlbnRJRCAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4iKSB8IGh0bWwgJV08YnI+CiAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iRWRpdFBhcmVudCI+WyUgVHJhbnNsYXRlKCJDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4iKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgIDwvZGl2PgpbJSBFTFNFICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuUmVjdXJyZW5jZVR5cGVTdHJpbmcgJV0KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCIgaWQ9IlJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRnJlcXVlbmN5IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkSW5saW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5SZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkV2ZXJ5IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkSW5saW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5SZWN1cnJlbmNlSW50ZXJ2YWxTdHJpbmcgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iUmVjdXJyZW5jZUludGVydmFsVGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJUZXh0RGF5IEhpZGRlbiI+WyUgVHJhbnNsYXRlKCJkYXkocykiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJUZXh0V2VlayBIaWRkZW4iPlslIFRyYW5zbGF0ZSgid2VlayhzKSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlRleHRNb250aCBIaWRkZW4iPlslIFRyYW5zbGF0ZSgibW9udGgocykiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJUZXh0WWVhciBIaWRkZW4iPlslIFRyYW5zbGF0ZSgieWVhcihzKSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCIgaWQ9IlJlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJPbiIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iRGF5cyIgbmFtZT0iRGF5cyIgdmFsdWU9IlslIERhdGEuRGF5cyAlXSIgLz4KCiMgV2Vla2x5IHRhYmxlIHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJCdXR0b25UYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjEiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1vbmRheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk1vbiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iMiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVHVlc2RheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlR1ZSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iMyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiV2VkbmVzZGF5IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiV2VkIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHZhbHVlPSI0IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUaHVyc2RheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRodSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iNSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRnJpZGF5IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRnJpIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHZhbHVlPSI2IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTYXR1cmRheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlNhdCIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iNyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU3VuZGF5IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiU3VuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiMgV2Vla2x5IHRhYmxlIGVuZAoKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIiBpZD0iUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJPbiIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iTW9udGhEYXlzIiBuYW1lPSJNb250aERheXMiIHZhbHVlPSJbJSBEYXRhLk1vbnRoRGF5cyAlXSIgLz4KCiMgTW9udGhseSB0YWJsZSBzdGFydAogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iQnV0dG9uVGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIENvdW50ID0gMSAlXQpbJSBXSElMRSBDb3VudCA8IDMyICVdClslIElGIENvdW50ICUgNyA9PSAxICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+ClslIEVORCAlXQoKIyBqb2luIHN0cmluZ3MgKE1vbnRobHkxLCBNb250aGx5MiwuLi4pClslIE1vbnRobHlDb3VudCA9ICJNb250aGx5IiBfIENvdW50ICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHZhbHVlPSJbJSBDb3VudCAlXSIgdGl0bGU9IlslIENvdW50ICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIENvdW50ICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIElGIENvdW50ICUgNyA9PSAwICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBFTkQgJV0KClslIENvdW50ID0gQ291bnQgKyAxICVdClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiMgTW9udGhseSB0YWJsZSBlbmQKCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCIgaWQ9IlJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJPbiIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iTW9udGhzIiBuYW1lPSJNb250aHMiIHZhbHVlPSJbJSBEYXRhLk1vbnRocyAlXSIgLz4KCiMgWWVhcmx5IHRhYmxlIHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJCdXR0b25UYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiSmFudWFyeSIpIHwgaHRtbCAlXSIgdmFsdWU9IjEiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiSmFuIil8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRmVicnVhcnkiKSB8IGh0bWwgJV0iIHZhbHVlPSIyIiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkZlYiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJNYXJjaCIpIHwgaHRtbCAlXSIgdmFsdWU9IjMiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTWFyIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkFwcmlsIikgfCBodG1sICVdIiB2YWx1ZT0iNCIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJBcHIiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1heV9sb25nIikgfCBodG1sICVdIiB2YWx1ZT0iNSIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJNYXkiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiSnVuZSIpIHwgaHRtbCAlXSIgdmFsdWU9IjYiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiSnVuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkp1bHkiKSB8IGh0bWwgJV0iIHZhbHVlPSI3IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkp1bCIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJBdWd1c3QiKSB8IGh0bWwgJV0iIHZhbHVlPSI4IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkF1ZyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VwdGVtYmVyIikgfCBodG1sICVdIiB2YWx1ZT0iOSIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTZXAiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiT2N0b2JlciIpIHwgaHRtbCAlXSIgdmFsdWU9IjEwIiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk9jdCIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJOb3ZlbWJlciIpIHwgaHRtbCAlXSIgdmFsdWU9IjExIiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vdiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEZWNlbWJlciIpIHwgaHRtbCAlXSIgdmFsdWU9IjEyIiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkRlYyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgojIFllYXJseSB0YWJsZSBlbmQKCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGlkPSJSZWN1cnJlbmNlTGltaXREaXYiIGNsYXNzPSJGaWVsZCBIaWRkZW4iPgogICAgICAgICAgICAgICAgWyUgRGF0YS5SZWN1cnJlbmNlTGltaXRTdHJpbmcgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9IlJlY3VycmVuY2VVbnRpbERpdiIgY2xhc3M9IkZpZWxkIEhpZGRlbiI+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSZWN1cnJlbmNlVW50aWxEYXlFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBkYXRlISIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlBsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgWyUgRGF0YS5SZWN1cnJlbmNlVW50aWxTdHJpbmcgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9IlJlY3VycmVuY2VDb3VudERpdiIgY2xhc3M9IkZpZWxkIEhpZGRlbiI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IlJlY3VycmVuY2VDb3VudCIgbmFtZT0iUmVjdXJyZW5jZUNvdW50IiB2YWx1ZT0iWyUgRGF0YS5SZWN1cnJlbmNlQ291bnQgfCBodG1sICVdIiBzaXplPSIxIiBtYXhsZW5ndGg9IjIiIC8+CiAgICAgICAgICAgIDwvZGl2PgpbJSBFTkQgJV0KWyUgRU5EICVdCiAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIk5vdGlmaWNhdGlvbiIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KCiAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5vdGlmaWNhdGlvblRlbXBsYXRlIj5bJSBUcmFuc2xhdGUoIk5vdGlmaWNhdGlvbiIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGIERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9Ik5vdGlmaWNhdGlvblRlbXBsYXRlIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5Ob3RpZmljYXRpb25WYWx1ZSB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIFslIERhdGEuTm90aWZpY2F0aW9uU3RyZyAlXQpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIiBpZD0iTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2Ij4KCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0Ij5bJSBUcmFuc2xhdGUoIlJlbGF0aXZlIHBvaW50IG9mIHRpbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0IiB2YWx1ZT0iIiBpZD0iTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dCIgWyUgRGF0YS5Ob3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0UmFkaW8gJV0+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRJbmxpbmUiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCIgbmFtZT0iTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQiIHZhbHVlPSJbJSBEYXRhLk5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50IHwgaHRtbCAlXSIgc2l6ZT0iMSIgbWF4bGVuZ3RoPSIyIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU3BhY2luZ1RvcFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTm90aWZpY2F0aW9uQ3VzdG9tVW5pdHNTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Ob3RpZmljYXRpb25DdXN0b21Vbml0c1BvaW50T2ZUaW1lU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0Ij5bJSBUcmFuc2xhdGUoIkRhdGUvVGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCIgdmFsdWU9IiIgaWQ9Ik5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQiIFslIERhdGEuTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dFJhZGlvICVdPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVTdHJnICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgPC9maWVsZHNldD4KClslIElGIERhdGEuUGx1Z2luTGlzdCAlXQogICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIkxpbmsiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+ClslIEZPUkVBQ0ggS2V5IElOIERhdGEuUGx1Z2luTGlzdC5rZXlzICVdCiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5QbHVnaW5MaXN0LiRLZXkuUGx1Z2luTmFtZSkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPj0gMiAlXQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGRhdGEtcGx1Z2luLWtleT0iWyUgS2V5IHwgaHRtbCAlXSIgZGF0YS1wbHVnaW4tdXJsPSJbJSBEYXRhLlBsdWdpbkxpc3QuJEtleS5QbHVnaW5VUkwgfCBodG1sICVdIiBjbGFzcz0iUGx1Z2luRmllbGQgVzc1cGMiIC8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iUGx1Z2luX1slIEtleSB8IGh0bWwgJV0iIG5hbWU9IlBsdWdpbl9bJSBLZXkgfCBodG1sICVdIiB2YWx1ZT0nWyUgRGF0YS5QbHVnaW5MaXN0LiRLZXkuTGlua0xpc3QgfHwgIltdIiAlXScgLz4KWyUgRUxTRSAlXQpbJSBJRiBEYXRhLlBsdWdpbkRhdGEuJEtleS5zaXplID09IDAgJV0KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJSZWFkT25seVZhbHVlIj4tPC9wPgpbJSBFTkQgJV0KWyUgRU5EICVdCiMga2VlcCBmb2xsb3dpbmcgYmxvY2sgb24gYSBzaW5nbGUgbGluZSwgc28gOmVtcHR5IENTUyBzZWxlY3RvciB3b3VsZCB3b3JrIQogICAgICAgICAgICAgICAgPGRpdiBpZD0iUGx1Z2luQ29udGFpbmVyX1slIEtleSB8IGh0bWwgJV0iWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPj0gMiAlXSBjbGFzcz0iUGx1Z2luQ29udGFpbmVyIlslIEVORCAlXT5bJSBGT1JFQUNIIExpbmsgSU4gRGF0YS5QbHVnaW5EYXRhLiRLZXkgJV08ZGl2IGNsYXNzPSJMaW5rX1slIExpbmsuTGlua0lEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IlslIExpbmsuTGlua1VSTCAlXSI+WyUgTGluay5MaW5rTmFtZSB8IGh0bWwgJV08L2E+WyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPj0gMiAlXTxhIGNsYXNzPSJSZW1vdmVCdXR0b24iIGhyZWY9IiMiIGRhdGEtcGx1Z2luLWtleT0iWyUgS2V5IHwgaHRtbCAlXSIgZGF0YS1saW5rLWlkPSJbJSBMaW5rLkxpbmtJRCB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSBlbnRyeSIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPjwvYT5bJSBFTkQgJV0KICAgICAgICAgICAgICAgIDwvZGl2PlslIEVORCAlXTwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBFTkQgJV0KICAgICAgICA8L2ZpZWxkc2V0PgpbJSBFTkQgJV0KICAgIDwvZm9ybT4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJDb250ZW50Rm9vdGVyIENlbnRlciI+ClslIElGICFEYXRhLlBlcm1pc3Npb25MZXZlbCB8fCBEYXRhLlBlcm1pc3Npb25MZXZlbCA+IDEgJV0KICAgIDxidXR0b24gaWQ9IkVkaXRGb3JtU3VibWl0IiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2hlY2stc3F1YXJlLW8iPjwvaT4gWyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgpbJSBFTkQgJV0KWyUgSUYgRGF0YS5BcHBvaW50bWVudElEICYmICFEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICYmIERhdGEuUGVybWlzc2lvbkxldmVsID4gMiAlXQogICAgPGJ1dHRvbiBpZD0iRWRpdEZvcm1Db3B5IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiQ29weSIpIHwgaHRtbCAlXSI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLWZpbGVzLW8iPjwvaT4gWyUgVHJhbnNsYXRlKCJDb3B5IikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgpbJSBFTkQgJV0KWyUgSUYgRGF0YS5BcHBvaW50bWVudElEICYmICFEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICYmIERhdGEuUGVybWlzc2lvbkxldmVsID4gMiAlXQogICAgPGJ1dHRvbiBpZD0iRWRpdEZvcm1EZWxldGUiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIj48c3Bhbj5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KWyUgRU5EICVdCiAgICA8YnV0dG9uIGlkPSJFZGl0Rm9ybUNhbmNlbCIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwoKQ29yZS5Gb3JtLlZhbGlkYXRlLkluaXQoKTsKQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLkxvY2F0aW9uTGlua0luaXQoJCgnI0xvY2F0aW9uJyksICQoJy5Mb2NhdGlvbkxpbmsnKSk7CkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5BbGxEYXlJbml0KCQoJyNBbGxEYXknKSk7CkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5SZWN1cnJpbmdJbml0KHsKICAgICRSZWN1cnJpbmc6ICQoJyNSZWN1cnJpbmcnKSwKICAgICRSZWN1cnJlbmNlVHlwZTogJCgnI1JlY3VycmVuY2VUeXBlJyksCiAgICAkUmVjdXJyZW5jZUN1c3RvbVR5cGU6ICQoJyNSZWN1cnJlbmNlQ3VzdG9tVHlwZScpLAogICAgJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2OiAkKCcjUmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmdEaXYnKSwKICAgICRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0OiAkKCcjUmVjdXJyZW5jZUludGVydmFsVGV4dCcpLAogICAgJFJlY3VycmVuY2VDdXN0b21XZWVrbHlEaXY6ICQoJyNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2JyksCiAgICAkUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXY6ICQoJyNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdicpLAogICAgJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXY6ICQoJyNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2JyksCiAgICAkUmVjdXJyZW5jZUxpbWl0RGl2OiAkKCcjUmVjdXJyZW5jZUxpbWl0RGl2JyksCiAgICAkUmVjdXJyZW5jZUxpbWl0OiAkKCcjUmVjdXJyZW5jZUxpbWl0JyksCiAgICAkUmVjdXJyZW5jZVVudGlsRGl2OiAkKCcjUmVjdXJyZW5jZVVudGlsRGl2JyksCiAgICAkUmVjdXJyZW5jZVVudGlsRGF5OiAkKCcjUmVjdXJyZW5jZVVudGlsRGF5JyksCiAgICAkUmVjdXJyZW5jZUNvdW50RGl2OiAkKCcjUmVjdXJyZW5jZUNvdW50RGl2JykKfSk7CgpDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuTm90aWZpY2F0aW9uSW5pdCh7CiAgICAkTm90aWZpY2F0aW9uVGVtcGxhdGU6ICQoJyNOb3RpZmljYXRpb25UZW1wbGF0ZScpLAogICAgJE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdjogJCgnI05vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdicpLAogICAgJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQ6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0JyksCiAgICAkTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQ6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCcpLAogICAgJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdDogJCgnI05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCcpLAogICAgJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWU6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lJyksCiAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dDogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQnKSwKICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZURheTogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lRGF5JyksCiAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aDogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGgnKSwKICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVllYXI6ICQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVllYXInKSwKICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUhvdXI6ICQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUhvdXInKSwKICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1pbnV0ZTogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlJykKfSk7CgpDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuVGVhbUluaXQoJCgnI1RlYW1JRCcpLCAkKCcjUmVzb3VyY2VJRCcpLCAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSwgJCgnbGFiZWxbZm9yPSJUZWFtSUQiXSArIGRpdi5GaWVsZCBwLlJlYWRPbmx5VmFsdWUnKSwgJCgnbGFiZWxbZm9yPSJSZXNvdXJjZUlEIl0gKyBkaXYuRmllbGQgcC5SZWFkT25seVZhbHVlJykpOwpbJSBJRiAhRGF0YS5QZXJtaXNzaW9uTGV2ZWwgT1IgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPiAxICVdCkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5QbHVnaW5Jbml0KCQoJy5QbHVnaW5GaWVsZCcpLCAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSk7ClslIEVORCAlXQoKQ29yZS5Gb3JtLlZhbGlkYXRlLlNldFN1Ym1pdEZ1bmN0aW9uKCQoJyNFZGl0QXBwb2ludG1lbnRGb3JtJyksIGZ1bmN0aW9uIChGb3JtKSB7CiAgICB2YXIgRGF0YSA9IG5ldyBPYmplY3QoKSwKICAgICAgICBEYXlzID0gbmV3IEFycmF5KCksCiAgICAgICAgTW9udGhEYXlzID0gbmV3IEFycmF5KCksCiAgICAgICAgTW9udGhzID0gbmV3IEFycmF5KCk7CgogICAgLy8gc2VyaWFsaXplIGRheXMKICAgICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgRGF5cy5wdXNoKCQodGhpcykudmFsKCkpOwogICAgfSk7CiAgICAkKCJpbnB1dCNEYXlzIikudmFsKERheXMuam9pbigpKTsKCiAgICAvLyBzZXJpYWxpemUgbW9udGggZGF5cwogICAgJCgiI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgTW9udGhEYXlzLnB1c2goJCh0aGlzKS52YWwoKSk7CiAgICB9KTsKICAgICQoImlucHV0I01vbnRoRGF5cyIpLnZhbChNb250aERheXMuam9pbigpKTsKCiAgICAvLyBzZXJpYWxpemUgbW9udGhzCiAgICAkKCIjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlIikuZWFjaChmdW5jdGlvbigpewogICAgICAgIE1vbnRocy5wdXNoKCQodGhpcykudmFsKCkpOwogICAgfSk7CiAgICAkKCJpbnB1dCNNb250aHMiKS52YWwoTW9udGhzLmpvaW4oKSk7CgogICAgJChGb3JtKS5maW5kKCdpbnB1dCx0ZXh0YXJlYSxzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uIChJbmRleCwgRWxlbWVudCkgewogICAgICAgIGlmIChFbGVtZW50LnR5cGUgPT0gJ2NoZWNrYm94JykgewogICAgICAgICAgICBEYXRhW0VsZW1lbnQuaWRdID0gJChFbGVtZW50KS5wcm9wKCdjaGVja2VkJykgPyAnMScgOiAnMCc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgRGF0YVtFbGVtZW50LmlkXSA9ICQoRWxlbWVudCkudmFsKCk7CiAgICAgICAgfQogICAgfSk7CgogICAgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLlNob3dXYWl0aW5nRGlhbG9nKCk7CiAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuRWRpdEFwcG9pbnRtZW50KERhdGEpOwp9KTsKCgokKCIuQnV0dG9uVGFibGUgYnV0dG9uIikub24oImNsaWNrIiwgZnVuY3Rpb24oKSB7CiAgICAkKHRoaXMpLnRvZ2dsZUNsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKTsKfSk7CgovLyBEdXBsaWNhdGUgYXBwb2ludG1lbnQKJCgnI0VkaXRGb3JtQ29weScpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgLy8gUmVzZXQgQXBwb2ludG1lbnRJRCwgcmVtb3ZlIENvcHkgJiBEZWxldGUgYnV0dG9ucwogICAgJCgiI0VkaXRBcHBvaW50bWVudEZvcm0gaW5wdXQjQXBwb2ludG1lbnRJRCIpLnZhbCgiIik7CiAgICAkKCcjRWRpdEFwcG9pbnRtZW50Rm9ybScpLnN1Ym1pdCgpOwp9KTsKCi8vIFNhdmUgdGhlIGFwcG9pbnRtZW50CiQoJyNFZGl0Rm9ybVN1Ym1pdCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgJCgnI0VkaXRBcHBvaW50bWVudEZvcm0nKS5zdWJtaXQoKTsKfSk7CgpbJSBJRiBEYXRhLkFwcG9pbnRtZW50SUQgJV0KCi8vIERlbGV0ZSB0aGUgYXBwb2ludG1lbnQKJCgnI0VkaXRGb3JtRGVsZXRlJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICBpZiAod2luZG93LmNvbmZpcm0oWyUgVHJhbnNsYXRlKCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuIikgfCBKU09OICVdKSkgewogICAgICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5TaG93V2FpdGluZ0RpYWxvZygpOwogICAgICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5FZGl0QXBwb2ludG1lbnQoewogICAgICAgICAgICBDYWxlbmRhcklEOiBbJSBEYXRhLkNhbGVuZGFySUQgfCBKU09OICVdLAogICAgICAgICAgICBBcHBvaW50bWVudElEOiBbJSBEYXRhLkFwcG9pbnRtZW50SUQgfCBKU09OICVdLAogICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgIFN1YmFjdGlvbjogJ0RlbGV0ZUFwcG9pbnRtZW50JwogICAgICAgIH0pOwogICAgfQp9KTsKClslIEVORCAlXQoKWyUgSUYgRGF0YS5QYXJlbnRJRCAlXQoKLy8gRWRpdCBwYXJlbnQgYXBwb2ludG1lbnQKJCgnI0VkaXRQYXJlbnQnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgIHZhciBEYXRhID0gewogICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCIjQ2hhbGxlbmdlVG9rZW4iKS52YWwoKSwKICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgU3ViYWN0aW9uOiAnRWRpdE1hc2snLAogICAgICAgIEFwcG9pbnRtZW50SUQ6IFslIERhdGEuUGFyZW50SUQgfCBKU09OICVdCiAgICB9OwoKICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5TaG93V2FpdGluZ0RpYWxvZygpOwogICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgIERhdGEsCiAgICAgICAgZnVuY3Rpb24gKEhUTUwpIHsKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coSFRNTCwgWyUgVHJhbnNsYXRlKCJBcHBvaW50bWVudCIpIHwgSlNPTiAlXSwgJzEwcHgnLCAnQ2VudGVyJywgdHJ1ZSwgdW5kZWZpbmVkLCB0cnVlKTsKICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZSgkKCcuRGlhbG9nOnZpc2libGUnKSk7CiAgICAgICAgfSwgJ2h0bWwnCiAgICApOwp9KTsKClslIEVORCAlXQoKLy8gQ2xvc2UgdGhlIGRpYWxvZwokKCcjRWRpdEZvcm1DYW5jZWwnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKfSk7CgpbJSBJbnNlcnRUZW1wbGF0ZSgiRGF0ZXBpY2tlci50dCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEYXRlcGlja2VySW5pdCIpICVdCkNvcmUuVUkuRGF0ZXBpY2tlci5Jbml0KHsKICAgIERheTogJCgiIyIgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihbJSBEYXRhLlByZWZpeCB8IEpTT04gJV0pICsgIkRheSIpLAogICAgTW9udGg6ICQoIiMiICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoWyUgRGF0YS5QcmVmaXggfCBKU09OICVdKSArICJNb250aCIpLAogICAgWWVhcjogJCgiIyIgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihbJSBEYXRhLlByZWZpeCB8IEpTT04gJV0pICsgIlllYXIiKSwKICAgIEhvdXI6ICQoIiMiICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoWyUgRGF0YS5QcmVmaXggfCBKU09OICVdKSArICJIb3VyIiksCiAgICBNaW51dGU6ICQoIiMiICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoWyUgRGF0YS5QcmVmaXggfCBKU09OICVdKSArICJNaW51dGUiKSwKICAgIFdlZWtEYXlTdGFydDogWyUgRGF0YS5XZWVrRGF5U3RhcnQgfCBKU09OICVdCn0pOwpbJSBSZW5kZXJCbG9ja0VuZCgiRGF0ZXBpY2tlckluaXQiKSAlXQoKLy9dXT48L3NjcmlwdD4KWyUgUmVuZGVyQmxvY2tFbmQoIkVkaXRNYXNrIikgJV0K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIkVkaXRNYXNrIikgJV0KClslIFJlbmRlckJsb2NrRW5kKCJFZGl0TWFzayIpICVdCjxwPlRlc3Q8L3A+Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkRhc2hib2FyZDo6QXBwb2ludG1lbnRDYWxlbmRhcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIHBhcmFtZXRlcnMKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWcgTmFtZSBVc2VySUQpKSB7CiAgICAgICAgZGllICJHb3Qgbm8gJE5lZWRlZCEiIGlmICggISRTZWxmLT57JE5lZWRlZH0gKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBjdXJyZW50IGZpbHRlcgogICAgbXkgJE5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmFtZScgKSB8fCAnJzsKICAgIG15ICRQcmVmZXJlbmNlc0tleSA9ICdEYXNoYm9hcmRDYWxlbmRhckFwcG9pbnRtZW50RmlsdGVyJyAuICRTZWxmLT57TmFtZX07CiAgICBpZiAoICRTZWxmLT57TmFtZX0gZXEgJE5hbWUgKSB7CiAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbHRlcicgKSB8fCAnJzsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHJlbWVtYmVyIGZpbHRlcgogICAgaWYgKCAkU2VsZi0+e0ZpbHRlcn0gKSB7CgogICAgICAgICMgdXBkYXRlIHNlc3Npb24KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nKS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJFByZWZlcmVuY2VzS2V5LAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntGaWx0ZXJ9LAogICAgICAgICk7CgogICAgICAgICMgdXBkYXRlIHByZWZlcmVuY2VzCiAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdEZW1vU3lzdGVtJykgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkUHJlZmVyZW5jZXNLZXksCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJFNlbGYtPntGaWx0ZXJ9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IGZpbHRlciBpZiBub3Qgc2V0IHlldAogICAgaWYgKCAhJFNlbGYtPntGaWx0ZXJ9ICkgewogICAgICAgICRTZWxmLT57RmlsdGVyfSA9ICRTZWxmLT57JFByZWZlcmVuY2VzS2V5fSB8fCAkU2VsZi0+e0NvbmZpZ30tPntGaWx0ZXJ9IHx8ICdUb2RheSc7CiAgICB9CgogICAgIyBzZXR1cCB0aGUgcHJlZnJlbmNlcyBrZXlzCiAgICAkU2VsZi0+e1ByZWZLZXlTaG93bn0gICA9ICdBcHBvaW50bWVudERhc2hib2FyZFByZWYnIC4gJFNlbGYtPntOYW1lfSAuICctU2hvd24nOwogICAgJFNlbGYtPntQcmVmS2V5UmVmcmVzaH0gPSAnQXBwb2ludG1lbnREYXNoYm9hcmRQcmVmJyAuICRTZWxmLT57TmFtZX0gLiAnLVJlZnJlc2gnOwoKICAgICRTZWxmLT57UGFnZVNob3dufSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+eyAkU2VsZi0+e1ByZWZLZXlTaG93bn0gfQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+e0xpbWl0fSB8fCAxMDsKCiAgICAkU2VsZi0+e1BhZ2VSZWZyZXNofSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+eyAkU2VsZi0+e1ByZWZLZXlSZWZyZXNofSB9CiAgICAgICAgfHwgMTsKCiAgICAkU2VsZi0+e1N0YXJ0SGl0fSA9IGludCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N0YXJ0SGl0JyApIHx8IDEgKTsKCiAgICAkU2VsZi0+e0NhY2hlS2V5fSA9ICRTZWxmLT57TmFtZX0gLiAnOjonOwoKICAgICMgZ2V0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBmdWxsIG5hbWUgb3JkZXIgZm9yIHVzZXIgbmFtZXMKICAgICMgYW5kIGFwcGVuZCBpdCB0byB0aGUgY2FjaGUga2V5IHRvIG1ha2Ugc3VyZSwgdGhhdCB0aGUKICAgICMgY29ycmVjdCBkYXRhIHdpbGwgYmUgZGlzcGxheWVkIGV2ZXJ5IHRpbWUKICAgIG15ICRGaXJzdG5hbWVMYXN0TmFtZU9yZGVyID0gJENvbmZpZ09iamVjdC0+R2V0KCdGaXJzdG5hbWVMYXN0bmFtZU9yZGVyJykgfHwgMDsKICAgICRTZWxmLT57Q2FjaGVLZXl9IC49ICc6OicgLiAkRmlyc3RuYW1lTGFzdE5hbWVPcmRlcjsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBQYXJhbXMgPSAoCiAgICAgICAgewogICAgICAgICAgICBEZXNjICA9PiBUcmFuc2xhdGFibGUoJ1Nob3duJyksCiAgICAgICAgICAgIE5hbWUgID0+ICRTZWxmLT57UHJlZktleVNob3dufSwKICAgICAgICAgICAgQmxvY2sgPT4gJ09wdGlvbicsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgIDUgID0+ICcgNScsCiAgICAgICAgICAgICAgICAxMCA9PiAnMTAnLAogICAgICAgICAgICAgICAgMTUgPT4gJzE1JywKICAgICAgICAgICAgICAgIDIwID0+ICcyMCcsCiAgICAgICAgICAgICAgICAyNSA9PiAnMjUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkU2VsZi0+e1BhZ2VTaG93bn0sCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIERlc2MgID0+IFRyYW5zbGF0YWJsZSgnUmVmcmVzaCAobWludXRlcyknKSwKICAgICAgICAgICAgTmFtZSAgPT4gJFNlbGYtPntQcmVmS2V5UmVmcmVzaH0sCiAgICAgICAgICAgIEJsb2NrID0+ICdPcHRpb24nLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICAwICA9PiBUcmFuc2xhdGFibGUoJ29mZicpLAogICAgICAgICAgICAgICAgMSAgPT4gJzEnLAogICAgICAgICAgICAgICAgMiAgPT4gJzInLAogICAgICAgICAgICAgICAgNSAgPT4gJzUnLAogICAgICAgICAgICAgICAgNyAgPT4gJzcnLAogICAgICAgICAgICAgICAgMTAgPT4gJzEwJywKICAgICAgICAgICAgICAgIDE1ID0+ICcxNScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRTZWxmLT57UGFnZVJlZnJlc2h9LAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBAUGFyYW1zOwp9CgpzdWIgQ29uZmlnIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICgKICAgICAgICAleyAkU2VsZi0+e0NvbmZpZ30gfSwKCiAgICAgICAgQ2FuUmVmcmVzaCA9PiAxLAoKICAgICAgICAjIHJlbWVtYmVyLCBkbyBub3QgYWxsb3cgdG8gdXNlIHBhZ2UgY2FjaGUKICAgICAgICAjIChpdCdzIG5vdCB3b3JraW5nIGJlY2F1c2Ugb2YgaW50ZXJuYWwgZmlsdGVyKQogICAgICAgIENhY2hlS2V5ID0+IHVuZGVmLAogICAgICAgIENhY2hlVFRMID0+IHVuZGVmLAogICAgKTsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBzZXR0aW5ncwogICAgbXkgJElkbGVNaW51dGVzID0gJFNlbGYtPntDb25maWd9LT57SWRsZU1pbnV0ZXN9IHx8IDYwOwogICAgbXkgJFNvcnRCeSAgICAgID0gJFNlbGYtPntDb25maWd9LT57U29ydEJ5fSAgICAgIHx8ICdVc2VyRnVsbG5hbWUnOwoKICAgICMgZ2V0IGEgbGlzdCBvZiBhdCBsZWFzdCByZWFkYWJsZSBjYWxlbmRhcnMKICAgIG15IEBDYWxlbmRhckxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKS0+Q2FsZW5kYXJMaXN0KAogICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICk7CgogICAgIyBjb2xsZWN0IGNhbGVuZGFyIGFuZCBhcHBvaW50bWVudCBkYXRhCiAgICAjIHNlcGFyYXRlIGFwcG9pbnRtZW50cyB0byB0b2RheSwgdG9tb3Jyb3cKICAgICMgYW5kIHRoZSBuZXh0IGZpdmUgZGF5cyAoc29vbikKICAgIG15ICVDYWxlbmRhcnM7CiAgICBteSAlQXBwb2ludG1lbnRzOwogICAgbXkgJUFwcG9pbnRtZW50c0NvdW50OwoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZUtleUNhbGVuZGFycyAgICAgICAgID0gJFNlbGYtPntDYWNoZUtleX0gLiAkU2VsZi0+e1VzZXJJRH0gLiAnOjpDYWxlbmRhcnMnOwogICAgbXkgJENhY2hlS2V5QXBwb2ludG1lbnRzICAgICAgPSAkU2VsZi0+e0NhY2hlS2V5fSAuICRTZWxmLT57VXNlcklEfSAuICc6OkFwcG9pbnRtZW50czo6JyAuICRTZWxmLT57RmlsdGVyfTsKICAgIG15ICRDYWNoZUtleUFwcG9pbnRtZW50c0NvdW50ID0gJFNlbGYtPntDYWNoZUtleX0gLiAkU2VsZi0+e1VzZXJJRH0gLiAnOjpBcHBvaW50bWVudHNDb3VudCc7CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBnZXQgY2FjaGVkIGRhdGEKICAgIG15ICREYXRhQ2FsZW5kYXJzID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgVHlwZSA9PiAnRGFzaGJvYXJkJywKICAgICAgICBLZXkgID0+ICRDYWNoZUtleUNhbGVuZGFycywKICAgICk7CiAgICBteSAkRGF0YUFwcG9pbnRtZW50cyA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJ0Rhc2hib2FyZCcsCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXlBcHBvaW50bWVudHMsCiAgICApOwogICAgbXkgJERhdGFBcHBvaW50bWVudHNDb3VudCA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJ0Rhc2hib2FyZCcsCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXlBcHBvaW50bWVudHNDb3VudCwKICAgICk7CgogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAjIGlmIGNhY2hlIGlzIHVwLXRvLWRhdGUsIHVzZSB0aGUgZ2l2ZW4gZGF0YQogICAgaWYgKAogICAgICAgIHJlZiAkRGF0YUNhbGVuZGFycyBlcSAnSEFTSCcKICAgICAgICAmJiByZWYgJERhdGFBcHBvaW50bWVudHMgZXEgJ0hBU0gnCiAgICAgICAgJiYgcmVmICREYXRhQXBwb2ludG1lbnRzQ291bnQgZXEgJ0hBU0gnCiAgICAgICAgKQogICAgewogICAgICAgICVDYWxlbmRhcnMgICAgICAgICA9ICV7JERhdGFDYWxlbmRhcnN9OwogICAgICAgICVBcHBvaW50bWVudHMgICAgICA9ICV7JERhdGFBcHBvaW50bWVudHN9OwogICAgICAgICVBcHBvaW50bWVudHNDb3VudCA9ICV7JERhdGFBcHBvaW50bWVudHNDb3VudH07CiAgICB9CgogICAgIyBjb2xsZWN0IHRoZSBkYXRhIGFnYWluIGlmIG5lY2Vzc2FyeQogICAgZWxzZSB7CgogICAgICAgIENBTEVOREFSOgogICAgICAgIGZvciBteSAkQ2FsZW5kYXIgKEBDYWxlbmRhckxpc3QpIHsKCiAgICAgICAgICAgIG5leHQgQ0FMRU5EQVIgaWYgISRDYWxlbmRhcjsKICAgICAgICAgICAgbmV4dCBDQUxFTkRBUiBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJENhbGVuZGFyKTsKICAgICAgICAgICAgbmV4dCBDQUxFTkRBUiBpZiAkQ2FsZW5kYXJzeyAkQ2FsZW5kYXItPntDYWxlbmRhcklEfSB9OwoKICAgICAgICAgICAgJENhbGVuZGFyc3sgJENhbGVuZGFyLT57Q2FsZW5kYXJJRH0gfSA9ICRDYWxlbmRhcjsKICAgICAgICB9CgogICAgICAgICMgc2V0IGNhY2hlIGZvciBjYWxlbmRhcnMKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0Rhc2hib2FyZCcsCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleUNhbGVuZGFycywKICAgICAgICAgICAgVmFsdWUgPT4gXCVDYWxlbmRhcnMsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0NhY2hlVFRMTG9jYWx9ICogNjAsCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmVwYXJlIGNhbGVuZGFyIGFwcG9pbnRtZW50cwogICAgICAgIG15ICVBcHBvaW50bWVudHNVbnNvcnRlZDsKCiAgICAgICAgIyBnZXQgYSBsb2NhbCBhcHBvaW50bWVudCBvYmplY3QKICAgICAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CgogICAgICAgIENBTEVOREFSSUQ6CiAgICAgICAgZm9yIG15ICRDYWxlbmRhcklEICggc29ydCBrZXlzICVDYWxlbmRhcnMgKSB7CgogICAgICAgICAgICBuZXh0IENBTEVOREFSSUQgaWYgISRDYWxlbmRhcklEOwoKICAgICAgICAgICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50VGltZXN0YW1wR2V0KCksCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQ0FMRU5EQVJJRCBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCBcQEFwcG9pbnRtZW50cyApOwoKICAgICAgICAgICAgQVBQT0lOVE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKCiAgICAgICAgICAgICAgICBuZXh0IEFQUE9JTlRNRU5UIGlmICEkQXBwb2ludG1lbnQ7CiAgICAgICAgICAgICAgICBuZXh0IEFQUE9JTlRNRU5UIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkQXBwb2ludG1lbnQpOwoKICAgICAgICAgICAgICAgICMgc2F2ZSBzeXN0ZW0gdGltZSBvZiBTdGFydFRpbWUKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1N5c3RlbVRpbWVTdGFydH0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudC0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2F2ZSBhcHBvaW50bWVudCBpbiBuZXcgaGFzaCBmb3IgbGF0ZXIgc29ydGluZwogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c1Vuc29ydGVkeyAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSB9ID0gJEFwcG9pbnRtZW50OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBkYXRldGltZSBzdHJpbmdzIGZvciB0aGUgZGF0ZXMgd2l0aCByZWxhdGVkIG9mZnNldHMKICAgICAgICAjICh0b2RheSwgdG9tb3Jyb3cgYW5kIHNvb24gLSB3aGljaCBtZWFucyB0aGUgbmV4dCA1IGRheXMKICAgICAgICAjIGV4Y2VwdCB0b2RheSBhbmQgdG9tb3Jyb3cgY291bnRlZCBmcm9tIGN1cnJlbnQgdGltZXN0YW1wKQogICAgICAgIG15ICVEYXRlT2Zmc2V0ID0gKAogICAgICAgICAgICBUb2RheSAgICAgPT4gMCwKICAgICAgICAgICAgVG9tb3Jyb3cgID0+IDg2NDAwLAogICAgICAgICAgICBQbHVzVHdvICAgPT4gMTcyODAwLAogICAgICAgICAgICBQbHVzVGhyZWUgPT4gMjU5MjAwLAogICAgICAgICAgICBQbHVzRm91ciAgPT4gMzQ1NjAwLAogICAgICAgICk7CgogICAgICAgIG15ICVEYXRlczsKCiAgICAgICAgIyBnZXQgY3VycmVudCB0aW1lc3RhbXAKICAgICAgICBteSAkQ3VycmVudFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCk7CgogICAgICAgIGZvciBteSAkRGF0ZU9mZnNldEtleSAoIHNvcnQga2V5cyAlRGF0ZU9mZnNldCApIHsKCiAgICAgICAgICAgICMgZ2V0IGRhdGUgdW5pdHMgd2l0aCBjdXJyZW50IG9mZnNldAogICAgICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRDdXJyZW50U3lzdGVtVGltZSArICREYXRlT2Zmc2V0eyREYXRlT2Zmc2V0S2V5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICREYXRlc3skRGF0ZU9mZnNldEtleX0KICAgICAgICAgICAgICAgID0gc3ByaW50ZiggIiUwMmQiLCAkWWVhciApIC4gJy0nIC4gc3ByaW50ZiggIiUwMmQiLCAkTW9udGggKSAuICctJyAuIHNwcmludGYoICIlMDJkIiwgJERheSApOwogICAgICAgIH0KCiAgICAgICAgJEFwcG9pbnRtZW50c0NvdW50e1RvZGF5fSAgICA9IDA7CiAgICAgICAgJEFwcG9pbnRtZW50c0NvdW50e1RvbW9ycm93fSA9IDA7CiAgICAgICAgJEFwcG9pbnRtZW50c0NvdW50e1Nvb259ICAgICA9IDA7CgogICAgICAgIEFQUE9JTlRNRU5USUQ6CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudElEICggc29ydCBrZXlzICVBcHBvaW50bWVudHNVbnNvcnRlZCApIHsKCiAgICAgICAgICAgIG5leHQgQVBQT0lOVE1FTlRJRCBpZiAhJEFwcG9pbnRtZW50SUQ7CiAgICAgICAgICAgIG5leHQgQVBQT0lOVE1FTlRJRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRBcHBvaW50bWVudHNVbnNvcnRlZHskQXBwb2ludG1lbnRJRH0gKTsKICAgICAgICAgICAgbmV4dCBBUFBPSU5UTUVOVElEIGlmICEkQXBwb2ludG1lbnRzVW5zb3J0ZWR7JEFwcG9pbnRtZW50SUR9LT57U3RhcnRUaW1lfTsKCiAgICAgICAgICAgICMgZXh0cmFjdCBjdXJyZW50IGRhdGUgKHdpdGhvdXQgdGltZSkKICAgICAgICAgICAgbXkgJFN0YXJ0RGF0ZVN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50c1Vuc29ydGVkeyRBcHBvaW50bWVudElEfS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEFQUE9JTlRNRU5USUQgaWYgISRTdGFydERhdGVTeXN0ZW1UaW1lOwoKICAgICAgICAgICAgbXkgKCAkQ1NlY29uZCwgJENNaW51dGUsICRDSG91ciwgJENEYXksICRDTW9udGgsICRDWWVhciwgJENEYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0RGF0ZVN5c3RlbVRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkU3RhcnREYXRlCiAgICAgICAgICAgICAgICA9IHNwcmludGYoICIlMDJkIiwgJENZZWFyICkgLiAnLScgLiBzcHJpbnRmKCAiJTAyZCIsICRDTW9udGggKSAuICctJyAuIHNwcmludGYoICIlMDJkIiwgJENEYXkgKTsKCiAgICAgICAgICAgICMgdG9kYXkKICAgICAgICAgICAgaWYgKCAkU3RhcnREYXRlIGVxICREYXRlc3tUb2RheX0gKSB7CgogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c0NvdW50e1RvZGF5fSsrOwoKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntGaWx0ZXJ9IGVxICdUb2RheScgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c3skQXBwb2ludG1lbnRJRH0gPSAkQXBwb2ludG1lbnRzVW5zb3J0ZWR7JEFwcG9pbnRtZW50SUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRvbW9ycm93CiAgICAgICAgICAgIGVsc2lmICggJFN0YXJ0RGF0ZSBlcSAkRGF0ZXN7VG9tb3Jyb3d9ICkgewoKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHNDb3VudHtUb21vcnJvd30rKzsKCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57RmlsdGVyfSBlcSAnVG9tb3Jyb3cnICkgewogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHN7JEFwcG9pbnRtZW50SUR9ID0gJEFwcG9pbnRtZW50c1Vuc29ydGVkeyRBcHBvaW50bWVudElEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzb29uCiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICRTdGFydERhdGUgZXEgJERhdGVze1BsdXNUd299CiAgICAgICAgICAgICAgICB8fCAkU3RhcnREYXRlIGVxICREYXRlc3tQbHVzVGhyZWV9CiAgICAgICAgICAgICAgICB8fCAkU3RhcnREYXRlIGVxICREYXRlc3tQbHVzRm91cn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c0NvdW50e1Nvb259Kys7CgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0ZpbHRlcn0gZXEgJ1Nvb24nICkgewogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHN7JEFwcG9pbnRtZW50SUR9ID0gJEFwcG9pbnRtZW50c1Vuc29ydGVkeyRBcHBvaW50bWVudElEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgY2FjaGUgZm9yIGFwcG9pbnRtZW50cwogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAnRGFzaGJvYXJkJywKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5QXBwb2ludG1lbnRzLAogICAgICAgICAgICBWYWx1ZSA9PiBcJUFwcG9pbnRtZW50cywKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDb25maWd9LT57Q2FjaGVUVExMb2NhbH0gKiA2MCwKICAgICAgICApOwoKICAgICAgICAjIHNldCBjYWNoZSBmb3IgYXBwb2ludG1lbnRzIGNvdW50CiAgICAgICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICdEYXNoYm9hcmQnLAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXlBcHBvaW50bWVudHNDb3VudCwKICAgICAgICAgICAgVmFsdWUgPT4gXCVBcHBvaW50bWVudHNDb3VudCwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDb25maWd9LT57Q2FjaGVUVExMb2NhbH0gKiA2MCwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgbXkgJEFwcG9pbnRtZW50VGFibGVCbG9jayA9ICdDb250ZW50U21hbGxUYWJsZSc7CgogICAgIyBwcmVwYXJlIGFwcG9pbnRtZW50cyB0YWJsZQogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQ29udGVudFNtYWxsVGFibGUnLAogICAgKTsKCiAgICAjIGdldCB0aW1lem9uZSBvZmZzZXQgZm9yIGN1cnJlbnQgdXNlcgogICAgbXkgJFRpbWV6b25lT2Zmc2V0UmF3ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lem9uZU9mZnNldEdldCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICRUaW1lem9uZU9mZnNldCA9ICRUaW1lem9uZU9mZnNldFJhdyAqIDYwICogNjA7CgogICAgbXkgJENvdW50ID0gMDsKICAgIG15ICRTaG93biA9IDA7CgogICAgQVBQT0lOVE1FTlRJRDoKICAgIGZvciBteSAkQXBwb2ludG1lbnRJRCAoCiAgICAgICAgc29ydCB7CiAgICAgICAgICAgICRBcHBvaW50bWVudHN7JGF9LT57U3lzdGVtVGltZVN0YXJ0fSA8PT4gJEFwcG9pbnRtZW50c3skYn0tPntTeXN0ZW1UaW1lU3RhcnR9CiAgICAgICAgICAgICAgICB8fCAkQXBwb2ludG1lbnRzeyRhfS0+e0FwcG9pbnRtZW50SUR9IDw9PiAkQXBwb2ludG1lbnRzeyRifS0+e0FwcG9pbnRtZW50SUR9CiAgICAgICAgfSBrZXlzICVBcHBvaW50bWVudHMKICAgICAgICApCiAgICB7CiAgICAgICAgIyBwYWdpbmF0aW9uIGhhbmRsaW5nCiAgICAgICAgbGFzdCBBUFBPSU5UTUVOVElEIGlmICRTaG93biA+PSAkU2VsZi0+e1BhZ2VTaG93bn07CgogICAgICAgIGlmICggKCAkU2VsZi0+e1N0YXJ0SGl0fSAtIDEgKSA+ICRDb3VudCApIHsKICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgIG5leHQgQVBQT0lOVE1FTlRJRDsKICAgICAgICB9CgogICAgICAgIG15ICRTdGFydFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnRzeyRBcHBvaW50bWVudElEfS0+e1N0YXJ0VGltZX0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgKCAkQVNlY29uZCwgJEFNaW51dGUsICRBSG91ciwgJEFEYXksICRBTW9udGgsICRBWWVhciwgJEFEYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRTeXN0ZW1UaW1lICsgJFRpbWV6b25lT2Zmc2V0LAogICAgICAgICk7CgogICAgICAgICMgcHJlcGFyZSBkYXRlcyBhbmQgdGltZXMKICAgICAgICBteSAkU3RhcnRUaW1lID0gc3ByaW50ZiggIiUwMmQiLCAkQUhvdXIgKSAuICc6JyAuIHNwcmludGYoICIlMDJkIiwgJEFNaW51dGUgKTsKICAgICAgICBteSAkU3RhcnRUaW1lTG9uZyA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgLT5Gb3JtYXRUaW1lU3RyaW5nKCAkQXBwb2ludG1lbnRzeyRBcHBvaW50bWVudElEfS0+e1N0YXJ0VGltZX0sICdEYXRlRm9ybWF0TG9uZycgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NvbnRlbnRTbWFsbEFwcG9pbnRtZW50Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHN7JEFwcG9pbnRtZW50SUR9LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICRBcHBvaW50bWVudHN7JEFwcG9pbnRtZW50SUR9LT57VGl0bGV9LAogICAgICAgICAgICAgICAgU3RhcnRUaW1lICAgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgU3RhcnRUaW1lTG9uZyA9PiAkU3RhcnRUaW1lTG9uZywKICAgICAgICAgICAgICAgIENvbG9yICAgICAgICAgPT4gJENhbGVuZGFyc3sgJEFwcG9pbnRtZW50c3skQXBwb2ludG1lbnRJRH0tPntDYWxlbmRhcklEfSB9LT57Q29sb3J9LAogICAgICAgICAgICAgICAgQ2FsZW5kYXJOYW1lICA9PiAkQ2FsZW5kYXJzeyAkQXBwb2ludG1lbnRzeyRBcHBvaW50bWVudElEfS0+e0NhbGVuZGFySUR9IH0tPntDYWxlbmRhck5hbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgaW5jcmVhc2Ugc2hvd24gaXRlbSBjb3VudAogICAgICAgICRTaG93bisrOwogICAgfQoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCBcJUFwcG9pbnRtZW50cyApICkgewoKICAgICAgICAjIHNob3cgdXAgbWVzc2FnZSBmb3Igbm8gYXBwb2ludG1lbnRzCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NvbnRlbnRTbWFsbEFwcG9pbnRtZW50Tm9uZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBjc3MgY2xhc3MKICAgIG15ICVTdW1tYXJ5OwogICAgJFN1bW1hcnl7ICRTZWxmLT57RmlsdGVyfSAuICc6OlNlbGVjdGVkJyB9ID0gJ1NlbGVjdGVkJzsKCiAgICAjIGZpbHRlciBiYXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NvbnRlbnRTbWFsbEFwcG9pbnRtZW50RmlsdGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJXsgJFNlbGYtPntDb25maWd9IH0sCiAgICAgICAgICAgICVTdW1tYXJ5LAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICRTZWxmLT57TmFtZX0sCiAgICAgICAgICAgIFRvZGF5Q291bnQgICAgPT4gJEFwcG9pbnRtZW50c0NvdW50e1RvZGF5fSwKICAgICAgICAgICAgVG9tb3Jyb3dDb3VudCA9PiAkQXBwb2ludG1lbnRzQ291bnR7VG9tb3Jyb3d9LAogICAgICAgICAgICBTb29uQ291bnQgICAgID0+ICRBcHBvaW50bWVudHNDb3VudHtTb29ufSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBwYWdlIG5hdiBiYXIKICAgIG15ICRUb3RhbCAgICA9ICRBcHBvaW50bWVudHNDb3VudHsgJFNlbGYtPntGaWx0ZXJ9IH0gfHwgMDsKICAgIG15ICRMaW5rUGFnZSA9ICdTdWJhY3Rpb249RWxlbWVudDtOYW1lPScgLiAkU2VsZi0+e05hbWV9IC4gJztGaWx0ZXI9JyAuICRTZWxmLT57RmlsdGVyfSAuICc7JzsKICAgIG15ICVQYWdlTmF2ICA9ICRMYXlvdXRPYmplY3QtPlBhZ2VOYXZCYXIoCiAgICAgICAgU3RhcnRIaXQgICAgICAgPT4gJFNlbGYtPntTdGFydEhpdH0sCiAgICAgICAgUGFnZVNob3duICAgICAgPT4gJFNlbGYtPntQYWdlU2hvd259LAogICAgICAgIEFsbEhpdHMgICAgICAgID0+ICRUb3RhbCB8fCAxLAogICAgICAgIEFjdGlvbiAgICAgICAgID0+ICdBY3Rpb249JyAuICRMYXlvdXRPYmplY3QtPntBY3Rpb259LAogICAgICAgIExpbmsgICAgICAgICAgID0+ICRMaW5rUGFnZSwKICAgICAgICBXaW5kb3dTaXplICAgICA9PiA1LAogICAgICAgIEFKQVhSZXBsYWNlICAgID0+ICdEYXNoYm9hcmQnIC4gJFNlbGYtPntOYW1lfSwKICAgICAgICBJRFByZWZpeCAgICAgICA9PiAnRGFzaGJvYXJkJyAuICRTZWxmLT57TmFtZX0sCiAgICAgICAgS2VlcFNjcmlwdFRhZ3MgPT4gJFBhcmFte0FKQVh9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDb250ZW50U21hbGxBcHBvaW50bWVudEZpbHRlck5hdkJhcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICV7ICRTZWxmLT57Q29uZmlnfSB9LAogICAgICAgICAgICBOYW1lID0+ICRTZWxmLT57TmFtZX0sCiAgICAgICAgICAgICVQYWdlTmF2LAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIHJlZnJlc2ggdGltZQogICAgbXkgJFJlZnJlc2ggPSAkTGF5b3V0T2JqZWN0LT57ICRTZWxmLT57UHJlZktleVJlZnJlc2h9IH0gLy8gMTsKCiAgICBteSAkTmFtZUhUTUwgPSAkU2VsZi0+e05hbWV9OwogICAgJE5hbWVIVE1MID1+IHN7LX17X314bXNnOwoKICAgIG15ICRDb250ZW50ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAleyAkU2VsZi0+e0NvbmZpZ30gfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntOYW1lfSwKICAgICAgICAgICAgTmFtZUhUTUwgICAgPT4gJE5hbWVIVE1MLAogICAgICAgICAgICBSZWZyZXNoVGltZSA9PiAkUmVmcmVzaCAqIDYwLAogICAgICAgIH0sCiAgICAgICAgS2VlcFNjcmlwdFRhZ3MgPT4gJFBhcmFte0FKQVh9LAogICAgKTsKCiAgICByZXR1cm4gJENvbnRlbnQ7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztTdWJhY3Rpb249QXBwb2ludG1lbnRDcmVhdGUiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciI+CiAgICA8c3Bhbj4KICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUiPjwvaT4KICAgICAgICBbJSBUcmFuc2xhdGUoIk5ldyBBcHBvaW50bWVudCIpIHwgaHRtbCAlXQogICAgPC9zcGFuPgo8L2E+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZW50U21hbGxBcHBvaW50bWVudEZpbHRlciIpICVdCjxkaXYgY2xhc3M9IkRhc2hib2FyZEFjdGlvbnMiPgogICAgPHVsIGNsYXNzPSJBcHBvaW50bWVudEZpbHRlciBUYWIgQWN0aW9ucyI+CiAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLml0ZW0oIlRvZGF5OjpTZWxlY3RlZCIpIHwgaHRtbCAlXSI+PGEgaHJlZj0iIyIgaWQ9IkRhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV1Ub2RheSIgY2xhc3M9IlslIERhdGEuaXRlbSgiVG9kYXk6OlNlbGVjdGVkIikgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2RheSIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJUb2RheSIpIHwgaHRtbCAlXSAoWyUgRGF0YS5Ub2RheUNvdW50IHwgaHRtbCAlXSk8L2E+PC9saT4KICAgICAgICA8bGkgY2xhc3M9IlslIERhdGEuaXRlbSgiVG9tb3Jyb3c6OlNlbGVjdGVkIikgfCBodG1sICVdIj48YSBocmVmPSIjIiBpZD0iRGFzaGJvYXJkWyUgRGF0YS5OYW1lIHwgaHRtbCAlXVRvbW9ycm93IiBjbGFzcz0iWyUgRGF0YS5pdGVtKCJUb21vcnJvdzo6U2VsZWN0ZWQiKSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvbW9ycm93IikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIlRvbW9ycm93IikgfCBodG1sICVdIChbJSBEYXRhLlRvbW9ycm93Q291bnQgfCBodG1sICVdKTwvYT48L2xpPgogICAgICAgIDxsaSBjbGFzcz0iWyUgRGF0YS5pdGVtKCJTb29uOjpTZWxlY3RlZCIpIHwgaHRtbCAlXSI+PGEgaHJlZj0iIyIgaWQ9IkRhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV1Tb29uIiBjbGFzcz0iWyUgRGF0YS5pdGVtKCJTb29uOjpTZWxlY3RlZCIpIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU29vbiIpIHwgaHRtbCAlXSAoWyUgVHJhbnNsYXRlKCI1IGRheXMiKSB8IGh0bWwgJV0pIj5bJSBUcmFuc2xhdGUoIlNvb24iKSB8IGh0bWwgJV0gKFslIERhdGEuU29vbkNvdW50IHwgaHRtbCAlXSk8L2E+PC9saT4KICAgIDwvdWw+CjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwoKICAgIC8vIGxvYWQgZmlsdGVyIGZvciB0b2RheQogICAgJCgnI0Rhc2hib2FyZCcgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcignWyUgRGF0YS5OYW1lIHwgaHRtbCAlXScpICsgJ1RvZGF5JykudW5iaW5kKCdjbGljaycpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgICAgICBDb3JlLkFKQVguQ29udGVudFVwZGF0ZSgkKCcjRGFzaGJvYXJkJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCdbJSBEYXRhLk5hbWUgfCBodG1sICVdJykpLCAnWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPUVsZW1lbnQ7TmFtZT1bJSBEYXRhLk5hbWUgfCBodG1sICVdO0ZpbHRlcj1Ub2RheScsIGZ1bmN0aW9uICgpIHsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKCiAgICAvLyBsb2FkIGZpbHRlciBmb3IgdG9tb3Jyb3cKICAgICQoJyNEYXNoYm9hcmQnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoJ1slIERhdGEuTmFtZSB8IGh0bWwgJV0nKSArICdUb21vcnJvdycpLnVuYmluZCgnY2xpY2snKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCl7CiAgICAgICAgQ29yZS5BSkFYLkNvbnRlbnRVcGRhdGUoJCgnI0Rhc2hib2FyZCcgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcignWyUgRGF0YS5OYW1lIHwgaHRtbCAlXScpKSwgJ1slIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1FbGVtZW50O05hbWU9WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTtGaWx0ZXI9VG9tb3Jyb3cnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgLy8gbG9hZCBmaWx0ZXIgZm9yIHNvb24KICAgICQoJyNEYXNoYm9hcmQnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoJ1slIERhdGEuTmFtZSB8IGh0bWwgJV0nKSArICdTb29uJykudW5iaW5kKCdjbGljaycpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgICAgICBDb3JlLkFKQVguQ29udGVudFVwZGF0ZSgkKCcjRGFzaGJvYXJkJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCdbJSBEYXRhLk5hbWUgfCBodG1sICVdJykpLCAnWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPUVsZW1lbnQ7TmFtZT1bJSBEYXRhLk5hbWUgfCBodG1sICVdO0ZpbHRlcj1Tb29uJywgZnVuY3Rpb24gKCkgewogICAgICAgIH0pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29udGVudFNtYWxsQXBwb2ludG1lbnRGaWx0ZXJOYXZCYXIiKSAlXQo8c3BhbiBjbGFzcz0iU3BhY2luZ1RvcCBQYWdpbmF0aW9uIj4KICAgIFslIERhdGEuU2l0ZU5hdkJhciAlXQo8L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJDb250ZW50U21hbGxBcHBvaW50bWVudEZpbHRlck5hdkJhciIpICVdCgpbJSBSZW5kZXJCbG9ja0VuZCgiQ29udGVudFNtYWxsQXBwb2ludG1lbnRGaWx0ZXIiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29udGVudFNtYWxsVGFibGUiKSAlXQo8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSI+CiAgICA8dGhlYWQ+CiAgICAgICAgPHRyPgogICAgICAgICAgICA8dGggc3R5bGU9IndpZHRoOiAxNHB4OyI+PC90aD4KICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDogMTRweDsiPlslIFRyYW5zbGF0ZSgiU3RhcnQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgPC90cj4KICAgIDwvdGhlYWQ+CiAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbnRlbnRTbWFsbEFwcG9pbnRtZW50Um93IikgJV0KICAgICAgICA8dHIgY2xhc3M9Ik1hc3RlckFjdGlvbiI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iRmxhZ3MgQ2VudGVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZsYWcgU21hbGwiIHRpdGxlPSJbJSBEYXRhLkNhbGVuZGFyTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiBbJSBEYXRhLkNvbG9yIHwgaHRtbCAlXTsgYm9yZGVyOiAxcHggc29saWQgI0JCQjsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjI1KTsgYm94LXNpemluZzogYm9yZGVyLWJveDsiPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuU3RhcnRUaW1lTG9uZyB8IGh0bWwgJV0iPlslIERhdGEuU3RhcnRUaW1lIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgIDx0ZD48YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD1bJSBEYXRhLkFwcG9pbnRtZW50SUQgfCB1cmwgJV0iIGNsYXNzPSJNYXN0ZXJBY3Rpb25MaW5rIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVGl0bGUgfCBodG1sICVdPC9hPjwvdGQ+CiAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbnRlbnRTbWFsbEFwcG9pbnRtZW50Um93IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29udGVudFNtYWxsQXBwb2ludG1lbnROb25lIikgJV0KICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgibm9uZSIpIHwgaHRtbCAlXQogICAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJDb250ZW50U21hbGxBcHBvaW50bWVudE5vbmUiKSAlXQogICAgPC90Ym9keT4KPC90YWJsZT4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbnRlbnRTbWFsbFRhYmxlIikgJV0KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCgokKCcuTWFzdGVyQWN0aW9uJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgIHZhciAkTWFzdGVyQWN0aW9uTGluayA9ICQodGhpcykuZmluZCgnLk1hc3RlckFjdGlvbkxpbmsnKTsKICAgIC8vIHByZXZlbnQgTWFzdGVyQWN0aW9uIG9uIER5bmFtaWMgRmllbGRzIGxpbmtzCiAgICBpZiAoJChFdmVudC50YXJnZXQpLmhhc0NsYXNzKCdEeW5hbWljRmllbGRMaW5rJykpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8vIG9ubHkgYWN0IGlmIHRoZSBsaW5rIHdhcyBub3QgY2xpY2tlZCBkaXJlY3RseQogICAgaWYgKEV2ZW50LnRhcmdldCAhPT0gJE1hc3RlckFjdGlvbkxpbmsuZ2V0KDApKSB7CiAgICAgICAgaWYgKEV2ZW50LmN0cmxLZXkgfHwgRXZlbnQubWV0YUtleSkgewogICAgICAgICAgICB3aW5kb3cub3BlbigkTWFzdGVyQWN0aW9uTGluay5hdHRyKCdocmVmJykpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gJE1hc3RlckFjdGlvbkxpbmsuYXR0cignaHJlZicpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn0pOwoKQ29yZS5Db25maWcuU2V0KCdSZWZyZXNoU2Vjb25kc19bJSBEYXRhLk5hbWVIVE1MIHwgaHRtbCAlXScsIHBhcnNlSW50KCJbJSBEYXRhLlJlZnJlc2hUaW1lIHwgaHRtbCAlXSIsIDEwKSB8fCAwKTsKaWYgKENvcmUuQ29uZmlnLkdldCgnUmVmcmVzaFNlY29uZHNfWyUgRGF0YS5OYW1lSFRNTCB8IGh0bWwgJV0nKSkgewogICAgQ29yZS5Db25maWcuU2V0KCdUaW1lcl9bJSBEYXRhLk5hbWVIVE1MIHwgaHRtbCAlXScsIHdpbmRvdy5zZXRUaW1lb3V0KAogICAgICAgIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKCcjRGFzaGJvYXJkJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCdbJSBEYXRhLk5hbWUgfCBodG1sICVdJykgKyAnLWJveCcpLmFkZENsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgICAgIENvcmUuQUpBWC5Db250ZW50VXBkYXRlKCQoJyNEYXNoYm9hcmQnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoJ1slIERhdGEuTmFtZSB8IGh0bWwgJV0nKSksICdbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RWxlbWVudDtOYW1lPVslIERhdGEuTmFtZSB8IGh0bWwgJV0nLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAkKCcjRGFzaGJvYXJkJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCdbJSBEYXRhLk5hbWUgfCBodG1sICVdJykgKyAnLWJveCcpLnJlbW92ZUNsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjbGVhclRpbWVvdXQoQ29yZS5Db25maWcuR2V0KCdUaW1lcl9bJSBEYXRhLk5hbWVIVE1MIHwgaHRtbCAlXScpKTsKICAgICAgICB9LAogICAgICAgIENvcmUuQ29uZmlnLkdldCgnUmVmcmVzaFNlY29uZHNfWyUgRGF0YS5OYW1lSFRNTCB8IGh0bWwgJV0nKSAqIDEwMDApCiAgICApOwp9CgovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIERpZ2VzdDo6TUQ1Owp1c2UgTUlNRTo6QmFzZTY0ICgpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXI7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIHZhcnMgcXcoQElTQSk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkVuY29kZScsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UXVldWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTdG9yYWJsZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXIgLSBjYWxlbmRhciBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGNhbGVuZGFyIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ2FsZW5kYXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgQElTQSA9IHF3KAogICAgICAgIEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXIKICAgICk7CgogICAgIyBpbml0IG9mIGV2ZW50IGhhbmRsZXIKICAgICRTZWxmLT5FdmVudEhhbmRsZXJJbml0KAogICAgICAgIENvbmZpZyA9PiAnQXBwb2ludG1lbnRDYWxlbmRhcjo6RXZlbnRNb2R1bGVQb3N0JywKICAgICk7CgogICAgJFNlbGYtPntDYWNoZVR5cGV9ID0gJ0NhbGVuZGFyJzsKICAgICRTZWxmLT57Q2FjaGVUVEx9ICA9IDYwICogNjAgKiAyNCAqIDIwOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ2FsZW5kYXJDcmVhdGUoKQoKY3JlYXRlcyBhIG5ldyBjYWxlbmRhciBmb3IgZ2l2ZW4gdXNlci4KCiAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgIENhbGVuZGFyTmFtZSAgICA9PiAnTWVldGluZ3MnLCAgICAgICAgICAjIChyZXF1aXJlZCkgUGVyc29uYWwgY2FsZW5kYXIgbmFtZQogICAgICAgIEdyb3VwSUQgICAgICAgICA9PiAzLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgR3JvdXBJRAogICAgICAgIENvbG9yICAgICAgICAgICA9PiAnI0ZGNzcwMCcsICAgICAgICAgICAjIChyZXF1aXJlZCkgQ29sb3IgaW4gaGV4YWRlY2ltYWwgUkdCIG5vdGF0aW9uCiAgICAgICAgVXNlcklEICAgICAgICAgID0+IDQsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBVc2VySUQKCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRzID0+IFsgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgYXBwb2ludG1lbnRzLCBhcnJheSByZWYgb2YgaGFzaGVzCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFN0YXJ0RGF0ZSA9PiAnRmlyc3RSZXNwb25zZScsCiAgICAgICAgICAgICAgICBFbmREYXRlICAgPT4gJ1BsdXNfNScsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgPT4gWyAyIF0sCiAgICAgICAgICAgICAgICBTZWFyY2hQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICdUaGlzIGlzIGEgdGl0bGUnLAogICAgICAgICAgICAgICAgICAgIFR5cGVzID0+ICdUaGlzIGlzIGEgdHlwZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCgogICAgICAgIFZhbGlkSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIERlZmF1bHQgaXMgMS4KICAgICk7CgpyZXR1cm5zIENhbGVuZGFyIGhhc2ggaWYgc3VjY2Vzc2Z1bDoKICAgICVDYWxlbmRhciA9ICgKICAgICAgICBDYWxlbmRhcklEICAgPT4gMiwKICAgICAgICBHcm91cElEICAgICAgPT4gMywKICAgICAgICBDYWxlbmRhck5hbWUgPT4gJ01lZXRpbmdzJywKICAgICAgICBDcmVhdGVUaW1lICAgPT4gJzIwMTYtMDEtMDEgMDg6MDA6MDAnLAogICAgICAgIENyZWF0ZUJ5ICAgICA9PiA0LAogICAgICAgIENoYW5nZVRpbWUgICA9PiAnMjAxNi0wMS0wMSAwODowMDowMCcsCiAgICAgICAgQ2hhbmdlQnkgICAgID0+IDQsCiAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICApOwoKRXZlbnRzOgogICAgQ2FsZW5kYXJDcmVhdGUKCj1jdXQKCnN1YiBDYWxlbmRhckNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJOYW1lIEdyb3VwSUQgQ29sb3IgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgY29sb3IKICAgIGlmICggISggJFBhcmFte0NvbG9yfSA9fiAvI1tBLUYwLTldezMsNn0vaSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ29sb3IgbXVzdCBiZSBpbiBoZXhhZGVjaW1hbCBSR0Igbm90YXRpb24sIGVnLiAjRkZGRkZGLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCB0aWNrZXQgYXBwb2ludG1lbnRzCiAgICBpZiAoICEoIHNjYWxhciBAeyAkUGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSAvLyBbXSB9ICkgKSB7CiAgICAgICAgJFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gPSB1bmRlZjsKICAgIH0KCiAgICAjIG1ha2UgaXQgdXBwZXJjYXNlIGZvciB0aGUgc2FrZSBvZiBjb25zaXN0ZW5jeQogICAgJFBhcmFte0NvbG9yfSA9IHVjICRQYXJhbXtDb2xvcn07CgogICAgbXkgJFZhbGlkSUQgPSBkZWZpbmVkICRQYXJhbXtWYWxpZElEfSA/ICRQYXJhbXtWYWxpZElEfSA6IDE7CgogICAgbXkgJUNhbGVuZGFyID0gJFNlbGYtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFyTmFtZSA9PiAkUGFyYW17Q2FsZW5kYXJOYW1lfSwKICAgICk7CgogICAgIyByZXR1cm4gaWYgY2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMKICAgIHJldHVybiBpZiAlQ2FsZW5kYXI7CgogICAgIyBjcmVhdGUgc2FsdCBzdHJpbmcKICAgIG15ICRTYWx0U3RyaW5nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+R2VuZXJhdGVSYW5kb21TdHJpbmcoCiAgICAgICAgTGVuZ3RoID0+IDY0LAogICAgKTsKCiAgICAjIHNlcmlhbGl6ZSBhbmQgZW5jb2RlIHRpY2tldCBhcHBvaW50bWVudCBkYXRhCiAgICBteSAkVGlja2V0QXBwb2ludG1lbnRzOwogICAgaWYgKCAkUGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSApIHsKICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0b3JhYmxlJyktPlNlcmlhbGl6ZSgKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSwKICAgICAgICApOwogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlT3V0cHV0KCRUaWNrZXRBcHBvaW50bWVudHMpOwogICAgICAgICRUaWNrZXRBcHBvaW50bWVudHMgPSBNSU1FOjpCYXNlNjQ6OmVuY29kZV9iYXNlNjQoJFRpY2tldEFwcG9pbnRtZW50cyk7CiAgICB9CgogICAgbXkgJFNRTCA9ICcKICAgICAgICBJTlNFUlQgSU5UTyBjYWxlbmRhcgogICAgICAgICAgICAoZ3JvdXBfaWQsIG5hbWUsIHNhbHRfc3RyaW5nLCBjb2xvciwgdGlja2V0X2FwcG9pbnRtZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwKICAgICAgICAgICAgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSwgdmFsaWRfaWQpCiAgICAgICAgVkFMVUVTICg/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8sID8pCiAgICAnOwoKICAgICMgY3JlYXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0dyb3VwSUR9LCBcJFBhcmFte0NhbGVuZGFyTmFtZX0sIFwkU2FsdFN0cmluZywgXCRQYXJhbXtDb2xvcn0sCiAgICAgICAgICAgIFwkVGlja2V0QXBwb2ludG1lbnRzLCBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VXNlcklEfSwgXCRWYWxpZElECiAgICAgICAgXSwKICAgICk7CgogICAgJUNhbGVuZGFyID0gJFNlbGYtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFyTmFtZSA9PiAkUGFyYW17Q2FsZW5kYXJOYW1lfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwogICAgcmV0dXJuIGlmICElQ2FsZW5kYXI7CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBjYWNoZSB2YWx1ZQogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBWYWx1ZSA9PiBcJUNhbGVuZGFyLAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICAjIHJlc2V0IENhbGVuZGFyTGlzdAogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJ0NhbGVuZGFyTGlzdCcsCiAgICApOwoKICAgICMgZmlyZSBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ2FsZW5kYXJDcmVhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJUNhbGVuZGFyLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJUNhbGVuZGFyOwp9Cgo9aXRlbSBDYWxlbmRhckdldCgpCgpnZXQgY2FsZW5kYXIgYnkgbmFtZSBvZCBpZC4KCiAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFyTmFtZSA9PiAnTWVldGluZ3MnLCAgICAgICAgICAjIChyZXF1aXJlZCkgQ2FsZW5kYXIgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yCiAgICAgICAgQ2FsZW5kYXJJRCAgID0+IDQsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBDYWxlbmRhcklECgogICAgICAgIFVzZXJJRCAgICAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVXNlcklEIC0gU3lzdGVtIHdpbGwgY2hlY2sgaWYgdXNlciBoYXMgYWNjZXNzIHRvIGNhbGVuZGFyIGlmIHByb3ZpZGVkCiAgICApOwoKcmV0dXJucyBDYWxlbmRhciBkYXRhOgogICAgJUNhbGVuZGFyID0gKAogICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAyLAogICAgICAgIEdyb3VwSUQgICAgICAgICAgICA9PiAzLAogICAgICAgIENhbGVuZGFyTmFtZSAgICAgICA9PiAnTWVldGluZ3MnLAogICAgICAgIENvbG9yICAgICAgICAgICAgICA9PiAnI0ZGNzcwMCcsCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU3RhcnREYXRlID0+ICdGaXJzdFJlc3BvbnNlJywKICAgICAgICAgICAgICAgIEVuZERhdGUgICA9PiAnUGx1c181JywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICA9PiBbIDIgXSwKICAgICAgICAgICAgICAgIFNlYXJjaFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJ1RoaXMgaXMgYSB0aXRsZScsCiAgICAgICAgICAgICAgICAgICAgVHlwZXMgPT4gJ1RoaXMgaXMgYSB0eXBlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBDcmVhdGVUaW1lID0+ICcyMDE2LTAxLTAxIDA4OjAwOjAwJywKICAgICAgICBDcmVhdGVCeSAgID0+IDEsCiAgICAgICAgQ2hhbmdlVGltZSA9PiAnMjAxNi0wMS0wMSAwODowMDowMCcsCiAgICAgICAgQ2hhbmdlQnkgICA9PiAxLAogICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ2FsZW5kYXJHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NhbGVuZGFySUR9ICYmICEkUGFyYW17Q2FsZW5kYXJOYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgQ2FsZW5kYXJJRCBvciBDYWxlbmRhck5hbWUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlQ2FsZW5kYXI7CgogICAgaWYgKCAkUGFyYW17Q2FsZW5kYXJJRH0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgdmFsdWUgaXMgY2FjaGVkCiAgICAgICAgbXkgJERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkRGF0YSkgKSB7CiAgICAgICAgICAgICVDYWxlbmRhciA9ICV7JERhdGF9OwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICElQ2FsZW5kYXIgKSB7CgogICAgICAgICMgY3JlYXRlIGRiIG9iamVjdAogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICBteSAkU1FMID0gJwogICAgICAgICAgICBTRUxFQ1QgaWQsIGdyb3VwX2lkLCBuYW1lLCBjb2xvciwgdGlja2V0X2FwcG9pbnRtZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwKICAgICAgICAgICAgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSwgdmFsaWRfaWQKICAgICAgICAgICAgRlJPTSBjYWxlbmRhcgogICAgICAgICAgICBXSEVSRQogICAgICAgICc7CgogICAgICAgIG15IEBCaW5kOwogICAgICAgIGlmICggJFBhcmFte0NhbGVuZGFySUR9ICkgewogICAgICAgICAgICAkU1FMIC49ICcKICAgICAgICAgICAgICAgIGlkPT8KICAgICAgICAgICAgJzsKICAgICAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDYWxlbmRhcklEfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTUUwgLj0gJwogICAgICAgICAgICAgICAgbmFtZT0/CiAgICAgICAgICAgICc7CiAgICAgICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2FsZW5kYXJOYW1lfTsKICAgICAgICB9CgogICAgICAgICMgZGIgcXVlcnkKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICAgICAgQmluZCAgPT4gXEBCaW5kLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAgICAgIyBkZWNvZGUgYW5kIGRlc2VyaWFsaXplIHRpY2tldCBhcHBvaW50bWVudCBkYXRhCiAgICAgICAgICAgIG15ICRUaWNrZXRBcHBvaW50bWVudHM7CiAgICAgICAgICAgIGlmICggJFJvd1s0XSApIHsKICAgICAgICAgICAgICAgIG15ICREZWNvZGVkRGF0YSA9IE1JTUU6OkJhc2U2NDo6ZGVjb2RlX2Jhc2U2NCggJFJvd1s0XSApOwogICAgICAgICAgICAgICAgJFRpY2tldEFwcG9pbnRtZW50cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdG9yYWJsZScpLT5EZXNlcmlhbGl6ZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICREZWNvZGVkRGF0YSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRzID0gdW5kZWYgaWYgcmVmICRUaWNrZXRBcHBvaW50bWVudHMgbmUgJ0FSUkFZJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJENhbGVuZGFye0NhbGVuZGFySUR9ICAgICAgICAgPSAkUm93WzBdOwogICAgICAgICAgICAkQ2FsZW5kYXJ7R3JvdXBJRH0gICAgICAgICAgICA9ICRSb3dbMV07CiAgICAgICAgICAgICRDYWxlbmRhcntDYWxlbmRhck5hbWV9ICAgICAgID0gJFJvd1syXTsKICAgICAgICAgICAgJENhbGVuZGFye0NvbG9yfSAgICAgICAgICAgICAgPSAkUm93WzNdOwogICAgICAgICAgICAkQ2FsZW5kYXJ7VGlja2V0QXBwb2ludG1lbnRzfSA9ICRUaWNrZXRBcHBvaW50bWVudHM7CiAgICAgICAgICAgICRDYWxlbmRhcntDcmVhdGVUaW1lfSAgICAgICAgID0gJFJvd1s1XTsKICAgICAgICAgICAgJENhbGVuZGFye0NyZWF0ZUJ5fSAgICAgICAgICAgPSAkUm93WzZdOwogICAgICAgICAgICAkQ2FsZW5kYXJ7Q2hhbmdlVGltZX0gICAgICAgICA9ICRSb3dbN107CiAgICAgICAgICAgICRDYWxlbmRhcntDaGFuZ2VCeX0gICAgICAgICAgID0gJFJvd1s4XTsKICAgICAgICAgICAgJENhbGVuZGFye1ZhbGlkSUR9ICAgICAgICAgICAgPSAkUm93WzldOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW17Q2FsZW5kYXJJRH0gKSB7CgogICAgICAgICAgICAjIGNhY2hlCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBcJUNhbGVuZGFyLAogICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRQYXJhbXtVc2VySUR9ICYmICRDYWxlbmRhcntHcm91cElEfSApIHsKCiAgICAgICAgICAgICMgZ2V0IHVzZXIgZ3JvdXBzCiAgICAgICAgICAgIG15ICVHcm91cExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggIWdyZXAgeyAkQ2FsZW5kYXJ7R3JvdXBJRH0gPT0gJF8gfSBrZXlzICVHcm91cExpc3QgKSB7CiAgICAgICAgICAgICAgICAlQ2FsZW5kYXIgPSAoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJUNhbGVuZGFyOwp9Cgo9aXRlbSBDYWxlbmRhckxpc3QoKQoKZ2V0IGNhbGVuZGFyIGxpc3QuCgogICAgbXkgQFJlc3VsdCA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJMaXN0KAogICAgICAgIFVzZXJJRCAgICAgPT4gNCwgICAgICAgICAgICAjIChvcHRpb25hbCkgRm9yIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBQZXJtaXNzaW9uID0+ICdydycsICAgICAgICAgIyAob3B0aW9uYWwpIFJlcXVpcmVkIHBlcm1pc3Npb24gKGRlZmF1bHQgcm8pCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLCAgICAgICAgICAgICMgKG9wdGlvbmFsKSBEZWZhdWx0IDAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMCAtIEFsbCBzdGF0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAxIC0gQWxsIHZhbGlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMiAtIEFsbCBpbnZhbGlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMyAtIEFsbCB0ZW1wb3JhcnkgaW52YWxpZAogICAgKTsKCnJldHVybnM6CiAgICBAUmVzdWx0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgID0+IDIsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAzLAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gJ01lZXRpbmdzJywKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjRkY3NzAwJywKICAgICAgICAgICAgQ3JlYXRlVGltZSAgID0+ICcyMDE2LTAxLTAxIDA4OjAwOjAwJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgID0+IDMsCiAgICAgICAgICAgIENoYW5nZVRpbWUgICA9PiAnMjAxNi0wMS0wMSAwODowMDowMCcsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICA9PiAzLAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgID0+IDMsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAzLAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gJ0N1c3RvbWVyIHByZXNlbnRhdGlvbnMnLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNCQjAwQkInLAogICAgICAgICAgICBDcmVhdGVUaW1lICAgPT4gJzIwMTYtMDEtMDEgMDg6MDA6MDAnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgPT4gMywKICAgICAgICAgICAgQ2hhbmdlVGltZSAgID0+ICcyMDE2LTAxLTAxIDA4OjAwOjAwJywKICAgICAgICAgICAgQ2hhbmdlQnkgICAgID0+IDMsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAwLAogICAgICAgIH0sCiAgICAgICAgLi4uCiAgICBdOwoKPWN1dAoKc3ViIENhbGVuZGFyTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgTWFrZSBkaWZmZXJlbnQgY2FjaGUgdHlwZSBmb3IgbGlzdCAoc28gd2UgY2FuIGNsZWFyIGNhY2hlIGJ5IHRoaXMgdmFsdWUpCiAgICBteSAkQ2FjaGVUeXBlICAgICA9ICdDYWxlbmRhckxpc3QnOwogICAgbXkgJENhY2hlS2V5VXNlciAgPSAkUGFyYW17VXNlcklEfSB8fCAnYWxsLXVzZXItaWRzJzsKICAgIG15ICRDYWNoZUtleVZhbGlkID0gJFBhcmFte1ZhbGlkSUR9IHx8ICdhbGwtdmFsaWQtaWRzJzsKCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGdldCBjYWNoZWQgdmFsdWUgaWYgZXhpc3RzCiAgICBteSAkRGF0YSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJENhY2hlVHlwZSwKICAgICAgICBLZXkgID0+ICIkQ2FjaGVLZXlVc2VyLSRDYWNoZUtleVZhbGlkIiwKICAgICk7CgogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCREYXRhKSApIHsKCiAgICAgICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgbXkgJFNRTCA9ICcKICAgICAgICAgICAgU0VMRUNUIGlkLCBncm91cF9pZCwgbmFtZSwgY29sb3IsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnksCiAgICAgICAgICAgIHZhbGlkX2lkCiAgICAgICAgICAgIEZST00gY2FsZW5kYXIKICAgICAgICAgICAgV0hFUkUgMT0xCiAgICAgICAgJzsKICAgICAgICBteSBAQmluZDsKCiAgICAgICAgaWYgKCAkUGFyYW17VmFsaWRJRH0gKSB7CiAgICAgICAgICAgICRTUUwgLj0gJyBBTkQgdmFsaWRfaWQ9PyAnOwogICAgICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1ZhbGlkSUR9OwogICAgICAgIH0KICAgICAgICAkU1FMIC49ICdPUkRFUiBCWSBpZCBBU0MnOwoKICAgICAgICAjIGRiIHF1ZXJ5CiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFJlc3VsdDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgbXkgJUNhbGVuZGFyOwogICAgICAgICAgICAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0gICA9ICRSb3dbMF07CiAgICAgICAgICAgICRDYWxlbmRhcntHcm91cElEfSAgICAgID0gJFJvd1sxXTsKICAgICAgICAgICAgJENhbGVuZGFye0NhbGVuZGFyTmFtZX0gPSAkUm93WzJdOwogICAgICAgICAgICAkQ2FsZW5kYXJ7Q29sb3J9ICAgICAgICA9ICRSb3dbM107CiAgICAgICAgICAgICRDYWxlbmRhcntDcmVhdGVUaW1lfSAgID0gJFJvd1s0XTsKICAgICAgICAgICAgJENhbGVuZGFye0NyZWF0ZUJ5fSAgICAgPSAkUm93WzVdOwogICAgICAgICAgICAkQ2FsZW5kYXJ7Q2hhbmdlVGltZX0gICA9ICRSb3dbNl07CiAgICAgICAgICAgICRDYWxlbmRhcntDaGFuZ2VCeX0gICAgID0gJFJvd1s3XTsKICAgICAgICAgICAgJENhbGVuZGFye1ZhbGlkSUR9ICAgICAgPSAkUm93WzhdOwogICAgICAgICAgICBwdXNoIEBSZXN1bHQsIFwlQ2FsZW5kYXI7CiAgICAgICAgfQoKICAgICAgICAjIGNhY2hlIGRhdGEKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJENhY2hlVHlwZSwKICAgICAgICAgICAgS2V5ICAgPT4gIiRDYWNoZUtleVVzZXItJENhY2hlS2V5VmFsaWQiLAogICAgICAgICAgICBWYWx1ZSA9PiBcQFJlc3VsdCwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgKTsKCiAgICAgICAgJERhdGEgPSBcQFJlc3VsdDsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtVc2VySUR9ICkgewoKICAgICAgICAjIGdldCB1c2VyIGdyb3VwcwogICAgICAgIG15ICVHcm91cExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICRQYXJhbXtQZXJtaXNzaW9ufSB8fCAncm8nLAogICAgICAgICk7CgogICAgICAgIG15IEBSZXN1bHQ7CgogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JERhdGF9ICkgewogICAgICAgICAgICBpZiAoIGdyZXAgeyAkSXRlbS0+e0dyb3VwSUR9ID09ICRfIH0ga2V5cyAlR3JvdXBMaXN0ICkgewogICAgICAgICAgICAgICAgcHVzaCBAUmVzdWx0LCAkSXRlbTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJERhdGEgPSBcQFJlc3VsdDsKICAgIH0KCiAgICByZXR1cm4gQHskRGF0YX07Cn0KCj1pdGVtIENhbGVuZGFyVXBkYXRlKCkKCnVwZGF0ZXMgYW4gZXhpc3RpbmcgY2FsZW5kYXIuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyVXBkYXRlKAogICAgICAgIENhbGVuZGFySUQgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIENhbGVuZGFySUQKICAgICAgICBHcm91cElEICAgICAgICAgID0+IDIsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBDYWxlbmRhciBncm91cAogICAgICAgIENhbGVuZGFyTmFtZSAgICAgPT4gJ01lZXRpbmdzJywgICAgICAgICAgIyAocmVxdWlyZWQpIFBlcnNvbmFsIGNhbGVuZGFyIG5hbWUKICAgICAgICBDb2xvciAgICAgICAgICAgID0+ICcjRkY5OTAwJywgICAgICAgICAgICMgKHJlcXVpcmVkKSBDb2xvciBpbiBoZXhhZGVjaW1hbCBSR0Igbm90YXRpb24KICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDQsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBVc2VySUQgKHdobyBtYWRlIHVwZGF0ZSkKICAgICAgICBWYWxpZElEICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBWYWxpZElECgogICAgICAgIFRpY2tldEFwcG9pbnRtZW50cyA9PiBbICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IGFwcG9pbnRtZW50cywgYXJyYXkgcmVmIG9mIGhhc2hlcwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTdGFydERhdGUgPT4gJ0ZpcnN0UmVzcG9uc2UnLAogICAgICAgICAgICAgICAgRW5kRGF0ZSAgID0+ICdQbHVzXzUnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgID0+IFsgMiBdLAogICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAnVGhpcyBpcyBhIHRpdGxlJywKICAgICAgICAgICAgICAgICAgICBUeXBlcyA9PiAnVGhpcyBpcyBhIHR5cGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsCgpFdmVudHM6CiAgICBDYWxlbmRhclVwZGF0ZQoKPWN1dAoKc3ViIENhbGVuZGFyVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIEdyb3VwSUQgQ2FsZW5kYXJOYW1lIENvbG9yIFVzZXJJRCBWYWxpZElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgY29sb3IKICAgIGlmICggISggJFBhcmFte0NvbG9yfSA9fiAvI1tBLUYwLTldezMsNn0vaSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ29sb3IgbXVzdCBiZSBpbiBoZXhhZGVjaW1hbCBSR0Igbm90YXRpb24sIGVnLiAjRkZGRkZGLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCB0aWNrZXQgYXBwb2ludG1lbnRzCiAgICBpZiAoICEoIHNjYWxhciBAeyAkUGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSAvLyBbXSB9ICkgKSB7CiAgICAgICAgJFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gPSB1bmRlZjsKICAgIH0KCiAgICAjIG1ha2UgaXQgdXBwZXJjYXNlIGZvciB0aGUgc2FrZSBvZiBjb25zaXN0ZW5jeQogICAgJFBhcmFte0NvbG9yfSA9IHVjICRQYXJhbXtDb2xvcn07CgogICAgIyBzZXJpYWxpemUgYW5kIGVuY29kZSB0aWNrZXQgYXBwb2ludG1lbnQgZGF0YQogICAgbXkgJFRpY2tldEFwcG9pbnRtZW50czsKICAgIGlmICggJFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gKSB7CiAgICAgICAgJFRpY2tldEFwcG9pbnRtZW50cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdG9yYWJsZScpLT5TZXJpYWxpemUoCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30sCiAgICAgICAgKTsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZU91dHB1dCgkVGlja2V0QXBwb2ludG1lbnRzKTsKICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRzID0gTUlNRTo6QmFzZTY0OjplbmNvZGVfYmFzZTY0KCRUaWNrZXRBcHBvaW50bWVudHMpOwogICAgfQoKICAgIG15ICRTUUwgPSAnCiAgICAgICAgVVBEQVRFIGNhbGVuZGFyCiAgICAgICAgU0VUIGdyb3VwX2lkPT8sIG5hbWU9PywgY29sb3I9PywgdGlja2V0X2FwcG9pbnRtZW50cz0/LCBjaGFuZ2VfdGltZT1jdXJyZW50X3RpbWVzdGFtcCwKICAgICAgICBjaGFuZ2VfYnk9PywgdmFsaWRfaWQ9PwogICAgJzsKCiAgICBteSBAQmluZDsKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17R3JvdXBJRH0sIFwkUGFyYW17Q2FsZW5kYXJOYW1lfSwgXCRQYXJhbXtDb2xvcn0sIFwkVGlja2V0QXBwb2ludG1lbnRzLAogICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtWYWxpZElEfTsKCiAgICAkU1FMIC49ICcKICAgICAgICBXSEVSRSBpZD0/CiAgICAnOwogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDYWxlbmRhcklEfTsKCiAgICAjIGNyZWF0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgIyBnZXQgY2FjaGUgb2JqZWN0CiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGNsZWFyIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAnQ2FsZW5kYXJMaXN0JywKICAgICk7CgogICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICApOwoKICAgICMgZmlyZSBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ2FsZW5kYXJVcGRhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDYWxlbmRhckltcG9ydCgpCgppbXBvcnQgYSBjYWxlbmRhcgoKICAgIG15ICRTdWNjZXNzID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckltcG9ydCgKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJEYXRhID0+IHsKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgICA9PiAyLAogICAgICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+IDMsCiAgICAgICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gJ01lZXRpbmdzJywKICAgICAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnI0ZGNzcwMCcsCiAgICAgICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhID0+IHsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEICAgICAgID0+IDIsCiAgICAgICAgICAgICAgICAgICAgUGFyZW50SUQgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVbmlxdWVJRCAgICAgICAgICAgID0+ICcyMDE2MDEwMVQxNjAwMDAtNzFFMzg2QGxvY2FsaG9zdCcsCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzID0+IDAsICAgICAjIChvcHRpb25hbCkgT3ZlcndyaXRlIGV4aXN0aW5nIGNhbGVuZGFyIGFuZCBhcHBvaW50bWVudHMsIGRlZmF1bHQ6IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhbGVuZGFyIHdpdGggc2FtZSBuYW1lIHdpbGwgYmUgb3ZlcndyaXR0ZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFwcG9pbnRtZW50cyB3aXRoIHNhbWUgVW5pcXVlSUQgaW4gZXhpc3RpbmcgY2FsZW5kYXIgd2lsbCBiZSBvdmVyd3JpdHRlbgogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsCgo9Y3V0CgpzdWIgQ2FsZW5kYXJJbXBvcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtEYXRhfSApOwogICAgcmV0dXJuIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57Q2FsZW5kYXJEYXRhfSApOwoKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRQYXJhbXtEYXRhfS0+e0NhbGVuZGFyRGF0YX0tPntUaWNrZXRBcHBvaW50bWVudHN9CiAgICAgICAgJiYgSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17RGF0YX0tPntDYWxlbmRhckRhdGF9LT57VGlja2V0QXBwb2ludG1lbnRzfSApCiAgICAgICAgKQogICAgewogICAgICAgICMgR2V0IHF1ZXVlIGNyZWF0ZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHVzZXIuCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICk7CgogICAgICAgIG15IEBWYWxpZElEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZElEc0dldCgpOwoKICAgICAgICBteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICAgICAgIyBRdWV1ZSBmaWVsZCBpbiB0aWNrZXQgYXBwb2ludG1lbnRzIGlzIG1hbmRhdG9yeSwgY2hlY2sgaWYgaXQncyBwcmVzZW50IGFuZCB2YWxpZC4KICAgICAgICBmb3IgbXkgJFJ1bGUgKCBAeyAkUGFyYW17RGF0YX0tPntDYWxlbmRhckRhdGF9LT57VGlja2V0QXBwb2ludG1lbnRzfSB9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFJ1bGUtPntRdWV1ZUlEfSAmJiBJc0FycmF5UmVmV2l0aERhdGEoICRSdWxlLT57UXVldWVJRH0gKSApIHsKCiAgICAgICAgICAgICAgICBRVUVVRV9JRDoKICAgICAgICAgICAgICAgIGZvciBteSAkUXVldWVJRCAoIHNvcnQgQHsgJFJ1bGUtPntRdWV1ZUlEfSB8fCBbXSB9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICVRdWV1ZURhdGEgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICFncmVwIHsgJF8gZXEgJFF1ZXVlRGF0YXtWYWxpZElEfSB9IEBWYWxpZElEcwogICAgICAgICAgICAgICAgICAgICAgICB8fCAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBxdWV1ZSBJRCAkUXVldWVJRCBpbiB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZSBvciBubyBwZXJtaXNzaW9ucyEiLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBxdWV1ZSBJRCBpbiB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZXMhJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBmb3IgYW4gZXhpc3RpbmcgY2FsZW5kYXIKICAgIG15ICVFeGlzdGluZ0NhbGVuZGFyID0gJFNlbGYtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFyTmFtZSA9PiAkUGFyYW17RGF0YX0tPntDYWxlbmRhckRhdGF9LT57Q2FsZW5kYXJOYW1lfSwKICAgICk7CgogICAgbXkgJENhbGVuZGFySUQ7CgogICAgIyBjcmVhdGUgbmV3IGNhbGVuZGFyCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVFeGlzdGluZ0NhbGVuZGFyICkgKSB7CiAgICAgICAgbXkgJUNhbGVuZGFyID0gJFNlbGYtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICAleyAkUGFyYW17RGF0YX0tPntDYWxlbmRhckRhdGF9IH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgICAgIHJldHVybiBpZiAhJENhbGVuZGFye0NhbGVuZGFySUR9OwoKICAgICAgICAkQ2FsZW5kYXJJRCA9ICRDYWxlbmRhcntDYWxlbmRhcklEfTsKICAgIH0KCiAgICAjIHVwZGF0ZSBleGlzdGluZyBjYWxlbmRhcgogICAgZWxzZSB7CiAgICAgICAgaWYgKCAkUGFyYW17T3ZlcndyaXRlRXhpc3RpbmdFbnRpdGllc30gKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkNhbGVuZGFyVXBkYXRlKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0RhdGF9LT57Q2FsZW5kYXJEYXRhfSB9LAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkRXhpc3RpbmdDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiBpZiAhJFN1Y2Nlc3M7CiAgICAgICAgfQoKICAgICAgICAkQ2FsZW5kYXJJRCA9ICRFeGlzdGluZ0NhbGVuZGFye0NhbGVuZGFySUR9OwogICAgfQoKICAgICMgaW1wb3J0IGFwcG9pbnRtZW50cwogICAgaWYgKCAkQ2FsZW5kYXJJRCAmJiBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50RGF0YX0gKSApIHsKICAgICAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CiAgICAgICAgbXkgJEFwcG9pbnRtZW50SUQ7CgogICAgICAgIEFQUE9JTlRNRU5UOgogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKCBAeyAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudERhdGF9IH0gKSB7CgogICAgICAgICAgICAjIGFkZCB0byBleGlzdGluZyBjYWxlbmRhcgogICAgICAgICAgICAkQXBwb2ludG1lbnQtPntDYWxlbmRhcklEfSA9ICRDYWxlbmRhcklEOwoKICAgICAgICAgICAgIyBjcmVhdGUgbmV3IGFwcG9pbnRtZW50IGlmIE5PVCBvdmVyd3JpdGluZyBleGlzdGluZyBlbnRpdGllcwogICAgICAgICAgICAkQXBwb2ludG1lbnQtPntVbmlxdWVJRH0gPSB1bmRlZiBpZiAhJFBhcmFte092ZXJ3cml0ZUV4aXN0aW5nRW50aXRpZXN9OwoKICAgICAgICAgICAgIyBza2lwIGFkZGluZyBhdXRvbWF0aWMgcmVjdXJyaW5nIG9jY3VycmVuY2VzCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50LT57UmVjdXJyaW5nfSApIHsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1JlY3VycmluZ1Jhd30gPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBwYXJlbnQgaWQgdG8gbGFzdCBhcHBvaW50bWVudCBpZAogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudC0+e1BhcmVudElEfSApIHsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1BhcmVudElEfSA9ICRBcHBvaW50bWVudElEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICAgICAleyRBcHBvaW50bWVudH0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiBpZiAhJEFwcG9pbnRtZW50SUQ7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDYWxlbmRhckV4cG9ydCgpCgpleHBvcnQgYSBjYWxlbmRhcgoKICAgIG15ICVEYXRhID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckV4cG9ydCgKICAgICAgICBDYWxlbmRhcklEID0+IDIsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgfQoKcmV0dXJucyBjYWxlbmRhciBoYXNoIHdpdGggZGF0YToKCiAgICAlRGF0YSA9ICgKICAgICAgICBDYWxlbmRhckRhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgPT4gMiwKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+IDMsCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAnTWVldGluZ3MnLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNGRjc3MDAnLAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFwcG9pbnRtZW50RGF0YSA9PiAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgPT4gMiwKICAgICAgICAgICAgICAgIFBhcmVudElEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVuaXF1ZUlEICAgICAgICAgICAgPT4gJzIwMTYwMTAxVDE2MDAwMC03MUUzODZAbG9jYWxob3N0JywKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICB9LAogICAgICAgICAgICAuLi4KICAgICAgICApLAogICAgKTsKCj1jdXQKCnN1YiBDYWxlbmRhckV4cG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2FsZW5kYXIgZGF0YQogICAgbXkgJUNhbGVuZGFyRGF0YSA9ICRTZWxmLT5DYWxlbmRhckdldCgKICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKICAgIHJldHVybiBpZiAhSXNIYXNoUmVmV2l0aERhdGEoIFwlQ2FsZW5kYXJEYXRhICk7CgogICAgIyBnZXQgYXBwb2ludG1lbnQgb2JqZWN0CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CgogICAgIyBnZXQgbGlzdCBvZiBhcHBvaW50bWVudHMKICAgIG15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICApOwoKICAgIG15IEBBcHBvaW50bWVudERhdGE7CgogICAgQVBQT0lOVE1FTlRJRDoKICAgIGZvciBteSAkQXBwb2ludG1lbnRJRCAoQEFwcG9pbnRtZW50cykgewogICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgKTsKICAgICAgICBuZXh0IEFQUE9JTlRNRU5USUQgaWYgISVBcHBvaW50bWVudDsKICAgICAgICBuZXh0IEFQUE9JTlRNRU5USUQgaWYgJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfTsKCiAgICAgICAgcHVzaCBAQXBwb2ludG1lbnREYXRhLCBcJUFwcG9pbnRtZW50OwogICAgfQoKICAgIG15ICVSZXN1bHQgPSAoCiAgICAgICAgQ2FsZW5kYXJEYXRhICAgID0+IFwlQ2FsZW5kYXJEYXRhLAogICAgICAgIEFwcG9pbnRtZW50RGF0YSA9PiBcQEFwcG9pbnRtZW50RGF0YSwKICAgICk7CgogICAgcmV0dXJuICVSZXN1bHQ7Cn0KCj1pdGVtIENhbGVuZGFyUGVybWlzc2lvbkdldCgpCgpnZXQgcGVybWlzc2lvbiBsZXZlbCBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCBhbmQgVXNlcklELgoKICAgIG15ICRQZXJtaXNzaW9uID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgQ2FsZW5kYXJJRCAgPT4gMSwgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIENhbGVuZGFySUQKICAgICAgICBVc2VySUQgICAgICA9PiA0LCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVXNlcklECiAgICApOwoKcmV0dXJuczoKICAgICRQZXJtaXNzaW9uID0gJ3J3JzsgICAgIyAncm8nLCAncncnLC4uLgoKPWN1dAoKc3ViIENhbGVuZGFyUGVybWlzc2lvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBtYWtlIHN1cmUgc3VwZXIgdXNlciBoYXMgcmVhZC93cml0ZSBwZXJtaXNzaW9uCiAgICByZXR1cm4gJ3J3JyBpZiAkUGFyYW17VXNlcklEfSBlcSAxOwoKICAgIG15ICVDYWxlbmRhciA9ICRTZWxmLT5DYWxlbmRhckdldCgKICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICk7CgogICAgbXkgJFJlc3VsdCA9ICcnOwoKICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwoKICAgIFRZUEU6CiAgICBmb3IgbXkgJFR5cGUgKHF3KHJvIG1vdmVfaW50byBjcmVhdGUgcncpKSB7CgogICAgICAgIG15ICVHcm91cERhdGEgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAkVHlwZSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRHcm91cERhdGF7ICRDYWxlbmRhcntHcm91cElEfSB9ICkgewogICAgICAgICAgICAkUmVzdWx0ID0gJFR5cGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBsYXN0IFRZUEU7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUmVzdWx0Owp9Cgo9aXRlbSBUaWNrZXRBcHBvaW50bWVudFByb2Nlc3NUaWNrZXQoKQoKSGFuZGxlIHRoZSBhdXRvbWF0aWMgdGlja2V0IGFwcG9pbnRtZW50cyBmb3IgdGhlIHRpY2tldC4KCiAgICAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc1RpY2tldCgKICAgICAgICBUaWNrZXRJRCA9PiAxLAogICAgKTsKClRoaXMgbWV0aG9kIGRvZXMgbm90IGhhdmUgcmV0dXJuIHZhbHVlLgoKPWN1dAoKc3ViIFRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc1RpY2tldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUaWNrZXRJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGFsbCB2YWxpZCBjYWxlbmRhcnMKICAgIG15IEBDYWxlbmRhcnMgPSAkU2VsZi0+Q2FsZW5kYXJMaXN0KAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICk7CiAgICByZXR1cm4gaWYgIUBDYWxlbmRhcnM7CgogICAgIyBnZXQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGVzCiAgICBteSAlVGlja2V0QXBwb2ludG1lbnRUeXBlcyA9ICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudFR5cGVzR2V0KCk7CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdvIHRocm91Z2ggYWxsIGNhbGVuZGFycyB3aXRoIGRlZmluZWQgdGlja2V0IGFwcG9pbnRtZW50cwogICAgQ0FMRU5EQVI6CiAgICBmb3IgbXkgJENhbGVuZGFyIChAQ2FsZW5kYXJzKSB7CiAgICAgICAgbXkgJUNhbGVuZGFyRGF0YSA9ICRTZWxmLT5DYWxlbmRhckdldCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXItPntDYWxlbmRhcklEfSwKICAgICAgICApOwogICAgICAgIG5leHQgQ0FMRU5EQVIgaWYgISRDYWxlbmRhckRhdGF7VGlja2V0QXBwb2ludG1lbnRzfTsKCiAgICAgICAgVElDS0VUX0FQUE9JTlRNRU5UUzoKICAgICAgICBmb3IgbXkgJFRpY2tldEFwcG9pbnRtZW50cyAoIEB7ICRDYWxlbmRhckRhdGF7VGlja2V0QXBwb2ludG1lbnRzfSB9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBhcHBvaW50bWVudCB0eXBlcwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhTdGFydERhdGUgRW5kRGF0ZSkpIHsKCiAgICAgICAgICAgICAgICAjIGFsbG93IHNwZWNpYWwgdGltZSBwcmVzZXRzIGZvciBFbmREYXRlCiAgICAgICAgICAgICAgICBpZiAoICRGaWVsZCBuZSAnRW5kRGF0ZScgJiYgISggJFRpY2tldEFwcG9pbnRtZW50cy0+eyRGaWVsZH0gPX4gL15QbHVzXy8gKSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBza2lwIGlmIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGlzIGludmFsaWQKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVGlja2V0QXBwb2ludG1lbnRUeXBlc3sgJFRpY2tldEFwcG9pbnRtZW50cy0+eyRGaWVsZH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBUSUNLRVRfQVBQT0lOVE1FTlRTOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aWNrZXQgc2F0aXNmaWVzIHRoZSBzZWFyY2ggZmlsdGVyIGZyb20gdGhlIHRpY2tldCBhcHBvaW50bWVudCBydWxlCiAgICAgICAgICAgICMgcGFzcyBhbGwgY29uZmlndXJlZCBwYXJhbWV0ZXJzIHRvIHRpY2tldCBzZWFyY2gsIGluY2x1ZGluZyB0aWNrZXQgaWQKICAgICAgICAgICAgbXkgJEZpbHRlcmVkID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICAgICAgUmVzdWx0ICAgPT4gJ0NPVU5UJywKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEcyA9PiAkVGlja2V0QXBwb2ludG1lbnRzLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICAgICAgJXsgJFRpY2tldEFwcG9pbnRtZW50cy0+e1NlYXJjaFBhcmFtfSAvLyB7fSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB0aWNrZXQgd2FzIGZvdW5kCiAgICAgICAgICAgIGlmICgkRmlsdGVyZWQpIHsKCiAgICAgICAgICAgICAgICAjIHByb2Nlc3MgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUKICAgICAgICAgICAgICAgICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudFByb2Nlc3NSdWxlKAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyLT57Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgICA9PiBcJVRpY2tldEFwcG9pbnRtZW50VHlwZXMsCiAgICAgICAgICAgICAgICAgICAgUnVsZSAgICAgICA9PiAkVGlja2V0QXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGlja2V0IHdhcyBub3QgZm91bmQKICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyByZW1vdmUgYW55IGV4aXN0aW5nIHRpY2tldCBhcHBvaW50bWVudAogICAgICAgICAgICAgICAgJFNlbGYtPlRpY2tldEFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyLT57Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgPT4gJFBhcmFte1J1bGVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdEZWJ1ZycpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiUHJvY2Vzc2VkIHRpY2tldCBhcHBvaW50bWVudHMgZm9yIHRpY2tldCAkUGFyYW17VGlja2V0SUR9LiIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1pdGVtIFRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc0NhbGVuZGFyKCkKCkhhbmRsZSB0aGUgYXV0b21hdGljIHRpY2tldCBhcHBvaW50bWVudHMgZm9yIHRoZSBjYWxlbmRhci4KCiAgICBteSAlUmVzdWx0ID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFByb2Nlc3NDYWxlbmRhcigKICAgICAgICBDYWxlbmRhcklEID0+IDEsCiAgICApOwoKUmV0dXJucyBsb2cgb2YgcHJvY2Vzc2VkIHRpY2tldHMgYW5kIHJ1bGVzOgoKJVJlc3VsdCA9ICgKICAgIFByb2Nlc3MgPT4gWwogICAgICAgIHsKICAgICAgICAgICAgVGlja2V0SUQgPT4gMSwKICAgICAgICAgICAgUnVsZUlEICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICAgICAgICAgU3VjY2VzcyAgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgVGlja2V0SUQgPT4gMiwKICAgICAgICAgICAgUnVsZUlEICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICAgICAgICAgU3VjY2VzcyAgPT4gMSwKICAgICAgICB9LAogICAgXSwKICAgIENsZWFudXAgPT4gWwogICAgICAgIHsKICAgICAgICAgICAgUnVsZUlEICA9PiAnYjI3MmEwMzVlZDgyZDY1YTkyN2E5OTMwMGUwMGM5YjUnLAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgIF0sCik7Cgo9Y3V0CgpzdWIgVGlja2V0QXBwb2ludG1lbnRQcm9jZXNzQ2FsZW5kYXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NhbGVuZGFySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDYWxlbmRhcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIEdldCBjYWxlbmRhciBjb25maWd1cmF0aW9uLgogICAgbXkgJUNhbGVuZGFyID0gJFNlbGYtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgKTsKICAgIGlmICggISVDYWxlbmRhciApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBmaW5kIGNhbGVuZGFyICRQYXJhbXtDYWxlbmRhcklEfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgR2V0IHRpY2tldCBhcHBvaW50bWVudCB0eXBlcwogICAgbXkgJVRpY2tldEFwcG9pbnRtZW50VHlwZXMgPSAkU2VsZi0+VGlja2V0QXBwb2ludG1lbnRUeXBlc0dldCgpOwoKICAgIG15IEBQcm9jZXNzOwogICAgbXkgJVJ1bGVJRExvb2t1cDsKCiAgICAjIENoZWNrIHRpY2tldCBhcHBvaW50bWVudHMgY29uZmlnLgogICAgaWYgKCAkQ2FsZW5kYXJ7VGlja2V0QXBwb2ludG1lbnRzfSAmJiBJc0FycmF5UmVmV2l0aERhdGEoICRDYWxlbmRhcntUaWNrZXRBcHBvaW50bWVudHN9ICkgKSB7CgogICAgICAgICMgR2V0IGFjdGl2ZSBydWxlIElEcyBmcm9tIHRoZSBjYWxlbmRhciBjb25maWd1cmF0aW9uLgogICAgICAgICVSdWxlSURMb29rdXAgPSBtYXAgeyAkXy0+e1J1bGVJRH0gPT4gMSB9IEB7ICRDYWxlbmRhcntUaWNrZXRBcHBvaW50bWVudHN9IH07CgogICAgICAgIFRJQ0tFVF9BUFBPSU5UTUVOVFM6CiAgICAgICAgZm9yIG15ICRUaWNrZXRBcHBvaW50bWVudHMgKCBAeyAkQ2FsZW5kYXJ7VGlja2V0QXBwb2ludG1lbnRzfSB9ICkgewoKICAgICAgICAgICAgIyBDaGVjayBhcHBvaW50bWVudCB0eXBlcy4KICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoU3RhcnREYXRlIEVuZERhdGUpKSB7CgogICAgICAgICAgICAgICAgIyBBbGxvdyBzcGVjaWFsIHRpbWUgcHJlc2V0cyBmb3IgRW5kRGF0ZS4KICAgICAgICAgICAgICAgIGlmICggJEZpZWxkIG5lICdFbmREYXRlJyAmJiAhKCAkVGlja2V0QXBwb2ludG1lbnRzLT57JEZpZWxkfSA9fiAvXlBsdXNfLyApICkgewoKICAgICAgICAgICAgICAgICAgICAjIFNraXAgaWYgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgaXMgaW52YWxpZC4KICAgICAgICAgICAgICAgICAgICBpZiAoICEkVGlja2V0QXBwb2ludG1lbnRUeXBlc3sgJFRpY2tldEFwcG9pbnRtZW50cy0+eyRGaWVsZH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBUSUNLRVRfQVBQT0lOVE1FTlRTOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBGaW5kIHRpY2tldHMgdGhhdCBtYXRjaCBzZWFyY2ggZmlsdGVyCiAgICAgICAgICAgIG15IEBUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgICAgICBSZXN1bHQgICA9PiAnQVJSQVknLAogICAgICAgICAgICAgICAgUXVldWVJRHMgPT4gJFRpY2tldEFwcG9pbnRtZW50cy0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgICAgICV7ICRUaWNrZXRBcHBvaW50bWVudHMtPntTZWFyY2hQYXJhbX0gLy8ge30gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgUHJvY2VzcyBlYWNoIHRpY2tldCBiYXNlZCBvbiB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZS4KICAgICAgICAgICAgVElDS0VUSUQ6CiAgICAgICAgICAgIGZvciBteSAkVGlja2V0SUQgKCBzb3J0IEBUaWNrZXRJRHMgKSB7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudFByb2Nlc3NSdWxlKAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgICAgPT4gXCVUaWNrZXRBcHBvaW50bWVudFR5cGVzLAogICAgICAgICAgICAgICAgICAgIFJ1bGUgICAgICAgPT4gJFRpY2tldEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcHVzaCBAUHJvY2VzcywgewogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBSdWxlSUQgICA9PiAkVGlja2V0QXBwb2ludG1lbnRzLT57UnVsZUlEfSwKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzICA9PiAkU3VjY2VzcywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgQENsZWFudXA7CiAgICBteSBAUnVsZUlEcyA9ICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudFJ1bGVJRHNHZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICApOwoKICAgICMgUmVtb3ZlIHRpY2tldCBhcHBvaW50bWVudHMgZm9yIG1pc3NpbmcgcnVsZXMuCiAgICBmb3IgbXkgJFJ1bGVJRCAoQFJ1bGVJRHMpIHsKICAgICAgICBpZiAoICEkUnVsZUlETG9va3VweyRSdWxlSUR9ICkgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgUnVsZUlEICAgICA9PiAkUnVsZUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAQ2xlYW51cCwgewogICAgICAgICAgICAgICAgUnVsZUlEICA9PiAkUnVsZUlELAogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAkU3VjY2VzcywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICgKICAgICAgICBQcm9jZXNzID0+IFxAUHJvY2VzcywKICAgICAgICBDbGVhbnVwID0+IFxAQ2xlYW51cCwKICAgICk7Cn0KCj1pdGVtIFRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc1J1bGUoKQoKUHJvY2VzcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUgYW5kIGNyZWF0ZSwgdXBkYXRlIG9yIGRlbGV0ZSBhcHBvaW50bWVudCBpZiBuZWNlc3NhcnkuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc1J1bGUoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAxLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIER5bmFtaWNGaWVsZF9UZXN0RGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpEeW5hbWljRmllbGQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICAuLi4KICAgICAgICB9LAogICAgICAgIFJ1bGUgPT4gewogICAgICAgICAgICBTdGFydERhdGUgPT4gJ0R5bmFtaWNGaWVsZF9UZXN0RGF0ZScsCiAgICAgICAgICAgIEVuZERhdGUgICA9PiAnUGx1c181JywKICAgICAgICAgICAgUXVldWVJRCAgID0+IFsgMiBdLAogICAgICAgICAgICBSdWxlSUQgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFRpdGxlID0+ICdXZWxjb21lKicsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBUaWNrZXRJRCA9PiAxLAogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsLgoKPWN1dAoKc3ViIFRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc1J1bGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQgQ29uZmlnIFJ1bGUgVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0NvbmZpZ30gKTsKICAgIHJldHVybiBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtSdWxlfSApOwoKICAgIG15ICRFcnJvcjsKICAgIG15ICRBcHBvaW50bWVudFR5cGU7CiAgICBteSAlQXBwb2ludG1lbnREYXRhOwoKICAgIG15ICRNYWluT2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICMgZ2V0IHN0YXJ0IGFuZCBlbmQgdGltZSB2YWx1ZXMKICAgIGZvciBteSAkRmllbGQgKHF3KFN0YXJ0RGF0ZSBFbmREYXRlKSkgewogICAgICAgIG15ICRUeXBlID0gJFBhcmFte1J1bGV9LT57JEZpZWxkfTsKCiAgICAgICAgIyBhcHBvaW50bWVudCBmaWVsZHMgYXJlIG5hbWVkIGRpZmZlcmVudGx5CiAgICAgICAgbXkgJEFwcG9pbnRtZW50RmllbGQgPSAkRmllbGQ7CiAgICAgICAgJEFwcG9pbnRtZW50RmllbGQgPX4gcy9EYXRlJC9UaW1lLzsKCiAgICAgICAgIyBjaGVjayBpZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcmVnaXN0ZXJlZCB0eXBlCiAgICAgICAgaWYgKCAkUGFyYW17Q29uZmlnfS0+eyRUeXBlfSAmJiAkUGFyYW17Q29uZmlnfS0+eyRUeXBlfS0+e01vZHVsZX0gKSB7CiAgICAgICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gJFBhcmFte0NvbmZpZ30tPnskVHlwZX0tPntNb2R1bGV9OwoKICAgICAgICAgICAgIyBnZXQgdGhlIHRpbWUgdmFsdWUgdmlhIHRoZSBtb2R1bGUgbWV0aG9kCiAgICAgICAgICAgIGlmICggJE1haW5PYmplY3QtPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50RGF0YXskQXBwb2ludG1lbnRGaWVsZH0gPSAkR2VuZXJpY01vZHVsZS0+bmV3KCAleyRTZWxmfSApLT5HZXRUaW1lKAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEVycm9yID0gMSBpZiAhJEFwcG9pbnRtZW50RGF0YXskQXBwb2ludG1lbnRGaWVsZH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdGltZSBwcmVzZXRzIGFyZSB2YWxpZCBvbmx5IGZvciBlbmQgdGltZSBhbmQgZXhpc3Rpbmcgc3RhcnQgdGltZQogICAgICAgIGVsc2lmICggJEZpZWxkIGVxICdFbmREYXRlJyAmJiAkQXBwb2ludG1lbnREYXRhe1N0YXJ0VGltZX0gKSB7CiAgICAgICAgICAgIGlmICggJFR5cGUgPX4gL15QbHVzXyhbMC05XSspJC8gKSB7CiAgICAgICAgICAgICAgICBteSAkUHJlc2V0ID0gaW50ICQxOwoKICAgICAgICAgICAgICAgICMgZ2V0IHN0YXJ0IHRpbWUKICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudERhdGF7U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjYWxjdWxhdGUgZW5kIHRpbWUgdXNpbmcgcHJlc2V0IHZhbHVlCiAgICAgICAgICAgICAgICBteSAkRW5kVGltZSA9ICRTdGFydFRpbWUgKyA2MCAqICRQcmVzZXQ7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnREYXRhe0VuZFRpbWV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRXJyb3IgPSAxOwogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCB0aW1lIHByZXNldDogJFR5cGUiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB1bmtub3duIHR5cGUKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEVycm9yID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBwcmV2ZW50IGVuZCB0aW1lIGJlZm9yZSBzdGFydCB0aW1lCiAgICBpZiAoICRBcHBvaW50bWVudERhdGF7U3RhcnRUaW1lfSAmJiAkQXBwb2ludG1lbnREYXRhe0VuZFRpbWV9ICkgewogICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnREYXRhe1N0YXJ0VGltZX0sCiAgICAgICAgKTsKICAgICAgICBteSAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudERhdGF7RW5kVGltZX0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICRFbmRUaW1lIDwgJFN0YXJ0VGltZSApIHsKICAgICAgICAgICAgJEFwcG9pbnRtZW50RGF0YXtFbmRUaW1lfSA9ICRBcHBvaW50bWVudERhdGF7U3RhcnRUaW1lfTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYXBwb2ludG1lbnQgdGl0bGUKICAgIGlmICggISRFcnJvciApIHsKCiAgICAgICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgICAgIG15ICRUaWNrZXRIb29rICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rJyk7CiAgICAgICAgbXkgJFRpY2tldEhvb2tEaXZpZGVyID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2tEaXZpZGVyJyk7CiAgICAgICAgbXkgJVRpY2tldCAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkQXBwb2ludG1lbnREYXRhe1RpdGxlfSA9ICJbJFRpY2tldEhvb2skVGlja2V0SG9va0RpdmlkZXIkVGlja2V0e1RpY2tldE51bWJlcn1dICRUaWNrZXR7VGl0bGV9IjsKICAgIH0KCiAgICBteSAkU3VjY2VzczsKCiAgICAjIGNoZWNrIGlmIHRpY2tldCBhcHBvaW50bWVudCBhbHJlYWR5IGV4aXN0cwogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50R2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBSdWxlSUQgICAgID0+ICRQYXJhbXtSdWxlfS0+e1J1bGVJRH0sCiAgICApOwoKICAgICMgdGlja2V0IGFwcG9pbnRtZW50IHdhcyBmb3VuZAogICAgaWYgKCRBcHBvaW50bWVudElEKSB7CgogICAgICAgICMgZGVsZXRlIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQsIGlmIGVycm9yIHdhcyByYWlzZWQKICAgICAgICBpZiAoJEVycm9yKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPlRpY2tldEFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBSdWxlSUQgICAgICAgID0+ICRQYXJhbXtSdWxlfS0+e1J1bGVJRH0sCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgdGhlIHRpY2tldCBhcHBvaW50bWVudCwgb3RoZXJ3aXNlCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPl9UaWNrZXRBcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgICAgPT4gJFBhcmFte1J1bGV9LT57UnVsZUlEfSwKICAgICAgICAgICAgICAgICVBcHBvaW50bWVudERhdGEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIHRpY2tldCBhcHBvaW50bWVudCBpZiBub3QgZm91bmQKICAgIGVsc2lmICggISRFcnJvciApIHsKICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT5fVGlja2V0QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIFJ1bGVJRCAgICAgPT4gJFBhcmFte1J1bGV9LT57UnVsZUlEfSwKICAgICAgICAgICAgJUFwcG9pbnRtZW50RGF0YSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKPWl0ZW0gVGlja2V0QXBwb2ludG1lbnRVcGRhdGVUaWNrZXQoKQoKVXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4KCiAgICAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50VXBkYXRlVGlja2V0KAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMSwKICAgICAgICBUaWNrZXRJRCAgICAgID0+IDEsCiAgICApOwoKVGhpcyBtZXRob2QgZG9lcyBub3QgaGF2ZSByZXR1cm4gdmFsdWUuCgo9Y3V0CgpzdWIgVGlja2V0QXBwb2ludG1lbnRVcGRhdGVUaWNrZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50SUQgVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYXBwb2ludG1lbnQgZGF0YQogICAgbXkgJUFwcG9pbnRtZW50RGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgICMgc3RvcCBpZiBub3QgdGlja2V0IGFwcG9pbnRtZW50CiAgICByZXR1cm4gaWYgISRBcHBvaW50bWVudERhdGF7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9OwoKICAgICMgZ2V0IHRpY2tldCBhcHBvaW50bWVudCBydWxlCiAgICBteSAkUnVsZSA9ICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudFJ1bGVHZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnREYXRhe0NhbGVuZGFySUR9LAogICAgICAgIFJ1bGVJRCAgICAgPT4gJEFwcG9pbnRtZW50RGF0YXtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sCiAgICApOwogICAgcmV0dXJuIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkUnVsZSk7CgogICAgIyBnZXQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGVzCiAgICBteSAlVGlja2V0QXBwb2ludG1lbnRUeXBlcyA9ICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudFR5cGVzR2V0KCk7CgogICAgbXkgJE1haW5PYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgcHJvY2VzcyBzdGFydCBhbmQgZW5kIHRpbWUgdmFsdWVzCiAgICBmb3IgbXkgJEZpZWxkIChxdyhTdGFydERhdGUgRW5kRGF0ZSkpIHsKICAgICAgICBteSAkVHlwZSA9ICRSdWxlLT57JEZpZWxkfTsKCiAgICAgICAgIyBhcHBvaW50bWVudCBmaWVsZHMgYXJlIG5hbWVkIGRpZmZlcmVudGx5CiAgICAgICAgbXkgJEFwcG9pbnRtZW50RmllbGQgPSAkRmllbGQ7CiAgICAgICAgJEFwcG9pbnRtZW50RmllbGQgPX4gcy9EYXRlJC9UaW1lLzsKCiAgICAgICAgIyBjaGVjayBpZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcmVnaXN0ZXJlZCB0eXBlCiAgICAgICAgaWYgKCAkVGlja2V0QXBwb2ludG1lbnRUeXBlc3skVHlwZX0gJiYgJFRpY2tldEFwcG9pbnRtZW50VHlwZXN7JFR5cGV9LT57TW9kdWxlfSApIHsKICAgICAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAkVGlja2V0QXBwb2ludG1lbnRUeXBlc3skVHlwZX0tPntNb2R1bGV9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIHRpbWUgdmFsdWUgdmlhIHRoZSBtb2R1bGUgbWV0aG9kCiAgICAgICAgICAgIGlmICggJE1haW5PYmplY3QtPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewoKICAgICAgICAgICAgICAgICMgbG9vcCBwcm90ZWN0aW9uOiBwcmV2ZW50IHRpY2tldCBldmVudCBtb2R1bGUgZnJvbSBydW5uaW5nCiAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT57J19UaWNrZXRBcHBvaW50bWVudHM6OkFscmVhZHlQcm9jZXNzZWQnfS0+eyAkUGFyYW17VGlja2V0SUR9IH0rKzsKCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9ICktPlNldFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJEFwcG9pbnRtZW50RGF0YXskQXBwb2ludG1lbnRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkVycm9yIHNldHRpbmcgJFR5cGUgZm9yIHRpY2tldCAkUGFyYW17VGlja2V0SUR9ISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRGVidWcnKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVwZGF0ZWQgdGlja2V0ICRQYXJhbXtUaWNrZXRJRH0gZnJvbSBhcHBvaW50bWVudCAkUGFyYW17QXBwb2ludG1lbnRJRH0uIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybjsKfQoKPWl0ZW0gVGlja2V0QXBwb2ludG1lbnRUaWNrZXRJRCgpCgpnZXQgdGlja2V0IGlkIG9mIGEgdGlja2V0IGFwcG9pbnRtZW50LgoKICAgIG15ICRUaWNrZXRJRCA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRUaWNrZXRJRCgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEsCiAgICApOwoKcmV0dXJucyBhcHBvaW50bWVudCBJRCBpZiBzdWNjZXNzZnVsLgoKPWN1dAoKc3ViIFRpY2tldEFwcG9pbnRtZW50VGlja2V0SUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBBcHBvaW50bWVudElEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgdGlja2V0X2lkCiAgICAgICAgICAgIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnRfdGlja2V0CiAgICAgICAgICAgIFdIRVJFIGFwcG9pbnRtZW50X2lkID0gPwogICAgICAgICcsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0FwcG9pbnRtZW50SUR9LCBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRUaWNrZXRJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUaWNrZXRJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRUaWNrZXRJRDsKfQoKPWl0ZW0gVGlja2V0QXBwb2ludG1lbnRSdWxlSURzR2V0KCkKCmdldCB1c2VkIHRpY2tldCBhcHBvaW50bWVudCBydWxlcyBmb3Igc3BlY2lmaWMgY2FsZW5kYXIuCgogICAgbXkgQFJ1bGVJRHMgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50UnVsZUlEc0dldCgKICAgICAgICBDYWxlbmRhcklEID0+IDEsCiAgICAgICAgVGlja2V0SUQgICA9PiAxLCAgICAjIChvcHRpb25hbCkgUmV0dXJuIHJ1bGVzIHVzZWQgb25seSBmb3Igc3BlY2lmaWMgdGlja2V0CiAgICApOwoKcmV0dXJucyBhcnJheSBvZiBydWxlIElEcyBpZiBmb3VuZC4KCj1jdXQKCnN1YiBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRHNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFNRTCA9ICcKICAgICAgICBTRUxFQ1QgcnVsZV9pZAogICAgICAgIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnRfdGlja2V0CiAgICAgICAgV0hFUkUgY2FsZW5kYXJfaWQgPSA/CiAgICAnOwogICAgbXkgQEJpbmQ7CiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0NhbGVuZGFySUR9OwoKICAgICMgc3BlY2lmaWMgdGlja2V0IHF1ZXJ5IGNvbmRpdGlvbgogICAgaWYgKCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICRTUUwgLj0gJwogICAgICAgICAgICBBTkQgdGlja2V0X2lkID0gPwogICAgICAgICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtUaWNrZXRJRH07CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSAlUnVsZUlEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRSdWxlSURzeyAkUm93WzBdIH0gPSAxOwogICAgfQoKICAgICMgcmV0dXJuIHVuaXF1ZSBydWxlIGlkcwogICAgcmV0dXJuIGtleXMgJVJ1bGVJRHM7Cn0KCj1pdGVtIFRpY2tldEFwcG9pbnRtZW50UnVsZUdldCgpCgpnZXQgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUuCgogICAgbXkgJFJ1bGUgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50UnVsZUdldCgKICAgICAgICBDYWxlbmRhcklEID0+IDEsCiAgICAgICAgUnVsZUlEICAgICA9PiAnOWJiMjBlYTAzNWU3YTk5MzA2NTJhOWQ4MmQwMGM3MjUnLAogICAgKTsKCnJldHVybnMgcnVsZSBoYXNoOgoKPWN1dAoKc3ViIFRpY2tldEFwcG9pbnRtZW50UnVsZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBSdWxlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUNhbGVuZGFyID0gJFNlbGYtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgKTsKICAgIHJldHVybiBpZiAhJENhbGVuZGFye1RpY2tldEFwcG9pbnRtZW50c307CgogICAgbXkgJFJlc3VsdDsKCiAgICBSVUxFOgogICAgZm9yIG15ICRSdWxlICggQHsgJENhbGVuZGFye1RpY2tldEFwcG9pbnRtZW50c30gfHwgW10gfSApIHsKICAgICAgICBpZiAoICRSdWxlLT57UnVsZUlEfSBlcSAkUGFyYW17UnVsZUlEfSApIHsKICAgICAgICAgICAgJFJlc3VsdCA9ICRSdWxlOwogICAgICAgICAgICBsYXN0IFJVTEU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGlmICEkUmVzdWx0OwoKICAgIHJldHVybiAkUmVzdWx0Owp9Cgo9aXRlbSBUaWNrZXRBcHBvaW50bWVudFR5cGVzR2V0KCkKCmdldCBkZWZpbmVkIHRpY2tldCBhcHBvaW50bWVudCB0eXBlcyBmcm9tIGNvbmZpZy4KCiAgICBteSAlVGlja2V0QXBwb2ludG1lbnRUeXBlcyA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRUeXBlc0dldCgpOwoKcmV0dXJucyBoYXNoIG9mIGFwcG9pbnRtZW50IHR5cGVzOgoKICAgICVUaWNrZXRBcHBvaW50bWVudFR5cGVzID0gKCk7Cgo9Y3V0CgpzdWIgVGlja2V0QXBwb2ludG1lbnRUeXBlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHRpY2tldCBhcHBvaW50bWVudCB0eXBlcwogICAgbXkgJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudFR5cGUnKQogICAgICAgIC8vIHt9OwogICAgcmV0dXJuIGlmICEkVGlja2V0QXBwb2ludG1lbnRDb25maWc7CgogICAgbXkgJVRpY2tldEFwcG9pbnRtZW50VHlwZXM7CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICBUWVBFOgogICAgZm9yIG15ICRUeXBlS2V5ICggc29ydCBrZXlzICV7JFRpY2tldEFwcG9pbnRtZW50Q29uZmlnfSApIHsKICAgICAgICBuZXh0IFRZUEUgaWYgISRUaWNrZXRBcHBvaW50bWVudENvbmZpZy0+eyRUeXBlS2V5fS0+e0tleX07CgogICAgICAgIGlmICggJFR5cGVLZXkgPX4gL0R5bmFtaWNGaWVsZCQvICkgewoKICAgICAgICAgICAgIyBnZXQgbGlzdCBvZiBhbGwgdmFsaWQgZGF0ZSBhbmQgZGF0ZS90aW1lIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRMaXN0ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkLT57RmllbGRUeXBlfSBuZSAnRGF0ZScgJiYgJER5bmFtaWNGaWVsZC0+e0ZpZWxkVHlwZX0gbmUgJ0RhdGVUaW1lJzsKCiAgICAgICAgICAgICAgICBteSAkS2V5ID0gc3ByaW50ZiggJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57S2V5fSwgJER5bmFtaWNGaWVsZC0+e05hbWV9ICk7CiAgICAgICAgICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRUeXBlc3skS2V5fSA9ICRUaWNrZXRBcHBvaW50bWVudENvbmZpZy0+eyRUeXBlS2V5fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBUWVBFOwogICAgICAgIH0KCiAgICAgICAgJFRpY2tldEFwcG9pbnRtZW50VHlwZXN7ICRUaWNrZXRBcHBvaW50bWVudENvbmZpZy0+eyRUeXBlS2V5fS0+e0tleX0gfSA9CiAgICAgICAgICAgICRUaWNrZXRBcHBvaW50bWVudENvbmZpZy0+eyRUeXBlS2V5fTsKICAgIH0KCiAgICByZXR1cm4gJVRpY2tldEFwcG9pbnRtZW50VHlwZXM7Cn0KCj1pdGVtIFRpY2tldEFwcG9pbnRtZW50RGVsZXRlKCkKCmRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQocykuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgIENhbGVuZGFySUQgICAgPT4gMSwKICAgICAgICBSdWxlSUQgICAgICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IElEIGlzIGtub3duCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgQXBwb2ludG1lbnQgSUQgaXMga25vd24KICAgICk7CgpyZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bC4KCj1jdXQKCnN1YiBUaWNrZXRBcHBvaW50bWVudERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBSdWxlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgQEFwcG9pbnRtZW50SURzOwogICAgcHVzaCBAQXBwb2ludG1lbnRJRHMsICRQYXJhbXtBcG9pbnRtZW50SUR9IGlmICRQYXJhbXtBcG9pbnRtZW50SUR9OwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhcHBvaW50bWVudCBpZCBpcyB1bmtub3duCiAgICBpZiAoICFAQXBwb2ludG1lbnRJRHMgKSB7CiAgICAgICAgbXkgJFNRTCA9ICcKICAgICAgICAgICAgU0VMRUNUIGFwcG9pbnRtZW50X2lkCiAgICAgICAgICAgIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnRfdGlja2V0CiAgICAgICAgICAgIFdIRVJFIGNhbGVuZGFyX2lkID0gPyBBTkQgcnVsZV9pZCA9ID8KICAgICAgICAnOwogICAgICAgIG15IEBCaW5kOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2FsZW5kYXJJRH0sIFwkUGFyYW17UnVsZUlEfTsKCiAgICAgICAgaWYgKCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICAgICAkU1FMIC49ICcKICAgICAgICAgICAgICAgIEFORCB0aWNrZXRfaWQgPSA/CiAgICAgICAgICAgICc7CiAgICAgICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17VGlja2V0SUR9OwogICAgICAgIH0KCiAgICAgICAgIyBkYiBxdWVyeQogICAgICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgICAgICk7CgogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBwdXNoIEBBcHBvaW50bWVudElEcywgJFJvd1swXSwKICAgICAgICB9CiAgICB9CgogICAgIyByZW1vdmUgdGhlIHJlbGF0aW9uKHMpIGZyb20gZGF0YWJhc2UKICAgIG15ICRTUUwgPSAnCiAgICAgICAgREVMRVRFIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnRfdGlja2V0CiAgICAgICAgV0hFUkUgY2FsZW5kYXJfaWQgPSA/IEFORCBydWxlX2lkID0gPwogICAgJzsKICAgIG15IEBCaW5kOwogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDYWxlbmRhcklEfSwgXCRQYXJhbXtSdWxlSUR9OwoKICAgIGlmICggJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAkU1FMIC49ICcKICAgICAgICAgICAgQU5EIHRpY2tldF9pZCA9ID8KICAgICAgICAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17VGlja2V0SUR9OwogICAgfQoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgICMgZ2V0IGFwcG9pbnRtZW50IG9iamVjdAogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKICAgICMgY2xlYW51cCB0aWNrZXQgYXBwb2ludG1lbnRzCiAgICBBUFBPSU5UTUVOVF9JRDoKICAgIGZvciBteSAkQXBwb2ludG1lbnRJRCAoQEFwcG9pbnRtZW50SURzKSB7CgogICAgICAgICMgY2hlY2sgaWYgYXBwb2ludG1lbnQgZXhpc3RzCiAgICAgICAgbmV4dCBBUFBPSU5UTUVOVF9JRCBpZiAhJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0aGUgYXBwb2ludG1lbnQKICAgICAgICByZXR1cm4gaWYgISRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBHZXRBY2Nlc3NUb2tlbigpCgpnZXQgYWNjZXNzIHRva2VuIGZvciB0aGUgY2FsZW5kYXIuCgogICAgbXkgJFRva2VuID0gJENhbGVuZGFyT2JqZWN0LT5HZXRBY2Nlc3NUb2tlbigKICAgICAgICBDYWxlbmRhcklEID0+IDEsICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgQ2FsZW5kYXJJRAogICAgICAgIFVzZXJMb2dpbiAgPT4gJ2FnZW50LTEnLCAgICAgICMgKHJlcXVpcmVkKSBVc2VyIGxvZ2luCiAgICApOwoKcmV0dXJuczoKICAgICRUb2tlbiA9ICdydyc7Cgo9Y3V0CgpzdWIgR2V0QWNjZXNzVG9rZW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQgVXNlckxvZ2luKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGRiIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBzYWx0X3N0cmluZyBGUk9NIGNhbGVuZGFyIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NhbGVuZGFySUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkU2FsdFN0cmluZzsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRTYWx0U3RyaW5nID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gaWYgISRTYWx0U3RyaW5nOwoKICAgICMgY2FsY3VsYXRlIG1kNSBzdW0KICAgIG15ICRTdHJpbmcgPSAiJFBhcmFte1VzZXJMb2dpbn0tJFNhbHRTdHJpbmciOwogICAgbXkgJE1ENSAgICA9IERpZ2VzdDo6TUQ1LT5uZXcoKS0+YWRkKCRTdHJpbmcpLT5oZXhkaWdlc3QoKTsKCiAgICByZXR1cm4gJE1ENTsKfQoKPWl0ZW0gR2V0VGV4dENvbG9yKCkKCnJldHVybnMgYmVzdCB0ZXh0IGNvbG9yIGZvciBzdXBwbGllZCBiYWNrZ3JvdW5kLCBiYXNlZCBvbiBsdW1pbm9zaXR5IGRpZmZlcmVuY2UgYWxnb3JpdGhtLgoKICAgIG15ICRCZXN0VGV4dENvbG9yID0gJENhbGVuZGFyT2JqZWN0LT5HZXRUZXh0Q29sb3IoCiAgICAgICAgQmFja2dyb3VuZCA9PiAnI0ZGRicsICAgICMgKHJlcXVpcmVkKSBtdXN0IGJlIGluIHZhbGlkIGhleGFkZWNpbWFsIFJHQiBub3RhdGlvbgogICAgKTsKCnJldHVybnM6CiAgICAkQmVzdFRleHRDb2xvciA9ICcjMDAwJzsKCj1jdXQKCnN1YiBHZXRUZXh0Q29sb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEJhY2tncm91bmQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBjb2xvcgogICAgaWYgKCAhKCAkUGFyYW17QmFja2dyb3VuZH0gPX4gLyNbQS1GMC05XXszLDZ9L2kgKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0JhY2tncm91bmQgbXVzdCBiZSBpbiBoZXhhZGVjaW1hbCBSR0Igbm90YXRpb24sIGVnLiAjRkZGRkZGLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiB2YWx1ZSBpcyBjYWNoZWQKICAgIG15ICREYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdHZXRUZXh0Q29sb3InLAogICAgICAgIEtleSAgPT4gJFBhcmFte0JhY2tncm91bmR9LAogICAgKTsKICAgIHJldHVybiAkRGF0YSBpZiAkRGF0YTsKCiAgICAjIGdldCBSR0IgdmFsdWVzCiAgICBteSBAQmFja2dyb3VuZENvbG9yOwogICAgbXkgJFJHQkhleCA9IHN1YnN0ciggJFBhcmFte0JhY2tncm91bmR9LCAxICk7CgogICAgIyBzaXggY2hhcmFjdGVyIGhleGFkZWNpbWFsIHN0cmluZyAoZWcuICNGRkZGRkYpCiAgICBpZiAoIGxlbmd0aCAkUkdCSGV4ID09IDYgKSB7CiAgICAgICAgJEJhY2tncm91bmRDb2xvclswXSA9IGhleCBzdWJzdHIoICRSR0JIZXgsIDAsIDIgKTsKICAgICAgICAkQmFja2dyb3VuZENvbG9yWzFdID0gaGV4IHN1YnN0ciggJFJHQkhleCwgMiwgMiApOwogICAgICAgICRCYWNrZ3JvdW5kQ29sb3JbMl0gPSBoZXggc3Vic3RyKCAkUkdCSGV4LCA0LCAyICk7CiAgICB9CgogICAgIyB0aHJlZSBjaGFyYWN0ZXIgaGV4YWRlY2ltYWwgc3RyaW5nIChlZy4gI0ZGRikKICAgIGVsc2lmICggbGVuZ3RoICRSR0JIZXggPT0gMyApIHsKICAgICAgICAkQmFja2dyb3VuZENvbG9yWzBdID0gaGV4KCBzdWJzdHIoICRSR0JIZXgsIDAsIDEgKSAuIHN1YnN0ciggJFJHQkhleCwgMCwgMSApICk7CiAgICAgICAgJEJhY2tncm91bmRDb2xvclsxXSA9IGhleCggc3Vic3RyKCAkUkdCSGV4LCAxLCAxICkgLiBzdWJzdHIoICRSR0JIZXgsIDEsIDEgKSApOwogICAgICAgICRCYWNrZ3JvdW5kQ29sb3JbMl0gPSBoZXgoIHN1YnN0ciggJFJHQkhleCwgMiwgMSApIC4gc3Vic3RyKCAkUkdCSGV4LCAxLCAxICkgKTsKICAgIH0KCiAgICAjIGludmFsaWQgaGV4YWRlY2ltYWwgc3RyaW5nCiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0JhY2tncm91bmQgbXVzdCBiZSBpbiB2YWxpZCAzIG9yIDYgY2hhcmFjdGVyIGhleGFkZWNpbWFsIFJHQiBub3RhdGlvbiwgZWcuICNGRkYgb3IgI0ZGRkZGRi4nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcHJlZGVmaW5lZCB0ZXh0IGNvbG9ycwogICAgbXkgJVRleHRDb2xvcnMgPSAoCiAgICAgICAgV2hpdGUgPT4gWyAnMjU1JywgJzI1NScsICcyNTUnIF0sCiAgICAgICAgR3JheSAgPT4gWyAnMTI4JywgJzEyOCcsICcxMjgnIF0sCiAgICAgICAgQmxhY2sgPT4gWyAnMCcsICAgJzAnLCAgICcwJyBdLAogICAgKTsKCiAgICAjIGNhbGN1bGF0ZSBiYWNrZ3JvdW5kIGx1bWlub3NpdHkKICAgIG15ICRCYWNrZ3JvdW5kTHVtID0KICAgICAgICAwLjIxMjYgKiAoICRCYWNrZ3JvdW5kQ29sb3JbMF0gLyAyNTUqKjIuMiApICsKICAgICAgICAwLjcxNTIgKiAoICRCYWNrZ3JvdW5kQ29sb3JbMV0gLyAyNTUqKjIuMiApICsKICAgICAgICAwLjA3MjIgKiAoICRCYWNrZ3JvdW5kQ29sb3JbMl0gLyAyNTUqKjIuMiApOwoKICAgICMgY2FsY3VsYXRlIGx1bWlub3NpdHkgZGlmZmVyZW5jZQogICAgbXkgJUx1bURpZmY7CiAgICBmb3IgbXkgJFRleHRDb2xvciAoIHNvcnQga2V5cyAlVGV4dENvbG9ycyApIHsKICAgICAgICBteSAkVGV4dEx1bSA9CiAgICAgICAgICAgIDAuMjEyNiAqICggJFRleHRDb2xvcnN7JFRleHRDb2xvcn0tPlswXSAvIDI1NSoqMi4yICkgKwogICAgICAgICAgICAwLjcxNTIgKiAoICRUZXh0Q29sb3JzeyRUZXh0Q29sb3J9LT5bMV0gLyAyNTUqKjIuMiApICsKICAgICAgICAgICAgMC4wNzIyICogKCAkVGV4dENvbG9yc3skVGV4dENvbG9yfS0+WzJdIC8gMjU1KioyLjIgKTsKCiAgICAgICAgaWYgKCAkQmFja2dyb3VuZEx1bSA+ICRUZXh0THVtICkgewogICAgICAgICAgICAkTHVtRGlmZnskVGV4dENvbG9yfSA9ICggJEJhY2tncm91bmRMdW0gKyAwLjA1ICkgLyAoICRUZXh0THVtICsgMC4wNSApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEx1bURpZmZ7JFRleHRDb2xvcn0gPSAoICRUZXh0THVtICsgMC4wNSApIC8gKCAkQmFja2dyb3VuZEx1bSArIDAuMDUgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbWF4aW11bSBsdW1pbm9zaXR5IGRpZmZlcmVuY2UKICAgIG15ICgkTWF4THVtRGlmZikgPSBzb3J0IHsgJGIgPD0+ICRhIH0gdmFsdWVzICVMdW1EaWZmOwogICAgcmV0dXJuIGlmICEkTWF4THVtRGlmZjsKCiAgICAjIGlkZW50aWZ5IGJlc3Qgc3VpdGVkIGNvbG9yCiAgICBteSAoJEJlc3RUZXh0Q29sb3IpID0gZ3JlcCB7ICRMdW1EaWZmeyRffSBlcSAkTWF4THVtRGlmZiB9IGtleXMgJUx1bURpZmY7CiAgICByZXR1cm4gaWYgISRCZXN0VGV4dENvbG9yOwoKICAgICMgY29udmVydCB0byBoZXggc3RyaW5nCiAgICBteSAkVGV4dENvbG9yID0gc3ByaW50ZigKICAgICAgICAnIyVYJVglWCcsCiAgICAgICAgJFRleHRDb2xvcnN7JEJlc3RUZXh0Q29sb3J9LT5bMF0sCiAgICAgICAgJFRleHRDb2xvcnN7JEJlc3RUZXh0Q29sb3J9LT5bMV0sCiAgICAgICAgJFRleHRDb2xvcnN7JEJlc3RUZXh0Q29sb3J9LT5bMl0sCiAgICApOwoKICAgICMgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0dldFRleHRDb2xvcicsCiAgICAgICAgS2V5ICAgPT4gJFBhcmFte0JhY2tncm91bmR9LAogICAgICAgIFZhbHVlID0+ICRUZXh0Q29sb3IsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiAkVGV4dENvbG9yOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9aXRlbSBfVGlja2V0QXBwb2ludG1lbnRHZXQoKQoKZ2V0IHRpY2tldCBhcHBvaW50bWVudCBpZCBpZiBleGlzdHMuCgogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQ2FsZW5kYXJPYmplY3QtPl9UaWNrZXRBcHBvaW50bWVudEdldCgKICAgICAgICBDYWxlbmRhcklEID0+IDEsCiAgICAgICAgVGlja2V0SUQgICA9PiAxLAogICAgICAgIFJ1bGVJRCAgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICk7CgpyZXR1cm5zIGFwcG9pbnRtZW50IElEIGlmIHN1Y2Nlc3NmdWwuCgo9Y3V0CgpzdWIgX1RpY2tldEFwcG9pbnRtZW50R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFRpY2tldElEIFJ1bGVJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBhcHBvaW50bWVudF9pZAogICAgICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50X3RpY2tldAogICAgICAgICAgICBXSEVSRSBjYWxlbmRhcl9pZCA9ID8gQU5EIHRpY2tldF9pZCA9ID8gQU5EIHJ1bGVfaWQgPSA/CiAgICAgICAgJywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2FsZW5kYXJJRH0sIFwkUGFyYW17VGlja2V0SUR9LCBcJFBhcmFte1J1bGVJRH0sIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJEFwcG9pbnRtZW50SUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQXBwb2ludG1lbnRJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRBcHBvaW50bWVudElEOwp9Cgo9aXRlbSBfVGlja2V0QXBwb2ludG1lbnRDcmVhdGUoKQoKY3JlYXRlIHRpY2tldCBhcHBvaW50bWVudC4KCiAgICBteSAkU3VjY2VzcyA9ICRDYWxlbmRhck9iamVjdC0+X1RpY2tldEFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgIENhbGVuZGFySUQgPT4gMSwKICAgICAgICBUaWNrZXRJRCAgID0+IDEsCiAgICAgICAgUnVsZUlEICAgICA9PiAnOWJiMjBlYTAzNWU3YTk5MzA2NTJhOWQ4MmQwMGM3MjUnLAogICAgICAgIFRpdGxlICAgICAgPT4gJ1tUaWNrZXQjMjAxNjA4MjM4MTAwMDAwMTBdIFNvbWUgVGlja2V0IFRpdGxlJywKICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTA4LTIzIDAwOjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTA4LTI0IDAwOjAwOjAwJywKICAgICk7CgpyZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bC4KCj1jdXQKCnN1YiBfVGlja2V0QXBwb2ludG1lbnRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQgVGlja2V0SUQgUnVsZUlEIFRpdGxlIFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGFwcG9pbnRtZW50CiAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUaXRsZX0sCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0VuZFRpbWV9LAogICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEID0+ICRQYXJhbXtSdWxlSUR9LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgID0+IDEsCiAgICApOwogICAgcmV0dXJuIGlmICEkQXBwb2ludG1lbnRJRDsKCiAgICAjIHNhdmUgdGhlIHJlbGF0aW9uIGluIGRhdGFiYXNlCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIElOU0VSVCBJTlRPIGNhbGVuZGFyX2FwcG9pbnRtZW50X3RpY2tldAogICAgICAgICAgICAgICAgKGNhbGVuZGFyX2lkLCB0aWNrZXRfaWQsIGFwcG9pbnRtZW50X2lkLCBydWxlX2lkKQogICAgICAgICAgICBWQUxVRVMgKD8sID8sID8sID8pCiAgICAgICAgJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDYWxlbmRhcklEfSwgXCRQYXJhbXtUaWNrZXRJRH0sIFwkQXBwb2ludG1lbnRJRCwgXCRQYXJhbXtSdWxlSUR9LCBdLAogICAgKTsKfQoKPWl0ZW0gX1RpY2tldEFwcG9pbnRtZW50VXBkYXRlKCkKCnVwZGF0ZSB0aWNrZXQgYXBwb2ludG1lbnQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPl9UaWNrZXRBcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEsCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAxLAogICAgICAgIFJ1bGVJRCAgICAgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICAgICBUaXRsZSAgICAgICAgID0+ICdbVGlja2V0IzIwMTYwODIzODEwMDAwMDEwXSBTb21lIFRpY2tldCBUaXRsZScsCiAgICAgICAgU3RhcnRUaW1lICAgICA9PiAnMjAxNi0wOC0yMyAwMDowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICA9PiAnMjAxNi0wOC0yNCAwMDowMDowMCcsCiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWwuCgo9Y3V0CgpzdWIgX1RpY2tldEFwcG9pbnRtZW50VXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIFRpY2tldElEIFJ1bGVJRCBUaXRsZSBTdGFydFRpbWUgRW5kVGltZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcHBvaW50bWVudCBvYmplY3QKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICAjIGdldCBjdXJyZW50IHRpY2tldCBhcHBvaW50bWVudCBkYXRhCiAgICBteSAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIHRpY2tldCBhcHBvaW50bWVudCBkb2VzIG5vdCBleGlzdAogICAgaWYgKCAhJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICkgewoKICAgICAgICAjIHJlbW92ZSB0aGUgcmVsYXRpb24gYXMgd2VsbAogICAgICAgICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIG5ldyB0aWNrZXQgYXBwb2ludG1lbnQKICAgICAgICByZXR1cm4gJFNlbGYtPl9UaWNrZXRBcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBsb29wIHByb3RlY3Rpb246IHByZXZlbnQgYXBwb2ludG1lbnQgZXZlbnQgbW9kdWxlIGZyb20gcnVubmluZwogICAgJFNlbGYtPnsnX1RpY2tldEFwcG9pbnRtZW50czo6VGlja2V0VXBkYXRlJ30tPnsgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9IH0rKzsKCiAgICAjIHVwZGF0ZSB0aWNrZXQgYXBwb2ludG1lbnQKICAgIHJldHVybiAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50VXBkYXRlKAogICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VGl0bGV9LAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCA9PiAkUGFyYW17UnVsZUlEfSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxLAogICAgKTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyVGVtcGxhdGVHZW5lcmF0b3I7CiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RSUzo6UGVybDo6VGltZSkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3IgLSBzaWduYXR1cmUgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBzaWduYXR1cmUgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e1JpY2hUZXh0fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0Jyk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBOb3RpZmljYXRpb25FdmVudCgpCgpyZXBsYWNlIGFsbCBPVFJTIHNtYXJ0IHRhZ3MgaW4gdGhlIG5vdGlmaWNhdGlvbiBib2R5IGFuZCBzdWJqZWN0CgogICAgbXkgJU5vdGlmaWNhdGlvbkV2ZW50ID0gJENhbGVuZGFyVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QtPk5vdGlmaWNhdGlvbkV2ZW50KAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMTIzLAogICAgICAgIFJlY2lwaWVudCAgICAgPT4gJFVzZXJEYXRhSGFzaFJlZiwgICAgICAgICAgIyBBZ2VudCBkYXRhIGdldCByZXN1bHQKICAgICAgICBOb3RpZmljYXRpb24gID0+ICROb3RpZmljYXRpb25EYXRhSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgTm90aWZpY2F0aW9uRXZlbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KE5vdGlmaWNhdGlvbiBSZWNpcGllbnQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17Tm90aWZpY2F0aW9ufSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm90aWZpY2F0aW9uIGlzIGludmFsaWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlTm90aWZpY2F0aW9uID0gJXsgJFBhcmFte05vdGlmaWNhdGlvbn0gfTsKCiAgICAjIGdldCBzeXN0ZW0gZGVmYXVsdCBsYW5ndWFnZQogICAgbXkgJERlZmF1bHRMYW5ndWFnZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRGVmYXVsdExhbmd1YWdlJykgfHwgJ2VuJzsKCiAgICBteSAkTGFuZ3VhZ2VzID0gWyAkUGFyYW17UmVjaXBpZW50fS0+e1VzZXJMYW5ndWFnZX0sICREZWZhdWx0TGFuZ3VhZ2UsICdlbicgXTsKCiAgICBteSAkTGFuZ3VhZ2U7CiAgICBMQU5HVUFHRToKICAgIGZvciBteSAkSXRlbSAoIEB7JExhbmd1YWdlc30gKSB7CiAgICAgICAgbmV4dCBMQU5HVUFHRSBpZiAhJEl0ZW07CiAgICAgICAgbmV4dCBMQU5HVUFHRSBpZiAhJE5vdGlmaWNhdGlvbntNZXNzYWdlfS0+eyRJdGVtfTsKCiAgICAgICAgIyBzZXQgbGFuZ3VhZ2UKICAgICAgICAkTGFuZ3VhZ2UgPSAkSXRlbTsKICAgICAgICBsYXN0IExBTkdVQUdFOwogICAgfQoKICAgICMgaWYgbm8gbGFuZ3VhZ2UsIHRoZW4gdGFrZSB0aGUgZmlyc3Qgb25lIGF2YWlsYWJsZQogICAgaWYgKCAhJExhbmd1YWdlICkgewogICAgICAgIG15IEBOb3RpZmljYXRpb25MYW5ndWFnZXMgPSBzb3J0IGtleXMgJXsgJE5vdGlmaWNhdGlvbntNZXNzYWdlfSB9OwogICAgICAgICRMYW5ndWFnZSA9ICROb3RpZmljYXRpb25MYW5ndWFnZXNbMF07CiAgICB9CgogICAgIyBjb3B5IHRoZSBjb3JyZWN0IGxhbmd1YWdlIG1lc3NhZ2UgYXR0cmlidXRlcyB0byBhIGZsYXQgc3RydWN0dXJlCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoU3ViamVjdCBCb2R5IENvbnRlbnRUeXBlKSkgewogICAgICAgICROb3RpZmljYXRpb257JEF0dHJpYnV0ZX0gPSAkTm90aWZpY2F0aW9ue01lc3NhZ2V9LT57JExhbmd1YWdlfS0+eyRBdHRyaWJ1dGV9OwogICAgfQoKICAgIG15ICRTdGFydCA9ICc8JzsKICAgIG15ICRFbmQgICA9ICc+JzsKICAgIGlmICggJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0gPX4gbXt0ZXh0XC9odG1sfSApIHsKICAgICAgICAkU3RhcnQgPSAnJmx0Oyc7CiAgICAgICAgJEVuZCAgID0gJyZndDsnOwogICAgfQoKICAgICMgZ2V0IGh0bWwgdXRpbHMgb2JqZWN0CiAgICBteSAkSFRNTFV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpOwoKICAgICMgZG8gdGV4dC9wbGFpbiB0byB0ZXh0L2h0bWwgY29udmVydAogICAgaWYgKCAkU2VsZi0+e1JpY2hUZXh0fSAmJiAkTm90aWZpY2F0aW9ue0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvcGxhaW4vaSApIHsKICAgICAgICAkTm90aWZpY2F0aW9ue0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICROb3RpZmljYXRpb257Qm9keX0gICAgICAgID0gJEhUTUxVdGlsc09iamVjdC0+VG9IVE1MKAogICAgICAgICAgICBTdHJpbmcgPT4gJE5vdGlmaWNhdGlvbntCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgICMgZG8gdGV4dC9odG1sIHRvIHRleHQvcGxhaW4gY29udmVydAogICAgaWYgKCAhJFNlbGYtPntSaWNoVGV4dH0gJiYgJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0gPX4gL3RleHRcL2h0bWwvaSApIHsKICAgICAgICAkTm90aWZpY2F0aW9ue0NvbnRlbnRUeXBlfSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAkTm90aWZpY2F0aW9ue0JvZHl9ICAgICAgICA9ICRIVE1MVXRpbHNPYmplY3QtPlRvQXNjaWkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkTm90aWZpY2F0aW9ue0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbm90aWZ5IHRleHRzCiAgICBmb3IgbXkgJFRleHQgKHF3KFN1YmplY3QgQm9keSkpIHsKICAgICAgICBpZiAoICEkTm90aWZpY2F0aW9ueyRUZXh0fSApIHsKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbnskVGV4dH0gPSAiTm8gTm90aWZpY2F0aW9uICRUZXh0IGZvciAkUGFyYW17VHlwZX0gZm91bmQhIjsKICAgICAgICB9CiAgICB9CgogICAgIyByZXBsYWNlIHBsYWNlIGhvbGRlciBzdHVmZgogICAgJE5vdGlmaWNhdGlvbntCb2R5fSA9ICRTZWxmLT5fUmVwbGFjZSgKICAgICAgICBSaWNoVGV4dCAgICAgID0+ICRTZWxmLT57UmljaFRleHR9LAogICAgICAgIFRleHQgICAgICAgICAgPT4gJE5vdGlmaWNhdGlvbntCb2R5fSwKICAgICAgICBSZWNpcGllbnQgICAgID0+ICRQYXJhbXtSZWNpcGllbnR9LAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIENhbGVuZGFySUQgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgTGFuZ3VhZ2UgICAgICA9PiAkTGFuZ3VhZ2UsCiAgICApOwoKICAgICROb3RpZmljYXRpb257U3ViamVjdH0gPSAkU2VsZi0+X1JlcGxhY2UoCiAgICAgICAgUmljaFRleHQgICAgICA9PiAwLAogICAgICAgIFRleHQgICAgICAgICAgPT4gJE5vdGlmaWNhdGlvbntTdWJqZWN0fSwKICAgICAgICBSZWNpcGllbnQgICAgID0+ICRQYXJhbXtSZWNpcGllbnR9LAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIENhbGVuZGFySUQgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgTGFuZ3VhZ2UgICAgICA9PiAkTGFuZ3VhZ2UsCiAgICApOwoKICAgICMgYWRkIFVSTHMgYW5kIHZlcmlmeSB0byBiZSBmdWxsIEhUTUwgZG9jdW1lbnQKICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gKSB7CgogICAgICAgICROb3RpZmljYXRpb257Qm9keX0gPSAkSFRNTFV0aWxzT2JqZWN0LT5MaW5rUXVvdGUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkTm90aWZpY2F0aW9ue0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICVOb3RpZmljYXRpb247Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1jdXQKCnN1YiBfUmVwbGFjZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFRleHQgUmljaFRleHQgVXNlcklEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZm9yIG1haWx0byBsaW5rcwogICAgIyBzaW5jZSB0aGUgc3ViamVjdCBhbmQgYm9keSBvZiB0aG9zZSBtYWlsdG8gbGlua3MgYXJlCiAgICAjIHVyaSBlc2NhcGVkIHdlIGhhdmUgdG8gdXJpIHVuZXNjYXBlIHRoZW0sIHJlcGxhY2UKICAgICMgcG9zc2libGUgcGxhY2Vob2xkZXJzIGFuZCB0aGVuIHJlLXVyaSBlc2NhcGUgdGhlbQogICAgJFBhcmFte1RleHR9ID1+IHN7CiAgICAgICAgKGhyZWY9Im1haWx0bzpbXlw/XStcPykoW14iXSsiKQogICAgfQogICAgewogICAgICAgIG15ICRNYWlsVG9IcmVmICAgICAgICA9ICQxOwogICAgICAgIG15ICRNYWlsVG9IcmVmQ29udGVudCA9ICQyOwoKICAgICAgICAkTWFpbFRvSHJlZkNvbnRlbnQgPX4gc3sKICAgICAgICAgICAgKCg/OnN1YmplY3R8Ym9keSk9KSguKz8pKCJ8JikKICAgICAgICB9CiAgICAgICAgewogICAgICAgICAgICBteSAkU3ViamVjdE9yQm9keVByZWZpeCAgPSAkMTsKICAgICAgICAgICAgbXkgJFN1YmplY3RPckJvZHlDb250ZW50ID0gJDI7CiAgICAgICAgICAgIG15ICRTdWJqZWN0T3JCb2R5U3VmZml4ICA9ICQzOwoKICAgICAgICAgICAgbXkgJFN1YmplY3RPckJvZHlDb250ZW50VW5lc2NhcGVkID0gVVJJOjpFc2NhcGU6OnVyaV91bmVzY2FwZSAkU3ViamVjdE9yQm9keUNvbnRlbnQ7CgogICAgICAgICAgICBteSAkU3ViamVjdE9yQm9keUNvbnRlbnRSZXBsYWNlZCA9ICRTZWxmLT5fUmVwbGFjZSgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFRleHQgICAgID0+ICRTdWJqZWN0T3JCb2R5Q29udGVudFVuZXNjYXBlZCwKICAgICAgICAgICAgICAgIFJpY2hUZXh0ID0+IDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkU3ViamVjdE9yQm9keUNvbnRlbnRFc2NhcGVkID0gVVJJOjpFc2NhcGU6OnVyaV9lc2NhcGVfdXRmOCAkU3ViamVjdE9yQm9keUNvbnRlbnRSZXBsYWNlZDsKCiAgICAgICAgICAgICRTdWJqZWN0T3JCb2R5UHJlZml4IC4gJFN1YmplY3RPckJvZHlDb250ZW50RXNjYXBlZCAuICRTdWJqZWN0T3JCb2R5U3VmZml4OwogICAgICAgIH1lZ3g7CgogICAgICAgICRNYWlsVG9IcmVmIC4gJE1haWxUb0hyZWZDb250ZW50OwogICAgfWVneDsKCiAgICBteSAkU3RhcnQgPSAnPCc7CiAgICBteSAkRW5kICAgPSAnPic7CiAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CiAgICAgICAgJFN0YXJ0ID0gJyZsdDsnOwogICAgICAgICRFbmQgICA9ICcmZ3Q7JzsKICAgICAgICAkUGFyYW17VGV4dH0gPX4gcy8oXG58XHIpLy9nOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CiAgICBteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKCiAgICBteSAlQ2FsZW5kYXI7CiAgICBteSAlQXBwb2ludG1lbnQ7CgogICAgaWYgKCAkUGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgKTsKICAgICAgICAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17Q2FsZW5kYXJJRH0gKSB7CiAgICAgICAgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckdldCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHNwZWNpYWwgcmVwbGFjZSBmcm9tIHNlY3JldCBjb25maWcgb3B0aW9ucwogICAgbXkgQFNlY3JldENvbmZpZ09wdGlvbnMgPSBxdygKICAgICAgICBEYXRhYmFzZVB3CiAgICAgICAgU2VhcmNoVXNlclB3CiAgICAgICAgVXNlclB3CiAgICAgICAgU2VuZG1haWxNb2R1bGU6OkF1dGhQYXNzd29yZAogICAgICAgIEF1dGhNb2R1bGU6OlJhZGl1czo6UGFzc3dvcmQKICAgICAgICBQR1A6OktleTo6UGFzc3dvcmQKICAgICAgICBDdXN0b21lcjo6QXV0aE1vZHVsZTo6REI6OkN1c3RvbWVyUGFzc3dvcmQKICAgICAgICBDdXN0b21lcjo6QXV0aE1vZHVsZTo6UmFkaXVzOjpQYXNzd29yZAogICAgICAgIFB1YmxpY0Zyb250ZW5kOjpBdXRoUGFzc3dvcmQKICAgICk7CgogICAgIyByZXBsYWNlIHRoZSBzZWNyZXQgY29uZmlnIG9wdGlvbnMgYmVmb3JlIHRoZSBub3JtYWwgY29uZmlnIG9wdGlvbnMKICAgIGZvciBteSAkU2VjcmV0Q29uZmlnT3B0aW9uIChAU2VjcmV0Q29uZmlnT3B0aW9ucykgewoKICAgICAgICBteSAkVGFnID0gJFN0YXJ0IC4gJ09UUlNfQ09ORklHXycgLiAkU2VjcmV0Q29uZmlnT3B0aW9uIC4gJEVuZDsKICAgICAgICAkUGFyYW17VGV4dH0gPX4gc3skVGFnfXt4eHh9Z3g7CiAgICB9CgogICAgIyByZXBsYWNlIGNvbmZpZyBvcHRpb25zCiAgICBteSAkVGFnID0gJFN0YXJ0IC4gJ09UUlNfQ09ORklHXyc7CiAgICAkUGFyYW17VGV4dH0gPX4gc3skVGFnKC4rPykkRW5kfXskQ29uZmlnT2JqZWN0LT5HZXQoJDEpIC8vICcnfWVneDsKCiAgICAjIGNsZWFudXAKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRUYWcuKz8kRW5kLy0vZ2k7CgogICAgbXkgJVJlY2lwaWVudCA9ICV7ICRQYXJhbXtSZWNpcGllbnR9IHx8IHt9IH07CgogICAgIyBnZXQgdXNlciBvYmplY3QKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICBpZiAoICElUmVjaXBpZW50ICYmICRQYXJhbXtSZWNpcGllbnRJRH0gKSB7CgogICAgICAgICVSZWNpcGllbnQgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1JlY2lwaWVudElEfSwKICAgICAgICAgICAgTm9PdXRPZk9mZmljZSA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgYSBsb2NhbCBoZWxwZXIgb2JqZWN0CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICMgZ2V0IHRpbWV6b25lIG9mZnNldCBmb3IgY3VycmVudCByZWNpcGllbnQKICAgIG15ICRUaW1lem9uZU9mZnNldFJhdyA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgVXNlcklEID0+ICRSZWNpcGllbnR7VXNlcklEfSwKICAgICkgfHwgMDsKCiAgICBteSAkVGltZXpvbmVPZmZzZXQgPSAkVGltZXpvbmVPZmZzZXRSYXcgKiA2MCAqIDYwOwoKICAgICMgaW5zdGFuY2lhdGUgYSBuZXcgbGFuZ3VhZ2Ugb2JqZWN0IHdpdGggdGhlIGdpdmVuIGxhbmd1YWdlCiAgICBteSAkTGFuZ3VhZ2VPYmplY3QgPSBLZXJuZWw6Okxhbmd1YWdlLT5uZXcoCiAgICAgICAgVXNlckxhbmd1YWdlID0+ICRQYXJhbXtMYW5ndWFnZX0gfHwgJ2VuJywKICAgICk7CgogICAgIyBzdXBwb3J0ZWQgYXBwb2ludG1lbnQgZmllbGRzCiAgICBteSAlQXBwb2ludG1lbnRUYWdzU2tpcCA9ICgKICAgICAgICBQYXJlbnRJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlSUQgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZUV4Y2x1ZGUgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tVW5pdENvdW50ICAgICAgICAgICA9PiAxLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVVuaXQgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWUgICAgID0+IDEsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAxLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gMSwKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDEsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICAjIGdldCBhIGxvY2FsIHRpbWUgb2JqZWN0CiAgICBteSAkVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyk7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBwcm9jZXNzIGFwcG9pbnRtZW50CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyByZXBsYWNlIGNvbmZpZyBvcHRpb25zCiAgICAkVGFnID0gJFN0YXJ0IC4gJ09UUlNfQVBQT0lOVE1FTlRfJzsKCiAgICAjIHJlcGxhY2UgYXBwb2ludG1lbnQgdGFncwogICAgQVRUUklCVVRFOgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJUFwcG9pbnRtZW50ICkgewoKICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhJEF0dHJpYnV0ZTsKICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAkQXBwb2ludG1lbnRUYWdzU2tpcHskQXR0cmlidXRlfTsKCiAgICAgICAgIyBzZXR1cCBhIG5ldyB0YWcgZm9yIHRoZSBjdXJyZW50IGF0dHJpYnV0ZQogICAgICAgIG15ICRNYXRjaFRhZyA9ICRUYWcgLiB1YyAkQXR0cmlidXRlOwoKICAgICAgICAjIG1hcCBOb3RpZmljYXRpb25UaW1lIGF0dHJpYnV0ZQogICAgICAgIGlmICggJEF0dHJpYnV0ZSBlcSAnTm90aWZpY2F0aW9uRGF0ZScgKSB7CiAgICAgICAgICAgICRNYXRjaFRhZyA9ICRUYWcgLiAnTk9USUZJQ0FUSU9OVElNRSc7CiAgICAgICAgfQoKICAgICAgICBteSAkUmVwbGFjZW1lbnQgPSAnJzsKCiAgICAgICAgIyBwcm9jZXNzIGRhdGV0aW1lIHN0cmluZ3MgKHRpbWVzdGFtcHMpCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXR0cmlidXRlIGVxICdTdGFydFRpbWUnCiAgICAgICAgICAgIHx8ICRBdHRyaWJ1dGUgZXEgJ0VuZFRpbWUnCiAgICAgICAgICAgIHx8ICRBdHRyaWJ1dGUgZXEgJ05vdGlmaWNhdGlvbkRhdGUnCiAgICAgICAgICAgIHx8ICRBdHRyaWJ1dGUgZXEgJ0NyZWF0ZVRpbWUnCiAgICAgICAgICAgIHx8ICRBdHRyaWJ1dGUgZXEgJ0NoYW5nZVRpbWUnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggISRBcHBvaW50bWVudHskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICctJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGdldCB0aGUgc3lzdGVtIHRpbWUgb2YgdGhlIGdpdmVuIHRpbWVzdGFtcAogICAgICAgICAgICAgICAgbXkgJFRhZ1N5c3RlbVRpbWUgPSAkVGltZU9iamVjdC0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZW5lcmF0ZSBuZXcgdGltZXN0YW1wIHdpdGggdGhlIHJlbGF0ZWQgdGltZXpvbmUgb2Zmc2V0CiAgICAgICAgICAgICAgICBteSAkTmV3VGltZVN0YW1wID0gJFRpbWVPYmplY3QtPlN5c3RlbVRpbWUyVGltZVN0YW1wKAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFRhZ1N5c3RlbVRpbWUgKyAkVGltZXpvbmVPZmZzZXQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICREYXRlRm9ybWF0ID0gJ0RhdGVGb3JtYXQnOwoKICAgICAgICAgICAgICAgICMgRG8gbm90IGluY2x1ZGUgdGltZSBjb21wb25lbnQgZm9yIGFsbC1kYXkgYXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgIyAgIGJ1dCBvbmx5IGZvciBzdGFydCBhbmQgZW5kIGRhdGVzLgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtBbGxEYXl9CiAgICAgICAgICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgICAgICAgICAkQXR0cmlidXRlIGVxICdTdGFydFRpbWUnCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRBdHRyaWJ1dGUgZXEgJ0VuZFRpbWUnCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRGF0ZUZvcm1hdCAuPSAnU2hvcnQnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcHJlcGFyZSBkYXRlcyBhbmQgdGltZXMKICAgICAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICRMYW5ndWFnZU9iamVjdC0+Rm9ybWF0VGltZVN0cmluZyggJE5ld1RpbWVTdGFtcCwgJERhdGVGb3JtYXQgKSB8fCAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBwcm9jZXNzIGNyZWF0ZWJ5IGFuZCBjaGFuZ2VieQogICAgICAgIGVsc2lmICggJEF0dHJpYnV0ZSBlcSAnQ3JlYXRlQnknIHx8ICRBdHRyaWJ1dGUgZXEgJ0NoYW5nZUJ5JyApIHsKCiAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICRVc2VyT2JqZWN0LT5Vc2VyTmFtZSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkQXBwb2ludG1lbnR7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHByb2Nlc3MgdGVhbSBpZHMKICAgICAgICBlbHNpZiAoICRBdHRyaWJ1dGUgZXEgJ1RlYW1JRCcgKSB7CgogICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCAkQXBwb2ludG1lbnR7JEF0dHJpYnV0ZX0gKTsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBuZXh0IEFUVFJJQlVURTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpbnN0YW5jaWF0ZSBhIG5ldyB0ZWFtIG9iamVjdAogICAgICAgICAgICBteSAkVGVhbU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbS0+bmV3KCk7CgogICAgICAgICAgICAjIGdldCBhIGxpc3Qgb2YgYXZhaWxhYmxlIChyZWFkYWJsZSkgdGVhbXMKICAgICAgICAgICAgbXkgJVRlYW1MaXN0ID0gJFRlYW1PYmplY3QtPlRlYW1MaXN0KAogICAgICAgICAgICAgICAgVmFsaWQgID0+IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCBcJVRlYW1MaXN0ICk7CgogICAgICAgICAgICBteSBAVGVhbU5hbWVzOwoKICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVUZWFtTGlzdCApICkgewoKICAgICAgICAgICAgICAgIFRFQU1LRVk6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFRlYW1LZXkgKCBAeyAkQXBwb2ludG1lbnR7JEF0dHJpYnV0ZX0gfSApIHsKCiAgICAgICAgICAgICAgICAgICAgbmV4dCBURUFNS0VZIGlmICEkVGVhbUxpc3R7JFRlYW1LZXl9OwoKICAgICAgICAgICAgICAgICAgICBwdXNoIEBUZWFtTmFtZXMsICRUZWFtTGlzdHskVGVhbUtleX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICFJc0FycmF5UmVmV2l0aERhdGEoIFxAVGVhbU5hbWVzICk7CgogICAgICAgICAgICAjIHJlcGxhY2UgdGVhbSBpZHMgd2l0aCBhIGNvbW1hIHNlcGVyYXRlZCBsaXN0IG9mIHRlYW0gbmFtZXMKICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gam9pbiAnLCAnLCBAVGVhbU5hbWVzOwogICAgICAgIH0KCiAgICAgICAgIyBwcm9jZXNzIHJlc291cmNlIGlkcwogICAgICAgIGVsc2lmICggJEF0dHJpYnV0ZSBlcSAnUmVzb3VyY2VJRCcgKSB7CgogICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCAkQXBwb2ludG1lbnR7JEF0dHJpYnV0ZX0gKTsKCiAgICAgICAgICAgIG15IEBVc2VyTmFtZXM7CgogICAgICAgICAgICBVU0VSSUQ6CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggQHsgJEFwcG9pbnRtZW50eyRBdHRyaWJ1dGV9IH0gKSB7CgogICAgICAgICAgICAgICAgbmV4dCBVU0VSSUQgaWYgISRVc2VySUQ7CgogICAgICAgICAgICAgICAgbXkgJFVzZXJOYW1lID0gJFVzZXJPYmplY3QtPlVzZXJOYW1lKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IFVTRVJJRCBpZiAhJFVzZXJOYW1lOwoKICAgICAgICAgICAgICAgIHB1c2ggQFVzZXJOYW1lcywgJFVzZXJOYW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCBcQFVzZXJOYW1lcyApOwoKICAgICAgICAgICAgIyByZXBsYWNlIHJlc291cmNlIGlkcyB3aXRoIGEgY29tbWEgc2VwZXJhdGVkIGxpc3Qgb2YgdGVhbSBuYW1lcwogICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSBqb2luICcsICcsIEBVc2VyTmFtZXM7CiAgICAgICAgfQoKICAgICAgICAjIHByb2Nlc3MgYWxsIGRheSBhbmQgcmVjdXJyaW5nIHRhZ3MKICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICRBdHRyaWJ1dGUgZXEgJ0FsbERheScKICAgICAgICAgICAgfHwgJEF0dHJpYnV0ZSBlcSAnUmVjdXJyaW5nJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkVHJhbnNsYXRlZFN0cmluZyA9ICRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCdObycpOwoKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICAgICAkVHJhbnNsYXRlZFN0cmluZyA9ICRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCdZZXMnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJFRyYW5zbGF0ZWRTdHJpbmc7CiAgICAgICAgfQoKICAgICAgICAjIHByb2Nlc3MgYWxsIG90aGVyIHNpbmdsZSB2YWx1ZXMKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKCAhJEFwcG9pbnRtZW50eyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJy0nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJEFwcG9pbnRtZW50eyRBdHRyaWJ1dGV9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkUmVwbGFjZW1lbnQgfHw9ICcnOwoKICAgICAgICAjIHJlcGxhY2UgdGhlIHRhZ3MKICAgICAgICAkUGFyYW17VGV4dH0gPX4gc3skTWF0Y2hUYWckRW5kfXskUmVwbGFjZW1lbnR9ZWd4OwogICAgfQoKICAgICMgY2xlYW51cAogICAgJFBhcmFte1RleHR9ID1+IHMvJFRhZy4rPyRFbmQvLS9naTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHByb2Nlc3MgY2FsZW5kYXIKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAjIHJlcGxhY2UgY29uZmlnIG9wdGlvbnMKICAgICRUYWcgPSAkU3RhcnQgLiAnT1RSU19DQUxFTkRBUl8nOwoKICAgICMgcmVwbGFjZSBhcHBvaW50bWVudCB0YWdzCiAgICBBVFRSSUJVVEU6CiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAlQ2FsZW5kYXIgKSB7CgogICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkQXR0cmlidXRlOwoKICAgICAgICAjIHNldHVwIGEgbmV3IHRhZyBmb3IgdGhlIGN1cnJlbnQgYXR0cmlidXRlCiAgICAgICAgbXkgJE1hdGNoVGFnID0gJFRhZyAuIHVjICRBdHRyaWJ1dGU7CgogICAgICAgIG15ICRSZXBsYWNlbWVudCA9ICcnOwoKICAgICAgICAjIHByb2Nlc3MgZGF0ZXRpbWUgc3RyaW5ncyAodGltZXN0YW1wcykKICAgICAgICBpZiAoICRBdHRyaWJ1dGUgZXEgJ0NyZWF0ZVRpbWUnIHx8ICRBdHRyaWJ1dGUgZXEgJ0NoYW5nZVRpbWUnICkgewoKICAgICAgICAgICAgIyBnZXQgdGhlIHN5c3RlbSB0aW1lIG9mIHRoZSBnaXZlbiB0aW1lc3RhbXAKICAgICAgICAgICAgbXkgJFRhZ1N5c3RlbVRpbWUgPSAkVGltZU9iamVjdC0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJENhbGVuZGFyeyRBdHRyaWJ1dGV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZW5lcmF0ZSBuZXcgdGltZXN0YW1wIHdpdGggdGhlIHJlbGF0ZWQgdGltZXpvbmUgb2Zmc2V0CiAgICAgICAgICAgIG15ICROZXdUaW1lU3RhbXAgPSAkVGltZU9iamVjdC0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRUYWdTeXN0ZW1UaW1lICsgJFRpbWV6b25lT2Zmc2V0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBwcmVwYXJlIGRhdGVzIGFuZCB0aW1lcwogICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAkTGFuZ3VhZ2VPYmplY3QtPkZvcm1hdFRpbWVTdHJpbmcoICROZXdUaW1lU3RhbXAsICdEYXRlRm9ybWF0JyApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBwcm9jZXNzIGNyZWF0ZWJ5IGFuZCBjaGFuZ2VieQogICAgICAgIGVsc2lmICggJEF0dHJpYnV0ZSBlcSAnQ3JlYXRlQnknIHx8ICRBdHRyaWJ1dGUgZXEgJ0NoYW5nZUJ5JyApIHsKCiAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICRVc2VyT2JqZWN0LT5Vc2VyTmFtZSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkQ2FsZW5kYXJ7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHByb2Nlc3MgZ3JvdXAgaWQKICAgICAgICBlbHNpZiAoICRBdHRyaWJ1dGUgZXEgJ0dyb3VwSUQnICkgewogICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRDYWxlbmRhcnskQXR0cmlidXRlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJvY2VzcyB2YWxpZCBpZAogICAgICAgIGVsc2lmICggJEF0dHJpYnV0ZSBlcSAnVmFsaWRJRCcgKSB7CgogICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMb29rdXAoCiAgICAgICAgICAgICAgICBWYWxpZElEID0+ICRDYWxlbmRhcnskQXR0cmlidXRlfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJExhbmd1YWdlT2JqZWN0LT5UcmFuc2xhdGUoJFJlcGxhY2VtZW50KTsKICAgICAgICB9CgogICAgICAgICMgcHJvY2VzcyBhbGwgb3RoZXIgc2luZ2xlIHZhbHVlcwogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoICEkQ2FsZW5kYXJ7JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAnLSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAkQ2FsZW5kYXJ7JEF0dHJpYnV0ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVwbGFjZSB0aGUgdGFncwogICAgICAgICRQYXJhbXtUZXh0fSA9fiBzeyRNYXRjaFRhZyRFbmR9eyRSZXBsYWNlbWVudH1lZ3g7CiAgICB9CgogICAgIyBjbGVhbnVwCiAgICAkUGFyYW17VGV4dH0gPX4gcy8kVGFnLis/JEVuZC8tL2dpOwoKICAgIG15ICRIYXNoR2xvYmFsUmVwbGFjZSA9IHN1YiB7CiAgICAgICAgbXkgKCAkVGFnLCAlSCApID0gQF87CgogICAgICAgICMgR2VuZXJhdGUgb25lIHNpbmdsZSBtYXRjaGluZyBzdHJpbmcgZm9yIGFsbCBrZXlzIHRvIHNhdmUgcGVyZm9ybWFuY2UuCiAgICAgICAgbXkgJEtleXMgPSBqb2luICd8JywgbWFwIHtxdW90ZW1ldGF9IGdyZXAgeyBkZWZpbmVkICRIeyRffSB9IGtleXMgJUg7CgogICAgICAgICMgQWRkIGFsbCBrZXlzIGFsc28gYXMgbG93ZXJjYXNlIHRvIGJlIGFibGUgdG8gbWF0Y2ggY2FzZSBpbnNlbnNpdGl2ZSwKICAgICAgICAjICAgZS4gZy4gPE9UUlNfQ1VTVE9NRVJfRnJvbT4gYW5kIDxPVFJTX0NVU1RPTUVSX0ZST00+LgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVIICkgewogICAgICAgICAgICAkSHsgbGMgJEtleSB9ID0gJEh7JEtleX07CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17VGV4dH0gPX4gcy8oPzokVGFnKSgkS2V5cykkRW5kLyRIeyBsYyAkMSB9L2llZzsKICAgIH07CgogICAgIyBnZXQgcmVjaXBpZW50IGRhdGEgYW5kIHJlcGxhY2UgaXQgd2l0aCA8T1RSU18uLi4KICAgICRUYWcgPSAkU3RhcnQgLiAnT1RSU18nOwoKICAgICMgaW5jbHVkZSBtb3JlIHJlYWRhYmxlIHRhZyA8T1RSU19OT1RJRklDQVRJT05fUkVDSVBJRU5UCiAgICBteSAkUmVjaXBpZW50VGFnID0gJFN0YXJ0IC4gJ09UUlNfTk9USUZJQ0FUSU9OX1JFQ0lQSUVOVF8nOwoKICAgIGlmICglUmVjaXBpZW50KSB7CgogICAgICAgICMgSFRNTCBxdW90aW5nIG9mIGNvbnRlbnQKICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgIEFUVFJJQlVURToKICAgICAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJVJlY2lwaWVudCApIHsKICAgICAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkUmVjaXBpZW50eyRBdHRyaWJ1dGV9OwogICAgICAgICAgICAgICAgJFJlY2lwaWVudHskQXR0cmlidXRlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUmVjaXBpZW50eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEhhc2hHbG9iYWxSZXBsYWNlLT4oICIkVGFnfCRSZWNpcGllbnRUYWciLCAlUmVjaXBpZW50ICk7CiAgICB9CgogICAgIyBjbGVhbnVwCiAgICAkUGFyYW17VGV4dH0gPX4gcy8kUmVjaXBpZW50VGFnLis/JEVuZC8tL2dpOwoKICAgIHJldHVybiAkUGFyYW17VGV4dH07Cn0KCjE7Cgo9ZW5kIEludGVybmFsOgoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VHJhbnNwb3J0OjpFbWFpbDsKIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpQZXJsOjpMYXlvdXRPYmplY3QpCiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RSUzo6UGVybDo6UGFyYW1PYmplY3QpCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7Cgp1c2UgYmFzZSBxdyhLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV2ZW50OjpUcmFuc3BvcnQ6OkJhc2UpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV2ZW50OjpUcmFuc3BvcnQ6OkVtYWlsIC0gZW1haWwgdHJhbnNwb3J0IGxheWVyIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zCgo9aGVhZDEgU1lOT1BTSVMKCk5vdGlmaWNhdGlvbiBldmVudCB0cmFuc3BvcnQgbGF5ZXIuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG5vdGlmaWNhdGlvbiB0cmFuc3BvcnQgb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoJycpOwogICAgbXkgJFRyYW5zcG9ydE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXZlbnQ6OlRyYW5zcG9ydDo6RW1haWwnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgU2VuZE5vdGlmaWNhdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVXNlcklEIE5vdGlmaWNhdGlvbiBSZWNpcGllbnQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCAkTmVlZGVkIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjbGVhbnVwIGV2ZW50IGRhdGEKICAgICRTZWxmLT57RXZlbnREYXRhfSA9IHVuZGVmOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkU3lzdGVtQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdldCByZWNpcGllbnQgZGF0YQogICAgbXkgJVJlY2lwaWVudCA9ICV7ICRQYXJhbXtSZWNpcGllbnR9IH07CgogICAgcmV0dXJuIGlmICEkUmVjaXBpZW50e1VzZXJFbWFpbH07CiAgICByZXR1cm4gaWYgJFJlY2lwaWVudHtVc2VyRW1haWx9ICF+IC9ALzsKCiAgICBteSAkSXNMb2NhbEFkZHJlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgQWRkcmVzcyA9PiAkUmVjaXBpZW50e1VzZXJFbWFpbH0sCiAgICApOwoKICAgIHJldHVybiBpZiAkSXNMb2NhbEFkZHJlc3M7CgogICAgIyBjcmVhdGUgbmV3IGFycmF5IHRvIHByZXZlbnQgYXR0YWNobWVudCBncm93dGggKHNlZSBidWcjNTExNCkKICAgIG15IEBBdHRhY2htZW50czsKCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0F0dGFjaG1lbnRzfSApICkgewogICAgICAgIEBBdHRhY2htZW50cyA9IEB7ICRQYXJhbXtBdHRhY2htZW50c30gfTsKICAgIH0KCiAgICBteSAlTm90aWZpY2F0aW9uID0gJXsgJFBhcmFte05vdGlmaWNhdGlvbn0gfTsKCiAgICAjIHNlbmQgbm90aWZpY2F0aW9uCiAgICBteSAkRnJvbSA9ICRDb25maWdPYmplY3QtPkdldCgnTm90aWZpY2F0aW9uU2VuZGVyTmFtZScpIC4gJyA8JwogICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdOb3RpZmljYXRpb25TZW5kZXJFbWFpbCcpIC4gJz4nOwoKICAgIGlmICggJFBhcmFte05vdGlmaWNhdGlvbn0tPntDb250ZW50VHlwZX0gJiYgJFBhcmFte05vdGlmaWNhdGlvbn0tPntDb250ZW50VHlwZX0gZXEgJ3RleHQvaHRtbCcgKSB7CgogICAgICAgICMgR2V0IGNvbmZpZ3VyZWQgdGVtcGxhdGUgd2l0aCBmYWxsYmFjayB0byBEZWZhdWx0LgogICAgICAgIG15ICRFbWFpbFRlbXBsYXRlID0gJFBhcmFte05vdGlmaWNhdGlvbn0tPntEYXRhfS0+e1RyYW5zcG9ydEVtYWlsVGVtcGxhdGV9LT5bMF0gfHwgJ0RlZmF1bHQnOwoKICAgICAgICBteSAkSG9tZSAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0hvbWUnKTsKICAgICAgICBteSAkVGVtcGxhdGVEaXIgICAgICAgPSAiJEhvbWUvS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9Ob3RpZmljYXRpb25FdmVudC9FbWFpbCI7CiAgICAgICAgbXkgJEN1c3RvbVRlbXBsYXRlRGlyID0gIiRIb21lL0N1c3RvbS9LZXJuZWwvT3V0cHV0L0hUTUwvVGVtcGxhdGVzL1N0YW5kYXJkL05vdGlmaWNhdGlvbkV2ZW50L0VtYWlsIjsKCiAgICAgICAgaWYgKCAhLXIgIiRUZW1wbGF0ZURpci8kRW1haWxUZW1wbGF0ZS50dCIgJiYgIS1yICIkQ3VzdG9tVGVtcGxhdGVEaXIvJEVtYWlsVGVtcGxhdGUudHQiICkgewogICAgICAgICAgICAkRW1haWxUZW1wbGF0ZSA9ICdEZWZhdWx0JzsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgSFRNTAogICAgICAgICROb3RpZmljYXRpb257Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAiTm90aWZpY2F0aW9uRXZlbnQvRW1haWwvJEVtYWlsVGVtcGxhdGUiLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgQm9keSAgICA9PiAkTm90aWZpY2F0aW9ue0JvZHl9LAogICAgICAgICAgICAgICAgU3ViamVjdCA9PiAkTm90aWZpY2F0aW9ue1N1YmplY3R9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRFbWFpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbCcpOwoKICAgICMgc2VuZCBub3RpZmljYXRpb24KICAgIG15ICRTZW50ID0gJEVtYWlsT2JqZWN0LT5TZW5kKAogICAgICAgIEZyb20gICAgICAgPT4gJEZyb20sCiAgICAgICAgVG8gICAgICAgICA9PiAkUmVjaXBpZW50e1VzZXJFbWFpbH0sCiAgICAgICAgU3ViamVjdCAgICA9PiAkTm90aWZpY2F0aW9ue1N1YmplY3R9LAogICAgICAgIE1pbWVUeXBlICAgPT4gJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0sCiAgICAgICAgVHlwZSAgICAgICA9PiAkTm90aWZpY2F0aW9ue0NvbnRlbnRUeXBlfSwKICAgICAgICBDaGFyc2V0ICAgID0+ICd1dGYtOCcsCiAgICAgICAgQm9keSAgICAgICA9PiAkTm90aWZpY2F0aW9ue0JvZHl9LAogICAgICAgIExvb3AgICAgICAgPT4gMSwKICAgICAgICBBdHRhY2htZW50ID0+ICRQYXJhbXtBdHRhY2htZW50c30gfHwgW10sCiAgICApOwoKICAgIGlmICggISRTZW50ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiJyROb3RpZmljYXRpb257TmFtZX0nIG5vdGlmaWNhdGlvbiBjb3VsZCBub3QgYmUgc2VudCB0byBhZ2VudCAnJFJlY2lwaWVudHtVc2VyRW1haWx9ICIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9nIGV2ZW50CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgTWVzc2FnZSAgPT4gIlNlbnQgYWdlbnQgJyROb3RpZmljYXRpb257TmFtZX0nIG5vdGlmaWNhdGlvbiB0byAnJFJlY2lwaWVudHtVc2VyRW1haWx9Jy4iLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIEdldFRyYW5zcG9ydFJlY2lwaWVudHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoTm90aWZpY2F0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIG15IEBSZWNpcGllbnRzOwoKICAgICMgZ2V0IHJlY2lwaWVudHMgYnkgUmVjaXBpZW50RW1haWwKICAgIGlmICggJFBhcmFte05vdGlmaWNhdGlvbn0tPntEYXRhfS0+e1JlY2lwaWVudEVtYWlsfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtOb3RpZmljYXRpb259LT57RGF0YX0tPntSZWNpcGllbnRFbWFpbH0tPlswXSApIHsKICAgICAgICAgICAgbXkgJVJlY2lwaWVudDsKICAgICAgICAgICAgJFJlY2lwaWVudHtSZWFsbmFtZX0gID0gJyc7CiAgICAgICAgICAgICRSZWNpcGllbnR7VHlwZX0gICAgICA9ICdDdXN0b21lcic7CiAgICAgICAgICAgICRSZWNpcGllbnR7VXNlckVtYWlsfSA9ICRQYXJhbXtOb3RpZmljYXRpb259LT57RGF0YX0tPntSZWNpcGllbnRFbWFpbH0tPlswXTsKCiAgICAgICAgICAgICMgY2hlY2sgcmVjaXBpZW50cwogICAgICAgICAgICBpZiAoICRSZWNpcGllbnR7VXNlckVtYWlsfSAmJiAkUmVjaXBpZW50e1VzZXJFbWFpbH0gPX4gL0AvICkgewogICAgICAgICAgICAgICAgcHVzaCBAUmVjaXBpZW50cywgXCVSZWNpcGllbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBSZWNpcGllbnRzOwp9CgpzdWIgVHJhbnNwb3J0U2V0dGluZ3NEaXNwbGF5R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKHF3KFJlY2lwaWVudEVtYWlsKSkgewogICAgICAgIG5leHQgS0VZIGlmICEkUGFyYW17RGF0YX0tPnskS2V5fTsKICAgICAgICBuZXh0IEtFWSBpZiAhZGVmaW5lZCAkUGFyYW17RGF0YX0tPnskS2V5fS0+WzBdOwogICAgICAgICRQYXJhbXskS2V5fSA9ICRQYXJhbXtEYXRhfS0+eyRLZXl9LT5bMF07CiAgICB9CgogICAgbXkgJEhvbWUgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdIb21lJyk7CiAgICBteSAkVGVtcGxhdGVEaXIgICAgICAgPSAiJEhvbWUvS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9Ob3RpZmljYXRpb25FdmVudC9FbWFpbCI7CiAgICBteSAkQ3VzdG9tVGVtcGxhdGVEaXIgPSAiJEhvbWUvQ3VzdG9tL0tlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvTm90aWZpY2F0aW9uRXZlbnQvRW1haWwiOwoKICAgIG15IEBGaWxlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkRpcmVjdG9yeVJlYWQoCiAgICAgICAgRGlyZWN0b3J5ID0+ICRUZW1wbGF0ZURpciwKICAgICAgICBGaWx0ZXIgICAgPT4gJyoudHQnLAogICAgKTsKICAgIGlmICggLWQgJEN1c3RvbVRlbXBsYXRlRGlyICkgewogICAgICAgIHB1c2ggQEZpbGVzLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5EaXJlY3RvcnlSZWFkKAogICAgICAgICAgICBEaXJlY3RvcnkgPT4gJEN1c3RvbVRlbXBsYXRlRGlyLAogICAgICAgICAgICBGaWx0ZXIgICAgPT4gJyoudHQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBmb3IgZGVkdXBsaWNhdGlvbgogICAgbXkgJVRlbXBsYXRlczsKCiAgICBmb3IgbXkgJEZpbGUgKEBGaWxlcykgewogICAgICAgICRGaWxlID1+IHN7Xi4qLyhbXi9dKylcLnR0fXskMX1zbXhnOwogICAgICAgICRUZW1wbGF0ZXN7JEZpbGV9ID0gJEZpbGU7CiAgICB9CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkUGFyYW17VHJhbnNwb3J0RW1haWxUZW1wbGF0ZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgPT4gXCVUZW1wbGF0ZXMsCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RyYW5zcG9ydEVtYWlsVGVtcGxhdGUnLAogICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte0RhdGF9LT57VHJhbnNwb3J0RW1haWxUZW1wbGF0ZX0sCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgZ2VuZXJhdGUgSFRNTAogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudFRyYW5zcG9ydEVtYWlsU2V0dGluZ3MnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIFRyYW5zcG9ydFBhcmFtU2V0dGluZ3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoR2V0UGFyYW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgUEFSQU1FVEVSOgogICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KFJlY2lwaWVudEVtYWlsIE5vdGlmaWNhdGlvbkFydGljbGVUeXBlSUQgVHJhbnNwb3J0RW1haWxUZW1wbGF0ZSkpIHsKICAgICAgICBteSBARGF0YSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICBuZXh0IFBBUkFNRVRFUiBpZiAhQERhdGE7CiAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+e0RhdGF9LT57JFBhcmFtZXRlcn0gPSBcQERhdGE7CiAgICB9CgogICAgIyBOb3RlOiBFeGFtcGxlIGhvdyB0byBzZXQgZXJyb3JzIGFuZCB1c2UgdGhlbQogICAgIyBvbiB0aGUgbm9ybWFsIEFkbWluTm90aWZpY2F0aW9uRXZlbnQgc2NyZWVuCiAgICAjICMgc2V0IGVycm9yCiAgICAjICRQYXJhbXtHZXRQYXJhbX0tPnskUGFyYW1ldGVyLidTZXJ2ZXJFcnJvcid9ID0gJ1NlcnZlckVycm9yJzsKCiAgICByZXR1cm4gMTsKfQoKc3ViIElzVXNhYmxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWZpbmUgaWYgdGhpcyB0cmFuc3BvcnQgaXMgdXNhYmxlIG9uCiAgICAjIHRoaXMgc3BlY2lmaWMgbW9tZW50CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VHJhbnNwb3J0OjpCYXNlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6Ok5vdGlmaWNhdGlvbkV2ZW50OjpUcmFuc3BvcnQ6OkJhc2UgLSBjb21tb24gbm90aWZpY2F0aW9uIGV2ZW50IHRyYW5zcG9ydCBmdW5jdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIFNlbmROb3RpZmljYXRpb24oKQoKc2VuZCBhIG5vdGlmaWNhdGlvbiB1c2luZyBhbiBzcGVjaWZpZWQgdHJhbnNwb3J0CgogICAgbXkgJFN1Y2Nlc3MgPSAkVHJhbnNwb3J0T2JqZWN0LT5TZW5kTm90aWZpY2F0aW9uKAogICAgICAgIFRpY2tldElEICAgICA9PiAkUGFyYW17RGF0YX0tPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIE5vdGlmaWNhdGlvbiA9PiBcJU5vdGlmaWNhdGlvbiwKICAgICAgICBSZWNpcGllbnQgICAgPT4gewogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEyMywKICAgICAgICAgICAgVXNlckxvZ2luICAgICA9PiAnc29tZSBsb2dpbicsCiAgICAgICAgICAgIFVzZXJUaXRsZSAgICAgPT4gJ3NvbWUgdGl0bGUnLAogICAgICAgICAgICBVc2VyRmlyc3RuYW1lID0+ICdzb21lIGZpcnN0IG5hbWUnLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdzb21lIGxhc3QgbmFtZScuCiAgICAgICAgICAgICMgLi4uCiAgICAgICAgfSwKICAgICAgICBFdmVudCAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0V2ZW50fSwKICAgICAgICBBdHRhY2htZW50cyAgICAgICAgICAgPT4gXEBBdHRhY2htZW50cywgICAgICAgICAjIG9wdGlvbmFsCiAgICApOwoKcmV0dXJucwoKICAgICRTdWNjZXNzID0gMTsgICAgICAgIyBvciBmYWxzZSBpbiBjYXNlIG9mIGFuIGVycm9yCgo9Y3V0Cgo9aXRlbSBHZXRUcmFuc3BvcnRSZWNpcGllbnRzKCkKCmdlbmVyYXRlcyBhIGxpc3Qgb2YgcmVjaXBpZW50cyBleGNsdXNpdmUgZm9yIGEgZGV0ZXJtaW5lZCB0cmFuc3BvcnQsIHRoZSBjb250ZW50IG9mIHRoZSBsaXN0IGlzCnVzdWFsbHkgYW4gYXR0cmlidXRlIG9mIGFuIEFnZW50IG9yIEN1c3RvbWVyIGFuZCBpdCBkZXBlbmRzIG9uIGVhY2ggdHJhbnNwb3J0CgogICAgbXkgQFRyYW5zcG9ydFJlY2lwaWVudHMgPSAkVHJhbnNwb3J0T2JqZWN0LT5HZXRUcmFuc3BvcnRSZWNpcGllbnRzKAogICAgICAgIE5vdGlmaWNhdGlvbiA9PiBcJU5vdGlmaWNhdGlvbiwKICAgICk7CgpyZXR1cm5zOgoKICAgIEBUcmFuc3BvcnRSZWNpcGVudHMgPSAoCiAgICAgICAgewogICAgICAgICAgICBVc2VyRW1haWwgICAgPT4gJ3NvbWUgZW1haWwnLCAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgICAgIFVzZXJGaXNybmFtZSA9PiAnc29tZSBuYW1lJywgICAgICAgICMgb3B0aW9uYWwKICAgICAgICAgICAgIyAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbAogICAgICAgIH0KICAgICk7CgpvcgogICAgQFRyYW5zcG9ydFJlY2lwaWVudHMgPSB1bmRlZjsgICBpbiBjYXNlIG9mIGFuIGVycm9yCgo9Y3V0Cgo9aXRlbSBUcmFuc3BvcnRTZXR0aW5nc0Rpc3BsYXlHZXQoKQoKZ2VuZXJhdGVzIGFuZCByZXR1cm5zIHRoZSBIVE1MIGNvZGUgdG8gZGlzcGxheSBleGNsdXNpdmUgc2V0dGluZ3MgZm9yIGVhY2ggdHJhbnNwb3J0LgoKICAgIG15ICRIVE1MT3V0cHV0ID0gJFRyYW5zcG9ydE9iamVjdC0+VHJhbnNwb3J0U2V0dGluZ3NEaXNwbGF5R2V0KAogICAgICAgIERhdGEgPT4gJE5vdGlmaWNhdGlvbkRhdGFBdHRyaWJ1dGUsICAgICAgICAgICAjIGFzIHJldHJpZXZlZCBmcm9tIEtlcm5lbDo6U3lzdGVtOjpOb3RpZmljYXRpb25FdmVudDo6Tm90aWZpY2F0aW9uR2V0KCkKICAgICk7CgpyZXR1cm5zCgogICAgJEhUTUxPdXB1dCA9ICdzb21lIEhUTUwgY29kZSc7Cgo9Y3V0Cgo9aXRlbSBUcmFuc3BvcnRQYXJhbVNldHRpbmdzR2V0KCkKCmdldHMgc3BlY2lmaWMgcGFyYW1ldGVycyBmcm9tIHRoZSB3ZWIgcmVxdWVzdCBhbmQgcHV0IHRoZW0gYmFjayBpbiB0aGUgR2V0UGFyYW0gYXR0cmlidXRlIHRvIGJlCnNhdmVkIGluIHRoZSBub3RpZmljYXRpb24gYXMgdGhlIHN0YW5kYXJkIHBhcmFtZXRlcnMKCiAgICBteSAkU3VjY2VzcyA9ICRUcmFuc3BvcnRPYmplY3QtPlRyYW5zcG9ydFBhcmFtU2V0dGluZ3NHZXQoCiAgICAgICAgR2V0UGFyYW0gPT4gJFBhcm1IYXNoUmVmLAogICAgKTsKCnJldHVybnMKCiAgICAkU3VjY2VzcyA9IDE7ICAgICAgICMgb3IgZmFsc2UgaW4gY2FzZSBvZiBhIGZhaWx1cmUKCj1jdXQKCj1pdGVtIElzVXNhYmxlKCk7CgpyZXR1cm5zIGlmIHRoZSB0cmFuc3BvcnQgY2FuIGJlIHVzZWQgaW4gdGhlIHN5c3RlbSBlbnZpcm9ubWVudCwKCiAgICBteSAkU3VjY2VzcyA9ICRUcmFuc3BvcnRPYmplY3QtPklzVXNhYmxlKCk7CgpyZXR1cm5zCgogICAgJFN1Y2Nlc3MgPSAxOyAgICAgICAjIG9yIGZhbHNlCgo9Y3V0Cgo9aXRlbSBHZXRUcmFuc3BvcnRFdmVudERhdGEoKQoKcmV0dXJucyB0aGUgbmVlZGVkIGV2ZW50IGluZm9ybWF0aW9uIGFmdGVyIGEgbm90aWZpY2F0aW9uIGhhcyBiZWVuIHNlbnQKCiAgICBteSAkRXZlbnREYXRhID0gJFRyYW5zcG9ydE9iamVjdC0+IEdldFRyYW5zcG9ydEV2ZW50RGF0YSgpOwoKcmV0dXJuczoKCiAgICAkRXZlbnREYXRhID0gewogICAgICAgIEV2ZW50ID0+ICdBcnRpY2xlQWdlbnROb3RpZmljYXRpb24nLCAgICAjIG9yICdBcnRpY2xlQ3VzdG9tZXJOb3RpZmljYXRpb24nCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBUaWNrZXRJRCAgPT4gMTIzLAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gMTIzLCAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBHZXRUcmFuc3BvcnRFdmVudERhdGEgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPntFdmVudERhdGF9IC8vIHt9Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBEaWdlc3Q6Ok1ENTsKCnVzZSB2YXJzIHF3KEBJU0EpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcjsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U2NoZWR1bGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQgLSBjYWxlbmRhciBhcHBvaW50bWVudCBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGFwcG9pbnRtZW50IGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIEBJU0EgPSBxdygKICAgICAgICBLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyCiAgICApOwoKICAgICMgaW5pdCBvZiBldmVudCBoYW5kbGVyCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVySW5pdCgKICAgICAgICBDb25maWcgPT4gJ0FwcG9pbnRtZW50Q2FsZW5kYXI6OkV2ZW50TW9kdWxlUG9zdCcsCiAgICApOwoKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdBcHBvaW50bWVudCc7CiAgICAkU2VsZi0+e0NhY2hlVFRMfSAgPSA2MCAqIDYwICogMjQgKiAyMDsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEFwcG9pbnRtZW50Q3JlYXRlKCkKCmNyZWF0ZXMgYSBuZXcgYXBwb2ludG1lbnQuCgogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgIFBhcmVudElEICAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSB2YWxpZCBQYXJlbnRJRCBmb3IgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwogICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSB2YWxpZCBDYWxlbmRhcklECiAgICAgICAgVW5pcXVlSUQgICAgICAgICAgICAgID0+ICdqd2lvamktZndqaW8nLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIHByb3ZpZGUgZGVzaXJlZCBVbmlxdWVJRDsgaWYgdGhlcmUgaXMgYWxyZWFkeSBleGlzdGluZyBBcHBvaW50bWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICB3aXRoIHNhbWUgVW5pcXVlSUQsIHN5c3RlbSB3aWxsIGRlbGV0ZSBpdAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICA9PiAnV2ViaW5hcicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBUaXRsZQogICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLCAgICAgICAgICMgKG9wdGlvbmFsKSBEZXNjcmlwdGlvbgogICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICA9PiAnU3RyYXViaW5nJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBMb2NhdGlvbgogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIEFsbERheSAgICAgICAgICAgICAgICA9PiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAKICAgICAgICBUZWFtSUQgICAgICAgICAgICAgICAgPT4gWyAxIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgaWYgc3VwcGxpZWQKICAgICAgICBSZXNvdXJjZUlEICAgICAgICAgICAgPT4gWyAxLCAzIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgaWYgc3VwcGxpZWQKICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZmxhZyB0aGUgYXBwb2ludG1lbnQgYXMgcmVjdXJyaW5nIChwYXJlbnQgb25seSEpCiAgICAgICAgUmVjdXJyaW5nUmF3ICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIHNraXAgbG9vcCBmb3IgcmVjdXJyaW5nIGFwcG9pbnRtZW50cyAoZG8gbm90IGNyZWF0ZSBvY2N1cnJlbmNlcyEpCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICAgID0+ICdEYWlseScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQgaWYgUmVjdXJyaW5nKSBQb3NzaWJsZSAiRGFpbHkiLCAiV2Vla2x5IiwgIk1vbnRobHkiLCAiWWVhcmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAiQ3VzdG9tV2Vla2x5IiwgIkN1c3RvbU1vbnRobHkiLCAiQ3VzdG9tWWVhcmx5IgoKICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ICAgPT4gWzEsIDMsIDVdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCBpZiBDdXN0b20gUmVjdXJyaW5nKSBSZWN1cnJlbmNlIHBhdHRlcm4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICBmb3IgQ3VzdG9tV2Vla2x5OiAxLU1vbiwgMi1UdWUsLi4uLCA3LVN1bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgIGZvciBDdXN0b21Nb250aGx5OiAxLTFzdCwgMi0ybmQsLi4sIDMxdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICBmb3IgQ3VzdG9tWWVhcmx5OiAxLUphbiwgMi1GZWIsLi4uLCAxMi1EZWMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIC4uLgogICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBIb3cgbWFueSBBcHBvaW50bWVudHMgdG8gY3JlYXRlCiAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICAgID0+IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFJlcGVhdGluZyBpbnRlcnZhbCAoZGVmYXVsdCAxKQogICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICAgICA9PiAnMjAxNi0wMS0xMCAwMDowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBVbnRpbCBkYXRlCiAgICAgICAgUmVjdXJyZW5jZUlEICAgICAgICAgID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEV4cGVjdGVkIHN0YXJ0IHRpbWUgZm9yIHRoaXMgb2NjdXJyZW5jZQogICAgICAgIFJlY3VycmVuY2VFeGNsdWRlICAgICA9PiBbICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBXaGljaCBzcGVjaWZpYyBvY2N1cnJlbmNlcyB0byBleGNsdWRlCiAgICAgICAgICAgICcyMDE2LTAxLTEwIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMTYtMDEtMTEgMDA6MDA6MDAnLAogICAgICAgIF0sCiAgICAgICAgTm90aWZpY2F0aW9uVGltZSAgICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFBvaW50IG9mIHRpbWUgdG8gZXhlY3V0ZSB0aGUgbm90aWZpY2F0aW9uIGV2ZW50CiAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgID0+ICdDdXN0b20nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRlbXBsYXRlIHRvIGJlIHVzZWQgZm9yIG5vdGlmaWNhdGlvbiBwb2ludCBvZiB0aW1lCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgID0+ICdyZWxhdGl2ZScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFR5cGUgb2YgdGhlIGN1c3RvbSB0ZW1wbGF0ZSBub3RpZmljYXRpb24gcG9pbnQgb2YgdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAicmVsYXRpdmUiLCAiZGF0ZXRpbWUiCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAnMTInLCAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG1pbnV0ZXMsIGhvdXJzIG9yIGRheXMgY291bnQgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLCAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIHVuaXQgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiBleGVjdXRlIGZvciBjdXN0b20gdGVtcGxhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIFBvc3NpYmxlICJiZWZvcmVzdGFydCIsICJhZnRlcnN0YXJ0IiwgImJlZm9yZWVuZCIsICJhZnRlcmVuZCIKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsICAgICAgICAgICAgICAjIChvcHRpb25hbCkgTm90aWZpY2F0aW9uIGRhdGUgdGltZSBmb3IgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywgIyAob3B0aW9uYWwpIFRpY2tldCBhcHBvaW50bWVudCBydWxlIElEIChmb3IgdGlja2V0IGFwcG9pbnRtZW50cyBvbmx5ISkKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVXNlcklECiAgICApOwoKcmV0dXJucyBwYXJlbnQgQXBwb2ludG1lbnRJRCBpZiBzdWNjZXNzZnVsCgpFdmVudHM6CiAgICBBcHBvaW50bWVudENyZWF0ZQoKPWN1dAoKc3ViIEFwcG9pbnRtZW50Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFRpdGxlIFN0YXJ0VGltZSBFbmRUaW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgcG9zc2libGUgbm90aWZpY2F0aW9uIHBhcmFtcwogICAgJFNlbGYtPl9BcHBvaW50bWVudE5vdGlmaWNhdGlvblByZXBhcmUoCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAjIGdldCBjYWxlbmRhciBoZWxwZXIgb2JqZWN0CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICMgaWYgUmVjdXJyaW5nIGlzIHByb3ZpZGVkLCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgbXVzdCBiZSBwcmVzZW50CiAgICBpZiAoICRQYXJhbXtSZWN1cnJpbmd9ICkgewoKICAgICAgICBteSBAUmVjdXJyZW5jZVR5cGVzID0gKAogICAgICAgICAgICAiRGFpbHkiLCAgICAgICAiV2Vla2x5IiwgICAgICAgIk1vbnRobHkiLCAgICAgICAiWWVhcmx5IiwKICAgICAgICAgICAgIkN1c3RvbURhaWx5IiwgIkN1c3RvbVdlZWtseSIsICJDdXN0b21Nb250aGx5IiwgIkN1c3RvbVllYXJseSIKICAgICAgICApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkUGFyYW17UmVjdXJyZW5jZVR5cGV9CiAgICAgICAgICAgIHx8ICFncmVwIHsgJF8gZXEgJFBhcmFte1JlY3VycmVuY2VUeXBlfSB9IEBSZWN1cnJlbmNlVHlwZXMKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlY3VycmVuY2VUeXBlIGludmFsaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21XZWVrbHknCiAgICAgICAgICAgICAgICB8fCAkUGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21Nb250aGx5JwogICAgICAgICAgICAgICAgfHwgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tWWVhcmx5JwogICAgICAgICAgICApCiAgICAgICAgICAgICYmICEkUGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlY3VycmVuY2VGcmVxdWVuY3kgbmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgJFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0gfHw9IDE7CgogICAgaWYgKCAkUGFyYW17VW5pcXVlSUR9ICYmICEkUGFyYW17UGFyZW50SUR9ICkgewogICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRTZWxmLT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgVW5pcXVlSUQgICA9PiAkUGFyYW17VW5pcXVlSUR9LAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBleGlzdGluZyBhcHBvaW50bWVudCB3aXRoIHNhbWUgVW5pcXVlSUQKICAgICAgICBpZiAoICVBcHBvaW50bWVudCAmJiAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBQYXJlbnRJRAogICAgaWYgKCAkUGFyYW17UGFyZW50SUR9ICYmICFJc0ludGVnZXIoICRQYXJhbXtQYXJlbnRJRH0gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlBhcmVudElEIG11c3QgYmUgYSBudW1iZXIhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIFN0YXJ0VGltZQogICAgbXkgJFN0YXJ0VGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICApOwogICAgaWYgKCAhJFN0YXJ0VGltZVN5c3RlbSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgU3RhcnRUaW1lISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBVbmlxdWVJRAogICAgaWYgKCAhJFBhcmFte1VuaXF1ZUlEfSApIHsKICAgICAgICAkUGFyYW17VW5pcXVlSUR9ID0gJFNlbGYtPkdldFVuaXF1ZUlEKAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAkU3RhcnRUaW1lU3lzdGVtLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBFbmRUaW1lCiAgICBteSAkRW5kVGltZVZhbGlkID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17RW5kVGltZX0sCiAgICApOwogICAgaWYgKCAhJEVuZFRpbWVWYWxpZCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgRW5kVGltZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgYXJyYXkgcmVmcwogICAgbXkgJUFycmF5czsKICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICBxdyhUZWFtSUQgUmVzb3VyY2VJRCBSZWN1cnJlbmNlRnJlcXVlbmN5IFJlY3VycmVuY2VFeGNsdWRlKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICRQYXJhbXskUGFyYW1ldGVyfSAmJiBAeyAkUGFyYW17JFBhcmFtZXRlcn0gLy8gW10gfSApIHsKICAgICAgICAgICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17JFBhcmFtZXRlcn0gKSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRQYXJhbWV0ZXIgbm90IEFSUkFZUkVGISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSBAQXJyYXkgPSBAeyAkUGFyYW17JFBhcmFtZXRlcn0gfTsKCiAgICAgICAgICAgICMgcmVtb3ZlIHVuZGVmaW5lZCB2YWx1ZXMKICAgICAgICAgICAgQEFycmF5ID0gZ3JlcCB7IGRlZmluZWQgJF8gfSBAQXJyYXk7CgogICAgICAgICAgICAkQXJyYXlzeyRQYXJhbWV0ZXJ9ID0gam9pbiggJywnLCBAQXJyYXkgKSBpZiBAQXJyYXk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgbnVtYmVycwogICAgZm9yIG15ICRQYXJhbWV0ZXIgKAogICAgICAgIHF3KFJlY3VycmluZyBSZWN1cnJlbmNlQ291bnQgUmVjdXJyZW5jZUludGVydmFsKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICRQYXJhbXskUGFyYW1ldGVyfSAmJiAhSXNJbnRlZ2VyKCAkUGFyYW17JFBhcmFtZXRlcn0gKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRQYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgUmVjdXJyZW5jZVVudGlsCiAgICBpZiAoICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9ICkgewoKICAgICAgICAjIHVzdWFsbHkgaG91ciwgbWludXRlIGFuZCBzZWNvbmQgPSAwLiBJbiB0aGlzIGNhc2UsIHRha2UgdGltZSBmcm9tIFN0YXJ0VGltZQogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lQ2hlY2soCiAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICk7CgogICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWxTeXN0ZW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpLT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFJlY3VycmVuY2VVbnRpbFN5c3RlbQogICAgICAgICAgICB8fCAkU3RhcnRUaW1lU3lzdGVtID4gJFJlY3VycmVuY2VVbnRpbFN5c3RlbQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBSZWN1cnJlbmNlVW50aWwhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkYiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgQEJpbmQ7CgogICAgIyBwYXJlbnQgSUQgc3VwcGxpZWQKICAgIG15ICRQYXJlbnRJRENvbCA9IG15ICRQYXJlbnRJRFZhbCA9ICcnOwogICAgaWYgKCAkUGFyYW17UGFyZW50SUR9ICkgewogICAgICAgICRQYXJlbnRJRENvbCA9ICdwYXJlbnRfaWQsJzsKICAgICAgICAkUGFyZW50SURWYWwgPSAnPywnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17UGFyZW50SUR9OwoKICAgICAgICAjIHR1cm4gb2ZmIGFsbCByZWN1cnJpbmcgZmllbGRzCiAgICAgICAgZGVsZXRlICRQYXJhbXtSZWN1cnJpbmd9OwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyZW5jZVR5cGV9OwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX07CiAgICAgICAgZGVsZXRlICRQYXJhbXtSZWN1cnJlbmNlQ291bnR9OwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyZW5jZUludGVydmFsfTsKICAgICAgICBkZWxldGUgJFBhcmFte1JlY3VycmVuY2VVbnRpbH07CiAgICB9CgogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDYWxlbmRhcklEfSwgXCRQYXJhbXtVbmlxdWVJRH0sIFwkUGFyYW17VGl0bGV9LCBcJFBhcmFte0Rlc2NyaXB0aW9ufSwKICAgICAgICBcJFBhcmFte0xvY2F0aW9ufSwgXCRQYXJhbXtTdGFydFRpbWV9LCAgIFwkUGFyYW17RW5kVGltZX0sICAgXCRQYXJhbXtBbGxEYXl9LAogICAgICAgIFwkQXJyYXlze1RlYW1JRH0sICBcJEFycmF5c3tSZXNvdXJjZUlEfSwgXCRQYXJhbXtSZWN1cnJpbmd9LCBcJFBhcmFte1JlY3VycmVuY2VUeXBlfSwKICAgICAgICBcJEFycmF5c3tSZWN1cnJlbmNlRnJlcXVlbmN5fSwgXCRQYXJhbXtSZWN1cnJlbmNlQ291bnR9LCAgICAgIFwkUGFyYW17UmVjdXJyZW5jZUludGVydmFsfSwKICAgICAgICBcJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlSUR9LCAgICAgICAgIFwkQXJyYXlze1JlY3VycmVuY2VFeGNsdWRlfSwKICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkRhdGV9LCAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25UZW1wbGF0ZX0sIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tfSwKICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0sCiAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfSwgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0sCiAgICAgICAgXCRQYXJhbXtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sICAgICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH07CgogICAgbXkgJFNRTCA9ICIKICAgICAgICBJTlNFUlQgSU5UTyBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgICAgICAoJFBhcmVudElEQ29sIGNhbGVuZGFyX2lkLCB1bmlxdWVfaWQsIHRpdGxlLCBkZXNjcmlwdGlvbiwgbG9jYXRpb24sIHN0YXJ0X3RpbWUsCiAgICAgICAgICAgIGVuZF90aW1lLCBhbGxfZGF5LCB0ZWFtX2lkLCByZXNvdXJjZV9pZCwgcmVjdXJyaW5nLCByZWN1cl90eXBlLCByZWN1cl9mcmVxLCByZWN1cl9jb3VudCwKICAgICAgICAgICAgcmVjdXJfaW50ZXJ2YWwsIHJlY3VyX3VudGlsLCByZWN1cl9pZCwgcmVjdXJfZXhjbHVkZSwgbm90aWZ5X3RpbWUsIG5vdGlmeV90ZW1wbGF0ZSwKICAgICAgICAgICAgbm90aWZ5X2N1c3RvbSwgbm90aWZ5X2N1c3RvbV91bml0X2NvdW50LCBub3RpZnlfY3VzdG9tX3VuaXQsIG5vdGlmeV9jdXN0b21fdW5pdF9wb2ludCwKICAgICAgICAgICAgbm90aWZ5X2N1c3RvbV9kYXRlLCB0aWNrZXRfYXBwb2ludG1lbnRfcnVsZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsCiAgICAgICAgICAgIGNoYW5nZV9ieSkKICAgICAgICBWQUxVRVMgKCRQYXJlbnRJRFZhbCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LAogICAgICAgICAgICA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pCiAgICAiOwoKICAgICMgY3JlYXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgbXkgJEFwcG9pbnRtZW50SUQ7CgogICAgIyByZXR1cm4gcGFyZW50IGlkIGZvciBhcHBvaW50bWVudCBvY2N1cnJlbmNlcwogICAgaWYgKCAkUGFyYW17UGFyZW50SUR9ICkgewogICAgICAgICRBcHBvaW50bWVudElEID0gJFBhcmFte1BhcmVudElEfTsKICAgIH0KCiAgICAjIGdldCBhcHBvaW50bWVudCBpZCBmb3IgcGFyZW50IGFwcG9pbnRtZW50CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgICAgIFNFTEVDVCBpZCBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgICAgICAgICBXSEVSRSB1bmlxdWVfaWQ9PyBBTkQgcGFyZW50X2lkIElTIE5VTEwKICAgICAgICAgICAgJywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1VuaXF1ZUlEfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkQXBwb2ludG1lbnRJRCA9ICRSb3dbMF0gfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIHJldHVybiBpZiB0aGVyZSBpcyBub3QgYXBwb2ludG1lbnQgY3JlYXRlZAogICAgICAgIGlmICggISRBcHBvaW50bWVudElEICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ2FuXCd0IGdldCBBcHBvaW50bWVudElEIGZyb20gSU5TRVJUIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwogICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSAmJiAhJFBhcmFte1JlY3VycmluZ1Jhd30gKSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+X0FwcG9pbnRtZW50UmVjdXJyaW5nQ3JlYXRlKAogICAgICAgICAgICBQYXJlbnRJRCAgICA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgQXBwb2ludG1lbnQgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICMgY2xlYW4gdXAgbGlzdCBtZXRob2RzIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnTGlzdCcgLiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICApOwogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0RheXMnIC4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZmlyZSBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXBwb2ludG1lbnRDcmVhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBcHBvaW50bWVudElEOwp9Cgo9aXRlbSBBcHBvaW50bWVudExpc3QoKQoKZ2V0IGEgaGFzaCBvZiBBcHBvaW50bWVudHMuCgogICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVmFsaWQgQ2FsZW5kYXJJRAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJyonLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IHRpdGxlLCB3aWxkY2FyZCBzdXBwb3J0ZWQKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgID0+ICcqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBkZXNjcmlwdGlvbiwgd2lsZGNhcmQgc3VwcG9ydGVkCiAgICAgICAgTG9jYXRpb24gICAgICAgICAgICA9PiAnKicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgbG9jYXRpb24sIHdpbGRjYXJkIHN1cHBvcnRlZAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IHN0YXJ0IGRhdGUKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAyLTAxIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBlbmQgZGF0ZQogICAgICAgIFRlYW1JRCAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IHRlYW0KICAgICAgICBSZXNvdXJjZUlEICAgICAgICAgID0+IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSByZXNvdXJjZQogICAgICAgIFJlc3VsdCAgICAgICAgICAgICAgPT4gJ0hBU0gnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCksIEhBU0h8QVJSQVkKICAgICk7CgpyZXR1cm5zIGFuIGFycmF5IG9mIGhhc2hlcyB3aXRoIHNlbGVjdCBBcHBvaW50bWVudCBkYXRhIG9yIHNpbXBsZSBhcnJheSBvZiBBcHBvaW50bWVudElEczoKClJlc3VsdCA9PiAnSEFTSCc6CgogICAgQEFwcG9pbnRtZW50cyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMSwKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAxLAogICAgICAgICAgICBVbmlxdWVJRCAgICAgID0+ICcyMDE2MDEwMVQxNjAwMDAtNzFFMzg2QGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1dlYmluYXInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdIb3cgdG8gdXNlIFByb2Nlc3MgdGlja2V0cy4uLicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgPT4gJ1N0cmF1YmluZycsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICA9PiAwLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZm9yIHJlY3VycmluZyAocGFyZW50KSBhcHBvaW50bWVudHMgb25seQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+IDIsCiAgICAgICAgICAgIFBhcmVudElEICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3IgcmVjdXJyZWQgKGNoaWxkKSBhcHBvaW50bWVudHMgb25seQogICAgICAgICAgICBDYWxlbmRhcklEICAgID0+IDEsCiAgICAgICAgICAgIFVuaXF1ZUlEICAgICAgPT4gJzIwMTYwMTAxVDE4MDAwMC1BNzhCNTdAbG9jYWxob3N0JywKICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnV2ViaW5hcicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICA9PiAnU3RyYXViaW5nJywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICA9PiAnMjAxNi0wMS0wMiAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgPT4gJzIwMTYtMDEtMDIgMTc6MDA6MDAnLAogICAgICAgICAgICBUZWFtSUQgICAgICAgID0+IFsgMSBdLAogICAgICAgICAgICBSZXNvdXJjZUlEICAgID0+IFsgMSwgMyBdLAogICAgICAgICAgICBBbGxEYXkgICAgICAgID0+IDAsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMywKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBVbmlxdWVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2MDEwMVQxODAwMDAtQTc4QjU3QGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1dlYmluYXInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdIb3cgdG8gdXNlIFByb2Nlc3MgdGlja2V0cy4uLicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1N0cmF1YmluZycsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAyIDE3OjAwOjAwJywKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUZWFtSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMSBdLAogICAgICAgICAgICBSZXNvdXJjZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMSwgMyBdLAogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAyIDE2OjEwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICcxMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMiAxNjowMDowMCcsCiAgICAgICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEICAgICAgICAgICAgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywgICAgIyBmb3IgdGlja2V0IGFwcG9pbnRtZW50cyBvbmx5IQogICAgICAgIH0sCiAgICAgICAgLi4uCiAgICBdOwoKUmVzdWx0ID0+ICdBUlJBWSc6CgogICAgQEFwcG9pbnRtZW50cyA9IFsgMSwgMiwgLi4uIF0KCj1jdXQKCnN1YiBBcHBvaW50bWVudExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBvdXRwdXQgYXJyYXkgb2YgaGFzaGVzIGJ5IGRlZmF1bHQKICAgICRQYXJhbXtSZXN1bHR9ID0gJFBhcmFte1Jlc3VsdH0gfHwgJ0hBU0gnOwoKICAgICMgY2FjaGUga2V5cwogICAgbXkgJENhY2hlVHlwZSAgICAgICAgPSAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnTGlzdCcgLiAkUGFyYW17Q2FsZW5kYXJJRH07CiAgICBteSAkQ2FjaGVLZXlUaXRsZSAgICA9ICRQYXJhbXtUaXRsZX0gfHwgJ2FueSc7CiAgICBteSAkQ2FjaGVLZXlEZXNjICAgICA9ICRQYXJhbXtEZXNjcmlwdGlvbn0gfHwgJ2FueSc7CiAgICBteSAkQ2FjaGVLZXlMb2NhdGlvbiA9ICRQYXJhbXtMb2NhdGlvbn0gfHwgJ2FueSc7CiAgICBteSAkQ2FjaGVLZXlTdGFydCAgICA9ICRQYXJhbXtTdGFydFRpbWV9IHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5RW5kICAgICAgPSAkUGFyYW17RW5kVGltZX0gfHwgJ2FueSc7CiAgICBteSAkQ2FjaGVLZXlUZWFtICAgICA9ICRQYXJhbXtUZWFtSUR9IHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5UmVzb3VyY2UgPSAkUGFyYW17UmVzb3VyY2VJRH0gfHwgJ2FueSc7CgogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtUaXRsZX0gJiYgJFBhcmFte1RpdGxlfSA9fiAvXltcKl0rJC8gKSB7CiAgICAgICAgJENhY2hlS2V5VGl0bGUgPSAnYW55JzsKICAgIH0KICAgIGlmICggZGVmaW5lZCAkUGFyYW17RGVzY3JpcHRpb259ICYmICRQYXJhbXtEZXNjcmlwdGlvbn0gPX4gL15bXCpdKyQvICkgewogICAgICAgICRDYWNoZUtleURlc2MgPSAnYW55JzsKICAgIH0KICAgIGlmICggZGVmaW5lZCAkUGFyYW17TG9jYXRpb259ICYmICRQYXJhbXtMb2NhdGlvbn0gPX4gL15bXCpdKyQvICkgewogICAgICAgICRDYWNoZUtleUxvY2F0aW9uID0gJ2FueSc7CiAgICB9CgogICAgbXkgJENhY2hlS2V5CiAgICAgICAgPSAiJENhY2hlS2V5VGl0bGUtJENhY2hlS2V5RGVzYy0kQ2FjaGVLZXlMb2NhdGlvbi0kQ2FjaGVLZXlTdGFydC0kQ2FjaGVLZXlFbmQtJENhY2hlS2V5VGVhbS0kQ2FjaGVLZXlSZXNvdXJjZS0kUGFyYW17UmVzdWx0fSI7CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJENhY2hlVHlwZSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgaWYgKCByZWYgJERhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICByZXR1cm4gQHskRGF0YX07CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAjIGNoZWNrIHRpbWUKICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gKSB7CiAgICAgICAgbXkgJFN0YXJ0VGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFN0YXJ0VGltZVN5c3RlbSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlN0YXJ0VGltZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1N0YXJ0VGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lU3lzdGVtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRQYXJhbXtFbmRUaW1lfSApIHsKICAgICAgICBteSAkRW5kVGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICApOwogICAgICAgIGlmICggISRFbmRUaW1lU3lzdGVtICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRW5kVGltZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJFBhcmFte0VuZFRpbWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKS0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lU3lzdGVtLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFNRTCA9ICcKICAgICAgICBTRUxFQ1QgaWQsIHBhcmVudF9pZCwgY2FsZW5kYXJfaWQsIHVuaXF1ZV9pZCwgdGl0bGUsIGRlc2NyaXB0aW9uLCBsb2NhdGlvbiwgc3RhcnRfdGltZSwKICAgICAgICAgICAgZW5kX3RpbWUsIHRlYW1faWQsIHJlc291cmNlX2lkLCBhbGxfZGF5LCByZWN1cnJpbmcsIG5vdGlmeV90aW1lLCBub3RpZnlfdGVtcGxhdGUsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b20sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCwgbm90aWZ5X2N1c3RvbV91bml0LCBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fZGF0ZSwgdGlja2V0X2FwcG9pbnRtZW50X3J1bGVfaWQKICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgV0hFUkUgY2FsZW5kYXJfaWQ9PwogICAgJzsKCiAgICBteSBAQmluZDsKCiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0NhbGVuZGFySUR9OwoKICAgICMgRmlsdGVyIHRpdGxlLCBkZXNjcmlwdGlvbiBhbmQgbG9jYXRpb24gZmllbGRzIGJ5IHVzaW5nIFF1ZXJ5Q29uZGl0aW9uIG1ldGhvZCwgd2hpY2ggd2lsbAogICAgIyAgIHJldHVybiBiYWNrZW5kIHNwZWNpZmljIFNRTCBzdGF0ZW1lbnRzIGluIG9yZGVyIHRvIHByb3ZpZGUgY2FzZSBpbnNlbnNpdGl2ZSBtYXRjaCBhbmQKICAgICMgICB3aWxkY2FyZCBzdXBwb3J0LgogICAgRklMVEVSOgogICAgZm9yIG15ICRGaWx0ZXIgKHF3KFRpdGxlIERlc2NyaXB0aW9uIExvY2F0aW9uKSkgewogICAgICAgIG5leHQgRklMVEVSIGlmICEkUGFyYW17JEZpbHRlcn07CiAgICAgICAgJFNRTCAuPSAnIEFORCAnIC4gJERCT2JqZWN0LT5RdWVyeUNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgICAgICAgID0+IGxjICRGaWx0ZXIsCiAgICAgICAgICAgIFZhbHVlICAgICAgICA9PiAkUGFyYW17JEZpbHRlcn0sCiAgICAgICAgICAgIFNlYXJjaFByZWZpeCA9PiAnKicsCiAgICAgICAgICAgIFNlYXJjaFN1ZmZpeCA9PiAnKicsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtTdGFydFRpbWV9ICYmICRQYXJhbXtFbmRUaW1lfSApIHsKCiAgICAgICAgJFNRTCAuPSAnIEFORCAoCiAgICAgICAgICAgIChzdGFydF90aW1lID49ID8gQU5EIHN0YXJ0X3RpbWUgPCA/KSBPUgogICAgICAgICAgICAoZW5kX3RpbWUgPiA/IEFORCBlbmRfdGltZSA8PSA/KSBPUgogICAgICAgICAgICAoc3RhcnRfdGltZSA8PSA/IEFORCBlbmRfdGltZSA+PSA/KQogICAgICAgICkgJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1N0YXJ0VGltZX0sIFwkUGFyYW17RW5kVGltZX0sIFwkUGFyYW17U3RhcnRUaW1lfSwgXCRQYXJhbXtFbmRUaW1lfSwgXCRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICBcJFBhcmFte0VuZFRpbWV9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17U3RhcnRUaW1lfSAmJiAhJFBhcmFte0VuZFRpbWV9ICkgewoKICAgICAgICAkU1FMIC49ICcgQU5EIGVuZF90aW1lID49ID8gJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1N0YXJ0VGltZX07CiAgICB9CiAgICBlbHNpZiAoICEkUGFyYW17U3RhcnRUaW1lfSAmJiAkUGFyYW17RW5kVGltZX0gKSB7CgogICAgICAgICRTUUwgLj0gJyBBTkQgc3RhcnRfdGltZSA8PSA/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtFbmRUaW1lfTsKICAgIH0KCiAgICAkU1FMIC49ICcgT1JERVIgQlkgaWQgQVNDJzsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15IEBSZXN1bHQ7CgogICAgUk9XOgogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgdGVhbSBpZAogICAgICAgIG15IEBUZWFtSUQgPSBzcGxpdCggJywnLCAkUm93WzldIC8vICcnICk7CiAgICAgICAgaWYgKCAkUGFyYW17VGVhbUlEfSApIHsKICAgICAgICAgICAgbmV4dCBST1cgaWYgIWdyZXAgeyAkXyA9PSAkUGFyYW17VGVhbUlEfSB9IEBUZWFtSUQ7CiAgICAgICAgfQoKICAgICAgICAjIHJlc291cmNlIGlkCiAgICAgICAgJFJvd1sxMF0gPSAkUm93WzEwXSA/ICRSb3dbMTBdIDogMDsKICAgICAgICBteSBAUmVzb3VyY2VJRCA9ICRSb3dbMTBdID1+IC8sLyA/IHNwbGl0KCAnLCcsICRSb3dbMTBdICkgOiAoICRSb3dbMTBdICk7CiAgICAgICAgaWYgKCAkUGFyYW17UmVzb3VyY2VJRH0gKSB7CiAgICAgICAgICAgIG5leHQgUk9XIGlmICFncmVwIHsgJF8gPT0gJFBhcmFte1Jlc291cmNlSUR9IH0gQFJlc291cmNlSUQ7CiAgICAgICAgfQoKICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgUGFyZW50SUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIFVuaXF1ZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1szXSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzRdLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbNV0sCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1s2XSwKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzddLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbOF0sCiAgICAgICAgICAgIFRlYW1JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gXEBUZWFtSUQsCiAgICAgICAgICAgIFJlc291cmNlSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gXEBSZXNvdXJjZUlELAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTFdLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTJdLAogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTNdIHx8ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTRdLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTVdLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICRSb3dbMTZdLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRSb3dbMTddLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICRSb3dbMThdLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICRSb3dbMTldIHx8ICcnLAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAgICAgICAgICAgICAgID0+ICRSb3dbMjBdLAogICAgICAgICk7CiAgICAgICAgcHVzaCBAUmVzdWx0LCBcJUFwcG9pbnRtZW50OwogICAgfQoKICAgICMgaWYgUmVzdWx0IHdhcyBBUlJBWSwgb3V0cHV0IG9ubHkgSURzCiAgICBpZiAoICRQYXJhbXtSZXN1bHR9IGVxICdBUlJBWScgKSB7CiAgICAgICAgbXkgQFJlc3VsdExpc3Q7CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQFJlc3VsdCkgewogICAgICAgICAgICBwdXNoIEBSZXN1bHRMaXN0LCAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfTsKICAgICAgICB9CiAgICAgICAgQFJlc3VsdCA9IEBSZXN1bHRMaXN0OwogICAgfQoKICAgICMgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJENhY2hlVHlwZSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXEBSZXN1bHQsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiBAUmVzdWx0Owp9Cgo9aXRlbSBBcHBvaW50bWVudERheXMoKQoKZ2V0IGEgaGFzaCBvZiBkYXlzIHdpdGggQXBwb2ludG1lbnRzIGluIGFsbCB1c2VyIGNhbGVuZGFycy4KCiAgICBteSAlQXBwb2ludG1lbnREYXlzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERheXMoCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAwMDowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgc3RhcnQgZGF0ZQogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDItMDEgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IGVuZCBkYXRlCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBWYWxpZCBVc2VySUQKICAgICk7CgpyZXR1cm5zIGEgaGFzaCB3aXRoIGRheXMgYXMga2V5cyBhbmQgbnVtYmVyIG9mIEFwcG9pbnRtZW50cyBhcyB2YWx1ZXM6CgogICAgJUFwcG9pbnRtZW50RGF5cyA9IHsKICAgICAgICAnMjAxNi0wMS0wMScgPT4gMSwKICAgICAgICAnMjAxNi0wMS0xMycgPT4gMiwKICAgICAgICAnMjAxNi0wMS0zMCcgPT4gMSwKICAgIH07Cgo9Y3V0CgpzdWIgQXBwb2ludG1lbnREYXlzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjYWNoZSBrZXlzCiAgICBteSAkQ2FjaGVUeXBlICAgICA9ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9OwogICAgbXkgJENhY2hlS2V5U3RhcnQgPSAkUGFyYW17U3RhcnRUaW1lfSB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleUVuZCAgID0gJFBhcmFte0VuZFRpbWV9IHx8ICdhbnknOwoKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgIyBjaGVjayB0aW1lCiAgICBpZiAoICRQYXJhbXtTdGFydFRpbWV9ICkgewogICAgICAgIG15ICRTdGFydFRpbWVWYWxpZCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdGFydFRpbWVWYWxpZCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlN0YXJ0VGltZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICRQYXJhbXtFbmRUaW1lfSApIHsKICAgICAgICBteSAkRW5kVGltZVZhbGlkID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0VuZFRpbWV9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRFbmRUaW1lVmFsaWQgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFbmRUaW1lIGludmFsaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkRGF0YSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJENhY2hlVHlwZSwKICAgICAgICBLZXkgID0+ICIkQ2FjaGVLZXlTdGFydC0kQ2FjaGVLZXlFbmQiLAogICAgKTsKCiAgICBpZiAoIHJlZiAkRGF0YSBlcSAnSEFTSCcgKSB7CiAgICAgICAgcmV0dXJuICV7JERhdGF9OwogICAgfQoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IHVzZXIgZ3JvdXBzCiAgICBteSAlR3JvdXBMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICk7CiAgICBteSBAR3JvdXBJRHMgPSBzb3J0IGtleXMgJUdyb3VwTGlzdDsKCiAgICBteSAkU1FMID0gIgogICAgICAgIFNFTEVDVCBjYS5zdGFydF90aW1lLCBjYS5lbmRfdGltZQogICAgICAgIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQgY2EKICAgICAgICBKT0lOIGNhbGVuZGFyIGMgT04gY2EuY2FsZW5kYXJfaWQgPSBjLmlkCiAgICAgICAgV0hFUkUgYy5ncm91cF9pZCBJTiAoICR7XChqb2luICcsICcsIEBHcm91cElEcyl9ICkKICAgICI7CgogICAgbXkgQEJpbmQ7CgogICAgaWYgKCAkUGFyYW17U3RhcnRUaW1lfSAmJiAkUGFyYW17RW5kVGltZX0gKSB7CgogICAgICAgICRTUUwgLj0gJ0FORCAoCiAgICAgICAgICAgIChjYS5zdGFydF90aW1lID49ID8gQU5EIGNhLnN0YXJ0X3RpbWUgPCA/KSBPUgogICAgICAgICAgICAoY2EuZW5kX3RpbWUgPiA/IEFORCBjYS5lbmRfdGltZSA8PSA/KSBPUgogICAgICAgICAgICAoY2Euc3RhcnRfdGltZSA8PSA/IEFORCBjYS5lbmRfdGltZSA+PSA/KQogICAgICAgICkgJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1N0YXJ0VGltZX0sIFwkUGFyYW17RW5kVGltZX0sIFwkUGFyYW17U3RhcnRUaW1lfSwgXCRQYXJhbXtFbmRUaW1lfSwgXCRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICBcJFBhcmFte0VuZFRpbWV9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17U3RhcnRUaW1lfSAmJiAhJFBhcmFte0VuZFRpbWV9ICkgewoKICAgICAgICAkU1FMIC49ICdBTkQgY2EuZW5kX3RpbWUgPj0gPyAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17U3RhcnRUaW1lfTsKICAgIH0KICAgIGVsc2lmICggISRQYXJhbXtTdGFydFRpbWV9ICYmICRQYXJhbXtFbmRUaW1lfSApIHsKCiAgICAgICAgJFNRTCAuPSAnQU5EIGNhLnN0YXJ0X3RpbWUgPD0gPyAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17RW5kVGltZX07CiAgICB9CgogICAgJFNRTCAuPSAnT1JERVIgQlkgY2EuaWQgQVNDJzsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15ICVSZXN1bHQ7CgogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIG15ICggJFN0YXJ0VGltZSwgJEVuZFRpbWUsICRTdGFydFRpbWVTeXN0ZW0sICRFbmRUaW1lU3lzdGVtICk7CgogICAgICAgICMgU3RhcnRUaW1lCiAgICAgICAgaWYgKCAkUGFyYW17U3RhcnRUaW1lfSApIHsKICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRSb3dbMF0gbHQgJFBhcmFte1N0YXJ0VGltZX0gPyAkUGFyYW17U3RhcnRUaW1lfSA6ICRSb3dbMF07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3RhcnRUaW1lID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICMgRW5kVGltZQogICAgICAgIGlmICggJFBhcmFte0VuZFRpbWV9ICkgewogICAgICAgICAgICAkRW5kVGltZSA9ICRSb3dbMV0gZ3QgJFBhcmFte0VuZFRpbWV9ID8gJFBhcmFte0VuZFRpbWV9IDogJFJvd1sxXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRFbmRUaW1lID0gJFJvd1sxXTsKICAgICAgICB9CgogICAgICAgICMgR2V0IHN5c3RlbSB0aW1lcwogICAgICAgICRTdGFydFRpbWVTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CgogICAgICAgICRFbmRUaW1lU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJEVuZFRpbWUsCiAgICAgICAgKTsKCiAgICAgICAgZm9yICgKICAgICAgICAgICAgbXkgJExvb3BTeXN0ZW1UaW1lID0gJFN0YXJ0VGltZVN5c3RlbTsKICAgICAgICAgICAgJExvb3BTeXN0ZW1UaW1lIDwgJEVuZFRpbWVTeXN0ZW07CiAgICAgICAgICAgICRMb29wU3lzdGVtVGltZSArPSA2MCAqIDYwICogMjQKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJExvb3BUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRMb29wU3lzdGVtVGltZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMb29wVGltZSA9fiBzL1xzLio/JC8vZ3NtOwoKICAgICAgICAgICAgaWYgKCAkUmVzdWx0eyRMb29wVGltZX0gKSB7CiAgICAgICAgICAgICAgICAkUmVzdWx0eyRMb29wVGltZX0rKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRSZXN1bHR7JExvb3BUaW1lfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJENhY2hlVHlwZSwKICAgICAgICBLZXkgICA9PiAiJENhY2hlS2V5U3RhcnQtJENhY2hlS2V5RW5kIiwKICAgICAgICBWYWx1ZSA9PiBcJVJlc3VsdCwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgcmV0dXJuICVSZXN1bHQ7Cn0KCj1pdGVtIEFwcG9pbnRtZW50R2V0KCkKCmdldCBBcHBvaW50bWVudC4KCiAgICBteSAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yCiAgICAgICAgVW5pcXVlSUQgICAgICA9PiAnMjAxNjAxMDFUMTYwMDAwLTcxRTM4NkBsb2NhbGhvc3QnLCAjIChyZXF1aXJlZCkgd2lsbCByZXR1cm4gb25seSBwYXJlbnQgZm9yIHJlY3VycmluZyBhcHBvaW50bWVudHMKICAgICAgICBDYWxlbmRhcklEICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgKTsKCnJldHVybnMgYSBoYXNoOgogICAgJUFwcG9pbnRtZW50ID0gKAogICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgPT4gMiwKICAgICAgICBQYXJlbnRJRCAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb25seSBmb3IgcmVjdXJyZWQgKGNoaWxkKSBhcHBvaW50bWVudHMKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+IDEsCiAgICAgICAgVW5pcXVlSUQgICAgICAgICAgICA9PiAnMjAxNjAxMDFUMTYwMDAwLTcxRTM4NkBsb2NhbGhvc3QnLAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ1dlYmluYXInLAogICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywKICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgID0+ICdTdHJhdWJpbmcnLAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLAogICAgICAgIEFsbERheSAgICAgICAgICAgICAgPT4gMCwKICAgICAgICBUZWFtSUQgICAgICAgICAgICAgID0+IFsgMSBdLAogICAgICAgIFJlc291cmNlSUQgICAgICAgICAgPT4gWyAxLCAzIF0sCiAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0RhaWx5JywKICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gMiwKICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywKICAgICAgICBSZWN1cnJlbmNlSUQgICAgICAgID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywKICAgICAgICBSZWN1cnJlbmNlRXhjbHVkZSAgID0+IFsKICAgICAgICAgICAgJzIwMTYtMDEtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAxNi0wMS0xMSAwMDowMDowMCcsCiAgICAgICAgXSwKICAgICAgICBOb3RpZmljYXRpb25UaW1lICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDowMCcsCiAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRDb3VudCAgICAgICA9PiAnMTInLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVVuaXQgICAgICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tVW5pdFBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCgogICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsICAjIGZvciB0aWNrZXQgYXBwb2ludG1lbnRzIG9ubHkhCiAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgICAgID0+IDIsCiAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgICAgID0+IDIsCiAgICApOwoKPWN1dAoKc3ViIEFwcG9pbnRtZW50R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICgKICAgICAgICAhJFBhcmFte0FwcG9pbnRtZW50SUR9CiAgICAgICAgJiYgISggJFBhcmFte1VuaXF1ZUlEfSAmJiAkUGFyYW17Q2FsZW5kYXJJRH0gKQogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgQXBwb2ludG1lbnRJRCBvciBVbmlxdWVJRCBhbmQgQ2FsZW5kYXJJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICREYXRhOwoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgIGlmICggJFBhcmFte0FwcG9pbnRtZW50SUR9ICkgewoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgJERhdGEgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCByZWYgJERhdGEgZXEgJ0hBU0gnICkgewogICAgICAgIHJldHVybiAleyREYXRhfTsKICAgIH0KCiAgICAjIG5lZWRlZCBvYmplY3RzCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICBteSBAQmluZDsKICAgIG15ICRTUUwgPSAnCiAgICAgICAgU0VMRUNUIGlkLCBwYXJlbnRfaWQsIGNhbGVuZGFyX2lkLCB1bmlxdWVfaWQsIHRpdGxlLCBkZXNjcmlwdGlvbiwgbG9jYXRpb24sIHN0YXJ0X3RpbWUsCiAgICAgICAgICAgIGVuZF90aW1lLCBhbGxfZGF5LCB0ZWFtX2lkLCByZXNvdXJjZV9pZCwgcmVjdXJyaW5nLCByZWN1cl90eXBlLCByZWN1cl9mcmVxLCByZWN1cl9jb3VudCwKICAgICAgICAgICAgcmVjdXJfaW50ZXJ2YWwsIHJlY3VyX3VudGlsLCByZWN1cl9pZCwgcmVjdXJfZXhjbHVkZSwgbm90aWZ5X3RpbWUsIG5vdGlmeV90ZW1wbGF0ZSwKICAgICAgICAgICAgbm90aWZ5X2N1c3RvbSwgbm90aWZ5X2N1c3RvbV91bml0X2NvdW50LCBub3RpZnlfY3VzdG9tX3VuaXQsIG5vdGlmeV9jdXN0b21fdW5pdF9wb2ludCwKICAgICAgICAgICAgbm90aWZ5X2N1c3RvbV9kYXRlLCB0aWNrZXRfYXBwb2ludG1lbnRfcnVsZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsCiAgICAgICAgICAgIGNoYW5nZV9ieQogICAgICAgIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICBXSEVSRQogICAgJzsKCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKICAgICAgICAkU1FMIC49ICdpZD0/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtBcHBvaW50bWVudElEfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTUUwgLj0gJ3VuaXF1ZV9pZD0/IEFORCBjYWxlbmRhcl9pZD0/IEFORCBwYXJlbnRfaWQgSVMgTlVMTCAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17VW5pcXVlSUR9LCBcJFBhcmFte0NhbGVuZGFySUR9OwogICAgfQoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gXEBCaW5kLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICVSZXN1bHQ7CgogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgdGVhbSBpZAogICAgICAgIG15IEBUZWFtSUQgPSBzcGxpdCggJywnLCAkUm93WzEwXSAvLyAnJyApOwoKICAgICAgICAjIHJlc291cmNlIGlkCiAgICAgICAgbXkgQFJlc291cmNlSUQgPSBzcGxpdCggJywnLCAkUm93WzExXSAvLyAnMCcgKTsKCiAgICAgICAgIyByZWN1cnJlbmNlIGZyZXF1ZW5jeQogICAgICAgIG15IEBSZWN1cnJlbmNlRnJlcXVlbmN5ID0gJFJvd1sxNF0gPyBzcGxpdCggJywnLCAkUm93WzE0XSApIDogdW5kZWY7CgogICAgICAgICMgcmVjdXJyZW5jZSBleGNsdWRlCiAgICAgICAgbXkgQFJlY3VycmVuY2VFeGNsdWRlID0gJFJvd1sxOV0gPyBzcGxpdCggJywnLCAkUm93WzE5XSApIDogdW5kZWY7CgogICAgICAgICRSZXN1bHR7QXBwb2ludG1lbnRJRH0gICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzBdOwogICAgICAgICRSZXN1bHR7UGFyZW50SUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzFdOwogICAgICAgICRSZXN1bHR7Q2FsZW5kYXJJRH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzJdOwogICAgICAgICRSZXN1bHR7VW5pcXVlSUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzNdOwogICAgICAgICRSZXN1bHR7VGl0bGV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzRdOwogICAgICAgICRSZXN1bHR7RGVzY3JpcHRpb259ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzVdOwogICAgICAgICRSZXN1bHR7TG9jYXRpb259ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzZdOwogICAgICAgICRSZXN1bHR7U3RhcnRUaW1lfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzddOwogICAgICAgICRSZXN1bHR7RW5kVGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzhdOwogICAgICAgICRSZXN1bHR7QWxsRGF5fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzldOwogICAgICAgICRSZXN1bHR7VGVhbUlEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcQFRlYW1JRDsKICAgICAgICAkUmVzdWx0e1Jlc291cmNlSUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXEBSZXNvdXJjZUlEOwogICAgICAgICRSZXN1bHR7UmVjdXJyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzEyXTsKICAgICAgICAkUmVzdWx0e1JlY3VycmVuY2VUeXBlfSAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxM107CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlRnJlcXVlbmN5fSAgICAgICAgICAgICAgICAgICA9IFxAUmVjdXJyZW5jZUZyZXF1ZW5jeTsKICAgICAgICAkUmVzdWx0e1JlY3VycmVuY2VDb3VudH0gICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxNV07CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlSW50ZXJ2YWx9ICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMTZdOwogICAgICAgICRSZXN1bHR7UmVjdXJyZW5jZVVudGlsfSAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzE3XTsKICAgICAgICAkUmVzdWx0e1JlY3VycmVuY2VJRH0gICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxOF07CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlRXhjbHVkZX0gICAgICAgICAgICAgICAgICAgICA9IFxAUmVjdXJyZW5jZUV4Y2x1ZGU7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25EYXRlfSAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMjBdIHx8ICcnOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uVGVtcGxhdGV9ICAgICAgICAgICAgICAgICAgPSAkUm93WzIxXSB8fCAnJzsKICAgICAgICAkUmVzdWx0e05vdGlmaWNhdGlvbkN1c3RvbX0gICAgICAgICAgICAgICAgICAgID0gJFJvd1syMl0gfHwgJyc7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0gICA9ICRSb3dbMjNdIHx8IDA7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9ICAgICAgICA9ICRSb3dbMjRdIHx8ICcnOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0gPSAkUm93WzI1XSB8fCAnJzsKICAgICAgICAkUmVzdWx0e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSAgICAgICAgICAgID0gJFJvd1syNl0gfHwgJyc7CiAgICAgICAgJFJlc3VsdHtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0gICAgICAgICAgICAgICA9ICRSb3dbMjddOwogICAgICAgICRSZXN1bHR7Q3JlYXRlVGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzI4XTsKICAgICAgICAkUmVzdWx0e0NyZWF0ZUJ5fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1syOV07CiAgICAgICAgJFJlc3VsdHtDaGFuZ2VUaW1lfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMzBdOwogICAgICAgICRSZXN1bHR7Q2hhbmdlQnl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzMxXTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKCiAgICAgICAgIyBjYWNoZQogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVSZXN1bHQsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICVSZXN1bHQ7Cn0KCj1pdGVtIEFwcG9pbnRtZW50VXBkYXRlKCkKCnVwZGF0ZXMgYW4gZXhpc3RpbmcgYXBwb2ludG1lbnQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50VXBkYXRlKAogICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBWYWxpZCBDYWxlbmRhcklECiAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgID0+ICdXZWJpbmFyJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFRpdGxlCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgID0+ICdIb3cgdG8gdXNlIFByb2Nlc3MgdGlja2V0cy4uLicsICAgICAgICAgIyAob3B0aW9uYWwpIERlc2NyaXB0aW9uCiAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgID0+ICdTdHJhdWJpbmcnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIExvY2F0aW9uCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgID0+IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIERlZmF1bHQgMAogICAgICAgIFRlYW0gICAgICAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFJlc291cmNlSUQgICAgICAgICAgICA9PiBbIDEsIDMgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBpZiBzdXBwbGllZAogICAgICAgIFJlY3VycmluZyAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBmbGFnIHRoZSBhcHBvaW50bWVudCBhcyByZWN1cnJpbmcgKHBhcmVudCBvbmx5ISkKCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICAgID0+ICdEYWlseScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQgaWYgUmVjdXJyaW5nKSBQb3NzaWJsZSAiRGFpbHkiLCAiV2Vla2x5IiwgIk1vbnRobHkiLCAiWWVhcmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAiQ3VzdG9tV2Vla2x5IiwgIkN1c3RvbU1vbnRobHkiLCAiQ3VzdG9tWWVhcmx5IgoKICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCBpZiBDdXN0b20gUmVjdXJyaW5nKSBSZWN1cnJlbmNlIHBhdHRlcm4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICBmb3IgQ3VzdG9tV2Vla2x5OiAxLU1vbiwgMi1UdWUsLi4uLCA3LVN1bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgIGZvciBDdXN0b21Nb250aGx5OiAxLUphbiwgMi1GZWIsLi4uLCAxMi1EZWMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIC4uLgogICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBIb3cgbWFueSBBcHBvaW50bWVudHMgdG8gY3JlYXRlCiAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICAgID0+IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFJlcGVhdGluZyBpbnRlcnZhbCAoZGVmYXVsdCAxKQogICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICAgICA9PiAnMjAxNi0wMS0xMCAwMDowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBVbnRpbCBkYXRlCiAgICAgICAgTm90aWZpY2F0aW9uVGltZSAgICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFBvaW50IG9mIHRpbWUgdG8gZXhlY3V0ZSB0aGUgbm90aWZpY2F0aW9uIGV2ZW50CiAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgID0+ICdDdXN0b20nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRlbXBsYXRlIHRvIGJlIHVzZWQgZm9yIG5vdGlmaWNhdGlvbiBwb2ludCBvZiB0aW1lCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgID0+ICdyZWxhdGl2ZScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFR5cGUgb2YgdGhlIGN1c3RvbSB0ZW1wbGF0ZSBub3RpZmljYXRpb24gcG9pbnQgb2YgdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAicmVsYXRpdmUiLCAiZGF0ZXRpbWUiCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAnMTInLCAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG1pbnV0ZXMsIGhvdXJzIG9yIGRheXMgY291bnQgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLCAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIHVuaXQgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiBleGVjdXRlIGZvciBjdXN0b20gdGVtcGxhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIFBvc3NpYmxlICJiZWZvcmVzdGFydCIsICJhZnRlcnN0YXJ0IiwgImJlZm9yZWVuZCIsICJhZnRlcmVuZCIKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsICAgICAgICAgICAgICAjIChvcHRpb25hbCkgTm90aWZpY2F0aW9uIGRhdGUgdGltZSBmb3IgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywgIyAob3B0aW9uYWwpIFRpY2tldCBhcHBvaW50bWVudCBydWxlIElEIChmb3IgdGlja2V0IGFwcG9pbnRtZW50cyBvbmx5ISkKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVXNlcklECiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWw6CiAgICAkU3VjY2VzcyA9IDE7CgpFdmVudHM6CiAgICBBcHBvaW50bWVudFVwZGF0ZQoKPWN1dAoKc3ViIEFwcG9pbnRtZW50VXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIENhbGVuZGFySUQgVGl0bGUgU3RhcnRUaW1lIEVuZFRpbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBwb3NzaWJsZSBub3RpZmljYXRpb24gcGFyYW1zCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5fQXBwb2ludG1lbnROb3RpZmljYXRpb25QcmVwYXJlKAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAjIGlmIFJlY3VycmluZyBpcyBwcm92aWRlZCwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIG11c3QgYmUgcHJlc2VudAogICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSApIHsKCiAgICAgICAgbXkgQFJlY3VycmVuY2VUeXBlcyA9ICgKICAgICAgICAgICAgIkRhaWx5IiwgICAgICAgIldlZWtseSIsICAgICAgICJNb250aGx5IiwgICAgICAgIlllYXJseSIsCiAgICAgICAgICAgICJDdXN0b21EYWlseSIsICJDdXN0b21XZWVrbHkiLCAiQ3VzdG9tTW9udGhseSIsICJDdXN0b21ZZWFybHkiCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFBhcmFte1JlY3VycmVuY2VUeXBlfQogICAgICAgICAgICB8fCAhZ3JlcCB7ICRfIGVxICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gfSBAUmVjdXJyZW5jZVR5cGVzCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlVHlwZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tV2Vla2x5JwogICAgICAgICAgICAgICAgfHwgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tTW9udGhseScKICAgICAgICAgICAgICAgIHx8ICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVllYXJseScKICAgICAgICAgICAgKQogICAgICAgICAgICAmJiAhJFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlRnJlcXVlbmN5IG5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9IHx8PSAxOwoKICAgICMgY2hlY2sgU3RhcnRUaW1lCiAgICBteSAkU3RhcnRUaW1lU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICk7CiAgICBpZiAoICEkU3RhcnRUaW1lU3lzdGVtICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiU3RhcnRUaW1lIGludmFsaWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIEVuZFRpbWUKICAgIG15ICRFbmRUaW1lU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17RW5kVGltZX0sCiAgICApOwogICAgaWYgKCAhJEVuZFRpbWVTeXN0ZW0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFbmRUaW1lIGludmFsaWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGNoZWNrIGlmIGFycmF5IHJlZnMKICAgIG15ICVBcnJheXM7CiAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgcXcoVGVhbUlEIFJlc291cmNlSUQgUmVjdXJyZW5jZUZyZXF1ZW5jeSkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAkUGFyYW17JFBhcmFtZXRlcn0gJiYgQHsgJFBhcmFteyRQYXJhbWV0ZXJ9IC8vIFtdIH0gKSB7CiAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFteyRQYXJhbWV0ZXJ9ICkgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkUGFyYW1ldGVyIG5vdCBBUlJBWVJFRiEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgQEFycmF5ID0gQHsgJFBhcmFteyRQYXJhbWV0ZXJ9IH07CgogICAgICAgICAgICAjIHJlbW92ZSB1bmRlZmluZWQgdmFsdWVzCiAgICAgICAgICAgIEBBcnJheSA9IGdyZXAgeyBkZWZpbmVkICRfIH0gQEFycmF5OwoKICAgICAgICAgICAgJEFycmF5c3skUGFyYW1ldGVyfSA9IGpvaW4oICcsJywgQEFycmF5ICkgaWYgQEFycmF5OwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIG51bWJlcnMKICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICBxdyhSZWN1cnJpbmcgUmVjdXJyZW5jZUNvdW50IFJlY3VycmVuY2VJbnRlcnZhbCkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAkUGFyYW17JFBhcmFtZXRlcn0gJiYgIUlzSW50ZWdlciggJFBhcmFteyRQYXJhbWV0ZXJ9ICkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkUGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIFJlY3VycmVuY2VVbnRpbAogICAgaWYgKCAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSApIHsKCiAgICAgICAgIyB1c3VhbGx5IGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kID0gMC4gSW4gdGhpcyBjYXNlLCB0YWtlIHRpbWUgZnJvbSBTdGFydFRpbWUKICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZUNoZWNrKAogICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgIFRpbWUgICAgICAgICA9PiAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICApOwoKICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkUmVjdXJyZW5jZVVudGlsU3lzdGVtCiAgICAgICAgICAgIHx8ICRTdGFydFRpbWVTeXN0ZW0gPiAkUmVjdXJyZW5jZVVudGlsU3lzdGVtCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlVW50aWwgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHByZXZpb3VzIENhbGVuZGFySUQKICAgIG15ICRQcmV2aW91c0NhbGVuZGFySUQgPSAkU2VsZi0+X0FwcG9pbnRtZW50R2V0Q2FsZW5kYXJJRCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBzZXQgcmVjdXJyZW5jZSBleGNsdWRlIGxpc3QKICAgIG15IEBSZWN1cnJlbmNlRXhjbHVkZSA9IEB7ICRQYXJhbXtSZWN1cnJlbmNlRXhjbHVkZX0gLy8gW10gfTsKCiAgICAjIGdldCBSZWN1cnJlbmNlSUQKICAgIG15ICRSZWN1cnJlbmNlSUQgPSAkU2VsZi0+X0FwcG9pbnRtZW50R2V0UmVjdXJyZW5jZUlEKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIHVzZSBleGNsdWRlIGxpc3QgdG8gZmxhZyB0aGUgcmVjdXJyaW5nIG9jY3VycmVuY2UgYXMgdXBkYXRlZAogICAgaWYgKCRSZWN1cnJlbmNlSUQpIHsKICAgICAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSAoJFJlY3VycmVuY2VJRCk7CiAgICB9CgogICAgIyByZXNldCBleGNsdWRlIGxpc3QgaWYgcmVjdXJyZW5jZSBpcyB0dXJuZWQgb2ZmCiAgICBlbHNpZiAoICEkUGFyYW17UmVjdXJyaW5nfSApIHsKICAgICAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSAoKTsKICAgIH0KCiAgICAjIHJlbW92ZSB1bmRlZmluZWQgdmFsdWVzCiAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBncmVwIHsgZGVmaW5lZCAkXyB9IEBSZWN1cnJlbmNlRXhjbHVkZTsKCiAgICAjIHNlcmlhbGl6ZSBkYXRhCiAgICBteSAkUmVjdXJyZW5jZUV4Y2x1ZGUgPSBqb2luKCAnLCcsIEBSZWN1cnJlbmNlRXhjbHVkZSApIHx8IHVuZGVmOwoKICAgICMgZGVsZXRlIGV4aXN0aW5nIHJlY3VycmVkIGFwcG9pbnRtZW50cwogICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkU2VsZi0+X0FwcG9pbnRtZW50UmVjdXJyaW5nRGVsZXRlKAogICAgICAgIFBhcmVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgaWYgKCAhJERlbGV0ZVN1Y2Nlc3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVbmFibGUgdG8gZGVsZXRlIHJlY3VycmluZyBBcHBvaW50bWVudCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50CiAgICBteSAkU1FMID0gJwogICAgICAgIFVQREFURSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgIFNFVAogICAgICAgICAgICBjYWxlbmRhcl9pZD0/LCB0aXRsZT0/LCBkZXNjcmlwdGlvbj0/LCBsb2NhdGlvbj0/LCBzdGFydF90aW1lPT8sIGVuZF90aW1lPT8sIGFsbF9kYXk9PywKICAgICAgICAgICAgdGVhbV9pZD0/LCByZXNvdXJjZV9pZD0/LCByZWN1cnJpbmc9PywgcmVjdXJfdHlwZT0/LCByZWN1cl9mcmVxPT8sIHJlY3VyX2NvdW50PT8sCiAgICAgICAgICAgIHJlY3VyX2ludGVydmFsPT8sIHJlY3VyX3VudGlsPT8sIHJlY3VyX2V4Y2x1ZGU9Pywgbm90aWZ5X3RpbWU9Pywgbm90aWZ5X3RlbXBsYXRlPT8sCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b209Pywgbm90aWZ5X2N1c3RvbV91bml0X2NvdW50PT8sIG5vdGlmeV9jdXN0b21fdW5pdD0/LAogICAgICAgICAgICBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQ9Pywgbm90aWZ5X2N1c3RvbV9kYXRlPT8sIHRpY2tldF9hcHBvaW50bWVudF9ydWxlX2lkPT8sCiAgICAgICAgICAgIGNoYW5nZV90aW1lPWN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnk9PwogICAgICAgIFdIRVJFIGlkPT8KICAgICc7CgogICAgIyB1cGRhdGUgZGIgcmVjb3JkCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17Q2FsZW5kYXJJRH0sIFwkUGFyYW17VGl0bGV9LCAgIFwkUGFyYW17RGVzY3JpcHRpb259LCBcJFBhcmFte0xvY2F0aW9ufSwKICAgICAgICAgICAgXCRQYXJhbXtTdGFydFRpbWV9LCAgXCRQYXJhbXtFbmRUaW1lfSwgXCRQYXJhbXtBbGxEYXl9LCAgICAgIFwkQXJyYXlze1RlYW1JRH0sCiAgICAgICAgICAgIFwkQXJyYXlze1Jlc291cmNlSUR9LCAgICAgICAgICBcJFBhcmFte1JlY3VycmluZ30sICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZVR5cGV9LAogICAgICAgICAgICBcJEFycmF5c3tSZWN1cnJlbmNlRnJlcXVlbmN5fSwgXCRQYXJhbXtSZWN1cnJlbmNlQ291bnR9LCBcJFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0sCiAgICAgICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwgXCRSZWN1cnJlbmNlRXhjbHVkZSwgXCRQYXJhbXtOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25UZW1wbGF0ZX0sICAgICAgICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b219LAogICAgICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0sCiAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICBcJFBhcmFte1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwgICAgICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBhZGQgcmVjdXJyZWQgYXBwb2ludG1lbnRzIGFnYWluCiAgICBpZiAoICRQYXJhbXtSZWN1cnJpbmd9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPl9BcHBvaW50bWVudFJlY3VycmluZ0NyZWF0ZSgKICAgICAgICAgICAgUGFyZW50SUQgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBBcHBvaW50bWVudCA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIGNsZWFuIHVwIGxpc3QgbWV0aG9kcyBjYWNoZQogICAgbXkgQENhbGVuZGFySURzID0gKCAkUGFyYW17Q2FsZW5kYXJJRH0gKTsKICAgIHB1c2ggQENhbGVuZGFySURzLCAkUHJldmlvdXNDYWxlbmRhcklEIGlmICRQcmV2aW91c0NhbGVuZGFySUQgbmUgJFBhcmFte0NhbGVuZGFySUR9OwogICAgZm9yIG15ICRDYWxlbmRhcklEIChAQ2FsZW5kYXJJRHMpIHsKICAgICAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0xpc3QnIC4gJENhbGVuZGFySUQsCiAgICAgICAgKTsKICAgIH0KICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGZpcmUgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FwcG9pbnRtZW50VXBkYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQXBwb2ludG1lbnREZWxldGUoKQoKZGVsZXRlcyBhbiBleGlzdGluZyBhcHBvaW50bWVudC4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgQXBwb2ludG1lbnRJRCAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWw6CiAgICAkU3VjY2VzcyA9IDE7CgpFdmVudHM6CiAgICBBcHBvaW50bWVudERlbGV0ZQoKPWN1dAoKc3ViIEFwcG9pbnRtZW50RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGdldCBDYWxlbmRhcklECiAgICBteSAkQ2FsZW5kYXJJRCA9ICRTZWxmLT5fQXBwb2ludG1lbnRHZXRDYWxlbmRhcklEKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHVzZXIncyBwZXJtaXNzaW9ucyBmb3IgdGhpcyBjYWxlbmRhcgogICAgbXkgJFBlcm1pc3Npb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKS0+Q2FsZW5kYXJQZXJtaXNzaW9uR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySUQsCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgQFJlcXVpcmVkUGVybWlzc2lvbnMgPSAoICdjcmVhdGUnLCAncncnICk7CgogICAgaWYgKCAhZ3JlcCB7ICRQZXJtaXNzaW9uIGVxICRfIH0gQFJlcXVpcmVkUGVybWlzc2lvbnMgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVc2VyKCRQYXJhbXtVc2VySUR9KSBoYXMgbm8gcGVybWlzc2lvbiB0byBkZWxldGUgQXBwb2ludG1lbnQoJFBhcmFte0FwcG9pbnRtZW50SUR9KSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVBcHBvaW50bWVudCA9ICRTZWxmLT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBzYXZlIGV4Y2x1c2lvbiBpbmZvIHRvIHBhcmVudCBhcHBvaW50bWVudAogICAgaWYgKCAkQXBwb2ludG1lbnR7UGFyZW50SUR9ICYmICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSUR9ICkgewogICAgICAgICRTZWxmLT5fQXBwb2ludG1lbnRSZWN1cnJpbmdFeGNsdWRlKAogICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJEFwcG9pbnRtZW50e1BhcmVudElEfSwKICAgICAgICAgICAgUmVjdXJyZW5jZUlEID0+ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwogICAgbXkgJERlbGV0ZVJlY3VycmluZ1N1Y2Nlc3MgPSAkU2VsZi0+X0FwcG9pbnRtZW50UmVjdXJyaW5nRGVsZXRlKAogICAgICAgIFBhcmVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgaWYgKCAhJERlbGV0ZVJlY3VycmluZ1N1Y2Nlc3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdSZWN1cnJpbmcgYXBwb2ludG1lbnRzIGNvdWxkblwndCBiZSBkZWxldGVkIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgYXBwb2ludG1lbnQKICAgIG15ICRTUUwgPSAnCiAgICAgICAgREVMRVRFIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICBXSEVSRSBpZD0/CiAgICAnOwoKICAgICMgZGVsZXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBjbGVhbiB1cCBsaXN0IG1ldGhvZHMgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdMaXN0JyAuICRDYWxlbmRhcklELAogICAgKTsKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGZpcmUgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FwcG9pbnRtZW50RGVsZXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQXBwb2ludG1lbnREZWxldGVPY2N1cnJlbmNlKCkKCmRlbGV0ZXMgYSBzaW5nbGUgcmVjdXJyaW5nIGFwcG9pbnRtZW50IG9jY3VycmVuY2UuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlT2NjdXJyZW5jZSgKICAgICAgICBVbmlxdWVJRCAgICAgPT4gJzIwMTYwMTAxVDE2MDAwMC03MUUzODZAbG9jYWxob3N0JywgICAgIyAocmVxdWlyZWQpCiAgICAgICAgUmVjdXJyZW5jZUlEID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICk7CgpyZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bDoKICAgICRTdWNjZXNzID0gMTsKCj1jdXQKCnN1YiBBcHBvaW50bWVudERlbGV0ZU9jY3VycmVuY2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFVuaXF1ZUlEIENhbGVuZGFySUQgUmVjdXJyZW5jZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkYiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBpZCBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgICAgIFdIRVJFIHVuaXF1ZV9pZD0/IEFORCBjYWxlbmRhcl9pZD0/IEFORCByZWN1cl9pZD0/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VW5pcXVlSUR9LCBcJFBhcmFte0NhbGVuZGFySUR9LCBcJFBhcmFte1JlY3VycmVuY2VJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAlQXBwb2ludG1lbnQ7CgogICAgIyBnZXQgYWRkaXRpb25hbCBpbmZvCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gPSAkUm93WzBdOwogICAgfQogICAgcmV0dXJuIGlmICElQXBwb2ludG1lbnQ7CgogICAgIyBkZWxldGUgZGIgcmVjb3JkCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICAgPT4gJ0RFTEVURSBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50IFdIRVJFIGlkPT8nLAogICAgICAgIEJpbmQgID0+IFsgXCRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGNhY2hlIG9iamVjdAogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIGNsZWFuIHVwIGxpc3QgbWV0aG9kcyBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0xpc3QnIC4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgKTsKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gR2V0VW5pcXVlSUQoKQoKcmV0dXJucyBVbmlxdWVJRCBjb250YWluaW5nIGFwcG9pbnRtZW50IHN0YXJ0IHRpbWUsIHJhbmRvbSBoYXNoIGFuZCBzeXN0ZW0gRlFETi4KCiAgICBteSAkVW5pcXVlSUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkdldFVuaXF1ZUlEKAogICAgICAgIENhbGVuZGFySUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBTdGFydFRpbWUgID0+IDE0NTE2MDY0MDAsICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgVXNlcklEICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgKTsKCiAgICAkVW5pcXVlSUQgPSAnJzsKCj1jdXQKCnN1YiBHZXRVbmlxdWVJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBTdGFydFRpbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2FsY3VsYXRlIGEgaGFzaAogICAgbXkgJFJhbmRvbVN0cmluZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkdlbmVyYXRlUmFuZG9tU3RyaW5nKCBMZW5ndGggPT4gMzIgKTsKICAgIG15ICRTdHJpbmcgICAgICAgPSAiJFBhcmFte0NhbGVuZGFySUR9LSRSYW5kb21TdHJpbmctJFBhcmFte1VzZXJJRH0iOwogICAgbXkgJERpZ2VzdCAgICAgICA9IHVucGFjayggJ04nLCBEaWdlc3Q6Ok1ENS0+bmV3KCktPmFkZCgkU3RyaW5nKS0+ZGlnZXN0KCkgKTsKICAgIG15ICREaWdlc3RIZXggICAgPSBzcHJpbnRmKCAnJXgnLCAkRGlnZXN0ICk7CiAgICBteSAkSGFzaCAgICAgICAgID0gdWMoIHNwcmludGYoICIlLjZzIiwgJERpZ2VzdEhleCApICk7CgogICAgIyBwcmVwYXJlIHN0YXJ0IHRpbWVzdGFtcCBmb3IgVW5pcXVlSUQKICAgIG15ICRTdGFydFRpbWVTdHJnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKS0+VGltZXN0YW1wR2V0KAogICAgICAgIFN5c3RlbVRpbWUgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICApOwogICAgJFN0YXJ0VGltZVN0cmcgPX4gcy9bLTpdLy9nOwogICAgJFN0YXJ0VGltZVN0cmcgPX4gcy9ccy9ULzsKCiAgICAjIGdldCBzeXN0ZW0gRlFETgogICAgbXkgJEZRRE4gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ZRRE4nKTsKCiAgICAjIHJldHVybiBVbmlxdWVJRAogICAgcmV0dXJuICIkU3RhcnRUaW1lU3RyZy0kSGFzaFxAJEZRRE4iOwp9Cgo9aXRlbSBBcHBvaW50bWVudFVwY29taW5nR2V0KCkKCkdldCBhcHBvaW50bWVudCBkYXRhIGZvciB1cGNvbWluZyBhcHBvaW50bWVudCBzdGFydCBvciBlbmQuCgogICAgbXkgQFVwY29taW5nQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwY29taW5nR2V0KAogICAgICAgIFRpbWVzdGFtcCA9PiAnMjAxNi0wOC0wMiAwMzo1OTowMCcsICMgZ2V0IGFwcG9pbnRtZW50cyBmb3IgdGhlIHJlbGF0ZWQgbm90aWZpY2F0aW9uIHRpbWVzdGFtcAogICAgKTsKCnJldHVybnM6CgogICAgQXBwb2ludG1lbnQgZGF0YSBvZiBBcHBvaW50bWVudEdldCgpLgoKPWN1dAoKc3ViIEFwcG9pbnRtZW50VXBjb21pbmdHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjdXJyZW50IHRpbWVzdGFtcAogICAgbXkgJEN1cnJlbnRUaW1lc3RhbXA7CgogICAgIyBjcmVhdGUgbmVlZGVkIHNxbCBxdWVyeSBiYXNlZCBvbiB0aGUgY3VycmVudCBvciBhIGdpdmVuIHRpbWVzdGFtcAogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQsIHBhcmVudF9pZCwgY2FsZW5kYXJfaWQsIHVuaXF1ZV9pZCBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50ICc7CgogICAgaWYgKCAkUGFyYW17VGltZXN0YW1wfSApIHsKCiAgICAgICAgJEN1cnJlbnRUaW1lc3RhbXAgPSAkUGFyYW17VGltZXN0YW1wfTsKICAgICAgICAkU1FMIC49ICJXSEVSRSBub3RpZnlfdGltZSA9ID8gIjsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAkQ3VycmVudFRpbWVzdGFtcCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyktPkN1cnJlbnRUaW1lc3RhbXBHZXQoKTsKICAgICAgICAkU1FMIC49ICJXSEVSRSBub3RpZnlfdGltZSA+PSA/ICI7CiAgICB9CgogICAgJFNRTCAuPSAnT1JERVIgQlkgbm90aWZ5X3RpbWUgQVNDJzsKCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbIFwkQ3VycmVudFRpbWVzdGFtcCBdLAogICAgKTsKCiAgICBteSBAUmVzdWx0UmF3OwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAlVXBjb21pbmdBcHBvaW50bWVudDsKCiAgICAgICAgJFVwY29taW5nQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gPSAkUm93WzBdOwogICAgICAgICRVcGNvbWluZ0FwcG9pbnRtZW50e1BhcmVudElEfSAgICAgID0gJFJvd1sxXTsKICAgICAgICAkVXBjb21pbmdBcHBvaW50bWVudHtDYWxlbmRhcklEfSAgICA9ICRSb3dbMl07CiAgICAgICAgJFVwY29taW5nQXBwb2ludG1lbnR7VW5pcXVlSUR9ICAgICAgPSAkUm93WzNdOwoKICAgICAgICBwdXNoIEBSZXN1bHRSYXcsIFwlVXBjb21pbmdBcHBvaW50bWVudDsKICAgIH0KCiAgICBteSBAUmVzdWx0czsKCiAgICBBUFBPSU5UTUVOVERBVEE6CiAgICBmb3IgbXkgJEFwcG9pbnRtZW50RGF0YSAoQFJlc3VsdFJhdykgewoKICAgICAgICBuZXh0IEFQUE9JTlRNRU5UREFUQSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJEFwcG9pbnRtZW50RGF0YSk7CiAgICAgICAgbmV4dCBBUFBPSU5UTUVOVERBVEEgaWYgISRBcHBvaW50bWVudERhdGEtPntDYWxlbmRhcklEfTsKICAgICAgICBuZXh0IEFQUE9JTlRNRU5UREFUQSBpZiAhJEFwcG9pbnRtZW50RGF0YS0+e0FwcG9pbnRtZW50SUR9OwoKICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkU2VsZi0+QXBwb2ludG1lbnRHZXQoICV7JEFwcG9pbnRtZW50RGF0YX0gKTsKCiAgICAgICAgcHVzaCBAUmVzdWx0cywgXCVBcHBvaW50bWVudDsKICAgIH0KCiAgICByZXR1cm4gQFJlc3VsdHM7Cn0KCj1pdGVtIEFwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUoKQoKRGVsZXRlIGFsbCBjYWxlbmRhciBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUoKTsKCnJldHVybnM6CgogICAgVHJ1ZSBpZiBmdXR1cmUgdGFzayBkZWxldGlvbiB3YXMgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGZhbHNlLgoKPWN1dAoKc3ViIEFwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBhIGxvY2FsIHNjaGVkdWxlciBkYiBvYmplY3QKICAgIG15ICRTY2hlZHVsZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2NoZWR1bGVyJyk7CgogICAgIyBnZXQgYSBsaXN0IG9mIGFscmVhZHkgc3RvcmVkIGZ1dHVyZSB0YXNrcwogICAgbXkgQEZ1dHVyZVRhc2tMaXN0ID0gJFNjaGVkdWxlck9iamVjdC0+RnV0dXJlVGFza0xpc3QoCiAgICAgICAgVHlwZSA9PiAnQ2FsZW5kYXJBcHBvaW50bWVudCcsCiAgICApOwoKICAgICMgZmx1c2ggb2Jzb2xldGUgZnV0dXJlIHRhc2tzCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggXEBGdXR1cmVUYXNrTGlzdCApICkgewoKICAgICAgICBGVVRVUkVUQVNLOgogICAgICAgIGZvciBteSAkRnV0dXJlVGFzayAoQEZ1dHVyZVRhc2tMaXN0KSB7CgogICAgICAgICAgICBuZXh0IEZVVFVSRVRBU0sgaWYgISRGdXR1cmVUYXNrOwogICAgICAgICAgICBuZXh0IEZVVFVSRVRBU0sgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRGdXR1cmVUYXNrKTsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNjaGVkdWxlck9iamVjdC0+RnV0dXJlVGFza0RlbGV0ZSgKICAgICAgICAgICAgICAgIFRhc2tJRCA9PiAkRnV0dXJlVGFzay0+e1Rhc2tJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBkZWxldGUgZnV0dXJlIHRhc2sgd2l0aCBpZCAkRnV0dXJlVGFzay0+e1Rhc2tJRH0hIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKQoKVXBkYXRlIE9UUlMgZGFlbW9uIGZ1dHVyZSB0YXNrIGxpc3QgZm9yIHVwY29taW5nIGFwcG9pbnRtZW50cy4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRGdXR1cmVUYXNrc1VwZGF0ZSgpOwoKcmV0dXJuczoKCiAgICBUcnVlIGlmIGZ1dHVyZSB0YXNrIHVwZGF0ZSB3YXMgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGZhbHNlLgoKPWN1dAoKc3ViIEFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBhcHBvaW50bWVudCBkYXRhIGZvciB1cGNvbWluZyBhcHBvaW50bWVudHMKICAgIG15IEBVcGNvbWluZ0FwcG9pbnRtZW50cyA9ICRTZWxmLT5BcHBvaW50bWVudFVwY29taW5nR2V0KCk7CgogICAgIyBjaGVjayBmb3Igbm8gdXBjb21pbmcgYXBwb2ludG1lbnRzCiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoIFxAVXBjb21pbmdBcHBvaW50bWVudHMgKSApIHsKCiAgICAgICAgIyBmbHVzaCBvYnNvbGV0ZSBmdXR1cmUgdGFza3MKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IGRlbGV0ZSBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBnZXQgYSBsb2NhbCBzY2hlZHVsZXIgZGIgb2JqZWN0CiAgICBteSAkU2NoZWR1bGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNjaGVkdWxlcicpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiBhbHJlYWR5IHN0b3JlZCBmdXR1cmUgdGFza3MKICAgIG15IEBGdXR1cmVUYXNrTGlzdCA9ICRTY2hlZHVsZXJPYmplY3QtPkZ1dHVyZVRhc2tMaXN0KAogICAgICAgIFR5cGUgPT4gJ0NhbGVuZGFyQXBwb2ludG1lbnQnLAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBpbnZhbGlkIHRhc2sgY291bnQgKGp1c3Qgb25lIHRhc2sgbWF4IGFsbG93ZWQpCiAgICBpZiAoIHNjYWxhciBARnV0dXJlVGFza0xpc3QgPiAxICkgewoKICAgICAgICAjIGZsdXNoIG9ic29sZXRlIGZ1dHVyZSB0YXNrcwogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUoKTsKCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDb3VsZCBub3QgZGVsZXRlIGFwcG9pbnRtZW50IGZ1dHVyZSB0YXNrcyEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgaXQgaXMgbmVlZGVkIHRvIHVwZGF0ZSB0aGUgZnV0dXJlIHRhc2sgbGlzdAogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoIFxARnV0dXJlVGFza0xpc3QgKSApIHsKCiAgICAgICAgIyBnZXQgYSBsb2NhbCBjYWxlbmRhciBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAgICAgbXkgJFVwZGF0ZU5lZWRlZCA9IDA7CgogICAgICAgIEZVVFVSRVRBU0s6CiAgICAgICAgZm9yIG15ICRGdXR1cmVUYXNrIChARnV0dXJlVGFza0xpc3QpIHsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICFJc0hhc2hSZWZXaXRoRGF0YSgkRnV0dXJlVGFzaykKICAgICAgICAgICAgICAgIHx8ICEkRnV0dXJlVGFzay0+e1Rhc2tJRH0KICAgICAgICAgICAgICAgIHx8ICEkRnV0dXJlVGFzay0+e0V4ZWN1dGlvblRpbWV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRVcGRhdGVOZWVkZWQgPSAxOwogICAgICAgICAgICAgICAgbGFzdCBGVVRVUkVUQVNLOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB0aGUgc3RvcmVkIGZ1dHVyZSB0YXNrCiAgICAgICAgICAgIG15ICVGdXR1cmVUYXNrRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tHZXQoCiAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJEZ1dHVyZVRhc2stPntUYXNrSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlRnV0dXJlVGFza0RhdGEgKSApIHsKICAgICAgICAgICAgICAgICRVcGRhdGVOZWVkZWQgPSAxOwogICAgICAgICAgICAgICAgbGFzdCBGVVRVUkVUQVNLOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB1bml4IHRpbWVzdGFtcHMgb2Ygc3RvcmVkIGFuZCB1cGNvbWluZyB0aW1lcyB0byBjb21wYXJlCiAgICAgICAgICAgIG15ICRGdXR1cmVUYXNrVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRnV0dXJlVGFza0RhdGF7RGF0YX0tPntOb3RpZnlUaW1lfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFVwY29taW5nQXBwb2ludG1lbnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRVcGNvbWluZ0FwcG9pbnRtZW50c1swXS0+e05vdGlmaWNhdGlvbkRhdGV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkbyBub3RoaW5nIGlmIHRoZSB1cGNvbWluZyBub3RpZmljYXRpb24gdGltZSBlcXVhbHMgdGhlIHN0b3JlZCB2YWx1ZQogICAgICAgICAgICBpZiAoICRVcGNvbWluZ0FwcG9pbnRtZW50VGltZSAhPSAkRnV0dXJlVGFza1RpbWUgKSB7CiAgICAgICAgICAgICAgICAkVXBkYXRlTmVlZGVkID0gMTsKICAgICAgICAgICAgICAgIGxhc3QgRlVUVVJFVEFTSzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRVcGRhdGVOZWVkZWQpIHsKCiAgICAgICAgICAgICMgZmx1c2ggb2Jzb2xldGUgZnV0dXJlIHRhc2tzCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUoKTsKCiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IGRlbGV0ZSBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MhJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNjaGVkdWxlIG5ldyBmdXR1cmUgdGFza3MgZm9yIG5vdGlmaWNhdGlvbiBhY3Rpb25zCiAgICBteSAkVGFza0lEID0gJFNjaGVkdWxlck9iamVjdC0+VGFza0FkZCgKICAgICAgICBFeGVjdXRpb25UaW1lID0+ICRVcGNvbWluZ0FwcG9pbnRtZW50c1swXS0+e05vdGlmaWNhdGlvbkRhdGV9LAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uJywKICAgICAgICBUeXBlICAgICAgICAgID0+ICdDYWxlbmRhckFwcG9pbnRtZW50JywKICAgICAgICBEYXRhICAgICAgICAgID0+IHsKICAgICAgICAgICAgTm90aWZ5VGltZSA9PiAkVXBjb21pbmdBcHBvaW50bWVudHNbMF0tPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICEkVGFza0lEICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNjaGVkdWxlIGZ1dHVyZSB0YXNrIGZvciBBcHBvaW50bWVudElEICRVcGNvbWluZ0FwcG9pbnRtZW50c1swXS0+e0FwcG9pbnRtZW50SUR9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9BcHBvaW50bWVudE5vdGlmaWNhdGlvblByZXBhcmUoKQoKUHJlcGFyZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gZGF0YS4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+X0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uUHJlcGFyZSgpOwoKcmV0dXJuczoKCiAgICBUcnVlIGlmIHByZXBhcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZmFsc2UuCgo9Y3V0CgpzdWIgX0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlc2V0IG5vdGlmaWNhdGlvbiBkYXRhIGlmIG5lZWRlZAogICAgaWYgKCAhJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9ICkgewoKICAgICAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKAogICAgICAgICAgICBxdygKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSBOb3RpZmljYXRpb25UZW1wbGF0ZSBOb3RpZmljYXRpb25DdXN0b20gTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0IE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17RGF0YX0tPnskUG9zc2libGVQYXJhbX0gPSB1bmRlZjsKICAgICAgICB9CiAgICB9CgogICAgIyBwcmVwYXJlIHBvc3NpYmxlIG5vdGlmaWNhdGlvbiBwYXJhbXMKICAgIGZvciBteSAkUG9zc2libGVQYXJhbSAoCiAgICAgICAgcXcoCiAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgTm90aWZpY2F0aW9uQ3VzdG9tIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtEYXRhfS0+eyRQb3NzaWJsZVBhcmFtfSB8fD0gJyc7CiAgICB9CgogICAgIyBzcGVjaWFsIGNoZWNrIGZvciByZWxhdGl2ZSB1bml0IGNvdW50IGFzIGl0IGNhbiBiZSB6ZXJvCiAgICAjIChlbXB0eSBhbmQgbmVnYXRpdmUgdmFsdWVzIHdpbGwgYmUgdHJlYXRlZCBhcyB6ZXJvIHRvIGF2b2lkIGVycm9ycykKICAgIGlmICgKICAgICAgICAhSXNOdW1iZXIoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSApCiAgICAgICAgfHwgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9IDw9IDAKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9ID0gMDsKICAgIH0KCiAgICAjIHNldCBlbXB0eSBkYXRldGltZSBzdHJpbmdzIHRvIHVuZGVmCiAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKHF3KE5vdGlmaWNhdGlvbkRhdGUgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUpKSB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57JFBvc3NpYmxlUGFyYW19IHx8PSB1bmRlZjsKICAgIH0KCiAgICByZXR1cm4gaWYgISRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfTsKCiAgICAjIGdldCBhIGxvY2FsIGNhbGVuZGFyIGhlbHBlciBvYmplY3QKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgIyAtLS0tLS0tLS0tLS0tLQogICAgIyB0ZW1wbGF0ZSBTdGFydAogICAgIyAtLS0tLS0tLS0tLS0tLQogICAgaWYgKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0gZXEgJ1N0YXJ0JyApIHsKCiAgICAgICAgIyBzZXR1cCB0aGUgYXBwb2ludG1lbnQgc3RhcnQgZGF0ZSBhcyBub3RpZmljYXRpb24gZGF0ZQogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJFBhcmFte0RhdGF9LT57U3RhcnRUaW1lfTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIHRlbXBsYXRlIHRpbWUgYmVmb3JlIHN0YXJ0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBlbHNpZiAoCiAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9IG5lICdDdXN0b20nCiAgICAgICAgJiYgSXNOdW1iZXIoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfSApCiAgICAgICAgJiYgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9ID4gMAogICAgICAgICkKICAgIHsKCiAgICAgICAgcmV0dXJuIGlmICFJc051bWJlciggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9ICk7CgogICAgICAgICMgb2Zmc2V0IHRlbXBsYXRlIChiZWZvcmUgc3RhcnQgZGF0ZXRpbWUpIHVzZWQKICAgICAgICBteSAkT2Zmc2V0ID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9OwoKICAgICAgICAjIGdldCBhIHVuaXggdGltZXN0YW1wIG9mIGFwcG9pbnRtZW50IHN0YXJ0IHRpbWUKICAgICAgICBteSAkU3RhcnRMb2NhbFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntTdGFydFRpbWV9LAogICAgICAgICk7CgogICAgICAgICMgc2F2ZSB0aGUgc3RhcnQgdGltZSAtIG9mZnNldCBhcyBuZXcgbm90aWZpY2F0aW9uIGRhdGV0aW1lIHN0cmluZwogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gKCAkU3RhcnRMb2NhbFRpbWUgLSAkT2Zmc2V0ICksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLQogICAgIyB0ZW1wbGF0ZSBDdXN0b20KICAgICMgLS0tLS0tLS0tLS0tLS0tCiAgICBlbHNlIHsKCiAgICAgICAgIyBDb21wdXRlIGRhdGUgb2YgY3VzdG9tIHJlbGF0aXZlIGlucHV0LgogICAgICAgIGlmICggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tfSBlcSAncmVsYXRpdmUnICkgewoKICAgICAgICAgICAgbXkgJEN1c3RvbVVuaXRDb3VudCA9ICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fTsKICAgICAgICAgICAgbXkgJEN1c3RvbVVuaXQgICAgICA9ICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH07CiAgICAgICAgICAgIG15ICRDdXN0b21Vbml0UG9pbnQgPSAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfTsKCiAgICAgICAgICAgICMgc2V0dXAgdGhlIGNvdW50IHRvIGNvbXB1dGUgZm9yIHRoZSBvZmZzZXQKICAgICAgICAgICAgbXkgJVVuaXRPZmZzZXRDb21wdXRlID0gKAogICAgICAgICAgICAgICAgbWludXRlcyA9PiA2MCwKICAgICAgICAgICAgICAgIGhvdXJzICAgPT4gMzYwMCwKICAgICAgICAgICAgICAgIGRheXMgICAgPT4gODY0MDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkTm90aWZpY2F0aW9uTG9jYWxUaW1lOwoKICAgICAgICAgICAgIyBjb21wdXRlIGZyb20gc3RhcnQgdGltZQogICAgICAgICAgICBpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZXN0YXJ0JyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdhZnRlcnN0YXJ0JyApIHsKCiAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uTG9jYWxUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjb21wdXRlIGZyb20gZW5kIHRpbWUKICAgICAgICAgICAgZWxzaWYgKCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVlbmQnIHx8ICRDdXN0b21Vbml0UG9pbnQgZXEgJ2FmdGVyZW5kJyApIHsKCiAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uTG9jYWxUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntFbmRUaW1lfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbm90IHN1cHBvcnRlZCBwb2ludCBvZiB0aW1lCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNvbXB1dGUgdGhlIG9mZnNldCB0byBiZSB1c2VkCiAgICAgICAgICAgIG15ICRPZmZzZXQgPSAoICRDdXN0b21Vbml0Q291bnQgKiAkVW5pdE9mZnNldENvbXB1dGV7JEN1c3RvbVVuaXR9ICk7CgogICAgICAgICAgICAjIHNhdmUgdGhlIG5ld2x5IGNvbXB1dGVkIG5vdGlmaWNhdGlvbiBkYXRldGltZSBzdHJpbmcKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVzdGFydCcgfHwgJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3JlZW5kJyApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAoICROb3RpZmljYXRpb25Mb2NhbFRpbWUgLSAkT2Zmc2V0ICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uRGF0ZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICggJE5vdGlmaWNhdGlvbkxvY2FsVGltZSArICRPZmZzZXQgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQ29tcHV0ZSBkYXRlIG9mIGN1c3RvbSBkYXRlL3RpbWUgaW5wdXQuCiAgICAgICAgZWxzaWYgKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b219IGVxICdkYXRldGltZScgKSB7CgogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b219ID0gJ2RhdGV0aW1lJzsKCiAgICAgICAgICAgICMgdmFsaWRhdGlvbgogICAgICAgICAgICBpZiAoICFJc1N0cmluZ1dpdGhEYXRhKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzYXZlIHRoZSBnaXZlbiBkYXRlIHRpbWUgdmFsdWVzIGFzIG5vdGlmaWNhdGlvbiBkYXRldGltZSBzdHJpbmcgKGkuZS4gMjAxNi0wNi0yOCAwMjowMDowMCkKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uRGF0ZX0gPSAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX07CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ICkgKSB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uRGF0ZX0gPSB1bmRlZjsKICAgIH0KCiAgICBpZiAoICFJc1N0cmluZ1dpdGhEYXRhKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0gKSApIHsKICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0gPSB1bmRlZjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQXBwb2ludG1lbnROb3RpZmljYXRpb24oKQoKV2lsbCBiZSB0cmlnZ2VyZWQgYnkgdGhlIE9UUlMgZGFlbW9uIHRvIGZpcmUgZXZlbnRzIGZvciBhcHBvaW50bWVudHMsCnRoYXQgcmVhY2hlcyBpdCdzIHJlbWluZGVyIChub3RpZmljYXRpb24pIHRpbWUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uKCk7CgpyZXR1cm5zOgoKICAgIFRydWUgaWYgbm90aWZ5IGFjdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGZhbHNlLgoKPWN1dAoKc3ViIEFwcG9pbnRtZW50Tm90aWZpY2F0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhOb3RpZnlUaW1lKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGFwcG9pbnRtZW50cyBmb3IgdGhlIHJlbGF0ZWQgbm90aWZpY2F0aW9uIHRpbWVzdGFtcAogICAgbXkgQFVwY29taW5nQXBwb2ludG1lbnRzID0gJFNlbGYtPkFwcG9pbnRtZW50VXBjb21pbmdHZXQoCiAgICAgICAgVGltZXN0YW1wID0+ICRQYXJhbXtOb3RpZnlUaW1lfSwKICAgICk7CgogICAgcmV0dXJuIGlmICFJc0FycmF5UmVmV2l0aERhdGEoIFxAVXBjb21pbmdBcHBvaW50bWVudHMgKTsKCiAgICAjIHNsZWVwIGF0IGxlYXN0IDEgc2Vjb25kIHRvIG1ha2Ugc3VyZSB0aGUgdGltZXN0YW1wIGRvZXNuJ3QKICAgICMgZXF1YWxzIHRoZSBsYXN0IG9uZSBmb3IgdXBkYXRlIHVwY29taW5nIGZ1dHVyZSB0YXNrcwogICAgc2xlZXAgMTsKCiAgICBVUENPTUlOR0FQUE9JTlRNRU5UOgogICAgZm9yIG15ICRVcGNvbWluZ0FwcG9pbnRtZW50IChAVXBjb21pbmdBcHBvaW50bWVudHMpIHsKCiAgICAgICAgbmV4dCBVUENPTUlOR0FQUE9JTlRNRU5UIGlmICEkVXBjb21pbmdBcHBvaW50bWVudDsKICAgICAgICBuZXh0IFVQQ09NSU5HQVBQT0lOVE1FTlQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRVcGNvbWluZ0FwcG9pbnRtZW50KTsKICAgICAgICBuZXh0IFVQQ09NSU5HQVBQT0lOVE1FTlQgaWYgISRVcGNvbWluZ0FwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH07CgogICAgICAgICMgZmlyZSBldmVudAogICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgIEV2ZW50ID0+ICdBcHBvaW50bWVudE5vdGlmaWNhdGlvbicsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFVwY29taW5nQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWN1dAoKc3ViIF9BcHBvaW50bWVudFJlY3VycmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFyZW50SUQgQXBwb2ludG1lbnQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2FsZW5kYXIgaGVscGVyIG9iamVjdAogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICBteSAkU3RhcnRUaW1lU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57U3RhcnRUaW1lfSwKICAgICk7CiAgICBteSAkRW5kVGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e0VuZFRpbWV9LAogICAgKTsKCiAgICBteSBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBAeyAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUV4Y2x1ZGV9IC8vIFtdIH07CgogICAgIyByZW1vdmUgdW5kZWZpbmVkIHZhbHVlcwogICAgQFJlY3VycmVuY2VFeGNsdWRlID0gZ3JlcCB7IGRlZmluZWQgJF8gfSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CgogICAgIyByZXNldCB0aGUgcGFyYW1ldGVyIGZvciBvY2N1cnJlbmNlcwogICAgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VFeGNsdWRlfSA9IHVuZGVmOwoKICAgIG15ICRPcmlnaW5hbFN0YXJ0VGltZSA9ICRTdGFydFRpbWVTeXN0ZW07CiAgICBteSAkT3JpZ2luYWxFbmRUaW1lICAgPSAkRW5kVGltZVN5c3RlbTsKICAgIG15ICRTdGVwICAgICAgICAgICAgICA9IDA7CgogICAgIyB1bnRpbCAuLi4KICAgIGlmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VVbnRpbH0gKSB7CgogICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWxTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICApOwoKICAgICAgICBVTlRJTF9USU1FOgogICAgICAgIHdoaWxlICggJFN0YXJ0VGltZVN5c3RlbSA8PSAkUmVjdXJyZW5jZVVudGlsU3lzdGVtICkgewogICAgICAgICAgICAkU3RlcCArPSAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfTsKCiAgICAgICAgICAgICMgY2FsY3VsYXRlIHJlY3VycmluZyB0aW1lcwogICAgICAgICAgICAkU3RhcnRUaW1lU3lzdGVtID0gJFNlbGYtPl9DYWxjdWxhdGVSZWN1cnJlbmNlVGltZSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50ICA9PiAkUGFyYW17QXBwb2ludG1lbnR9LAogICAgICAgICAgICAgICAgU3RlcCAgICAgICAgID0+ICRTdGVwLAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRPcmlnaW5hbFN0YXJ0VGltZSwKICAgICAgICAgICAgICAgIEN1cnJlbnRUaW1lICA9PiAkU3RhcnRUaW1lU3lzdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkRW5kVGltZVN5c3RlbSA9ICRTZWxmLT5fQ2FsY3VsYXRlUmVjdXJyZW5jZVRpbWUoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudCAgID0+ICRQYXJhbXtBcHBvaW50bWVudH0sCiAgICAgICAgICAgICAgICBTdGVwICAgICAgICAgID0+ICRTdGVwLAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lICA9PiAkT3JpZ2luYWxFbmRUaW1lLAogICAgICAgICAgICAgICAgQ3VycmVudFRpbWUgICA9PiAkRW5kVGltZVN5c3RlbSwKICAgICAgICAgICAgICAgIElzRW5kVGltZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIExhc3RTdGFydFRpbWUgPT4gJFN0YXJ0VGltZVN5c3RlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGxhc3QgVU5USUxfVElNRSBpZiAhJFN0YXJ0VGltZVN5c3RlbTsKICAgICAgICAgICAgbGFzdCBVTlRJTF9USU1FIGlmICRTdGFydFRpbWVTeXN0ZW0gPiAkUmVjdXJyZW5jZVVudGlsU3lzdGVtOwoKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lU3lzdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZVN5c3RlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYnVnZml4OiBPbiBzb21lIHN5c3RlbXMgd2l0aCBvbGRlciBwZXJsIHZlcnNpb24gc3lzdGVtIG1pZ2h0IGNhbGN1bGF0ZSB0aW1lem9uZSBkaWZmZXJlbmNlCiAgICAgICAgICAgICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVDaGVjaygKICAgICAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgIFRpbWUgICAgICAgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICApOwogICAgICAgICAgICAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZUNoZWNrKAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntFbmRUaW1lfSwKICAgICAgICAgICAgICAgIFRpbWUgICAgICAgICA9PiAkRW5kVGltZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2tpcCBleGNsdWRlZCBhcHBvaW50bWVudHMKICAgICAgICAgICAgbmV4dCBVTlRJTF9USU1FIGlmIGdyZXAgeyAkU3RhcnRUaW1lIGVxICRfIH0gQFJlY3VycmVuY2VFeGNsdWRlOwoKICAgICAgICAgICAgJFNlbGYtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0FwcG9pbnRtZW50fSB9LAogICAgICAgICAgICAgICAgUGFyZW50SUQgICAgID0+ICRQYXJhbXtQYXJlbnRJRH0sCiAgICAgICAgICAgICAgICBTdGFydFRpbWUgICAgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgICAgIEVuZFRpbWUgICAgICA9PiAkRW5kVGltZSwKICAgICAgICAgICAgICAgIFJlY3VycmVuY2VJRCA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGZvciAuLi4gdGltZShzKQogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUNvdW50fSApIHsKCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yICggMSAuLiAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUNvdW50fSAtIDEgKSB7CiAgICAgICAgICAgICRTdGVwICs9ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OwoKICAgICAgICAgICAgIyBjYWxjdWxhdGUgcmVjdXJyaW5nIHRpbWVzCiAgICAgICAgICAgICRTdGFydFRpbWVTeXN0ZW0gPSAkU2VsZi0+X0NhbGN1bGF0ZVJlY3VycmVuY2VUaW1lKAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnQgID0+ICRQYXJhbXtBcHBvaW50bWVudH0sCiAgICAgICAgICAgICAgICBTdGVwICAgICAgICAgPT4gJFN0ZXAsCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJE9yaWdpbmFsU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgQ3VycmVudFRpbWUgID0+ICRTdGFydFRpbWVTeXN0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRFbmRUaW1lU3lzdGVtID0gJFNlbGYtPl9DYWxjdWxhdGVSZWN1cnJlbmNlVGltZSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50ICAgPT4gJFBhcmFte0FwcG9pbnRtZW50fSwKICAgICAgICAgICAgICAgIFN0ZXAgICAgICAgICAgPT4gJFN0ZXAsCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgID0+ICRPcmlnaW5hbEVuZFRpbWUsCiAgICAgICAgICAgICAgICBDdXJyZW50VGltZSAgID0+ICRFbmRUaW1lU3lzdGVtLAogICAgICAgICAgICAgICAgSXNFbmRUaW1lICAgICA9PiAxLAogICAgICAgICAgICAgICAgTGFzdFN0YXJ0VGltZSA9PiAkU3RhcnRUaW1lU3lzdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAhJFN0YXJ0VGltZVN5c3RlbTsKCiAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZVN5c3RlbQogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZVN5c3RlbQogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBidWdmaXg6IE9uIHNvbWUgc3lzdGVtcyB3aXRoIG9sZGVyIHBlcmwgdmVyc2lvbiBzeXN0ZW0gbWlnaHQgY2FsY3VsYXRlIHRpbWV6b25lIGRpZmZlcmVuY2UKICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZUNoZWNrKAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lQ2hlY2soCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBza2lwIGV4Y2x1ZGVkIGFwcG9pbnRtZW50cwogICAgICAgICAgICBuZXh0IENPVU5UIGlmIGdyZXAgeyAkU3RhcnRUaW1lIGVxICRfIH0gQFJlY3VycmVuY2VFeGNsdWRlOwoKICAgICAgICAgICAgJFNlbGYtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0FwcG9pbnRtZW50fSB9LAogICAgICAgICAgICAgICAgUGFyZW50SUQgICAgID0+ICRQYXJhbXtQYXJlbnRJRH0sCiAgICAgICAgICAgICAgICBTdGFydFRpbWUgICAgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgICAgIEVuZFRpbWUgICAgICA9PiAkRW5kVGltZSwKICAgICAgICAgICAgICAgIFJlY3VycmVuY2VJRCA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9BcHBvaW50bWVudFJlY3VycmluZ0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFyZW50SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwogICAgbXkgJFNRTCA9ICcKICAgICAgICBERUxFVEUgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgIFdIRVJFIHBhcmVudF9pZD0/CiAgICAnOwoKICAgICMgZGVsZXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte1BhcmVudElEfSwKICAgICAgICBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9BcHBvaW50bWVudFJlY3VycmluZ0V4Y2x1ZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhcmVudElEIFJlY3VycmVuY2VJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgIG15ICREQk9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCByZWN1cl9leGNsdWRlIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQgV0hFUkUgaWQ9PycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17UGFyZW50SUR9IF0sCiAgICApOwoKICAgICMgZ2V0IGV4aXN0aW5nIGV4Y2x1c2lvbnMKICAgIG15IEBSZWN1cnJlbmNlRXhjbHVkZTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIEBSZWN1cnJlbmNlRXhjbHVkZSA9IHNwbGl0KCAnLCcsICRSb3dbMF0gKSBpZiAkUm93WzBdOwogICAgfQogICAgcHVzaCBAUmVjdXJyZW5jZUV4Y2x1ZGUsICRQYXJhbXtSZWN1cnJlbmNlSUR9OwogICAgQFJlY3VycmVuY2VFeGNsdWRlID0gc29ydCBAUmVjdXJyZW5jZUV4Y2x1ZGU7CgogICAgIyBqb2luIGludG8gc3RyaW5nCiAgICBteSAkUmVjdXJyZW5jZUV4Y2x1ZGU7CiAgICBpZiAoQFJlY3VycmVuY2VFeGNsdWRlKSB7CiAgICAgICAgJFJlY3VycmVuY2VFeGNsdWRlID0gam9pbiggJywnLCBAUmVjdXJyZW5jZUV4Y2x1ZGUgKTsKICAgIH0KCiAgICAjIHVwZGF0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICdVUERBVEUgY2FsZW5kYXJfYXBwb2ludG1lbnQgU0VUIHJlY3VyX2V4Y2x1ZGU9PyBXSEVSRSBpZD0/JywKICAgICAgICBCaW5kID0+IFsgXCRSZWN1cnJlbmNlRXhjbHVkZSwgXCRQYXJhbXtQYXJlbnRJRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfQXBwb2ludG1lbnRHZXRDYWxlbmRhcklEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzcWwgcXVlcnkKICAgIG15ICRTUUwgID0gJ1NFTEVDVCBjYWxlbmRhcl9pZCBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50IFdIRVJFIGlkPT8nOwogICAgbXkgQEJpbmQgPSAoIFwkUGFyYW17QXBwb2ludG1lbnRJRH0gKTsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgc3RhcnQgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gXEBCaW5kLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRDYWxlbmRhcklEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENhbGVuZGFySUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkQ2FsZW5kYXJJRDsKfQoKc3ViIF9BcHBvaW50bWVudEdldFJlY3VycmVuY2VJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc3FsIHF1ZXJ5CiAgICBteSAkU1FMICA9ICdTRUxFQ1QgcmVjdXJfaWQgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudCBXSEVSRSBpZD0/JzsKICAgIG15IEBCaW5kID0gKCBcJFBhcmFte0FwcG9pbnRtZW50SUR9ICk7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIHN0YXJ0IHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQmluZCwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkUmVjdXJyZW5jZUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFJlY3VycmVuY2VJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRSZWN1cnJlbmNlSUQ7Cn0KCnN1YiBfQ2FsY3VsYXRlUmVjdXJyZW5jZVRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50IFN0ZXAgT3JpZ2luYWxUaW1lIEN1cnJlbnRUaW1lKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICBteSAkU3lzdGVtVGltZSA9ICRQYXJhbXtDdXJyZW50VGltZX07CgogICAgaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdEYWlseScgKSB7CgogICAgICAgICMgYWRkIG9uZSBkYXkKICAgICAgICAkU3lzdGVtVGltZSArPSA2MCAqIDYwICogMjQ7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ1dlZWtseScgKSB7CgogICAgICAgICMgYWRkIDcgZGF5cwogICAgICAgICRTeXN0ZW1UaW1lICs9IDYwICogNjAgKiAyNCAqIDc7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ01vbnRobHknICkgewoKICAgICAgICAjIGFkZCBvbmUgbW9udGgKICAgICAgICAkU3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+QWRkUGVyaW9kKAogICAgICAgICAgICBUaW1lICAgPT4gJFBhcmFte09yaWdpbmFsVGltZX0sCiAgICAgICAgICAgIE1vbnRocyA9PiAkUGFyYW17U3RlcH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkUGFyYW17SXNFbmRUaW1lfSAmJiAkUGFyYW17QXBwb2ludG1lbnR9LT57QWxsRGF5fSApIHsKCiAgICAgICAgICAgICMgR2V0IE9yaWdpbmFsIFN0YXJ0VGltZQogICAgICAgICAgICBteSAkU3RhcnRUaW1lU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntTdGFydFRpbWV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBHZXQgT3JpZ2luYWwgRW5kVGltZQogICAgICAgICAgICBteSAkRW5kVGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57RW5kVGltZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIENhbGN1bGF0ZSBkZWx0YSAoRW5kVGltZS1TdGFydFRpbWUpCiAgICAgICAgICAgIG15ICRPcmlnaW5hbERlbHRhID0gJEVuZFRpbWVTeXN0ZW0gLSAkU3RhcnRUaW1lU3lzdGVtOwoKICAgICAgICAgICAgIyBDYWxjdWxhdGUgY3VycmVudCBkZWx0YQogICAgICAgICAgICBteSAkQ3VycmVudERlbHRhID0gJFN5c3RlbVRpbWUgLSAkUGFyYW17TGFzdFN0YXJ0VGltZX07CgogICAgICAgICAgICAjIENvbXBhcmUKICAgICAgICAgICAgd2hpbGUgKCAkQ3VycmVudERlbHRhID4gJE9yaWdpbmFsRGVsdGEgKyAyMyAqIDM2MDAgKSB7CiAgICAgICAgICAgICAgICAkU3lzdGVtVGltZSAtPSAyNCAqIDM2MDA7CgogICAgICAgICAgICAgICAgJEN1cnJlbnREZWx0YSA9ICRTeXN0ZW1UaW1lIC0gJFBhcmFte0xhc3RTdGFydFRpbWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdZZWFybHknICkgewoKICAgICAgICAjIGFkZCBvbmUgeWVhcgogICAgICAgICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgIFRpbWUgID0+ICRQYXJhbXtPcmlnaW5hbFRpbWV9LAogICAgICAgICAgICBZZWFycyA9PiAkUGFyYW17U3RlcH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tRGFpbHknICkgewogICAgICAgICRTeXN0ZW1UaW1lICs9ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9ICogNjAgKiA2MCAqIDI0OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21XZWVrbHknICkgewoKICAgICAgICAjIHRoaXMgYmxvY2sgY292ZXJzIGZvbGxvd2luZyB1c2UgY2FzZToKICAgICAgICAjIGVhY2ggbi10aCBNb25kYXkgYW5kIEZyaWRheQoKICAgICAgICBteSAkRm91bmQ7CgogICAgICAgIG15ICggJE9yaWdpbmFsV2Vla0RheSwgJE9yaWdpbmFsQ1cgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFBhcmFte09yaWdpbmFsVGltZX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBsb29wIHVwIHRvIDcqbiB0aW1lcyAoNyBkYXlzIGluIHdlZWsgKiBmcmVxdWVuY3kpCiAgICAgICAgTE9PUDoKICAgICAgICBmb3IgKCBteSAkQ291bnRlciA9IDA7ICRDb3VudGVyIDwgNyAqICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OyAkQ291bnRlcisrICkgewoKICAgICAgICAgICAgIyBBZGQgMSBkYXkKICAgICAgICAgICAgJFN5c3RlbVRpbWUgKz0gNjAgKiA2MCAqIDI0OwoKICAgICAgICAgICAgbXkgKCAkV2Vla0RheSwgJENXICk7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtJc0VuZFRpbWV9ICYmICRQYXJhbXtBcHBvaW50bWVudH0tPntBbGxEYXl9ICkgewoKICAgICAgICAgICAgICAgICMgaW4gYWxsIGRheSBhcHBvaW50bWVudCwgZW5kIHRpbWUgaXMgdXN1YWxseSBtaWRuaWdodCBvZiB0aGUgbmV4dCBkYXksIHNvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIDIzOjU5OjU5CiAgICAgICAgICAgICAgICAoICRXZWVrRGF5LCAkQ1cgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZSAtIDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgKCAkV2Vla0RheSwgJENXICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPldlZWtEZXRhaWxzR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG5leHQgZGF5IGlmIHRoaXMgd2VlayBzaG91bGQgYmUgc2tpcHBlZAogICAgICAgICAgICBuZXh0IExPT1AgaWYgKCAkQ1cgLSAkT3JpZ2luYWxDVyApICUgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH07CgogICAgICAgICAgICAjIGNoZWNrIGlmIFN5c3RlbVRpbWUgbWF0Y2ggcmVxdWlyZW1lbnRzCiAgICAgICAgICAgIGlmICggZ3JlcCB7ICRXZWVrRGF5ID09ICRfIH0gQHsgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VGcmVxdWVuY3l9IH0gKSB7CiAgICAgICAgICAgICAgICAkRm91bmQgPSAxOwogICAgICAgICAgICAgICAgbGFzdCBMT09QOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaWYgISRGb3VuZDsKICAgIH0KCiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbU1vbnRobHknICkgewoKICAgICAgICAjIE9jY3VycyBldmVyeSAybmQgbW9udGggb24gNXRoLCAxMHRoIGFuZCAxNXRoIGRheQogICAgICAgIG15ICRGb3VuZDsKCiAgICAgICAgbXkgKCAkT3JpZ2luYWxTZWMsICRPcmlnaW5hbE1pbiwgJE9yaWdpbmFsSG91ciwgJE9yaWdpbmFsRGF5LCAkT3JpZ2luYWxNb250aCwgJE9yaWdpbmFsWWVhciwgJE9yaWdpbmFsV2Vla0RheSApCiAgICAgICAgICAgID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRQYXJhbXtPcmlnaW5hbFRpbWV9LAogICAgICAgICAgICApOwoKICAgICAgICAjIGxvb3AgdGhyb3VnaCBlYWNoIGRheSAobWF4IG9uZSB5ZWFyKSwgYW5kIGNoZWNrIGlmIGRheSBtYXRjaGVzLgogICAgICAgIERBWToKICAgICAgICBmb3IgKCBteSAkQ291bnRlciA9IDA7ICRDb3VudGVyIDwgMzEgKiAzNjY7ICRDb3VudGVyKysgKSB7CgogICAgICAgICAgICAjIEFkZCBvbmUgZGF5CiAgICAgICAgICAgICRTeXN0ZW1UaW1lICs9IDI0ICogNjAgKiA2MDsKCiAgICAgICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICRXZWVrRGF5ICk7CiAgICAgICAgICAgIGlmICggJFBhcmFte0lzRW5kVGltZX0gKSB7CiAgICAgICAgICAgICAgICAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkV2Vla0RheSApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUgLSAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICRXZWVrRGF5ICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgU2tpcCBtb250aCBpZiBuZWVkZWQKICAgICAgICAgICAgbmV4dCBEQVkgaWYgKCAkTW9udGggLSAkT3JpZ2luYWxNb250aCApICUgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH07CgogICAgICAgICAgICAjIG5leHQgZGF5IGlmIHRoaXMgZGF5IHNob3VsZCBiZSBza2lwcGVkCiAgICAgICAgICAgIG5leHQgREFZIGlmICFncmVwIHsgJERheSA9PSAkXyB9IEB7ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlRnJlcXVlbmN5fSB9OwoKICAgICAgICAgICAgJEZvdW5kID0gMTsKICAgICAgICAgICAgbGFzdCBEQVk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZiAhJEZvdW5kOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21ZZWFybHknICkgewoKICAgICAgICAjIHRoaXMgYmxvY2sgY292ZXJzIGZvbGxvd2luZyB1c2UgY2FzZToKICAgICAgICAjIE9jY3VycyBlYWNoIDN0aCB5ZWFyLCBKYW51YXJ5IDE4dGggYW5kIE1hcmNoIDE4dGgKICAgICAgICBteSAkRm91bmQ7CgogICAgICAgIG15ICggJE9yaWdpbmFsU2VjLCAkT3JpZ2luYWxNaW4sICRPcmlnaW5hbEhvdXIsICRPcmlnaW5hbERheSwgJE9yaWdpbmFsTW9udGgsICRPcmlnaW5hbFllYXIsICRPcmlnaW5hbFdlZWtEYXkgKQogICAgICAgICAgICA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkUGFyYW17T3JpZ2luYWxUaW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbFN5c3RlbTsKICAgICAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVW50aWx9ICkgewogICAgICAgICAgICAkUmVjdXJyZW5jZVVudGlsU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgTU9OVEg6CiAgICAgICAgZm9yICggbXkgJENvdW50ZXIgPSAxOzsgJENvdW50ZXIrKyApIHsKCiAgICAgICAgICAgICMgQWRkIG9uZSBtb250aAogICAgICAgICAgICAkU3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+QWRkUGVyaW9kKAogICAgICAgICAgICAgICAgVGltZSAgID0+ICRQYXJhbXtPcmlnaW5hbFRpbWV9LAogICAgICAgICAgICAgICAgTW9udGhzID0+ICRDb3VudGVyLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBza2lwIHRoaXMgdGltZSwgc2luY2UgaXQgd2FzIGFscmVhZHkgY2hlY2tlZAogICAgICAgICAgICBuZXh0IE1PTlRIIGlmICRTeXN0ZW1UaW1lIDwgJFBhcmFte0N1cnJlbnRUaW1lfSArIDI0ICogNjAgKiA2MDsKCiAgICAgICAgICAgICMgY2hlY2sgbG9vcCBjb25kaXRpb25zIChhY2NvcmRpbmcgdG8gVW50aWwgLyApCiAgICAgICAgICAgIGlmICgkUmVjdXJyZW5jZVVudGlsU3lzdGVtKSB7CiAgICAgICAgICAgICAgICBsYXN0IE1PTlRIIGlmICRTeXN0ZW1UaW1lID4gJFJlY3VycmVuY2VVbnRpbFN5c3RlbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGxhc3QgTU9OVEgKICAgICAgICAgICAgICAgICAgICBpZiAkQ291bnRlcgogICAgICAgICAgICAgICAgICAgID4gMTIgKiAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfSAqICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlQ291bnR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkV2Vla0RheSApOwoKICAgICAgICAgICAgaWYgKCAkUGFyYW17SXNFbmRUaW1lfSApIHsKICAgICAgICAgICAgICAgICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICRXZWVrRGF5ICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZSAtIDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJFdlZWtEYXkgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiB5ZWFyIGlzIE9LCiAgICAgICAgICAgIG5leHQgTU9OVEggaWYgKCAkWWVhciAtICRPcmlnaW5hbFllYXIgKSAlICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OwoKICAgICAgICAgICAgIyBuZXh0IG1vbnRoIGlmIHRoaXMgbW9udGggc2hvdWxkIGJlIHNraXBwZWQKICAgICAgICAgICAgbmV4dCBNT05USCBpZiAhZ3JlcCB7ICRNb250aCA9PSAkXyB9IEB7ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlRnJlcXVlbmN5fSB9OwoKICAgICAgICAgICAgJEZvdW5kID0gMTsKICAgICAgICAgICAgbGFzdCBNT05USDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlmICEkRm91bmQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRTeXN0ZW1UaW1lOwp9CgoxOwoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RSUzo6UGVybDo6VGltZSkKCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRGlnZXN0OjpNRDU7CnVzZSBUaW1lOjpQaWVjZTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXI7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCgopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyIC0gY2FsZW5kYXIgaGVscGVyIG1ldGhvZHMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGhlbHBlciBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBUaW1lQ2hlY2soKQoKY2hlY2sgaWYgVGltZSBhbmQgT3JpZ2luYWxUaW1lIGhhdmUgc2FtZSBob3VyLCBtaW51dGUgYW5kIHNlY29uZCB2YWx1ZSwgYW5kIHJldHVybiB0aW1lc3RhbXAgd2l0aCB2YWx1ZXMgKGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kKSBhcyBpbiBUaW1lLgoKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVDaGVjaygKICAgICAgICBPcmlnaW5hbFRpbWUgICAgID0+ICcyMDE2LTAxLTAxIDAwOjAxOjAwJywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgVGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMi0wMSAwMDowMjowMCcsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgKTsKCnJldHVybnM6CiAgICAkUmVzdWx0ID0gJzIwMTYtMDItMDEgMDA6MDE6MDAnOwo9Y3V0CgpzdWIgVGltZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhPcmlnaW5hbFRpbWUgVGltZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRSZXN1bHQgPSAnJzsKCiAgICAkUGFyYW17T3JpZ2luYWxUaW1lfSA9fiAvKC4qPylccyguKj8pJC87CiAgICBteSAkT3JpZ2luYWxEYXRlID0gJDE7CiAgICBteSAkT3JpZ2luYWxUaW1lID0gJDI7CgogICAgJFBhcmFte1RpbWV9ID1+IC8oLio/KVxzKC4qPykkLzsKICAgIG15ICREYXRlID0gJDE7CgogICAgJFJlc3VsdCA9ICIkRGF0ZSAkT3JpZ2luYWxUaW1lIjsKICAgIHJldHVybiAkUmVzdWx0Owp9Cgo9aXRlbSBTeXN0ZW1UaW1lR2V0KCkKCnJldHVybnMgdGhlIG51bWJlciBvZiBub24tbGVhcCBzZWNvbmRzIHNpbmNlIHdoYXQgZXZlciB0aW1lIHRoZSBzeXN0ZW0gY29uc2lkZXJzIHRvIGJlIHRoZSBlcG9jaAoodGhhdCdzIDAwOjAwOjAwLCBKYW51YXJ5IDEsIDE5MDQgZm9yIE1hYyBPUywgYW5kIDAwOjAwOjAwIFVUQywgSmFudWFyeSAxLCAxOTcwIGZvciBtb3N0IG90aGVyIHN5c3RlbXMpLgoKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgU3RyaW5nICAgICA9PiAnMjAxNi0wMS0wMSAwMDowMTowMCcsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgKTsKCnJldHVybnM6CiAgICAkUmVzdWx0ID0gJzE0NTE2MDY0NjAnOwo9Y3V0CgpzdWIgU3lzdGVtVGltZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoIFN0cmluZyApKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBzeXN0ZW0gdGltZQogICAgbXkgJFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0cmluZ30sCiAgICApOwoKICAgIHJldHVybiAkU3lzdGVtVGltZTsKfQoKPWl0ZW0gVGltZXN0YW1wR2V0KCkKCnJldHVybnMgYSB0aW1lIHN0YW1wIGZvciBhIGdpdmVuIHN5c3RlbSB0aW1lIGluICJ5eXl5LW1tLWRkIDIzOjU5OjU5IiBmb3JtYXQuCgogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgIFN5c3RlbVRpbWUgICAgID0+ICcxNDUxNjA2NDYwJywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKcmV0dXJuczoKICAgICRSZXN1bHQgPSAnMjAxNi0wMS0wMSAwMDowMTowMCc7Cj1jdXQKCnN1YiBUaW1lc3RhbXBHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KCBTeXN0ZW1UaW1lICkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRpbWVzdGFtcAogICAgbXkgJFRpbWVzdGFtcCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPlN5c3RlbVRpbWUyVGltZVN0YW1wKAogICAgICAgIFN5c3RlbVRpbWUgPT4gJFBhcmFte1N5c3RlbVRpbWV9LAogICAgKTsKCiAgICByZXR1cm4gJFRpbWVzdGFtcDsKfQoKPWl0ZW0gQ3VycmVudFRpbWVzdGFtcEdldCgpCgpyZXR1cm5zIGEgY3VycmVudCB0aW1lIHN0YW1wIGZvciBhIGdpdmVuIHN5c3RlbSB0aW1lIGluICJ5eXl5LW1tLWRkIDIzOjU5OjU5IiBmb3JtYXQuCgogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFRpbWVzdGFtcEdldCgpOwoKcmV0dXJuczoKICAgICRSZXN1bHQgPSAnMjAxNi0wMS0wMSAwMDowMTowMCc7Cj1jdXQKCnN1YiBDdXJyZW50VGltZXN0YW1wR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY3VycmVudCB0aW1lc3RhbXAKICAgIG15ICRDdXJyZW50VGltZXN0YW1wID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKS0+Q3VycmVudFRpbWVzdGFtcCgpOwoKICAgIHJldHVybiAkQ3VycmVudFRpbWVzdGFtcDsKfQoKPWl0ZW0gQ3VycmVudFN5c3RlbVRpbWUoKQoKcmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbi1sZWFwIHNlY29uZHMgc2luY2Ugd2hhdCBldmVyIHRpbWUgdGhlIHN5c3RlbSBjb25zaWRlcnMgdG8gYmUgdGhlIGVwb2NoIHVudGlsbCBub3cuCih0aGF0J3MgMDA6MDA6MDAsIEphbnVhcnkgMSwgMTkwNCBmb3IgTWFjIE9TLCBhbmQgMDA6MDA6MDAgVVRDLCBKYW51YXJ5IDEsIDE5NzAgZm9yIG1vc3Qgb3RoZXIgc3lzdGVtcykuCgogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFN5c3RlbVRpbWUoKTsKCnJldHVybnM6CiAgICAkUmVzdWx0ID0gJzE0NjI4NzExNjInOwo9Y3V0CgpzdWIgQ3VycmVudFN5c3RlbVRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjdXJyZW50IHN5c3RlbSB0aW1lCiAgICBteSAkQ3VycmVudFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5TeXN0ZW1UaW1lKCk7CgogICAgcmV0dXJuICRDdXJyZW50U3lzdGVtVGltZTsKfQoKPWl0ZW0gRGF0ZUdldCgpCgpyZXR1cm5zIGRhdGUvdGltZSBpbmZvcm1hdGlvbiBpbiBhIGhhc2ggZm9yIGdpdmVuIHVuaXggdGltZS4KCiAgICBteSAoJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWspID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgIFN5c3RlbVRpbWUgPT4gJzE0NjI4NzExNjInLAogICAgKTsKCnJldHVybnM6CiAgICAkU2Vjb25kICAgID0gJzAnOwogICAgJE1pbnV0ZSAgICA9ICcwJzsKICAgICRIb3VyICAgICAgPSAnMSc7CiAgICAkRGF5ICAgICAgID0gJzEnOwogICAgJE1vbnRoICAgICA9ICcxJzsKICAgICRZZWFyICAgICAgPSAnMjAxNic7CiAgICAkRGF5T2ZXZWVrID0gJzInOyAgICMgMS1tb25kYXksLi4uLCA3LXN1bmRheQoKPWN1dAoKc3ViIERhdGVHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KCBTeXN0ZW1UaW1lICkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgIFN5c3RlbVRpbWUgPT4gJFBhcmFte1N5c3RlbVRpbWV9LAogICAgICAgICk7CiAgICAkU2Vjb25kICAgID0gaW50ICRTZWNvbmQ7CiAgICAkTWludXRlICAgID0gaW50ICRNaW51dGU7CiAgICAkSG91ciAgICAgID0gaW50ICRIb3VyOwogICAgJERheSAgICAgICA9IGludCAkRGF5OwogICAgJE1vbnRoICAgICA9IGludCAkTW9udGg7CiAgICAkWWVhciAgICAgID0gaW50ICRZZWFyOwogICAgJERheU9mV2VlayA9IGludCAkRGF5T2ZXZWVrOwoKICAgICMgS2VybmVsOjpTeXN0ZW06OlRpbWUgb2JqZWN0IHJldHVybnMgMCBmb3IgU3VuZGF5IC0gd2UgbmVlZCB0byBjaGFuZ2UgdGhpcyB0byA3IChsaWtlIG9uIG90aGVyIHBsYWNlcykKICAgIGlmICggISREYXlPZldlZWsgKSB7CiAgICAgICAgJERheU9mV2VlayA9IDc7CiAgICB9CgogICAgcmV0dXJuICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKTsKfQoKPWl0ZW0gRGF0ZTJTeXN0ZW1UaW1lKCkKCnJldHVybnMgdGhlIG51bWJlciBvZiBub24tbGVhcCBzZWNvbmRzIHNpbmNlIHdoYXQgZXZlciB0aW1lIHRoZSBzeXN0ZW0gY29uc2lkZXJzIHRvIGJlIHRoZSBlcG9jaCBmb3IgZ2l2ZW4gcGFyYW1ldGVycy4KKHRoYXQncyAwMDowMDowMCwgSmFudWFyeSAxLCAxOTA0IGZvciBNYWMgT1MsIGFuZCAwMDowMDowMCBVVEMsIEphbnVhcnkgMSwgMTk3MCBmb3IgbW9zdCBvdGhlciBzeXN0ZW1zKS4KCiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlMlN5c3RlbVRpbWUoCiAgICAgICAgWWVhciAgICAgID0+ICcyMDE2JywKICAgICAgICBNb250aCAgICAgPT4gJzEnLAogICAgICAgIERheSAgICAgICA9PiAnMScsCiAgICAgICAgSG91ciAgICAgID0+ICcxJywKICAgICAgICBNaW51dGUgICAgPT4gJzAnLAogICAgKTsKCnJldHVybnM6CiAgICAkUmVzdWx0ID0gJzE0NTE2MTAwMDAnOwo9Y3V0CgpzdWIgRGF0ZTJTeXN0ZW1UaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyggWWVhciBNb250aCBEYXkgKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAkUGFyYW17SG91cn0gICAvLz0gMDsKICAgICRQYXJhbXtNaW51dGV9IC8vPSAwOwogICAgJFBhcmFte1NlY29uZH0gLy89IDA7CgogICAgIyBnZXQgc3lzdGVtIHRpbWUKICAgIG15ICRTeXN0ZW1UaW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKS0+RGF0ZTJTeXN0ZW1UaW1lKAogICAgICAgICVQYXJhbSwKICAgICk7CgogICAgcmV0dXJuICRTeXN0ZW1UaW1lOwp9Cgo9aXRlbSBBZGRQZXJpb2QoKQoKYWRkcyB0aW1lIHBlcmlvZCAoeWVhcnMgYW5kIG1vbnRocykgdG8gdGhlIHRpbWUgZ2l2ZW4gaW4gVW5peCBmb3JtYXQuCgogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+QWRkUGVyaW9kKAogICAgICAgIFRpbWUgICAgICAgPT4gJzE0NjI4NzExNjInLCAgICAgIyAocmVxdWlyZWQpIHRpbWUgaW4gVW5peCBmb3JtYXQKICAgICAgICBZZWFycyAgICAgID0+ICcxJywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSB5ZWFycyB0byBhZGQKICAgICAgICBNb250aHMgICAgID0+ICcxJywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtb250aHMgdG8gYWRkCiAgICApOwoKcmV0dXJuczoKICAgICRSZXN1bHQgPSAnMTQ5NzA4NTU2Mic7Cj1jdXQKCnN1YiBBZGRQZXJpb2QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFRpbWUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17TW9udGhzfSAvLz0gMDsKICAgICRQYXJhbXtZZWFyc30gIC8vPSAwOwoKICAgIG15ICRUaW1lUGllY2UgPSBsb2NhbHRpbWUoICRQYXJhbXtUaW1lfSApOwogICAgbXkgJFN0YXJ0RGF5ICA9ICRUaW1lUGllY2UtPmRheV9vZl9tb250aCgpOwoKICAgIG15ICROZXh0VGltZVBpZWNlID0gJFRpbWVQaWVjZS0+YWRkX21vbnRocyggJFBhcmFte01vbnRoc30gKTsKICAgICROZXh0VGltZVBpZWNlID0gJE5leHRUaW1lUGllY2UtPmFkZF95ZWFycyggJFBhcmFte1llYXJzfSApOwogICAgbXkgJEVuZERheSA9ICROZXh0VGltZVBpZWNlLT5kYXlfb2ZfbW9udGgoKTsKCiAgICAjIGNoZWNrIGlmIG1vbnRoIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZGF5cyAoZm9yIGV4YW1wbGU6IEphbnVhcnkgMzEgKyAxIG1vbnRoID0gTWFyY2ggMDEpCiAgICBpZiAoICRTdGFydERheSAhPSAkRW5kRGF5ICkgewoKICAgICAgICAjIFN1YnRyYWN0IG5lZWRlZCBkYXlzCiAgICAgICAgbXkgJERheXMgPSAkTmV4dFRpbWVQaWVjZS0+ZGF5X29mX21vbnRoKCk7CiAgICAgICAgJE5leHRUaW1lUGllY2UgLT0gJERheXMgKiAyNCAqIDYwICogNjA7CiAgICB9CgogICAgcmV0dXJuICROZXh0VGltZVBpZWNlLT5lcG9jaCgpOwp9Cgo9aXRlbSBUaW1lem9uZU9mZnNldEdldCgpCgpyZXR1cm5zIG9mZnNldCBvZiBzcGVjaWZpZWQgdGltZSB6b25lIG9yIHVzZXIncyB0aW1lIHpvbmUuCgogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgVXNlcklEICAgICAgPT4gMiwgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgogICAgICAgIFRpbWV6b25lSUQgID0+ICdFdXJvcGUvQmVybGluJyAgICAgICMgKG9wdGlvbmFsKSBUaW1lem9uZSBuYW1lCiAgICAgICAgVGltZSAgICAgICAgPT4gJzE0NjI4NzExNjInLCAgICAgICAgIyAob3B0aW9uYWwpIFRpbWUgaW4gVW5peCBmb3JtYXQgeW91IHdhbnQgb2Zmc2V0IGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBvdGhlcndpc2UsIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWQKICAgICk7CgpyZXR1cm5zOgogICAgJFJlc3VsdCA9IDI7Cgo9Y3V0CgpzdWIgVGltZXpvbmVPZmZzZXRHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSAmJiAhJFBhcmFte1RpbWV6b25lSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBVc2VySUQgb3IgVGltZXpvbmVJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgbXkgJVVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkVXNlcntVc2VyVGltZVpvbmV9ID8gaW50ICRVc2Vye1VzZXJUaW1lWm9uZX0gOiAwOwogICAgfQoKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAjIGNoZWNrIGlmIERhdGVUaW1lIG9iamVjdCBleGlzdHMKICAgIHJldHVybiAwIGlmICEkTWFpbk9iamVjdC0+UmVxdWlyZSgKICAgICAgICAnRGF0ZVRpbWUnLAogICAgKTsKCiAgICAjIGNoZWNrIGlmIERhdGVUaW1lOjpUaW1lWm9uZSBvYmplY3QgZXhpc3RzCiAgICByZXR1cm4gMCBpZiAhJE1haW5PYmplY3QtPlJlcXVpcmUoCiAgICAgICAgJ0RhdGVUaW1lOjpUaW1lWm9uZScsCiAgICApOwoKICAgICMgT2Zmc2V0IGNhbGN1bGF0aW9uIGRlcGVuZHMgb24gc3BlY2lmaWMgdGltZSwgYmVjYXVzZSBvZiBkYXlsaWdodCBzYXZpbmdzLgogICAgIyAgIElmIG5vdCBzdXBwbGllZCwgdXNlIGN1cnJlbnQgdGltZS4KICAgIG15ICREYXRlVGltZSA9IERhdGVUaW1lLT5ub3coKTsKICAgIGlmICggJFBhcmFte1RpbWV9ICkgewogICAgICAgICREYXRlVGltZSA9IERhdGVUaW1lLT5mcm9tX2Vwb2NoKCBlcG9jaCA9PiAkUGFyYW17VGltZX0gKTsKICAgIH0KCiAgICAjIERhdGVUaW1lOjpUaW1lWm9uZSBtaWdodCBub3QgcmVjb2duaXplIHRpbWV6b25lIGJ5IGl0cyBuYW1lIGFuZCBkaWUsCiAgICAjICAgbWFrZSB0aGUgY2FsbCBpbiBhbiBldmFsIGJsb2NrLgogICAgbXkgJFRpbWV6b25lID0gZXZhbCB7IERhdGVUaW1lOjpUaW1lWm9uZS0+bmV3KCBuYW1lID0+ICRQYXJhbXtUaW1lem9uZUlEfSApIH07CgogICAgaWYgKCRUaW1lem9uZSkgewogICAgICAgIHJldHVybiAkVGltZXpvbmUtPm9mZnNldF9mb3JfZGF0ZXRpbWUoJERhdGVUaW1lKSAvIDM2MDAuMDA7ICAgICMgaW4gaG91cnMKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgZmluZCBvZmZzZXQgZm9yICckUGFyYW17VGltZXpvbmVJRH0nLCBhc3N1bWluZyBVVEMhIiwKICAgICk7CgogICAgcmV0dXJuIDA7Cn0KCj1pdGVtIExvY2FsVGltZXpvbmVPZmZzZXRHZXQoKQoKcmV0dXJucyBvZmZzZXQgb2YgbG9jYWwgdGltZSB6b25lIGZvciBhIHNwZWNpZmllZCBVVEMgc3lzdGVtIHRpbWUuCgogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+TG9jYWxUaW1lem9uZU9mZnNldEdldCgKICAgICAgICBUaW1lID0+ICcxNDYyODcxMTYyJywgICAgICMgKHJlcXVpcmVkKSB0aW1lIGluIFVuaXggZm9ybWF0CiAgICApOwoKcmV0dXJuczoKICAgICRSZXN1bHQgPSAyOwoKPWN1dAoKc3ViIExvY2FsVGltZXpvbmVPZmZzZXRHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17VGltZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFRpbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkVGltZSAgID0gbG9jYWx0aW1lKCAkUGFyYW17VGltZX0gKTsKICAgIG15ICRPZmZzZXQgPSAkVGltZS0+dHpvZmZzZXQoKSAvIDM2MDAuMDA7ICAgICMgaW4gaG91cnMKCiAgICByZXR1cm4gJE9mZnNldDsKfQoKPWl0ZW0gV2Vla0RldGFpbHNHZXQoKQoKZ2V0IHdlZWsgZGV0YWlscyBmb3IgYSBnaXZlbiB1bml4IHRpbWUuCgogICAgbXkgKCRXZWVrRGF5LCAkQ1cpID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5XZWVrRGV0YWlsc0dldCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICcxNDYyODgwNzc4JywKICAgICk7CgpyZXR1cm5zOgogICAgJFdlZWtEYXkgPSA0OyAjIDctc3VuLCAxLW1vbgogICAgJENXID0gMTk7Cj1jdXQKCnN1YiBXZWVrRGV0YWlsc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyggU3lzdGVtVGltZSApKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBUaW1lOjpQaWVjZSBvYmplY3QKICAgIG15ICRUaW1lID0gbG9jYWx0aW1lKCAkUGFyYW17U3lzdGVtVGltZX0gKTsKCiAgICAjIFRpbWU6OlBpZWNlIG9iamVjdCByZXR1cm5zIDAgZm9yIFN1bmRheSAtIHdlIG5lZWQgdG8gY2hhbmdlIHRoaXMgdG8gNyAobGlrZSBvbiBvdGhlciBwbGFjZXMpCiAgICBteSAkRGF5T2ZXZWVrID0gJFRpbWUtPmRheV9vZl93ZWVrKCk7CiAgICBpZiAoICEkRGF5T2ZXZWVrICkgewogICAgICAgICREYXlPZldlZWsgPSA3OwogICAgfQoKICAgIHJldHVybiAoICREYXlPZldlZWssICRUaW1lLT53ZWVrKCkgKTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW47Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbiAtIFBsdWdpbiBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGFwcG9pbnRtZW50IHBsdWdpbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFRlYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbicpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCByZWdpc3RlcmVkIHBsdWdpbiBtb2R1bGVzCiAgICBteSAkUGx1Z2luQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJBcHBvaW50bWVudENhbGVuZGFyOjpQbHVnaW4iKTsKCiAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBsb2FkIHBsdWdpbiBtb2R1bGVzCiAgICBQTFVHSU46CiAgICBmb3IgbXkgJFBsdWdpbktleSAoIHNvcnQga2V5cyAleyRQbHVnaW5Db25maWd9ICkgewoKICAgICAgICBteSAkR2VuZXJpY01vZHVsZSA9ICRQbHVnaW5Db25maWctPnskUGx1Z2luS2V5fS0+e01vZHVsZX07CiAgICAgICAgbmV4dCBQTFVHSU4gaWYgISRHZW5lcmljTW9kdWxlOwoKICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgICAgICRNYWluT2JqZWN0LT5EaWUoIkNhbid0IGxvYWQgcGx1Z2luIG1vZHVsZSAkR2VuZXJpY01vZHVsZSEgJEAiKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57UGx1Z2luc30tPnskUGx1Z2luS2V5fS0+e1BsdWdpbk5hbWV9ID0gJFBsdWdpbkNvbmZpZy0+eyRQbHVnaW5LZXl9LT57TmFtZX0gLy8gJEdlbmVyaWNNb2R1bGU7CiAgICAgICAgJFNlbGYtPntQbHVnaW5zfS0+eyRQbHVnaW5LZXl9LT57UGx1Z2luTW9kdWxlfSA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgICAgIG15ICRQbHVnaW5VUkwgPSAkUGx1Z2luQ29uZmlnLT57JFBsdWdpbktleX0tPntVUkx9OwogICAgICAgICRQbHVnaW5VUkwgPX4gc3s8T1RSU19DT05GSUdfKC4rPyk+fXskS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJDEpfWVneDsKICAgICAgICAkU2VsZi0+e1BsdWdpbnN9LT57JFBsdWdpbktleX0tPntQbHVnaW5VUkx9ID0gJFBsdWdpblVSTDsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFBsdWdpbkxpc3QoKQoKcmV0dXJucyB0aGUgaGFzaCBvZiByZWdpc3RlcmVkIHBsdWdpbnMKCiAgICBteSAkUGx1Z2luTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpc3QoKTsKCj1jdXQKCnN1YiBQbHVnaW5MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVBsdWdpbkxpc3QgPSBtYXAgewogICAgICAgICRfID0+IHsKICAgICAgICAgICAgUGx1Z2luTmFtZSA9PiAkU2VsZi0+e1BsdWdpbnN9LT57JF99LT57UGx1Z2luTmFtZX0sCiAgICAgICAgICAgIFBsdWdpblVSTCAgPT4gJFNlbGYtPntQbHVnaW5zfS0+eyRffS0+e1BsdWdpblVSTH0sCiAgICAgICAgICAgIH0KICAgIH0ga2V5cyAleyAkU2VsZi0+e1BsdWdpbnN9IH07CgogICAgcmV0dXJuIFwlUGx1Z2luTGlzdDsKfQoKPWl0ZW0gUGx1Z2luS2V5cygpCgpyZXR1cm5zIHRoZSBoYXNoIG9mIHByb3BlciBwbHVnaW4ga2V5cyBmb3IgbG93ZXJjYXNlIG1hdGNoaW5nCgogICAgbXkgJFBsdWdpbktleXMgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5LZXlzKCk7Cgo9Y3V0CgpzdWIgUGx1Z2luS2V5cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVQbHVnaW5LZXlzID0gbWFwIHsKICAgICAgICBsYyAkXyA9PiAkXwogICAgfSBrZXlzICV7ICRTZWxmLT57UGx1Z2luc30gfTsKCiAgICByZXR1cm4gXCVQbHVnaW5LZXlzOwp9Cgo9aXRlbSBQbHVnaW5MaW5rQWRkKCkKCmxpbmsgYXBwb2ludG1lbnQgYnkgcGx1Z2luCgogICAgbXkgJFN1Y2Nlc3MgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaW5rQWRkKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMSwKICAgICAgICBQbHVnaW5LZXkgICAgID0+ICcwMTAwLVRpY2tldCcsCiAgICAgICAgUGx1Z2luRGF0YSAgICA9PiAnNDInLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgUGx1Z2luTGlua0FkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBQbHVnaW5LZXkgUGx1Z2luRGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57UGx1Z2luc30tPnsgJFBhcmFte1BsdWdpbktleX0gfS0+e1BsdWdpbk1vZHVsZX0tPkxpbmtBZGQoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCj1pdGVtIFBsdWdpbkxpbmtMaXN0KCkKCnJldHVybnMgbGlzdCBvZiBsaW5rcyBmb3Igc3VwcGxpZWQgYXBwb2ludG1lbnQKCiAgICBteSAkTGlua0xpc3QgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaW5rTGlzdCgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEsCiAgICAgICAgUGx1Z2luS2V5ICAgICA9PiAnMDEwMC1UaWNrZXQnLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgUGx1Z2luTGlua0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50SUQgUGx1Z2luS2V5IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17UGx1Z2luVVJMfSA9ICRTZWxmLT57UGx1Z2luc30tPnsgJFBhcmFte1BsdWdpbktleX0gfS0+e1BsdWdpblVSTH07CgogICAgbXkgJExpbmtMaXN0ID0gJFNlbGYtPntQbHVnaW5zfS0+eyAkUGFyYW17UGx1Z2luS2V5fSB9LT57UGx1Z2luTW9kdWxlfS0+TGlua0xpc3QoJVBhcmFtKTsKCiAgICByZXR1cm4gJExpbmtMaXN0Owp9Cgo9aXRlbSBQbHVnaW5MaW5rRGVsZXRlKCkKCnJlbW92ZXMgYWxsIGxpbmtzIGZvciBhbiBhcHBvaW50bWVudAoKICAgIG15ICRTdWNjZXNzID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0RlbGV0ZSgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBQbHVnaW5MaW5rRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtEZWxldGVBbGwoCiAgICAgICAgT2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgS2V5ICAgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVW5hYmxlIHRvIGRlbGV0ZSBwbHVnaW4gbGlua3MhIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKPWl0ZW0gUGx1Z2luU2VhcmNoKCkKCnNlYXJjaCBmb3IgcGx1Z2luIG9iamVjdHMKCiAgICBteSAkUmVzdWx0TGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpblNlYXJjaCgKICAgICAgICBQbHVnaW5LZXkgPT4gJFBsdWdpbktleSwgICAgICAgICMgKHJlcXVpcmVkKQoKICAgICAgICBTZWFyY2ggICAgPT4gJFNlYXJjaCwgICAgICAgICAgICMgKHJlcXVpcmVkKSBTZWFyY2ggc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yCiAgICAgICAgT2JqZWN0SUQgID0+ICRPYmplY3RJRCAgICAgICAgICAjIChyZXF1aXJlZCkgT2JqZWN0IElECgogICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sICAgIyAocmVxdWlyZWQpCiAgICApOwoKPWN1dAoKc3ViIFBsdWdpblNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGx1Z2luS2V5IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmICggISRQYXJhbXtTZWFyY2h9ICYmICEkUGFyYW17T2JqZWN0SUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgU2VhcmNoIG9yIE9iamVjdElEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFJlc3VsdExpc3QgPSAkU2VsZi0+e1BsdWdpbnN9LT57ICRQYXJhbXtQbHVnaW5LZXl9IH0tPntQbHVnaW5Nb2R1bGV9LT5TZWFyY2goCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdExpc3Q7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW46OlRpY2tldDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbjo6VGlja2V0IC0gVGlja2V0IHBsdWdpbgoKPWhlYWQxIFNZTk9QU0lTCgpUaWNrZXQgYXBwb2ludG1lbnQgcGx1Z2luLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRUaWNrZXRQbHVnaW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbjo6VGlja2V0Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gTGlua0FkZCgpCgphZGRzIGEgbGluayBmcm9tIGFuIGFwcG9pbnRtZW50IHRvIHRoZSB0aWNrZXQKCiAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRQbHVnaW5PYmplY3QtPkxpbmtBZGQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAxMjMsCiAgICAgICAgUGx1Z2luRGF0YSAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIFBsdWdpbkRhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGlja2V0IGlkCiAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1BsdWdpbkRhdGF9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKICAgIHJldHVybiBpZiAhJVRpY2tldDsKCiAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtBZGQoCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgU291cmNlS2V5ICAgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRQYXJhbXtQbHVnaW5EYXRhfSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCj1pdGVtIExpbmtMaXN0KCkKCnJldHVybnMgYSBoYXNoIG9mIGxpbmtlZCB0aWNrZXRzIHRvIGFuIGFwcG9pbnRtZW50CgogICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0UGx1Z2luT2JqZWN0LT5MaW5rTGlzdCgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIFVzZXJJRCBQbHVnaW5VUkwpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUxpbmtLZXlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0tleUxpc3RXaXRoRGF0YSgKICAgICAgICBPYmplY3QxID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgS2V5MSAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgT2JqZWN0MiA9PiAnVGlja2V0JywKICAgICAgICBTdGF0ZSAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgJVJlc3VsdCA9IG1hcCB7CiAgICAgICAgJF8gPT4gewogICAgICAgICAgICBMaW5rSUQgICA9PiAkTGlua0tleUxpc3R7JF99LT57VGlja2V0SUR9LAogICAgICAgICAgICBMaW5rTmFtZSA9PiAkTGlua0tleUxpc3R7JF99LT57VGlja2V0TnVtYmVyfSAuICcgJyAuICRMaW5rS2V5TGlzdHskX30tPntUaXRsZX0sCiAgICAgICAgICAgIExpbmtVUkwgID0+IHNwcmludGYoICRQYXJhbXtQbHVnaW5VUkx9LCAkTGlua0tleUxpc3R7JF99LT57VGlja2V0SUR9ICksCiAgICAgICAgICAgIH0KICAgIH0ga2V5cyAlTGlua0tleUxpc3Q7CgogICAgcmV0dXJuIFwlUmVzdWx0Owp9Cgo9aXRlbSBTZWFyY2goKQoKc2VhcmNoIGZvciB0aWNrZXQgYW5kIHJldHVybiBhIGhhc2ggb2YgZm91bmQgdGlja2V0cwoKICAgIG15ICRSZXN1bHRMaXN0ID0gJFRpY2tldFBsdWdpbk9iamVjdC0+U2VhcmNoKAogICAgICAgIFNlYXJjaCAgID0+ICcqKicsICAgIyBzZWFyY2ggYnkgdGlja2V0IG51bWJlciBvciB0aXRsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgogICAgICAgIE9iamVjdElEID0+IDEsICAgICAgIyBzZWFyY2ggYnkgdGlja2V0IElEIChzaW5nbGUgcmVzdWx0KQoKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICEkUGFyYW17U2VhcmNofSAmJiAhJFBhcmFte09iamVjdElEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIFNlYXJjaCBvciBPYmplY3RJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgbXkgQFRpY2tldElEczsKICAgIGlmICggJFBhcmFte1NlYXJjaH0gKSB7CgogICAgICAgICMgc2VhcmNoIHRoZSB0aWNrZXRzIGJ5IHRpY2tldCBudW1iZXIKICAgICAgICBAVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIExpbWl0ICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIFJlc3VsdCAgICAgICA9PiAnQVJSQVknLAogICAgICAgICAgICBBcmNoaXZlRmxhZ3MgPT4gWyduJ10sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHRyeSB0aGUgdGl0bGUgc2VhcmNoIGlmIG5vIHJlc3VsdHMgd2VyZSBmb3VuZAogICAgICAgIGlmICggIUBUaWNrZXRJRHMgKSB7CiAgICAgICAgICAgIEBUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJyUnIC4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgUmVzdWx0ICAgICAgID0+ICdBUlJBWScsCiAgICAgICAgICAgICAgICBBcmNoaXZlRmxhZ3MgPT4gWyduJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17T2JqZWN0SUR9ICkgewogICAgICAgIEBUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkUGFyYW17T2JqZWN0SUR9LAogICAgICAgICAgICBMaW1pdCAgICAgICAgPT4gMTAwLAogICAgICAgICAgICBSZXN1bHQgICAgICAgPT4gJ0FSUkFZJywKICAgICAgICAgICAgQXJjaGl2ZUZsYWdzID0+IFsnbiddLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlUmVzdWx0TGlzdDsKCiAgICAjIGNsZWFuIHRoZSByZXN1bHRzCiAgICBUSUNLRVQ6CiAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0SURzKSB7CgogICAgICAgIG5leHQgVElDS0VUIGlmICEkVGlja2V0SUQ7CgogICAgICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBUSUNLRVQgaWYgISVUaWNrZXQ7CgogICAgICAgICMgZ2VuZXJhdGUgdGhlIHRpY2tldCBpbmZvcm1hdGlvbiBzdHJpbmcKICAgICAgICAkUmVzdWx0TGlzdHsgJFRpY2tldHtUaWNrZXRJRH0gfSA9ICRUaWNrZXR7VGlja2V0TnVtYmVyfSAuICcgJyAuICRUaWNrZXR7VGl0bGV9OwogICAgfQoKICAgIHJldHVybiBcJVJlc3VsdExpc3Q7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6Tm90aWZpY2F0aW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SlNPTicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok5vdGlmaWNhdGlvbkV2ZW50JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXJUZW1wbGF0ZUdlbmVyYXRvcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhFdmVudCBEYXRhIENvbmZpZyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0gJiYgISRQYXJhbXtEYXRhfS0+e0NhbGVuZGFySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgQ2FsZW5kYXJJRCBvciBBcHBvaW50bWVudElEIGluIERhdGEhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBub3RpZmljYXRpb24gZXZlbnQgb2JqZWN0CiAgICBteSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnKTsKCiAgICAjIGNoZWNrIGlmIGV2ZW50IGlzIGFmZmVjdGVkCiAgICBteSBASURzID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25FdmVudENoZWNrKAogICAgICAgIEV2ZW50ID0+ICRQYXJhbXtFdmVudH0sCiAgICApOwoKICAgICMgcmV0dXJuIGlmIG5vIG5vdGlmaWNhdGlvbiBmb3IgZXZlbnQgZXhpc3RzCiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoIFxASURzICkgKSB7CgogICAgICAgICMgdXBkYXRlIHRoZSBmdXR1cmUgdGFza3MKICAgICAgICAkU2VsZi0+X0Z1dHVyZVRhc2tVcGRhdGUoKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgogICAgbXkgJUNhbGVuZGFyOwogICAgbXkgJUFwcG9pbnRtZW50OwoKICAgIGlmICggJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudElEfSwKICAgICAgICApOwogICAgICAgICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtEYXRhfS0+e0NhbGVuZGFySUR9ICkgewogICAgICAgICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0RhdGF9LT57Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBOT1RJRklDQVRJT05JRDoKICAgIGZvciBteSAkTm90aWZpY2F0aW9uSUQgKEBJRHMpIHsKCiAgICAgICAgbXkgJU5vdGlmaWNhdGlvbiA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgICAgICBJRCA9PiAkTm90aWZpY2F0aW9uSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgY29uZGl0aW9ucwogICAgICAgIG15ICRQYXNzRmlsdGVyID0gJFNlbGYtPl9Ob3RpZmljYXRpb25GaWx0ZXIoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQXBwb2ludG1lbnQgID0+IFwlQXBwb2ludG1lbnQsCiAgICAgICAgICAgIENhbGVuZGFyICAgICA9PiBcJUNhbGVuZGFyLAogICAgICAgICAgICBOb3RpZmljYXRpb24gPT4gXCVOb3RpZmljYXRpb24sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBOT1RJRklDQVRJT05JRCBpZiAhJFBhc3NGaWx0ZXI7CgogICAgICAgICMgZ2V0IHJlY2lwaWVudHMKICAgICAgICBteSBAUmVjaXBpZW50VXNlcnMgPSAkU2VsZi0+X1JlY2lwaWVudHNHZXQoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQXBwb2ludG1lbnQgID0+IFwlQXBwb2ludG1lbnQsCiAgICAgICAgICAgIENhbGVuZGFyICAgICA9PiBcJUNhbGVuZGFyLAogICAgICAgICAgICBOb3RpZmljYXRpb24gPT4gXCVOb3RpZmljYXRpb24sCiAgICAgICAgKTsKCiAgICAgICAgbXkgQE5vdGlmaWNhdGlvbkJ1bmRsZTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZ2VuZXJhdG9yIG9iamVjdDsKICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXJUZW1wbGF0ZUdlbmVyYXRvcicpOwoKICAgICAgICAjIHBhcnNlIGFsbCBub3RpZmljYXRpb24gdGFncyBmb3IgZWFjaCB1c2VyCiAgICAgICAgZm9yIG15ICRSZWNpcGllbnQgKEBSZWNpcGllbnRVc2VycykgewoKICAgICAgICAgICAgbXkgJVJlcGxhY2VkTm90aWZpY2F0aW9uID0gJFRlbXBsYXRlR2VuZXJhdG9yT2JqZWN0LT5Ob3RpZmljYXRpb25FdmVudCgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRQYXJhbXtEYXRhfS0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgUmVjaXBpZW50ICAgICA9PiAkUmVjaXBpZW50LAogICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uICA9PiBcJU5vdGlmaWNhdGlvbiwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkVXNlck5vdGlmaWNhdGlvblRyYW5zcG9ydCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkRlY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4gJFJlY2lwaWVudC0+e0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uVHJhbnNwb3J0fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQE5vdGlmaWNhdGlvbkJ1bmRsZSwgewogICAgICAgICAgICAgICAgUmVjaXBpZW50ICAgICAgICAgICAgICAgICAgICAgID0+ICRSZWNpcGllbnQsCiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gICAgICAgICAgICAgICAgICAgPT4gXCVSZXBsYWNlZE5vdGlmaWNhdGlvbiwKICAgICAgICAgICAgICAgIFJlY2lwaWVudE5vdGlmaWNhdGlvblRyYW5zcG9ydCA9PiAkVXNlck5vdGlmaWNhdGlvblRyYW5zcG9ydCwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBnZXQgbm90aWZpY2F0aW9uIHRyYW5zcG9ydCBjb25maWcKICAgICAgICBteSAlVHJhbnNwb3J0Q29uZmlnID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdBcHBvaW50bWVudE5vdGlmaWNhdGlvbjo6VHJhbnNwb3J0JykgfHwge30gfTsKCiAgICAgICAgIyByZW1lbWJlciBhbHJlYWR5IHNlbnQgYWdlbnQgbm90aWZpY2F0aW9ucwogICAgICAgIG15ICVBbHJlYWR5U2VudDsKCiAgICAgICAgIyBsb29wIG92ZXIgdHJhbnNwb3J0cyBmb3IgZWFjaCBub3RpZmljYXRpb24KICAgICAgICBUUkFOU1BPUlQ6CiAgICAgICAgZm9yIG15ICRUcmFuc3BvcnQgKCBzb3J0IGtleXMgJVRyYW5zcG9ydENvbmZpZyApIHsKCiAgICAgICAgICAgICMgb25seSBjb25maWd1cmVkIHRyYW5zcG9ydHMgZm9yIHRoaXMgbm90aWZpY2F0aW9uCiAgICAgICAgICAgIGlmICggIWdyZXAgeyAkXyBlcSAkVHJhbnNwb3J0IH0gQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1RyYW5zcG9ydHN9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IFRSQU5TUE9SVDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkVHJhbnNwb3J0Q29uZmlneyRUcmFuc3BvcnR9ICk7CiAgICAgICAgICAgIG5leHQgVFJBTlNQT1JUIGlmICEkVHJhbnNwb3J0Q29uZmlneyRUcmFuc3BvcnR9LT57TW9kdWxlfTsKCiAgICAgICAgICAgICMgZ2V0IHRyYW5zcG9ydCBvYmplY3QKICAgICAgICAgICAgbXkgJFRyYW5zcG9ydE9iamVjdDsKICAgICAgICAgICAgZXZhbCB7CiAgICAgICAgICAgICAgICAkVHJhbnNwb3J0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCggJFRyYW5zcG9ydENvbmZpZ3skVHJhbnNwb3J0fS0+e01vZHVsZX0gKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICggISRUcmFuc3BvcnRPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgY3JlYXRlIGEgbmV3ICRUcmFuc3BvcnRDb25maWd7JFRyYW5zcG9ydH0tPntNb2R1bGV9IG9iamVjdCEiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IFRSQU5TUE9SVDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCByZWYgJFRyYW5zcG9ydE9iamVjdCBuZSAkVHJhbnNwb3J0Q29uZmlneyRUcmFuc3BvcnR9LT57TW9kdWxlfSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRUcmFuc3BvcnRDb25maWd7JFRyYW5zcG9ydH0tPntNb2R1bGV9IG9iamVjdCBpcyBpbnZhbGlkIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgdHJhbnNwb3J0IGlzIHVzYWJsZQogICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhJFRyYW5zcG9ydE9iamVjdC0+SXNVc2FibGUoKTsKCiAgICAgICAgICAgIEJVTkRMRToKICAgICAgICAgICAgZm9yIG15ICRCdW5kbGUgKEBOb3RpZmljYXRpb25CdW5kbGUpIHsKCiAgICAgICAgICAgICAgICBteSAkVXNlclByZWZlcmVuY2UgPSAiTm90aWZpY2F0aW9uLSROb3RpZmljYXRpb257SUR9LSRUcmFuc3BvcnQiOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgYWdlbnQgc2hvdWxkIGdldCB0aGUgbm90aWZpY2F0aW9uCiAgICAgICAgICAgICAgICBteSAkQWdlbnRTZW5kTm90aWZpY2F0aW9uID0gMDsKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQnVuZGxlLT57UmVjaXBpZW50Tm90aWZpY2F0aW9uVHJhbnNwb3J0fS0+eyRVc2VyUHJlZmVyZW5jZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEFnZW50U2VuZE5vdGlmaWNhdGlvbiA9ICRCdW5kbGUtPntSZWNpcGllbnROb3RpZmljYXRpb25UcmFuc3BvcnR9LT57JFVzZXJQcmVmZXJlbmNlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggZ3JlcCB7ICRfIGVxICRUcmFuc3BvcnQgfSBAeyAkTm90aWZpY2F0aW9ue0RhdGF9LT57QWdlbnRFbmFibGVkQnlEZWZhdWx0fSB9ICkgewogICAgICAgICAgICAgICAgICAgICRBZ2VudFNlbmROb3RpZmljYXRpb24gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgICAgICFJc0FycmF5UmVmV2l0aERhdGEoICROb3RpZmljYXRpb257RGF0YX0tPntWaXNpYmxlRm9yQWdlbnR9ICkKICAgICAgICAgICAgICAgICAgICB8fCAoCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudH0tPlswXQogICAgICAgICAgICAgICAgICAgICAgICAmJiAhJE5vdGlmaWNhdGlvbntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudH0tPlswXQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEFnZW50U2VuZE5vdGlmaWNhdGlvbiA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBza2lwIHNlbmRpbmcgdGhlIG5vdGlmaWNhdGlvbiBpZiB0aGUgYWdlbnQgaGFzIGRpc2FibGUgaXQgaW4gaXRzIHByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkTm90aWZpY2F0aW9ue0RhdGF9LT57VmlzaWJsZUZvckFnZW50fSApCiAgICAgICAgICAgICAgICAgICAgJiYgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudH0tPlswXQogICAgICAgICAgICAgICAgICAgICYmICRCdW5kbGUtPntSZWNpcGllbnR9LT57VHlwZX0gZXEgJ0FnZW50JwogICAgICAgICAgICAgICAgICAgICYmICEkQWdlbnRTZW5kTm90aWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5leHQgQlVORExFOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPl9TZW5kUmVjaXBpZW50Tm90aWZpY2F0aW9uKAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9IHx8ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gICAgICAgICAgPT4gJEJ1bmRsZS0+e05vdGlmaWNhdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJNZXNzYWdlUGFyYW1zID0+ICRQYXJhbXtEYXRhfS0+e0N1c3RvbWVyTWVzc2FnZVBhcmFtc30gfHwge30sCiAgICAgICAgICAgICAgICAgICAgUmVjaXBpZW50ICAgICAgICAgICAgID0+ICRCdW5kbGUtPntSZWNpcGllbnR9LAogICAgICAgICAgICAgICAgICAgIEV2ZW50ICAgICAgICAgICAgICAgICA9PiAkUGFyYW17RXZlbnR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydCAgICAgICAgICAgICA9PiAkVHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydE9iamVjdCAgICAgICA9PiAkVHJhbnNwb3J0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBoYXZlIHNlbnQKICAgICAgICAgICAgICAgICRBbHJlYWR5U2VudHsgJEJ1bmRsZS0+e1JlY2lwaWVudH0tPntVc2VySUR9IH0gPSAxOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgc3BlY2lhbCByZWNpcGllbnRzIHNwZWNpZmljIGZvciBlYWNoIHRyYW5zcG9ydAogICAgICAgICAgICBteSBAVHJhbnNwb3J0UmVjaXBpZW50cyA9ICRUcmFuc3BvcnRPYmplY3QtPkdldFRyYW5zcG9ydFJlY2lwaWVudHMoCiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gPT4gXCVOb3RpZmljYXRpb24sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhQFRyYW5zcG9ydFJlY2lwaWVudHM7CgogICAgICAgICAgICBSRUNJUElFTlQ6CiAgICAgICAgICAgIGZvciBteSAkUmVjaXBpZW50IChAVHJhbnNwb3J0UmVjaXBpZW50cykgewoKICAgICAgICAgICAgICAgICMgcmVwbGFjZSBhbGwgbm90aWZpY2F0aW9uIHRhZ3MgZm9yIGVhY2ggc3BlY2lhbCByZWNpcGllbnQKICAgICAgICAgICAgICAgIG15ICVSZXBsYWNlZE5vdGlmaWNhdGlvbiA9ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdC0+Tm90aWZpY2F0aW9uRXZlbnQoCiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgICAgIFJlY2lwaWVudCAgICAgICAgICAgICA9PiAkUmVjaXBpZW50LAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiAgICAgICAgICA9PiBcJU5vdGlmaWNhdGlvbiwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lck1lc3NhZ2VQYXJhbXMgPT4gJFBhcmFte0RhdGF9LT57Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfSB8fCB7fSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPl9TZW5kUmVjaXBpZW50Tm90aWZpY2F0aW9uKAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9IHx8ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gICAgICAgICAgPT4gXCVSZXBsYWNlZE5vdGlmaWNhdGlvbiwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lck1lc3NhZ2VQYXJhbXMgPT4gJFBhcmFte0RhdGF9LT57Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfSB8fCB7fSwKICAgICAgICAgICAgICAgICAgICBSZWNpcGllbnQgICAgICAgICAgICAgPT4gJFJlY2lwaWVudCwKICAgICAgICAgICAgICAgICAgICBFdmVudCAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0V2ZW50fSwKICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnQgICAgICAgICAgICAgPT4gJFRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRPYmplY3QgICAgICAgPT4gJFRyYW5zcG9ydE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICVBbHJlYWR5U2VudCAmJiAkUGFyYW17RGF0YX0tPntBcnRpY2xlSUR9ICYmICRQYXJhbXtEYXRhfS0+e0FydGljbGVUeXBlfSApIHsKCiAgICAgICAgICAgICMgdXBkYXRlIHRvIGZpZWxkCiAgICAgICAgICAgIG15ICRVcGRhdGVUb1N1Y2Nlc3MgPSAkU2VsZi0+X0FydGljbGVUb1VwZGF0ZSgKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgID0+ICRQYXJhbXtEYXRhfS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlVHlwZSA9PiAkUGFyYW17RGF0YX0tPntBcnRpY2xlVHlwZX0sCiAgICAgICAgICAgICAgICBVc2VySURzICAgICA9PiBcJUFscmVhZHlTZW50LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGZvciBlcnJvcnMKICAgICAgICAgICAgaWYgKCAhJFVwZGF0ZVRvU3VjY2VzcyApIHsKCiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgdXBkYXRlIFRvIGZpZWxkIGZvciBBcnRpY2xlOiAkUGFyYW17RGF0YX0tPntBcnRpY2xlSUR9LiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50IGZ1dHVyZSB0YXNrcwogICAgJFNlbGYtPl9GdXR1cmVUYXNrVXBkYXRlKCk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfTm90aWZpY2F0aW9uRmlsdGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnQgQ2FsZW5kYXIgTm90aWZpY2F0aW9uKSkgewogICAgICAgIHJldHVybiBpZiAhJFBhcmFteyROZWVkZWR9OwogICAgfQoKICAgICMgc2V0IGxvY2FsIHZhbHVlcwogICAgbXkgJU5vdGlmaWNhdGlvbiA9ICV7ICRQYXJhbXtOb3RpZmljYXRpb259IH07CgogICAgcmV0dXJuIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJE5vdGlmaWNhdGlvbntEYXRhfSApOwoKICAgIEtFWToKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICROb3RpZmljYXRpb257RGF0YX0gfSApIHsKCiAgICAgICAgIyBpZ25vcmUgbm90IGFwcG9pbnRtZW50IHJlbGF0ZWQgYXR0cmlidXRlcwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1JlY2lwaWVudHMnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1NraXBSZWNpcGllbnRzJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdSZWNpcGllbnRBZ2VudHMnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1JlY2lwaWVudEdyb3Vwcyc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnUmVjaXBpZW50Um9sZXMnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1RyYW5zcG9ydEVtYWlsVGVtcGxhdGUnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0V2ZW50cyc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnQXJ0aWNsZVR5cGVJRCc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnQXJ0aWNsZVNlbmRlclR5cGVJRCc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnQXJ0aWNsZVN1YmplY3RNYXRjaCc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnQXJ0aWNsZUJvZHlNYXRjaCc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnQXJ0aWNsZUF0dGFjaG1lbnRJbmNsdWRlJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdOb3RpZmljYXRpb25BcnRpY2xlVHlwZUlEJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdUcmFuc3BvcnRzJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdPbmNlUGVyRGF5JzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdWaXNpYmxlRm9yQWdlbnQnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1Zpc2libGVGb3JBZ2VudFRvb2x0aXAnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0xhbmd1YWdlSUQnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1NlbmRPbk91dE9mT2ZmaWNlJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdBZ2VudEVuYWJsZWRCeURlZmF1bHQnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ05vdGlmaWNhdGlvblR5cGUnOwoKICAgICAgICAjIGNoZWNrIHJlY2lwaWVudCBmaWVsZHMgZnJvbSB0cmFuc3BvcnQgbWV0aG9kcwogICAgICAgIGlmICggJEtleSA9fiBte1xBIFJlY2lwaWVudH14bXMgKSB7CiAgICAgICAgICAgIG5leHQgS0VZOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBhcHBvaW50bWVudCBhdHRyaWJ1dGVzCiAgICAgICAgbmV4dCBLRVkgaWYgISROb3RpZmljYXRpb257RGF0YX0tPnskS2V5fTsKICAgICAgICBuZXh0IEtFWSBpZiAhQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+eyRLZXl9IH07CiAgICAgICAgbmV4dCBLRVkgaWYgISROb3RpZmljYXRpb257RGF0YX0tPnskS2V5fS0+WzBdOwoKICAgICAgICBteSAkTWF0Y2ggPSAwOwoKICAgICAgICBWQUxVRToKICAgICAgICBmb3IgbXkgJFZhbHVlICggQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+eyRLZXl9IH0gKSB7CgogICAgICAgICAgICBuZXh0IFZBTFVFIGlmICEkVmFsdWU7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkS2V5IGVxICdUZWFtSUQnCiAgICAgICAgICAgICAgICB8fCAkS2V5IGVxICdSZXNvdXJjZUlEJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBleGlzdGluZyBvYmplY3QgaWRzIGluIGFwcG9pbnRtZW50CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17QXBwb2ludG1lbnR9LT57JEtleX0gKTsKCiAgICAgICAgICAgICAgICBPQkpFQ1RJRDoKICAgICAgICAgICAgICAgIGZvciBteSAkT2JqZWN0SUQgKCBAeyAkUGFyYW17QXBwb2ludG1lbnR9LT57JEtleX0gfSApIHsKCiAgICAgICAgICAgICAgICAgICAgbmV4dCBPQkpFQ1RJRCBpZiAhJE9iamVjdElEOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRWYWx1ZSBlcSAkT2JqZWN0SUQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRNYXRjaCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgIGlmICggJFZhbHVlIGVxICRQYXJhbXtBcHBvaW50bWVudH0tPnskS2V5fSApIHsKICAgICAgICAgICAgICAgICAgICAkTWF0Y2ggPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3QgVkFMVUU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBpZiAhJE1hdGNoOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1JlY2lwaWVudHNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudCBDYWxlbmRhciBOb3RpZmljYXRpb24pKSB7CiAgICAgICAgcmV0dXJuIGlmICEkUGFyYW17JE5lZWRlZH07CiAgICB9CgogICAgIyBzZXQgbG9jYWwgdmFsdWVzCiAgICBteSAlTm90aWZpY2F0aW9uID0gJXsgJFBhcmFte05vdGlmaWNhdGlvbn0gfTsKICAgIG15ICVBcHBvaW50bWVudCAgPSAleyAkUGFyYW17QXBwb2ludG1lbnR9IH07CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKICAgIG15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwogICAgbXkgJEdyb3VwT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15IEBSZWNpcGllbnRVc2VySURzOwogICAgbXkgQFJlY2lwaWVudFVzZXJzOwoKICAgICMgYWRkIHByZS1jYWxjdWxhdGVkIHJlY2lwaWVudAogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e1JlY2lwaWVudHN9ICkgKSB7CiAgICAgICAgcHVzaCBAUmVjaXBpZW50VXNlcklEcywgQHsgJFBhcmFte0RhdGF9LT57UmVjaXBpZW50c30gfTsKICAgIH0KCiAgICAjIHJlbWVtYmVyIHByZS1jYWxjdWxhdGVkIHVzZXIgcmVjaXBpZW50cyBmb3IgbGF0ZXIgY29tcGFyaXNvbnMKICAgIG15ICVQcmVjYWxjdWxhdGVkVXNlcklEcyA9IG1hcCB7ICRfID0+IDEgfSBAUmVjaXBpZW50VXNlcklEczsKCiAgICAjIGdldCByZWNpcGllbnRzIGJ5IFJlY2lwaWVudHMKICAgIGlmICggJE5vdGlmaWNhdGlvbntEYXRhfS0+e1JlY2lwaWVudHN9ICkgewoKICAgICAgICBSRUNJUElFTlQ6CiAgICAgICAgZm9yIG15ICRSZWNpcGllbnQgKCBAeyAkTm90aWZpY2F0aW9ue0RhdGF9LT57UmVjaXBpZW50c30gfSApIHsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRSZWNpcGllbnQKICAgICAgICAgICAgICAgID1+IC9eQXBwb2ludG1lbnQoQWdlbnRzfEFnZW50UmVhZFBlcm1pc3Npb25zfEFnZW50V3JpdGVQZXJtaXNzaW9ucykkLwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoICRSZWNpcGllbnQgZXEgJ0FwcG9pbnRtZW50QWdlbnRzJyApIHsKCiAgICAgICAgICAgICAgICAgICAgUkVTT1VSQ0VJRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFJlc291cmNlSUQgKCBAeyAkQXBwb2ludG1lbnR7UmVzb3VyY2VJRH0gfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUkVTT1VSQ0VJRCBpZiAhJFJlc291cmNlSUQ7CgogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRBZ2VudHN9IH0sICRSZXNvdXJjZUlEOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFJlY2lwaWVudCBlcSAnQXBwb2ludG1lbnRBZ2VudFJlYWRQZXJtaXNzaW9ucycgKSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IGNhbGVuZGFyIGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckdldCgKICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGdldCBhIGxpc3Qgb2YgcmVhZCBhY2Nlc3MgdXNlcnMgZm9yIHRoZSByZWxhdGVkIGNhbGVuZGFyCiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXJzID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJENhbGVuZGFye0dyb3VwSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdybycsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgVVNFUklEOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVVc2VycyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgVVNFUklEIGlmICEkVXNlcklEOwoKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkTm90aWZpY2F0aW9ue0RhdGF9LT57UmVjaXBpZW50QWdlbnRzfSB9LCAkVXNlcklEOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFJlY2lwaWVudCBlcSAnQXBwb2ludG1lbnRBZ2VudFdyaXRlUGVybWlzc2lvbnMnICkgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCBjYWxlbmRhciBpbmZvcm1hdGlvbgogICAgICAgICAgICAgICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9IHx8ICRQYXJhbXtDYWxlbmRhcn0tPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgYSBsaXN0IG9mIHJlYWQgYWNjZXNzIHVzZXJzIGZvciB0aGUgcmVsYXRlZCBjYWxlbmRhcgogICAgICAgICAgICAgICAgICAgIG15ICVVc2VycyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBHcm91cElEID0+ICRDYWxlbmRhcntHcm91cElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAncncnLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIFVTRVJJRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlVXNlcnMgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFVTRVJJRCBpZiAhJFVzZXJJRDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1JlY2lwaWVudEFnZW50c30gfSwgJFVzZXJJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgcmVjaXBpZW50IGFnZW50cwogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRBZ2VudHN9ICkgKSB7CiAgICAgICAgcHVzaCBAUmVjaXBpZW50VXNlcklEcywgQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1JlY2lwaWVudEFnZW50c30gfTsKICAgIH0KCiAgICAjIGhhc2ggdG8ga2VlcCB0cmFjayB3aGljaCBhZ2VudHMgYXJlIGFscmVhZHkgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uCiAgICBteSAlQWdlbnRVc2VkID0gbWFwIHsgJF8gPT4gMSB9IEBSZWNpcGllbnRVc2VySURzOwoKICAgICMgZ2V0IHJlY2lwaWVudHMgYnkgUmVjaXBpZW50R3JvdXBzCiAgICBpZiAoICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRHcm91cHN9ICkgewoKICAgICAgICBSRUNJUElFTlQ6CiAgICAgICAgZm9yIG15ICRHcm91cElEICggQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1JlY2lwaWVudEdyb3Vwc30gfSApIHsKCiAgICAgICAgICAgIG15ICVHcm91cE1lbWJlckxpc3QgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Hcm91cFVzZXJHZXQoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHcm91cElELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAncm8nLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgR1JPVVBNRU1CRVI6CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVHcm91cE1lbWJlckxpc3QgKSB7CgogICAgICAgICAgICAgICAgbmV4dCBHUk9VUE1FTUJFUiBpZiAkVXNlcklEID09IDE7CiAgICAgICAgICAgICAgICBuZXh0IEdST1VQTUVNQkVSIGlmICRBZ2VudFVzZWR7JFVzZXJJRH07CgogICAgICAgICAgICAgICAgJEFnZW50VXNlZHskVXNlcklEfSA9IDE7CgogICAgICAgICAgICAgICAgcHVzaCBAUmVjaXBpZW50VXNlcklEcywgJFVzZXJJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCByZWNpcGllbnRzIGJ5IFJlY2lwaWVudFJvbGVzCiAgICBpZiAoICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRSb2xlc30gKSB7CgogICAgICAgIFJFQ0lQSUVOVDoKICAgICAgICBmb3IgbXkgJFJvbGVJRCAoIEB7ICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRSb2xlc30gfSApIHsKCiAgICAgICAgICAgIG15ICVSb2xlTWVtYmVyTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvblJvbGVVc2VyR2V0KAogICAgICAgICAgICAgICAgUm9sZUlEID0+ICRSb2xlSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBST0xFTUVNQkVSOgogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlUm9sZU1lbWJlckxpc3QgKSB7CgogICAgICAgICAgICAgICAgbmV4dCBST0xFTUVNQkVSIGlmICRVc2VySUQgPT0gMTsKICAgICAgICAgICAgICAgIG5leHQgUk9MRU1FTUJFUiBpZiAkQWdlbnRVc2VkeyRVc2VySUR9OwoKICAgICAgICAgICAgICAgICRBZ2VudFVzZWR7JFVzZXJJRH0gPSAxOwoKICAgICAgICAgICAgICAgIHB1c2ggQFJlY2lwaWVudFVzZXJJRHMsICRVc2VySUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICBteSAlU2tpcFJlY2lwaWVudHM7CiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57U2tpcFJlY2lwaWVudHN9ICkgKSB7CiAgICAgICAgJVNraXBSZWNpcGllbnRzID0gbWFwIHsgJF8gPT4gMSB9IEB7ICRQYXJhbXtEYXRhfS0+e1NraXBSZWNpcGllbnRzfSB9OwogICAgfQoKICAgICMgYWdlbnQgMSBzaG91bGQgbm90IHJlY2VpdmUgbm90aWZpY2F0aW9ucwogICAgJFNraXBSZWNpcGllbnRzeycxJ30gPSAxOwoKICAgICMgcmVtb3ZlIHJlY2lwaWVudHMgc2hvdWxkIG5vdCByZWNlaXZlIGEgbm90aWZpY2F0aW9uCiAgICBAUmVjaXBpZW50VXNlcklEcyA9IGdyZXAgeyAhJFNraXBSZWNpcGllbnRzeyRffSB9IEBSZWNpcGllbnRVc2VySURzOwoKICAgICMgZ2V0IHZhbGlkIHVzZXJzIGxpc3QKICAgIG15ICVWYWxpZFVzZXJzTGlzdCA9ICRVc2VyT2JqZWN0LT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICAgICAgICAgID0+ICdTaG9ydCcsCiAgICAgICAgVmFsaWQgICAgICAgICA9PiAxLAogICAgICAgIE5vT3V0T2ZPZmZpY2UgPT4gMCwKICAgICk7CgogICAgIyByZW1vdmUgaW52YWxpZCB1c2VycwogICAgQFJlY2lwaWVudFVzZXJJRHMgPSBncmVwIHsgJFZhbGlkVXNlcnNMaXN0eyRffSB9IEBSZWNpcGllbnRVc2VySURzOwoKICAgICMgcmVtb3ZlIGR1cGxpY2F0ZWQKICAgIG15ICVUZW1wUmVjaXBpZW50VXNlcklEcyA9IG1hcCB7ICRfID0+IDEgfSBAUmVjaXBpZW50VXNlcklEczsKICAgIEBSZWNpcGllbnRVc2VySURzID0gc29ydCBrZXlzICVUZW1wUmVjaXBpZW50VXNlcklEczsKCiAgICAjIGdldCB0aW1lIG9iamVjdAogICAgbXkgJFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpOwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZS1zdGFtcAogICAgbXkgJFRpbWUgPSAkVGltZU9iamVjdC0+U3lzdGVtVGltZSgpOwoKICAgICMgZ2V0IGFsbCBkYXRhIGZvciByZWNpcGllbnRzIGFzIHRoZXkgc2hvdWxkIGJlIG5lZWRlZCBieSBhbGwgbm90aWZpY2F0aW9uIHRyYW5zcG9ydHMKICAgIFJFQ0lQSUVOVDoKICAgIGZvciBteSAkVXNlcklEIChAUmVjaXBpZW50VXNlcklEcykgewoKICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgICk7CiAgICAgICAgbmV4dCBSRUNJUElFTlQgaWYgISVVc2VyOwoKICAgICAgICAjIHNraXAgdXNlciB0aGF0IHRyaWdnZXJzIHRoZSBldmVudCAoaXQgc2hvdWxkIG5vdCBiZSBub3RpZmllZCkgYnV0IG9ubHkgaWYgaXQgaXMgbm90CiAgICAgICAgIyAgIGEgcHJlLWNhbGN1bGF0ZWQgcmVjaXBpZW50CiAgICAgICAgaWYgKAogICAgICAgICAgICAhJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudFNlbGZOb3RpZnlPbkFjdGlvbicpCiAgICAgICAgICAgICYmICRVc2Vye1VzZXJJRH0gPT0gJFBhcmFte1VzZXJJRH0KICAgICAgICAgICAgJiYgISRQcmVjYWxjdWxhdGVkVXNlcklEc3sgJFBhcmFte1VzZXJJRH0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IFJFQ0lQSUVOVDsKICAgICAgICB9CgogICAgICAgICMgc2tpcCB1c2VycyBvdXQgb2YgdGhlIG9mZmljZSBpZiBjb25maWd1cmVkCiAgICAgICAgaWYgKCAhJE5vdGlmaWNhdGlvbntEYXRhfS0+e1NlbmRPbk91dE9mT2ZmaWNlfSAmJiAkVXNlcntPdXRPZk9mZmljZX0gKSB7CiAgICAgICAgICAgIG15ICRTdGFydCA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgMDA6MDA6MDAiLAogICAgICAgICAgICAgICAgJFVzZXJ7T3V0T2ZPZmZpY2VTdGFydFllYXJ9LCAkVXNlcntPdXRPZk9mZmljZVN0YXJ0TW9udGh9LAogICAgICAgICAgICAgICAgJFVzZXJ7T3V0T2ZPZmZpY2VTdGFydERheX0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFRpbWVTdGFydCA9ICRUaW1lT2JqZWN0LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRFbmQgPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIDIzOjU5OjU5IiwKICAgICAgICAgICAgICAgICRVc2Vye091dE9mT2ZmaWNlRW5kWWVhcn0sICRVc2Vye091dE9mT2ZmaWNlRW5kTW9udGh9LAogICAgICAgICAgICAgICAgJFVzZXJ7T3V0T2ZPZmZpY2VFbmREYXl9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRUaW1lRW5kID0gJFRpbWVPYmplY3QtPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRFbmQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFJFQ0lQSUVOVCBpZiAkVGltZVN0YXJ0IDwgJFRpbWUgJiYgJFRpbWVFbmQgPiAkVGltZTsKICAgICAgICB9CgogICAgICAgICMgc2tpcCBQb3N0TWFzdGVyVXNlcklECiAgICAgICAgbXkgJFBvc3RtYXN0ZXJVc2VySUQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Bvc3RtYXN0ZXJVc2VySUQnKSB8fCAxOwogICAgICAgIG5leHQgUkVDSVBJRU5UIGlmICRVc2Vye1VzZXJJRH0gPT0gJFBvc3RtYXN0ZXJVc2VySUQ7CgogICAgICAgICRVc2Vye1R5cGV9ID0gJ0FnZW50JzsKCiAgICAgICAgcHVzaCBAUmVjaXBpZW50VXNlcnMsIFwlVXNlcjsKICAgIH0KCiAgICByZXR1cm4gQFJlY2lwaWVudFVzZXJzOwp9CgpzdWIgX1NlbmRSZWNpcGllbnROb3RpZmljYXRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFVzZXJJRCBOb3RpZmljYXRpb24gUmVjaXBpZW50IEV2ZW50IFRyYW5zcG9ydCBUcmFuc3BvcnRPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRUcmFuc3BvcnRPYmplY3QgPSAkUGFyYW17VHJhbnNwb3J0T2JqZWN0fTsKCiAgICAjIHNlbmQgbm90aWZpY2F0aW9uIHRvIGVhY2ggcmVjaXBpZW50CiAgICBteSAkU3VjY2VzcyA9ICRUcmFuc3BvcnRPYmplY3QtPlNlbmROb3RpZmljYXRpb24oCiAgICAgICAgQXBwb2ludG1lbnRJRCAgICAgICAgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBOb3RpZmljYXRpb24gICAgICAgICAgPT4gJFBhcmFte05vdGlmaWNhdGlvbn0sCiAgICAgICAgQ3VzdG9tZXJNZXNzYWdlUGFyYW1zID0+ICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9LAogICAgICAgIFJlY2lwaWVudCAgICAgICAgICAgICA9PiAkUGFyYW17UmVjaXBpZW50fSwKICAgICAgICBFdmVudCAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0V2ZW50fSwKICAgICAgICBBdHRhY2htZW50cyAgICAgICAgICAgPT4gJFBhcmFte0F0dGFjaG1lbnRzfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkU3VjY2VzczsKCiAgICBteSAlRXZlbnREYXRhID0gJXsgJFRyYW5zcG9ydE9iamVjdC0+R2V0VHJhbnNwb3J0RXZlbnREYXRhKCkgfTsKCiAgICByZXR1cm4gMSBpZiAhJUV2ZW50RGF0YTsKCiAgICBpZiAoICEkRXZlbnREYXRhe0V2ZW50fSB8fCAhJEV2ZW50RGF0YXtEYXRhfSB8fCAhJEV2ZW50RGF0YXtVc2VySUR9ICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCB0cmlnZ2VyIG5vdGlmaWNhdGlvbiBwb3N0IHNlbmQgZXZlbnQiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9GdXR1cmVUYXNrVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYSBsb2NhbCBhcHBvaW50bWVudCBvYmplY3QKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICAjIGdldCB0aGUgbmV4dCB1cGNvbWluZyBhcHBvaW50bWVudAogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKTsKCiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCB1cGRhdGUgdXBjb21pbmcgYXBwb2ludG1lbnQgZGF0YSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VGlja2V0QXBwb2ludG1lbnRzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIGJhc2UgcXcoS2VybmVsOjpTeXN0ZW06OkFzeW5jaHJvbm91c0V4ZWN1dG9yKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRXZlbnQgRGF0YSBDb25maWcgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBBcHBvaW50bWVudElEIGluIERhdGEhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb3AgcHJvdGVjdGlvbjogcHJldmVudCBmcm9tIHJ1bm5pbmcgaWYgdXBkYXRlIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHRpY2tldCB1cGRhdGUKICAgIGlmICgKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKQogICAgICAgIC0+eydfVGlja2V0QXBwb2ludG1lbnRzOjpUaWNrZXRVcGRhdGUnfQogICAgICAgIC0+eyAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudElEfSB9KysKICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgIyBydW4gb25seSBvbiB0aWNrZXQgYXBwb2ludG1lbnRzIChnZXQgdGlja2V0IGlkKQogICAgbXkgJFRpY2tldElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyktPlRpY2tldEFwcG9pbnRtZW50VGlja2V0SUQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudElEfSwKICAgICk7CiAgICByZXR1cm4gaWYgISRUaWNrZXRJRDsKCiAgICAjIHVwZGF0ZSB0aWNrZXQgaW4gYW4gYXN5bmNocm9ub3VzIGNhbGwKICAgIHJldHVybiAkU2VsZi0+QXN5bmNDYWxsKAogICAgICAgIE9iamVjdE5hbWUgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgICAgIEZ1bmN0aW9uTmFtZSAgID0+ICdUaWNrZXRBcHBvaW50bWVudFVwZGF0ZVRpY2tldCcsCiAgICAgICAgRnVuY3Rpb25QYXJhbXMgPT4gewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICB9LAogICAgKTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFeHBvcnQ6OklDYWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRGF0YTo6SUNhbDsKdXNlIERhdGE6OklDYWw6OkVudHJ5OjpFdmVudDsKdXNlIERhdGU6OklDYWw7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7Cgp1c2UgY29uc3RhbnQgUEFDS0FHRV9OQU1FID0+ICdPVFJTQXBwb2ludG1lbnRDYWxlbmRhcic7CgpvdXIgJFBhY2thZ2VWZXJzaW9uOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlBhY2thZ2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV4cG9ydDo6SUNhbCAtIGlDYWxlbmRhciBleHBvcnQgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkV4cG9ydCBmdW5jdGlvbnMgZm9yIGlDYWxlbmRhciBmb3JtYXQuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJEV4cG9ydE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXhwb3J0OjpJQ2FsJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIG15ICRQYWNrYWdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBhY2thZ2UnKTsKCiAgICBteSAkUGFja2FnZUluc3RhbGxlZCA9ICRQYWNrYWdlT2JqZWN0LT5QYWNrYWdlSXNJbnN0YWxsZWQoCiAgICAgICAgTmFtZSA9PiBQQUNLQUdFX05BTUUsCiAgICApOwoKICAgICMgSWYgcGFja2FnZSBpcyBpbnN0YWxsZWQsIGdldCB2ZXJzaW9uIGZyb20gdGhlIHBhY2thZ2UgbWFuYWdlci4KICAgIGlmICgkUGFja2FnZUluc3RhbGxlZCkgewogICAgICAgIG15IEBMaXN0ID0gJFBhY2thZ2VPYmplY3QtPlJlcG9zaXRvcnlMaXN0KAogICAgICAgICAgICBSZXN1bHQgPT4gJ3Nob3J0JywKICAgICAgICApOwoKICAgICAgICBQQUNLQUdFOgogICAgICAgIGZvciBteSAkUGFja2FnZSAoQExpc3QpIHsKICAgICAgICAgICAgaWYgKCAkUGFja2FnZS0+e05hbWV9IGVxIFBBQ0tBR0VfTkFNRSApIHsKICAgICAgICAgICAgICAgICRQYWNrYWdlVmVyc2lvbiA9ICRQYWNrYWdlLT57VmVyc2lvbn07CiAgICAgICAgICAgICAgICBsYXN0IFBBQ0tBR0U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBPdGhlcndpc2UsIGluY2x1ZGUgZnJhbWV3b3JrIHZlcnNpb24gb25seS4KICAgIGVsc2UgewogICAgICAgICRQYWNrYWdlVmVyc2lvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVmVyc2lvbicpOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRXhwb3J0KCkKCmV4cG9ydCBjYWxlbmRhciB0byBpQ2FsZW5kYXIgZm9ybWF0CgogICAgbXkgJElDYWxTdHJpbmcgPSAkRXhwb3J0T2JqZWN0LT5FeHBvcnQoCiAgICAgICAgQ2FsZW5kYXJJRCAgID0+IDEsICAgICMgKHJlcXVpcmVkKSBWYWxpZCBDYWxlbmRhcklECiAgICAgICAgVXNlcklEICAgICAgID0+IDEsICAgICMgKHJlcXVpcmVkKSBVc2VySUQKICAgICk7CgpyZXR1cm5zIGlDYWxlbmRhciBzdHJpbmcgaWYgc3VjY2Vzc2Z1bAoKPWN1dAoKc3ViIEV4cG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUNhbGVuZGFyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyktPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwogICAgcmV0dXJuIGlmICEkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH07CgogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKICAgIG15IEBBcHBvaW50bWVudElEcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFJlc3VsdCAgICAgPT4gJ0FSUkFZJywKICAgICk7CgogICAgbXkgJElDYWxDYWxlbmRhciA9IERhdGE6OklDYWwtPm5ldygKICAgICAgICBjYWxuYW1lID0+ICRDYWxlbmRhcntDYWxlbmRhck5hbWV9LAogICAgKTsKCiAgICAjIGV4cG9ydCBjb2xvciBmb3IgYXBwbGUgY2FsZW5kYXIKICAgICRJQ2FsQ2FsZW5kYXItPmFkZF9wcm9wZXJ0eSgKICAgICAgICAneC1hcHBsZS1jYWxlbmRhci1jb2xvcicgPT4gJENhbGVuZGFye0NvbG9yfSwKICAgICk7CgogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKICAgIG15ICRQbHVnaW5PYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6UGx1Z2luJyk7CgogICAgbXkgJFRlYW1PYmplY3Q7CiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICRUZWFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJyk7CiAgICB9CgogICAgQVBQT0lOVE1FTlRfSUQ6CiAgICBmb3IgbXkgJEFwcG9pbnRtZW50SUQgKEBBcHBvaW50bWVudElEcykgewogICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gaWYgISRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfTsKCiAgICAgICAgIyBjYWxjdWxhdGUgc3RhcnQgdGltZQogICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfSwKICAgICAgICApOwogICAgICAgIG15ICRJQ2FsU3RhcnRUaW1lID0gRGF0ZTo6SUNhbC0+bmV3KAogICAgICAgICAgICBlcG9jaCA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CgogICAgICAgICMgY2FsY3VsYXRlIGVuZCB0aW1lCiAgICAgICAgbXkgJEVuZFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7RW5kVGltZX0sCiAgICAgICAgKTsKICAgICAgICBteSAkSUNhbEVuZFRpbWUgPSBEYXRlOjpJQ2FsLT5uZXcoCiAgICAgICAgICAgIGVwb2NoID0+ICRFbmRUaW1lLAogICAgICAgICk7CgogICAgICAgICMgcmVjYWxjdWxhdGUgZm9yIGFsbCBkYXkgYXBwb2ludG1lbnQsIGRpc2NhcmQgdGltZSBkYXRhCiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7QWxsRGF5fSApIHsKICAgICAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICApOwogICAgICAgICAgICAkSUNhbFN0YXJ0VGltZSA9IERhdGU6OklDYWwtPm5ldygKICAgICAgICAgICAgICAgIHllYXIgICA9PiAkWWVhciwKICAgICAgICAgICAgICAgIG1vbnRoICA9PiAkTW9udGgsCiAgICAgICAgICAgICAgICBkYXkgICAgPT4gJERheSwKICAgICAgICAgICAgICAgIG9mZnNldCA9PiAnKzAwMDAnLCAgICAjIFVUQwogICAgICAgICAgICApOwogICAgICAgICAgICAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICApOwogICAgICAgICAgICAkSUNhbEVuZFRpbWUgPSBEYXRlOjpJQ2FsLT5uZXcoCiAgICAgICAgICAgICAgICB5ZWFyICAgPT4gJFllYXIsCiAgICAgICAgICAgICAgICBtb250aCAgPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgZGF5ICAgID0+ICREYXksCiAgICAgICAgICAgICAgICBvZmZzZXQgPT4gJyswMDAwJywgICAgIyBVVEMKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGlDYWxlbmRhciBldmVudCBlbnRyeQogICAgICAgIG15ICRJQ2FsRXZlbnQgPSBEYXRhOjpJQ2FsOjpFbnRyeTo6RXZlbnQtPm5ldygpOwoKICAgICAgICAjIG9wdGlvbmFsIHByb3BlcnRpZXMKICAgICAgICBteSAlSUNhbEV2ZW50UHJvcGVydGllczsKCiAgICAgICAgIyByZXBlYXRhYmxlIHByb3BlcnRpZXMKICAgICAgICBteSBASUNhbFJlcGVhdGFibGVQcm9wZXJ0aWVzOwoKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtEZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze2Rlc2NyaXB0aW9ufSA9ICRBcHBvaW50bWVudHtEZXNjcmlwdGlvbn07CiAgICAgICAgfQogICAgICAgIGlmICggJEFwcG9pbnRtZW50e0xvY2F0aW9ufSApIHsKICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7bG9jYXRpb259ID0gJEFwcG9pbnRtZW50e0xvY2F0aW9ufTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyaW5nfSApIHsKICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9ID0gJyc7CgogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVHlwZX0gZXEgJ0RhaWx5JyApIHsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAnRlJFUT1EQUlMWSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9IGVxICdXZWVrbHknICkgewogICAgICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9IC49ICdGUkVRPVdFRUtMWSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9IGVxICdNb250aGx5JyApIHsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAnRlJFUT1NT05USExZJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVHlwZX0gZXEgJ1llYXJseScgKSB7CiAgICAgICAgICAgICAgICAkSUNhbEV2ZW50UHJvcGVydGllc3tycnVsZX0gLj0gJ0ZSRVE9WUVBUkxZJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbURhaWx5JyApIHsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAiRlJFUT1EQUlMWTtJTlRFUlZBTD0kQXBwb2ludG1lbnR7UmVjdXJyZW5jZUludGVydmFsfSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21XZWVrbHknICkgewogICAgICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9IC49ICJGUkVRPVdFRUtMWTtJTlRFUlZBTD0kQXBwb2ludG1lbnR7UmVjdXJyZW5jZUludGVydmFsfSI7CgogICAgICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRBcHBvaW50bWVudHtSZWN1cnJlbmNlRnJlcXVlbmN5fSApICkgewogICAgICAgICAgICAgICAgICAgIG15IEBEYXlOYW1lczsKCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREYXkgKCBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF5ID09IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXlOYW1lcywgJ01PJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICREYXkgPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERheU5hbWVzLCAnVFUnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJERheSA9PSAzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5TmFtZXMsICdXRSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRGF5ID09IDQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXlOYW1lcywgJ1RIJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICREYXkgPT0gNSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERheU5hbWVzLCAnRlInOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJERheSA9PSA2ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5TmFtZXMsICdTQSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRGF5ID09IDcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXlOYW1lcywgJ1NVJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9IC49ICI7QllEQVk9IiAuIGpvaW4oICIsIiwgQERheU5hbWVzICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21Nb250aGx5JyApIHsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAiRlJFUT1NT05USExZO0lOVEVSVkFMPSRBcHBvaW50bWVudHtSZWN1cnJlbmNlSW50ZXJ2YWx9IjsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAiO0JZTU9OVEhEQVk9IiAuIGpvaW4oICIsIiwgQHsgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VGcmVxdWVuY3l9IH0gKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21ZZWFybHknICkgewogICAgICAgICAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9IC49ICJGUkVRPVlFQVJMWTtJTlRFUlZBTD0kQXBwb2ludG1lbnR7UmVjdXJyZW5jZUludGVydmFsfTtCWU1PTlRIREFZPSREYXkiOwogICAgICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9IC49ICI7QllNT05USD0iIC4gam9pbiggIiwiLCBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfSApOwoKICAgICAgICAgICAgICAgICMgUlJVTEU6RlJFUT1ZRUFSTFk7VU5USUw9MjAyMDA2MDJUMDgwMDAwWjtJTlRFUlZBTD0yO0JZTU9OVEhEQVk9MTtCWU1PTlRIPTQKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSApIHsKICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWwgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRJQ2FsUmVjdXJyZW5jZVVudGlsID0gRGF0ZTo6SUNhbC0+bmV3KAogICAgICAgICAgICAgICAgICAgIGVwb2NoID0+ICRSZWN1cnJlbmNlVW50aWwsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9IC49ICc7VU5USUw9JyAuIHN1YnN0ciggJElDYWxSZWN1cnJlbmNlVW50aWwtPmljYWwoKSwgMCwgLTEgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtSZWN1cnJlbmNlQ291bnR9ICkgewogICAgICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9IC49ICc7Q09VTlQ9JyAuICRBcHBvaW50bWVudHtSZWN1cnJlbmNlQ291bnR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VFeGNsdWRlfSApIHsKICAgICAgICAgICAgICAgIFJFQ1VSUkVOQ0VfRVhDTFVERToKICAgICAgICAgICAgICAgIGZvciBteSAkUmVjdXJyZW5jZUV4Y2x1ZGUgKCBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUV4Y2x1ZGV9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBSRUNVUlJFTkNFX0VYQ0xVREUgaWYgISRSZWN1cnJlbmNlRXhjbHVkZTsKICAgICAgICAgICAgICAgICAgICBteSAkUmVjdXJyZW5jZUlEID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFJlY3VycmVuY2VFeGNsdWRlLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJElDYWxSZWN1cnJlbmNlSUQgPSBEYXRlOjpJQ2FsLT5uZXcoCiAgICAgICAgICAgICAgICAgICAgICAgIGVwb2NoID0+ICRSZWN1cnJlbmNlSUQsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgcHVzaCBASUNhbFJlcGVhdGFibGVQcm9wZXJ0aWVzLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5ID0+ICdleGRhdGUnLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkQXBwb2ludG1lbnR7QWxsRGF5fQogICAgICAgICAgICAgICAgICAgICAgICA/IHN1YnN0ciggJElDYWxSZWN1cnJlbmNlSUQtPmljYWwoKSwgMCwgLTEgKQogICAgICAgICAgICAgICAgICAgICAgICA6ICRJQ2FsUmVjdXJyZW5jZUlELT5pY2FsKCksCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvY2N1cnJlbmNlIGFwcG9pbnRtZW50CiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UGFyZW50SUR9ICkgewoKICAgICAgICAgICAgIyBvdmVycmlkZGVuIG9jY3VycmVuY2VzIG9ubHkKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VJRH0KICAgICAgICAgICAgICAgICYmIGdyZXAgeyAoICRfIC8vICcnICkgZXEgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VJRH0gfSBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUV4Y2x1ZGV9IH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIHJlY3VycmVuY2UgaWQKICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlSUQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRJQ2FsUmVjdXJyZW5jZUlEID0gRGF0ZTo6SUNhbC0+bmV3KAogICAgICAgICAgICAgICAgICAgIGVwb2NoID0+ICRSZWN1cnJlbmNlSUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVzeydyZWN1cnJlbmNlLWlkJ30KICAgICAgICAgICAgICAgICAgICA9ICRBcHBvaW50bWVudHtBbGxEYXl9ID8gc3Vic3RyKCAkSUNhbFJlY3VycmVuY2VJRC0+aWNhbCgpLCAwLCAtMSApIDogJElDYWxSZWN1cnJlbmNlSUQtPmljYWwoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBza2lwIGlmIG5vdCBvdmVycmlkZGVuCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbmV4dCBBUFBPSU5UTUVOVF9JRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjYWxjdWxhdGUgbGFzdCBtb2RpZmllZCB0aW1lCiAgICAgICAgbXkgJENoYW5nZVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7Q2hhbmdlVGltZX0sCiAgICAgICAgKTsKICAgICAgICBteSAkSUNhbENoYW5nZVRpbWUgPSBEYXRlOjpJQ2FsLT5uZXcoCiAgICAgICAgICAgIGVwb2NoID0+ICRDaGFuZ2VUaW1lLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZAogICAgICAgIGlmICgkVGVhbU9iamVjdCkgewoKICAgICAgICAgICAgIyBpbmNsdWRlIHRlYW0gbmFtZXMKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7VGVhbUlEfSApIHsKICAgICAgICAgICAgICAgIG15IEBUZWFtczsKCiAgICAgICAgICAgICAgICAjIGdldCB0ZWFtIG5hbWVzCiAgICAgICAgICAgICAgICBmb3IgbXkgJFRlYW1JRCAoIEB7ICRBcHBvaW50bWVudHtUZWFtSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRUZWFtSUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVRlYW0gPSAkVGVhbU9iamVjdC0+VGVhbUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW1JRCA9PiAkVGVhbUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRUZWFte05hbWV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAVGVhbXMsICRUZWFte05hbWV9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEBUZWFtcykgewogICAgICAgICAgICAgICAgICAgICRJQ2FsRXZlbnQtPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgICAgICAgICAgICAgICAgICAieC1vdHJzLXRlYW0iID0+IGpvaW4oICcsJywgQFRlYW1zICksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpbmNsdWRlIHJlc291cmNlIG5hbWVzCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1Jlc291cmNlSUR9ICkgewogICAgICAgICAgICAgICAgbXkgQFVzZXJzOwoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgb2JqZWN0CiAgICAgICAgICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIEB7ICRBcHBvaW50bWVudHtSZXNvdXJjZUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICgkVXNlcklEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVVc2VyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFVzZXJ7VXNlckxvZ2lufSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFVzZXJzLCAkVXNlcntVc2VyTG9naW59OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEBVc2VycykgewogICAgICAgICAgICAgICAgICAgICRJQ2FsRXZlbnQtPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgICAgICAgICAgICAgICAgICAieC1vdHJzLXJlc291cmNlIiA9PiBqb2luKCAnLCcsIEBVc2VycyApLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaW5jbHVkZSBwbHVnaW4gKGxpbmspIGRhdGEKICAgICAgICBteSAkUGx1Z2luTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpc3QoKTsKICAgICAgICBmb3IgbXkgJFBsdWdpbktleSAoIHNvcnQga2V5cyAleyRQbHVnaW5MaXN0fSApIHsKICAgICAgICAgICAgbXkgJExpbmtMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0xpc3QoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15IEBMaW5rQXJyYXk7CiAgICAgICAgICAgIGZvciBteSAkTGlua0lEICggc29ydCBrZXlzICV7JExpbmtMaXN0fSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQExpbmtBcnJheSwgJExpbmtMaXN0LT57JExpbmtJRH0tPntMaW5rSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQExpbmtBcnJheSkgewogICAgICAgICAgICAgICAgJElDYWxFdmVudC0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgICAgICAgICAgICAgIngtb3Rycy1wbHVnaW4tJFBsdWdpbktleSIgPT4gam9pbiggJywnLCBATGlua0FycmF5ICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBib3RoIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBwcm9wZXJ0aWVzCiAgICAgICAgIyByZW1vdmUgdGltZSB6b25lIGZsYWcgZm9yIGFsbCBkYXkgYXBwb2ludG1lbnRzCiAgICAgICAgJElDYWxFdmVudC0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgICAgIHN1bW1hcnkgICAgICAgICA9PiAkQXBwb2ludG1lbnR7VGl0bGV9LAogICAgICAgICAgICBkdHN0YXJ0ICAgICAgICAgPT4gJEFwcG9pbnRtZW50e0FsbERheX0gPyBzdWJzdHIoICRJQ2FsU3RhcnRUaW1lLT5pY2FsKCksIDAsIC0xICkgOiAkSUNhbFN0YXJ0VGltZS0+aWNhbCgpLAogICAgICAgICAgICBkdGVuZCAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50e0FsbERheX0gPyBzdWJzdHIoICRJQ2FsRW5kVGltZS0+aWNhbCgpLCAwLCAtMSApIDogJElDYWxFbmRUaW1lLT5pY2FsKCksCiAgICAgICAgICAgIHVpZCAgICAgICAgICAgICA9PiAkQXBwb2ludG1lbnR7VW5pcXVlSUR9LAogICAgICAgICAgICAnbGFzdC1tb2RpZmllZCcgPT4gJElDYWxDaGFuZ2VUaW1lLT5pY2FsKCksCiAgICAgICAgICAgICVJQ2FsRXZlbnRQcm9wZXJ0aWVzLAogICAgICAgICk7CgogICAgICAgICMgYWRkIHJlcGVhdGFibGUgcHJvcGVydGllcwogICAgICAgIGZvciBteSAkUmVwZWF0YWJsZSAoQElDYWxSZXBlYXRhYmxlUHJvcGVydGllcykgewogICAgICAgICAgICAkSUNhbEV2ZW50LT5hZGRfcHJvcGVydGllcygKICAgICAgICAgICAgICAgICRSZXBlYXRhYmxlLT57UHJvcGVydHl9ID0+ICRSZXBlYXRhYmxlLT57VmFsdWV9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJElDYWxDYWxlbmRhci0+YWRkX2VudHJ5KCRJQ2FsRXZlbnQpOwogICAgfQoKICAgIHJldHVybiAkSUNhbENhbGVuZGFyLT5hc19zdHJpbmcoKTsKfQoKewogICAgbm8gd2FybmluZ3MgJ3JlZGVmaW5lJzsgICAgIyMgbm8gY3JpdGljCgogICAgIyBJbmNsdWRlIHBhY2thZ2UgbmFtZSBhbmQgdmVyc2lvbiBpbiBwcm9kdWN0IElEIHByb3BlcnR5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIGJ5IHJlZGVmaW5pbmcKICAgICMgICBleHRlcm5hbCBsaWJyYXJ5IG1ldGhvZC4KICAgIHN1YiBEYXRhOjpJQ2FsOjpwcm9kdWN0X2lkIHsgICAgIyMgbm8gY3JpdGljCiAgICAgICAgcmV0dXJuIFBBQ0tBR0VfTkFNRSAuICcgJyAuICRQYWNrYWdlVmVyc2lvbjsKICAgIH0KfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpJbXBvcnQ6OklDYWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRGF0YTo6SUNhbDsKdXNlIERhdGE6OklDYWw6OkVudHJ5OjpFdmVudDsKdXNlIERhdGU6OklDYWw7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpJbXBvcnQ6OklDYWwgLSBpQ2FsZW5kYXIgaW1wb3J0IGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpJbXBvcnQgZnVuY3Rpb25zIGZvciBpQ2FsZW5kYXIgZm9ybWF0LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRJbXBvcnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV4cG9ydDo6SUNhbCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEltcG9ydCgpCgppbXBvcnQgY2FsZW5kYXIgaW4gaUNhbGVuZGFyIGZvcm1hdAogICAgbXkgJFN1Y2Nlc3MgPSAkSW1wb3J0T2JqZWN0LT5JbXBvcnQoCiAgICAgICAgQ2FsZW5kYXJJRCAgICAgPT4gMTIzLAogICAgICAgIElDYWwgICAgICAgICAgID0+ICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBpQ2FsIHN0cmluZwogICAgICAgICAgICAnCiAgICAgICAgICAgICAgICBCRUdJTjpWQ0FMRU5EQVIKICAgICAgICAgICAgICAgIFBST0RJRDpaaW1icmEtQ2FsZW5kYXItUHJvdmlkZXIKICAgICAgICAgICAgICAgIFZFUlNJT046Mi4wCiAgICAgICAgICAgICAgICBNRVRIT0Q6UkVRVUVTVAogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICcsCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFVzZXJJRAogICAgICAgIFVwZGF0ZUV4aXN0aW5nID0+IDAsICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBEZWxldGUgZXhpc3RpbmcgQXBwb2ludG1lbnRzIHdpdGhpbiBzYW1lIENhbGVuZGFyIGlmIFVuaXF1ZUlEIG1hdGNoZXMKICAgICAgICBVbnRpbExpbWl0ICAgICA9PiAnMjAxNy0wMS0wMSAwMDowMDowMCcsICAjIChvcHRpb25hbCkgSWYgcHJvdmlkZWQsIHN5c3RlbSB3aWxsIHVzZSB0aGlzIHZhbHVlIGZvciBsaW1pdGluZyByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZGVmaW5lZCBlbmQgZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5zdGVhZCBvZiBBcHBvaW50bWVudENhbGVuZGFyOjpJbXBvcnQ6OlJlY3VycmluZ01vbnRoc0xpbWl0IHRvIGRvIHRoZSBjYWxjdWxhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTk9URTogUExFQVNFIFVTRSBUSElTIFBBUkFNRVRFUiBGT1IgVU5JVCBURVNUUyBPTkxZCiAgICApOwoKcmV0dXJucyBudW1iZXIgb2YgaW1wb3J0ZWQgYXBwb2ludG1lbnRzIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSAwCgo9Y3V0CgpzdWIgSW1wb3J0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIElDYWwgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRVbnRpbExpbWl0ZWRUaW1lc3RhbXAgPSAkUGFyYW17VW50aWxMaW1pdH0gfHwgJyc7CgogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICBpZiAoICEkVW50aWxMaW1pdGVkVGltZXN0YW1wICkgewoKICAgICAgICAjIGNhbGN1bGF0ZSB1bnRpbCB0aW1lIHdoaWNoIHdpbGwgYmUgdXNlZCBpZiB0aGVyZSBpcyBhbnkgcmVjdXJyaW5nIEFwcG9pbnRtZW50IHdpdGhvdXQgZW5kIHRpbWUgZGVmaW5lZC4KICAgICAgICBteSAkQ3VycmVudFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCk7CiAgICAgICAgbXkgJFJlY3VycmluZ01vbnRoc0xpbWl0CiAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJBcHBvaW50bWVudENhbGVuZGFyOjpJbXBvcnQ6OlJlY3VycmluZ01vbnRoc0xpbWl0IikKICAgICAgICAgICAgfHwgJzEyJzsgICAgIyBkZWZhdWx0IDEyIG1vbnRocwoKICAgICAgICBteSAkVW50aWxMaW1pdGVkU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgIFRpbWUgICA9PiAkQ3VycmVudFN5c3RlbVRpbWUsCiAgICAgICAgICAgIE1vbnRocyA9PiAkUmVjdXJyaW5nTW9udGhzTGltaXQsCiAgICAgICAgKTsKICAgICAgICAkVW50aWxMaW1pdGVkVGltZXN0YW1wID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFVudGlsTGltaXRlZFN5c3RlbSwKICAgICAgICApOwogICAgfQoKICAgICMgVHVybiBvbiBVVEY4IGZsYWcgb24gc3VwcGxpZWQgc3RyaW5nIGZvciBjb3JyZWN0IGVuY29kaW5nIGluIFBvc3RncmVTUUwgYmFja2VuZC4KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlSW5wdXQoIFwkUGFyYW17SUNhbH0gKTsKCiAgICBteSAkQ2FsZW5kYXIgPSBEYXRhOjpJQ2FsLT5uZXcoIGRhdGEgPT4gJFBhcmFte0lDYWx9ICk7CgogICAgbXkgQEVudHJpZXMgICAgICAgICAgICAgID0gQHsgJENhbGVuZGFyLT5lbnRyaWVzKCkgfTsKICAgIG15ICRBcHBvaW50bWVudHNJbXBvcnRlZCA9IDA7CiAgICBteSAlSUNhbFRpbWVab25lczsKCiAgICBteSAkUGx1Z2luT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbicpOwogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoQEVudHJpZXMpIHsKICAgICAgICBteSAkUHJvcGVydGllcyA9ICRFbnRyeS0+cHJvcGVydGllcygpOwoKICAgICAgICBteSAlUGFyYW1ldGVyczsKICAgICAgICBteSAlTGlua2VkT2JqZWN0czsKCiAgICAgICAgIyBQcm9jZXNzIHRpbWV6b25lIGRlZmluaXRpb25zIGZyb20gdGhlIElDYWwgZmlsZS4KICAgICAgICBpZiAoIHJlZiAkRW50cnkgZXEgJ0RhdGE6OklDYWw6OkVudHJ5OjpUaW1lWm9uZScgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsndHppZCd9ICkKICAgICAgICAgICAgICAgICYmIHJlZiAkUHJvcGVydGllcy0+eyd0emlkJ30tPlswXSBlcSAnRGF0YTo6SUNhbDo6UHJvcGVydHknCiAgICAgICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eyd0emlkJ30tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRUaW1lem9uZUlEID0gJFByb3BlcnRpZXMtPnsndHppZCd9LT5bMF0tPnsndmFsdWUnfTsKICAgICAgICAgICAgICAgIG15ICRUaW1lem9uZU9mZnNldDsKCiAgICAgICAgICAgICAgICBteSBAVGltZXpvbmVFbnRyaWVzID0gQHsgJEVudHJ5LT5lbnRyaWVzKCkgfTsKICAgICAgICAgICAgICAgIGZvciBteSAkVGltZXpvbmVFbnRyeSAoQFRpbWV6b25lRW50cmllcykgewogICAgICAgICAgICAgICAgICAgIG15ICRUaW1lem9uZVByb3BlcnRpZXMgPSAkVGltZXpvbmVFbnRyeS0+cHJvcGVydGllcygpOwoKICAgICAgICAgICAgICAgICAgICAjIFNhdmUgb25seSBzaW1wbGUgdGltZSB6b25lcywgd2l0aG91dCBkYXlsaWdodCBzYXZpbmdzIHJ1bGVzLgogICAgICAgICAgICAgICAgICAgICMgVE9ETzogRXh0ZW5kIHRvIGluY2x1ZGUgYWxsIG90aGVyIGRlZmluaXRpb25zLCBlc3BlY2lhbGx5IHdpdGggY29tcGxpY2F0ZWQKICAgICAgICAgICAgICAgICAgICAjICAgICAgIHJ1bGVzIGZvciBkYXlsaWdodCBzYXZpbmdzIChzZWUgRWd5cHQpLgogICAgICAgICAgICAgICAgICAgIGlmICggcmVmICRUaW1lem9uZUVudHJ5IGVxICdEYXRhOjpJQ2FsOjpFbnRyeTo6VGltZVpvbmU6OlN0YW5kYXJkJyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgU3RhbmRhcmQgdGltZSB6b25lcyBzaG91bGQgaGF2ZSBUWk9GRlNFVFRPIGFuZCBUWk9GRlNFVEZST00gc2V0IHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAjICAgc2FtZSB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkVGltZXpvbmVQcm9wZXJ0aWVzLT57J3R6b2Zmc2V0dG8nfSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZWYgJFRpbWV6b25lUHJvcGVydGllcy0+eyd0em9mZnNldHRvJ30tPlswXSBlcSAnRGF0YTo6SUNhbDo6UHJvcGVydHknCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAkVGltZXpvbmVQcm9wZXJ0aWVzLT57J3R6b2Zmc2V0dG8nfS0+WzBdLT57J3ZhbHVlJ30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIElzQXJyYXlSZWZXaXRoRGF0YSggJFRpbWV6b25lUHJvcGVydGllcy0+eyd0em9mZnNldGZyb20nfSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZWYgJFRpbWV6b25lUHJvcGVydGllcy0+eyd0em9mZnNldGZyb20nfS0+WzBdIGVxICdEYXRhOjpJQ2FsOjpQcm9wZXJ0eScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICRUaW1lem9uZVByb3BlcnRpZXMtPnsndHpvZmZzZXRmcm9tJ30tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAkVGltZXpvbmVQcm9wZXJ0aWVzLT57J3R6b2Zmc2V0dG8nfS0+WzBdLT57J3ZhbHVlJ30gZXEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lem9uZVByb3BlcnRpZXMtPnsndHpvZmZzZXRmcm9tJ30tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lem9uZU9mZnNldCA9ICRUaW1lem9uZVByb3BlcnRpZXMtPnsndHpvZmZzZXR0byd9LT5bMF0tPnsndmFsdWUnfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBTa2lwIGRheWxpZ2h0IHNhdmluZ3MgdGltZSB6b25lcywgdGhpcyB3aWxsIGJlIG9mZmxvYWRlZCB0byBEYXRlVGltZTo6VGltZVpvbmUKICAgICAgICAgICAgICAgICAgICAjICAgb2JqZWN0IGZvciBjb21wbGV4aXR5LgogICAgICAgICAgICAgICAgICAgIGVsc2lmICggcmVmICRUaW1lem9uZUVudHJ5IGVxICdEYXRhOjpJQ2FsOjpFbnRyeTo6VGltZVpvbmU6OkRheWxpZ2h0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWV6b25lT2Zmc2V0ID0gdW5kZWY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkVGltZXpvbmVPZmZzZXQgKSB7CgogICAgICAgICAgICAgICAgICAgICMgT2Zmc2V0cyBhcmUgZGVmaW5lZCBhcyBob3VycyBhbmQgbWludXRlcywgaS5lLiAiKzAyMDAiLCB3ZSBuZWVkIGRlY2ltYWwgaG91cnMuCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVGltZXpvbmVPZmZzZXQgPX4gLyAoLXxcKyk/IChbMC05XXsyLH0pIChbMC05XXsyLH0pIC94ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkU2lnbiAgID0gJDE7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRPZmZzZXQgPSAkMiArICQzIC8gNjA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFNpZ24gZXEgJy0nICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE9mZnNldCAqPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkSUNhbFRpbWVab25lc3skVGltZXpvbmVJRH0gPSAkT2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdWlkCiAgICAgICAgaWYgKAogICAgICAgICAgICBJc0FycmF5UmVmV2l0aERhdGEoICRQcm9wZXJ0aWVzLT57J3VpZCd9ICkKICAgICAgICAgICAgJiYgcmVmICRQcm9wZXJ0aWVzLT57J3VpZCd9LT5bMF0gZXEgJ0RhdGE6OklDYWw6OlByb3BlcnR5JwogICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eyd1aWQnfS0+WzBdLT57J3ZhbHVlJ30KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFtZXRlcnN7VW5pcXVlSUR9ID0gJFByb3BlcnRpZXMtPnsndWlkJ30tPlswXS0+eyd2YWx1ZSd9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGl0bGUKICAgICAgICBpZiAoCiAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsnc3VtbWFyeSd9ICkKICAgICAgICAgICAgJiYgcmVmICRQcm9wZXJ0aWVzLT57J3N1bW1hcnknfS0+WzBdIGVxICdEYXRhOjpJQ2FsOjpQcm9wZXJ0eScKICAgICAgICAgICAgJiYgJFByb3BlcnRpZXMtPnsnc3VtbWFyeSd9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW1ldGVyc3tUaXRsZX0gPSAkUHJvcGVydGllcy0+eydzdW1tYXJ5J30tPlswXS0+eyd2YWx1ZSd9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZGVzY3JpcHRpb24KICAgICAgICBpZiAoCiAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsnZGVzY3JpcHRpb24nfSApCiAgICAgICAgICAgICYmIHJlZiAkUHJvcGVydGllcy0+eydkZXNjcmlwdGlvbid9LT5bMF0gZXEgJ0RhdGE6OklDYWw6OlByb3BlcnR5JwogICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eydkZXNjcmlwdGlvbid9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW1ldGVyc3tEZXNjcmlwdGlvbn0gPSAkUHJvcGVydGllcy0+eydkZXNjcmlwdGlvbid9LT5bMF0tPnsndmFsdWUnfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHN0YXJ0IHRpbWUKICAgICAgICBpZiAoCiAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsnZHRzdGFydCd9ICkKICAgICAgICAgICAgJiYgcmVmICRQcm9wZXJ0aWVzLT57J2R0c3RhcnQnfS0+WzBdIGVxICdEYXRhOjpJQ2FsOjpQcm9wZXJ0eScKICAgICAgICAgICAgJiYgJFByb3BlcnRpZXMtPnsnZHRzdGFydCd9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgbXkgJFRpbWV6b25lSUQ7CgogICAgICAgICAgICBpZiAoIHJlZiAkUHJvcGVydGllcy0+eydkdHN0YXJ0J30tPlswXS0+eydfcGFyYW1ldGVycyd9IGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGl0J3MgYW4gYWxsIGRheSBldmVudAogICAgICAgICAgICAgICAgIyAxKSB0aGVyZSBpcyBubyB0aW1lIGNvbXBvbmVudCBmb3IgdGhlIGRhdGUgdmFsdWUKICAgICAgICAgICAgICAgICMgMikgdGhlcmUgaXMgYW4gZXhwbGljaXQgdmFsdWUgcGFyYW1ldGVyIHNldCB0byBEQVRFCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoICRQcm9wZXJ0aWVzLT57J2R0c3RhcnQnfS0+WzBdLT57J3ZhbHVlJ30gPT0gOAogICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAkUHJvcGVydGllcy0+eydkdHN0YXJ0J30tPlswXS0+eydfcGFyYW1ldGVycyd9LT57J1ZBTFVFJ30KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJFByb3BlcnRpZXMtPnsnZHRzdGFydCd9LT5bMF0tPnsnX3BhcmFtZXRlcnMnfS0+eydWQUxVRSd9IGVxICdEQVRFJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7QWxsRGF5fSA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayB0aW1lem9uZQogICAgICAgICAgICAgICAgaWYgKCAkUHJvcGVydGllcy0+eydkdHN0YXJ0J30tPlswXS0+eydfcGFyYW1ldGVycyd9LT57J1RaSUQnfSApIHsKICAgICAgICAgICAgICAgICAgICAkVGltZXpvbmVJRCA9ICRQcm9wZXJ0aWVzLT57J2R0c3RhcnQnfS0+WzBdLT57J19wYXJhbWV0ZXJzJ30tPnsnVFpJRCd9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU3RhcnRUaW1lSUNhbCA9ICRTZWxmLT5fRm9ybWF0VGltZSgKICAgICAgICAgICAgICAgIFRpbWUgPT4gJFByb3BlcnRpZXMtPnsnZHRzdGFydCd9LT5bMF0tPnsndmFsdWUnfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnRUaW1lSUNhbCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkVGltZXpvbmVJRCkgewogICAgICAgICAgICAgICAgbXkgJE9mZnNldCA9ICRJQ2FsVGltZVpvbmVzeyRUaW1lem9uZUlEfSAvLyAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWV6b25lT2Zmc2V0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpbWV6b25lSUQgPT4gJFRpbWV6b25lSUQsCiAgICAgICAgICAgICAgICAgICAgVGltZSAgICAgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTdGFydFRpbWUgLT0gJE9mZnNldCAqIDM2MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggISRQYXJhbWV0ZXJze0FsbERheX0gKSB7CiAgICAgICAgICAgICAgICBteSAkTG9jYWxPZmZzZXQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkxvY2FsVGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTdGFydFRpbWUgKz0gJExvY2FsT2Zmc2V0ICogMzYwMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFtZXRlcnN7U3RhcnRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZW5kIHRpbWUKICAgICAgICBpZiAoCiAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsnZHRlbmQnfSApCiAgICAgICAgICAgICYmIHJlZiAkUHJvcGVydGllcy0+eydkdGVuZCd9LT5bMF0gZXEgJ0RhdGE6OklDYWw6OlByb3BlcnR5JwogICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eydkdGVuZCd9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkVGltZXpvbmVJRDsKCiAgICAgICAgICAgIGlmICggcmVmICRQcm9wZXJ0aWVzLT57J2R0ZW5kJ30tPlswXS0+eydfcGFyYW1ldGVycyd9IGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIHRpbWV6b25lCiAgICAgICAgICAgICAgICBpZiAoICRQcm9wZXJ0aWVzLT57J2R0ZW5kJ30tPlswXS0+eydfcGFyYW1ldGVycyd9LT57J1RaSUQnfSApIHsKICAgICAgICAgICAgICAgICAgICAkVGltZXpvbmVJRCA9ICRQcm9wZXJ0aWVzLT57J2R0ZW5kJ30tPlswXS0+eydfcGFyYW1ldGVycyd9LT57J1RaSUQnfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEVuZFRpbWVJQ2FsID0gJFNlbGYtPl9Gb3JtYXRUaW1lKAogICAgICAgICAgICAgICAgVGltZSA9PiAkUHJvcGVydGllcy0+eydkdGVuZCd9LT5bMF0tPnsndmFsdWUnfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEVuZFRpbWVJQ2FsLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRUaW1lem9uZUlEKSB7CiAgICAgICAgICAgICAgICBteSAkT2Zmc2V0ID0gJElDYWxUaW1lWm9uZXN7JFRpbWV6b25lSUR9IC8vICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGltZXpvbmVJRCA9PiAkVGltZXpvbmVJRCwKICAgICAgICAgICAgICAgICAgICBUaW1lICAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRFbmRUaW1lIC09ICRPZmZzZXQgKiAzNjAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkUGFyYW1ldGVyc3tBbGxEYXl9ICkgewogICAgICAgICAgICAgICAgbXkgJExvY2FsT2Zmc2V0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5Mb2NhbFRpbWV6b25lT2Zmc2V0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpbWUgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEVuZFRpbWUgKz0gJExvY2FsT2Zmc2V0ICogMzYwMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFtZXRlcnN7RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBsb2NhdGlvbgogICAgICAgIGlmICgKICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkUHJvcGVydGllcy0+eydsb2NhdGlvbid9ICkKICAgICAgICAgICAgJiYgcmVmICRQcm9wZXJ0aWVzLT57J2xvY2F0aW9uJ30tPlswXSBlcSAnRGF0YTo6SUNhbDo6UHJvcGVydHknCiAgICAgICAgICAgICYmICRQcm9wZXJ0aWVzLT57J2xvY2F0aW9uJ30tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbWV0ZXJze0xvY2F0aW9ufSA9ICRQcm9wZXJ0aWVzLT57J2xvY2F0aW9uJ30tPlswXS0+eyd2YWx1ZSd9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcnJ1bGUKICAgICAgICBpZiAoCiAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsncnJ1bGUnfSApCiAgICAgICAgICAgICYmIHJlZiAkUHJvcGVydGllcy0+eydycnVsZSd9LT5bMF0gZXEgJ0RhdGE6OklDYWw6OlByb3BlcnR5JwogICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eydycnVsZSd9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAoICRGcmVxdWVuY3ksICRVbnRpbCwgJEludGVydmFsLCAkQ291bnQsICREYXlOYW1lcywgJE1vbnRoRGF5LCAkTW9udGhzICk7CgogICAgICAgICAgICBteSBAUnVsZXMgPSBzcGxpdCAnOycsICRQcm9wZXJ0aWVzLT57J3JydWxlJ30tPlswXS0+eyd2YWx1ZSd9OwoKICAgICAgICAgICAgUlVMRToKICAgICAgICAgICAgZm9yIG15ICRSdWxlIChAUnVsZXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoICRSdWxlID1+IC9GUkVRPSguKj8pJC9pICkgewogICAgICAgICAgICAgICAgICAgICRGcmVxdWVuY3kgPSAkMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFJ1bGUgPX4gL1VOVElMPSguKj8pJC9pICkgewogICAgICAgICAgICAgICAgICAgICRVbnRpbCA9ICQxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUnVsZSA9fiAvSU5URVJWQUw9KFxkKz8pJC9pICkgewogICAgICAgICAgICAgICAgICAgICRJbnRlcnZhbCA9ICQxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUnVsZSA9fiAvQ09VTlQ9KFxkKz8pJC9pICkgewogICAgICAgICAgICAgICAgICAgICRDb3VudCA9ICQxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUnVsZSA9fiAvQllEQVk9KC4qPykkL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJERheU5hbWVzID0gJDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRSdWxlID1+IC9CWU1PTlRIREFZPSguKj8pJC9pICkgewogICAgICAgICAgICAgICAgICAgICRNb250aERheSA9ICQxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUnVsZSA9fiAvQllNT05USD0oLio/KSQvaSApIHsKICAgICAgICAgICAgICAgICAgICAkTW9udGhzID0gJDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRJbnRlcnZhbCB8fD0gMTsgICAgIyBkZWZhdWx0IHZhbHVlCgogICAgICAgICAgICAjIHRoaXMgYXBwb2ludG1lbnQgaXMgcmVwZWF0aW5nCiAgICAgICAgICAgIGlmICggJEZyZXF1ZW5jeSBlcSAiREFJTFkiICkgewogICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyaW5nfSAgICAgICAgICA9IDE7CiAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlVHlwZX0gICAgID0gJEludGVydmFsID09IDEgPyAiRGFpbHkiIDogIkN1c3RvbURhaWx5IjsKICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VJbnRlcnZhbH0gPSAkSW50ZXJ2YWw7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEZyZXF1ZW5jeSBlcSAiV0VFS0xZIiApIHsKICAgICAgICAgICAgICAgIGlmICgkRGF5TmFtZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjdXN0b20KCiAgICAgICAgICAgICAgICAgICAgbXkgQERheXM7CgogICAgICAgICAgICAgICAgICAgICMgU1UsTU8sVFUsV0UsVEgsRlIsU0EKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJERheU5hbWUgKCBzcGxpdCggJywnLCAkRGF5TmFtZXMgKSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdWMgJERheU5hbWUgZXEgJ01PJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERheXMsIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCB1YyAkRGF5TmFtZSBlcSAnVFUnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5cywgMjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoIHVjICREYXlOYW1lIGVxICdXRScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXlzLCAzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggdWMgJERheU5hbWUgZXEgJ1RIJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERheXMsIDQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCB1YyAkRGF5TmFtZSBlcSAnRlInICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5cywgNTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoIHVjICREYXlOYW1lIGVxICdTQScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXlzLCA2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggdWMgJERheU5hbWUgZXEgJ1NVJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERheXMsIDc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICggc2NhbGFyIEBEYXlzID4gMCApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmluZ30gICAgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZVR5cGV9ICAgICAgPSAiQ3VzdG9tV2Vla2x5IjsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUludGVydmFsfSAgPSAkSW50ZXJ2YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VGcmVxdWVuY3l9ID0gXEBEYXlzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICMgZWFjaCBuIGRheXMKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJpbmd9ICAgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlVHlwZX0gICAgID0gIldlZWtseSI7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUludGVydmFsfSA9ICRJbnRlcnZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRGcmVxdWVuY3kgZXEgIk1PTlRITFkiICkgewoKICAgICAgICAgICAgICAgICMgU2tpcCB1bnN1cHBvcnRlZCBjdXN0b20gbW9udGhseSByZWN1cnJpbmcgcnVsZXM6CiAgICAgICAgICAgICAgICAjICAgLSBGUkVRPU1PTlRITFk7QllEQVk9MlNBCiAgICAgICAgICAgICAgICBpZiAoJERheU5hbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTa2lwIGltcG9ydCBvZiB1bnN1cHBvcnRlZCByZWN1cnJpbmcgcnVsZTogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkUHJvcGVydGllcy0+eydycnVsZSd9LT5bMF0tPnsndmFsdWUnfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRNb250aERheSkgewoKICAgICAgICAgICAgICAgICAgICAjIEN1c3RvbQogICAgICAgICAgICAgICAgICAgICMgRlJFUT1NT05USExZO1VOVElMPTIwMTcwMTAxVDA4MDAwMFo7QllNT05USERBWT0xNiwzMScKICAgICAgICAgICAgICAgICAgICBteSBARGF5cyA9IHNwbGl0KCAnLCcsICRNb250aERheSApOwoKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJpbmd9ICAgICAgICAgICA9IDE7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZVR5cGV9ICAgICAgPSAiQ3VzdG9tTW9udGhseSI7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBcQERheXM7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUludGVydmFsfSAgPSAkSW50ZXJ2YWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJpbmd9ICAgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlVHlwZX0gICAgID0gIk1vbnRobHkiOwogICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VJbnRlcnZhbH0gPSAkSW50ZXJ2YWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRnJlcXVlbmN5IGVxICJZRUFSTFkiICkgewoKICAgICAgICAgICAgICAgICMgU2tpcCB1bnN1cHBvcnRlZCBjdXN0b20geWVhcmx5IHJlY3VycmluZyBydWxlczoKICAgICAgICAgICAgICAgICMgICAtIEZSRVE9WUVBUkxZO0JZTU9OVEg9MztCWURBWT0tMVNVCiAgICAgICAgICAgICAgICAjICAgLSBGUkVRPVlFQVJMWTtCWU1PTlRIPTEwO0JZREFZPS0xU1UKICAgICAgICAgICAgICAgIGlmICgkRGF5TmFtZXMpIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlNraXAgaW1wb3J0IG9mIHVuc3VwcG9ydGVkIHJlY3VycmluZyBydWxlOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRQcm9wZXJ0aWVzLT57J3JydWxlJ30tPlswXS0+eyd2YWx1ZSd9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSBATW9udGhzID0gc3BsaXQoICcsJywgJE1vbnRocyB8fCAnJyApOwoKICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWVTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbWV0ZXJze1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgQERhdGUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lU3lzdGVtLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgc2NhbGFyIEBNb250aHMgPiAxCiAgICAgICAgICAgICAgICAgICAgfHwgKAogICAgICAgICAgICAgICAgICAgICAgICBzY2FsYXIgQE1vbnRocyA9PSAxCiAgICAgICAgICAgICAgICAgICAgICAgICYmICREYXRlWzNdICE9ICRNb250aHNbMF0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmluZ30gICAgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlVHlwZX0gICAgICA9ICJDdXN0b21ZZWFybHkiOwogICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VGcmVxdWVuY3l9ID0gXEBNb250aHM7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUludGVydmFsfSAgPSAkSW50ZXJ2YWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJpbmd9ICAgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlVHlwZX0gICAgID0gIlllYXJseSI7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUludGVydmFsfSA9ICRJbnRlcnZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBGUkVRPVlFQVJMWTtJTlRFUlZBTD0yO0JZTU9OVEg9MSwyLDEyCiAgICAgICAgICAgICMgRlJFUT1NT05USExZO1VOVElMPTIwMTcwMzAyVDEyMTUwMFonCiAgICAgICAgICAgICMgRlJFUT1NT05USExZO1VOVElMPTIwMTcwMjAyVDA5MDAwMFo7SU5URVJWQUw9MjtCWU1PTlRIREFZPTMxJywKICAgICAgICAgICAgIyBGUkVRPVdFRUtMWTtJTlRFUlZBTD0yO0JZREFZPVRVCiAgICAgICAgICAgICMgRlJFUT1ZRUFSTFk7VU5USUw9MjAyMDA2MDJUMDgwMDAwWjtJTlRFUlZBTD0yO0JZTU9OVEhEQVk9MTtCWU1PTlRIPTQnOwoKICAgICAgICAgICAgIyBGUkVRPURBSUxZO0NPVU5UPTMKCiAgICAgICAgICAgIGlmICgkVW50aWwpIHsKICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VVbnRpbH0gPSAkU2VsZi0+X0Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkVW50aWwsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgkQ291bnQpIHsKICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VDb3VudH0gPSAkQ291bnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAjIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VVbnRpbH0gPSAkVW50aWxMaW1pdGVkVGltZXN0YW1wOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGV4Y2x1ZGVkIGRhdGVzCiAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUHJvcGVydGllcy0+eydleGRhdGUnfSApICkgewogICAgICAgICAgICAgICAgbXkgQFJlY3VycmVuY2VFeGNsdWRlOwogICAgICAgICAgICAgICAgZm9yIG15ICRFeGNsdWRlICggQHsgJFByb3BlcnRpZXMtPnsnZXhkYXRlJ30gfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiAkRXhjbHVkZSBlcSAnRGF0YTo6SUNhbDo6UHJvcGVydHknCiAgICAgICAgICAgICAgICAgICAgICAgICYmICRFeGNsdWRlLT57J3ZhbHVlJ30KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRpbWV6b25lSUQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVmICRFeGNsdWRlLT57J19wYXJhbWV0ZXJzJ30gZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgdGltZXpvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEV4Y2x1ZGUtPnsnX3BhcmFtZXRlcnMnfS0+eydUWklEJ30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWV6b25lSUQgPSAkRXhjbHVkZS0+eydfcGFyYW1ldGVycyd9LT57J1RaSUQnfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEV4Y2x1ZGVUaW1lSUNhbCA9ICRTZWxmLT5fRm9ybWF0VGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgPT4gJEV4Y2x1ZGUtPnsndmFsdWUnfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFeGNsdWRlVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRXhjbHVkZVRpbWVJQ2FsLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRUaW1lem9uZUlEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkT2Zmc2V0ID0gJElDYWxUaW1lWm9uZXN7JFRpbWV6b25lSUR9IC8vICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZXpvbmVJRCA9PiAkVGltZXpvbmVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lICAgICAgID0+ICRFeGNsdWRlVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXhjbHVkZVRpbWUgLT0gJE9mZnNldCAqIDM2MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRQYXJhbWV0ZXJze0FsbERheX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkTG9jYWxPZmZzZXQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkxvY2FsVGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkRXhjbHVkZVRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEV4Y2x1ZGVUaW1lICs9ICRMb2NhbE9mZnNldCAqIDM2MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFJlY3VycmVuY2VFeGNsdWRlLCAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEV4Y2x1ZGVUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VFeGNsdWRlfSA9IFxAUmVjdXJyZW5jZUV4Y2x1ZGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZAogICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScsIFNpbGVudCA9PiAxICkgKSB7CgogICAgICAgICAgICAjIGdldCB0ZWFtCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsneC1vdHJzLXRlYW0nfSApCiAgICAgICAgICAgICAgICAmJiByZWYgJFByb3BlcnRpZXMtPnsneC1vdHJzLXRlYW0nfS0+WzBdIGVxICdEYXRhOjpJQ2FsOjpQcm9wZXJ0eScKICAgICAgICAgICAgICAgICYmICRQcm9wZXJ0aWVzLT57J3gtb3Rycy10ZWFtJ30tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15IEBUZWFtcyA9IHNwbGl0KCAiLCIsICRQcm9wZXJ0aWVzLT57J3gtb3Rycy10ZWFtJ30tPlswXS0+eyd2YWx1ZSd9ICk7CgogICAgICAgICAgICAgICAgaWYgKEBUZWFtcykgewogICAgICAgICAgICAgICAgICAgIG15IEBUZWFtSURzOwoKICAgICAgICAgICAgICAgICAgICAjIGdldCB0ZWFtIGlkcwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkVGVhbU5hbWUgKEBUZWFtcykgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlVGVhbSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScpLT5UZWFtR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICRUZWFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAVGVhbUlEcywgJFRlYW17SUR9IGlmICRUZWFte0lEfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7VGVhbUlEfSA9IFxAVGVhbUlEcyBpZiBAVGVhbUlEczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgcmVzb3VyY2UKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkUHJvcGVydGllcy0+eyd4LW90cnMtcmVzb3VyY2UnfSApCiAgICAgICAgICAgICAgICAmJiByZWYgJFByb3BlcnRpZXMtPnsneC1vdHJzLXJlc291cmNlJ30tPlswXSBlcSAnRGF0YTo6SUNhbDo6UHJvcGVydHknCiAgICAgICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eyd4LW90cnMtcmVzb3VyY2UnfS0+WzBdLT57J3ZhbHVlJ30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgQFJlc291cmNlcyA9IHNwbGl0KCAiLCIsICRQcm9wZXJ0aWVzLT57J3gtb3Rycy1yZXNvdXJjZSd9LT5bMF0tPnsndmFsdWUnfSApOwoKICAgICAgICAgICAgICAgIGlmIChAUmVzb3VyY2VzKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQFVzZXJzOwoKICAgICAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGlkcwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkVXNlckxvZ2luIChAUmVzb3VyY2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRVc2VySUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRVc2VyTG9naW4sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFVzZXJzLCAkVXNlcklEIGlmICRVc2VySUQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1Jlc291cmNlSUR9ID0gXEBVc2VycyBpZiBAVXNlcnM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGF2YWlsYWJsZSBwbHVnaW4ga2V5cyBzdWl0YWJsZSBmb3IgbG93ZXJjYXNlIHNlYXJjaAogICAgICAgIG15ICRQbHVnaW5LZXlzID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luS2V5cygpOwoKICAgICAgICAjIHBsdWdpbiBmaWVsZHMgKHN0YXJ0IHdpdGggJ3gtb3Rycy1wbHVnaW4tJykKICAgICAgICBteSBAUGx1Z2luRmllbGRzID0gZ3JlcCB7ICRfID1+IC94LW90cnMtcGx1Z2luLS9pIH0ga2V5cyAleyRQcm9wZXJ0aWVzfTsKCiAgICAgICAgUExVR0lORklFTEQ6CiAgICAgICAgZm9yIG15ICRQbHVnaW5GaWVsZCAoQFBsdWdpbkZpZWxkcykgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBJc0FycmF5UmVmV2l0aERhdGEoICRQcm9wZXJ0aWVzLT57JFBsdWdpbkZpZWxkfSApCiAgICAgICAgICAgICAgICAmJiByZWYgJFByb3BlcnRpZXMtPnskUGx1Z2luRmllbGR9LT5bMF0gZXEgJ0RhdGE6OklDYWw6OlByb3BlcnR5JwogICAgICAgICAgICAgICAgJiYgJFByb3BlcnRpZXMtPnskUGx1Z2luRmllbGR9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgbG93ZXJjYXNlIHBsdWdpbiBrZXkKICAgICAgICAgICAgICAgICRQbHVnaW5GaWVsZCA9fiAveC1vdHJzLXBsdWdpbi0oLiopJC87CiAgICAgICAgICAgICAgICBteSAkUGx1Z2luS2V5TEMgPSAkMTsKCiAgICAgICAgICAgICAgICAjIGdldCBwcm9wZXIgcGx1Z2luIGtleQogICAgICAgICAgICAgICAgbXkgJFBsdWdpbktleSA9ICRQbHVnaW5LZXlzLT57JFBsdWdpbktleUxDfTsKICAgICAgICAgICAgICAgIG5leHQgUExVR0lORklFTEQgaWYgISRQbHVnaW5LZXk7CgogICAgICAgICAgICAgICAgbXkgQFBsdWdpbkRhdGEgPSBzcGxpdCggIiwiLCAkUHJvcGVydGllcy0+eyRQbHVnaW5GaWVsZH0tPlswXS0+eyd2YWx1ZSd9ICk7CiAgICAgICAgICAgICAgICAkTGlua2VkT2JqZWN0c3skUGx1Z2luS2V5fSA9IFxAUGx1Z2luRGF0YTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbmV4dCBFTlRSWSBpZiAhJFBhcmFtZXRlcnN7VGl0bGV9OwoKICAgICAgICBteSAlQXBwb2ludG1lbnQ7CgogICAgICAgICMgZ2V0IHJlY3VycmVuY2UgaWQKICAgICAgICBpZiAoCiAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsncmVjdXJyZW5jZS1pZCd9ICkKICAgICAgICAgICAgJiYgcmVmICRQcm9wZXJ0aWVzLT57J3JlY3VycmVuY2UtaWQnfS0+WzBdIGVxICdEYXRhOjpJQ2FsOjpQcm9wZXJ0eScKICAgICAgICAgICAgJiYgJFByb3BlcnRpZXMtPnsncmVjdXJyZW5jZS1pZCd9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAjIGdldCBwYXJlbnQgaWQKICAgICAgICAgICAgbXkgJVBhcmVudEFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgIFVuaXF1ZUlEICAgPT4gJFBhcmFtZXRlcnN7VW5pcXVlSUR9LAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgISVQYXJlbnRBcHBvaW50bWVudDsKCiAgICAgICAgICAgICRQYXJhbWV0ZXJze1BhcmVudElEfSA9ICRQYXJlbnRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfTsKCiAgICAgICAgICAgIG15ICRUaW1lem9uZUlEOwogICAgICAgICAgICBpZiAoIHJlZiAkUHJvcGVydGllcy0+eydyZWN1cnJlbmNlLWlkJ30tPlswXS0+eydfcGFyYW1ldGVycyd9IGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIHRpbWV6b25lCiAgICAgICAgICAgICAgICBpZiAoICRQcm9wZXJ0aWVzLT57J3JlY3VycmVuY2UtaWQnfS0+WzBdLT57J19wYXJhbWV0ZXJzJ30tPnsnVFpJRCd9ICkgewogICAgICAgICAgICAgICAgICAgICRUaW1lem9uZUlEID0gJFByb3BlcnRpZXMtPnsncmVjdXJyZW5jZS1pZCd9LT5bMF0tPnsnX3BhcmFtZXRlcnMnfS0+eydUWklEJ307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlSURJQ2FsID0gJFNlbGYtPl9Gb3JtYXRUaW1lKAogICAgICAgICAgICAgICAgVGltZSA9PiAkUHJvcGVydGllcy0+eydyZWN1cnJlbmNlLWlkJ30tPlswXS0+eyd2YWx1ZSd9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkUmVjdXJyZW5jZUlEID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRSZWN1cnJlbmNlSURJQ2FsLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRUaW1lem9uZUlEKSB7CiAgICAgICAgICAgICAgICBteSAkT2Zmc2V0ID0gJElDYWxUaW1lWm9uZXN7JFRpbWV6b25lSUR9IC8vICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGltZXpvbmVJRCA9PiAkVGltZXpvbmVJRCwKICAgICAgICAgICAgICAgICAgICBUaW1lICAgICAgID0+ICRSZWN1cnJlbmNlSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFJlY3VycmVuY2VJRCAtPSAkT2Zmc2V0ICogMzYwMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAhJFBhcmFtZXRlcnN7QWxsRGF5fSApIHsKICAgICAgICAgICAgICAgIG15ICRMb2NhbE9mZnNldCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+TG9jYWxUaW1lem9uZU9mZnNldEdldCgKICAgICAgICAgICAgICAgICAgICBUaW1lID0+ICRSZWN1cnJlbmNlSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFJlY3VycmVuY2VJRCArPSAkTG9jYWxPZmZzZXQgKiAzNjAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZUlEfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkUmVjdXJyZW5jZUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkZWxldGUgZXhpc3Rpbmcgb3ZlcnJpZGRlbiBvY2N1cnJlbmNlCiAgICAgICAgICAgICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGVPY2N1cnJlbmNlKAogICAgICAgICAgICAgICAgVW5pcXVlSUQgICAgID0+ICRQYXJhbWV0ZXJze1VuaXF1ZUlEfSwKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBSZWN1cnJlbmNlSUQgPT4gJFBhcmFte1JlY3VycmVuY2VJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGlmIGFwcG9pbnRtZW50IHdpdGggc2FtZSBVbmlxdWVJRCBpbiB0aGUgc2FtZSBjYWxlbmRhciBhbHJlYWR5IGV4aXN0cy4KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgIFVuaXF1ZUlEICAgPT4gJFBhcmFtZXRlcnN7VW5pcXVlSUR9LAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgICYmICggISRQYXJhbXtVcGRhdGVFeGlzdGluZ30gfHwgJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9ICE9ICRQYXJhbXtDYWxlbmRhcklEfSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICMgSWYgb3ZlcndyaXRlIG9wdGlvbiBpc24ndCBhY3RpdmF0ZWQsIGNyZWF0ZSBuZXcgYXBwb2ludG1lbnQgYnkgY2xlYXJpbmcgdGhlIFVuaXF1ZUlELgogICAgICAgICAgICAgICAgaWYgKCVBcHBvaW50bWVudCkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkUGFyYW1ldGVyc3tVbmlxdWVJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlQXBwb2ludG1lbnQgPSAoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJFN1Y2Nlc3M7CgogICAgICAgICMgYXBwb2ludG1lbnQgZXhpc3RzIGluIHNhbWUgQ2FsZW5kYXIsIHVwZGF0ZSBpdAogICAgICAgIGlmICgKICAgICAgICAgICAgJUFwcG9pbnRtZW50CiAgICAgICAgICAgICYmICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfQogICAgICAgICAgICAmJiAkUGFyYW17Q2FsZW5kYXJJRH0gPT0gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgJVBhcmFtZXRlcnMsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHRoZXJlIGlzIG5vIGFwcG9pbnRtZW50LCBjcmVhdGUgbmV3IG9uZQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICAlUGFyYW1ldGVycywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgkU3VjY2VzcykgewoKICAgICAgICAgICAgUExVR0lOS0VZOgogICAgICAgICAgICBmb3IgbXkgJFBsdWdpbktleSAoIHNvcnQga2V5cyAlTGlua2VkT2JqZWN0cyApIHsKICAgICAgICAgICAgICAgIG5leHQgUExVR0lOS0VZIGlmICFJc0FycmF5UmVmV2l0aERhdGEoICRMaW5rZWRPYmplY3RzeyRQbHVnaW5LZXl9ICk7CgogICAgICAgICAgICAgICAgIyBhZGQgbGlua3MKICAgICAgICAgICAgICAgIGZvciBteSAkUGx1Z2luRGF0YSAoIEB7ICRMaW5rZWRPYmplY3RzeyRQbHVnaW5LZXl9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJExpbmtTdWNjZXNzID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkU3VjY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luS2V5ICAgICA9PiAkUGx1Z2luS2V5LAogICAgICAgICAgICAgICAgICAgICAgICBQbHVnaW5EYXRhICAgID0+ICRQbHVnaW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggISRMaW5rU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY3JlYXRlIG9iamVjdCBsaW5rIChBcHBvaW50bWVudElEPSRTdWNjZXNzIC0gJFBsdWdpbktleT0kUGx1Z2luRGF0YSkgZHVyaW5nIGNhbGVuZGFyIGltcG9ydCEiCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkQXBwb2ludG1lbnRzSW1wb3J0ZWQrKzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRBcHBvaW50bWVudHNJbXBvcnRlZDsKfQoKc3ViIF9Gb3JtYXRUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaW1lKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRUaW1lU3RhbXA7CgogICAgaWYgKCAkUGFyYW17VGltZX0gPX4gLyhcZHs0fSkoXGR7Mn0pKFxkezJ9KVQoXGR7Mn0pKFxkezJ9KShcZHsyfSkvaSApIHsKCiAgICAgICAgIyBmb3JtYXQgc3RyaW5nCiAgICAgICAgJFRpbWVTdGFtcCA9ICIkMS0kMi0kMyAkNDokNTokNiI7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtUaW1lfSA9fiAvKFxkezR9KShcZHsyfSkoXGR7Mn0pLyApIHsKCiAgICAgICAgIyBvbmx5IGRhdGUgaXMgZ2l2ZW4gKHdpdGhvdXQgdGltZSkKICAgICAgICAkVGltZVN0YW1wID0gIiQxLSQyLSQzIDAwOjAwOjAwIjsKICAgIH0KCiAgICByZXR1cm4gJFRpbWVTdGFtcDsKfQoKewogICAgbm8gd2FybmluZ3MgJ3JlZGVmaW5lJzsgICAgIyMgbm8gY3JpdGljCgogICAgIyBJbmNsdWRlIGFkZGl0aW9uYWwgb3B0aW9uYWwgcmVwZWF0YWJsZSBwcm9wZXJ0aWVzIHVzZWQgYnkgc29tZSBpQ2FsZW5kYXIgaW1wbGVtZW50YXRpb25zLCBpbiBvcmRlcgogICAgIyAgIHRvIHByZXZlbnQgUGVybCB3YXJuaW5ncy4KICAgIHN1YiBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06Om9wdGlvbmFsX3JlcGVhdGFibGVfcHJvcGVydGllcyB7ICAgICMjIG5vIGNyaXRpYwogICAgICAgIHF3KAogICAgICAgICAgICB1aWQgYWNrbm93bGVkZ2VkIHJlbGF0ZWQtdG8gZGVzY3JpcHRpb24KICAgICAgICApOwogICAgfQp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkR5bmFtaWNGaWVsZDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGRWYWx1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkR5bmFtaWNGaWVsZCAtIER5bmFtaWNGaWVsZCBhcHBvaW50bWVudCB0eXBlCgo9aGVhZDEgU1lOT1BTSVMKCkR5bmFtaWNGaWVsZCB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZS4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkVGlja2V0RHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkR5bmFtaWNGaWVsZCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEdldFRpbWUoKQoKcmV0dXJucyB0aW1lIHZhbHVlIGZvciBkeW5hbWljIGZpZWxkIGFwcG9pbnRtZW50IHR5cGUuCgogICAgbXkgJFN0YXJ0VGltZSA9ICRUaWNrZXREeW5hbWljRmllbGRPYmplY3QtPkdldFRpbWUoCiAgICAgICAgVHlwZSAgICAgPT4gJ0R5bmFtaWNGaWVsZF9UZXN0RGF0ZScsCiAgICAgICAgVGlja2V0SUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgR2V0VGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVHlwZSBUaWNrZXRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aWNrZXQgZGF0YSBpbmNsLiBkeW5hbWljIGZpZWxkcwogICAgbXkgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwogICAgcmV0dXJuIGlmICEkVGlja2V0eyAkUGFyYW17VHlwZX0gfTsKCiAgICAjIGNoZWNrIGlmIHdlIGZvdW5kIGEgdmFsaWQgdGltZSB2YWx1ZSBhbmQgcmV0dXJuIGl0CiAgICBpZiAoICRUaWNrZXR7ICRQYXJhbXtUeXBlfSB9ID1+ICdcZHs0fS1cZHsyfS1cZHsyfSBcZHsyfTpcZHsyfTpcZHsyfScgKSB7CiAgICAgICAgcmV0dXJuICRUaWNrZXR7ICRQYXJhbXtUeXBlfSB9OwogICAgfQoKICAgIHJldHVybjsKfQoKPWl0ZW0gU2V0VGltZSgpCgpzZXQgdGlja2V0IGR5bmFtaWMgZmllbGQgdmFsdWUgdG8gc3VwcGxpZWQgdGltZSB2YWx1ZS4KCiAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXREeW5hbWljRmllbGRPYmplY3QtPlNldFRpbWUoCiAgICAgICAgVHlwZSAgICAgPT4gJ0R5bmFtaWNGaWVsZF9UZXN0RGF0ZScsCiAgICAgICAgVmFsdWUgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnCiAgICAgICAgVGlja2V0SUQgPT4gMSwKICAgICk7CgpyZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bC4KCj1jdXQKCnN1YiBTZXRUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUeXBlIFZhbHVlIFRpY2tldElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgZGF0YQogICAgbXkgJER5bmFtaWNGaWVsZE5hbWUgPSAkUGFyYW17VHlwZX07CiAgICAkRHluYW1pY0ZpZWxkTmFtZSA9fiBzL15EeW5hbWljRmllbGRfLy87CiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICk7CiAgICByZXR1cm4gaWYgISREeW5hbWljRmllbGQ7CgogICAgIyBzZXQgZHluYW1pYyBmaWVsZCB2YWx1ZQogICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkVmFsdWUnKS0+VmFsdWVTZXQoCiAgICAgICAgRmllbGRJRCAgPT4gJER5bmFtaWNGaWVsZC0+e0lEfSwKICAgICAgICBPYmplY3RJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIFZhbHVlICAgID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWVEYXRlVGltZSA9PiAkUGFyYW17VmFsdWV9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkVzY2FsYXRpb25UaW1lOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkVzY2FsYXRpb25UaW1lIC0gRXNjYWxhdGlvblRpbWUgYXBwb2ludG1lbnQgdHlwZQoKPWhlYWQxIFNZTk9QU0lTCgpFc2NhbGF0aW9uVGltZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZS4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkVGlja2V0RXNjYWxhdGlvblRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRpY2tldDo6RXNjYWxhdGlvblRpbWUnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBHZXRUaW1lKCkKCnJldHVybnMgdGltZSB2YWx1ZSBmb3IgZXNjYWxhdGlvbiB0aW1lIGFwcG9pbnRtZW50IHR5cGUuCgogICAgbXkgJFNvbHV0aW9uVGltZSA9ICRUaWNrZXRFc2NhbGF0aW9uVGltZU9iamVjdC0+R2V0VGltZSgKICAgICAgICBUeXBlICAgICA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICBUaWNrZXRJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBHZXRUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUeXBlIFRpY2tldElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICk7CiAgICByZXR1cm4gaWYgISRUaWNrZXR7ICRQYXJhbXtUeXBlfSAuICdEZXN0aW5hdGlvbkRhdGUnIH07CgogICAgIyByZXR1cm4gZXNjYWxhdGlvbiBkZXN0aW5hdGlvbiBkYXRlCiAgICByZXR1cm4gJFRpY2tldHsgJFBhcmFte1R5cGV9IC4gJ0Rlc3RpbmF0aW9uRGF0ZScgfTsKfQoKPWl0ZW0gU2V0VGltZSgpCgpkb2VzIG5vdGhpbmcsIGFzIHlvdSBjYW5ub3QgZXhwbGljaXRseSBzZXQgdGlja2V0IGVzY2FsYXRpb24gdGltZXMuCnJldHVybnMgMSB0byBwcmV2ZW50IGVycm9ycyBpbiBsb2cuCgo9Y3V0CgpzdWIgU2V0VGltZSB7CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OlBlbmRpbmdUaW1lOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpFc2NhbGF0aW9uVGltZSAtIFBlbmRpbmdUaW1lIGFwcG9pbnRtZW50IHR5cGUKCj1oZWFkMSBTWU5PUFNJUwoKUGVuZGluZ1RpbWUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFRpY2tldFBlbmRpbmdUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OlBlbmRpbmdUaW1lJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gR2V0VGltZSgpCgpyZXR1cm5zIHRpbWUgdmFsdWUgZm9yIHBlbmRpbmcgdGltZSBhcHBvaW50bWVudCB0eXBlLgoKICAgIG15ICRQZW5kaW5nVGltZSA9ICRUaWNrZXRQZW5kaW5nVGltZU9iamVjdC0+R2V0VGltZSgKICAgICAgICBUeXBlICAgICA9PiAnUGVuZGluZ1RpbWUnLAogICAgICAgIFRpY2tldElEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEdldFRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFR5cGUgVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGlja2V0IGRhdGEKICAgIG15ICVUaWNrZXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgKTsKICAgIHJldHVybiBpZiAhJFRpY2tldHtVbnRpbFRpbWV9OwoKICAgICMgZ2V0IGNhbGVuZGFyIGhlbHBlciBvYmplY3QKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgIyByZXR1cm4gcGVuZGluZyB0aW1lCiAgICByZXR1cm4gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCkgKyAkVGlja2V0e1VudGlsVGltZX0sCiAgICApOwp9Cgo9aXRlbSBTZXRUaW1lKCkKCnNldCB0aWNrZXQgcGVuZGluZyB0aW1lIHRvIHN1cHBsaWVkIHRpbWUgdmFsdWUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0UGVuZGluZ1RpbWVPYmplY3QtPlNldFRpbWUoCiAgICAgICAgVHlwZSAgICAgPT4gJ1BlbmRpbmdUaW1lJywKICAgICAgICBWYWx1ZSAgICA9PiAnMjAxNi0wMS0wMSAwMDowMDowMCcKICAgICAgICBUaWNrZXRJRCA9PiAxLAogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsLgoKPWN1dAoKc3ViIFNldFRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFR5cGUgVmFsdWUgVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2FsZW5kYXIgaGVscGVyIG9iamVjdAogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAjIGdldCBkYXRlIGNvbXBvbmVudHMKICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCggU3RyaW5nID0+ICRQYXJhbXtWYWx1ZX0gKSwKICAgICk7CgogICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgWWVhciAgICAgPT4gJFllYXIsCiAgICAgICAgTW9udGggICAgPT4gJE1vbnRoLAogICAgICAgIERheSAgICAgID0+ICREYXksCiAgICAgICAgSG91ciAgICAgPT4gJEhvdXIsCiAgICAgICAgTWludXRlICAgPT4gJE1pbnV0ZSwKICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6RGFlbW9uTW9kdWxlczo6U2NoZWR1bGVyVGFza1dvcmtlcjo6Q2FsZW5kYXJBcHBvaW50bWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBiYXNlIHF3KEtlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OkJhc2VUYXNrV29ya2VyKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OlNjaGVkdWxlclRhc2tXb3JrZXI6OkNhbGVuZGFyQXBwb2ludG1lbnQgLSBTY2hlZHVsZXIgZGFlbW9uIHRhc2sgaGFuZGxlciBtb2R1bGUgZm9yIENhbGVuZGFyQXBwb2ludG1lbnQKCj1oZWFkMSBTWU5PUFNJUwoKVGhpcyB0YXNrIGhhbmRsZXIgZXhlY3V0ZXMgY2FsZW5kYXIgYXBwb2ludG1lbnQgam9icwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkVGFza0hhbmRsZXJPYmplY3QgPSAkS2VybmVsOjpPTS1HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OlNjaGVkdWxlclRhc2tXb3JrZXI6OkNhbGVuZGFyQXBwb2ludG1lbnQnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57RGVidWd9ICAgICAgPSAkUGFyYW17RGVidWd9OwogICAgJFNlbGYtPntXb3JrZXJOYW1lfSA9ICdXb3JrZXI6IENhbGVuZGFyQXBwb2ludG1lbnQnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gUnVuKCkKCnBlcmZvcm1zIHRoZSBzZWxlY3RlZCB0YXNrLgoKICAgIG15ICRSZXN1bHQgPSAkVGFza0hhbmRsZXJPYmplY3QtPlJ1bigKICAgICAgICBUYXNrSUQgICA9PiAxMjMsCiAgICAgICAgVGFza05hbWUgPT4gJ3NvbWUgbmFtZScsICAgICMgb3B0aW9uYWwKICAgICAgICBEYXRhICAgICA9PiB7ICAgICAgICAgICAgICAgIyBhcHBvaW50bWVudCBpZCBhcyBnb3QgZnJvbSBLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50OjpBcHBvaW50bWVudEdldCgpCiAgICAgICAgICAgIE5vdGlmeVRpbWUgPT4gJzIwMTYtMDgtMDIgMDM6NTk6MDAnLAogICAgICAgIH0sCiAgICApOwoKUmV0dXJuczoKCiAgICAkUmVzdWx0ID0gMTsgIyBvciBmYWlsIGluIGNhc2Ugb2YgYW4gZXJyb3IKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHRhc2sgcGFyYW1zCiAgICBteSAkQ2hlY2tSZXN1bHQgPSAkU2VsZi0+X0NoZWNrVGFza1BhcmFtcygKICAgICAgICAlUGFyYW0sCiAgICAgICAgTmVlZGVkRGF0YUF0dHJpYnV0ZXMgPT4gWydOb3RpZnlUaW1lJ10sCiAgICApOwoKICAgICMgc3RvcCBleGVjdXRpb24gaWYgYW4gZXJyb3IgaW4gcGFyYW1zIGlzIGRldGVjdGVkCiAgICByZXR1cm4gaWYgISRDaGVja1Jlc3VsdDsKCiAgICAjIHRyaWdnZXIgdGhlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbgogICAgbXkgJFN1Y2Nlc3MKICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnROb3RpZmljYXRpb24oICV7ICRQYXJhbXtEYXRhfSB9ICk7CgogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgdHJpZ2dlciBhcHBvaW50bWVudCBub3RpZmljYXRpb24gZm9yIEFwcG9pbnRtZW50SUQgJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0hIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q6OkFwcG9pbnRtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q6OkFwcG9pbnRtZW50Cgo9aGVhZDEgU1lOT1BTSVMKCkFwcG9pbnRtZW50IGJhY2tlbmQgZm9yIHRoZSBhcHBvaW50bWVudCBsaW5rIG9iamVjdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkTGlua09iamVjdEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q6OkFwcG9pbnRtZW50Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gTGlua0xpc3RXaXRoRGF0YSgpCgpmaWxsIHVwIHRoZSBsaW5rIGxpc3Qgd2l0aCBkYXRhCgogICAgJFN1Y2Nlc3MgPSAkTGlua09iamVjdEJhY2tlbmQtPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgTGlua0xpc3QgICAgICAgICAgICAgICAgICAgICA9PiAkSGFzaFJlZiwKICAgICAgICBJZ25vcmVMaW5rZWRUaWNrZXRTdGF0ZVR5cGVzID0+IDB8MSwgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtMaXN0V2l0aERhdGEgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTGlua0xpc3QgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CgogICAgIyBjaGVjayBsaW5rIGxpc3QKICAgIGlmICggcmVmICRQYXJhbXtMaW5rTGlzdH0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTGlua0xpc3QgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIG15ICRMaW5rVHlwZSAoIHNvcnQga2V5cyAleyAkUGFyYW17TGlua0xpc3R9IH0gKSB7CgogICAgICAgIGZvciBteSAkRGlyZWN0aW9uICggc29ydCBrZXlzICV7ICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9IH0gKSB7CgogICAgICAgICAgICBBUFBPSU5UTUVOVDoKICAgICAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudElEICggc29ydCBrZXlzICV7ICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBhcHBvaW50bWVudCBkYXRhCiAgICAgICAgICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIGlkIGZyb20gaGFzaCBpZiBubyBzZXJ2aWNlIGRhdGEgd2FzIGZvdW5kCiAgICAgICAgICAgICAgICBpZiAoICElQXBwb2ludG1lbnQgKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0tPnskQXBwb2ludG1lbnRJRH07CiAgICAgICAgICAgICAgICAgICAgbmV4dCBBUFBPSU5UTUVOVDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGFkZCBhcHBvaW50bWVudCBkYXRhCiAgICAgICAgICAgICAgICAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259LT57JEFwcG9pbnRtZW50SUR9ID0gXCVBcHBvaW50bWVudDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gT2JqZWN0UGVybWlzc2lvbigpCgpjaGVja3MgcmVhZCBwZXJtaXNzaW9uIGZvciBhIGdpdmVuIG9iamVjdCBhbmQgVXNlcklELgoKICAgICRQZXJtaXNzaW9uID0gJExpbmtPYmplY3QtPk9iamVjdFBlcm1pc3Npb24oCiAgICAgICAgT2JqZWN0ICA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIEtleSAgICAgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0UGVybWlzc2lvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgS2V5IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBUT0RPOiBQZXJtaXNzaW9uIGhhbmRsaW5nCgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE9iamVjdERlc2NyaXB0aW9uR2V0KCkKCnJldHVybiBhIGhhc2ggb2Ygb2JqZWN0IGRlc2NyaXB0aW9ucwoKUmV0dXJuCiAgICAlRGVzY3JpcHRpb24gPSAoCiAgICAgICAgTm9ybWFsID0+IDEyMywKICAgICAgICBMb25nICAgPT4gIlRoZSBBcHBvaW50bWVudCBUaXRsZSIsCiAgICApOwoKICAgICVEZXNjcmlwdGlvbiA9ICRMaW5rT2JqZWN0LT5PYmplY3REZXNjcmlwdGlvbkdldCgKICAgICAgICBLZXkgICAgID0+IDEyMywKICAgICAgICBNb2RlICAgID0+ICdUZW1wb3JhcnknLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3REZXNjcmlwdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgS2V5IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgZGVzY3JpcHRpb24KICAgIG15ICVEZXNjcmlwdGlvbiA9ICgKICAgICAgICBOb3JtYWwgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBMb25nICAgPT4gJ0FwcG9pbnRtZW50JywKICAgICk7CgogICAgcmV0dXJuICVEZXNjcmlwdGlvbiBpZiAkUGFyYW17TW9kZX0gJiYgJFBhcmFte01vZGV9IGVxICdUZW1wb3JhcnknOwoKICAgICMgZ2V0IHRpY2tldAogICAgbXkgJUFwcG9pbnRtZW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtLZXl9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISVBcHBvaW50bWVudDsKCiAgICAjIGNyZWF0ZSBkZXNjcmlwdGlvbgogICAgJURlc2NyaXB0aW9uID0gKAogICAgICAgIE5vcm1hbCA9PiAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0sCiAgICAgICAgTG9uZyAgID0+ICRBcHBvaW50bWVudHtUaXRsZX0sCiAgICApOwoKICAgIHJldHVybiAlRGVzY3JpcHRpb247Cn0KCj1pdGVtIE9iamVjdFNlYXJjaCgpCgpyZXR1cm4gYSBoYXNoIGxpc3Qgb2YgdGhlIHNlYXJjaCByZXN1bHRzCgpSZXR1cm4KICAgICRTZWFyY2hMaXN0ID0gewogICAgICAgIE5PVExJTktFRCA9PiB7CiAgICAgICAgICAgIFNvdXJjZSA9PiB7CiAgICAgICAgICAgICAgICAxMiAgPT4gJERhdGFPZkl0ZW0xMiwKICAgICAgICAgICAgICAgIDIxMiA9PiAkRGF0YU9mSXRlbTIxMiwKICAgICAgICAgICAgICAgIDMzMiA9PiAkRGF0YU9mSXRlbTMzMiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfTsKCiAgICAkU2VhcmNoTGlzdCA9ICRMaW5rT2JqZWN0QmFja2VuZC0+T2JqZWN0U2VhcmNoKAogICAgICAgIFN1Yk9iamVjdCAgICA9PiAnQmxhJywgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFNlYXJjaFBhcmFtcyA9PiAkSGFzaFJlZiwgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3RTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgcGFyYW1zCiAgICAkUGFyYW17U2VhcmNoUGFyYW1zfSB8fD0ge307CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKICAgIG15ICVTZWFyY2g7CiAgICBteSBAQ2FsZW5kYXJJRHM7CiAgICBteSBAQXBwb2ludG1lbnRzOwoKICAgICMgU2VhcmNoIGJ5IGFwcG9pbnRtZW50IHRpdGxlIGFuZCBkZXNjcmlwdGlvbiwgaWYgc3VwcGxpZWQuIFRoZSBjb252ZXJzaW9uIG9mIHBhcmFtZXRlciBuYW1lcyBpcwogICAgIyAgIG5lY2Vzc2FyeSwgc2luY2UgbGluayBvYmplY3Qgc2VhcmNoIHBhcmFtZXRlcnMgc2hvdWxkIGhhdmUgdW5pcXVlIG5hbWVzLgogICAgaWYgKCAkUGFyYW17U2VhcmNoUGFyYW1zfS0+e0FwcG9pbnRtZW50VGl0bGV9ICkgewogICAgICAgICRTZWFyY2h7VGl0bGV9ID0gJFBhcmFte1NlYXJjaFBhcmFtc30tPntBcHBvaW50bWVudFRpdGxlfTsKICAgIH0KICAgIGlmICggJFBhcmFte1NlYXJjaFBhcmFtc30tPntBcHBvaW50bWVudERlc2NyaXB0aW9ufSApIHsKICAgICAgICAkU2VhcmNoe0Rlc2NyaXB0aW9ufSA9ICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57QXBwb2ludG1lbnREZXNjcmlwdGlvbn07CiAgICB9CgogICAgIyBTZWFyY2ggYnkgc3BlY2lmaWMgY2FsZW5kYXIgSURzLgogICAgaWYgKAogICAgICAgICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57QXBwb2ludG1lbnRDYWxlbmRhcklEfQogICAgICAgICYmIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte1NlYXJjaFBhcmFtc30tPntBcHBvaW50bWVudENhbGVuZGFySUR9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgQENhbGVuZGFySURzID0gQHsgJFBhcmFte1NlYXJjaFBhcmFtc30tPntBcHBvaW50bWVudENhbGVuZGFySUR9IH07CiAgICB9CgogICAgIyBTZWFyY2ggaW4gYWxsIGF2YWlsYWJsZSBjYWxlbmRhcnMgZm9yIHRoZSB1c2VyLgogICAgZWxzZSB7CiAgICAgICAgbXkgQENhbGVuZGFyTGlzdCA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJMaXN0KAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBQZXJtaXNzaW9uID0+ICdydycsCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBAQ2FsZW5kYXJJRHMgPSBtYXAgeyAkXy0+e0NhbGVuZGFySUR9IH0gQENhbGVuZGFyTGlzdDsKICAgIH0KCiAgICBmb3IgbXkgJENhbGVuZGFySUQgKEBDYWxlbmRhcklEcykgewogICAgICAgIG15IEBDYWxlbmRhckFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAlU2VhcmNoLAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklELAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICApOwogICAgICAgIHB1c2ggQEFwcG9pbnRtZW50cywgQENhbGVuZGFyQXBwb2ludG1lbnRzOwogICAgfQoKICAgICMgYWRkIGFwcG9pbnRtZW50IGRhdGEKICAgIG15ICVTZWFyY2hMaXN0OwogICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewogICAgICAgICRTZWFyY2hMaXN0e05PVExJTktFRH0tPntTb3VyY2V9LT57ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9IH0gPSAkQXBwb2ludG1lbnQ7CiAgICB9CgogICAgcmV0dXJuIFwlU2VhcmNoTGlzdDsKfQoKPWl0ZW0gTGlua0FkZFByZSgpCgpsaW5rIGFkZCBwcmUgZXZlbnQgbW9kdWxlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBUYXJnZXRLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0FkZFByZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtBZGRQb3N0KCkKCmxpbmsgYWRkIHByZSBldmVudCBtb2R1bGUKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQb3N0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtEZWxldGVQcmUoKQoKbGluayBkZWxldGUgcHJlIGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtEZWxldGVQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gTGlua0RlbGV0ZVBvc3QoKQoKbGluayBkZWxldGUgcG9zdCBldmVudCBtb2R1bGUKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtEZWxldGVQb3N0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6OlRpY2tldEFwcG9pbnRtZW50czsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBiYXNlIHF3KEtlcm5lbDo6U3lzdGVtOjpBc3luY2hyb25vdXNFeGVjdXRvcik7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRGF0YSBFdmVudCBDb25maWcpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFte0RhdGF9LT57JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQgaW4gRGF0YSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbG9vcCBwcm90ZWN0aW9uOiBvbmx5IGV4ZWN1dGUgdGhpcyBoYW5kbGVyIG9uY2UgZm9yIGVhY2ggdGlja2V0CiAgICBpZiAoCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpCiAgICAgICAgLT57J19UaWNrZXRBcHBvaW50bWVudHM6OkFscmVhZHlQcm9jZXNzZWQnfQogICAgICAgIC0+eyAkUGFyYW17RGF0YX0tPntUaWNrZXRJRH0gfSsrCiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGhhbmRsZSB0aWNrZXQgYXBwb2ludG1lbnRzIGluIGFuIGFzeW5jaHJvbm91cyBjYWxsCiAgICByZXR1cm4gJFNlbGYtPkFzeW5jQ2FsbCgKICAgICAgICBPYmplY3ROYW1lICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJywKICAgICAgICBGdW5jdGlvbk5hbWUgICA9PiAnVGlja2V0QXBwb2ludG1lbnRQcm9jZXNzVGlja2V0JywKICAgICAgICBGdW5jdGlvblBhcmFtcyA9PiB7CiAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtEYXRhfS0+e1RpY2tldElEfSwKICAgICAgICB9LAogICAgKTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMjIG5vIGNyaXRpYyAoTW9kdWxlczo6UmVxdWlyZUV4cGxpY2l0UGFja2FnZSkKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKCiAgICB9LAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG5lZWRlZCBvYmplY3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRIZWxwZXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwpteSAkQ29uZmlnT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKbXkgJEdyb3VwT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwpteSAkVGVzdEVtYWlsT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsOjpUZXN0Jyk7Cm15ICRDYWxlbmRhck9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjb25maWcgY2hhbmdlcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRpc2FibGUgcmljaCB0ZXh0IGVkaXRvcgpteSAkU3VjY2VzcyA9ICRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdGcm9udGVuZDo6UmljaFRleHQnLAogICAgVmFsdWUgPT4gMCwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiRGlzYWJsZSBSaWNoVGV4dCB3aXRoIHRydWUiLAopOwoKIyB1c2UgVGVzdCBlbWFpbCBiYWNrZW5kCiRTdWNjZXNzID0gJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ1NlbmRtYWlsTW9kdWxlJywKICAgIFZhbHVlID0+ICdLZXJuZWw6OlN5c3RlbTo6RW1haWw6OlRlc3QnLAopOwoKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICJTZXQgRW1haWwgVGVzdCBiYWNrZW5kIHdpdGggdHJ1ZSIsCik7CgojIHNldCBub3Qgc2VsZiBub3RpZnkKJFN1Y2Nlc3MgPSAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnQWdlbnRTZWxmTm90aWZ5T25BY3Rpb24nLAogICAgVmFsdWUgPT4gMCwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiRGlzYWJsZSBBZ2VudCBTZWxmIE5vdGlmeSBPbiBBY3Rpb24iLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGVtYWlsIHRlc3QgYmFja2VuZAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgokU3VjY2VzcyA9ICRUZXN0RW1haWxPYmplY3QtPkNsZWFuVXAoKTsKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICdJbml0aWFsIGNsZWFudXAnLAopOwoKJFNlbGYtPklzRGVlcGx5KAogICAgJFRlc3RFbWFpbE9iamVjdC0+RW1haWxzR2V0KCksCiAgICBbXSwKICAgICdUZXN0IGJhY2tlbmQgZW1wdHkgYWZ0ZXIgaW5pdGlhbCBjbGVhbnVwJywKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyB1c2VyIGNyZWF0ZQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNyZWF0ZSBhIG5ldyB1c2VyIGZvciBjdXJyZW50IHRlc3QKbXkgJFVzZXJMb2dpbiA9ICRIZWxwZXJPYmplY3QtPlRlc3RVc2VyQ3JlYXRlKAogICAgR3JvdXBzID0+IFsndXNlcnMnXSwKKTsKbXkgJVVzZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICBVc2VyID0+ICRVc2VyTG9naW4sCik7Cm15ICRVc2VySUQgPSAkVXNlckRhdGF7VXNlcklEfTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBncm91cCBjcmVhdGUKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgdGVzdCBncm91cApteSAkR3JvdXBJRCA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICBOYW1lICAgID0+ICd1bml0dGVzdGdyb3VwJyAuICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbUlEKCksCiAgICBDb21tZW50ID0+ICdjb21tZW50IGRlc2NyaWJpbmcgdGhlIGdyb3VwJywKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJEdyb3VwSUQsCiAgICAnR3JvdXAgY3JlYXRlJywKKTsKCiRTdWNjZXNzID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgR0lEICAgICAgICA9PiAkR3JvdXBJRCwKICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgIG1vdmVfaW50byA9PiAxLAogICAgICAgIGNyZWF0ZSAgICA9PiAxLAogICAgICAgIG93bmVyICAgICA9PiAxLAogICAgICAgIHByaW9yaXR5ICA9PiAxLAogICAgICAgIHJ3ICAgICAgICA9PiAxLAogICAgfSwKICAgIFVzZXJJRCA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICdHcm91cCB1c2VyIGFkZCcsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY2FsZW5kYXIgY3JlYXRlCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIGNhbGVuZGFyIGFuZCBhcHBvaW50bWVudApteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgQ2FsZW5kYXJOYW1lID0+ICd1bml0dGVzdGNhbGVuZGFyJyAuICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbUlEKCksCiAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICBDb2xvciAgICAgICAgPT4gJyNGRjc3MDAnLAogICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICBWYWxpZElEICAgICAgPT4gMSwKKTsKCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lID0+ICdTaW5nbGUgUmVjaXBpZW50QWdlbnQnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBFdmVudHMgICAgICAgICAgID0+IFsnQ2FsZW5kYXJVcGRhdGUnXSwKICAgICAgICAgICAgUmVjaXBpZW50QWdlbnRzICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblR5cGUgPT4gWydBcHBvaW50bWVudCddLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXN1bHRzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVG9BcnJheSA9PiBbICRVc2VyRGF0YXtVc2VyRW1haWx9IF0sCiAgICAgICAgICAgICAgICBCb2R5ICAgID0+ICJDYWxlbmRlcjogJENhbGVuZGFye0NhbGVuZGFyTmFtZX09XG4iLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ1JlY2lwaWVudCBDdXN0b21lciAtIEp1c3RUb1JlYWxDdXN0b21lciBlbmFibGVkJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgRXZlbnRzICAgICAgICAgICA9PiBbJ0NhbGVuZGFyVXBkYXRlJ10sCiAgICAgICAgICAgIFJlY2lwaWVudHMgICAgICAgPT4gWydDdXN0b21lciddLAogICAgICAgICAgICBOb3RpZmljYXRpb25UeXBlID0+IFsnQXBwb2ludG1lbnQnXSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmVzdWx0cyAgICA9PiBbXSwKICAgICAgICBKdXN0VG9SZWFsQ3VzdG9tZXIgPT4gMSwKICAgIH0sCik7CgpteSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpOb3RpZmljYXRpb25FdmVudCcpOwpteSAkRXZlbnROb3RpZmljYXRpb25FdmVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXZlbnQ6Ok5vdGlmaWNhdGlvbicpOwoKbXkgJENvdW50ID0gMDsKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIGFkZCB0cmFuc3BvcnQgc2V0dGluZwogICAgJFRlc3QtPntEYXRhfS0+e1RyYW5zcG9ydHN9ID0gWydFbWFpbCddOwoKICAgICMgc2V0IGp1c3QgdG8gcmVhbCBjdXN0b21lcgogICAgbXkgJEp1c3RUb1JlYWxDdXN0b21lciA9ICRUZXN0LT57SnVzdFRvUmVhbEN1c3RvbWVyfSB8fCAwOwogICAgJFN1Y2Nlc3MgPSAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbWVyTm90aWZ5SnVzdFRvUmVhbEN1c3RvbWVyJywKICAgICAgICBWYWx1ZSA9PiAkSnVzdFRvUmVhbEN1c3RvbWVyLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiU2V0IG5vdGlmaWNhdGlvbnMganVzdCB0byByZWFsIGN1c3RvbWVyOiAkSnVzdFRvUmVhbEN1c3RvbWVyLiIsCiAgICApOwoKICAgIG15ICROb3RpZmljYXRpb25JRCA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uQWRkKAogICAgICAgIE5hbWUgICAgPT4gIkpvYk5hbWUkQ291bnQiLAogICAgICAgIERhdGEgICAgPT4gJFRlc3QtPntEYXRhfSwKICAgICAgICBNZXNzYWdlID0+IHsKICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgPT4gJ0pvYk5hbWUnLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgPT4gJ0NhbGVuZGVyOiA8T1RSU19DQUxFTkRBUl9DQUxFTkRBUk5BTUU+JywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbW1lbnQgPT4gJ0FuIG9wdGlvbmFsIGNvbW1lbnQnLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICMgc2FuaXR5IGNoZWNrCiAgICAkU2VsZi0+SXNOb3QoCiAgICAgICAgJE5vdGlmaWNhdGlvbklELAogICAgICAgIHVuZGVmLAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gTm90aWZpY2F0aW9uQWRkKCkgc2hvdWxkIG5vdCBiZSB1bmRlZiIsCiAgICApOwoKICAgIG15ICRSZXN1bHQgPSAkRXZlbnROb3RpZmljYXRpb25FdmVudE9iamVjdC0+UnVuKAogICAgICAgIEV2ZW50ID0+ICdDYWxlbmRhclVwZGF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7fSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgbXkgJEVtYWlscyA9ICRUZXN0RW1haWxPYmplY3QtPkVtYWlsc0dldCgpOwoKICAgICMgcmVtb3ZlIG5vdCBuZWVkZWQgZGF0YQogICAgZm9yIG15ICRFbWFpbCAoIEB7JEVtYWlsc30gKSB7CiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KEZyb20gSGVhZGVyKSkgewogICAgICAgICAgICBkZWxldGUgJEVtYWlsLT57JEF0dHJpYnV0ZX07CiAgICAgICAgfQoKICAgICAgICAjIGRlLXJlZmVyZW5jZSBib2R5CiAgICAgICAgJEVtYWlsLT57Qm9keX0gPSAkeyAkRW1haWwtPntCb2R5fSB9OwogICAgfQoKICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAkRW1haWxzLAogICAgICAgICRUZXN0LT57RXhwZWN0ZWRSZXN1bHRzfSwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlY2lwaWVudHMiLAogICAgKTsKCiAgICAjIGRlbGV0ZSBub3RpZmljYXRpb24gZXZlbnQKICAgIG15ICROb3RpZmljYXRpb25EZWxldGUgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkRlbGV0ZSgKICAgICAgICBJRCAgICAgPT4gJE5vdGlmaWNhdGlvbklELAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIHNhbml0eSBjaGVjawogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJE5vdGlmaWNhdGlvbkRlbGV0ZSwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vdGlmaWNhdGlvbkRlbGV0ZSgpIHN1Y2Nlc3NmdWwgZm9yIE5vdGlmaWNhdGlvbiBJRCAkTm90aWZpY2F0aW9uSUQiLAogICAgKTsKCiAgICAkVGVzdEVtYWlsT2JqZWN0LT5DbGVhblVwKCk7CgogICAgJENvdW50Kys7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgZ2V0IG5lZWRlZCBvYmplY3RzCm15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwpteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7Cm15ICRHcm91cE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwpteSAkVXNlck9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKIyBjcmVhdGUgdGVzdCB1c2VyCm15ICRVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgpOwpteSAkVXNlcklEID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoIFVzZXJMb2dpbiA9PiAkVXNlckxvZ2luICk7CgokU2VsZi0+VHJ1ZSgKICAgICRVc2VySUQsCiAgICAiVGVzdCB1c2VyICRVc2VySUQgY3JlYXRlZCIsCik7CgpteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKIyBjcmVhdGUgdGVzdCBncm91cApteSAkR3JvdXBOYW1lID0gJ3Rlc3QtY2FsZW5kYXItZ3JvdXAtJyAuICRSYW5kb21JRDsKbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICBOYW1lICAgID0+ICRHcm91cE5hbWUsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRHcm91cElELAogICAgIlRlc3QgZ3JvdXAgJFVzZXJJRCBjcmVhdGVkIiwKKTsKCiMgYWRkIHRlc3QgdXNlciB0byB0ZXN0IGdyb3VwCm15ICRTdWNjZXNzID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgR0lEICAgICAgICA9PiAkR3JvdXBJRCwKICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgIG1vdmVfaW50byA9PiAxLAogICAgICAgIGNyZWF0ZSAgICA9PiAxLAogICAgICAgIG93bmVyICAgICA9PiAxLAogICAgICAgIHByaW9yaXR5ICA9PiAxLAogICAgICAgIHJ3ICAgICAgICA9PiAxLAogICAgfSwKICAgIFVzZXJJRCA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICJUZXN0IHVzZXIgJFVzZXJJRCBhZGRlZCB0byB0ZXN0IGdyb3VwICRHcm91cElEIiwKKTsKCm15IEBDYWxlbmRhcklEczsKCiMKIyBUZXN0cyBmb3IgQ2FsZW5kYXJDcmVhdGUoKQojCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdDYWxlbmRhckNyZWF0ZSAtIE5vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBNaXNzaW5nIENhbGVuZGFyTmFtZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ29sb3IgICA9PiAnIzNBODdBRCcsCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckNyZWF0ZSAtIE1pc3NpbmcgVXNlcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckNyZWF0ZSAtIE1pc3NpbmcgR3JvdXBJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhci0kUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckNyZWF0ZSAtIE1pc3NpbmcgQ29sb3InLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlEIiwKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckNyZWF0ZSAtIFdyb25nIENvbG9yJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAncmVkJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckNyZWF0ZSAtIEFsbCByZXF1aXJlZCBwYXJhbWV0ZXJzJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBTYW1lIG5hbWUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckNyZWF0ZSAtIEludmFsaWQgc3RhdGUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlELTIiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNFQzkwNzMnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMiwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckNyZWF0ZSAtIE9wdGlvbmFsIHBhcmFtZXRlcnMnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyTmFtZSAgICAgICA9PiAiQ2FsZW5kYXItJFJhbmRvbUlELTMiLAogICAgICAgICAgICBDb2xvciAgICAgICAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBHcm91cElEICAgICAgICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudHMgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFN0YXJ0RGF0ZSAgICA9PiAnRmlyc3RSZXNwb25zZScsCiAgICAgICAgICAgICAgICAgICAgRW5kRGF0ZSAgICAgID0+ICdQbHVzXzUnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiBbMl0sCiAgICAgICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJ1RoaXMgaXMgYSB0aXRsZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVzID0+ICdUaGlzIGlzIGEgdHlwZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIG1ha2UgdGhlIGNhbGwKICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgICMgY2hlY2sgZGF0YQogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgIGZvciBteSAkS2V5IChxdyhDYWxlbmRhcklEIEdyb3VwSUQgQ2FsZW5kYXJOYW1lIENvbG9yIENyZWF0ZVRpbWUgQ3JlYXRlQnkgQ2hhbmdlVGltZSBDaGFuZ2VCeSBWYWxpZElEKSkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDYWxlbmRhcnskS2V5fSwKICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gJEtleSBleGlzdHMiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgS0VZOgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRUZXN0LT57Q29uZmlnfSB9ICkgewogICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdVc2VySUQnOwoKICAgICAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAgICAgJFRlc3QtPntDb25maWd9LT57JEtleX0sCiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJ7JEtleX0sCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIERhdGEgZm9yICRLZXkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAQ2FsZW5kYXJJRHMsICRDYWxlbmRhcntDYWxlbmRhcklEfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgQ2FsZW5kYXJHZXQoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdDYWxlbmRhckdldCAtIE5vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJHZXQgLSBNaXNzaW5nIENhbGVuZGFyTmFtZSBhbmQgQ2FsZW5kYXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJHZXQgLSBGaXJzdCBjYWxlbmRhcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhci0kUmFuZG9tSUQiLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckdldCAtIFNlY29uZCBjYWxlbmRhcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhci0kUmFuZG9tSUQtMiIsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyR2V0IC0gVGhpcmQgY2FsZW5kYXInLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlELTMiLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckdldCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgIyBjaGVjayBkYXRhCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgZm9yIG15ICRLZXkgKHF3KENhbGVuZGFySUQgR3JvdXBJRCBDYWxlbmRhck5hbWUgQ29sb3IgQ3JlYXRlVGltZSBDcmVhdGVCeSBDaGFuZ2VUaW1lIENoYW5nZUJ5IFZhbGlkSUQpKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJENhbGVuZGFyeyRLZXl9LAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSAkS2V5IGV4aXN0cyIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBieSBpZAogICAgICAgIG15ICVDYWxlbmRhckJ5SUQgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNvbXBhcmUgcmV0dXJuZWQgZGF0YQogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXCVDYWxlbmRhciwKICAgICAgICAgICAgXCVDYWxlbmRhckJ5SUQsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gR2V0IGJ5IENhbGVuZGFySUQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIENhbGVuZGFyTGlzdCgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ0NhbGVuZGFyTGlzdCAtIE5vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJMaXN0IC0gV2l0aCBVc2VySUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIENvdW50ICAgPT4gMywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckxpc3QgLSBXaXRoIFVzZXJJRCBhbmQgb25seSB2YWxpZCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgQ291bnQgICA9PiAyLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyTGlzdCAtIFdpdGggVXNlcklEIGFuZCBvbmx5IGludmFsaWQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gMiwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIENvdW50ICAgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgQFJlc3VsdCA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJMaXN0KAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICAjIGNoZWNrIGRhdGEKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKCiAgICAgICAgIyBjaGVjayBjb3VudAogICAgICAgIGlmICggJFRlc3QtPntDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgIHNjYWxhciBAUmVzdWx0LAogICAgICAgICAgICAgICAgJFRlc3QtPntDb3VudH0sCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlc3VsdCBjb3VudCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbXBhcmUgcmV0dXJuZWQgZGF0YQogICAgICAgICAgICBmb3IgbXkgJENhbGVuZGFyIChAUmVzdWx0KSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEtleSAocXcoQ2FsZW5kYXJJRCBHcm91cElEIENhbGVuZGFyTmFtZSBDb2xvciBDcmVhdGVUaW1lIENyZWF0ZUJ5IENoYW5nZVRpbWUgQ2hhbmdlQnkgVmFsaWRJRCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgICAgICRDYWxlbmRhci0+eyRLZXl9LAogICAgICAgICAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtICRLZXkgZXhpc3RzIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IGJ5IGlkCiAgICAgICAgICAgICAgICBteSAlQ2FsZW5kYXJCeUlEID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckdldCgKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhci0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBkZWxldGUgJENhbGVuZGFyQnlJRHtUaWNrZXRBcHBvaW50bWVudHN9OwoKICAgICAgICAgICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgICAgICAgICAkQ2FsZW5kYXIsCiAgICAgICAgICAgICAgICAgICAgXCVDYWxlbmRhckJ5SUQsCiAgICAgICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBDb21wYXJlIHJldHVybmVkIGRhdGEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICBzY2FsYXIgQFJlc3VsdCA+IDEsCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIEhhcyByZXN1bHQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgQFJlc3VsdCwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIENhbGVuZGFyVXBkYXRlKCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnQ2FsZW5kYXJVcGRhdGUgLSBObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyVXBkYXRlIC0gTWlzc2luZyBDYWxlbmRhcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2hhbmdlLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnI0ZGOTkwMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMiwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclVwZGF0ZSAtIE1pc3NpbmcgR3JvdXBJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgID0+ICRDYWxlbmRhcklEc1swXSwKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDaGFuZ2UtJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjRkY5OTAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAyLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyVXBkYXRlIC0gTWlzc2luZyBDYWxlbmRhck5hbWUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySURzWzBdLAogICAgICAgICAgICBHcm91cElEICAgID0+ICRHcm91cElELAogICAgICAgICAgICBDb2xvciAgICAgID0+ICcjRkY5OTAwJywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgID0+IDIsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJVcGRhdGUgLSBNaXNzaW5nIENvbG9yJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgPT4gJENhbGVuZGFySURzWzBdLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2hhbmdlLSRSYW5kb21JRCIsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMiwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclVwZGF0ZSAtIE1pc3NpbmcgVXNlcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgPT4gJENhbGVuZGFySURzWzBdLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2hhbmdlLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnI0ZGOTkwMCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAyLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyVXBkYXRlIC0gTWlzc2luZyBWYWxpZElEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgPT4gJENhbGVuZGFySURzWzBdLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2hhbmdlLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnI0ZGOTkwMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyVXBkYXRlIC0gQWxsIHJlcXVpcmVkIHBhcmFtcyBmaXJzdCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgID0+ICRDYWxlbmRhcklEc1swXSwKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNoYW5nZS0kUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNGRjk5MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDIsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJVcGRhdGUgLSBBbGwgcmVxdWlyZWQgYW5kIGFuIG9wdGlvbmFsIHBhcmFtIHNlY29uZCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcklEc1sxXSwKICAgICAgICAgICAgR3JvdXBJRCAgICAgICAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBDYWxlbmRhck5hbWUgICAgICAgPT4gIkNoYW5nZS0kUmFuZG9tSUQtMiIsCiAgICAgICAgICAgIENvbG9yICAgICAgICAgICAgICA9PiAnI0ZGOTkwMCcsCiAgICAgICAgICAgIFRpY2tldEFwcG9pbnRtZW50cyA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgU3RhcnREYXRlICAgID0+ICdGaXJzdFJlc3BvbnNlJywKICAgICAgICAgICAgICAgICAgICBFbmREYXRlICAgICAgPT4gJ1BsdXNfNScsCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgID0+IDIsCiAgICAgICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJ1RoaXMgaXMgYSB0aXRsZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVzID0+ICdUaGlzIGlzIGEgdHlwZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyVXBkYXRlIC0gQWxsIHJlcXVpcmVkIGFuZCBhbiBvcHRpb25hbCBwYXJhbSB0aGlyZCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcklEc1sxXSwKICAgICAgICAgICAgR3JvdXBJRCAgICAgICAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBDYWxlbmRhck5hbWUgICAgICAgPT4gIkNoYW5nZS0kUmFuZG9tSUQtMiIsCiAgICAgICAgICAgIENvbG9yICAgICAgICAgICAgICA9PiAnI0ZGOTkwMCcsCiAgICAgICAgICAgIFRpY2tldEFwcG9pbnRtZW50cyA9PiB1bmRlZiwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBtYWtlIHRoZSBjYWxsCiAgICBteSAkU3VjY2VzcyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJVcGRhdGUoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgICMgY2hlY2sgZGF0YQogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBTdWNjZXNzIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBieSBpZAogICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFRlc3QtPntDb25maWd9LT57Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgS0VZOgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRUZXN0LT57Q29uZmlnfSB9ICkgewogICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdVc2VySUQnOwoKICAgICAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAgICAgJFRlc3QtPntDb25maWd9LT57JEtleX0sCiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJ7JEtleX0sCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIERhdGEgZm9yICRLZXkiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBDYWxlbmRhclBlcm1pc3Npb25HZXQoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdDYWxlbmRhclBlcm1pc3Npb25HZXQgLSBObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyUGVybWlzc2lvbkdldCAtIE1pc3NpbmcgQ2FsZW5kYXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJQZXJtaXNzaW9uR2V0IC0gTWlzc2luZyBVc2VySUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySURzWzBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyUGVybWlzc2lvbkdldCAtIEFsbCBwYXJhbXMgZmlyc3QnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySURzWzBdLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgUmVzdWx0ICA9PiAncncnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyUGVybWlzc2lvbkdldCAtIEFsbCBwYXJhbXMgc2Vjb25kJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklEc1sxXSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIFJlc3VsdCAgPT4gJ3J3JywKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJFBlcm1pc3Npb24gPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgIyBjaGVjayBwZXJtaXNzaW9uCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkUGVybWlzc2lvbiwKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFBlcm1pc3Npb24iLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRQZXJtaXNzaW9uLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgR2V0VGV4dENvbG9yKCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnR2V0VGV4dENvbG9yIC0gTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdHZXRUZXh0Q29sb3IgLSBJbnZhbGlkIGNvbG9yJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBCYWNrZ3JvdW5kID0+ICcjQ0NDQ0MnLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0dldFRleHRDb2xvciAtIFdoaXRlJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBCYWNrZ3JvdW5kID0+ICcjRkZGJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBSZXN1bHQgID0+ICcjMDAwJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdHZXRUZXh0Q29sb3IgLSBMaWdodCBHcmF5JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBCYWNrZ3JvdW5kID0+ICcjODA4MDgwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBSZXN1bHQgID0+ICcjMDAwJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdHZXRUZXh0Q29sb3IgLSBEYXJrIEdyYXknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIEJhY2tncm91bmQgPT4gJyM3OTc5NzknLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIFJlc3VsdCAgPT4gJyNGRkZGRkYnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0dldFRleHRDb2xvciAtIEJsYWNrJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBCYWNrZ3JvdW5kID0+ICcjMDAwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBSZXN1bHQgID0+ICcjRkZGRkZGJywKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJFRleHRDb2xvciA9ICRDYWxlbmRhck9iamVjdC0+R2V0VGV4dENvbG9yKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICAjIGNoZWNrIHRleHQgY29sb3IKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRUZXh0Q29sb3IsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBUZXh0IGNvbG9yIiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkVGV4dENvbG9yLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgQ2FsZW5kYXJFeHBvcnQoKSBhbmQgQ2FsZW5kYXJJbXBvcnQoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdDYWxlbmRhckV4cG9ydC9JbXBvcnQgLSBObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyRXhwb3J0L0ltcG9ydCAtIE5vIENhbGVuZGFyRGF0YScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJFeHBvcnQvSW1wb3J0IC0gQWxsIHBhcmFtcyB3aXRoIG92ZXJ3cml0ZScsCiAgICAgICAgRXhwb3J0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRHNbMl0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgT3ZlcndyaXRlRXhpc3RpbmdFbnRpdGllcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQXBwb2ludG1lbnRzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRHNbMl0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgID0+ICJBcHBvaW50bWVudDEtJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySURzWzJdLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiQXBwb2ludG1lbnQyLSRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBjcmVhdGUgYXBwb2ludG1lbnRzCiAgICBpZiAoICRUZXN0LT57QXBwb2ludG1lbnRzfSApIHsKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50ICggQHsgJFRlc3QtPntBcHBvaW50bWVudHN9IH0gKSB7CiAgICAgICAgICAgIG15ICRBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgICAgICV7JEFwcG9pbnRtZW50fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQ3JlYXRlZCBhcHBvaW50bWVudCAoJEFwcG9pbnRtZW50SUQpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBleHBvcnQgY2FsZW5kYXIKICAgIGlmICggJFRlc3QtPntFeHBvcnR9ICkgewogICAgICAgIG15ICVEYXRhID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckV4cG9ydCgKICAgICAgICAgICAgJXsgJFRlc3QtPntFeHBvcnR9IH0sCiAgICAgICAgKTsKCiAgICAgICAgJFRlc3QtPntDb25maWd9LT57RGF0YX0gPSBcJURhdGE7CiAgICB9CgogICAgIyBtYWtlIHRoZSBjYWxsCiAgICBteSAkU3VjY2VzcyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJJbXBvcnQoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgICMgY2hlY2sgcmVzdWx0CiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFN1Y2Nlc3MiLAogICAgICAgICk7CgogICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgICV7ICRUZXN0LT57RXhwb3J0fSB9LAogICAgICAgICk7CgogICAgICAgICMgcmVzZXQgQ3JlYXRlVGltZSBhbmQgQ2hhbmdlVGltZSBzaW5jZSB0aGV5IG1pZ2h0IGRpZmZlcgogICAgICAgIGZvciBteSAkS2V5IChxdyhDcmVhdGVUaW1lIENoYW5nZVRpbWUpKSB7CiAgICAgICAgICAgICRDYWxlbmRhcnskS2V5fSA9IHVuZGVmOwogICAgICAgICAgICAkVGVzdC0+e0NvbmZpZ30tPntEYXRhfS0+e0NhbGVuZGFyRGF0YX0tPnskS2V5fSA9IHVuZGVmOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICBcJUNhbGVuZGFyLAogICAgICAgICAgICAkVGVzdC0+e0NvbmZpZ30tPntEYXRhfS0+e0NhbGVuZGFyRGF0YX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQ2FsZW5kYXIgZGF0YSIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAleyAkVGVzdC0+e0V4cG9ydH0gfSwKICAgICAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50RGF0YTsKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50SUQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgbXkgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSA9IHVuZGVmOwoKICAgICAgICAgICAgIyByZXNldCBDcmVhdGVUaW1lIGFuZCBDaGFuZ2VUaW1lIHNpbmNlIHRoZXkgbWlnaHQgZGlmZmVyCiAgICAgICAgICAgIGZvciBteSAkS2V5IChxdyhDcmVhdGVUaW1lIENoYW5nZVRpbWUpKSB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7JEtleX0gPSB1bmRlZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnREYXRhLCBcJUFwcG9pbnRtZW50OwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoIEB7ICRUZXN0LT57Q29uZmlnfS0+e0RhdGF9LT57QXBwb2ludG1lbnREYXRhfSB9ICkgewogICAgICAgICAgICAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSA9IHVuZGVmOwoKICAgICAgICAgICAgIyByZXNldCBDcmVhdGVUaW1lIGFuZCBDaGFuZ2VUaW1lIHNpbmNlIHRoZXkgbWlnaHQgZGlmZmVyCiAgICAgICAgICAgIGZvciBteSAkS2V5IChxdyhDcmVhdGVUaW1lIENoYW5nZVRpbWUpKSB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPnskS2V5fSA9IHVuZGVmOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgIFxAQXBwb2ludG1lbnREYXRhLAogICAgICAgICAgICAkVGVzdC0+e0NvbmZpZ30tPntEYXRhfS0+e0FwcG9pbnRtZW50RGF0YX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQXBwb2ludG1lbnQgZGF0YSIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMgT3ZlcnJpZGUgbG9jYWwgdGltZSB6b25lIGZvciBkdXJhdGlvbiBvZiB0aGUgdGVzdC4KbG9jYWwgJEVOVntUWn0gPSAnVVRDJzsKCiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFJlc3RvcmVEYXRhYmFzZSA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKbXkgJENhbGVuZGFyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7Cm15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKbXkgJEdyb3VwT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7Cm15ICRVc2VyT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgpteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKIyBjcmVhdGUgdGVzdCBncm91cApteSAkR3JvdXBOYW1lID0gJ3Rlc3QtY2FsZW5kYXItZ3JvdXAtJyAuICRSYW5kb21JRDsKbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICBOYW1lICAgID0+ICRHcm91cE5hbWUsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRHcm91cElELAogICAgIlRlc3QgZ3JvdXAgJEdyb3VwSUQgY3JlYXRlZCIsCik7CgojIENyZWF0ZSB0ZXN0IHVzZXIgYW5kIGFkZCBpdCB0byB0aGUgdGVzdCBncm91cC4KbXkgJFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgR3JvdXBzID0+IFskR3JvdXBOYW1lXSwKKTsKbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKCBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiApOwoKJFNlbGYtPlRydWUoCiAgICAkVXNlcklELAogICAgIlRlc3QgdXNlciAkVXNlcklEIGNyZWF0ZWQiLAopOwoKIyBjcmVhdGUgdGVzdCBjYWxlbmRhcgpteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhci0kUmFuZG9tSUQiLAogICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAopOwoKJFNlbGYtPlRydWUoCiAgICAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAiQ2FsZW5kYXJDcmVhdGUgLSAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0iLAopOwoKIwojIFRlc3RzIGZvciBBcHBvaW50bWVudENyZWF0ZSgpLCBBcHBvaW50bWVudEdldCgpIGFuZCBBcHBvaW50bWVudFVwZGF0ZSgpCiMKbXkgQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlIC0gTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudENyZWF0ZSAtIE5vIENhbGVuZGFySUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpdGxlICAgICA9PiAiQXBwb2ludG1lbnQtJFJhbmRvbUlEIiwKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRDcmVhdGUgLSBObyBUaXRsZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlIC0gTm8gU3RhcnRUaW1lJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiQXBwb2ludG1lbnQtJFJhbmRvbUlEIiwKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudENyZWF0ZSAtIE5vIEVuZFRpbWUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgID0+ICJBcHBvaW50bWVudC0kUmFuZG9tSUQiLAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlIC0gTm8gVXNlcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiQXBwb2ludG1lbnQtJFJhbmRvbUlEIiwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlIC0gQWxsIHJlcXVpcmVkIHBhcmFtcycsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIkFwcG9pbnRtZW50LSRSYW5kb21JRCIsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlIC0gRGVzY3JpcHRpb24sIExvY2F0aW9uIGFuZCBBbGxEYXknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gIkFwcG9pbnRtZW50Mi0kUmFuZG9tSUQiLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2FsZW5kYXIgQXBwb2ludG1lbnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgID0+ICcyMDE2LTAxLTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgPT4gJzIwMTYtMDEtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICA9PiAiQXBwb2ludG1lbnQyLSRSYW5kb21JRCIsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdTb21lIGRlc2NyaXB0aW9uJywKICAgICAgICAgICAgTG9jYXRpb24gICAgPT4gJ1VTQScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgID0+ICcyMDE2LTAxLTAzIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgPT4gJzIwMTYtMDEtMDMgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBtYWtlIHRoZSBjYWxsCiAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gU3VjY2VzcyIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICApOwoKICAgICAgICBLRVk6CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJFRlc3QtPntDb25maWd9IH0gKSB7CiAgICAgICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1VzZXJJRCc7CgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7JEtleX0sCiAgICAgICAgICAgICAgICAkVGVzdC0+e0NvbmZpZ30tPnskS2V5fSwKICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gUmV0dXJuZWQgZGF0YSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRUZXN0LT57VXBkYXRlfSApIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50VXBkYXRlKAogICAgICAgICAgICAgICAgJXsgJFRlc3QtPntVcGRhdGV9IH0sCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBVcGRhdGVkIGFwcG9pbnRtZW50IiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkVGVzdC0+e1VwZGF0ZX0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1VzZXJJRCc7CgogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHskS2V5fSwKICAgICAgICAgICAgICAgICAgICAkVGVzdC0+e1VwZGF0ZX0tPnskS2V5fSwKICAgICAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFVwZGF0ZWQgZGF0YSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIEFwcG9pbnRtZW50TGlzdCgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ0FwcG9pbnRtZW50TGlzdCAtIE5vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRMaXN0IC0gQ2FsZW5kYXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgfSwKICAgICAgICBDb3VudCAgID0+IDIsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50TGlzdCAtIFN0YXJ0VGltZSBhbmQgRW5kVGltZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAxLTA0IDAwOjAwOjAwJywKICAgICAgICB9LAogICAgICAgIENvdW50ICAgPT4gMiwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRMaXN0IC0gQmVmb3JlIGFwcG9pbnRtZW50cycsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTUtMTItMzEgMDA6MDA6MDAnLAogICAgICAgIH0sCiAgICAgICAgQ291bnQgICA9PiAwLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudExpc3QgLSBBZnRlciBhcHBvaW50bWVudHMnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAxLTA0IDAwOjAwOjAwJywKICAgICAgICB9LAogICAgICAgIENvdW50ICAgPT4gMCwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRMaXN0IC0gVGl0bGUgc2VhcmNoJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiQXBwb2ludG1lbnQqLSRSYW5kb21JRCIsICAgICMgd2lsZGNhcmQKICAgICAgICB9LAogICAgICAgIENvdW50ICAgPT4gMiwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRMaXN0IC0gRGVzY3JpcHRpb24gc2VhcmNoJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdmb29iYXInLCAgICAgICAgICAgICAgICAgICAjIG5vbi1leGlzdGVudAogICAgICAgIH0sCiAgICAgICAgQ291bnQgICA9PiAwLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudExpc3QgLSBMb2NhdGlvbiBzZWFyY2gnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBMb2NhdGlvbiAgID0+ICd1c2EnLCAgICAgICAgICAgICAgICAgICAgICAgIyBsb3dlcmNhc2UKICAgICAgICB9LAogICAgICAgIENvdW50ICAgPT4gMSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIG1ha2UgdGhlIGNhbGwKICAgIG15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMsCiAgICAgICAgICAgICRUZXN0LT57Q291bnR9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlc3VsdCBjb3VudCIsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkVGVzdC0+e0NvbmZpZ30tPntSZXN1bHR9ICYmICRUZXN0LT57Q29uZmlnfS0+e1Jlc3VsdH0gZXEgJ0FSUkFZJyApIHsKCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEtleSAocXcoQXBwb2ludG1lbnRJRCBDYWxlbmRhcklEIFVuaXF1ZUlEIFRpdGxlIFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPnskS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSAkS2V5IGV4aXN0cyIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXEBBcHBvaW50bWVudHMsCiAgICAgICAgICAgIFtdLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE9uY2UgcGVyIGRheScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdSZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgPT4gJzIwMTYtMDMtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDMtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICA9PiAnRGFpbHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbmNlIHBlciBkYXkKICAgICAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgID0+ICcyMDE2LTAzLTA2IDAwOjAwOjAwJywgICAgICMgaW5jbHVkZWQgbGFzdCBkYXkKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDMtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAzLTA2IDAwOjAwOjAwJywKICAgICAgICAgICAgQ291bnQgICAgICA9PiA1LAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IFsKICAgICAgICAgICAgJzIwMTYtMDMtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICAnMjAxNi0wMy0wMiAxNjowMDowMCcsCiAgICAgICAgICAgICcyMDE2LTAzLTAzIDE2OjAwOjAwJywKICAgICAgICAgICAgJzIwMTYtMDMtMDQgMTY6MDA6MDAnLAogICAgICAgICAgICAnMjAxNi0wMy0wNSAxNjowMDowMCcsCiAgICAgICAgXSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gT25jZSBwZXIgbW9udGgnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDEyLTAxLTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDEyLTAxLTMxIDE2OjAwOjAwJywKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICA9PiAnTW9udGhseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAjIG9uY2UgcGVyIG1vbnRoCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxMy0wMS0wMyAxNjowMDowMCcsICAgICAjIGluY2x1ZGVkIGxhc3QgZGF5CiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDEyLTAxLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxMy0wMS0wNCAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMTIsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gWwogICAgICAgICAgICAnMjAxMi0wMS0zMSAxNTowMDowMCcsCiAgICAgICAgICAgICcyMDEyLTAyLTI5IDE1OjAwOjAwJywKICAgICAgICAgICAgJzIwMTItMDMtMzEgMTU6MDA6MDAnLAogICAgICAgICAgICAnMjAxMi0wNC0zMCAxNTowMDowMCcsCiAgICAgICAgICAgICcyMDEyLTA1LTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgJzIwMTItMDYtMzAgMTU6MDA6MDAnLAogICAgICAgICAgICAnMjAxMi0wNy0zMSAxNTowMDowMCcsCiAgICAgICAgICAgICcyMDEyLTA4LTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgJzIwMTItMDktMzAgMTU6MDA6MDAnLAogICAgICAgICAgICAnMjAxMi0xMC0zMSAxNTowMDowMCcsCiAgICAgICAgICAgICcyMDEyLTExLTMwIDE1OjAwOjAwJywKICAgICAgICAgICAgJzIwMTItMTItMzEgMTU6MDA6MDAnLAogICAgICAgIF0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIEV2ZXJ5IG1vbnRoIGFsbC1kYXkgcGVyIG1vbnRoJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgPT4gJ1JlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICA9PiAnMjAwOC0wNC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICA9PiAnMjAwOC0wNS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgID0+ICdNb250aGx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUNvdW50ID0+IDMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDA4LTA0LTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAwOC0wNy0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiBbCiAgICAgICAgICAgICcyMDA4LTA0LTMwIDAwOjAwOjAwJywgICAgIyBvbiBzb21lIHN5c3RlbXMgd2l0aCBvbGRlciBkYXRlIHRpbWUgbGlicmFyeQogICAgICAgICAgICAnMjAwOC0wNS0zMCAwMDowMDowMCcsICAgICMgdGhlcmUgd2lsbCBiZSBhbiBhcHBvaW50bWVudCBvbiAyMDA4LTA1LTMxCiAgICAgICAgICAgICcyMDA4LTA2LTMwIDAwOjAwOjAwJywgICAgIyBidXQgbm90IG9uIDIwMDgtMDYtMzAKICAgICAgICBdLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBNaXNzaW5nIFJlY3VycmVuY2VUeXBlJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgPT4gJ1JlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxNi0wMy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIFdyb25nIFJlY3VycmVuY2VUeXBlJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgPT4gJ1JlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgID0+ICdXcm9uZ0RhaWx5JywgICAgICAgICAgICAgICMgV3JvbmdEYWlseSBpcyBub3Qgc3VwcG9ydGVkCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgPT4gJzIwMTYtMDMtMDYgMDA6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBXaXRob3V0IFJlY3VycmVuY2VGcmVxdWVuY3knLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDE4LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDE4LTAzLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ0N1c3RvbURhaWx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VDb3VudCAgICA9PiAyLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxOC0wMy0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTgtMDMtMDMgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDIsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gWwogICAgICAgICAgICAnMjAxOC0wMy0wMSAxNjowMDowMCcsCiAgICAgICAgICAgICcyMDE4LTAzLTAyIDE2OjAwOjAwJywKICAgICAgICBdLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBNaXNzaW5nIFJlY3VycmVuY2VGcmVxdWVuY3kgKEN1c3RvbVdlZWtseSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ0N1c3RvbVdlZWtseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgPT4gJzIwMTYtMDMtMDYgMDA6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBNaXNzaW5nIFJlY3VycmVuY2VGcmVxdWVuY3kgKEN1c3RvbU1vbnRobHkpJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgPT4gJ1JlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgID0+ICdDdXN0b21Nb250aGx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxNi0wMy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE1pc3NpbmcgUmVjdXJyZW5jZUZyZXF1ZW5jeSAoQ3VzdG9tWWVhcmx5KScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdSZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgPT4gJzIwMTYtMDMtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDMtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICA9PiAnQ3VzdG9tWWVhcmx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxNi0wMy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE9uY2UgcGVyIHdlZWsnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnV2Vla2x5IHJlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0xMC0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0xMC0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgID0+ICdXZWVrbHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZWFjaCB3ZWVrCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxNi0xMC0wNiAwMDowMDowMCcsICAgICAgICAgICAgIyBpbmNsdWRlZCBsYXN0IGRheQogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMTAtMDcgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gWwogICAgICAgICAgICAnMjAxNi0xMC0wMSAxNjowMDowMCcsCiAgICAgICAgXSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gT25jZSBwZXIgbW9udGgnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnTW9udGhseSByZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgPT4gJzIwMTYtMTAtMDcgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMTAtMDcgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICA9PiAnTW9udGhseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZWFjaCBtb250aAogICAgICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgPT4gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDMgbW9udGhzCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTEwLTA3IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNy0wMS0wOCAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiBbCiAgICAgICAgICAgICcyMDE2LTEwLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgJzIwMTYtMTEtMDcgMTY6MDA6MDAnLAogICAgICAgICAgICAnMjAxNi0xMi0wNyAxNjowMDowMCcsCiAgICAgICAgXSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gT25jZSBwZXIgeWVhcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdZZWFybHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDI3LTEwLTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDI3LTEwLTEwIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ1llYXJseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlYWNoIHllYXIKICAgICAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgID0+IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDMgeWVhcnMKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMjctMTAtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDMwLTEwLTExIDAwOjAwOjAwJywKICAgICAgICAgICAgQ291bnQgICAgICA9PiAzLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IFsKICAgICAgICAgICAgJzIwMjctMTAtMTAgMTY6MDA6MDAnLAogICAgICAgICAgICAnMjAyOC0xMC0xMCAxNjowMDowMCcsCiAgICAgICAgICAgICcyMDI5LTEwLTEwIDE2OjAwOjAwJywKICAgICAgICBdLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBFdmVyeSB0d28gZGF5cycsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdDdXN0b20gZGFpbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgID0+ICdEZXNjcmlwdGlvbicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNy0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNy0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgID0+ICdDdXN0b21EYWlseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCA9PiAyLAogICAgICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgPT4gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMyBhcHBvaW50bWVudHMKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTctMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE3LTAxLTA2IDAwOjAwOjAwJywKICAgICAgICAgICAgQ291bnQgICAgICA9PiAzLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IFsKICAgICAgICAgICAgJzIwMTctMDEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICAnMjAxNy0wMS0wMyAxNjowMDowMCcsCiAgICAgICAgICAgICcyMDE3LTAxLTA1IDE2OjAwOjAwJywKICAgICAgICBdLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBPbiBXZWRuZXNkYXksIHJlY3VycmluZyBldmVyeSB0d28gd2Vla3Mgb24gTW9uZGF5IGFuZCBGcmlkYXknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgID0+ICdDdXN0b20gd2Vla2x5IHJlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMTYtMDUtMDQgMTY6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIHdlZG5lc2RheQogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTA1LTA0IDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0N1c3RvbVdlZWtseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVhY2ggMm5kCiAgICAgICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgPT4gWyAxLCA1IF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1vbmRheSBhbmQgRnJpZGF5CiAgICAgICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgPT4gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDMgYXBwb2ludG1lbnRzCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wNS0wNCAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDUtMjggMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDMsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gWwogICAgICAgICAgICAnMjAxNi0wNS0wNCAxNjowMDowMCcsCiAgICAgICAgICAgICcyMDE2LTA1LTA2IDE2OjAwOjAwJywKICAgICAgICAgICAgJzIwMTYtMDUtMTYgMTY6MDA6MDAnLAogICAgICAgIF0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIEV2ZXJ5IDJuZCBtb250aCBvbiA1dGgsIDEwdGggYW5kIDE1dGggZGF5JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIG1vbnRobHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxOS0wNy0wNSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTktMDctMDUgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAiQ3VzdG9tTW9udGhseSIsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBldmVyeSAyIG1vbnRocwogICAgICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ID0+IFsgNSwgMTAsIDE1IF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGF5cyBpbiBtb250aAogICAgICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgID0+IDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMyBhcHBvaW50bWVudHMKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE5LTA3LTA1IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxOS0xMC0xNiAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gNiwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiBbCiAgICAgICAgICAgICcyMDE5LTA3LTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgJzIwMTktMDctMTAgMTY6MDA6MDAnLAogICAgICAgICAgICAnMjAxOS0wNy0xNSAxNjowMDowMCcsCiAgICAgICAgICAgICcyMDE5LTA5LTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgJzIwMTktMDktMTAgMTY6MDA6MDAnLAogICAgICAgICAgICAnMjAxOS0wOS0xNSAxNjowMDowMCcsCiAgICAgICAgXSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gRXZlcnkgMm5kIHllYXIgb24gSmFudWFyeSA1dGgsIEZlYnJ1YXJ5IGFuZCBEZWNlbWJlcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSB5ZWFybHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAyMi0wMS0wNSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMjItMDEtMDUgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAnQ3VzdG9tWWVhcmx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZXZlcnkgMiB5ZWFycwogICAgICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ID0+IFsgMSwgMiwgMTIgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtb250aHMKICAgICAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgICA9PiAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMyBhcHBvaW50bWVudHMKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDIyLTAxLTA1IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAyNC0xMi0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiBbCiAgICAgICAgICAgICcyMDIyLTAxLTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgJzIwMjItMDItMDUgMTY6MDA6MDAnLAogICAgICAgICAgICAnMjAyMi0xMi0wNSAxNjowMDowMCcsCiAgICAgICAgXSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gRXZlcnkgMiB3ZWVrcywgb24gTW9uLCBXZWQsIFRodSwgRnJpIGFuZCBTdW4nLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgID0+ICdDdXN0b20gcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICA9PiAnRGVzY3JpcHRpb24nLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDI1LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAyNS0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgID0+ICdDdXN0b21XZWVrbHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgID0+IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVhY2ggMiB3ZWVrcwogICAgICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ID0+IFsgMSwgMywgNCwgNSwgNyBdLCAgICAgICAgICAgICAgICAjIE1vbiwgV2VkLCBUaHUsIEZyaSwgU3VuCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICAgPT4gJzIwMjYtMTAtMDEgMDA6MDA6MDAnLCAgICAgICAgICAgICMgb2N0b2JlcgogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMjUtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDI2LTEwLTEzIDAwOjAwOjAwJywKICAgICAgICAgICAgQ291bnQgICAgICA9PiAxNDMsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gWwogICAgICAgICAgICAnMjAyNS0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI1LTA5LTAzIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjUtMDktMDQgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNS0wOS0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI1LTA5LTA3IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjUtMDktMTUgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNS0wOS0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI1LTA5LTE4IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjUtMDktMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNS0wOS0yMSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI1LTA5LTI5IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjUtMTAtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNS0xMC0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI1LTEwLTAzIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjUtMTAtMDUgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNS0xMC0xMyAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI1LTEwLTE1IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjUtMTAtMTYgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNS0xMC0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI1LTEwLTE5IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjUtMTAtMjcgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNS0xMC0yOSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI1LTEwLTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjUtMTAtMzEgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNS0xMS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI1LTExLTEwIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjUtMTEtMTIgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNS0xMS0xMyAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI1LTExLTE0IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjUtMTEtMTYgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNS0xMS0yNCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI1LTExLTI2IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjUtMTEtMjcgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNS0xMS0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI1LTExLTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjUtMTItMDggMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNS0xMi0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI1LTEyLTExIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjUtMTItMTIgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNS0xMi0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI1LTEyLTIyIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjUtMTItMjQgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNS0xMi0yNSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI1LTEyLTI2IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjUtMTItMjggMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wMS0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTAxLTA3IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDEtMDggMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wMS0wOSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTAxLTExIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDEtMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wMS0yMSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTAxLTIyIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDEtMjMgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wMS0yNSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTAyLTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDItMDQgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wMi0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTAyLTA2IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDItMDggMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wMi0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTAyLTE4IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDItMTkgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wMi0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTAyLTIyIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDMtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wMy0wNCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTAzLTA1IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDMtMDYgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wMy0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTAzLTE2IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDMtMTggMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wMy0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTAzLTIwIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDMtMjIgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wMy0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA0LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDQtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wNC0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA0LTA1IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDQtMTMgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wNC0xNSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA0LTE2IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDQtMTcgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wNC0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA0LTI3IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDQtMjkgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wNC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA1LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDUtMDMgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wNS0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA1LTEzIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDUtMTQgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wNS0xNSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA1LTE3IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDUtMjUgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wNS0yNyAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA1LTI4IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDUtMjkgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wNS0zMSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA2LTA4IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDYtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wNi0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA2LTEyIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDYtMTQgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wNi0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA2LTI0IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDYtMjUgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wNi0yNiAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA2LTI4IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDctMDYgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wNy0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA3LTA5IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDctMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wNy0xMiAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA3LTIwIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDctMjIgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wNy0yMyAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA3LTI0IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDctMjYgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wOC0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA4LTA1IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDgtMDYgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wOC0wNyAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA4LTA5IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDgtMTcgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wOC0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA4LTIwIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDgtMjEgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wOC0yMyAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA4LTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wOS0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA5LTA0IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDktMDYgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wOS0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA5LTE2IDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDktMTcgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wOS0xOCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTA5LTIwIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMjYtMDktMjggMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAyNi0wOS0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDI2LTEwLTAxIDAwOjAwOjAwJywKICAgICAgICBdLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRBcHBvaW50bWVudElELAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFN1Y2Nlc3MiLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgY291bnQKICAgICAgICBteSBAQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICV7ICRUZXN0LT57TGlzdH0gLy8ge30gfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMsCiAgICAgICAgICAgICRUZXN0LT57TGlzdH0tPntDb3VudH0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTGlzdCBjb3VudCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBzdGFydCB0aW1lcwogICAgICAgIG15IEBTdGFydFRpbWVzOwogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgcHVzaCBAU3RhcnRUaW1lcywgJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICBcQFN0YXJ0VGltZXMsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXN1bHQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRBcHBvaW50bWVudElELAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgQXBwb2ludG1lbnREYXlzKCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudERheXMgLSBNaXNzaW5nIFVzZXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICcyMDE2LTAxLTI1IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgID0+ICcyMDE2LTAyLTAxIDAwOjAwOjAwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudERheXMgLSBKYW51YXJ5JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgPT4gJzIwMTYtMDItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICcyMDE2LTAxLTAxJyA9PiAxLAogICAgICAgICAgICAnMjAxNi0wMS0wMycgPT4gMSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudERheXMgLSBNYXJjaCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICcyMDE2LTAzLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgID0+ICcyMDE2LTA0LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAnMjAxNi0wMy0wMScgPT4gMSwKICAgICAgICAgICAgJzIwMTYtMDMtMDInID0+IDEsCiAgICAgICAgICAgICcyMDE2LTAzLTAzJyA9PiAxLAogICAgICAgICAgICAnMjAxNi0wMy0wNCcgPT4gMSwKICAgICAgICAgICAgJzIwMTYtMDMtMDUnID0+IDEsCiAgICAgICAgICAgICcyMDE2LTAzLTA2JyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50RGF5cyAtIE1heScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICcyMDE2LTA1LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgID0+ICcyMDE2LTA2LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAnMjAxNi0wNS0wNCcgPT4gMSwKICAgICAgICAgICAgJzIwMTYtMDUtMDYnID0+IDEsCiAgICAgICAgICAgICcyMDE2LTA1LTE2JyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBtYWtlIHRoZSBjYWxsCiAgICBteSAlQXBwb2ludG1lbnREYXlzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERheXMoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKCiAgICAgICAgIyBjaGVjayBkYXRlcwogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXCVBcHBvaW50bWVudERheXMsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXN1bHQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgIFwlQXBwb2ludG1lbnREYXlzLAogICAgICAgICAgICB7fSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojIGdldCBhIGZldyBVbmlxdWVJRHMgaW4gcXVpY2sgc3VjY2Vzc2lvbgpteSBAVW5pcXVlSURzOwpmb3IgKCAxIC4uIDEwICkgewogICAgcHVzaCBAVW5pcXVlSURzLCAkQXBwb2ludG1lbnRPYmplY3QtPkdldFVuaXF1ZUlEKAogICAgICAgIENhbGVuZGFySUQgPT4gMSwKICAgICAgICBTdGFydFRpbWUgID0+IDE0NTE2MDY0MDAsICAgICMgc2FtZSBzdGFydCB0aW1lICcyMDE2LTAxLTAxIDAwOjAwOjAwJwogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cn0KCm15ICVTZWVuOwpmb3IgbXkgJFVuaXF1ZUlEIChAVW5pcXVlSURzKSB7CiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJFNlZW57JFVuaXF1ZUlEfSsrLAogICAgICAgICJVbmlxdWVJRCAkVW5pcXVlSUQgaXMgdW5pcXVlIiwKICAgICk7Cn0KCiMgY3JlYXRlIGFub3RoZXIgdGVzdCBncm91cApteSAkR3JvdXBOYW1lMiA9ICd0ZXN0LWNhbGVuZGFyLWdyb3VwLScgLiAkUmFuZG9tSUQgLiAnLTInOwpteSAkR3JvdXBJRDIgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICBOYW1lICAgID0+ICRHcm91cE5hbWUyLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkR3JvdXBJRDIsCiAgICAiVGVzdCBncm91cCAkR3JvdXBJRDIgY3JlYXRlZCIsCik7CgojIGFkZCB0ZXN0IHVzZXIgdG8gdGVzdCBncm91cCB3aXRoIHJvIHBlcm1pc3Npb25zCm15ICRTdWNjZXNzID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgR0lEICAgICAgICA9PiAkR3JvdXBJRDIsCiAgICBVSUQgICAgICAgID0+ICRVc2VySUQsCiAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICBtb3ZlX2ludG8gPT4gMCwKICAgICAgICBjcmVhdGUgICAgPT4gMCwKICAgICAgICBvd25lciAgICAgPT4gMCwKICAgICAgICBwcmlvcml0eSAgPT4gMCwKICAgICAgICBydyAgICAgICAgPT4gMCwKICAgIH0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiVGVzdCB1c2VyICRVc2VySUQgYWRkZWQgdG8gdGVzdCBncm91cCAkR3JvdXBJRDIgd2l0aCAncm8nIiwKKTsKCiMgY3JlYXRlIGFub3RoZXIgdGVzdCBjYWxlbmRhcgpteSAlQ2FsZW5kYXIyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXIyLSRSYW5kb21JRCIsCiAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElEMiwKICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAopOwoKJFNlbGYtPlRydWUoCiAgICAkQ2FsZW5kYXIye0NhbGVuZGFySUR9LAogICAgIkNhbGVuZGFyQ3JlYXRlIC0gJENhbGVuZGFyMntDYWxlbmRhcklEfSIsCik7CgojCiMgVGVzdHMgZm9yIEFwcG9pbnRtZW50RGVsZXRlKCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnQXBwb2ludG1lbnREZWxldGUgLSBObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50RGVsZXRlIC0gTm8gQXBwb2ludG1lbnRJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnREZWxldGUgLSBObyBVc2VySUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudERlbGV0ZSAtIEFsbCBwYXJhbXMnLAogICAgICAgIENyZWF0ZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgID0+ICJBcHBvaW50bWVudC0kUmFuZG9tSUQiLAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAyLTI5IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMi0yOSAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDItMjkgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAyLTI5IDAwOjAwOjAwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudERlbGV0ZSAtIE5vIHBlcm1pc3Npb25zJywKICAgICAgICBDcmVhdGUgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIkFwcG9pbnRtZW50LVJPLSRSYW5kb21JRCIsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDctMDQgMTk6NDU6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTA3LTA0IDE5OjQ1OjAwJywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXIye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTA3LTA0IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wNy0wNSAwMDowMDowMCcsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAoKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBjcmVhdGUgYXBwb2ludG1lbnQKICAgIGlmICggJFRlc3QtPntDcmVhdGV9ICkgewogICAgICAgIG15ICRBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgJXsgJFRlc3QtPntDcmVhdGV9IH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQXBwb2ludG1lbnQgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBzYXZlIGFwcG9pbnRtZW50IGlkCiAgICAgICAgJFRlc3QtPntDb25maWd9LT57QXBwb2ludG1lbnRJRH0gPSAkQXBwb2ludG1lbnRJRDsKCiAgICAgICAgIyBjaGVjayBsaXN0CiAgICAgICAgbXkgQEFwcG9pbnRtZW50TGlzdCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAleyAkVGVzdC0+e0xpc3R9IH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRMaXN0LAogICAgICAgICAgICAxLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIEFwcG9pbnRtZW50IGxpc3Qgc3RhcnQiLAogICAgICAgICk7CiAgICB9CgogICAgIyBtYWtlIHRoZSBjYWxsCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gU3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGxpc3QgYWdhaW4KICAgIGlmICggJFRlc3QtPntDcmVhdGV9ICkgewogICAgICAgIG15IEBBcHBvaW50bWVudExpc3QgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgJXsgJFRlc3QtPntMaXN0fSB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50TGlzdCwKICAgICAgICAgICAgJFRlc3QtPntTdWNjZXNzfSA/IDAgOiAxLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIEFwcG9pbnRtZW50IGxpc3QgZW5kIiwKICAgICAgICApOwogICAgfQp9CgojCiMgTm90aWZpY2F0aW9ucwojCgojIG5vdGlmaWNhdGlvbiBjcmVhdGlvbiB0ZXN0IGRlZmluaXRpb24KbXkgQE5vdGlmaWNhdGlvbkNyZWF0ZVRlc3RzID0gKAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggbm90aWZpY2F0aW9ucyBkaXNhYmxlZCBleHBsaWNpdGx5CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ25vIG5vdGlmaWNhdGlvbicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCB3cm9uZyBub3RpZmljYXRpb24gdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnd3Jvbmcgbm90aWZpY2F0aW9uIHRlbXBsYXRlJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ1dyb25nTm90aWZpY2F0aW9uVGVtcGxhdGUnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnV3JvbmdOb3RpZmljYXRpb25UZW1wbGF0ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIG5vdGlmaWNhdGlvbiAwIG1pbnV0ZSB0ZW1wbGF0ZSAoQXBwb2ludG1lbnRTdGFydCkKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDMnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIHRlbXBsYXRlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdTdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIG5vdGlmaWNhdGlvbiAzMCBtaW51dGVzIHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA0JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAzMCBtaW51dGVzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDE4MDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIzOjMwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAxODAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBub3RpZmljYXRpb24gMTIgaG91cnMgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDUnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIHRlbXBsYXRlIDEyIGhvdXJzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDQzMjAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAxMjowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gNDMyMDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIG5vdGlmaWNhdGlvbiAyIGRheXMgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDYnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIHRlbXBsYXRlIDIgZGF5cyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAxNzI4MDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAxNzI4MDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIG5vdGlmaWNhdGlvbiAxIHdlZWsgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDcnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIHRlbXBsYXRlIDEgd2VlayBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA2MDQ4MDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTI1IDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiA2MDQ4MDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBtaW51dGVzIGJlZm9yZSBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDgnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gY3VzdG9tIDIgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjM6NTg6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBiZWZvcmUgc3RhcnQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGN1c3RvbSAyIGhvdXJzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjI6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgZGF5cyBiZWZvcmUgc3RhcnQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxMCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBjdXN0b20gMiBkYXlzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIG1pbnV0ZXMgYWZ0ZXIgc3RhcnQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxMScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgbWludXRlcyBhZnRlciBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAyOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBhZnRlciBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDEyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMiBob3VycyBhZnRlciBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMjowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGRheXMgYWZ0ZXIgc3RhcnQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxMycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgZGF5cyBhZnRlciBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAzIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBtaW51dGVzIGJlZm9yZSBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxNCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgbWludXRlcyBiZWZvcmUgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3JlZW5kJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAyMzo1ODowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3JlZW5kJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBiZWZvcmUgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTUnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIGhvdXJzIGJlZm9yZSBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3JlZW5kJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAyMjowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgZGF5cyBiZWZvcmUgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTYnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIGRheXMgYmVmb3JlIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgbWludXRlcyBhZnRlciBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxNycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgbWludXRlcyBhZnRlciBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDI6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBhZnRlciBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxOCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgaG91cnMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMjowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBkYXlzIGFmdGVyIGVuZAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDE5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMiBkYXlzIGFmdGVyIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wNCAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMjAnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gY3VzdG9tIDAgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBob3VycyBiZWZvcmUgc3RhcnQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAyMScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBjdXN0b20gMCBob3VycyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIGRheXMgYmVmb3JlIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMjInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gY3VzdG9tIDAgZGF5cyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBtaW51dGVzIGFmdGVyIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMjMnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAwIG1pbnV0ZXMgYWZ0ZXIgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgaG91cnMgYWZ0ZXIgc3RhcnQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAyNCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDAgaG91cnMgYWZ0ZXIgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBkYXlzIGFmdGVyIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMjUnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAwIGRheXMgYWZ0ZXIgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgbWludXRlcyBiZWZvcmUgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMjYnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAwIG1pbnV0ZXMgYmVmb3JlIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgaG91cnMgYmVmb3JlIGVuZAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDI3JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMCBob3VycyBiZWZvcmUgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIGRheXMgYmVmb3JlIGVuZAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDI4JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMCBkYXlzIGJlZm9yZSBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIG1pbnV0ZXMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMjknLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAwIG1pbnV0ZXMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgaG91cnMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzAnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAwIGhvdXJzIGFmdGVyIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgZGF5cyBhZnRlciBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAzMScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDAgZGF5cyBhZnRlciBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gLTIzNDUgZGF5cyBhZnRlciBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAzMicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIC0yMzQ1IGRheXMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAtMjM0NSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzMnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAyMzo1ODowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjM6NTg6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAyMzo1ODowMCcsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gZGF0ZXRpbWUgbm90aWZpY2F0aW9uIDIgaG91cnMgYmVmb3JlIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIGhvdXJzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjI6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIyOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjI6MDA6MDAnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyIGRheXMgYmVmb3JlIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzUnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIGRheXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMCAwMDowMDowMCcsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gZGF0ZXRpbWUgbm90aWZpY2F0aW9uIDIgbWludXRlcyBhZnRlciBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAzNicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgbWludXRlcyBhZnRlciBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAyOjAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMjowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAyOjAwJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSBkYXRldGltZSBub3RpZmljYXRpb24gMiBob3VycyBhZnRlciBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAzNycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgaG91cnMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMjowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDI6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMjowMDowMCcsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gZGF0ZXRpbWUgbm90aWZpY2F0aW9uIDIgZGF5cyBhZnRlciBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAzOCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgZGF5cyBhZnRlciBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTA0IDAwOjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wNCAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTA0IDAwOjAwOjAwJywKICAgICAgICB9LAogICAgfSwKKTsKCiMgbm90aWZpY2F0aW9uIGNyZWF0ZSB0ZXN0IGV4ZWN1dGlvbgpmb3IgbXkgJFRlc3QgKEBOb3RpZmljYXRpb25DcmVhdGVUZXN0cykgewoKICAgICMgY3JlYXRlIGFwcG9pbnRtZW50CiAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgJXsgJFRlc3QtPntEYXRhfSB9LAogICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgKTsKCiAgICAjIHZlcmlmeSBhcHBvaW50bWVudCBjcmVhdGlvbgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCBjcmVhdGVkIC0gJyAuICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0sCiAgICApOwoKICAgICMgcmV0cmlldmUgc3RvcmVkIGFwcG9pbnRtZW50IGluZm9ybWF0aW9uCiAgICBteSAlQXBwb2ludG1lbnREYXRhID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgKTsKCiAgICAjIHZlcmlmeSBhcHBvaW50bWVudCBkYXRhIGdldAogICAgbXkgJENyZWF0ZWQgPSBJc0hhc2hSZWZXaXRoRGF0YSggXCVBcHBvaW50bWVudERhdGEgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDcmVhdGVkLAogICAgICAgICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgZGF0YSByZXRyaWV2ZWQgLSAnIC4gJFRlc3QtPntEYXRhfS0+e0Rlc2NyaXB0aW9ufSwKICAgICk7CgogICAgIyB2ZXJpZnkgcmVzdWx0cwogICAgZm9yIG15ICRSZXN1bHRLZXkgKCBzb3J0IGtleXMgJXsgJFRlc3QtPntSZXN1bHR9IH0gKSB7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJEFwcG9pbnRtZW50RGF0YXskUmVzdWx0S2V5fSwKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LT57JFJlc3VsdEtleX0sCiAgICAgICAgICAgICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgcmVzdWx0OiAnIC4gJFJlc3VsdEtleSAuICcgLSAnIC4gJFRlc3QtPntEYXRhfS0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICApOwogICAgfQp9CgojIG5vdGlmaWNhdGlvbiB1cGRhdGUgdGVzdCBkZWZpbml0aW9uCm15IEBOb3RpZmljYXRpb25VcGRhdGVUZXN0cyA9ICgKCiAgICAjIHVwZGF0ZSBhcHBvaW50bWVudCBmcm9tIG5vIHRlbXBsYXRlIHRvIHdyb25nIHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdCZWZvcmUgdXBkYXRlIG5vIG5vdGlmaWNhdGlvbicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIHdyb25nIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZScsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdXcm9uZ05vdGlmaWNhdGlvblRlbXBsYXRlJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ1dyb25nTm90aWZpY2F0aW9uVGVtcGxhdGUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB1cGRhdGUgYXBwb2ludG1lbnQgZnJvbSBubyB0ZW1wbGF0ZSB0byBzdGFydHRpbWUgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ0JlZm9yZSB1cGRhdGUgbm8gbm90aWZpY2F0aW9uJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIERhdGFBZnRlciA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIHRlbXBsYXRlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdTdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIHVwZGF0ZSBhcHBvaW50bWVudCBmcm9tIHN0YXJ0dGltZSB0ZW1wbGF0ZSB0byAzMCBtaW51dGVzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZQogICAgewogICAgICAgIERhdGFCZWZvcmUgPT4gewoKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gdGVtcGxhdGUgMzAgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAnU3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgRGF0YUFmdGVyID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gdGVtcGxhdGUgMzAgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAxODAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAyMzozMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMTgwMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gMzAgbWludXRlcyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUgdG8gMTIgaG91cnMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgNCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIHRlbXBsYXRlIDEyIGhvdXJzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZScsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDE4MDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAxMiBob3VycyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA0MzIwMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMTI6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+IDQzMjAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB1cGRhdGUgYXBwb2ludG1lbnQgZnJvbSAxMiBob3VycyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUgdG8gMiBkYXlzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZQogICAgewogICAgICAgIERhdGFCZWZvcmUgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDUnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAyIGRheXMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gNDMyMDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDUnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAyIGRheXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gMTcyODAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMTcyODAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB1cGRhdGUgYXBwb2ludG1lbnQgZnJvbSAyIGRheXMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlIHRvIG5vIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZQogICAgewogICAgICAgIERhdGFCZWZvcmUgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDYnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZScsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDE3MjgwMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIERhdGFBZnRlciA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgNicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdCZWZvcmUgdXBkYXRlIHRvIG5vIG5vdGlmaWNhdGlvbicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB1cGRhdGUgYXBwb2ludG1lbnQgZnJvbSAxMiBob3VycyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUgdG8gY3VzdG9tIDIgbWludXRlcyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA3JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gdGVtcGxhdGUgY3VzdG9tIDIgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA0MzIwMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIERhdGFBZnRlciA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDcnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIGN1c3RvbSAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIzOjU4OjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgojIHVwZGF0ZSBhcHBvaW50bWVudCBmcm9tIGN1c3RvbSAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlIHRvIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA4JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGhvdXJzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIERhdGFBZnRlciA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgOCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAyMjowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGhvdXJzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZSB0byBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgZGF5cyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGRheXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIERhdGFBZnRlciA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgOScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBkYXlzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGRheXMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlIHRvIG5vdGlmaWNhdGlvbiBkYXRlIDIgbWludXRlcyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTAnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIGRhdGUgMiBtaW51dGVzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgRGF0YUFmdGVyID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTAnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIGRhdGUgMiBtaW51dGVzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjM6NTg6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIzOjU4OjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjM6NTg6MDAnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGhvdXJzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZSB0byBubyBub3RpZmljYXRpb24gdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxMScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBkYXlzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIERhdGFBZnRlciA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZScsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB1cGRhdGUgYXBwb2ludG1lbnQgZnJvbSBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgaG91cnMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlIHRvIG5vIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZQogICAgIyB2ZXJpZnkgdGhhdCBub3QgbmVlZGVkIHZhbHVlcyBhcmUgZmx1c2hlZCBhZnRlcndhcmRzCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgZGF5cyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxMScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSB0byBubyBub3RpZmljYXRpb24gdGVtcGxhdGUnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMzAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKKTsKCiMgbm90aWZpY2F0aW9uIHVwZGF0ZSB0ZXN0IGV4ZWN1dGlvbgpmb3IgbXkgJFRlc3QgKEBOb3RpZmljYXRpb25VcGRhdGVUZXN0cykgewoKICAgICMgY3JlYXRlIGFwcG9pbnRtZW50CiAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgJXsgJFRlc3QtPntEYXRhQmVmb3JlfSB9LAogICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgKTsKCiAgICAjIHZlcmlmeSBhcHBvaW50bWVudCBjcmVhdGlvbgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCBjcmVhdGVkIC0gJyAuICRUZXN0LT57RGF0YUJlZm9yZX0tPntEZXNjcmlwdGlvbn0sCiAgICApOwoKICAgICMgcmV0cmlldmUgc3RvcmVkIGFwcG9pbnRtZW50IGluZm9ybWF0aW9uCiAgICBteSAlQXBwb2ludG1lbnREYXRhID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgKTsKCiAgICAjIHZlcmlmeSBhcHBvaW50bWVudCBkYXRhIGdldAogICAgbXkgJENyZWF0ZWQgPSBJc0hhc2hSZWZXaXRoRGF0YSggXCVBcHBvaW50bWVudERhdGEgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDcmVhdGVkLAogICAgICAgICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgZGF0YSByZXRyaWV2ZWQgLSAnIC4gJFRlc3QtPntEYXRhQmVmb3JlfS0+e0Rlc2NyaXB0aW9ufSwKICAgICk7CgogICAgIyB1cGRhdGUgYXBwb2ludG1lbnQKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAleyAkVGVzdC0+e0RhdGFBZnRlcn0gfSwKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICk7CgogICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgdXBkYXRlCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IHVwZGF0ZWQgLSAnIC4gJFRlc3QtPntEYXRhQWZ0ZXJ9LT57RGVzY3JpcHRpb259LAogICAgKTsKCiAgICAjIHJldHJpZXZlIHN0b3JlZCBhcHBvaW50bWVudCBpbmZvcm1hdGlvbgogICAgJUFwcG9pbnRtZW50RGF0YSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICk7CgogICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgZGF0YSBnZXQKICAgICRDcmVhdGVkID0gSXNIYXNoUmVmV2l0aERhdGEoIFwlQXBwb2ludG1lbnREYXRhICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ3JlYXRlZCwKICAgICAgICAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IGRhdGEgcmV0cmlldmVkIC0gJyAuICRUZXN0LT57RGF0YUJlZm9yZX0tPntEZXNjcmlwdGlvbn0sCiAgICApOwoKICAgICMgdmVyaWZ5IHJlc3VsdHMKICAgIGZvciBteSAkUmVzdWx0S2V5ICggc29ydCBrZXlzICV7ICRUZXN0LT57UmVzdWx0fSB9ICkgewoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRBcHBvaW50bWVudERhdGF7JFJlc3VsdEtleX0sCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fS0+eyRSZXN1bHRLZXl9LAogICAgICAgICAgICAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IHJlc3VsdDogJyAuICRSZXN1bHRLZXkgLiAnIC0gJyAuICRUZXN0LT57RGF0YUFmdGVyfS0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICApOwogICAgfQp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKIyBvdmVycmlkZSBsb2NhbCB0aW1lIHpvbmUgZm9yIGR1cmF0aW9uIG9mIHRoZSB0ZXN0CmxvY2FsICRFTlZ7VFp9ID0gJ1VUQyc7CgojIGdldCBoZWxwZXIgb2JqZWN0CiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFJlc3RvcmVEYXRhYmFzZSA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgojIGdldCBjYWxlbmRhciBoZWxwZXIgb2JqZWN0Cm15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgojCiMgVGVzdHMgZm9yIFRpbWVDaGVjaygpCiMKbXkgQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICA9PiAnTWlzc2luZyBUaW1lJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJzIwMTYtMDEtMDEgMDA6MDE6MDAnLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ01pc3NpbmcgT3JpZ2luYWxUaW1lJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBUaW1lID0+ICcyMDE2LTAyLTAxIDAwOjAyOjAwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBbGwgcGFyYW1zJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJzIwMTYtMDEtMDEgMDA6MDE6MDAnLAogICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJzIwMTYtMDItMDEgMDA6MDI6MDAnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ICA9PiAnMjAxNi0wMi0wMSAwMDowMTowMCcsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lQ2hlY2soCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIlRpbWVDaGVjayAtICRUZXN0LT57TmFtZX0gLSBTdWNjZXNzIiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkUmVzdWx0LAogICAgICAgICAgICAiVGltZUNoZWNrIC0gJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MgIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIFN5c3RlbVRpbWVHZXQoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FsbCBwYXJhbXMnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAnMjAxNi0wMS0wMSAwMDowMTowMCcsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+ICcxNDUxNjA2NDYwJywKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIlN5c3RlbVRpbWVHZXQgLSAkVGVzdC0+e05hbWV9IC0gU3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgIlN5c3RlbVRpbWVHZXQgLSAkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyAiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgVGltZXN0YW1wR2V0KCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBbGwgcGFyYW1zJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICcxNDUxNjA2NDYwJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCAgPT4gJzIwMTYtMDEtMDEgMDA6MDE6MDAnLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkUmVzdWx0LAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0sCiAgICAgICAgICAgICJUaW1lc3RhbXBHZXQgLSAkVGVzdC0+e05hbWV9IC0gU3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgIlRpbWVzdGFtcEdldCAtICRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzICIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBDdXJyZW50VGltZXN0YW1wR2V0KCkgYW5kIEN1cnJlbnRTeXN0ZW1UaW1lKCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewogICAgbXkgJFJlc3VsdFRpbWVzdGFtcCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFRpbWVzdGFtcEdldCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CiAgICBteSAkUmVzdWx0U3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFN5c3RlbVRpbWUoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFJlc3VsdFRpbWVzdGFtcCwKICAgICAgICAgICAgIkN1cnJlbnRUaW1lc3RhbXBHZXQgLSAkVGVzdC0+e05hbWV9IC0gU3VjY2VzcyIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFJlc3VsdFN5c3RlbVRpbWUsCiAgICAgICAgICAgICJDdXJyZW50U3lzdGVtVGltZSAtICRUZXN0LT57TmFtZX0gLSBTdWNjZXNzIiwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFJlc3VsdFRpbWVzdGFtcCA9fiAvXGR7NH0tXGR7Mn0tXGR7Mn1cc1xkezJ9OlxkezJ9OlxkezJ9LywKICAgICAgICAgICAgIkN1cnJlbnRUaW1lc3RhbXBHZXQgLSBFeHBlY3RlZCBmb3JtYXQiLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBJc0ludGVnZXIoJFJlc3VsdFN5c3RlbVRpbWUpICYmICRSZXN1bHRTeXN0ZW1UaW1lID4gMTQ2MzA4MTc4MSwKICAgICAgICAgICAgIkN1cnJlbnRTeXN0ZW1UaW1lIC0gRXhwZWN0ZWQgZm9ybWF0IiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkUmVzdWx0VGltZXN0YW1wLAogICAgICAgICAgICAiQ3VycmVudFRpbWVzdGFtcEdldCAtICRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzICIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRSZXN1bHRTeXN0ZW1UaW1lLAogICAgICAgICAgICAiQ3VycmVudFN5c3RlbVRpbWUgLSAkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyAiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgRGF0ZUdldCgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ05vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnRnJpZGF5LCAyMDE2LTEyLTIzIDE0OjA1OjEwJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICcxNDgyNTAxOTEwJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiBbCiAgICAgICAgICAgIDEwLAogICAgICAgICAgICA1LAogICAgICAgICAgICAxNCwKICAgICAgICAgICAgMjMsCiAgICAgICAgICAgIDEyLAogICAgICAgICAgICAyMDE2LAogICAgICAgICAgICA1LAogICAgICAgIF0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1N1bmRheSwgMjAxNi0wNS0wOCAwMjowMzowNCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAnMTQ2MjY3Mjk4NCcsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gWwogICAgICAgICAgICA0LAogICAgICAgICAgICAzLAogICAgICAgICAgICAyLAogICAgICAgICAgICA4LAogICAgICAgICAgICA1LAogICAgICAgICAgICAyMDE2LAogICAgICAgICAgICA3LAogICAgICAgIF0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICBteSBAUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICBcQFJlc3VsdCwKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LAogICAgICAgICAgICAiRGF0ZUdldCAtICRUZXN0LT57TmFtZX0gLSBSZXN1bHQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIHNjYWxhciBAUmVzdWx0LAogICAgICAgICAgICAiRGF0ZUdldCAtICRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzICIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBEYXRlMlN5c3RlbVRpbWUoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ01pc2luZyBZZWFyJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBNb250aCAgPT4gJzEnLAogICAgICAgICAgICBEYXkgICAgPT4gJzEnLAogICAgICAgICAgICBIb3VyICAgPT4gJzEnLAogICAgICAgICAgICBNaW51dGUgPT4gJzAnLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ01pc2luZyBNb250aCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgWWVhciAgID0+ICcyMDE2JywKICAgICAgICAgICAgRGF5ICAgID0+ICcxJywKICAgICAgICAgICAgSG91ciAgID0+ICcxJywKICAgICAgICAgICAgTWludXRlID0+ICcwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdNaXNpbmcgRGF5JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBZZWFyICAgPT4gJzIwMTYnLAogICAgICAgICAgICBNb250aCAgPT4gJzEnLAogICAgICAgICAgICBIb3VyICAgPT4gJzEnLAogICAgICAgICAgICBNaW51dGUgPT4gJzAnLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJzIwMTYtMDEtMDEgMDE6MDA6MDAnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFllYXIgICA9PiAnMjAxNicsCiAgICAgICAgICAgIE1vbnRoICA9PiAnMScsCiAgICAgICAgICAgIERheSAgICA9PiAnMScsCiAgICAgICAgICAgIEhvdXIgICA9PiAnMScsCiAgICAgICAgICAgIE1pbnV0ZSA9PiAnMCcsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+ICcxNDUxNjEwMDAwJywKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGUyU3lzdGVtVGltZSgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LAogICAgICAgICAgICAiRGF0ZTJTeXN0ZW1UaW1lIC0gJFRlc3QtPntOYW1lfSAtIFJlc3VsdCIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgIkRhdGUyU3lzdGVtVGltZSAtICRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzICIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBBZGRQZXJpb2QoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ01pc2luZyBUaW1lJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBZZWFycyAgPT4gJzEnLAogICAgICAgICAgICBNb250aHMgPT4gJzEnLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FsbCBwYXJhbXMnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpbWUgICA9PiAnMTQ2Mjg3MTE2MicsCiAgICAgICAgICAgIFllYXJzICA9PiAnMScsCiAgICAgICAgICAgIE1vbnRocyA9PiAnMScsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+ICcxNDk3MDg1NTYyJywKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkFkZFBlcmlvZCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LAogICAgICAgICAgICAiQWRkUGVyaW9kIC0gJFRlc3QtPntOYW1lfSAtIFJlc3VsdCIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgIkFkZFBlcmlvZCAtICRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzICIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBUaW1lem9uZU9mZnNldEdldCgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ05vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnVVRDIChDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpbWV6b25lSUQgPT4gJ1VUQycsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+IDAsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NFVCAoQ2VudHJhbCBFdXJvcGVhbiBUaW1lKScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVGltZXpvbmVJRCA9PiAnRXVyb3BlL0JlcmxpbicsCiAgICAgICAgICAgIFRpbWUgICAgICAgPT4gMTQ1Njc4NjgwMCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCAgPT4gMSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ0VEVCAoQ2VudHJhbCBFdXJvcGVhbiBTdW1tZXIgVGltZSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpbWV6b25lSUQgPT4gJ0V1cm9wZS9CZXJsaW4nLAogICAgICAgICAgICBUaW1lICAgICAgID0+IDE0NjI4NzExNjIsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+IDIsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NTVCAoQ2VudHJhbCBTdGFuZGFyZCBUaW1lKScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVGltZXpvbmVJRCA9PiAnQW1lcmljYS9NZXhpY29fQ2l0eScsCiAgICAgICAgICAgIFRpbWUgICAgICAgPT4gMTQ1Njc4NjgwMCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCAgPT4gLTYsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NEVCAoQ2VudHJhbCBEYXlsaWdodCBUaW1lKScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVGltZXpvbmVJRCA9PiAnQW1lcmljYS9NZXhpY29fQ2l0eScsCiAgICAgICAgICAgIFRpbWUgICAgICAgPT4gMTQ2Mjg3MTE2MiwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCAgPT4gLTUsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0lTVCAoSW5kaWEgU3RhbmRhcmQgVGltZSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpbWV6b25lSUQgPT4gJ0FzaWEvQ2FsY3V0dGEnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ICA9PiA1LjUsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ05QVCAoTmVwYWwgVGltZSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpbWV6b25lSUQgPT4gJ0FzaWEvS2F0aG1hbmR1JywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCAgPT4gNS43NSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWV6b25lT2Zmc2V0R2V0KAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkUmVzdWx0LAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0sCiAgICAgICAgICAgICJUaW1lem9uZU9mZnNldEdldCAtICRUZXN0LT57TmFtZX0gLSBSZXN1bHQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICJUaW1lem9uZU9mZnNldEdldCAtICRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzICIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBXZWVrRGV0YWlsc0dldCgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ05vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnU3VuZGF5LCAyMDE3LTA1LTE0IDA1OjA1OjA1LCBDVzE5JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICcxNDk0NzM4MzA1JywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiBbCiAgICAgICAgICAgIDcsCiAgICAgICAgICAgIDE5LAogICAgICAgIF0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICBteSBAUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5XZWVrRGV0YWlsc0dldCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXEBSZXN1bHQsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIldlZWtEZXRhaWxzR2V0IC0gJFRlc3QtPntOYW1lfSAtIFJlc3VsdCIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgc2NhbGFyIEBSZXN1bHQsCiAgICAgICAgICAgICJXZWVrRGV0YWlsc0dldCAtICRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzICIsCiAgICAgICAgKTsKICAgIH0KfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgZ2V0IG5lZWRlZCBvYmplY3RzCm15ICRDb25maWdPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7Cm15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwpteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7Cm15ICRQbHVnaW5PYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6UGx1Z2luJyk7Cm15ICRNYWluT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7Cm15ICRHcm91cE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwpteSAkVXNlck9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwpteSAkVGlja2V0T2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgojIGdldCByZWdpc3RlcmVkIHBsdWdpbiBtb2R1bGVzCm15ICRQbHVnaW5Db25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkFwcG9pbnRtZW50Q2FsZW5kYXI6OlBsdWdpbiIpOwpteSAkUGx1Z2luQ291bnQgID0gc2NhbGFyIGtleXMgJXskUGx1Z2luQ29uZmlnfTsKCm15ICRQbHVnaW5MaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlzdCgpOwoKJFNlbGYtPlRydWUoCiAgICAkUGx1Z2luTGlzdCwKICAgICdQbHVnaW4gbGlzdCBsb2FkZWQnLAopOwoKJFNlbGYtPklzKAogICAgc2NhbGFyIGtleXMgJXskUGx1Z2luTGlzdH0sCiAgICAkUGx1Z2luQ291bnQsCiAgICAnUmVnaXN0ZXJlZCBwbHVnaW4gY291bnQnLAopOwoKbXkgJFBsdWdpbktleVRpY2tldDsKCiMgY2hlY2sgYWxsIHJlZ2lzdGVyZWQgcGx1Z2luIG1vZHVsZXMKUExVR0lOOgpmb3IgbXkgJFBsdWdpbktleSAoIHNvcnQga2V5cyAleyRQbHVnaW5Db25maWd9ICkgewoKICAgIG15ICRHZW5lcmljTW9kdWxlID0gJFBsdWdpbkNvbmZpZy0+eyRQbHVnaW5LZXl9LT57TW9kdWxlfTsKICAgIG5leHQgUExVR0lOIGlmICEkR2VuZXJpY01vZHVsZTsKCiAgICBpZiAoICRHZW5lcmljTW9kdWxlIGVxICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbjo6VGlja2V0JyApIHsKICAgICAgICAkUGx1Z2luS2V5VGlja2V0ID0gJFBsdWdpbktleTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIG1vZHVsZSBjYW4gYmUgcmVxdWlyZWQKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRNYWluT2JqZWN0LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSwKICAgICAgICAiUmVxdWlyZWQgJyRHZW5lcmljTW9kdWxlJyBwbHVnaW4gbW9kdWxlIiwKICAgICk7CgogICAgbXkgJFBsdWdpbk1vZHVsZSA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgIyBjaGVjayBpZiBtb2R1bGUgaGFzIGJlZW4gbG9hZGVkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkUGx1Z2luTW9kdWxlLAogICAgICAgICJQbHVnaW4gbW9kdWxlIGxvYWRlZCBzdWNjZXNzZnVsbHkiLAogICAgKTsKCiAgICAjIGNoZWNrIGNsYXNzIG5hbWUKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRQbHVnaW5Nb2R1bGUtPmlzYSgkR2VuZXJpY01vZHVsZSksCiAgICAgICAgJ1BsdWdpbiBtb2R1bGUgaGFzIGNvcnJlY3QgcGFja2FnZSBuYW1lJywKICAgICk7CgogICAgIyBjaGVjayByZXF1aXJlZCBtZXRob2RzCiAgICBmb3IgbXkgJE1ldGhvZE5hbWUgKHF3KExpbmtBZGQgTGlua0xpc3QgU2VhcmNoKSkgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkUGx1Z2luTW9kdWxlLT5jYW4oJE1ldGhvZE5hbWUpLAogICAgICAgICAgICAiUGx1Z2luIG1vZHVsZSBpbXBsZW1lbnRzICRNZXRob2ROYW1lKCkiLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFBsdWdpblVSTCA9ICRQbHVnaW5Db25maWctPnskUGx1Z2luS2V5fS0+e1VSTH07CgogICAgIyBjaGVjayBpZiBVUkwgY29udGFpbnMgSUQgcGxhY2Vob2xkZXIKICAgICRTZWxmLT5UcnVlKAogICAgICAgIHNjYWxhciAkUGx1Z2luVVJMID1+IC8lcy8sCiAgICAgICAgJ1BsdWdpbiBtb2R1bGUgVVJMIGNvbnRhaW5zIElEIHBsYWNlaG9sZGVyJywKICAgICk7Cn0KCiMgY2hlY2sgdGlja2V0IHBsdWdpbiBpZiByZWdpc3RlcmVkCmlmICgkUGx1Z2luS2V5VGlja2V0KSB7CgogICAgIyBjcmVhdGUgdGVzdCBncm91cAogICAgbXkgJEdyb3VwTmFtZSA9ICd0ZXN0LWNhbGVuZGFyLWdyb3VwLScgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICAgICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRHcm91cElELAogICAgICAgICJUZXN0IGdyb3VwICRHcm91cElEIGNyZWF0ZWQiLAogICAgKTsKCiAgICAjIGNyZWF0ZSB0ZXN0IHVzZXIKICAgIG15ICRVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICBHcm91cHMgPT4gWyAndXNlcnMnLCAkR3JvdXBOYW1lIF0sCiAgICApOwogICAgbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKCBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRVc2VySUQsCiAgICAgICAgIlRlc3QgdXNlciAkVXNlcklEIGNyZWF0ZWQiLAogICAgKTsKCiAgICBteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICMgY3JlYXRlIGEgdGVzdCB0aWNrZXQKICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICBUaXRsZSAgICAgICAgPT4gJ1Rlc3QgVGlja2V0ICcgLiAkUmFuZG9tSUQsCiAgICAgICAgUXVldWUgICAgICAgID0+ICdSYXcnLAogICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICBQcmlvcml0eSAgICAgPT4gJzMgbm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ29wZW4nLAogICAgICAgIEN1c3RvbWVyTm8gICA9PiAnMTIzNDY1JywKICAgICAgICBDdXN0b21lclVzZXIgPT4gJ2N1c3RvbWVyQGV4YW1wbGUuY29tJywKICAgICAgICBPd25lcklEICAgICAgPT4gJFVzZXJJRCwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgIlRpY2tldENyZWF0ZSgpIC0gJFRpY2tldElEIiwKICAgICk7CiAgICBteSAkVGlja2V0TnVtYmVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICA9PiAkVXNlcklELAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRUaWNrZXROdW1iZXIsCiAgICAgICAgIlRpY2tldE51bWJlckxvb2t1cCgpIC0gJFRpY2tldE51bWJlciIsCiAgICApOwoKICAgICMgY3JldGUgdGVzdCBjYWxlbmRhcgogICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgICAgICBDYWxlbmRhck5hbWUgPT4gJ1Rlc3QgQ2FsZW5kYXIgJyAuICRSYW5kb21JRCwKICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICJDYWxlbmRhckNyZWF0ZSgpIC0gJENhbGVuZGFye0NhbGVuZGFySUR9IiwKICAgICk7CgogICAgIyBjcmVhdGUgdGVzdCBhcHBvaW50bWVudAogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFRpdGxlICAgICAgPT4gJ1Rlc3QgYXBwb2ludG1lbnQgJyAuICRSYW5kb21JRCwKICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAxLTAxIDEyOjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAxLTAxIDEzOjAwOjAwJywKICAgICAgICBUaW1lem9uZUlEID0+IDAsCiAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQXBwb2ludG1lbnRJRCwKICAgICAgICAiQXBwb2ludG1lbnRDcmVhdGUoKSAtICRBcHBvaW50bWVudElEIiwKICAgICk7CgogICAgIyBzZWFyY2ggdGhlIHRpY2tldCB2aWEgdGlja2V0IG51bWJlcgogICAgbXkgJFJlc3VsdExpc3QgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5TZWFyY2goCiAgICAgICAgU2VhcmNoICAgID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgUGx1Z2luS2V5ID0+ICRQbHVnaW5LZXlUaWNrZXQsCiAgICAgICAgVXNlcklEICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAkUmVzdWx0TGlzdCwKICAgICAgICB7CiAgICAgICAgICAgICRUaWNrZXRJRCA9PiAiJFRpY2tldE51bWJlciBUZXN0IFRpY2tldCAkUmFuZG9tSUQiLAogICAgICAgIH0sCiAgICAgICAgJ1BsdWdpblNlYXJjaCgpIC0gU2VhcmNoIHJlc3VsdHMgKGJ5IHRpY2tldCBudW1iZXIpJwogICAgKTsKCiAgICAjIHNlYXJjaCB0aGUgdGlja2V0IHZpYSB0aWNrZXQgaWQKICAgICRSZXN1bHRMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luU2VhcmNoKAogICAgICAgIE9iamVjdElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgUGx1Z2luS2V5ID0+ICRQbHVnaW5LZXlUaWNrZXQsCiAgICAgICAgVXNlcklEICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAkUmVzdWx0TGlzdCwKICAgICAgICB7CiAgICAgICAgICAgICRUaWNrZXRJRCA9PiAiJFRpY2tldE51bWJlciBUZXN0IFRpY2tldCAkUmFuZG9tSUQiLAogICAgICAgIH0sCiAgICAgICAgJ1BsdWdpblNlYXJjaCgpIC0gU2VhcmNoIHJlc3VsdHMgKGJ5IHRpY2tldCBJRCknCiAgICApOwoKICAgICMgbGluayBhcHBvaW50bWVudCB3aXRoIHRoZSB0aWNrZXQKICAgIG15ICRTdWNjZXNzID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0FkZCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleVRpY2tldCwKICAgICAgICBQbHVnaW5EYXRhICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdQbHVnaW5MaW5rQWRkKCkgLSBMaW5rIGFwcG9pbnRtZW50IHRvIHRoZSB0aWNrZXQnLAogICAgKTsKCiAgICAjIHZlcmlmeSBsaW5rCiAgICBteSAkTGlua0xpc3QgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaW5rTGlzdCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleVRpY2tldCwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRMaW5rTGlzdC0+eyRUaWNrZXRJRH0sCiAgICAgICAgJ1BsdWdpbkxpbmtMaXN0KCkgLSBWZXJpZnkgbGluayB0byB0aGUgdGlja2V0JwogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExpbmtMaXN0LT57JFRpY2tldElEfS0+e0xpbmtJRH0sCiAgICAgICAgJFRpY2tldElELAogICAgICAgICdUaWNrZXRJRCcsCiAgICApOwoKICAgICMgY2hlY2sgVVJMCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkTGlua0xpc3QtPnskVGlja2V0SUR9LT57TGlua1VSTH0gPX4gL1RpY2tldElEPSRUaWNrZXRJRC8sCiAgICAgICAgJ1RpY2tldCBVUkwgY29udGFpbnMgdGlja2V0IElEJwogICAgICAgICksCgogICAgICAgICMgbGluayBuYW1lCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICRMaW5rTGlzdC0+eyRUaWNrZXRJRH0tPntMaW5rTmFtZX0sCiAgICAgICAgIiRUaWNrZXROdW1iZXIgVGVzdCBUaWNrZXQgJFJhbmRvbUlEIiwKICAgICAgICAnTGluayBuYW1lJwogICAgICAgICksCgogICAgICAgICMgZGVsZXRlIGxpbmtzCiAgICAgICAgJFN1Y2Nlc3MgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaW5rRGVsZXRlKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgJ1BsdWdpbkxpbmtEZWxldGUoKSAtIExpbmtzIGRlbGV0ZWQnCiAgICApOwoKICAgICMgdmVyaWZ5IGxpbmtzIGhhdmUgYmVlbiBkZWxldGVkCiAgICAkTGlua0xpc3QgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaW5rTGlzdCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleVRpY2tldCwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAkTGlua0xpc3QsCiAgICAgICAge30sCiAgICAgICAgJ1BsdWdpbkxpbmtMaXN0KCkgLSBFbXB0eSBsaW5rIGxpc3QnLAogICAgKTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgZ2V0IG5lZWRlZCBvYmplY3RzCm15ICRNYWluT2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7Cm15ICRHcm91cE9iamVjdCAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwpteSAkVXNlck9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwpteSAkUXVldWVPYmplY3QgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKbXkgJER5bmFtaWNGaWVsZE9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwpteSAkRHluYW1pY0ZpZWxkVmFsdWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkVmFsdWUnKTsKbXkgJENhbGVuZGFyT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7Cm15ICRDYWxlbmRhckhlbHBlck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7Cm15ICRBcHBvaW50bWVudE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKbXkgJFRpY2tldE9iamVjdCAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiMgY3JlYXRlIHRlc3QgdXNlcgpteSAkVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoKTsKbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKCBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiApOwokU2VsZi0+VHJ1ZSgKICAgICRVc2VySUQsCiAgICAiVGVzdFVzZXJDcmVhdGUgLSAkVXNlcklEIiwKKTsKCiMgY3JlYXRlIHRlc3QgZ3JvdXAKbXkgJEdyb3VwTmFtZSA9ICdHcm91cCcgLiAkUmFuZG9tSUQ7Cm15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwokU2VsZi0+VHJ1ZSgKICAgICRHcm91cElELAogICAgIkdyb3VwQWRkIC0gJEdyb3VwTmFtZSAoJEdyb3VwSUQpIiwKKTsKCiMgYWRkIHRlc3QgdXNlciB0byB0ZXN0IGdyb3VwCm15ICRTdWNjZXNzID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgR0lEICAgICAgICA9PiAkR3JvdXBJRCwKICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgIHJ3ID0+IDEsCiAgICB9LAogICAgVXNlcklEID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiUGVybWlzc2lvbkdyb3VwVXNlckFkZCAtIFRlc3QgdXNlciAkVXNlcklEIGFkZGVkIHRvIHRlc3QgZ3JvdXAgJEdyb3VwSUQiLAopOwoKIyBjcmVhdGUgdGVzdCBxdWV1ZSB3aXRoIGVzY2FsYXRpb24gcnVsZXMKbXkgJFF1ZXVlTmFtZSA9ICdRdWV1ZScgLiAkUmFuZG9tSUQ7Cm15ICRRdWV1ZUlEICAgPSAkUXVldWVPYmplY3QtPlF1ZXVlQWRkKAogICAgTmFtZSAgICAgICAgICAgICAgICA9PiAkUXVldWVOYW1lLAogICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAxLAogICAgR3JvdXBJRCAgICAgICAgICAgICA9PiAkR3JvdXBJRCwKICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgPT4gMzAsCiAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDcwLAogICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAyNDAsCiAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDgwLAogICAgU29sdXRpb25UaW1lICAgICAgICA9PiAyNDQwLAogICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiA5MCwKICAgIFN5c3RlbUFkZHJlc3NJRCAgICAgPT4gMSwKICAgIFNhbHV0YXRpb25JRCAgICAgICAgPT4gMSwKICAgIFNpZ25hdHVyZUlEICAgICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gMSwKICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ1NvbWUgQ29tbWVudCcsCik7CiRTZWxmLT5UcnVlKAogICAgJFF1ZXVlSUQsCiAgICAiUXVldWVBZGQgLSAkUXVldWVOYW1lICgkUXVldWVJRCkiLAopOwoKIyBjcmVhdGUgdGVzdCBkeW5hbWljIGZpZWxkcwpteSBARHluYW1pY0ZpZWxkcyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgICAgID0+ICdEYXRlJyAuICRSYW5kb21JRCwKICAgICAgICBMYWJlbCAgICAgID0+ICdEYXRlJyAuICRSYW5kb21JRCwKICAgICAgICBDb25maWcgICAgID0+IHt9LAogICAgICAgIEZpZWxkT3JkZXIgPT4gMTAwMDAsCiAgICAgICAgRmllbGRUeXBlICA9PiAnRGF0ZScsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgID0+ICdEYXRlVGltZScgLiAkUmFuZG9tSUQsCiAgICAgICAgTGFiZWwgICAgICA9PiAnRGF0ZVRpbWUnIC4gJFJhbmRvbUlELAogICAgICAgIENvbmZpZyAgICAgPT4ge30sCiAgICAgICAgRmllbGRPcmRlciA9PiAxMDAwMCwKICAgICAgICBGaWVsZFR5cGUgID0+ICdEYXRlVGltZScsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgfSwKKTsKZm9yIG15ICREeW5hbWljRmllbGQgKEBEeW5hbWljRmllbGRzKSB7CiAgICBteSAkRHluYW1pY0ZpZWxkSUQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRBZGQoCiAgICAgICAgJXskRHluYW1pY0ZpZWxkfSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRHluYW1pY0ZpZWxkSUQsCiAgICAgICAgIkR5bmFtaWNGaWVsZEFkZCAtICREeW5hbWljRmllbGQtPntOYW1lfSAoJER5bmFtaWNGaWVsZElEKSIsCiAgICApOwogICAgJER5bmFtaWNGaWVsZC0+e0R5bmFtaWNGaWVsZElEfSA9ICREeW5hbWljRmllbGRJRDsKfQoKIyBGcmVlemUgdGltZSBhdCB0aGlzIHBvaW50IHNpbmNlIGNyZWF0aW5nIHRpY2tldHMgYW5kIGNoZWNraW5nIHJlc3VsdHMgY2FuIHRha2UKIyAgIHNldmVyYWwgc2Vjb25kcyB0byBjb21wbGV0ZS4KJEhlbHBlci0+Rml4ZWRUaW1lU2V0KAogICAgJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpLAopOwoKbXkgJFRpY2tldENvdW50ID0gMzsKCiMgY3JlYXRlIGEgZmV3IHRlc3QgdGlja2V0cwpteSBAVGlja2V0SURzOwpmb3IgbXkgJENvdW50ICggMSAuLiAkVGlja2V0Q291bnQgKSB7CiAgICBteSAkVGlja2V0VGl0bGUgPSAiVGlja2V0JFJhbmRvbUlELSRDb3VudCI7CiAgICBteSAkVGlja2V0SUQgICAgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgVGl0bGUgICAgPT4gJFRpY2tldFRpdGxlLAogICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlELAogICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgIFByaW9yaXR5ID0+ICczIG5vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgPT4gJ29wZW4nLAogICAgICAgIE93bmVySUQgID0+IDEsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgIlRpY2tldENyZWF0ZSgpIC0gJFRpY2tldFRpdGxlICgkVGlja2V0SUQpIiwKICAgICk7CgogICAgIyBjcmVhdGUgYXJ0aWNsZQogICAgbXkgJEFydGljbGVJRCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFRpY2tldElELAogICAgICAgIEFydGljbGVUeXBlICAgID0+ICdlbWFpbC1leHRlcm5hbCcsCiAgICAgICAgU2VuZGVyVHlwZSAgICAgPT4gJ2N1c3RvbWVyJywKICAgICAgICBGcm9tICAgICAgICAgICA9PiAnU29tZSBDdXN0b21lciBBIDxjdXN0b21lci1hQGV4YW1wbGUuY29tPicsCiAgICAgICAgVG8gICAgICAgICAgICAgPT4gJ1NvbWUgQWdlbnQgPGVtYWlsQGV4YW1wbGUuY29tPicsCiAgICAgICAgU3ViamVjdCAgICAgICAgPT4gJ3NvbWUgc2hvcnQgZGVzY3JpcHRpb24nLAogICAgICAgIEJvZHkgICAgICAgICAgID0+ICd0aGUgbWVzc2FnZSB0ZXh0JywKICAgICAgICBDb250ZW50VHlwZSAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xNScsCiAgICAgICAgSGlzdG9yeVR5cGUgICAgPT4gJ0VtYWlsQ3VzdG9tZXInLAogICAgICAgIEhpc3RvcnlDb21tZW50ID0+ICdDdXN0b21lciBzZW50IGFuIGVtYWlsJywKICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgKTsKCiAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFN5c3RlbVRpbWUoKSArIDYwICogNjAgKiAyNCwgICAgIyArMjRoCiAgICApOwogICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICBZZWFyICAgICA9PiAkWWVhciwKICAgICAgICBNb250aCAgICA9PiAkTW9udGgsCiAgICAgICAgRGF5ICAgICAgPT4gJERheSwKICAgICAgICBIb3VyICAgICA9PiAkSG91ciwKICAgICAgICBNaW51dGUgICA9PiAkTWludXRlLAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICJUaWNrZXRQZW5kaW5nVGltZVNldCAtIFRpY2tldCAkVGlja2V0SUQ6ICIKICAgICAgICAgICAgLiBzcHJpbnRmKCAnJWQtJTAyZC0lMDJkICUwMmQ6JTAyZCcsICRZZWFyLCAkTW9udGgsICREYXksICRIb3VyLCAkTWludXRlICksCiAgICApOwoKICAgICMgc2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRWYWx1ZU9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgRmllbGRJRCAgPT4gJER5bmFtaWNGaWVsZHNbMF0tPntEeW5hbWljRmllbGRJRH0sCiAgICAgICAgT2JqZWN0SUQgPT4gJFRpY2tldElELAogICAgICAgIFZhbHVlICAgID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWVEYXRlVGltZSA9PiAnMjAxNi0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVmFsdWVTZXQgLSAkRHluYW1pY0ZpZWxkc1swXS0+e0R5bmFtaWNGaWVsZElEfSBmb3IgdGlja2V0ICRUaWNrZXRJRCIsCiAgICApOwoKICAgICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZFZhbHVlT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICBGaWVsZElEICA9PiAkRHluYW1pY0ZpZWxkc1sxXS0+e0R5bmFtaWNGaWVsZElEfSwKICAgICAgICBPYmplY3RJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgVmFsdWUgICAgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZURhdGVUaW1lID0+ICcyMDE2LTAxLTAxIDEyOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICJWYWx1ZVNldCAtICREeW5hbWljRmllbGRzWzFdLT57RHluYW1pY0ZpZWxkSUR9IGZvciB0aWNrZXQgJFRpY2tldElEIiwKICAgICk7CgogICAgcHVzaCBAVGlja2V0SURzLCAkVGlja2V0SUQ7Cn0KCiMgY3JlYXRlIHRlc3QgY2FsZW5kYXIKbXkgJENhbGVuZGFyTmFtZSA9ICJDYWxlbmRhciRSYW5kb21JRCI7Cm15ICVDYWxlbmRhciAgICAgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgQ2FsZW5kYXJOYW1lID0+ICRDYWxlbmRhck5hbWUsCiAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCik7CiRTZWxmLT5UcnVlKAogICAgJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgIkNhbGVuZGFyQ3JlYXRlIC0gJENhbGVuZGFyTmFtZSAoJENhbGVuZGFye0NhbGVuZGFySUR9KSIsCik7CgojIEdlbmVyYXRlIGZldyByYW5kb20gc3RyaW5ncyBmb3IgUnVsZUlEcy4KbXkgQFJ1bGVJRHM7CmZvciAoIDEgLi4gNSApIHsKICAgIHB1c2ggQFJ1bGVJRHMsICRNYWluT2JqZWN0LT5HZW5lcmF0ZVJhbmRvbVN0cmluZygKICAgICAgICBMZW5ndGggICAgID0+IDMyLAogICAgICAgIERpY3Rpb25hcnkgPT4gWyAwIC4uIDksICdhJyAuLiAnZicgXSwKICAgICk7Cn0KCiMKIyBUZXN0cyBmb3IgdGlja2V0IGFwcG9pbnRtZW50cwojCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICBUaWNrZXRBcHBvaW50bWVudHMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBSdWxlSUQgICAgICAgPT4gJFJ1bGVJRHNbMF0sCiAgICAgICAgICAgICAgICBTdGFydERhdGUgICAgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICAgICAgICAgIEVuZERhdGUgICAgICA9PiAnUGx1c181JywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiBbJFF1ZXVlSURdLAogICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAiKiRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJFRpY2tldENvdW50LAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudCA9PiAnRmlyc3RSZXNwb25zZVRpbWUnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICA9PiAnRmlyc3RSZXNwb25zZVRpbWUnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICA9PiAnUGx1c181JywKICAgICAgICAgICAgQ2xlYW51cCAgICAgICAgICAgPT4gW10sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdVcGRhdGVUaW1lJywKICAgICAgICBUaWNrZXRBcHBvaW50bWVudHMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBSdWxlSUQgICAgICAgPT4gJFJ1bGVJRHNbMV0sCiAgICAgICAgICAgICAgICBTdGFydERhdGUgICAgPT4gJ1VwZGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgRW5kRGF0ZSAgICAgID0+ICdQbHVzXzE1JywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiBbJFF1ZXVlSURdLAogICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAiKiRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJFRpY2tldENvdW50LAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudCA9PiAnVXBkYXRlVGltZScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgID0+ICdVcGRhdGVUaW1lJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgPT4gJ1BsdXNfMTUnLAogICAgICAgICAgICBDbGVhbnVwICAgICAgICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgUnVsZUlEICA9PiAkUnVsZUlEc1swXSwKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICBUaWNrZXRBcHBvaW50bWVudHMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBSdWxlSUQgICAgICAgPT4gJFJ1bGVJRHNbMl0sCiAgICAgICAgICAgICAgICBTdGFydERhdGUgICAgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgICAgICAgICBFbmREYXRlICAgICAgPT4gJ1BsdXNfMzAnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgID0+IFskUXVldWVJRF0sCiAgICAgICAgICAgICAgICBTZWFyY2hQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICIqJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkVGlja2V0Q291bnQsCiAgICAgICAgICAgIFRpY2tldEFwcG9pbnRtZW50ID0+ICdTb2x1dGlvblRpbWUnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgPT4gJ1BsdXNfMzAnLAogICAgICAgICAgICBDbGVhbnVwICAgICAgICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgUnVsZUlEICA9PiAkUnVsZUlEc1sxXSwKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnUGVuZGluZ1RpbWUnLAogICAgICAgIFRpY2tldEFwcG9pbnRtZW50cyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgICA9PiAkUnVsZUlEc1szXSwKICAgICAgICAgICAgICAgIFN0YXJ0RGF0ZSAgICA9PiAnUGVuZGluZ1RpbWUnLAogICAgICAgICAgICAgICAgRW5kRGF0ZSAgICAgID0+ICdQbHVzXzYwJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiBbJFF1ZXVlSURdLAogICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAiKiRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJFRpY2tldENvdW50LAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudCA9PiAnUGVuZGluZ1RpbWUnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICA9PiAnUGVuZGluZ1RpbWUnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICA9PiAnUGx1c182MCcsCiAgICAgICAgICAgIENsZWFudXAgICAgICAgICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBSdWxlSUQgID0+ICRSdWxlSURzWzJdLAogICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgPT4gJzIwMTYtMDEtMDEgMDE6MDA6MDAnLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlUmVzdWx0ID0+IHsKICAgICAgICAgICAgVW50aWxUaW1lID0+IC0oCiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCkgLQogICAgICAgICAgICAgICAgICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZCcsCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUnVsZUlEICAgICAgID0+ICRSdWxlSURzWzRdLAogICAgICAgICAgICAgICAgU3RhcnREYXRlICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRzWzBdLT57TmFtZX0sCiAgICAgICAgICAgICAgICBFbmREYXRlICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZHNbMV0tPntOYW1lfSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiBbJFF1ZXVlSURdLAogICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAiKiRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJFRpY2tldENvdW50LAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudCA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZHNbMF0tPntOYW1lfSwKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZHNbMV0tPntOYW1lfSwKICAgICAgICAgICAgQ2xlYW51cCAgICAgICAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFJ1bGVJRCAgPT4gJFJ1bGVJRHNbM10sCiAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAnMjAxNi0wMy0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICA9PiAnMjAxNi0wMy0wMSAwMTowMDowMCcsCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVSZXN1bHQgPT4gewogICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkc1swXS0+e05hbWV9ID0+ICcyMDE2LTAzLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZHNbMV0tPntOYW1lfSA9PiAnMjAxNi0wMy0wMSAwMTowMDowMCcsCiAgICAgICAgfSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgdXBkYXRlIHRlc3QgY2FsZW5kYXIKICAgIG15ICRTdWNjZXNzID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclVwZGF0ZSgKICAgICAgICAlQ2FsZW5kYXIsCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRzID0+ICRUZXN0LT57VGlja2V0QXBwb2ludG1lbnRzfSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIENhbGVuZGFyVXBkYXRlIC0gVXBkYXRlIHRpY2tldCBhcHBvaW50bWVudHMgcnVsZSIsCiAgICApOwoKICAgICMgUHJvY2VzcyB0aWNrZXQgYXBwb2ludG1lbnRzIG9mIHRoZSBjYWxlbmRhci4KICAgIG15ICVSZXN1bHQgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc0NhbGVuZGFyKAogICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgKTsKCiAgICBteSAlUmVzdWx0Q29tcGFyZTsKICAgIGZvciBteSAkVGlja2V0SUQgKCBzb3J0IEBUaWNrZXRJRHMgKSB7CiAgICAgICAgcHVzaCBAeyAkUmVzdWx0Q29tcGFyZXtQcm9jZXNzfSB9LCB7CiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgUnVsZUlEICAgPT4gJFRlc3QtPntUaWNrZXRBcHBvaW50bWVudHN9LT5bMF0tPntSdWxlSUR9LAogICAgICAgICAgICBTdWNjZXNzICA9PiAxLAogICAgICAgIH07CiAgICB9CiAgICAkUmVzdWx0Q29tcGFyZXtDbGVhbnVwfSA9ICRUZXN0LT57UmVzdWx0fS0+e0NsZWFudXB9OwoKICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICBcJVJlc3VsdCwKICAgICAgICBcJVJlc3VsdENvbXBhcmUsCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBUaWNrZXRBcHBvaW50bWVudFByb2Nlc3NDYWxlbmRhciAtIFJlc3VsdCIsCiAgICApOwoKICAgICMgZ2V0IGFwcG9pbnRtZW50cwogICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGFwcG9pbnRtZW50IGNvdW50CiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMsCiAgICAgICAgJFRlc3QtPntSZXN1bHR9LT57Q291bnR9LAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gVGlja2V0IGFwcG9pbnRtZW50IGNvdW50IiwKICAgICk7CgogICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewoKICAgICAgICAjIGdldCB0aWNrZXQgaWQgYnkgdGlja2V0IG51bWJlcgogICAgICAgICRBcHBvaW50bWVudC0+e1RpdGxlfSA9fiAvIyhbMC05XSspXF0vOwogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldElETG9va3VwKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRpY2tldAogICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIGFwcG9pbnRtZW50IGlzIG9mIHRpY2tldCBhcHBvaW50bWVudCB0eXBlCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBUaWNrZXQgYXBwb2ludG1lbnQgdHlwZSIsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoU3RhcnRUaW1lIEVuZFRpbWUpKSB7CiAgICAgICAgICAgIG15ICRLZXkgPSAkVGVzdC0+e1Jlc3VsdH0tPnskRmllbGR9OwoKICAgICAgICAgICAgIyBkZXRlcm1pbmUgdGlja2V0IHZhbHVlIGZvciB0aGUgZmllbGQKICAgICAgICAgICAgbXkgJFRpY2tldFZhbHVlOwoKICAgICAgICAgICAgIyBlc2NhbGF0aW9uIHRpbWVzCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fS0+eyRGaWVsZH0gZXEgJ0ZpcnN0UmVzcG9uc2VUaW1lJwogICAgICAgICAgICAgICAgfHwgJFRlc3QtPntSZXN1bHR9LT57JEZpZWxkfSBlcSAnVXBkYXRlVGltZScKICAgICAgICAgICAgICAgIHx8ICRUZXN0LT57UmVzdWx0fS0+eyRGaWVsZH0gZXEgJ1NvbHV0aW9uVGltZScKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFRpY2tldFZhbHVlID0gJFRpY2tldHsgJFRlc3QtPntSZXN1bHR9LT57JEZpZWxkfSAuICdEZXN0aW5hdGlvbkRhdGUnIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcGVuZGluZyB0aW1lCiAgICAgICAgICAgIGVsc2lmICggJFRlc3QtPntSZXN1bHR9LT57JEZpZWxkfSBlcSAnUGVuZGluZ1RpbWUnICkgewogICAgICAgICAgICAgICAgJFRpY2tldFZhbHVlID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCkgKyAkVGlja2V0e1VudGlsVGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVGlja2V0VmFsdWUgPSAkVGlja2V0eyAkVGVzdC0+e1Jlc3VsdH0tPnskRmllbGR9IH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSBzdGFydCB0aW1lIHZhbHVlCiAgICAgICAgICAgIGlmICggJEZpZWxkIGVxICdTdGFydFRpbWUnICkgewogICAgICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LT57U3RhcnRUaW1lVmFsdWV9ID0gJFRpY2tldFZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGRldGVybWluZSBwcmVzZXQgdmFsdWUKICAgICAgICAgICAgbXkgJFZhbHVlOwogICAgICAgICAgICBpZiAoICRLZXkgPX4gL15QbHVzXyhbMC05XSspJC8gKSB7CiAgICAgICAgICAgICAgICBteSAkUHJlc2V0ID0gaW50ICQxOwoKICAgICAgICAgICAgICAgICMgZ2V0IHN0YXJ0IHRpbWUKICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRUZXN0LT57UmVzdWx0fS0+e1N0YXJ0VGltZVZhbHVlfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjYWxjdWxhdGUgZW5kIHRpbWUgdXNpbmcgcHJlc2V0IHZhbHVlCiAgICAgICAgICAgICAgICBteSAkRW5kVGltZSA9ICRTdGFydFRpbWUgKyA2MCAqICRQcmVzZXQ7CiAgICAgICAgICAgICAgICAkVGlja2V0VmFsdWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjb21wYXJlIHZhbHVlcwogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPnskRmllbGR9LAogICAgICAgICAgICAgICAgJFRpY2tldFZhbHVlLAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBBcHBvaW50bWVudCAkRmllbGQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkVGVzdC0+e1VwZGF0ZX0gKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAgICAgICAgICV7JEFwcG9pbnRtZW50fSwKICAgICAgICAgICAgICAgICV7ICRUZXN0LT57VXBkYXRlfSB9LAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIEFwcG9pbnRtZW50IHVwZGF0ZSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG1hbnVhbGx5IHRyaWdnZXIgYXBwb2ludG1lbnQgZXZlbnQgbW9kdWxlCiAgICAgICAgICAgICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRVcGRhdGVUaWNrZXQoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdUaWNrZXQnICk7CgogICAgICAgICAgICAjIGdldCB0aWNrZXQgZGF0YSBhZ2FpbgogICAgICAgICAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbXBhcmUgdmFsdWVzCiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBzb3J0IGtleXMgJXsgJFRlc3QtPntVcGRhdGVSZXN1bHR9IH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldHskRmllbGR9LAogICAgICAgICAgICAgICAgICAgICRUZXN0LT57VXBkYXRlUmVzdWx0fS0+eyRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBUaWNrZXQgJEZpZWxkIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCiMgY2xlYW51cCBpcyBkb25lIGJ5IFJlc3RvcmVEYXRhYmFzZS4KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKIyBvdmVycmlkZSBsb2NhbCB0aW1lIHpvbmUgZm9yIGR1cmF0aW9uIG9mIHRoZSB0ZXN0CmxvY2FsICRFTlZ7VFp9ID0gJ1VUQyc7CgojIGdldCBuZWVkZWQgb2JqZWN0cwpteSAkVXNlck9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwpteSAkR3JvdXBPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKbXkgJENhbGVuZGFyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7Cm15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKbXkgJEV4cG9ydE9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFeHBvcnQ6OklDYWwnKTsKbXkgJEltcG9ydE9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpJbXBvcnQ6OklDYWwnKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgY3JlYXRlIHRlc3QgdXNlcgpteSAkVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoKTsKbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKCBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiApOwoKJFNlbGYtPlRydWUoCiAgICAkVXNlcklELAogICAgIlRlc3QgdXNlciAkVXNlcklEIGNyZWF0ZWQiLAopOwoKIyBjcmVhdGUgdGVzdCBncm91cApteSAkR3JvdXBOYW1lID0gJ3Rlc3QtY2FsZW5kYXItZ3JvdXAtJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7Cm15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkR3JvdXBJRCwKICAgICJUZXN0IGdyb3VwICRVc2VySUQgY3JlYXRlZCIsCik7CgojIGFkZCB0ZXN0IHVzZXIgdG8gdGVzdCBncm91cApteSAkU3VjY2VzcyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckFkZCgKICAgIEdJRCAgICAgICAgPT4gJEdyb3VwSUQsCiAgICBVSUQgICAgICAgID0+ICRVc2VySUQsCiAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICBtb3ZlX2ludG8gPT4gMSwKICAgICAgICBjcmVhdGUgICAgPT4gMSwKICAgICAgICBvd25lciAgICAgPT4gMSwKICAgICAgICBwcmlvcml0eSAgPT4gMSwKICAgICAgICBydyAgICAgICAgPT4gMSwKICAgIH0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiVGVzdCB1c2VyICRVc2VySUQgYWRkZWQgdG8gdGVzdCBncm91cCAkR3JvdXBJRCIsCik7CgpteSBAVGVhbUlEOwpteSBAUmVzb3VyY2VJRDsKCiMgY2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZAppZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewoKICAgIG15ICRUZWFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJyk7CgogICAgIyBjcmVhdGUgdGVzdCB0ZWFtCiAgICBteSAkVGVhbU5hbWUgPSAndGVzdC10ZWFtLScgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgJFN1Y2Nlc3MgPSAkVGVhbU9iamVjdC0+VGVhbUFkZCgKICAgICAgICBOYW1lICAgID0+ICRUZWFtTmFtZSwKICAgICAgICBHcm91cElEID0+ICRHcm91cElELAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdUZWFtQWRkKCkgLSBUZXN0IHRlYW0gY3JlYXRlZCcsCiAgICApOwoKICAgIG15ICVUZWFtID0gJFRlYW1PYmplY3QtPlRlYW1HZXQoCiAgICAgICAgTmFtZSAgID0+ICRUZWFtTmFtZSwKICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICk7CgogICAgJFN1Y2Nlc3MgPSAkVGVhbU9iamVjdC0+VGVhbVVzZXJBZGQoCiAgICAgICAgVGVhbUlEICAgICA9PiAkVGVhbXtJRH0sCiAgICAgICAgVGVhbVVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgJ1RlYW1Vc2VyQWRkKCkgLSBBZGRlZCB0ZXN0IHVzZXIgdG8gdGVzdCB0ZWFtJywKICAgICk7CgogICAgcHVzaCBAVGVhbUlELCAgICAgJFRlYW17SUR9OwogICAgcHVzaCBAUmVzb3VyY2VJRCwgJFVzZXJJRDsKfQoKIyBjcmVhdGUgYSB0ZXN0IGNhbGVuZGFyIGZvciBleHBvcnQKbXkgJEV4cG9ydENhbGVuZGFyTmFtZSA9ICdFeHBvcnQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7Cm15ICVFeHBvcnRDYWxlbmRhciAgICAgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgQ2FsZW5kYXJOYW1lID0+ICRFeHBvcnRDYWxlbmRhck5hbWUsCiAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICJDYWxlbmRhckNyZWF0ZSggQ2FsZW5kYXJOYW1lID0+ICckRXhwb3J0Q2FsZW5kYXJOYW1lJywgQ29sb3IgPT4gJyMzQTg3QUQnLCBHcm91cElEID0+ICRHcm91cElELCBVc2VySUQgPT4gJFVzZXJJRCApIC0gQ2FsZW5kYXJJRDogJEV4cG9ydENhbGVuZGFye0NhbGVuZGFySUR9IiwKKTsKCiMgc2FtcGxlIGFwcG9pbnRtZW50cwpteSBAQXBwb2ludG1lbnRzID0gKAoKICAgICMgcmVndWxhcgogICAgewogICAgICAgIENhbGVuZGFySUQgID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBTdGFydFRpbWUgICA9PiAnMjAxNi0wMy0wMSAxMDowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgPT4gJzIwMTYtMDMtMDEgMTI6MDA6MDAnLAogICAgICAgIFRpdGxlICAgICAgID0+ICdSZWd1bGFyIEFwcG9pbnRtZW50JywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2FtcGxlIGRlc2NyaXB0aW9uJywKICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklELAogICAgfSwKCiAgICAjIGFsbC1kYXkgd2l0aCByZXNvdXJjZQogICAgewogICAgICAgIENhbGVuZGFySUQgPT4gJEV4cG9ydENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDMtMDEgMDA6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDMtMDIgMDA6MDA6MDAnLAogICAgICAgIEFsbERheSAgICAgPT4gMSwKICAgICAgICBUaXRsZSAgICAgID0+ICdBbGwtZGF5IEFwcG9pbnRtZW50JywKICAgICAgICBMb2NhdGlvbiAgID0+ICdTYW1wbGUgbG9jYXRpb24nLAogICAgICAgIFRlYW1JRCAgICAgPT4gXEBUZWFtSUQsCiAgICAgICAgUmVzb3VyY2VJRCA9PiBcQFJlc291cmNlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgfSwKCiAgICAjIHJlY3VycmluZyBkYWlseQogICAgewogICAgICAgIENhbGVuZGFySUQgICAgICA9PiAkRXhwb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgU3RhcnRUaW1lICAgICAgID0+ICcyMDE2LTAzLTAxIDE1OjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgICAgICAgPT4gJzIwMTYtMDMtMDEgMTY6MDA6MDAnLAogICAgICAgIFJlY3VycmluZyAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VUeXBlICA9PiAnRGFpbHknLAogICAgICAgIFJlY3VycmVuY2VDb3VudCA9PiAzLAogICAgICAgIFRpdGxlICAgICAgICAgICA9PiAnUmVjdXJyaW5nIERhaWx5IEFwcG9pbnRtZW50JywKICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ0V2ZXJ5IGRheSwgZm9yIDMgZGF5cycsCiAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRVc2VySUQsCiAgICB9LAoKICAgICMgcmVjdXJyaW5nIHdlZWtseQogICAgewogICAgICAgIENhbGVuZGFySUQgICAgICA9PiAkRXhwb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgU3RhcnRUaW1lICAgICAgID0+ICcyMDE2LTAzLTAyIDE1OjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgICAgICAgPT4gJzIwMTYtMDMtMDIgMTY6MDA6MDAnLAogICAgICAgIFJlY3VycmluZyAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VUeXBlICA9PiAnV2Vla2x5JywKICAgICAgICBSZWN1cnJlbmNlQ291bnQgPT4gMywKICAgICAgICBUaXRsZSAgICAgICAgICAgPT4gJ1JlY3VycmluZyBXZWVrbHkgQXBwb2ludG1lbnQnLAogICAgICAgIERlc2NyaXB0aW9uICAgICA9PiAnRXZlcnkgd2VlaywgZm9yIDMgd2Vla3MnLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkVXNlcklELAogICAgfSwKCiAgICAjIHJlY3VycmluZyBtb250aGx5CiAgICB7CiAgICAgICAgQ2FsZW5kYXJJRCAgICAgID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBTdGFydFRpbWUgICAgICAgPT4gJzIwMTYtMDMtMDMgMTU6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgICAgICA9PiAnMjAxNi0wMy0wMyAxNjowMDowMCcsCiAgICAgICAgUmVjdXJyaW5nICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgID0+ICdNb250aGx5JywKICAgICAgICBSZWN1cnJlbmNlQ291bnQgPT4gMywKICAgICAgICBUaXRsZSAgICAgICAgICAgPT4gJ1JlY3VycmluZyBNb250aGx5IEFwcG9pbnRtZW50JywKICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ0V2ZXJ5IG1vbnRoLCBmb3IgMyBtb250aHMnLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkVXNlcklELAogICAgfSwKCiAgICAjIHJlY3VycmluZyB5ZWFybHkKICAgIHsKICAgICAgICBDYWxlbmRhcklEICAgICAgPT4gJEV4cG9ydENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFN0YXJ0VGltZSAgICAgICA9PiAnMjAxNi0wMy0wNCAxNTowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICAgID0+ICcyMDE2LTAzLTA0IDE2OjAwOjAwJywKICAgICAgICBSZWN1cnJpbmcgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgPT4gJ1llYXJseScsCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ID0+IDMsCiAgICAgICAgVGl0bGUgICAgICAgICAgID0+ICdSZWN1cnJpbmcgWWVhcmx5IEFwcG9pbnRtZW50JywKICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ0V2ZXJ5IFllYXJseSwgZm9yIDMgeWVhcnMnLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkVXNlcklELAogICAgfSwKCiAgICAjIGN1c3RvbSBkYWlseSByZWN1cnJpbmcKICAgIHsKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gJEV4cG9ydENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNTowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ0N1c3RvbURhaWx5JywKICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgPT4gMiwKICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgPT4gMywKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgPT4gJ0N1c3RvbSBEYWlseSBSZWN1cnJpbmcgQXBwb2ludG1lbnQnLAogICAgICAgIERlc2NyaXB0aW9uICAgICAgICA9PiAnRXZlcnkgMiBkYXlzLCAzIHRpbWVzJywKICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgIH0sCgogICAgIyAgY3VzdG9tIHdlZWtseSByZWN1cnJpbmcKICAgIHsKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTAzLTAyIDE1OjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAzLTAyIDE2OjAwOjAwJywKICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAnQ3VzdG9tV2Vla2x5JywKICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgID0+IDIsCiAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiBbIDEsIDMsIDcgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTW9uLCBXZWQsIFN1bgogICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgPT4gNiwKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgID0+ICdDdXN0b20gV2Vla2x5IFJlY3VycmluZyBBcHBvaW50bWVudCcsCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICA9PiAnRXZlcnkgbW9uZGF5LCB3ZWRuZXNkYXkgYW5kIHN1bmRheSwgNiBhcHBvaW50bWVudHMnLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgIH0sCgogICAgIyBjdXN0b20gbW9udGhseSByZWN1cnJpbmcgbW9udGhseQogICAgewogICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gJEV4cG9ydENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMTYtMDMtMDMgMTU6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDMtMDMgMTY6MDA6MDAnLAogICAgICAgIFJlY3VycmluZyAgICAgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgID0+ICdDdXN0b21Nb250aGx5JywKICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgID0+IDIsCiAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiBbIDEsIDMsIDMxIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDFzdCwgM3RoIGFuZCAzMXN0CiAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgICA9PiAnMjAxNy0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIE1vbnRobHkgUmVjdXJyaW5nIEFwcG9pbnRtZW50JywKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgID0+ICdFdmVyeSAxc3QsIDN0aCBhbmQgMzFzdCBkYXksIHVudGlsIDIwMTctMTAtMDEnLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgIH0sCgogICAgIyBjdXN0b20geWVhcmx5IHJlY3VycmluZyB5ZWFybHkKICAgIHsKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTAzLTA0IDE1OjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAzLTA0IDE2OjAwOjAwJywKICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAnQ3VzdG9tWWVhcmx5JywKICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ID0+IFsgMSwgMywgMTIgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBqYW4sIG1hciwgZGVjCiAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICA9PiAyLAogICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgPT4gMTAsCiAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIFllYXJseSBSZWN1cnJpbmcgQXBwb2ludG1lbnQnLAogICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgPT4gJ0V2ZXJ5IDIgWWVhcnMgaW4gSmFuLCBGZWIgYW5kIE1hciAtIDEwIHRpbWVzJywKICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICB9LAopOwoKZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICV7JEFwcG9pbnRtZW50fSwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgIkFwcG9pbnRtZW50Q3JlYXRlKCkgLSBBcHBvaW50bWVudElEOiAkQXBwb2ludG1lbnRJRCIsCiAgICApOwp9CgojIGV4cG9ydCBhcHBvaW50bWVudHMKbXkgJElDYWxTdHJpbmcgPSAkRXhwb3J0T2JqZWN0LT5FeHBvcnQoCiAgICBDYWxlbmRhcklEID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKKTsKCiMgZ2V0IGV4cG9ydGVkIGFwcG9pbnRtZW50cwpteSBARXhwb3J0ZWRBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgIENhbGVuZGFySUQgPT4gJEV4cG9ydENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRJQ2FsU3RyaW5nLAogICAgJ0V4cG9ydCgpIC0gQ2FsZW5kYXIgZXhwb3J0ZWQgdG8gaUNhbCBmb3JtYXQnLAopOwoKIyBjcmVhdGUgYSB0ZXN0IGNhbGVuZGFyIGZvciBpbXBvcnQKbXkgJEltcG9ydENhbGVuZGFyTmFtZSA9ICdJbXBvcnQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7Cm15ICVJbXBvcnRDYWxlbmRhciAgICAgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgQ2FsZW5kYXJOYW1lID0+ICRJbXBvcnRDYWxlbmRhck5hbWUsCiAgICBDb2xvciAgICAgICAgPT4gJyNFQzkwNzMnLAogICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRJbXBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICJDYWxlbmRhckNyZWF0ZSggQ2FsZW5kYXJOYW1lID0+ICckSW1wb3J0Q2FsZW5kYXJOYW1lJywgR3JvdXBJRCA9PiAkR3JvdXBJRCwgVXNlcklEID0+ICRVc2VySUQgKSAtIENhbGVuZGFySUQ6ICRJbXBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSIsCik7CgojIGltcG9ydCBhcHBvaW50bWVudHMKJFN1Y2Nlc3MgPSAkSW1wb3J0T2JqZWN0LT5JbXBvcnQoCiAgICBDYWxlbmRhcklEID0+ICRJbXBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIElDYWwgICAgICAgPT4gJElDYWxTdHJpbmcsCiAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgJ0ltcG9ydCgpIC0gQ2FsZW5kYXIgaW1wb3J0ZWQgZnJvbSBpQ2FsIGZvcm1hdCcsCik7CgojIGdldCBpbXBvcnRlZCBhcHBvaW50bWVudHMKbXkgQEltcG9ydGVkQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICBDYWxlbmRhcklEID0+ICRJbXBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAopOwoKIyBudW1iZXIgb2YgaW1wb3J0ZWQgYW5kIGV4cG9ydGVkIGFwcG9pbnRtZW50cyBtYXRjaAokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEltcG9ydGVkQXBwb2ludG1lbnRzLAogICAgc2NhbGFyIEBFeHBvcnRlZEFwcG9pbnRtZW50cywKICAgICdJbXBvcnRlZCBhcHBvaW50bWVudCBjb3VudCcKKTsKCm15ICRDb3VudCA9IDE7CmZvciBteSAkSW1wb3J0ZWRBcHBvaW50bWVudCAoQEltcG9ydGVkQXBwb2ludG1lbnRzKSB7CgogICAgIyBkZWxldGUgc3BlY2lmaWMga2V5cwogICAgZGVsZXRlICRJbXBvcnRlZEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH07CiAgICBkZWxldGUgJEltcG9ydGVkQXBwb2ludG1lbnQtPntDYWxlbmRhcklEfTsKICAgIGRlbGV0ZSAkSW1wb3J0ZWRBcHBvaW50bWVudC0+e1VuaXF1ZUlEfTsKICAgIGRlbGV0ZSAkSW1wb3J0ZWRBcHBvaW50bWVudC0+e1BhcmVudElEfTsKICAgIGRlbGV0ZSAkRXhwb3J0ZWRBcHBvaW50bWVudHNbICRDb3VudCAtIDEgXS0+e0FwcG9pbnRtZW50SUR9OwogICAgZGVsZXRlICRFeHBvcnRlZEFwcG9pbnRtZW50c1sgJENvdW50IC0gMSBdLT57Q2FsZW5kYXJJRH07CiAgICBkZWxldGUgJEV4cG9ydGVkQXBwb2ludG1lbnRzWyAkQ291bnQgLSAxIF0tPntVbmlxdWVJRH07CiAgICBkZWxldGUgJEV4cG9ydGVkQXBwb2ludG1lbnRzWyAkQ291bnQgLSAxIF0tPntQYXJlbnRJRH07CgogICAgIyBjb21wYXJlIGltcG9ydGVkIGFuZCBleHBvcnRlZCBhcHBvaW50bWVudHMKICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAkSW1wb3J0ZWRBcHBvaW50bWVudCwKICAgICAgICAkRXhwb3J0ZWRBcHBvaW50bWVudHNbICRDb3VudCAtIDEgXSwKICAgICAgICAiSW1wb3J0ZWQgYXBwb2ludG1lbnQgJENvdW50IiwKICAgICk7CiAgICAkQ291bnQrKzsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKIyBPdmVycmlkZSBsb2NhbCB0aW1lIHpvbmUgZm9yIGR1cmF0aW9uIG9mIHRoZSB0ZXN0LiBUaGlzIGlzIHJlcXVpcmVkIHNpbmNlIGV4cGVjdGVkIGltcG9ydGVkIGRhdGUKIyAgIHZhbHVlcyBhcmUgYWxsIGluIFVUQy4KbG9jYWwgJEVOVntUWn0gPSAnVVRDJzsKCiMgZ2V0IG5lZWRlZCBvYmplY3RzCm15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwpteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CgojIGdldCBoZWxwZXIgb2JqZWN0CiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFJlc3RvcmVEYXRhYmFzZSA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgojIGdldCBuZWVkZWQgb2JqZWN0cwpteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKbXkgJFVzZXJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiMgY3JlYXRlIHRlc3QgdXNlcgpteSAkVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoKTsKbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKCBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiApOwoKJFNlbGYtPlRydWUoCiAgICAkVXNlcklELAogICAgIlRlc3QgdXNlciAkVXNlcklEIGNyZWF0ZWQiLAopOwoKIyBjcmVhdGUgdGVzdCBncm91cApteSAkR3JvdXBOYW1lID0gJ3Rlc3QtY2FsZW5kYXItZ3JvdXAtJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7Cm15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkR3JvdXBJRCwKICAgICJUZXN0IGdyb3VwICRVc2VySUQgY3JlYXRlZCIsCik7CgojIGFkZCB0ZXN0IHVzZXIgdG8gdGVzdCBncm91cApteSAkU3VjY2VzcyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckFkZCgKICAgIEdJRCAgICAgICAgPT4gJEdyb3VwSUQsCiAgICBVSUQgICAgICAgID0+ICRVc2VySUQsCiAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICBtb3ZlX2ludG8gPT4gMSwKICAgICAgICBjcmVhdGUgICAgPT4gMSwKICAgICAgICBvd25lciAgICAgPT4gMSwKICAgICAgICBwcmlvcml0eSAgPT4gMSwKICAgICAgICBydyAgICAgICAgPT4gMSwKICAgIH0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiVGVzdCB1c2VyICRVc2VySUQgYWRkZWQgdG8gdGVzdCBncm91cCAkR3JvdXBJRCIsCik7CgpteSBAVGVhbUlEOwpteSBAUmVzb3VyY2VJRDsKCiMgY2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZAppZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewoKICAgIG15ICRUZWFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJyk7CgogICAgIyBjcmVhdGUgdGVzdCB0ZWFtCiAgICAkU3VjY2VzcyA9ICRUZWFtT2JqZWN0LT5UZWFtQWRkKAogICAgICAgIE5hbWUgICAgPT4gJ1Rlc3QgVGVhbScsCiAgICAgICAgR3JvdXBJRCA9PiAxLCAgICAgICAgICAgICAjIGFkbWluCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgPT4gMSwgICAgICAgICAgICAgIyByb290CiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdUZWFtQWRkKCkgLSBUZXN0IHRlYW0gY3JlYXRlZCcsCiAgICApOwoKICAgIG15ICVUZWFtID0gJFRlYW1PYmplY3QtPlRlYW1HZXQoCiAgICAgICAgTmFtZSAgID0+ICdUZXN0IFRlYW0nLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAkU3VjY2VzcyA9ICRUZWFtT2JqZWN0LT5UZWFtVXNlckFkZCgKICAgICAgICBUZWFtSUQgICAgID0+ICRUZWFte0lEfSwKICAgICAgICBUZWFtVXNlcklEID0+IDEsICAgICAgICAgICAjIHJvb3QKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdUZWFtVXNlckFkZCgpIC0gQWRkZWQgcm9vdCB1c2VyIHRvIHRlc3QgdGVhbScsCiAgICApOwoKICAgIHB1c2ggQFRlYW1JRCwgICAgICRUZWFte0lEfTsKICAgIHB1c2ggQFJlc291cmNlSUQsIDE7Cn0KCiMgdGhpcyB3aWxsIGJlIG9rCm15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICBDYWxlbmRhck5hbWUgPT4gJ1Rlc3QgY2FsZW5kYXInLAogICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAopOwoKJFNlbGYtPlRydWUoCiAgICAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAiQ2FsZW5kYXJDcmVhdGUoIENhbGVuZGFyTmFtZSA9PiAnVGVzdCBjYWxlbmRhcicsIENvbG9yID0+ICcjM0E4N0FEJywgR3JvdXBJRCA9PiAkR3JvdXBJRCwgVXNlcklEID0+ICRVc2VySUQgKSAtIENhbGVuZGFySUQiLAopOwoKIyByZWFkIHNhbXBsZSAuaWNzIGZpbGUKbXkgJENvbnRlbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5GaWxlUmVhZCgKICAgIERpcmVjdG9yeSA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT57SG9tZX0gLiAnL3NjcmlwdHMvdGVzdC9zYW1wbGUvQ2FsZW5kYXIvJywKICAgIEZpbGVuYW1lICA9PiAnU2FtcGxlQ2FsZW5kYXIuaWNzJywKKTsKCiRTZWxmLT5UcnVlKAogICAgJHskQ29udGVudH0sCiAgICAnLmljcyBzdHJpbmcgbG9hZGVkJywKKTsKCm15ICRJbXBvcnRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpJbXBvcnQ6OklDYWwnKS0+SW1wb3J0KAogICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBJQ2FsICAgICAgID0+ICR7JENvbnRlbnR9LAogICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgVW50aWxMaW1pdCA9PiAnMjAxOC0wMS0wMSAwMDowMDowMCcsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRJbXBvcnRTdWNjZXNzLAogICAgJ0ltcG9ydCBzdWNjZXNzJywKKTsKCm15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCik7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEFwcG9pbnRtZW50cywKICAgIDE3MSwKICAgICdBcHBvaW50bWVudCBjb3VudCcsCik7CgpteSBAUmVzdWx0ID0gKAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gXEBUZWFtSUQsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNC0wNSAwMDowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQWxsIGRheScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBcQFJlc291cmNlSUQsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNC0wNiAwMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICd0ZXN0IGFsbCBkYXkgZXZlbnQnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiAnMScsCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMTIgMDk6MzA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnT25jZSBwZXIgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wNC0xMiAxMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgPT4gJzEnLAogICAgICAgICdBbGxEYXknICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0xOSAwOTozMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ09uY2UgcGVyIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNC0xOSAxMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdPbmx5IG9uY2UgcGVyIHdlZWsnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0JlbGdyYWRlJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDQtMjYgMDk6MzA6MDAnLAogICAgICAgICdUaXRsZScgICAgICA9PiAnT25jZSBwZXIgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMjYgMTA6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNS0wMyAwOTozMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdPbmNlIHBlciB3ZWVrJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdPbmx5IG9uY2UgcGVyIHdlZWsnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0JlbGdyYWRlJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTA1LTAzIDEwOjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNS0xMCAxMDowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0JlbGdyYWRlJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdPbmx5IG9uY2UgcGVyIHdlZWsnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ09uY2UgcGVyIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNS0xMCAwOTozMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTE3IDA5OjMwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnT25jZSBwZXIgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNS0xNyAxMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDUtMjQgMTA6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnT25jZSBwZXIgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA1LTI0IDA5OjMwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDUtMzEgMDk6MzA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdPbmNlIHBlciB3ZWVrJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA1LTMxIDEwOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0JlbGdyYWRlJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdPbmx5IG9uY2UgcGVyIHdlZWsnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdPbmNlIHBlciB3ZWVrJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA2LTA3IDA5OjMwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA2LTA3IDEwOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0JlbGdyYWRlJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdPbmx5IG9uY2UgcGVyIHdlZWsnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDQtMTIgMTI6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnTW9udGhseSBtZWV0aW5nJywKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDQtMTIgMTE6MTU6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA1LTEyIDExOjE1OjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ01vbnRobHkgbWVldGluZycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnR2VybWFueScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNS0xMiAxMjowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ01vbnRobHkgbWVldGluZycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA2LTEyIDExOjE1OjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDYtMTIgMTI6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknCiAgICB9LAogICAgewogICAgICAgICdUaXRsZScgICAgICA9PiAnTW9udGhseSBtZWV0aW5nJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDctMTIgMTE6MTU6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA3LTEyIDEyOjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdPbmNlIHBlciBtb250aCcsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnR2VybWFueScKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdNb250aGx5IG1lZXRpbmcnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDgtMTIgMTE6MTU6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnR2VybWFueScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDgtMTIgMTI6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA5LTEyIDExOjE1OjAwJywKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ01vbnRobHkgbWVldGluZycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wOS0xMiAxMjowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09uY2UgcGVyIG1vbnRoJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTEwLTEyIDEyOjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnR2VybWFueScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMC0xMiAxMToxNTowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnTW9udGhseSBtZWV0aW5nJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTExLTEyIDEyOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnTW9udGhseSBtZWV0aW5nJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0xMS0xMiAxMToxNTowMCcsCiAgICB9LAogICAgewogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNb250aGx5IG1lZXRpbmcnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMTItMTIgMTE6MTU6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMi0xMiAxMjowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdPbmNlIHBlciBtb250aCcsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnR2VybWFueScKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAxLTEyIDExOjE1OjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnTW9udGhseSBtZWV0aW5nJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDEtMTIgMTI6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnR2VybWFueScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDItMTIgMTI6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ01vbnRobHkgbWVldGluZycsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAyLTEyIDExOjE1OjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAzLTMxIDA2OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAzLTMxIDA3OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTMwIDA2OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMzAgMDc6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA1LTMxIDA3OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFbmQgb2YgdGhlIG1vbnRoJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMzEgMDY6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNi0zMCAwNzowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFbmQgb2YgdGhlIG1vbnRoJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNi0zMCAwNjowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA3LTMxIDA3OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDctMzEgMDY6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VuZCBvZiB0aGUgbW9udGgnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA4LTMxIDA3OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA4LTMxIDA2OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDktMzAgMDY6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA5LTMwIDA3OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VuZCBvZiB0aGUgbW9udGgnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0xMC0zMSAwNjowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMTAtMzEgMDc6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMS0zMCAwNzowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMS0zMCAwNjowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMi0zMSAwNjowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFbmQgb2YgdGhlIG1vbnRoJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0xMi0zMSAwNzowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNy0wMS0zMSAwNzowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTAxLTMxIDA2OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VuZCBvZiB0aGUgbW9udGgnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDItMjggMDY6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTctMDItMjggMDc6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDEtMzEgMDk6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAyIG1vbnRocycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnVGVzdCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAndGVzdCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiAnMScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wMS0zMSAxMDowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdUZXN0JywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICd0ZXN0JywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAzLTMxIDEwOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMy0zMSAwOTowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAyIG1vbnRocycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDUtMzEgMTA6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ3Rlc3QnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1Rlc3QnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMiBtb250aHMnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNS0zMSAwOTowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMiBtb250aHMnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDctMzEgMDk6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA3LTMxIDEwOjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnVGVzdCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAndGVzdCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICd0ZXN0JywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdUZXN0JywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTctMDEtMzEgMTA6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMiBtb250aHMnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAxLTMxIDA5OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA0LTEyIDA4OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMTIgMDc6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDQtMTQgMDg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTE0IDA3OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNeSBldmVudCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNC0xNiAwODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDQtMTYgMDc6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA0LTE4IDA3OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wNC0xOCAwODowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMjAgMDg6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0yMCAwNzowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNeSBldmVudCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTIyIDA3OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNC0yMiAwODowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTI0IDA3OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA0LTI0IDA4OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTI2IDA3OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnTXkgZXZlbnQnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA0LTI2IDA4OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDQtMjggMDg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMjggMDc6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdCiAgICB9LAogICAgewogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNeSBldmVudCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0zMCAwNzowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDQtMzAgMDg6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNS0wMiAwODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMDIgMDc6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnTXkgZXZlbnQnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMDQgMDc6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTA1LTA0IDA4OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDUtMDYgMDg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTA2IDA3OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JwogICAgfSwKICAgIHsKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDUtMDggMDc6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNS0wOCAwODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMTAgMDc6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnTXkgZXZlbnQnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA1LTEwIDA4OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNS0xMiAwODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNS0xMiAwNzowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA1LTE0IDA4OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTE0IDA3OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNeSBldmVudCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTE2IDA3OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNS0xNiAwODowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA1LTE4IDA3OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDUtMTggMDg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA1LTIwIDA3OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDUtMjAgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnTXkgZXZlbnQnLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMjIgMDc6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTA1LTIyIDA4OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDUtMjQgMDg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMjQgMDc6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDUtMjYgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNS0yNiAwNzowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNS0yOCAwODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDUtMjggMDc6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnTXkgZXZlbnQnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNS0zMCAwNzowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNeSBldmVudCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA1LTMwIDA4OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA2LTAxIDA4OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnTXkgZXZlbnQnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA2LTAxIDA3OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMDEgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gJzEnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMDEgMDg6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMiB5ZWFycycsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDIgeWVhcnMnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTgtMDQtMDEgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxOC0wNC0wMSAwOTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDIgeWVhcnMnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMjAtMDQtMDEgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMjAtMDQtMDEgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDN0aGQgYWxsIGRheScsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNC0wMiAwMDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiAnMScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDQtMDMgMDA6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnID0+ICcxJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDQtMDUgMDA6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDN0aGQgYWxsIGRheScsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDQtMDYgMDA6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiAnMScsCiAgICB9LAogICAgewogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDN0aGQgYWxsIGRheScsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0wOCAwMDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+ICcxJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA0LTA5IDAwOjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gJzEnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNC0xMiAwMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAzdGhkIGFsbCBkYXknLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0xMSAwMDowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMTQgMDA6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAzdGhkIGFsbCBkYXknLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTA0LTE1IDAwOjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICA9PiAnMScKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNC0xNyAwMDowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDN0aGQgYWxsIGRheScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDQtMTggMDA6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgID0+ICcxJwogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+ICcxJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNC0yMSAwMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggM3RoZCBhbGwgZGF5JywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0yMCAwMDowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiAnMScsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNC0yNCAwMDowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggM3RoZCBhbGwgZGF5JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMjMgMDA6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gJzEnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMjcgMDA6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDN0aGQgYWxsIGRheScsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTI2IDAwOjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNC0zMCAwMDowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+ICcxJywKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA0LTI5IDAwOjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDN0aGQgYWxsIGRheScsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXQogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTAzLTA3IDE2OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gJzEnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRmlyc3QgMyBkYXlzJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDMtMDcgMTU6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAzLTA4IDE2OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDMtMDggMTU6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0ZpcnN0IDMgZGF5cycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdGaXJzdCAzIGRheXMnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMy0wOSAxNTowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMy0wOSAxNjowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAzLTAyIDE3OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ09uY2UgcGVyIG5leHQgMiBtb250aCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1JlY3VycmluZycgID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDMtMDIgMTg6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdPbmNlIHBlciBuZXh0IDIgbW9udGgnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMDIgMTc6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMDIgMTg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDEtMDMgMTg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gJzEnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMS0wMyAxNzowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnSmFudWFyeSAzdGggbmV4dCAzIHllYXJzJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0phbnVhcnkgM3RoIG5leHQgMyB5ZWFycycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNy0wMS0wMyAxNzowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNy0wMS0wMyAxODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxOC0wMS0wMyAxODowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxOC0wMS0wMyAxNzowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnSmFudWFyeSAzdGggbmV4dCAzIHllYXJzJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA0LTEyIDE0OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNC0xMiAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiAnMScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0yNiAxNDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMjYgMTU6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNS0xMCAxNDowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDUtMTAgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDUtMjQgMTU6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTI0IDE0OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNi0wNyAxNDowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDYtMDcgMTU6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNi0yMSAxNDowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDYtMjEgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNy0wNSAxNTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA3LTA1IDE0OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDctMTkgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTA3LTE5IDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wOC0wMiAxNDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDgtMDIgMTU6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDgtMTYgMTU6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA4LTE2IDE0OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wOC0zMCAxNTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA4LTMwIDE0OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA5LTEzIDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDktMTMgMTQ6MDA6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wOS0yNyAxNTowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wOS0yNyAxNDowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMTAtMTEgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMTAtMTEgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JwogICAgfSwKICAgIHsKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTEwLTI1IDE1OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMTAtMjUgMTQ6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10KICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTExLTA4IDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTExLTA4IDE0OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0xMS0yMiAxNDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0xMS0yMiAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTEyLTA2IDE1OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMi0wNiAxNDowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMi0yMCAxNTowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMTItMjAgMTQ6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wMS0wMyAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNy0wMS0wMyAxNDowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAxLTE3IDE0OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDEtMTcgMTU6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE3LTAxLTMxIDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTAxLTMxIDE0OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTctMDItMTQgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDItMTQgMTQ6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE3LTAyLTI4IDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDItMjggMTQ6MDA6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0wMy0xNCAxNDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDMtMTQgMTU6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNy0wMy0yOCAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDMtMjggMTQ6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNy0wNC0xMSAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTA0LTExIDE0OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wNC0yNSAxNTowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDQtMjUgMTQ6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wNS0wOSAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDUtMDkgMTQ6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE3LTA1LTIzIDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDUtMjMgMTQ6MDA6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDYtMDYgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE3LTA2LTA2IDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE3LTA2LTIwIDE1OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0wNi0yMCAxNDowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNy0wNy0wNCAxNDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTctMDctMDQgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDctMTggMTQ6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE3LTA3LTE4IDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTA4LTAxIDE0OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNy0wOC0wMSAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wOC0xNSAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDgtMTUgMTQ6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE3LTA4LTI5IDE1OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNy0wOC0yOSAxNDowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDktMTIgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wOS0xMiAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wOS0yNiAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDktMjYgMTQ6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTEwLTEwIDE0OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNy0xMC0xMCAxNTowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0xMC0yNCAxNTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0xMC0yNCAxNDowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0xMS0wNyAxNDowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0xMS0wNyAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE3LTExLTIxIDE1OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNy0xMS0yMSAxNDowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMTItMDUgMTU6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTEyLTA1IDE0OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE3LTEyLTE5IDE1OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTEyLTE5IDE0OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTAxLTExIDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gJzEnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IGF0IE1vbmRheSBhbmQgcmVwZWF0IGVhY2ggMm5kIFdlZG5lc2RheSBhbmQgU3VuZGF5LicsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAxLTExIDA4OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMScsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXQogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDEtMTMgMDg6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMS0xMyAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IGF0IE1vbmRheSBhbmQgcmVwZWF0IGVhY2ggMm5kIFdlZG5lc2RheSBhbmQgU3VuZGF5LicsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTAxLTE3IDA5OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAxJywKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDEtMTcgMDg6MDA6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDEtMjcgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAxLTI3IDA4OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAxJwogICAgfSwKICAgIHsKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTAxLTMxIDA5OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAxLTMxIDA4OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMScsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDItMTAgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMi0xMCAwODowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICB9LAogICAgewogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMi0xNCAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IGF0IE1vbmRheSBhbmQgcmVwZWF0IGVhY2ggMm5kIFdlZG5lc2RheSBhbmQgU3VuZGF5LicsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAyLTE0IDA4OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMScsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXQogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMi0yNCAwOTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMScsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAyLTI0IDA4OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSAxJywKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAyLTI4IDA4OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IGF0IE1vbmRheSBhbmQgcmVwZWF0IGVhY2ggMm5kIFdlZG5lc2RheSBhbmQgU3VuZGF5LicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTAyLTI4IDA5OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wMy0wOSAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAzLTA5IDA4OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMScsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMy0xMyAwODowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMScsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDMtMTMgMDk6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMy0yMyAwOTowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAzLTIzIDA4OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAzLTI3IDA4OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTAzLTI3IDA5OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDEtMTIgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wMS0xMiAwOTowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAxLTE2IDA4OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTAxLTE2IDA5OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDEtMzEgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAxLTMxIDA5OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMi0xNiAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMi0xNiAwODowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wMy0xNiAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDMtMTYgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDInCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDMtMzEgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wMy0zMSAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMTYgMDk6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA0LTE2IDA4OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNS0xNiAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMTYgMDg6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNS0zMSAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDUtMzEgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgfSwKICAgIHsKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDYtMTYgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDYtMTYgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDctMTYgMDg6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA3LTE2IDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDctMzEgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDctMzEgMDg6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA4LTE2IDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wOC0xNiAwODowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMicKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wOC0zMSAwODowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDgtMzEgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA5LTE2IDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wOS0xNiAwODowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMicKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMC0xNiAwODowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTEwLTE2IDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMC0zMSAwODowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMTAtMzEgMDk6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTExLTE2IDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTExLTE2IDA4OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMi0xNiAwODowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMTItMTYgMDk6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0xMi0zMSAwODowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTEyLTMxIDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gJzEnLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDEtMzEgMDk6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDEtMzEgMDg6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSAzJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSAzJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAyLTI5IDA4OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTAyLTI5IDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTEyLTMxIDA5OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMTItMzEgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAzJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSA0JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAxLTA0IDE1OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wMS0wNCAxNjowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAyLTA0IDE1OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDQnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wMi0wNCAxNjowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAyLTA0IDE1OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDQnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wMi0wNCAxNjowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAxLTA0IDE2OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnWWVhcmx5JywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDEtMDQgMTU6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0wMS0wNCAxNTowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ1llYXJseScsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTctMDEtMDQgMTY6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCik7CgpMT09QOgpmb3IgKCBteSAkSW5kZXggPSAwOyAkSW5kZXggPCBzY2FsYXIgQEFwcG9pbnRtZW50czsgJEluZGV4KysgKSB7CiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkUmVzdWx0WyRJbmRleF0gfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiB1bmRlZgogICAgICAgIGlmICggIWRlZmluZWQgJFJlc3VsdFskSW5kZXhdLT57JEtleX0gKSB7CgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzWyRJbmRleF0tPnskS2V5fSwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgIkNoZWNrIGlmICRLZXkgaXMgdW5kZWYuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRSZXN1bHRbJEluZGV4XS0+eyRLZXl9ICkgKSB7CiAgICAgICAgICAgIG15ICVJdGVtcyA9ICgpOwogICAgICAgICAgICAkSXRlbXN7JF99ICs9IDEgZm9yZWFjaCAoIEB7ICRSZXN1bHRbJEluZGV4XS0+eyRLZXl9IH0gKTsKICAgICAgICAgICAgJEl0ZW1zeyRffSAtPSAxIGZvcmVhY2ggKCBAeyAkQXBwb2ludG1lbnRzWyRJbmRleF0tPnskS2V5fSB9ICk7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICEoIGdyZXAgeyAkXyAhPSAwIH0gdmFsdWVzICVJdGVtcyApLAogICAgICAgICAgICAgICAgIkNoZWNrIGlmIGFycmF5ICRLZXkgaXMgT0suIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkUmVzdWx0WyRJbmRleF0tPnskS2V5fSApICkgewoKICAgICAgICAgICAgIyBTa2lwIFBhcmVudElEIHNpbmNlIHRoaXMgdmFsdWUgY2FuJ3QgbWF0Y2ggQXBwb2ludG1lbnRJRCAoZXZlcnkgdGltZSBpcyBkaWZmZXJlbnQpCiAgICAgICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEKCiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzWyRJbmRleF0tPnskS2V5fSwKICAgICAgICAgICAgICAgICRSZXN1bHRbJEluZGV4XS0+eyRLZXl9LAogICAgICAgICAgICAgICAgIkNoZWNrIGlmICRLZXkgdmFsdWUgaXMgT0suIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZG8gbm90IGNoZWNrIFJpY2hUZXh0CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0Zyb250ZW5kOjpSaWNoVGV4dCcsCiAgICAgICAgICAgIFZhbHVlID0+IDAKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHVzZXIgYW5kIGxvZ2luCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsnYWRtaW4nXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZG1pbk5vdGlmaWNhdGlvbkV2ZW50IHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCIpOwoKICAgICAgICAjIGNoZWNrIG92ZXJ2aWV3IHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUiLCAgICAgICAgICAgICAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGhlYWQgdHIgdGgiLCAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAjIGNsaWNrICJBZGQgbm90aWZpY2F0aW9uIgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQ7U3ViYWN0aW9uPUFkZCcgKV0iKQogICAgICAgICAgICAtPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBjaGVjayBhZGQgTm90aWZpY2F0aW9uRXZlbnQgc2NyZWVuCiAgICAgICAgZm9yIG15ICRJRCAoCiAgICAgICAgICAgIHF3KE5hbWUgQ29tbWVudCBWYWxpZElEIEV2ZW50cyBlbl9TdWJqZWN0IGVuX0JvZHkpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjJElEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KCiAgICAgICAgIyB0b2dnbGUgVGlja2V0IGZpbHRlciB3aWRnZXQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAYXJpYS1jb250cm9scywgXCdDb3JlX1VJX0F1dG9nZW5lcmF0ZWRJRF8xJyldIiktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB0b2dnbGUgQXJ0aWNsZSBmaWx0ZXIgKE9ubHkgZm9yIEFydGljbGVDcmVhdGUgYW5kIEFydGljbGVTZW5kIGV2ZW50KSB3aWRnZXQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAYXJpYS1jb250cm9scywgXCdDb3JlX1VJX0F1dG9nZW5lcmF0ZWRJRF8yJyldIiktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBOb3RpZmljYXRpb25FdmVudAogICAgICAgIG15ICROb3RpZkV2ZW50UmFuZG9tSUQgPSAiTm90aWZpY2F0aW9uRXZlbnQiIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkTm90aWZFdmVudFRleHQgICAgID0gIlNlbGVuaXVtIE5vdGlmaWNhdGlvbkV2ZW50IHRlc3QiOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI05hbWUiLCAgICAnY3NzJyApLT5zZW5kX2tleXMoJE5vdGlmRXZlbnRSYW5kb21JRCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQ29tbWVudCIsICdjc3MnICktPnNlbmRfa2V5cygkTm90aWZFdmVudFRleHQpOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0V2ZW50cycpLnZhbCgnQXBwb2ludG1lbnROb3RpZmljYXRpb24nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI2VuX1N1YmplY3QiLCAnY3NzJyApLT5zZW5kX2tleXMoJE5vdGlmRXZlbnRUZXh0KTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNlbl9Cb2R5IiwgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCROb3RpZkV2ZW50VGV4dCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTmFtZSIsICAgICAgICdjc3MnICktPlZlcmlmaWVkU3VibWl0KCk7CgogICAgICAgICMgY2hlY2sgaWYgdGVzdCBOb3RpZmljYXRpb25FdmVudCBzaG93IG9uIEFkbWluTm90aWZpY2F0aW9uRXZlbnQgc2NyZWVuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkTm90aWZFdmVudFJhbmRvbUlEICkgPiAtMSwKICAgICAgICAgICAgIiROb3RpZkV2ZW50UmFuZG9tSUQgTm90aWZpY2Fpb25FdmVudCBmb3VuZCBvbiBwYWdlIiwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHRlc3QgTm90aWZpY2F0aW9uRXZlbnQgdmFsdWVzCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICROb3RpZkV2ZW50UmFuZG9tSUQsICdsaW5rX3RleHQnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNOYW1lJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICROb3RpZkV2ZW50UmFuZG9tSUQsCiAgICAgICAgICAgICIjTmFtZSBzdG9yZWQgdmFsdWUiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNDb21tZW50JywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICROb3RpZkV2ZW50VGV4dCwKICAgICAgICAgICAgIiNDb21tZW50IHN0b3JlZCB2YWx1ZSIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI2VuX1N1YmplY3QnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJE5vdGlmRXZlbnRUZXh0LAogICAgICAgICAgICAiI2VuX1N1YmplY3Qgc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjZW5fQm9keScsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAkTm90aWZFdmVudFRleHQsCiAgICAgICAgICAgICIjZW5fQm9keSBzdG9yZWQgdmFsdWUiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNWYWxpZElEJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICIjVmFsaWRJRCBzdG9yZWQgdmFsdWUiLAogICAgICAgICk7CgogICAgICAgICMgZWRpdCB0ZXN0IE5vdGlmaWNhdGlvbkV2ZW50IGFuZCBzZXQgaXQgdG8gaW52YWxpZAogICAgICAgIG15ICRFZGl0Tm90aWZFdmVudFRleHQgPSAiU2VsZW5pdW0gZWRpdGVkIE5vdGlmaWNhdGlvbkV2ZW50IHRlc3QiOwoKICAgICAgICAjIHRvZ2dsZSBBcnRpY2xlIGZpbHRlciAoT25seSBmb3IgQXJ0aWNsZUNyZWF0ZSBhbmQgQXJ0aWNsZVNlbmQgZXZlbnQpIHdpZGdldAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBhcmlhLWNvbnRyb2xzLCBcJ0NvcmVfVUlfQXV0b2dlbmVyYXRlZElEXzInKV0iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNDb21tZW50IiwgICAgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNlbl9Cb2R5IiwgICAgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNlbl9Cb2R5IiwgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCRFZGl0Tm90aWZFdmVudFRleHQpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI2VuX1N1YmplY3QiLCAnY3NzJyApLT5jbGVhcigpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI2VuX1N1YmplY3QiLCAnY3NzJyApLT5zZW5kX2tleXMoJEVkaXROb3RpZkV2ZW50VGV4dCk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJyNWYWxpZElEJykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNOYW1lIiwgJ2NzcycgKS0+VmVyaWZpZWRTdWJtaXQoKTsKCiAgICAgICAgIyBjaGVjayBlZGl0ZWQgTm90aWZjYXRpb25FdmVudCB2YWx1ZXMKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJE5vdGlmRXZlbnRSYW5kb21JRCwgJ2xpbmtfdGV4dCcgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0NvbW1lbnQnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICIjQ29tbWVudCB1cGRhdGVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjZW5fQm9keScsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAkRWRpdE5vdGlmRXZlbnRUZXh0LAogICAgICAgICAgICAiI2VuX0JvZHkgdXBkYXRlZCB2YWx1ZSIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI1ZhbGlkSUQnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgIiNWYWxpZElEIHVwZGF0ZWQgdmFsdWUiLAogICAgICAgICk7CgogICAgICAgICMgZ28gYmFjayB0byBBZG1pbk5vdGlmaWNhdGlvbkV2ZW50IG92ZXJ2aWV3IHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCIpOwoKICAgICAgICAjIGNoZWNrIGNsYXNzIG9mIGludmFsaWQgTm90aWZpY2F0aW9uRXZlbnQgaW4gdGhlIG92ZXJ2aWV3IHRhYmxlCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCd0ci5JbnZhbGlkIHRkIGE6Y29udGFpbnMoJE5vdGlmRXZlbnRSYW5kb21JRCknKS5sZW5ndGgiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICJUaGVyZSBpcyBhIGNsYXNzICdJbnZhbGlkJyBmb3IgdGVzdCBOb3RpZmljYXRpb25FdmVudCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgTm90aWZpY2F0aW9uRXZlbnRJRAogICAgICAgIG15ICVOb3RpZkV2ZW50SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnKS0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgICAgICBOYW1lID0+ICROb3RpZkV2ZW50UmFuZG9tSUQKICAgICAgICApOwoKICAgICAgICAjIGNsaWNrIG9uIGRlbGV0ZSBpY29uCiAgICAgICAgbXkgJENoZWNrQ29uZmlybUpTID0gPDwiSkFWQVNDUklQVCI7CihmdW5jdGlvbiAoKSB7CiAgICB3aW5kb3cuY29uZmlybSA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Owp9KCkpOwpKQVZBU0NSSVBUCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgkQ2hlY2tDb25maXJtSlMpOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IFNMQSB3aXRoIGRlbGV0ZSBidXR0b24KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdTdWJhY3Rpb249RGVsZXRlO0lEPSROb3RpZkV2ZW50SUR7SUR9JyApXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2hlY2sgaWYgdGVzdCBOb3RpZmljYXRpb25FdmVudCBpcyBkZWxldGVkCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgndHIuSW52YWxpZCB0ZCBhOmNvbnRhaW5zKCROb3RpZkV2ZW50UmFuZG9tSUQpJykubGVuZ3RoIgogICAgICAgICAgICApLAogICAgICAgICAgICAiVGVzdCBOb3RpZmljYXRpb25FdmVudCBpcyBkZWxldGVkIC0gJE5vdGlmRXZlbnRSYW5kb21JRCIsCiAgICAgICAgKSB8fCBkaWU7CgogICAgICAgIH0KCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgICAgICBteSAkR3JvdXBPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgICAgICBteSAkQ2FsZW5kYXJPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgICAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwogICAgICAgIG15ICRVc2VyT2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgZ3JvdXAKICAgICAgICBteSAkR3JvdXBOYW1lID0gInRlc3QtY2FsZW5kYXItZ3JvdXAtJFJhbmRvbUlEIjsKICAgICAgICBteSAkR3JvdXBJRCAgID0gJEdyb3VwT2JqZWN0LT5Hcm91cEFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgY2hhbmdlIHJlc29sdXRpb24gKGRlc2t0b3AgbW9kZSkKICAgICAgICAkU2VsZW5pdW0tPnNldF93aW5kb3dfc2l6ZSggNzY4LCAxMDUwICk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgdXNlcgogICAgICAgIG15ICRMYW5ndWFnZSAgICAgID0gJ2VuJzsKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgICA9PiBbICd1c2VycycsICRHcm91cE5hbWUgXSwKICAgICAgICAgICAgTGFuZ3VhZ2UgPT4gJExhbmd1YWdlLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAjIGdldCBVc2VySUQKICAgICAgICBteSAkVXNlcklEID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGN1c3RvbWVyIHVzZXIKICAgICAgICBteSAkVGVzdEN1c3RvbWVyVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCBjdXN0b21lciB1c2VyIjsKCiAgICAgICAgIyBzdGFydCB0ZXN0CiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGEgZmV3IHRlc3QgY2FsZW5kYXJzCiAgICAgICAgbXkgJUNhbGVuZGFyMSA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXIxICRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJUNhbGVuZGFyMiA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXIyICRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnI0VDOTA3MycsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJUNhbGVuZGFyMyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXIzICRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnIzZCQUQ1NCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRDYWxlbmRhcldlZWtEYXlTdGFydCA9ICRDb25maWdPYmplY3QtPkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKSB8fCA3OwoKICAgICAgICAjIGdldCBzdGFydCBvZiB0aGUgd2VlawogICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCk7CiAgICAgICAgbXkgKCAkV2Vla0RheSwgJENXICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPldlZWtEZXRhaWxzR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgKTsKICAgICAgICB3aGlsZSAoICRXZWVrRGF5ICE9ICRDYWxlbmRhcldlZWtEYXlTdGFydCApIHsKICAgICAgICAgICAgJFN0YXJ0VGltZSAtPSA2MCAqIDYwICogMjQ7CiAgICAgICAgICAgICggJFdlZWtEYXksICRDVyApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5XZWVrRGV0YWlsc0dldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgKTsKCiAgICAgICAgIyBhcHBvaW50bWVudCB0aW1lcyB3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHdlZWsKICAgICAgICBteSAlU3RhcnRUaW1lID0gKAogICAgICAgICAgICBEYXkgICAgPT4gJERheSwKICAgICAgICAgICAgTW9udGggID0+ICRNb250aCwKICAgICAgICAgICAgWWVhciAgID0+ICRZZWFyLAogICAgICAgICAgICBIb3VyICAgPT4gMTIsCiAgICAgICAgICAgIE1pbnV0ZSA9PiAxNSwKICAgICAgICApOwoKICAgICAgICAjIGdvIHRvIGFnZW5kYSBvdmVydmlldyBwYWdlCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3Iik7CgogICAgICAgICMgY2xpY2sgb24gdGhlIGFwcG9pbnRtZW50IGNyZWF0ZSBidXR0b24KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNBcHBvaW50bWVudENyZWF0ZUJ1dHRvbicsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhIHJlZ3VsYXIgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPnNlbmRfa2V5cygnQXBwb2ludG1lbnQgMScpOwogICAgICAgIGZvciBteSAkR3JvdXAgKHF3KFN0YXJ0IEVuZCkpIHsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoSG91ciBNaW51dGUgRGF5IE1vbnRoIFllYXIpKSB7CiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyMkR3JvdXAkRmllbGQnKS52YWwoJFN0YXJ0VGltZXskRmllbGR9KS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICBzbGVlcCAxOwoKICAgICAgICAjIGNsaWNrIG9uIFNhdmUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciByZWxvYWQgdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAhXCQoJy5PdmVydmlld0NvbnRyb2wuTG9hZGluZycpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIHZlcmlmeSBmaXJzdCBhcHBvaW50bWVudCBpcyB2aXNpYmxlCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAnQXBwb2ludG1lbnQgMScgKSA+IC0xLAogICAgICAgICAgICAnRmlyc3QgYXBwb2ludG1lbnQgdmlzaWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBjbGljayBvbiB0aGUgY3JlYXRlIGJ1dHRvbiBmb3IgYW5vdGhlciBhcHBvaW50bWVudCBkaWFsb2cKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNBcHBvaW50bWVudENyZWF0ZUJ1dHRvbicsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbiBhbGwtZGF5IGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICAnbmFtZScgKS0+c2VuZF9rZXlzKCdBcHBvaW50bWVudCAyJyk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdBbGxEYXknLCAnbmFtZScgKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgIGZvciBteSAkR3JvdXAgKHF3KFN0YXJ0IEVuZCkpIHsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoRGF5IE1vbnRoIFllYXIpKSB7CiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyMkR3JvdXAkRmllbGQnKS52YWwoJFN0YXJ0VGltZXskRmllbGR9KS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMntDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICBzbGVlcCAxOwoKICAgICAgICAjIGNsaWNrIG9uIFNhdmUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciByZWxvYWQgdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAhXCQoJy5PdmVydmlld0NvbnRyb2wuTG9hZGluZycpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIHZlcmlmeSBmaXJzdCBhcHBvaW50bWVudCBpcyB2aXNpYmxlCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAnQXBwb2ludG1lbnQgMicgKSA+IC0xLAogICAgICAgICAgICAnU2Vjb25kIGFwcG9pbnRtZW50IHZpc2libGUnLAogICAgICAgICk7CgogICAgICAgICMgY2xpY2sgYWdhaW4gb24gdGhlIGNyZWF0ZSBidXR0b24gZm9yIGFuIGFwcG9pbnRtZW50IGRpYWxvZwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0FwcG9pbnRtZW50Q3JlYXRlQnV0dG9uJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHJlY3VycmluZyBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdBcHBvaW50bWVudCAzJyk7CiAgICAgICAgZm9yIG15ICRHcm91cCAocXcoU3RhcnQgRW5kKSkgewogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhIb3VyIE1pbnV0ZSBEYXkgTW9udGggWWVhcikpIHsKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAgICAgInJldHVybiBcJCgnIyRHcm91cCRGaWVsZCcpLnZhbCgkU3RhcnRUaW1leyRGaWVsZH0pLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS52YWwoIgogICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIze0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdEYWlseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VMaW1pdCcpLnZhbCgnMicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdSZWN1cnJlbmNlQ291bnQnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCczJyk7CgogICAgICAgIHNsZWVwIDE7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIHJlbG9hZCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmICFcJCgnLk92ZXJ2aWV3Q29udHJvbC5Mb2FkaW5nJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgdmVyaWZ5IGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHRoaXJkIGFwcG9pbnRtZW50IGlzIHZpc2libGUKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICdBcHBvaW50bWVudCAzJyApID4gLTEsCiAgICAgICAgICAgICdUaGlyZCBhcHBvaW50bWVudCB2aXNpYmxlJywKICAgICAgICApOwoKICAgICAgICAjIGNsaWNrIG9uIHRoaXJkIGFwcG9pbnRtZW50IG1hc3RlcgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnQXBwb2ludG1lbnQgMycsICdsaW5rX3RleHQnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIGNsaWNrIG9uIERlbGV0ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtRGVsZXRlJywgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyBjb25maXJtCiAgICAgICAgJFNlbGVuaXVtLT5hY2NlcHRfYWxlcnQoKTsKCiAgICAgICAgIyB3YWl0IGZvciByZWxvYWQgdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAhXCQoJy5PdmVydmlld0NvbnRyb2wuTG9hZGluZycpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIHZlcmlmeSBhbGwgdGhpcmQgYXBwb2ludG1lbnQgb2NjdXJlbmNlcyBoYXZlIGJlZW4gcmVtb3ZlZAogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJ0FwcG9pbnRtZW50IDMnICkgPT0gLTEsCiAgICAgICAgICAgICdBbGwgdGhpcmQgYXBwb2ludG1lbnQgb2NjdXJyZW5jZXMgcmVtb3ZlZCcsCiAgICAgICAgKTsKICAgIH0sCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICRIZWxwZXIgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgZ3JvdXAKICAgICAgICBteSAkR3JvdXBOYW1lID0gInRlc3QtY2FsZW5kYXItZ3JvdXAtJFJhbmRvbUlEIjsKICAgICAgICBteSAkR3JvdXBJRCAgID0gJEdyb3VwT2JqZWN0LT5Hcm91cEFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkR3JvdXBJRCwKICAgICAgICAgICAgJ1Rlc3QgZ3JvdXAgY3JlYXRlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBxdWV1ZQogICAgICAgIG15ICRRdWV1ZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlQWRkKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgPT4gIlF1ZXVlJFJhbmRvbUlEIiwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgU3lzdGVtQWRkcmVzc0lEID0+IDEsCiAgICAgICAgICAgIFNhbHV0YXRpb25JRCAgICA9PiAxLAogICAgICAgICAgICBTaWduYXR1cmVJRCAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgID0+ICdTb21lIGNvbW1lbnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkUXVldWVJRCwKICAgICAgICAgICAgJ1Rlc3QgcXVldWUgY3JlYXRlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIGNoYW5nZSByZXNvbHV0aW9uIChkZXNrdG9wIG1vZGUpCiAgICAgICAgJFNlbGVuaXVtLT5zZXRfd2luZG93X3NpemUoIDc2OCwgMTA1MCApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHVzZXIKICAgICAgICBteSAkTGFuZ3VhZ2UgICAgICA9ICdlbic7CiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzICAgPT4gWyRHcm91cE5hbWVdLAogICAgICAgICAgICBMYW5ndWFnZSA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgKSB8fCBkaWUgJ0RpZCBub3QgZ2V0IHRlc3QgdXNlcic7CgogICAgICAgICMgc3RhcnQgdGVzdAogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIG9wZW4gQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIHBhZ2UKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UiKTsKCiAgICAgICAgIyBjbGljayBBZGQgbmV3IGNhbGVuZGFyCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuU2lkZWJhckNvbHVtbiB1bC5BY3Rpb25MaXN0IGEjQWRkJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdyaXRlIGNhbGVuZGFyIG5hbWUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Zvcm0jQ2FsZW5kYXJGcm9tIGlucHV0I0NhbGVuZGFyTmFtZScsICdjc3MnICktPnNlbmRfa2V5cygiQ2FsZW5kYXIgJFJhbmRvbUlEIik7CgogICAgICAgICMgc2V0IGl0IHRvIHRlc3QgZ3JvdXAKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjR3JvdXBJRCcpLnZhbCgkR3JvdXBJRCkudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBzdWJtaXQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Zvcm0jQ2FsZW5kYXJGcm9tIGJ1dHRvbiNTdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMKICAgICAgICAjIGxldCdzIHRyeSB0byBhZGQgY2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUKICAgICAgICAjCiAgICAgICAgIyBjbGljayBBZGQgbmV3IGNhbGVuZGFyCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuU2lkZWJhckNvbHVtbiB1bC5BY3Rpb25MaXN0IGEjQWRkJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdyaXRlIGNhbGVuZGFyIG5hbWUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Zvcm0jQ2FsZW5kYXJGcm9tIGlucHV0I0NhbGVuZGFyTmFtZScsICdjc3MnICktPnNlbmRfa2V5cygiQ2FsZW5kYXIgJFJhbmRvbUlEIik7CgogICAgICAgICMgc2V0IGl0IHRvIHRlc3QgZ3JvdXAKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjR3JvdXBJRCcpLnZhbCgkR3JvdXBJRCkudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBzdWJtaXQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Zvcm0jQ2FsZW5kYXJGcm9tIGJ1dHRvbiNTdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3Igc2VydmVyIHNpZGUgZXJyb3IKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCdkaXYuRGlhbG9nIGJ1dHRvbiNEaWFsb2dCdXR0b24xJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgY2xpY2sgb2sgdG8gZGlzbWlzcwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnZGl2LkRpYWxvZyBidXR0b24jRGlhbG9nQnV0dG9uMScsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciB0b29sdGlwIG1lc3NhZ2UKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCdkaXYjT1RSU19VSV9Ub29sdGlwc19FcnJvclRvb2x0aXAnKS5sZW5ndGgiCiAgICAgICAgKTsKCiAgICAgICAgIyB1cGRhdGUgY2FsZW5kYXIgbmFtZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnZm9ybSNDYWxlbmRhckZyb20gaW5wdXQjQ2FsZW5kYXJOYW1lJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgICRTZWxlbml1bS0+c2VuZF9rZXlzX3RvX2FjdGl2ZV9lbGVtZW50KCcgMicpOwoKICAgICAgICAjIHNldCBpdCB0byBpbnZhbGlkCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1ZhbGlkSUQnKS52YWwoMikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5XaWRnZXRTaW1wbGUuQ29sbGFwc2VkIC5XaWRnZXRBY3Rpb24uVG9nZ2xlIGEnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQWRkUnVsZUJ1dHRvbicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHNldCBhIHF1ZXVlCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1F1ZXVlSURfMScpLnZhbCgnJFF1ZXVlSUQnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIGFkZCBzZWFyY2ggcGFyYW1ldGVyCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuQWRkQnV0dG9uJywgICAgICAgICAgICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNTZWFyY2hQYXJhbV8xX1RpdGxlJywgJ2NzcycgKS0+c2VuZF9rZXlzKCdUZXN0KicpOwoKICAgICAgICAjIHN1Ym1pdAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnZm9ybSNDYWxlbmRhckZyb20gYnV0dG9uI1N1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB2ZXJpZnkgdHdvIGNhbGVuZGFycyBhcmUgc2hvd24KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcuQ29udGVudENvbHVtbiB0YWJsZSB0Ym9keSB0cjp2aXNpYmxlJykubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgJ0FsbCBjYWxlbmRhcnMgYXJlIGRpc3BsYXllZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBmaWx0ZXIganVzdCBhZGRlZCBjYWxlbmRhcgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnaW5wdXQjRmlsdGVyQ2FsZW5kYXJzJywgJ2NzcycgKS0+c2VuZF9rZXlzKCJDYWxlbmRhciAkUmFuZG9tSUQgMiIpOwoKICAgICAgICBzbGVlcCAxOwoKICAgICAgICAjIHZlcmlmeSBvbmx5IG9uZSBjYWxlbmRhciBpcyBzaG93bgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5Db250ZW50Q29sdW1uIHRhYmxlIHRib2R5IHRyOnZpc2libGUnKS5sZW5ndGg7IgogICAgICAgICAgICApLAogICAgICAgICAgICAxLAogICAgICAgICAgICAnQ2FsZW5kYXJzIGFyZSBmaWx0ZXJlZCBjb3JyZWN0bHknLAogICAgICAgICk7CgogICAgICAgICMgdmVyaWZ5IHRoZSBjYWxlbmRhciBpcyBpbnZhbGlkCiAgICAgICAgbXkgJExhbmd1YWdlT2JqZWN0ID0gS2VybmVsOjpMYW5ndWFnZS0+bmV3KAogICAgICAgICAgICBVc2VyTGFuZ3VhZ2UgPT4gJExhbmd1YWdlLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5Db250ZW50Q29sdW1uIHRhYmxlIHRib2R5IHRyOm50aC1vZi10eXBlKDIpIHRkOm50aC1vZi10eXBlKDQpJywgJ2NzcycgKQogICAgICAgICAgICAgICAgLT5nZXRfdGV4dCgpLAogICAgICAgICAgICAkTGFuZ3VhZ2VPYmplY3QtPlRyYW5zbGF0ZSgnaW52YWxpZCcpLAogICAgICAgICAgICAnQ2FsZW5kYXIgaXMgbWFya2VkIGludmFsaWQnLAogICAgICAgICk7CgogICAgICAgICMgZWRpdCBpbnZhbGlkIGNhbGVuZGFyCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuQ29udGVudENvbHVtbiB0YWJsZSB0Ym9keSB0cjpudGgtb2YtdHlwZSgyKSB0ZCBhJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHNldCBpdCB0byBpbnZhbGlkLXRlbXBvcmFyaWx5CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1ZhbGlkSUQnKS52YWwoMykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB2ZXJpZnkgcnVsZSBoYXMgYmVlbiBzdG9yZWQgcHJvcGVybHkKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCdzZWxlY3RbaWQqPVwiUXVldWVJRF9cIl0nKS52YWwoKTsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFskUXVldWVJRF0sCiAgICAgICAgICAgICdRdWV1ZSBzdG9yZWQgcHJvcGVybHknLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnaW5wdXRbaWQqPVwiX1RpdGxlXCJdJykudmFsKCk7IgogICAgICAgICAgICApLAogICAgICAgICAgICAnVGVzdConLAogICAgICAgICAgICAnU2VhcmNoIHBhcmFtIHN0b3JlZCBwcm9wZXJseScsCiAgICAgICAgKTsKCiAgICAgICAgIyByZW1vdmUgdGhlIHJ1bGUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5SZW1vdmVCdXR0b24nLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgc3VibWl0CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdmb3JtI0NhbGVuZGFyRnJvbSBidXR0b24jU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHZlcmlmeSB0aGUgY2FsZW5kYXIgaXMgaW52YWxpZCB0ZW1wb3JhcmlseQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuQ29udGVudENvbHVtbiB0YWJsZSB0Ym9keSB0cjpudGgtb2YtdHlwZSgyKSB0ZDpudGgtb2YtdHlwZSg0KScsICdjc3MnICkKICAgICAgICAgICAgICAgIC0+Z2V0X3RleHQoKSwKICAgICAgICAgICAgJExhbmd1YWdlT2JqZWN0LT5UcmFuc2xhdGUoJ2ludmFsaWQtdGVtcG9yYXJpbHknKSwKICAgICAgICAgICAgJ0NhbGVuZGFyIGlzIG1hcmtlZCBpbnZhbGlkIHRlbXBvcmFyaWx5JywKICAgICAgICApOwoKICAgICAgICAjIGNsZWFudXAKCiAgICAgICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICAgICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY2FsZW5kYXJzCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjYWxlbmRhciBXSEVSRSBuYW1lID0gPyBPUiBuYW1lID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcIkNhbGVuZGFyICRSYW5kb21JRCIsIFwiQ2FsZW5kYXIgJFJhbmRvbUlEIDIiLCBdLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiRGVsZXRlZCB0ZXN0IGNhbGVuZGFycyAtIENhbGVuZGFyICRSYW5kb21JRCAoMikiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgcXVldWUKICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHF1ZXVlIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFF1ZXVlSUQsIF0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJEZWxldGVkIHRlc3QgcXVldWUgLSAkUXVldWVJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgIGZvciBteSAkQ2FjaGUgKHF3KENhbGVuZGFyIFF1ZXVlKSkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAkQ2FjaGUgKTsKICAgICAgICB9CiAgICB9LAopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgpteSAkRWxlbWVudFJlYWRPbmx5ID0gc3ViIHsKICAgIG15ICglUGFyYW0pID0gQF87CgogICAgIyBWYWx1ZSBpcyBvcHRpb25hbCBwYXJhbWV0ZXIKICAgIGZvciBteSAkTmVlZGVkIChxdyhVbml0VGVzdE9iamVjdCBFbGVtZW50KSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtVbml0VGVzdE9iamVjdH0tPklzKAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyMkUGFyYW17RWxlbWVudH0uUmVhZE9ubHlWYWx1ZScpLmxlbmd0aDsiCiAgICAgICAgKSwKICAgICAgICAkUGFyYW17VmFsdWV9LAogICAgICAgICIkUGFyYW17RWxlbWVudH0gcmVhZCBvbmx5ICgkUGFyYW17VmFsdWV9KSIsCiAgICApOwp9OwoKbXkgJEVsZW1lbnRFeGlzdHMgPSBzdWIgewogICAgbXkgKCVQYXJhbSkgPSBAXzsKCiAgICAjIFZhbHVlIGlzIG9wdGlvbmFsIHBhcmFtZXRlcgogICAgZm9yIG15ICROZWVkZWQgKHF3KFVuaXRUZXN0T2JqZWN0IEVsZW1lbnQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJExlbmd0aCA9ICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgInJldHVybiBcJCgnIyIgLiAkUGFyYW17RWxlbWVudH0gLiAiJykubGVuZ3RoOyIKICAgICk7CgogICAgaWYgKCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRQYXJhbXtVbml0VGVzdE9iamVjdH0tPlRydWUoCiAgICAgICAgICAgICRMZW5ndGgsCiAgICAgICAgICAgICIkUGFyYW17RWxlbWVudH0gZXhpc3RzIiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte1VuaXRUZXN0T2JqZWN0fS0+RmFsc2UoCiAgICAgICAgICAgICRMZW5ndGgsCiAgICAgICAgICAgICIkUGFyYW17RWxlbWVudH0gbm90IGV4aXN0cyIsCiAgICAgICAgKTsKICAgIH0KfTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICAgICAgbXkgJEhlbHBlciAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKICAgICAgICBteSAkR3JvdXBPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgICAgICBteSAkQ2FsZW5kYXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgICAgICBteSAkVGltZU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpOwogICAgICAgIG15ICRVc2VyT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CiAgICAgICAgbXkgJFRpY2tldE9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICAgICBteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGdyb3VwCiAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICJ0ZXN0LWNhbGVuZGFyLWdyb3VwLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBncm91cAogICAgICAgIG15ICRHcm91cE5hbWUyID0gInRlc3QtY2FsZW5kYXItZ3JvdXAyLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQyICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRHcm91cE5hbWUyLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCByb290IHRvIHRoZSBjcmVhdGVkIGdyb3VwCiAgICAgICAgJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cElEMiwKICAgICAgICAgICAgVUlEICAgICAgICA9PiAxLAogICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgbW92ZV9pbnRvID0+IDEsCiAgICAgICAgICAgICAgICBjcmVhdGUgICAgPT4gMSwKICAgICAgICAgICAgICAgIG93bmVyICAgICA9PiAxLAogICAgICAgICAgICAgICAgcHJpb3JpdHkgID0+IDEsCiAgICAgICAgICAgICAgICBydyAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIGNoYW5nZSByZXNvbHV0aW9uIChkZXNrdG9wIG1vZGUpCiAgICAgICAgJFNlbGVuaXVtLT5zZXRfd2luZG93X3NpemUoIDc2OCwgMTA1MCApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHVzZXIKICAgICAgICBteSAkTGFuZ3VhZ2UgICAgICA9ICdlbic7CiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzICAgPT4gWyAndXNlcnMnLCAkR3JvdXBOYW1lIF0sCiAgICAgICAgICAgIExhbmd1YWdlID0+ICRMYW5ndWFnZSwKICAgICAgICApIHx8IGRpZSAnRGlkIG5vdCBnZXQgdGVzdCB1c2VyJzsKCiAgICAgICAgIyBnZXQgVXNlcklECiAgICAgICAgbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjdXN0b21lciB1c2VyCiAgICAgICAgbXkgJFRlc3RDdXN0b21lclVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RDdXN0b21lclVzZXJDcmVhdGUoKQogICAgICAgICAgICB8fCBkaWUgJ0RpZCBub3QgZ2V0IHRlc3QgY3VzdG9tZXIgdXNlcic7CgogICAgICAgICMgc3RhcnQgdGVzdAogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhIGZldyB0ZXN0IGNhbGVuZGFycwogICAgICAgIG15ICVDYWxlbmRhcjEgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyMSAkUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgIG15ICVDYWxlbmRhcjIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyMiAkUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNFQzkwNzMnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgIG15ICVDYWxlbmRhcjMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyMyAkUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyM2QkFENTQnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgIG15ICVDYWxlbmRhcjQgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyNCAkUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyM3OEE3RkMnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQyLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYSB0ZXN0IHRpY2tldAogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICJMaW5rIFRpY2tldCAkUmFuZG9tSUQiLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnb3BlbicsCiAgICAgICAgICAgIEN1c3RvbWVyTm8gICA9PiAnMTIzNDY1JywKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICdjdXN0b21lckBleGFtcGxlLmNvbScsCiAgICAgICAgICAgIE93bmVySUQgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICJUaWNrZXRDcmVhdGUoKSAtICRUaWNrZXRJRCIsCiAgICAgICAgKTsKICAgICAgICBteSAkVGlja2V0TnVtYmVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRpY2tldE51bWJlciwKICAgICAgICAgICAgIlRpY2tldE51bWJlckxvb2t1cCgpIC0gJFRpY2tldE51bWJlciIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnbyB0byBjYWxlbmRhciBvdmVydmlldyBwYWdlCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXciKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnICk7CgogICAgICAgICMgZ28gdG8gcHJldmlvdXMgd2VlawogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRvb2xiYXIgLmZjLXByZXYtYnV0dG9uJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyB2ZXJpZnkgYWxsIHRocmVlIGNhbGVuZGFycyBhcmUgdmlzaWJsZQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5DYWxlbmRhclN3aXRjaDp2aXNpYmxlJykubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgMywKICAgICAgICAgICAgJ0FsbCB0aHJlZSBjYWxlbmRhcnMgdmlzaWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBjbGljayBvbiB0aGUgdGltZWxpbmUgdmlldyBmb3IgYW4gYXBwb2ludG1lbnQgZGlhbG9nCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdGltZWxpbmVXZWVrLXZpZXcgLmZjLXNsYXRzIHRkLmZjLXdpZGdldC1jb250ZW50Om50aC1jaGlsZCg1KScsICdjc3MnICkKICAgICAgICAgICAgLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgZWxlbWVudHMgdGhhdCBhcmUgbm90IGFsbG93ZWQgaW4gZGlhbG9nCiAgICAgICAgZm9yIG15ICRFbGVtZW50IChxdyhFZGl0Rm9ybURlbGV0ZSBFZGl0Rm9ybUNvcHkpKSB7CiAgICAgICAgICAgICRFbGVtZW50RXhpc3RzLT4oCiAgICAgICAgICAgICAgICBVbml0VGVzdE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgID0+ICRFbGVtZW50LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICAgICduYW1lJyApLT5zZW5kX2tleXMoJ0FwcG9pbnRtZW50IDEnKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ0xvY2F0aW9uJywgJ25hbWUnICktPnNlbmRfa2V5cygnU3RyYXViaW5nJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS52YWwoIgogICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdFbmRIb3VyJywgICAgICAnbmFtZScgKS0+c2VuZF9rZXlzKCcxOCcpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLlBsdWdpbkZpZWxkJywgJ2NzcycgKS0+c2VuZF9rZXlzKCRUaWNrZXROdW1iZXIpOwoKICAgICAgICAjIHdhaXQgZm9yIGF1dG9jb21wbGV0ZSB0byBsb2FkCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoImxpLnVpLW1lbnUtaXRlbTp2aXNpYmxlIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICMgbGluayB0aGUgdGlja2V0CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnbGkudWktbWVudS1pdGVtJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB2ZXJpZnkgY29ycmVjdCB0aWNrZXQgaXMgbGlzdGVkCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLlBsdWdpbkNvbnRhaW5lciBkaXYgYVt0YXJnZXQ9XCJfYmxhbmtcIl0nKS50ZXh0KCk7IgogICAgICAgICAgICApLAogICAgICAgICAgICAiJFRpY2tldE51bWJlciBMaW5rIFRpY2tldCAkUmFuZG9tSUQiLAogICAgICAgICAgICAnTGluayB0aWNrZXQgdmlzaWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBsb2NhdGlvbiBsaW5rIGNvbnRhaW5zIGNvcnJlY3QgdmFsdWUKICAgICAgICBteSAkTG9jYXRpb25MaW5rVVJMID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuTG9jYXRpb25MaW5rJywgJ2NzcycgKS0+Z2V0X2F0dHJpYnV0ZSgnaHJlZicpOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkTG9jYXRpb25MaW5rVVJMID1+IC9TdHJhdWJpbmckLywKICAgICAgICAgICAgJ0xvY2F0aW9uIGxpbmsgY29udGFpbnMgY29ycmVjdCB2YWx1ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgIyB2ZXJpZnkgZmlyc3QgYXBwb2ludG1lbnQgaXMgdmlzaWJsZQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGUnKS50ZXh0KCk7IgogICAgICAgICAgICApLAogICAgICAgICAgICAnQXBwb2ludG1lbnQgMScsCiAgICAgICAgICAgICdGaXJzdCBhcHBvaW50bWVudCB2aXNpYmxlJywKICAgICAgICApOwoKICAgICAgICAjIGdvIHRvIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JHtUaWNrZXRJRH0iKTsKCiAgICAgICAgIyBmaW5kIGxpbmsgdG8gdGhlIGFwcG9pbnRtZW50IG9uIHBhZ2UKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2EuTGlua09iamVjdExpbmsnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgY2hlY2sgZGF0YQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNUaXRsZScpLnZhbCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ0FwcG9pbnRtZW50IDEnLAogICAgICAgICAgICAnVGl0bGUgbWF0Y2hlcycsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgJ0NhbGVuZGFyIG1hdGNoZXMnLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLlBsdWdpbkNvbnRhaW5lciBkaXYgYVt0YXJnZXQ9XCJfYmxhbmtcIl0nKS50ZXh0KCk7IgogICAgICAgICAgICApLAogICAgICAgICAgICAiJFRpY2tldE51bWJlciBMaW5rIFRpY2tldCAkUmFuZG9tSUQiLAogICAgICAgICAgICAnTGluayB0aWNrZXQgbWF0Y2hlcycsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBsb2NhdGlvbiBsaW5rIGNvbnRhaW5zIGNvcnJlY3QgdmFsdWUKICAgICAgICAkTG9jYXRpb25MaW5rVVJMID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuTG9jYXRpb25MaW5rJywgJ2NzcycgKS0+Z2V0X2F0dHJpYnV0ZSgnaHJlZicpOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkTG9jYXRpb25MaW5rVVJMID1+IC9TdHJhdWJpbmckLywKICAgICAgICAgICAgJ0xvY2F0aW9uIGxpbmsgY29udGFpbnMgY29ycmVjdCB2YWx1ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBjYW5jZWwgdGhlIGRpYWxvZwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtQ2FuY2VsJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGdvIHRvIHByZXZpb3VzIHdlZWsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5mYy10b29sYmFyIC5mYy1wcmV2LWJ1dHRvbicsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnICk7CgogICAgICAgICMgY2xpY2sgb24gdGhlIHRpbWVsaW5lIHZpZXcgZm9yIGFub3RoZXIgYXBwb2ludG1lbnQgZGlhbG9nCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdGltZWxpbmVXZWVrLXZpZXcgLmZjLXNsYXRzIHRkLmZjLXdpZGdldC1jb250ZW50Om50aC1jaGlsZCg1KScsICdjc3MnICkKICAgICAgICAgICAgLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ0FwcG9pbnRtZW50IDInKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjJ7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ0FsbERheScsICduYW1lJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGRpYWxvZyB0byBjbG9zZSBhbmQgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICMgaGlkZSB0aGUgZmlyc3QgY2FsZW5kYXIgZnJvbSB2aWV3CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdDYWxlbmRhcicgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9LCAnaWQnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB2ZXJpZnkgc2Vjb25kIGFwcG9pbnRtZW50IGlzIHZpc2libGUKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcuZmMtdGltZWxpbmUtZXZlbnQgLmZjLXRpdGxlJykudGV4dCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ0FwcG9pbnRtZW50IDInLAogICAgICAgICAgICAnU2Vjb25kIGFwcG9pbnRtZW50IHZpc2libGUnLAogICAgICAgICk7CgogICAgICAgICMgdmVyaWZ5IHNlY29uZCBhcHBvaW50bWVudCBpcyBhbiBhbGwgZGF5IGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLmZjLXRpbWVsaW5lLWV2ZW50IC5mYS1zdW4tbycpLmxlbmd0aDsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICcxJywKICAgICAgICAgICAgJ1NlY29uZCBhcHBvaW50bWVudCBpbiBhbiBhbGwgZGF5IGFwcG9pbnRtZW50JywKICAgICAgICApOwoKICAgICAgICAjIGNsaWNrIGFnYWluIG9uIHRoZSB0aW1lbGluZSB2aWV3IGZvciBhbiBhcHBvaW50bWVudCBkaWFsb2cKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5mYy10aW1lbGluZVdlZWstdmlldyAuZmMtc2xhdHMgdGQuZmMtd2lkZ2V0LWNvbnRlbnQ6bnRoLWNoaWxkKDUpJywgJ2NzcycgKQogICAgICAgICAgICAtPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPnNlbmRfa2V5cygnQXBwb2ludG1lbnQgMycpOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyM3tDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnRW5kSG91cicsICduYW1lJyApLT5zZW5kX2tleXMoJzE4Jyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdEYWlseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGRpYWxvZyB0byBjbG9zZSBhbmQgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICMgaGlkZSB0aGUgc2Vjb25kIGNhbGVuZGFyIGZyb20gdmlldwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnQ2FsZW5kYXInIC4gJENhbGVuZGFyMntDYWxlbmRhcklEfSwgJ2lkJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgdmVyaWZ5IGFsbCB0aGlyZCBhcHBvaW50bWVudCBvY2N1cmVuY2VzIGFyZSB2aXNpYmxlCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aXRsZScpLmxlbmd0aDsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICc0JywKICAgICAgICAgICAgJ0FsbCB0aGlyZCBhcHBvaW50bWVudCBvY2N1cnJlbmNlcyB2aXNpYmxlJywKICAgICAgICApOwoKICAgICAgICAjIGNsaWNrIG9uIGFuIGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdGltZWxpbmUtZXZlbnQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgY2xpY2sgb24gRGVsZXRlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1EZWxldGUnLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAjIGNvbmZpcm0KICAgICAgICAkU2VsZW5pdW0tPmFjY2VwdF9hbGVydCgpOwoKICAgICAgICAjIHdhaXQgZm9yIGRpYWxvZyB0byBjbG9zZSBhbmQgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICMgdmVyaWZ5IGFsbCB0aGlyZCBhcHBvaW50bWVudCBvY2N1cmVuY2VzIGhhdmUgYmVlbiByZW1vdmVkCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aXRsZScpLmxlbmd0aDsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICcwJywKICAgICAgICAgICAgJ0FsbCB0aGlyZCBhcHBvaW50bWVudCBvY2N1cnJlbmNlcyByZW1vdmVkJywKICAgICAgICApOwoKICAgICAgICAjIHNob3cgYWxsIHRocmVlIGNhbGVuZGFycwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnQ2FsZW5kYXInIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwgJ2lkJyApLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdDYWxlbmRhcicgLiAkQ2FsZW5kYXIye0NhbGVuZGFySUR9LCAnaWQnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnICk7CgogICAgICAgICMgdmVyaWZ5IG9ubHkgdHdvIGFwcG9pbnRtZW50cyBhcmUgdmlzaWJsZQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGUnKS5sZW5ndGg7IgogICAgICAgICAgICApLAogICAgICAgICAgICAnMicsCiAgICAgICAgICAgICdGaXJzdCBhbmQgc2Vjb25kIGFwcG9pbnRtZW50IHZpc2libGUnLAogICAgICAgICk7CgogICAgICAgICMgb3BlbiBkYXRlcGlja2VyCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdG9vbGJhciAuZmMtanVtcC1idXR0b24nLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5BSkFYTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyB2ZXJpZnkgZXhhY3RseSBvbmUgZGF5IHdpdGggYXBwb2ludG1lbnRzIGlzIGhpZ2hsaWdodGVkCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIgLkhpZ2hsaWdodCcpLmxlbmd0aDsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICdEYXRlcGlja2VyIHByb3Blcmx5IGhpZ2hsaWdodGVkJywKICAgICAgICApOwoKICAgICAgICAjIGNsb3NlIGRhdGVwaWNrZXIKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2RpdiNEYXRlcGlja2VyT3ZlcmxheScsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBmaWx0ZXIganVzdCB0aGlyZCBjYWxlbmRhcgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnaW5wdXQjRmlsdGVyQ2FsZW5kYXJzJywgJ2NzcycgKS0+c2VuZF9rZXlzKCdDYWxlbmRhcjMnKTsKCiAgICAgICAgIyB3YWl0IGZvciBmaWx0ZXIgdG8gZmluaXNoCiAgICAgICAgc2xlZXAgMTsKCiAgICAgICAgIyB2ZXJpZnkgb25seSBvbmUgY2FsZW5kYXIgaXMgc2hvd24gaW4gdGhlIGxpc3QKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcuQ2FsZW5kYXJTd2l0Y2g6dmlzaWJsZScpLmxlbmd0aDsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICdDYWxlbmRhcnMgYXJlIGZpbHRlcmVkIGNvcnJlY3RseScsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IEFwcG9pbnRtZW50IChhcyByb290KQogICAgICAgIG15ICRTdGFydFRpbWUgICAgICAgPSAkVGltZU9iamVjdC0+Q3VycmVudFRpbWVzdGFtcCgpOwogICAgICAgIG15ICRTdGFydFRpbWVTeXN0ZW0gPSAkVGltZU9iamVjdC0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CiAgICAgICAgJFN0YXJ0VGltZSA9ICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lU3lzdGVtIC0gNyAqIDI0ICogNjAgKiA2MCwgICAgIyBsYXN0IHdlZWsKICAgICAgICApOwoKICAgICAgICBteSAkRW5kVGltZSA9ICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lU3lzdGVtIC0gNyAqIDI0ICogNjAgKiA2MCArIDIgKiA2MCAqIDYwLCAgICAjIDIgaG91cnMgYWZ0ZXIgc3RhcnQgdGltZQogICAgICAgICk7CgogICAgICAgIG15ICRBcHBvaW50bWVudElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgPT4gJENhbGVuZGFyNHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJ1Blcm1pc3Npb25zIGNoZWNrIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywKICAgICAgICAgICAgTG9jYXRpb24gICAgPT4gJ1N0cmF1YmluZycsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgIEVuZFRpbWUgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICA9PiAwLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgJ1Blcm1pc3Npb24gQXBwb2ludG1lbnQgY3JlYXRlZC4nLAogICAgICAgICk7CgogICAgICAgICMgYWRkIHJvIHBlcm1pc3Npb25zIHRvIHRoZSB1c2VyCiAgICAgICAgJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cElEMiwKICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgIHJvID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgcmVsb2FkIHBhZ2UKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyIpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBzaG93IHRoZSBmb3VydGggY2FsZW5kYXIgYW5kIGhpZGUgYWxsIG90aGVycwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnQ2FsZW5kYXInIC4gJENhbGVuZGFyNHtDYWxlbmRhcklEfSwgJ2lkJyApLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdDYWxlbmRhcicgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9LCAnaWQnICktPlZlcmlmaWVkQ2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ0NhbGVuZGFyJyAuICRDYWxlbmRhcjJ7Q2FsZW5kYXJJRH0sICdpZCcgKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnQ2FsZW5kYXInIC4gJENhbGVuZGFyM3tDYWxlbmRhcklEfSwgJ2lkJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgZ28gdG8gcHJldmlvdXMgd2VlawogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRvb2xiYXIgLmZjLXByZXYtYnV0dG9uJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBmaW5kIHRoZSBhcHBvaW50bWVudCBsaW5rCiAgICAgICAgbXkgJEFwcG9pbnRtZW50TGluayA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLWV2ZW50LWNvbnRhaW5lciBhJywgJ2NzcycgKTsKICAgICAgICAkU2VsZW5pdW0tPm1vdXNlX21vdmVfdG9fbG9jYXRpb24oJEFwcG9pbnRtZW50TGluayk7CgogICAgICAgICMgY2xpY2sgb24gYXBwb2ludG1lbnQKICAgICAgICAkQXBwb2ludG1lbnRMaW5rLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgY2hlY2sgaWYgZmllbGRzIGFyZSBkaXNhYmxlZAogICAgICAgIEVMRU1FTlQ6CiAgICAgICAgZm9yIG15ICRFbGVtZW50ICgKICAgICAgICAgICAgcXcoVGl0bGUgRGVzY3JpcHRpb24gTG9jYXRpb24gQ2FsZW5kYXJJRCBUZWFtSUQgUmVzb3VyY2VJRCBTdGFydERheSBFbmREYXkgQWxsRGF5CiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgIyBjaGVjayBpZiB0ZWFtIG9iamVjdCBpcyByZWdpc3RlcmVkCiAgICAgICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICAgICAgICAgbmV4dCBFTEVNRU5UIGlmICRFbGVtZW50IGVxICdUZWFtSUQnIHx8ICRFbGVtZW50IGVxICdSZXNvdXJjZUlEJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEVsZW1lbnRSZWFkT25seS0+KAogICAgICAgICAgICAgICAgVW5pdFRlc3RPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICA9PiAkRWxlbWVudCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBhbGxvd2VkIG9uIHBhZ2UKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKHF3KEVkaXRGb3JtU3VibWl0IEVkaXRGb3JtRGVsZXRlIEVkaXRGb3JtQ29weSkpIHsKICAgICAgICAgICAgJEVsZW1lbnRFeGlzdHMtPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSBvbiBwYWdlCiAgICAgICAgZm9yIG15ICRFbGVtZW50IChxdyhFZGl0Rm9ybUNhbmNlbCkpIHsKICAgICAgICAgICAgJEVsZW1lbnRFeGlzdHMtPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjbGljayBvbiBjYW5jZWwKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybUNhbmNlbCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBhZGQgbW92ZV9pbnRvIHBlcm1pc3Npb25zIHRvIHRoZSB1c2VyCiAgICAgICAgJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cElEMiwKICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgbW92ZV9pbnRvID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgY2xpY2sgb24gYXBwb2ludG1lbnQKICAgICAgICAkQXBwb2ludG1lbnRMaW5rLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgY2hlY2sgaWYgZmllbGRzIGFyZSBkaXNhYmxlZAogICAgICAgIGZvciBteSAkRWxlbWVudCAocXcoIENhbGVuZGFySUQgKSkgewogICAgICAgICAgICAkRWxlbWVudFJlYWRPbmx5LT4oCiAgICAgICAgICAgICAgICBVbml0VGVzdE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgID0+ICRFbGVtZW50LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgZmllbGRzIGFyZSBlbmFibGVkCiAgICAgICAgRUxFTUVOVDoKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKAogICAgICAgICAgICBxdyhUaXRsZSBEZXNjcmlwdGlvbiBMb2NhdGlvbiBUZWFtSUQgUmVzb3VyY2VJRCBTdGFydERheSBFbmREYXkgQWxsRGF5IFJlY3VycmVuY2VUeXBlKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAjIGNoZWNrIGlmIHRlYW0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQKICAgICAgICAgICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScsIFNpbGVudCA9PiAxICkgKSB7CiAgICAgICAgICAgICAgICBuZXh0IEVMRU1FTlQgaWYgJEVsZW1lbnQgZXEgJ1RlYW1JRCcgfHwgJEVsZW1lbnQgZXEgJ1Jlc291cmNlSUQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRWxlbWVudFJlYWRPbmx5LT4oCiAgICAgICAgICAgICAgICBVbml0VGVzdE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgID0+ICRFbGVtZW50LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZWxlbWVudHMgdGhhdCBhcmUgbm90IGFsbG93ZWQgb24gcGFnZQogICAgICAgIGZvciBteSAkRWxlbWVudCAocXcoRWRpdEZvcm1EZWxldGUgRWRpdEZvcm1Db3B5KSkgewogICAgICAgICAgICAkRWxlbWVudEV4aXN0cy0+KAogICAgICAgICAgICAgICAgVW5pdFRlc3RPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICA9PiAkRWxlbWVudCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIG9uIHBhZ2UKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKHF3KEVkaXRGb3JtU3VibWl0IEVkaXRGb3JtQ2FuY2VsKSkgewogICAgICAgICAgICAkRWxlbWVudEV4aXN0cy0+KAogICAgICAgICAgICAgICAgVW5pdFRlc3RPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICA9PiAkRWxlbWVudCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNsaWNrIG9uIGNhbmNlbAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtQ2FuY2VsJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGFkZCBjcmVhdGUgcGVybWlzc2lvbnMgdG8gdGhlIHVzZXIKICAgICAgICAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Hcm91cFVzZXJBZGQoCiAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwSUQyLAogICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgcm8gICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBtb3ZlX2ludG8gPT4gMSwKICAgICAgICAgICAgICAgIGNyZWF0ZSAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGNsaWNrIG9uIGFwcG9pbnRtZW50CiAgICAgICAgJEFwcG9pbnRtZW50TGluay0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGNoZWNrIGlmIGZpZWxkcyBhcmUgZW5hYmxlZAogICAgICAgIEVMRU1FTlQ6CiAgICAgICAgZm9yIG15ICRFbGVtZW50ICgKICAgICAgICAgICAgcXcoVGl0bGUgRGVzY3JpcHRpb24gTG9jYXRpb24gQ2FsZW5kYXJJRCBUZWFtSUQgUmVzb3VyY2VJRCBTdGFydERheSBFbmREYXkgQWxsRGF5CiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgIyBjaGVjayBpZiB0ZWFtIG9iamVjdCBpcyByZWdpc3RlcmVkCiAgICAgICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICAgICAgICAgbmV4dCBFTEVNRU5UIGlmICRFbGVtZW50IGVxICdUZWFtSUQnIHx8ICRFbGVtZW50IGVxICdSZXNvdXJjZUlEJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEVsZW1lbnRSZWFkT25seS0+KAogICAgICAgICAgICAgICAgVW5pdFRlc3RPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICA9PiAkRWxlbWVudCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIG9uIHBhZ2UKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKHF3KEVkaXRGb3JtQ29weSBFZGl0Rm9ybVN1Ym1pdCBFZGl0Rm9ybURlbGV0ZSBFZGl0Rm9ybUNhbmNlbCkpIHsKICAgICAgICAgICAgJEVsZW1lbnRFeGlzdHMtPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0sCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgb3ZlcnJpZGUgbG9jYWwgdGltZSB6b25lIGZvciBkdXJhdGlvbiBvZiB0aGUgdGVzdApsb2NhbCAkRU5We1RafSA9ICdVVEMnOwoKIyBnZXQgc2VsZW5pdW0gb2JqZWN0Cm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICAgICAgbXkgJEhlbHBlciAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKICAgICAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICAgICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CiAgICAgICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKICAgICAgICBteSAkVXNlck9iamVjdCAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICAgICBteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGdyb3VwCiAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICJ0ZXN0LWNhbGVuZGFyLWdyb3VwLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIGdldCBjdXJyZW50IHN5c3RlbSB0aW1lCiAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCk7CgogICAgICAgICMgYWRkIDEgbW9udGgKICAgICAgICAkU3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+QWRkUGVyaW9kKAogICAgICAgICAgICBUaW1lICAgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgICAgIE1vbnRocyA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGRhdGUgaW5mbyAoU2Vjb25kLCBNaW51dGUsIEhvdXIsIERheSwgTW9udGgsIFllYXIsIERheU9mV2VlaykKICAgICAgICBteSBARGF0ZUluZm8gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGFuZ2UgcmVzb2x1dGlvbiAoZGVza3RvcCBtb2RlKQogICAgICAgICRTZWxlbml1bS0+c2V0X3dpbmRvd19zaXplKCA3NjgsIDEwNTAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB1c2VyCiAgICAgICAgbXkgJExhbmd1YWdlICAgICAgPSAnZW4nOwogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyAgID0+IFsgJ3VzZXJzJywgJEdyb3VwTmFtZSBdLAogICAgICAgICAgICBMYW5ndWFnZSA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICMgZ2V0IFVzZXJJRAogICAgICAgIG15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgc3RhcnQgdGVzdAogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhIGZldyB0ZXN0IGNhbGVuZGFycwogICAgICAgIG15ICVDYWxlbmRhcjEgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIk15IENhbGVuZGFyICRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ28gdG8gY2FsZW5kYXIgb3ZlcnZpZXcgcGFnZQogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3Iik7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJyApOwoKICAgICAgICAjIGNsaWNrIG9uIHRoZSBtb250aCB2aWV3CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtbW9udGgtYnV0dG9uJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBnbyB0byBuZXh0IG1vbnRoCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdG9vbGJhciAuZmMtbmV4dC1idXR0b24nLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJyApOwoKICAgICAgICAjIGdldCBkYXRlIGluZm8gKFNlY29uZCwgTWludXRlLCBIb3VyLCBEYXksIE1vbnRoLCBZZWFyLCBEYXlPZldlZWspCiAgICAgICAgbXkgJERhdGFEYXRlID0gIiREYXRlSW5mb1s1XS0iOwogICAgICAgIGlmICggJERhdGVJbmZvWzRdIDwgMTAgKSB7CiAgICAgICAgICAgICREYXRhRGF0ZSAuPSAiMCI7CiAgICAgICAgfQogICAgICAgICREYXRhRGF0ZSAuPSAiJERhdGVJbmZvWzRdLTAxIjsKCiAgICAgICAgIyBjcmVhdGUgZXZlcnkgZGF5IGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdFdmVyeSBkYXknKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZVR5cGUnKS52YWwoJ0RhaWx5JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50czEgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9LAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGVyZSBhcmUgNCBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRzMSwKICAgICAgICAgICAgNCwKICAgICAgICAgICAgIkNyZWF0ZSBkYWlseSByZWN1cnJpbmcgYXBwb2ludG1lbnQuIgogICAgICAgICk7CgogICAgICAgIG15ICREZWxldGUxID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzMVswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGUxLAogICAgICAgICAgICAiRGVsZXRlIGRhaWx5IHJlY3VycmluZyBhcHBvaW50bWVudHMuIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBldmVyeSB3ZWVrIGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdFdmVyeSB3ZWVrJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS52YWwoIgogICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdXZWVrbHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSAzIGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VMaW1pdCcpLnZhbCgnMicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdSZWN1cnJlbmNlQ291bnQnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCczJyk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzMiA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSAzIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMyLAogICAgICAgICAgICAzLAogICAgICAgICAgICAiQ3JlYXRlIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQuIgogICAgICAgICk7CgogICAgICAgIG15ICRTdGFydEFwcG9pbnRtZW50ICAgICAgID0gIiREYXRhRGF0ZSAwMDowMDowMCI7CiAgICAgICAgbXkgJFN0YXJ0QXBwb2ludG1lbnRTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnRBcHBvaW50bWVudCwKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnQyU3RhcnRUaW1lcyA9ICgKICAgICAgICAgICAgJFN0YXJ0QXBwb2ludG1lbnQsCiAgICAgICAgICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRBcHBvaW50bWVudFN5c3RlbSArIDcgKiAyNCAqIDM2MDAsCiAgICAgICAgICAgICksCiAgICAgICAgICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRBcHBvaW50bWVudFN5c3RlbSArIDE0ICogMjQgKiAzNjAwLAogICAgICAgICAgICApLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkSW5kZXggKCAwIC4uIDIgKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHMyWyRJbmRleF0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50MlN0YXJ0VGltZXNbJEluZGV4XSwKICAgICAgICAgICAgICAgICJDaGVjayBzdGFydCB0aW1lICMkSW5kZXgiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgbXkgJERlbGV0ZTIgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHMyWzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlbGV0ZTIsCiAgICAgICAgICAgICJEZWxldGUgd2Vla2x5IHJlY3VycmluZyBhcHBvaW50bWVudHMuIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBldmVyeSBtb250aCBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPnNlbmRfa2V5cygnRXZlcnkgbW9udGgnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZVR5cGUnKS52YWwoJ01vbnRobHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSAzIGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VMaW1pdCcpLnZhbCgnMicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdSZWN1cnJlbmNlQ291bnQnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCczJyk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzMyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSAzIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMzLAogICAgICAgICAgICAzLAogICAgICAgICAgICAiQ3JlYXRlIG1vbnRobHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50LiIKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnQzU3RhcnRUaW1lcyA9ICgKICAgICAgICAgICAgJFN0YXJ0QXBwb2ludG1lbnQsCiAgICAgICAgICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkFkZFBlcmlvZCgKICAgICAgICAgICAgICAgICAgICBNb250aHMgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUaW1lICAgPT4gJFN0YXJ0QXBwb2ludG1lbnRTeXN0ZW0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLAogICAgICAgICAgICAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgICAgICAgICAgTW9udGhzID0+IDIsCiAgICAgICAgICAgICAgICAgICAgVGltZSAgID0+ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiAyICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzM1skSW5kZXhdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudDNTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIGFwcG9pbnRtZW50cwogICAgICAgIG15ICREZWxldGUzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzM1swXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGUzLAogICAgICAgICAgICAiRGVsZXRlIG1vbnRobHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50cy4iLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGV2ZXJ5IHllYXIgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ0V2ZXJ5IHllYXInKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZVR5cGUnKS52YWwoJ1llYXJseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIDMgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJzMnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudHM0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlcmUgYXJlIDMgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50czQsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgICJDcmVhdGUgeWVhcmx5IHJlY3VycmluZyBhcHBvaW50bWVudC4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50NFN0YXJ0VGltZXMgPSAoCiAgICAgICAgICAgICRTdGFydEFwcG9pbnRtZW50LAogICAgICAgICAgICAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgICAgICAgICAgWWVhcnMgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUaW1lICA9PiAkU3RhcnRBcHBvaW50bWVudFN5c3RlbSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICksCiAgICAgICAgICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkFkZFBlcmlvZCgKICAgICAgICAgICAgICAgICAgICBZZWFycyA9PiAyLAogICAgICAgICAgICAgICAgICAgIFRpbWUgID0+ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiAyICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzNFskSW5kZXhdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudDRTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIGFwcG9pbnRtZW50cwogICAgICAgIG15ICREZWxldGU0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzNFswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGU0LAogICAgICAgICAgICAiRGVsZXRlIHllYXJseSByZWN1cnJpbmcgYXBwb2ludG1lbnRzLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYXBwb2ludG1lbnQgZXZlcnkgc2Vjb25kIGRheQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPnNlbmRfa2V5cygnRXZlcnkgMm5kIGRheScpOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnQ3VzdG9tJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGpzIHNob3dzIEludGVydmFsCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUludGVydmFsOnZpc2libGUiKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgZWFjaCAybmQgZGF5CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VJbnRlcnZhbCcpLnZhbCgyKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgMyBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlTGltaXQnKS52YWwoJzInKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnUmVjdXJyZW5jZUNvdW50JywgJ25hbWUnICktPnNlbmRfa2V5cygnMycpOwoKICAgICAgICAjIGNsaWNrIG9uIFNhdmUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBkaWFsb2cgdG8gY2xvc2UgYW5kIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzNSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSAzIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHM1LAogICAgICAgICAgICAzLAogICAgICAgICAgICAiQ3JlYXRlIGN1c3RvbSBkYWlseSByZWN1cnJpbmcgYXBwb2ludG1lbnQuIgogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudDVTdGFydFRpbWVzID0gKAogICAgICAgICAgICAkU3RhcnRBcHBvaW50bWVudCwKICAgICAgICAgICAgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtICsgMiAqIDI0ICogMzYwMCwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtICsgNCAqIDI0ICogMzYwMCwKICAgICAgICAgICAgKSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiAyICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzNVskSW5kZXhdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudDVTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREZWxldGU1ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzNVswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGU1LAogICAgICAgICAgICAiRGVsZXRlIGN1c3RvbSBkYWlseSByZWN1cnJpbmcgYXBwb2ludG1lbnRzLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgY3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ0V2ZXJ5IDJuZCBNb25kYXksIFdlZG5lc2RheSBhbmQgU3VuZGF5Jyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS52YWwoIgogICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdDdXN0b20nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIHdhaXQgdW50aWwganMgc2hvd3MgSW50ZXJ2YWwKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlSW50ZXJ2YWw6dmlzaWJsZSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZUN1c3RvbVR5cGUnKS52YWwoJ0N1c3RvbVdlZWtseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCBmb3IganMKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2OnZpc2libGUiKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgIyBkZXNlbGVjdCBzZWxlY3RlZCBkYXkKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgaXQncyBkZXNlbGVjdGVkCiAgICAgICAgbXkgJERlc2VsZWN0ZWQ2ID0gJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuICEkKCIjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlIikubGVuZ3RoOycKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVzZWxlY3RlZDYsCiAgICAgICAgICAgICJDaGVjayBpZiBub3RoaW5nIGlzIHNlbGVjdGVkICgjNikuIgogICAgICAgICk7CgogICAgICAgICMgc2VsZWN0IE1vbgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uW3ZhbHVlPVwiMVwiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2VsZWN0ZWQgc3VjY2Vzc2Z1bAogICAgICAgIG15ICRXYWl0NkZvcjEgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvblt2YWx1ZT1cIjFcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIiknCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQ2Rm9yMSwKICAgICAgICAgICAgIkN1c3RvbSB3ZWVrbHkgYXBwb2ludG1lbnQgLSBjaGVjayBpZiBNb25kYXkgaXMgc2VsZWN0ZWQuIgogICAgICAgICk7CgogICAgICAgICMgc2VsZWN0IFdlZAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uW3ZhbHVlPVwiM1wiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2VsZWN0ZWQgc3VjY2Vzc2Z1bAogICAgICAgIG15ICRXYWl0NkZvcjMgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvblt2YWx1ZT1cIjNcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIiknCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQ2Rm9yMywKICAgICAgICAgICAgIkN1c3RvbSB3ZWVrbHkgYXBwb2ludG1lbnQgLSBjaGVjayBpZiBXZWRuZXNkYXkgaXMgc2VsZWN0ZWQuIgogICAgICAgICk7CgogICAgICAgICMgc2VsZWN0IFN1bgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uW3ZhbHVlPVwiN1wiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2VsZWN0ZWQgc3VjY2Vzc2Z1bAogICAgICAgIG15ICRXYWl0NkZvcjcgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvblt2YWx1ZT1cIjdcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIiknCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQ2Rm9yNywKICAgICAgICAgICAgIkN1c3RvbSB3ZWVrbHkgYXBwb2ludG1lbnQgLSBjaGVjayBpZiBTdW5kYXkgaXMgc2VsZWN0ZWQuIgogICAgICAgICk7CgogICAgICAgICMgc2V0IGVhY2ggMm5kIHdlZWsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZUludGVydmFsJykudmFsKDIpOyIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSA2IGFwcG9pbnRtZW50cwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlTGltaXQnKS52YWwoJzInKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnUmVjdXJyZW5jZUNvdW50JywgJ25hbWUnICktPnNlbmRfa2V5cygnNicpOwoKICAgICAgICAjIGNsaWNrIG9uIFNhdmUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBkaWFsb2cgdG8gY2xvc2UgYW5kIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzNiA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSA2IGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHM2LAogICAgICAgICAgICA2LAogICAgICAgICAgICAiQ3JlYXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50LiIKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnQ2U3RhcnRUaW1lczsKICAgICAgICBteSAkU3lzdGVtVGltZTYgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAiJERhdGFEYXRlIDAwOjAwOjAwIiwKICAgICAgICApOwoKICAgICAgICBteSAkTGFzdENXNjsKCiAgICAgICAgd2hpbGUgKCBzY2FsYXIgQEFwcG9pbnRtZW50NlN0YXJ0VGltZXMgIT0gNiApIHsKICAgICAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAoICRUbXAsICRDVzYgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lNiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIGN1cnJlbnQgZGF5CiAgICAgICAgICAgIGlmICggISRMYXN0Q1c2ICkgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQ2U3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTYsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RDVzYgPSAkQ1c2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICggZ3JlcCB7ICREYXlPZldlZWsgPT0gJF8gfSAoIDEsIDMsIDcgKSApICAgICMgY2hlY2sgaWYgZGF5IGlzIHZhbGlkCiAgICAgICAgICAgICAgICAmJiAoICggJENXNiAtICRMYXN0Q1c2ICkgJSAyID09IDAgKSAgICAgICAgICAjIGNoZWNrIGlmIEludGVydmFsIG1hdGNoZXMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQ2U3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTYsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RDVzYgPSAkQ1c2OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBvbmUgZGF5CiAgICAgICAgICAgICRTeXN0ZW1UaW1lNiArPSAyNCAqIDM2MDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiA1ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzNlskSW5kZXhdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudDZTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREZWxldGU2ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzNlswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGU2LAogICAgICAgICAgICAiRGVsZXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50cy4iLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50KHdpdGhvdXQgYW55dGhpbmcgc2VsZWN0ZWQpCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdDdXN0b20gd2Vla2x5IHdpdGhvdXQgYW55dGhpbmcgc2VsZWN0ZWQnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZVR5cGUnKS52YWwoJ0N1c3RvbScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBqcyBzaG93cyBJbnRlcnZhbAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VJbnRlcnZhbDp2aXNpYmxlIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlQ3VzdG9tVHlwZScpLnZhbCgnQ3VzdG9tV2Vla2x5JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IGZvciBqcwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXY6dmlzaWJsZSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAjIGRlc2VsZWN0IHNlbGVjdGVkIGRheQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUnKS5jbGljaygpOyIKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBpdCdzIGRlc2VsZWN0ZWQKICAgICAgICBteSAkRGVzZWxlY3RlZDcgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gISQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5sZW5ndGg7JwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZXNlbGVjdGVkNywKICAgICAgICAgICAgIkNoZWNrIGlmIG5vdGhpbmcgaXMgc2VsZWN0ZWQgKCM3KS4iCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgZWFjaCAybmQgd2VlawogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlSW50ZXJ2YWwnKS52YWwoMik7IgogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIDMgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VMaW1pdCcpLnZhbCgnMicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdSZWN1cnJlbmNlQ291bnQnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCczJyk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGRpYWxvZyB0byBjbG9zZSBhbmQgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudHM3ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlcmUgYXJlIDMgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50czcsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgICJDcmVhdGUgY3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQod2l0aG91dCBhbnkgZGF5IHNlbGVjdGVkKS4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50N1N0YXJ0VGltZXM7CiAgICAgICAgbXkgJFN5c3RlbVRpbWU3ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gIiREYXRhRGF0ZSAwMDowMDowMCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhc3RDVzc7CiAgICAgICAgbXkgJERheU9mV2Vlazc7CgogICAgICAgIHdoaWxlICggc2NhbGFyIEBBcHBvaW50bWVudDdTdGFydFRpbWVzICE9IDMgKSB7CiAgICAgICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU3LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgKCAkVG1wLCAkQ1c3ICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPldlZWtEZXRhaWxzR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBjdXJyZW50IGRheQogICAgICAgICAgICBpZiAoICEkTGFzdENXNyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50N1N0YXJ0VGltZXMsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU3LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXN0Q1c3ICAgID0gJENXNzsKICAgICAgICAgICAgICAgICREYXlPZldlZWs3ID0gJERheU9mV2VlawogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICggJERheU9mV2VlayA9PSAkRGF5T2ZXZWVrNyApICAgICMgY2hlY2sgaWYgZGF5IGlzIHZhbGlkCiAgICAgICAgICAgICAgICAmJiAoICggJENXNyAtICRMYXN0Q1c3ICkgJSAyID09IDAgKSAgICAjIGNoZWNrIGlmIEludGVydmFsIG1hdGNoZXMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQ3U3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RDVzcgPSAkQ1c3OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBvbmUgZGF5CiAgICAgICAgICAgICRTeXN0ZW1UaW1lNyArPSAyNCAqIDM2MDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiAyICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzN1skSW5kZXhdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudDdTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREZWxldGU3ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzN1swXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGU3LAogICAgICAgICAgICAiRGVsZXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50cy4iLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGN1c3RvbSBtb250aGx5IHJlY3VycmluZyBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPnNlbmRfa2V5cygnRXZlcnkgMm5kIG1vbnRoLCBvbiAzdGgsIDEwdGggYW5kIDMxdGggb2YgbW9udGguJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS52YWwoIgogICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdDdXN0b20nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIHdhaXQgdW50aWwganMgc2hvd3MgSW50ZXJ2YWwKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlSW50ZXJ2YWw6dmlzaWJsZSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZUN1c3RvbVR5cGUnKS52YWwoJ0N1c3RvbU1vbnRobHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIHdhaXQgZm9yIGpzCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXY6dmlzaWJsZSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAjIGRlc2VsZWN0IHNlbGVjdGVkIGRheQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgaXQncyBkZXNlbGVjdGVkCiAgICAgICAgbXkgJERlc2VsZWN0ZWQ4ID0gJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuICEkKCIjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZSIpLmxlbmd0aDsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlc2VsZWN0ZWQ4LAogICAgICAgICAgICAiQ2hlY2sgaWYgbm90aGluZyBpcyBzZWxlY3RlZCAoIzgpLiIKICAgICAgICApOwoKICAgICAgICAjIHNlbGVjdCAzdGgKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b25bdmFsdWU9XCIzXCJdJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZWxlY3RlZCBzdWNjZXNzZnVsCiAgICAgICAgbXkgJFdhaXQ4Rm9yMyA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvblt2YWx1ZT1cIjNcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIiknCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQ4Rm9yMywKICAgICAgICAgICAgIkN1c3RvbSBtb250aGx5IGFwcG9pbnRtZW50IC0gY2hlY2sgaWYgMyBpcyBzZWxlY3RlZC4iCiAgICAgICAgKTsKCiAgICAgICAgIyBzZWxlY3QgMTB0aAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvblt2YWx1ZT1cIjEwXCJdJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZWxlY3RlZCBzdWNjZXNzZnVsCiAgICAgICAgbXkgJFdhaXQ4Rm9yMTAgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b25bdmFsdWU9XCIxMFwiXSIpLmhhc0NsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKScKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkV2FpdDhGb3IxMCwKICAgICAgICAgICAgIkN1c3RvbSBtb250aGx5IGFwcG9pbnRtZW50IC0gY2hlY2sgaWYgMTAgaXMgc2VsZWN0ZWQuIgogICAgICAgICk7CgogICAgICAgICMgc2VsZWN0IDMxCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgYnV0dG9uW3ZhbHVlPVwiMzFcIl0nKS5jbGljaygpOyIKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHNlbGVjdGVkIHN1Y2Nlc3NmdWwKICAgICAgICBteSAkV2FpdDhGb3IzMSA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvblt2YWx1ZT1cIjMxXCJdIikuaGFzQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpJwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRXYWl0OEZvcjMxLAogICAgICAgICAgICAiQ3VzdG9tIG1vbnRobHkgYXBwb2ludG1lbnQgLSBjaGVjayBpZiAzMSBpcyBzZWxlY3RlZC4iCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgZWFjaCAybmQgd2VlawogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlSW50ZXJ2YWwnKS52YWwoMik7IgogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIDIwIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlTGltaXQnKS52YWwoJzInKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnUmVjdXJyZW5jZUNvdW50JywgJ25hbWUnICktPnNlbmRfa2V5cygnMjAnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50czggPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9LAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGVyZSBhcmUgMjAgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50czgsCiAgICAgICAgICAgIDIwLAogICAgICAgICAgICAiQ3JlYXRlIGN1c3RvbSBtb250aGx5IHJlY3VycmluZyBhcHBvaW50bWVudC4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50OFN0YXJ0VGltZXM7CiAgICAgICAgbXkgJFN5c3RlbVRpbWU4ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gIiREYXRhRGF0ZSAwMDowMDowMCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhc3RNb250aDg7CgogICAgICAgIHdoaWxlICggc2NhbGFyIEBBcHBvaW50bWVudDhTdGFydFRpbWVzICE9IDIwICkgewogICAgICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lOCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRMYXN0TW9udGg4ICkgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQ4U3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTgsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RNb250aDggPSAkTW9udGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgKCBncmVwIHsgJERheSA9PSAkXyB9ICggMywgMTAsIDMxICkgKSAgICAjIGNoZWNrIGlmIGRheSBpcyB2YWxpZAogICAgICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgICAgICggJE1vbnRoIC0gJExhc3RNb250aDggKSAlIDIgPT0gMCAgICAjIGNoZWNrIGlmIEludGVydmFsIG1hdGNoZXMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQ4U3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTgsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBvbmUgZGF5CiAgICAgICAgICAgICRTeXN0ZW1UaW1lOCArPSAyNCAqIDM2MDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiAxOSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50czhbJEluZGV4XS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQ4U3RhcnRUaW1lc1skSW5kZXhdLAogICAgICAgICAgICAgICAgIkNoZWNrIHN0YXJ0IHRpbWUgIyRJbmRleCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRGVsZXRlOCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50czhbMF0tPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVsZXRlOCwKICAgICAgICAgICAgIkRlbGV0ZSBjdXN0b20gbW9udGhseSByZWN1cnJpbmcgYXBwb2ludG1lbnRzLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgY3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQod2l0aG91dCBhbnl0aGluZyBzZWxlY3RlZCkKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ0N1c3RvbSBtb250aGx5IHdpdGhvdXQgYW55dGhpbmcgc2VsZWN0ZWQnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZVR5cGUnKS52YWwoJ0N1c3RvbScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBqcyBzaG93cyBJbnRlcnZhbAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VJbnRlcnZhbDp2aXNpYmxlIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlQ3VzdG9tVHlwZScpLnZhbCgnQ3VzdG9tTW9udGhseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCBmb3IganMKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdjp2aXNpYmxlIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICMgZGVzZWxlY3Qgc2VsZWN0ZWQgZGF5CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUnKS5jbGljaygpOyIKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBpdCdzIGRlc2VsZWN0ZWQKICAgICAgICBteSAkRGVzZWxlY3RlZDkgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gISQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlIikubGVuZ3RoOycKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVzZWxlY3RlZDksCiAgICAgICAgICAgICJDaGVjayBpZiBub3RoaW5nIGlzIHNlbGVjdGVkICgjOSkuIgogICAgICAgICk7CgogICAgICAgICMgc2V0IGVhY2ggMm5kIHllYXIKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZUludGVydmFsJykudmFsKDIpOyIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSAzIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlTGltaXQnKS52YWwoJzInKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnUmVjdXJyZW5jZUNvdW50JywgJ25hbWUnICktPnNlbmRfa2V5cygnMycpOwoKICAgICAgICAjIGNsaWNrIG9uIFNhdmUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBkaWFsb2cgdG8gY2xvc2UgYW5kIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzOSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSAzIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHM5LAogICAgICAgICAgICAzLAogICAgICAgICAgICAiQ3JlYXRlIGN1c3RvbSBtb250aGx5IHJlY3VycmluZyBhcHBvaW50bWVudCh3aXRob3V0IGFueSBkYXkgc2VsZWN0ZWQpLiIKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnQ5U3RhcnRUaW1lczsKICAgICAgICBteSAkU3lzdGVtVGltZTkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAiJERhdGFEYXRlIDAwOjAwOjAwIiwKICAgICAgICApOwoKICAgICAgICBteSAkTGFzdE1vbnRoOTsKICAgICAgICBteSAkRGF5OTsKCiAgICAgICAgd2hpbGUgKCBzY2FsYXIgQEFwcG9pbnRtZW50OVN0YXJ0VGltZXMgIT0gMyApIHsKICAgICAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBjdXJyZW50IGRheQogICAgICAgICAgICBpZiAoICEkTGFzdE1vbnRoOSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50OVN0YXJ0VGltZXMsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXN0TW9udGg5ID0gJE1vbnRoOwogICAgICAgICAgICAgICAgJERheTkgICAgICAgPSAkRGF5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICggJERheSA9PSAkRGF5OSApICAgICMgY2hlY2sgaWYgZGF5IGlzIHZhbGlkCiAgICAgICAgICAgICAgICAmJiAoICggJE1vbnRoIC0gJExhc3RNb250aDkgKSAlIDIgPT0gMCApICAgICMgY2hlY2sgaWYgSW50ZXJ2YWwgbWF0Y2hlcwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEBBcHBvaW50bWVudDlTdGFydFRpbWVzLCAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lOSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkTGFzdE1vbnRoOSA9ICRNb250aDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgb25lIGRheQogICAgICAgICAgICAkU3lzdGVtVGltZTkgKz0gMjQgKiAzNjAwOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gMiApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50czlbJEluZGV4XS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQ5U3RhcnRUaW1lc1skSW5kZXhdLAogICAgICAgICAgICAgICAgIkNoZWNrIHN0YXJ0IHRpbWUgIyRJbmRleCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRGVsZXRlOSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50czlbMF0tPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVsZXRlOSwKICAgICAgICAgICAgIkRlbGV0ZSBjdXN0b20gd2Vla2x5IHJlY3VycmluZyBhcHBvaW50bWVudHMuIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBjdXN0b20geWVhcmx5IHJlY3VycmluZyBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPnNlbmRfa2V5cygnRXZlcnkgMm5kIHllYXIsIGluIEZlYnJ1YXJ5LCBPY3RvYmVyIGFuZCBEZWNlbWJlci4nKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZVR5cGUnKS52YWwoJ0N1c3RvbScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBqcyBzaG93cyBJbnRlcnZhbAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VJbnRlcnZhbDp2aXNpYmxlIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlQ3VzdG9tVHlwZScpLnZhbCgnQ3VzdG9tWWVhcmx5JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IGZvciBqcwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXY6dmlzaWJsZSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAjIGRlc2VsZWN0IHNlbGVjdGVkIG1vbnRoCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGl0J3MgZGVzZWxlY3RlZAogICAgICAgIG15ICREZXNlbGVjdGVkMTAgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gISQoIiNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5sZW5ndGg7JwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZXNlbGVjdGVkMTAsCiAgICAgICAgICAgICJDaGVjayBpZiBub3RoaW5nIGlzIHNlbGVjdGVkICgjMTApLiIKICAgICAgICApOwoKICAgICAgICAjIHNlbGVjdCBGZWJydWFyeQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uW3ZhbHVlPVwiMlwiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2VsZWN0ZWQgc3VjY2Vzc2Z1bAogICAgICAgIG15ICRXYWl0MTBGb3IyID0gJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b25bdmFsdWU9XCIyXCJdIikuaGFzQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpJwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRXYWl0MTBGb3IyLAogICAgICAgICAgICAiQ3VzdG9tIHllYXJseSBhcHBvaW50bWVudCAtIGNoZWNrIGlmIEZlYnJ1YXJ5IGlzIHNlbGVjdGVkLiIKICAgICAgICApOwoKICAgICAgICAjIHNlbGVjdCBPY3RvYmVyCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b25bdmFsdWU9XCIxMFwiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2VsZWN0ZWQgc3VjY2Vzc2Z1bAogICAgICAgIG15ICRXYWl0MTBGb3IxMCA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uW3ZhbHVlPVwiMTBcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIiknCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQxMEZvcjEwLAogICAgICAgICAgICAiQ3VzdG9tIHllYXJseSBhcHBvaW50bWVudCAtIGNoZWNrIGlmIE9jdG9iZXIgaXMgc2VsZWN0ZWQuIgogICAgICAgICk7CgogICAgICAgICMgc2VsZWN0IERlY2VtYmVyCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b25bdmFsdWU9XCIxMlwiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2VsZWN0ZWQgc3VjY2Vzc2Z1bAogICAgICAgIG15ICRXYWl0MTBGb3IxMiA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uW3ZhbHVlPVwiMTJcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIiknCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQxMEZvcjEyLAogICAgICAgICAgICAiQ3VzdG9tIHllYXJseSBhcHBvaW50bWVudCAtIGNoZWNrIGlmIERlY2VtYmVyIGlzIHNlbGVjdGVkLiIKICAgICAgICApOwoKICAgICAgICAjIHNldCBlYWNoIDJuZCB3ZWVrCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VJbnRlcnZhbCcpLnZhbCgyKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgNiBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJzYnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50czEwID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlcmUgYXJlIDYgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50czEwLAogICAgICAgICAgICA2LAogICAgICAgICAgICAiQ3JlYXRlIGN1c3RvbSB5ZWFybHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50LiIKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnQxMFN0YXJ0VGltZXM7CiAgICAgICAgbXkgJFN5c3RlbVRpbWUxMCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICIkRGF0YURhdGUgMDA6MDA6MDAiLAogICAgICAgICk7CgogICAgICAgIG15ICRMYXN0WWVhcjEwOwogICAgICAgIG15ICREYXkxMDsKCiAgICAgICAgd2hpbGUgKCBzY2FsYXIgQEFwcG9pbnRtZW50MTBTdGFydFRpbWVzICE9IDYgKSB7CiAgICAgICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUxMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRMYXN0WWVhcjEwICkgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQxMFN0YXJ0VGltZXMsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUxMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkTGFzdFllYXIxMCA9ICRZZWFyOwogICAgICAgICAgICAgICAgJERheTEwICAgICAgPSAkRGF5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICREYXkgPT0gJERheTEwCiAgICAgICAgICAgICAgICAmJiAoIGdyZXAgeyAkTW9udGggPT0gJF8gfSAoIDIsIDEwLCAxMiApICkgICAgIyBjaGVjayBpZiBkYXkgaXMgdmFsaWQKICAgICAgICAgICAgICAgICYmICggKCAkWWVhciAtICRMYXN0WWVhcjEwICkgJSAyID09IDAgKSAgICAgICAjIGNoZWNrIGlmIEludGVydmFsIG1hdGNoZXMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQxMFN0YXJ0VGltZXMsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUxMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIG9uZSBkYXkKICAgICAgICAgICAgJFN5c3RlbVRpbWUxMCArPSAyNCAqIDM2MDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiA1ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzMTBbJEluZGV4XS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQxMFN0YXJ0VGltZXNbJEluZGV4XSwKICAgICAgICAgICAgICAgICJDaGVjayBzdGFydCB0aW1lICMkSW5kZXgiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJERlbGV0ZTEwID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzMTBbMF0tPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVsZXRlMTAsCiAgICAgICAgICAgICJEZWxldGUgY3VzdG9tIG1vbnRobHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50cy4iLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50KHdpdGhvdXQgYW55dGhpbmcgc2VsZWN0ZWQpCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdDdXN0b20geWVhcmx5IHdpdGhvdXQgYW55dGhpbmcgc2VsZWN0ZWQnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZVR5cGUnKS52YWwoJ0N1c3RvbScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBqcyBzaG93cyBJbnRlcnZhbAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VJbnRlcnZhbDp2aXNpYmxlIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlQ3VzdG9tVHlwZScpLnZhbCgnQ3VzdG9tWWVhcmx5JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IGZvciBqcwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXY6dmlzaWJsZSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAjIGRlc2VsZWN0IHNlbGVjdGVkIG1vbnRoCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGl0J3MgZGVzZWxlY3RlZAogICAgICAgIG15ICREZXNlbGVjdGVkMTEgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gISQoIiNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5sZW5ndGg7JwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZXNlbGVjdGVkMTEsCiAgICAgICAgICAgICJDaGVjayBpZiBub3RoaW5nIGlzIHNlbGVjdGVkICgjMTEpLiIKICAgICAgICApOwoKICAgICAgICAjIHNldCBlYWNoIDJuZCB5ZWFyCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VJbnRlcnZhbCcpLnZhbCgyKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgMyBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJzMnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50czExID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlcmUgYXJlIDMgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50czExLAogICAgICAgICAgICAzLAogICAgICAgICAgICAiQ3JlYXRlIGN1c3RvbSB5ZWFybHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50KHdpdGhvdXQgYW55IG1vbnRoIHNlbGVjdGVkKS4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50MTFTdGFydFRpbWVzOwogICAgICAgIG15ICRTeXN0ZW1UaW1lMTEgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAiJERhdGFEYXRlIDAwOjAwOjAwIiwKICAgICAgICApOwoKICAgICAgICBteSAkTGFzdFllYXIxMTsKICAgICAgICBteSAkRGF5MTE7CiAgICAgICAgbXkgJE1vbnRoMTE7CgogICAgICAgIHdoaWxlICggc2NhbGFyIEBBcHBvaW50bWVudDExU3RhcnRUaW1lcyAhPSAzICkgewogICAgICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lMTEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBjdXJyZW50IGRheQogICAgICAgICAgICBpZiAoICEkTGFzdFllYXIxMSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50MTFTdGFydFRpbWVzLCAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lMTEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RZZWFyMTEgPSAkWWVhcjsKICAgICAgICAgICAgICAgICREYXkxMSAgICAgID0gJERheTsKICAgICAgICAgICAgICAgICRNb250aDExICAgID0gJE1vbnRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICggJERheSA9PSAkRGF5MTEgKSAgICAjIGNoZWNrIGlmIGRheSBpcyB2YWxpZAogICAgICAgICAgICAgICAgJiYgJE1vbnRoID09ICRNb250aDExCiAgICAgICAgICAgICAgICAmJiAoICggJFllYXIgLSAkTGFzdFllYXIxMSApICUgMiA9PSAwICkgICAgIyBjaGVjayBpZiBJbnRlcnZhbCBtYXRjaGVzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50MTFTdGFydFRpbWVzLCAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lMTEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBvbmUgZGF5CiAgICAgICAgICAgICRTeXN0ZW1UaW1lMTEgKz0gMjQgKiAzNjAwOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gMiApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50czExWyRJbmRleF0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50MTFTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREZWxldGUxMSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50czExWzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlbGV0ZTExLAogICAgICAgICAgICAiRGVsZXRlIGN1c3RvbSB5ZWFybHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50cyh3aXRob3V0IGFueSBtb250aCBzZWxlY3RlZCkuIiwKICAgICAgICApOwogICAgfSwKKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICAgICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CiAgICAgICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgICAgICMgZGFzaGJvYXJkIHdpZGdldCBjb25maWcga2V5CiAgICAgICAgbXkgJERhc2hib2FyZENvbmZpZ0tleSA9ICcwNTAwLUFwcG9pbnRtZW50Q2FsZW5kYXInOwoKICAgICAgICAjIHR1cm4gb24gZGFzaGJvYXJkIHdpZGdldCBieSBkZWZhdWx0CiAgICAgICAgbXkgJERhc2hib2FyZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRGFzaGJvYXJkQmFja2VuZCcpLT57JERhc2hib2FyZENvbmZpZ0tleX07CiAgICAgICAgJERhc2hib2FyZENvbmZpZy0+e0RlZmF1bHR9ID0gMTsKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAiRGFzaGJvYXJkQmFja2VuZCMjIyREYXNoYm9hcmRDb25maWdLZXkiLAogICAgICAgICAgICBWYWx1ZSA9PiAkRGFzaGJvYXJkQ29uZmlnLAogICAgICAgICk7CgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgZ3JvdXAKICAgICAgICBteSAkR3JvdXBOYW1lID0gInRlc3QtY2FsZW5kYXItZ3JvdXAtJFJhbmRvbUlEIjsKICAgICAgICBteSAkR3JvdXBJRCAgID0gJEdyb3VwT2JqZWN0LT5Hcm91cEFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkR3JvdXBJRCwKICAgICAgICAgICAgIkNyZWF0ZWQgdGVzdCBncm91cCAtICRHcm91cElEIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHVzZXIKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgPT4gWyRHcm91cE5hbWVdLAogICAgICAgICkgfHwgZGllICdEaWQgbm90IGdldCB0ZXN0IHVzZXInOwogICAgICAgIG15ICRVc2VySUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTG9va3VwKCBVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4gKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFVzZXJJRCwKICAgICAgICAgICAgIkNyZWF0ZWQgdGVzdCB1c2VyIC0gJFVzZXJJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYSB0ZXN0IGNhbGVuZGFyCiAgICAgICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhciAkUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICJDcmVhdGVkIHRlc3QgY2FsZW5kYXIgLSAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0iLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGN1cnJlbnQgdGltZQogICAgICAgIG15ICRTdGFydFRpbWUgICAgICA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFN5c3RlbVRpbWUoKTsKICAgICAgICBteSAkU3RhcnRUaW1lc3RhbXAgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CgogICAgICAgICMganVzdCBiZWZvcmUgbWlkbmlnaHQgdG9kYXkKICAgICAgICBteSAkVG9kYXkgPSBzdWJzdHIoICRTdGFydFRpbWVzdGFtcCwgMCwgMTAgKSAuICcgMjM6NTk6NTknOwoKICAgICAgICBteSAkVG9tb3Jyb3cgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lICsgNjAgKiA2MCAqIDI0LCAgICAjICsyNCBob3VycwogICAgICAgICk7CiAgICAgICAgbXkgJERheUFmdGVyVG9tb3Jyb3cgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lICsgNjAgKiA2MCAqIDQ4LCAgICAjICs0OCBob3VycwogICAgICAgICk7CiAgICAgICAgbXkgJFR3b0RheXNBZnRlclRvbW9ycm93ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSArIDYwICogNjAgKiA3MiwgICAgIyArNzIgaG91cnMKICAgICAgICApOwoKICAgICAgICAjIHNhbXBsZSBhcHBvaW50bWVudHMKICAgICAgICBteSBAQXBwb2ludG1lbnRzID0gKAoKICAgICAgICAgICAgIyB0b2RheQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJFRvZGF5LAogICAgICAgICAgICAgICAgRW5kVGltZSAgICA9PiAkVG9kYXksCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgID0+ICJUb2RheSAkUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgRmlsdGVyICAgICA9PiAnVG9kYXknLAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyB0b21vcnJvdwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJFRvbW9ycm93LAogICAgICAgICAgICAgICAgRW5kVGltZSAgICA9PiAkVG9tb3Jyb3csCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgID0+ICJUb21vcnJvdyAkUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgRmlsdGVyICAgICA9PiAnVG9tb3Jyb3cnLAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBkYXkgYWZ0ZXIgdG9tb3Jyb3cKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBTdGFydFRpbWUgID0+ICREYXlBZnRlclRvbW9ycm93LAogICAgICAgICAgICAgICAgRW5kVGltZSAgICA9PiAkRGF5QWZ0ZXJUb21vcnJvdywKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIkRheSBhZnRlciB0b21vcnJvdyAkUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgRmlsdGVyICAgICA9PiAnU29vbicsCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIHR3byBkYXlzIGFmdGVyIHRvbW9ycm93CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAkVHdvRGF5c0FmdGVyVG9tb3Jyb3csCiAgICAgICAgICAgICAgICBFbmRUaW1lICAgID0+ICRUd29EYXlzQWZ0ZXJUb21vcnJvdywKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIlR3byBkYXlzIGFmdGVyIHRvbW9ycm93ICRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBGaWx0ZXIgICAgID0+ICdTb29uJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhcHBvaW50bWVudHMKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgIG15ICRBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgICAgICV7JEFwcG9pbnRtZW50fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgICJDcmVhdGVkIHRlc3QgYXBwb2ludG1lbnQgLSAkQXBwb2ludG1lbnRJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9ID0gJEFwcG9pbnRtZW50SUQ7CiAgICAgICAgfQoKICAgICAgICAjIGNoYW5nZSByZXNvbHV0aW9uIChkZXNrdG9wIG1vZGUpCiAgICAgICAgJFNlbGVuaXVtLT5zZXRfd2luZG93X3NpemUoIDc2OCwgMTA1MCApOwoKICAgICAgICAjIGxvZ2luIHRlc3QgdXNlcgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIHZlcmlmeSB3aWRnZXQgaXMgcHJlc2VudAogICAgICAgIG15ICREYXNoYm9hcmRXaWRnZXQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNEYXNoYm9hcmQkRGFzaGJvYXJkQ29uZmlnS2V5IiwgJ2NzcycgKTsKICAgICAgICAkU2VsZW5pdW0tPm1vdXNlX21vdmVfdG9fbG9jYXRpb24oCiAgICAgICAgICAgIGVsZW1lbnQgPT4gJERhc2hib2FyZFdpZGdldCwKICAgICAgICAgICAgeG9mZnNldCA9PiAwLAogICAgICAgICAgICB5b2Zmc2V0ID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBhcHBvaW50bWVudHMKICAgICAgICBteSAlRmlsdGVyQ291bnQ7CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewoKICAgICAgICAgICAgIyByZW1lbWJlciBmaWx0ZXIKICAgICAgICAgICAgJEZpbHRlckNvdW50eyAkQXBwb2ludG1lbnQtPntGaWx0ZXJ9IH0gKz0gMTsKCiAgICAgICAgICAgICMgc3dpdGNoIGZpbHRlcgogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgIlwkKCcuQXBwb2ludG1lbnRGaWx0ZXIgI0Rhc2hib2FyZCR7RGFzaGJvYXJkQ29uZmlnS2V5fSRBcHBvaW50bWVudC0+e0ZpbHRlcn0nKS50cmlnZ2VyKCdjbGljaycpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHNsZWVwIDI7CgogICAgICAgICAgICAjIHdhaXQgZm9yIEFKQVgKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgIVwkKCcuV2lkZ2V0U2ltcGxlLkxvYWRpbmcnKS5sZW5ndGgiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHZlcmlmeSBhcHBvaW50bWVudCBpcyB2aXNpYmxlCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FwcG9pbnRtZW50SUQ9JEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH1cJyldIik7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGZpbHRlciBjb3VudAogICAgICAgIGZvciBteSAkRmlsdGVyICggc29ydCBrZXlzICVGaWx0ZXJDb3VudCApIHsKCiAgICAgICAgICAgICMgZ2V0IGZpbHRlciBsaW5rCiAgICAgICAgICAgIG15ICRGaWx0ZXJMaW5rID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRGFzaGJvYXJkJHtEYXNoYm9hcmRDb25maWdLZXl9JHtGaWx0ZXJ9IiwgJ2NzcycgKTsKCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRGaWx0ZXJMaW5rLT5nZXRfdGV4dCgpLAogICAgICAgICAgICAgICAgIiRGaWx0ZXIgKCRGaWx0ZXJDb3VudHskRmlsdGVyfSkiLAogICAgICAgICAgICAgICAgIkZpbHRlciBjb3VudCAtICRGaWx0ZXIiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjbGVhbnVwCgogICAgICAgICMgZGVsZXRlIHRlc3QgYXBwb2ludG1lbnRzCiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIkRlbGV0ZWQgdGVzdCBhcHBvaW50bWVudCAtICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIHRlc3QgY2FsZW5kYXIKICAgICAgICBpZiAoICRDYWxlbmRhcntDYWxlbmRhcklEfSApIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjYWxlbmRhciBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0gXSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJEZWxldGVkIHRlc3QgY2FsZW5kYXIgLSAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgIGZvciBteSAkQ2FjaGUgKHF3KENhbGVuZGFyIEFwcG9pbnRtZW50KSkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAkQ2FjaGUgKTsKICAgICAgICB9CiAgICB9LAopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgICAgIG15ICRHcm91cE9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgICAgIG15ICRDYWxlbmRhck9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwogICAgICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CiAgICAgICAgbXkgJFVzZXJPYmplY3QgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAgICAgbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBncm91cAogICAgICAgIG15ICRHcm91cE5hbWUgPSAidGVzdC1jYWxlbmRhci1ncm91cC0kUmFuZG9tSUQiOwogICAgICAgIG15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBnZXQgY3VycmVudCBzeXN0ZW0gdGltZQogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpOwoKICAgICAgICAjIGFkZCAxIG1vbnRoCiAgICAgICAgJFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkFkZFBlcmlvZCgKICAgICAgICAgICAgVGltZSAgID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICAgICBNb250aHMgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBkYXRlIGluZm8gKFNlY29uZCwgTWludXRlLCBIb3VyLCBEYXksIE1vbnRoLCBZZWFyLCBEYXlPZldlZWspCiAgICAgICAgbXkgQERhdGVJbmZvID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICk7CgogICAgICAgICMgY2hhbmdlIHJlc29sdXRpb24gKGRlc2t0b3AgbW9kZSkKICAgICAgICAkU2VsZW5pdW0tPnNldF93aW5kb3dfc2l6ZSggNzY4LCAxMDUwICk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgdXNlcgogICAgICAgIG15ICRMYW5ndWFnZSAgICAgID0gJ2VuJzsKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgICA9PiBbICd1c2VycycsICRHcm91cE5hbWUgXSwKICAgICAgICAgICAgTGFuZ3VhZ2UgPT4gJExhbmd1YWdlLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAjIGdldCBVc2VySUQKICAgICAgICBteSAkVXNlcklEID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIHN0YXJ0IHRlc3QKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYSBmZXcgdGVzdCBjYWxlbmRhcnMKICAgICAgICBteSAlQ2FsZW5kYXIxID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJNeSBDYWxlbmRhciAkUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdvIHRvIGNhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyIpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjbGljayBvbiB0aGUgbW9udGggdmlldwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLW1vbnRoLWJ1dHRvbicsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnICk7CgogICAgICAgICMgZ28gdG8gbmV4dCBtb250aAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRvb2xiYXIgLmZjLW5leHQtYnV0dG9uJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBnZXQgZGF0ZSBpbmZvIChTZWNvbmQsIE1pbnV0ZSwgSG91ciwgRGF5LCBNb250aCwgWWVhciwgRGF5T2ZXZWVrKQogICAgICAgIG15ICREYXRhRGF0ZSA9ICIkRGF0ZUluZm9bNV0tIjsKICAgICAgICBpZiAoICREYXRlSW5mb1s0XSA8IDEwICkgewogICAgICAgICAgICAkRGF0YURhdGUgLj0gIjAiOwogICAgICAgIH0KICAgICAgICAkRGF0YURhdGUgLj0gIiREYXRlSW5mb1s0XS0wMSI7CgogICAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBQcmUtRGVmaW5lZCBUZW1wbGF0ZXMKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAjIGRlZmluZSBhcHBvaW50bWVudCB0ZXN0IHdpdGggcHJlLWRlZmluZWQgbm90aWZpY2F0aW9uIHRlbXBsYXRlcwogICAgICAgIG15IEBUZW1wbGF0ZUNyZWF0ZVRlc3RzID0gKAoKICAgICAgICAgICAgIyBubyBhY3RpdmUgbm90aWZpY2F0aW9uIHRlbXBsYXRlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdObyBub3RpZmljYXRpb24nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDAsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBub3RpZmljYXRpb24gdGVtcGxhdGUgc3RhcnQgKGFwcG9pbnRtZW50IHN0YXJ0IHRpbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdBcHBvaW50bWVudCBzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnU3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSA1IG1pbnV0ZXMgYmVmb3JlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICc1IG1pbnV0ZXMgYmVmb3JlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAzMDAsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gMzAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAzMDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgbm90aWZpY2F0aW9uIHRlbXBsYXRlIDE1IG1pbnV0ZXMgYmVmb3JlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICcxNSBtaW51dGVzIGJlZm9yZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gOTAwLAogICAgICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgID0+IDkwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gOTAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAzMCBtaW51dGVzIGJlZm9yZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnMzAgbWludXRlcyBiZWZvcmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDE4MDAsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gMTgwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMTgwMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBub3RpZmljYXRpb24gdGVtcGxhdGUgMSBob3VyIGJlZm9yZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnMSBob3VyIGJlZm9yZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gMzYwMCwKICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICA9PiAzNjAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAzNjAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAyIGhvdXJzIGJlZm9yZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnMiBob3VycyBiZWZvcmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDcyMDAsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gNzIwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gNzIwMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBub3RpZmljYXRpb24gdGVtcGxhdGUgMTIgaG91cnMgYmVmb3JlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICcxMiBob3VycyBiZWZvcmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDQzMjAwLAogICAgICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgID0+IDQzMjAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiA0MzIwMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBub3RpZmljYXRpb24gdGVtcGxhdGUgMSBkYXkgYmVmb3JlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICcxIGRheSBiZWZvcmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDg2NDAwLAogICAgICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgID0+IDg2NDAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiA4NjQwMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBub3RpZmljYXRpb24gdGVtcGxhdGUgMiBkYXlzIGJlZm9yZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnMiBkYXlzIGJlZm9yZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gMTcyODAwLAogICAgICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgID0+IDE3MjgwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMTcyODAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAxIHdlZWsgYmVmb3JlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICcxIHdlZWsgYmVmb3JlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA2MDQ4MDAsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gNjA0ODAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiA2MDQ4MDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBwcmUtZGVmaW5lZCB0ZW1wbGF0ZSB0ZXN0IGV4ZWN1dGlvbgogICAgICAgIGZvciBteSAkVGVzdCAoQFRlbXBsYXRlQ3JlYXRlVGVzdHMpIHsKCiAgICAgICAgICAgICMgY3JlYXRlIGFwcG9pbnRtZW50CiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoIiRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0iKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNOb3RpZmljYXRpb25UZW1wbGF0ZScpLnZhbCgnJFRlc3QtPntEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAgICAgIyB3YWl0IGZvciBkaWFsb2cgdG8gY2xvc2UgYW5kIEFKQVggdG8gZmluaXNoCiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15IEBBcHBvaW50bWVudExpc3QgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgdGhlcmUgaXMgYW4gYXBwb2ludG1lbnQKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudExpc3QsCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgIkFwcG9pbnRtZW50IGxpc3QgdmVyaWZpY2F0aW9uIC0gJFRlc3QtPntEYXRhfS0+e0Rlc2NyaXB0aW9ufSAuIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkVGVzdC0+e0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9ICkgewoKICAgICAgICAgICAgICAgIG15ICRTdGFydEFwcG9pbnRtZW50ICAgICAgID0gIiREYXRhRGF0ZSAwMDowMDowMCI7CiAgICAgICAgICAgICAgICBteSAkU3RhcnRBcHBvaW50bWVudFN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFN0YXJ0QXBwb2ludG1lbnQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25EYXRlID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAoICRTdGFydEFwcG9pbnRtZW50U3lzdGVtIC0gJFRlc3QtPntEYXRhfS0+e09mZnNldH0gKSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudExpc3RbMF0tPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uRGF0ZSwKICAgICAgICAgICAgICAgICAgICAiVmVyaWZ5IG5vdGlmaWNhdGlvbiBkYXRlIC0gJFRlc3QtPntEYXRhfS0+e0Rlc2NyaXB0aW9ufSAuIgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB2ZXJpZnkgcmVzdWx0cwogICAgICAgICAgICBmb3IgbXkgJFJlc3VsdEtleSAoIHNvcnQga2V5cyAleyAkVGVzdC0+e1Jlc3VsdH0gfSApIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50TGlzdFswXS0+eyRSZXN1bHRLZXl9LAogICAgICAgICAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fS0+eyRSZXN1bHRLZXl9LAogICAgICAgICAgICAgICAgICAgICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgcmVzdWx0OiAnIC4gJFJlc3VsdEtleSAuICcgLSAnIC4gJFRlc3QtPntEYXRhfS0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICREZWxldGUgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRMaXN0WzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudAogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICREZWxldGUsCiAgICAgICAgICAgICAgICAiRGVsZXRlIGFwcG9pbnRtZW50IHZlcmlmaWNhdGlvbiAtICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0gLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAjIEN1c3RvbSBSZWxhdGl2ZSBUZW1wbGF0ZXMKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgIyBkZWZpbmUgYXBwb2ludG1lbnQgdGVzdCB3aXRoIGN1c3RvbSBub3RpZmljYXRpb24gdGVtcGxhdGVzCiAgICAgICAgbXkgQFRlbXBsYXRlQ3VzdG9tUmVsYXRpdmVDcmVhdGVUZXN0cyA9ICgKCiAgICAgICAgICAgICMgY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSByZWxhdGl2ZSAwIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0ICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAtMiBtaW51dGVzIGJlZm9yZSBzdGFydAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gcmVsYXRpdmUgLTIgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IC0yLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSByZWxhdGl2ZSAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0ICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIG1pbnV0ZXMgYWZ0ZXIgc3RhcnQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIHJlbGF0aXZlIDAgbWludXRlcyBhZnRlciBzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgbWludXRlcyBiZWZvcmUgZW5kCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSByZWxhdGl2ZSAwIG1pbnV0ZXMgYmVmb3JlIGVuZCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIG1pbnV0ZXMgYWZ0ZXIgZW5kCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSByZWxhdGl2ZSAwIG1pbnV0ZXMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0ICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gcmVsYXRpdmUgdGVtcGxhdGUgdGVzdCBleGVjdXRpb24KICAgICAgICBmb3IgbXkgJFRlc3QgKEBUZW1wbGF0ZUN1c3RvbVJlbGF0aXZlQ3JlYXRlVGVzdHMpIHsKCiAgICAgICAgICAgICMgY3JlYXRlIGFwcG9pbnRtZW50CiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoIiRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0iKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZWxlY3QgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjTm90aWZpY2F0aW9uVGVtcGxhdGUnKS52YWwoJyRUZXN0LT57RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWN0aXZhdGUgdGhlIHJlbGF0aXZlIG5vdGlmaWNhdGlvbnMKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dCIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgZmlsbCBvdXQgdGhlIGN1c3RvbSB1bml0IGNvdW50IGZpZWxkCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQnKS52YWwoJyRUZXN0LT57RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0nKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGZpbGwgb3V0IHRoZSBjdXN0b20gdW5pdCBmaWVsZAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnI05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCcpLnZhbCgnJFRlc3QtPntEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZmlsbCBvdXQgdGhlIGN1c3RvbSB1bml0IHBvaW50IG9mIHRpbWUgZmllbGQKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lJykudmFsKCckVGVzdC0+e0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRMaXN0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGlzIGFuIGFwcG9pbnRtZW50CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRMaXN0LAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICJBcHBvaW50bWVudCBsaXN0IHZlcmlmaWNhdGlvbiAtICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0gLiIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBuZWVkZWQgbm90aWZpY2F0aW9uIHBhcmFtcwogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdENvdW50ID0gJFRlc3QtPntEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fTsKCiAgICAgICAgICAgICMgdGhlIGJhY2tlbmQgdHJlYXRzIG5lZ2F0aXZlIHZhbHVlcyBhcyAwCiAgICAgICAgICAgIGlmICggJEN1c3RvbVVuaXRDb3VudCA8IDAgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tVW5pdENvdW50ID0gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEN1c3RvbVVuaXQgICAgICA9ICRUZXN0LT57RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9OwogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdFBvaW50ID0gJFRlc3QtPntEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9OwoKICAgICAgICAgICAgIyBzZXR1cCB0aGUgY291bnQgdG8gY29tcHV0ZSBmb3IgdGhlIG9mZnNldAogICAgICAgICAgICBteSAlVW5pdE9mZnNldENvbXB1dGUgPSAoCiAgICAgICAgICAgICAgICBtaW51dGVzID0+IDYwLAogICAgICAgICAgICAgICAgaG91cnMgICA9PiAzNjAwLAogICAgICAgICAgICAgICAgZGF5cyAgICA9PiA4NjQwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25Mb2NhbFRpbWU7CgogICAgICAgICAgICAjIGNvbXB1dGUgZnJvbSBzdGFydCB0aW1lCiAgICAgICAgICAgIGlmICggJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3Jlc3RhcnQnIHx8ICRDdXN0b21Vbml0UG9pbnQgZXEgJ2FmdGVyc3RhcnQnICkgewoKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25Mb2NhbFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudExpc3RbMF0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjb21wdXRlIGZyb20gZW5kIHRpbWUKICAgICAgICAgICAgZWxzaWYgKCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVlbmQnIHx8ICRDdXN0b21Vbml0UG9pbnQgZXEgJ2FmdGVyZW5kJyApIHsKCiAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uTG9jYWxUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnRMaXN0WzBdLT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNvbXB1dGUgdGhlIG9mZnNldCB0byBiZSB1c2VkCiAgICAgICAgICAgIG15ICRPZmZzZXQgPSAoICRDdXN0b21Vbml0Q291bnQgKiAkVW5pdE9mZnNldENvbXB1dGV7JEN1c3RvbVVuaXR9ICk7CgogICAgICAgICAgICAjIHNhdmUgdGhlIG5ld2x5IGNvbXB1dGVkIG5vdGlmaWNhdGlvbiBkYXRldGltZSBzdHJpbmcKICAgICAgICAgICAgbXkgJE5vdGlmaWNhdGlvbkRhdGUgPSAnJzsKCiAgICAgICAgICAgIGlmICggJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3Jlc3RhcnQnIHx8ICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZWVuZCcgKSB7CiAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uRGF0ZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gKCAkTm90aWZpY2F0aW9uTG9jYWxUaW1lIC0gJE9mZnNldCApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25EYXRlID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAoICROb3RpZmljYXRpb25Mb2NhbFRpbWUgKyAkT2Zmc2V0ICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRMaXN0WzBdLT57Tm90aWZpY2F0aW9uRGF0ZX0sCiAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uRGF0ZSwKICAgICAgICAgICAgICAgICJWZXJpZnkgbm90aWZpY2F0aW9uIGRhdGUgLSAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259IC4iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkRGVsZXRlID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50TGlzdFswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnQKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkRGVsZXRlLAogICAgICAgICAgICAgICAgIkRlbGV0ZSBhcHBvaW50bWVudCB2ZXJpZmljYXRpb24gLSAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259IC4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBDdXN0b20gRGF0ZVRpbWUgVGVtcGxhdGVzCiAgICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICMgZGVmaW5lIGFwcG9pbnRtZW50IHRlc3Qgd2l0aCBjdXN0b20gbm90aWZpY2F0aW9uIHRlbXBsYXRlcwogICAgICAgIG15IEBUZW1wbGF0ZUN1c3RvbURhdGVUaW1lQ3JlYXRlVGVzdHMgPSAoCgogICAgICAgICAgICAjIGN1c3RvbSBkYXRldGltZSBub3RpZmljYXRpb24gMjAxNi0wOS0wMSAxMDoxMDowMAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gZGF0ZXRpbWUgMjAxNi0wOS0wMSAxMDoxMDowMCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVNb250aCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnOScsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVZZWFyICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNicsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVIb3VyICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMTAnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzEwJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDEwOjEwOjAwJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMTA6MTA6MDAnCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBjdXN0b20gZGF0ZXRpbWUgbm90aWZpY2F0aW9uIDIwMTYtMTAtMTggMDA6MDM6MDAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIGRhdGV0aW1lIDIwMTYtMTAtMTggMDE6MDM6MDAnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dCAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzE4JywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZU1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcxMCcsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVZZWFyICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNicsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVIb3VyICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMScsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0xMC0xOCAwMTowMzowMCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTEwLTE4IDAxOjAzOjAwJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgY3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyMDE3LTEwLTE4IDAwOjAzOjAwCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSBkYXRldGltZSAyMDE3LTEwLTE4IDAzOjAzOjAwJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0ICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZURheSAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcxOCcsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVNb250aCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMTAnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lWWVhciAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTcnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lSG91ciAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzMnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzMnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTctMTAtMTggMDM6MDM6MDAnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNy0xMC0xOCAwMzowMzowMCcKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIGN1c3RvbSBkYXRldGltZSBub3RpZmljYXRpb24gMjAxMi0xMC0xOCAwMDowMzowMAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gZGF0ZXRpbWUgMjAxMi0xMC0xOCAwMjowMzowMCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMTgnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzEwJywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZVllYXIgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDEyJywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZUhvdXIgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyJywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZU1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgID0+ICczJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDEyLTEwLTE4IDAyOjAzOjAwJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTItMTAtMTggMDI6MDM6MDAnCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgbm90aWZpY2F0aW9uIGRhdGV0aW1lIHRlbXBsYXRlIHRlc3QgZXhlY3V0aW9uCiAgICAgICAgZm9yIG15ICRUZXN0IChAVGVtcGxhdGVDdXN0b21EYXRlVGltZUNyZWF0ZVRlc3RzKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBhcHBvaW50bWVudAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCIkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259Iik7CiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2VsZWN0IGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnI05vdGlmaWNhdGlvblRlbXBsYXRlJykudmFsKCckVGVzdC0+e0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFjdGl2YXRlIHRoZSByZWxhdGl2ZSBub3RpZmljYXRpb25zCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQiLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICAgICAjIHNlbGVjdCBkYXkKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZURheScpLnZhbCgnJFRlc3QtPntEYXRhfS0+e0RhdGVUaW1lRGF5fScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZWxlY3QgbW9udGgKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1vbnRoJykudmFsKCckVGVzdC0+e0RhdGF9LT57RGF0ZVRpbWVNb250aH0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2VsZWN0IHllYXIKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVllYXInKS52YWwoJyRUZXN0LT57RGF0YX0tPntEYXRlVGltZVllYXJ9JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNlbGVjdCBob3VyCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyJykudmFsKCckVGVzdC0+e0RhdGF9LT57RGF0ZVRpbWVIb3VyfScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZWxlY3QgbWludXRlCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNaW51dGUnKS52YWwoJyRUZXN0LT57RGF0YX0tPntEYXRlVGltZU1pbnV0ZX0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRMaXN0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGlzIGFuIGFwcG9pbnRtZW50CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRMaXN0LAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICJBcHBvaW50bWVudCBsaXN0IHZlcmlmaWNhdGlvbiAtICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0gLiIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdmVyaWZ5IHJlc3VsdHMKICAgICAgICAgICAgZm9yIG15ICRSZXN1bHRLZXkgKCBzb3J0IGtleXMgJXsgJFRlc3QtPntSZXN1bHR9IH0gKSB7CgogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudExpc3RbMF0tPnskUmVzdWx0S2V5fSwKICAgICAgICAgICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0tPnskUmVzdWx0S2V5fSwKICAgICAgICAgICAgICAgICAgICAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IHJlc3VsdDogJyAuICRSZXN1bHRLZXkgLiAnIC0gJyAuICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudAogICAgICAgICAgICBteSAkRGVsZXRlID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50TGlzdFswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkRGVsZXRlLAogICAgICAgICAgICAgICAgIkRlbGV0ZSBhcHBvaW50bWVudCB2ZXJpZmljYXRpb24gLSAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259IC4iLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0sCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICAgICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CiAgICAgICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgICAgIG15ICRVc2VyT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICMgdHVybiBvbiB1c2VyIHRpbWUgem9uZXMKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGltZVpvbmVVc2VyJywKICAgICAgICAgICAgVmFsdWUgPT4gMCwKICAgICAgICApOwoKICAgICAgICBteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGdyb3VwCiAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICJ0ZXN0LWNhbGVuZGFyLWdyb3VwLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIGNoYW5nZSByZXNvbHV0aW9uIChkZXNrdG9wIG1vZGUpCiAgICAgICAgJFNlbGVuaXVtLT5zZXRfd2luZG93X3NpemUoIDc2OCwgMTA1MCApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHVzZXIKICAgICAgICBteSAkTGFuZ3VhZ2UgICAgICA9ICdlbic7CiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzICAgPT4gWyAndXNlcnMnLCAkR3JvdXBOYW1lIF0sCiAgICAgICAgICAgIExhbmd1YWdlID0+ICRMYW5ndWFnZSwKICAgICAgICApIHx8IGRpZSAnRGlkIG5vdCBnZXQgdGVzdCB1c2VyJzsKCiAgICAgICAgIyBnZXQgVXNlcklECiAgICAgICAgbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBzdGFydCB0ZXN0CiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGEgdGVzdCBjYWxlbmRhcgogICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnbyB0byBjYWxlbmRhciBvdmVydmlldyBwYWdlCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXciKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnICk7CgogICAgICAgICMgZ28gdG8gcHJldmlvdXMgd2VlawogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRvb2xiYXIgLmZjLXByZXYtYnV0dG9uJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjbGljayBvbiB0aGUgdGltZWxpbmUgdmlldyBmb3IgYW4gYXBwb2ludG1lbnQgZGlhbG9nCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdGltZWxpbmVXZWVrLXZpZXcgLmZjLXNsYXRzIHRkLmZjLXdpZGdldC1jb250ZW50Om50aC1jaGlsZCg1KScsICdjc3MnICkKICAgICAgICAgICAgLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ1RpbWUgWm9uZSBBcHBvaW50bWVudCcpOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFye0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdFbmRIb3VyJywgJ25hbWUnICktPnNlbmRfa2V5cygnMTgnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgaXMgdmlzaWJsZQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGUnKS50ZXh0KCk7IgogICAgICAgICAgICApLAogICAgICAgICAgICAnVGltZSBab25lIEFwcG9pbnRtZW50JywKICAgICAgICAgICAgJ0FwcG9pbnRtZW50IHZpc2libGUgKENhbGVuZGFyIE92ZXJ2aWV3KScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnbyB0byBhZ2VuZGEgb3ZlcnZpZXcgcGFnZQogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldztGaWx0ZXI9V2VlaztKdW1wPVByZXYiKTsKCiAgICAgICAgc2xlZXAgMTsKCiAgICAgICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgaXMgdmlzaWJsZQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJ1RpbWUgWm9uZSBBcHBvaW50bWVudCcgKSA+IC0xLAogICAgICAgICAgICAnQXBwb2ludG1lbnQgdmlzaWJsZSAoQWdlbmRhIE92ZXJ2aWV3KScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXBwb2ludG1lbnQgaWQKICAgICAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJy5NYXN0ZXJBY3Rpb25MaW5rJykuZGF0YSgnYXBwb2ludG1lbnRJZCcpOyIKICAgICAgICApOwoKICAgICAgICAjIGdldCBkaXNwbGF5ZWQgc3RhcnQgZGF0ZQogICAgICAgIG15ICRTdGFydERhdGUKICAgICAgICAgICAgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi8vKltcQGlkPSdBcHBvaW50bWVudElEXyRBcHBvaW50bWVudElEJ10vdGRbNF0iLCAneHBhdGgnICktPmdldF90ZXh0KCk7CgogICAgICAgICMgY2hlY2sgc3RhcnQgdGltZQogICAgICAgICRTdGFydERhdGUgPX4gLyhcZHsyfTpcZHsyfTpcZHsyfSkkLzsKICAgICAgICBteSAkU3RhcnRUaW1lID0gJDE7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU3RhcnRUaW1lLAogICAgICAgICAgICAnMDg6MDA6MDAnLAogICAgICAgICAgICAnU3RhcnQgdGltZSBpbiBsb2NhbCB0aW1lJywKICAgICAgICApOwoKICAgICAgICAjIHR1cm4gb24gdXNlciB0aW1lIHpvbmVzCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWVab25lVXNlcicsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyB0dXJuIG9mZiBicm93c2VyIGF1dG8gb2Zmc2V0CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWVab25lVXNlckJyb3dzZXJBdXRvT2Zmc2V0JywKICAgICAgICAgICAgVmFsdWUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHNldCB1c2VyJ3MgdGltZSB6b25lCiAgICAgICAgJFVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICBLZXkgICAgPT4gJ1VzZXJUaW1lWm9uZScsCiAgICAgICAgICAgIFZhbHVlICA9PiAnKzInLCAgICAgICAgICAgICAjIEV1cm9wZS9CZXJsaW4KICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgIGZvciBteSAkQ2FjaGUgKHF3KENhbGVuZGFyIEFwcG9pbnRtZW50KSkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAkQ2FjaGUgKTsKICAgICAgICB9CgogICAgICAgICMgbG9nIGluIGFnYWluCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ28gdG8gYWdlbmRhIG92ZXJ2aWV3IHBhZ2UgYWdhaW4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXc7RmlsdGVyPVdlZWs7SnVtcD1QcmV2Iik7CgogICAgICAgIHNsZWVwIDE7CgogICAgICAgICMgZ2V0IGRpc3BsYXllZCBzdGFydCBkYXRlCiAgICAgICAgbXkgJFN0YXJ0RGF0ZVRaCiAgICAgICAgICAgID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIvLypbXEBpZD0nQXBwb2ludG1lbnRJRF8kQXBwb2ludG1lbnRJRCddL3RkWzRdIiwgJ3hwYXRoJyApLT5nZXRfdGV4dCgpOwoKICAgICAgICAjIGNoZWNrIHN0YXJ0IHRpbWUgYWdhaW4KICAgICAgICAkU3RhcnREYXRlVFogPX4gLyhcZHsyfTpcZHsyfTpcZHsyfVxzXChcKzJcKSkkLzsKICAgICAgICBteSAkU3RhcnRUaW1lVFogPSAkMTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTdGFydFRpbWVUWiwKICAgICAgICAgICAgJzEwOjAwOjAwICgrMiknLAogICAgICAgICAgICAiU3RhcnQgdGltZSBpbiB1c2VyJ3MgdGltZSB6b25lIiwKICAgICAgICApOwoKICAgICAgICAjIGdvIHRvIGNhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UgYWdhaW4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyIpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBnbyB0byBwcmV2aW91cyB3ZWVrCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdG9vbGJhciAuZmMtcHJldi1idXR0b24nLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJyApOwoKICAgICAgICAjIGNsaWNrIG9uIGFuIGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdGltZWxpbmUtZXZlbnQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgY2hlY2sgc3RhcnQgaG91cgogICAgICAgIG15ICRTdGFydEhvdXJUWiA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnU3RhcnRIb3VyJywgJ25hbWUnICktPmdldF92YWx1ZSgpOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFN0YXJ0SG91clRaLAogICAgICAgICAgICAxMCwKICAgICAgICAgICAgIlN0YXJ0IGhvdXIgaW4gdXNlcidzIHRpbWUgem9uZSIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjbGVhbnVwCgogICAgICAgICMgZGVsZXRlIHRlc3QgYXBwb2ludG1lbnQKICAgICAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkRlbGV0ZWQgdGVzdCBhcHBvaW50bWVudCAtICRBcHBvaW50bWVudElEIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGNhbGVuZGFyCiAgICAgICAgaWYgKCAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0gKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY2FsZW5kYXIgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJENhbGVuZGFye0NhbGVuZGFySUR9IF0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiRGVsZXRlZCB0ZXN0IGNhbGVuZGFyIC0gJENhbGVuZGFye0NhbGVuZGFySUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbWFrZSBzdXJlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICBmb3IgbXkgJENhY2hlIChxdyhDYWxlbmRhciBBcHBvaW50bWVudCkpIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJENhY2hlICk7CiAgICAgICAgfQogICAgfSwKKTsKCjE7Cg==
QkVHSU46VkNBTEVOREFSDQpQUk9ESUQ6LS8vTW96aWxsYS5vcmcvTk9OU0dNTCBNb3ppbGxhIENhbGVuZGFyIFYxLjEvL0VODQpWRVJTSU9OOjIuMA0KQkVHSU46VlRJTUVaT05FDQpUWklEOkV1cm9wZS9CZXJsaW4NCkJFR0lOOkRBWUxJR0hUDQpUWk9GRlNFVEZST006KzAxMDANClRaT0ZGU0VUVE86KzAyMDANClRaTkFNRTpDRVNUDQpEVFNUQVJUOjE5NzAwMzI5VDAyMDAwMA0KUlJVTEU6RlJFUT1ZRUFSTFk7QllEQVk9LTFTVTtCWU1PTlRIPTMNCkVORDpEQVlMSUdIVA0KQkVHSU46U1RBTkRBUkQNClRaT0ZGU0VURlJPTTorMDIwMA0KVFpPRkZTRVRUTzorMDEwMA0KVFpOQU1FOkNFVA0KRFRTVEFSVDoxOTcwMTAyNVQwMzAwMDANClJSVUxFOkZSRVE9WUVBUkxZO0JZREFZPS0xU1U7QllNT05USD0xMA0KRU5EOlNUQU5EQVJEDQpFTkQ6VlRJTUVaT05FDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA0MTVUMDYwODExWg0KTEFTVC1NT0RJRklFRDoyMDE2MDQxNVQwNjA4MzBaDQpEVFNUQU1QOjIwMTYwNDE1VDA2MDgzMFoNClVJRDozMzM5NjA5Ni01Y2FmLWUyNGYtYWM1NC01MmZkMGJlMmJlOWUNClNVTU1BUlk6QWxsIGRheQ0KRFRTVEFSVDtWQUxVRT1EQVRFOjIwMTYwNDA1DQpEVEVORDtWQUxVRT1EQVRFOjIwMTYwNDA2DQpUUkFOU1A6VFJBTlNQQVJFTlQNCkRFU0NSSVBUSU9OOnRlc3QgYWxsIGRheSBldmVudA0KWC1PVFJTLVRFQU06VGVzdCBUZWFtDQpYLU9UUlMtUkVTT1VSQ0U6cm9vdEBsb2NhbGhvc3QNCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQxMlQwODA2MjhaDQpMQVNULU1PRElGSUVEOjIwMTYwNDEyVDA4MDc0NFoNCkRUU1RBTVA6MjAxNjA0MTJUMDgwNzQ0Wg0KVUlEOjAwNzJhMjE2LTIyOWUtMGM0MC1hODRmLTczOTNlMWJiNjg5Nw0KU1VNTUFSWTpPbmNlIHBlciB3ZWVrDQpSUlVMRTpGUkVRPVdFRUtMWTtVTlRJTD0yMDE2MDYwOVQwOTMwMDBaDQpEVFNUQVJUO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDQxMlQxMTMwMDANCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDQxMlQxMjAwMDANClRSQU5TUDpPUEFRVUUNCkxPQ0FUSU9OOkJlbGdyYWRlDQpERVNDUklQVElPTjpPbmx5IG9uY2UgcGVyIHdlZWsNClNFUVVFTkNFOjENClgtTU9aLUdFTkVSQVRJT046MQ0KRU5EOlZFVkVOVA0KQkVHSU46VkVWRU5UDQpDUkVBVEVEOjIwMTYwNDEyVDA5MzcwNVoNCkxBU1QtTU9ESUZJRUQ6MjAxNjA0MTJUMDkzNzU5Wg0KRFRTVEFNUDoyMDE2MDQxMlQwOTM3NTlaDQpVSUQ6Mjg5ZTA4M2YtZDQwZi04NDQ3LWFlODUtNmVhMDhjMDhkYjhmDQpTVU1NQVJZOk1vbnRobHkgbWVldGluZw0KUlJVTEU6RlJFUT1NT05USExZO1VOVElMPTIwMTcwMzAyVDEyMTUwMFoNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDEzMTUwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDE0MDAwMA0KVFJBTlNQOk9QQVFVRQ0KTE9DQVRJT046R2VybWFueQ0KREVTQ1JJUFRJT046T25jZSBwZXIgbW9udGgNClNFUVVFTkNFOjENClgtTU9aLUdFTkVSQVRJT046MQ0KRU5EOlZFVkVOVA0KQkVHSU46VkVWRU5UDQpDUkVBVEVEOjIwMTYwNDEyVDEzMDMwNFoNCkxBU1QtTU9ESUZJRUQ6MjAxNjA0MTJUMTMwMzU2Wg0KRFRTVEFNUDoyMDE2MDQxMlQxMzAzNTZaDQpVSUQ6ZmU2ODlhZGYtNjZmNi1lNDQ3LWE4MDctNzhlYTg5ZTc5ZGJhDQpTVU1NQVJZOkVuZCBvZiB0aGUgbW9udGgNClJSVUxFOkZSRVE9TU9OVEhMWTtVTlRJTD0yMDE3MDMxMlQwNzAwMDBaDQpEVFNUQVJUO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDMzMVQwODAwMDANCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDMzMVQwOTAwMDANClRSQU5TUDpPUEFRVUUNCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQxM1QxMzA1MzBaDQpMQVNULU1PRElGSUVEOjIwMTYwNDEzVDEzMDkyNloNCkRUU1RBTVA6MjAxNjA0MTNUMTMwOTI2Wg0KVUlEOmNmZTU3ZDY4LTEyNjMtOTE0Ny1hMDRhLTY4MGNhOTJlMWYzNQ0KU1VNTUFSWTpFYWNoIDIgbW9udGhzDQpSUlVMRTpGUkVRPU1PTlRITFk7VU5USUw9MjAxNzAyMDJUMDkwMDAwWjtJTlRFUlZBTD0yO0JZTU9OVEhEQVk9MzENCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTMxVDEwMDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTMxVDExMDAwMA0KVFJBTlNQOk9QQVFVRQ0KTE9DQVRJT046VGVzdA0KREVTQ1JJUFRJT046dGVzdA0KU0VRVUVOQ0U6MQ0KWC1NT1otR0VORVJBVElPTjoxDQpFTkQ6VkVWRU5UDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA0MTJUMDcxNTA2Wg0KTEFTVC1NT0RJRklFRDoyMDE2MDQxNFQwNzE1MzRaDQpEVFNUQU1QOjIwMTYwNDE0VDA3MTUzNFoNClVJRDoxZmFjOGVkYi1jYjRkLTc4NGEtOGQzNC0xYTc0M2MxMDc0MWENClNVTU1BUlk6TXkgZXZlbnQNClJSVUxFOkZSRVE9REFJTFk7VU5USUw9MjAxNjA2MDFUMDcwMDAwWjtJTlRFUlZBTD0yDQpDQVRFR09SSUVTOkNsaWVudHMNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDA5MDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDEwMDAwMA0KVFJBTlNQOk9QQVFVRQ0KTE9DQVRJT046U3RhcmEgUGF6b3ZhDQpERVNDUklQVElPTjpUZXN0IGRlc2NyaXB0aW9uDQpTRVFVRU5DRToxDQpYLU1PWi1HRU5FUkFUSU9OOjENCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQxNFQwNzE2MTBaDQpMQVNULU1PRElGSUVEOjIwMTYwNDE0VDA3MTkyMloNCkRUU1RBTVA6MjAxNjA0MTRUMDcxOTIyWg0KVUlEOjM3MDhlNzRmLWI5MDEtYzY0My1hOWQwLWExNzgzOGFmZDQ4OQ0KU1VNTUFSWTpFYWNoIDIgeWVhcnMNClJSVUxFOkZSRVE9WUVBUkxZO1VOVElMPTIwMjAwNjAyVDA4MDAwMFo7SU5URVJWQUw9MjtCWU1PTlRIREFZPTE7QllNT05USD00DQoNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDAxVDEwMDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDAxVDExMDAwMA0KVFJBTlNQOk9QQVFVRQ0KU0VRVUVOQ0U6MQ0KWC1NT1otR0VORVJBVElPTjoxDQpFTkQ6VkVWRU5UDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA0MTVUMDYzMjIwWg0KTEFTVC1NT0RJRklFRDoyMDE2MDQxNVQwNjMzMDhaDQpEVFNUQU1QOjIwMTYwNDE1VDA2MzMwOFoNClVJRDo0OGY0ZjA5NC02Y2IzLWM5NDEtYjI2YS00MzRkNTIxMTU0N2YNClNVTU1BUlk6RWFjaCAzdGhkIGFsbCBkYXkNClJSVUxFOkZSRVE9REFJTFk7VU5USUw9MjAxNjA0MzA7SU5URVJWQUw9Mw0KRFRTVEFSVDtWQUxVRT1EQVRFOjIwMTYwNDAyDQpEVEVORDtWQUxVRT1EQVRFOjIwMTYwNDAzDQpUUkFOU1A6VFJBTlNQQVJFTlQNCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQxNVQxMzM5MDdaDQpMQVNULU1PRElGSUVEOjIwMTYwNDE1VDEzMzk1OVoNCkRUU1RBTVA6MjAxNjA0MTVUMTMzOTU5Wg0KVUlEOjFlN2IxZTY4LWIxMjgtNDE0Mi1iNDRhLTllZGY5ODcyZmJmOA0KU1VNTUFSWTpGaXJzdCAzIGRheXMNClJSVUxFOkZSRVE9REFJTFk7Q09VTlQ9Mw0KRFRTVEFSVDtUWklEPUV1cm9wZS9CZXJsaW46MjAxNjAzMDdUMTYwMDAwDQpEVEVORDtUWklEPUV1cm9wZS9CZXJsaW46MjAxNjAzMDdUMTcwMDAwDQpUUkFOU1A6T1BBUVVFDQpFTkQ6VkVWRU5UDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA0MTVUMTUxNTMzWg0KTEFTVC1NT0RJRklFRDoyMDE2MDQxNVQxNTE2MjJaDQpEVFNUQU1QOjIwMTYwNDE1VDE1MTYyMloNClVJRDo3YTc5NzRlMy1hYzEyLTFhNDEtYTM4My05YmE5MTFlY2Y1MTUNClNVTU1BUlk6T25jZSBwZXIgbmV4dCAyIG1vbnRoDQpSUlVMRTpGUkVRPU1PTlRITFk7Q09VTlQ9MjtCWU1PTlRIREFZPTINCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMzAyVDE4MDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMzAyVDE5MDAwMA0KVFJBTlNQOk9QQVFVRQ0KRU5EOlZFVkVOVA0KQkVHSU46VkVWRU5UDQpDUkVBVEVEOjIwMTYwNDE1VDE1MTcxMFoNCkxBU1QtTU9ESUZJRUQ6MjAxNjA0MTVUMTUxODA5Wg0KRFRTVEFNUDoyMDE2MDQxNVQxNTE4MDlaDQpVSUQ6OTE1ZmQ2YmItNjhkYS02NjQ4LTkyZmMtZDBiZDRlMmE0NDk2DQpTVU1NQVJZOkphbnVhcnkgM3RoIG5leHQgMyB5ZWFycw0KUlJVTEU6RlJFUT1ZRUFSTFk7Q09VTlQ9MztCWU1PTlRIREFZPTM7QllNT05USD0xDQpEVFNUQVJUO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDEwM1QxODAwMDANCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDEwM1QxOTAwMDANClRSQU5TUDpPUEFRVUUNCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQyOFQxNDAwMzVaDQpMQVNULU1PRElGSUVEOjIwMTYwNTA0VDE0MzgzMloNCkRUU1RBTVA6MjAxNjA1MDRUMTQzODMyWg0KVUlEOkIwQzdBQzMyLUU5NjMtNDRCNy04QjdFLTc4MjM4MjE2QTcyNg0KUkRBVEU7VkFMVUU9REFURS1USU1FOjIwMTYwNTAyVDE0MDAwMFoNCkVYREFURToyMDE2MDUwMlQxNDAwMDBaDQpEVFNUQVJUO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDUwMlQxNjAwMDANCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDUwMlQxNjAwMDANClgtTU9aLUZBS0VELU1BU1RFUjoxDQpTRVFVRU5DRToxDQpYLU1PWi1HRU5FUkFUSU9OOjENCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQxMlQxMzM5NDRaDQpMQVNULU1PRElGSUVEOjIwMTYwNTA5VDE0MjQyOFoNCkRUU1RBTVA6MjAxNjA1MDlUMTQyNDI4Wg0KVUlEOmU1ZDA1YzNmLWUwODAtYTY0Zi1iZWQ4LTVjOTZhYjkyNDhkNA0KU1VNTUFSWTpFYWNoIDJuZCB3ZWVrDQpSUlVMRTpGUkVRPVdFRUtMWTtJTlRFUlZBTD0yO0JZREFZPVRVDQpYLU1PWi1MQVNUQUNLOjIwMTYwNTA5VDE0MjQyOFoNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDE2MDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDE3MDAwMA0KVFJBTlNQOk9QQVFVRQ0KREVTQ1JJUFRJT046RGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheQ0KWC1NT1otR0VORVJBVElPTjo4DQpCRUdJTjpWQUxBUk0NCkFDVElPTjpESVNQTEFZDQpUUklHR0VSO1ZBTFVFPURVUkFUSU9OOi1QMUQNCkRFU0NSSVBUSU9OOkRlZmF1bHQgTW96aWxsYSBEZXNjcmlwdGlvbg0KRU5EOlZBTEFSTQ0KRU5EOlZFVkVOVA0KQkVHSU46VkVWRU5UDQpDUkVBVEVEOjIwMTYwNTExVDA2Mjk0NloNCkxBU1QtTU9ESUZJRUQ6MjAxNjA1MTFUMDYzMTMyWg0KRFRTVEFNUDoyMDE2MDUxMVQwNjMxMzJaDQpVSUQ6Y2I0YjUzMTQtYzg4Mi03MzQ1LWE0N2QtMDA2YzEwNmRjMmZmDQpTVU1NQVJZOkN1c3RvbSAxDQpSUlVMRTpGUkVRPVdFRUtMWTtVTlRJTD0yMDE2MDQwMVQwNzAwMDBaO0lOVEVSVkFMPTI7QllEQVk9V0UsU1UNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTExVDA5MDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTExVDEwMDAwMA0KVFJBTlNQOk9QQVFVRQ0KREVTQ1JJUFRJT046U3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuDQpTRVFVRU5DRToxDQpYLU1PWi1HRU5FUkFUSU9OOjENCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDUxMVQwNjMxNTNaDQpMQVNULU1PRElGSUVEOjIwMTYwNTExVDA2MzM1NFoNCkRUU1RBTVA6MjAxNjA1MTFUMDYzMzU0Wg0KVUlEOjM1MTg0OWQ2LTRjMTUtNTM0ZS1iOTYxLTBiZjNmN2NhZWIxOA0KU1VNTUFSWTpDdXN0b20gMg0KUlJVTEU6RlJFUT1NT05USExZO1VOVElMPTIwMTcwMTAxVDA4MDAwMFo7QllNT05USERBWT0xNiwzMQ0KRFRTVEFSVDtUWklEPUV1cm9wZS9CZXJsaW46MjAxNjAxMTJUMDkwMDAwDQpEVEVORDtUWklEPUV1cm9wZS9CZXJsaW46MjAxNjAxMTJUMTAwMDAwDQpUUkFOU1A6T1BBUVVFDQpERVNDUklQVElPTjpTdGFydCBvbiBqYW4gMTJcLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLg0KRU5EOlZFVkVOVA0KQkVHSU46VkVWRU5UDQpDUkVBVEVEOjIwMTYwNTI1VDEwMDIyMFoNClVJRDo1REEwMjhEMS0yRTU4LTQ5MTUtODc4Qi03MTI0NEFGMjIzNDUNClJSVUxFOkZSRVE9WUVBUkxZO0lOVEVSVkFMPTI7QllNT05USD0xLDIsMTINCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDEzMVQxMDAwMDANClRSQU5TUDpPUEFRVUUNClNVTU1BUlk6Q3VzdG9tIDMNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTMxVDA5MDAwMA0KRFRTVEFNUDoyMDE2MDUyNVQxMDEwMzBaDQpFTkQ6VkVWRU5UDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA1MjVUMTM1MTE5Wg0KTEFTVC1NT0RJRklFRDoyMDE2MDUyNVQxMzU0MDFaDQpEVFNUQU1QOjIwMTYwNTI1VDEzNTQwMVoNClVJRDoxZjlmOGQ3NS01NmJlLWRhNDAtOWUxMC1mYjVmNmM5OWI2YmENClNVTU1BUlk6Q3VzdG9tIDQNClJSVUxFOkZSRVE9WUVBUkxZO0JZTU9OVEhEQVk9NDtCWU1PTlRIPTINCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTA0VDE2MDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTA0VDE3MDAwMA0KVFJBTlNQOk9QQVFVRQ0KWC1NT1otR0VORVJBVElPTjoxDQpFTkQ6VkVWRU5UDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA1MjVUMTM1MTE5Wg0KTEFTVC1NT0RJRklFRDoyMDE2MDUyNVQxMzU0MDFaDQpEVFNUQU1QOjIwMTYwNTI1VDEzNTQwMVoNClVJRDoxZjlmOGQ3NS01NmJlLWRhNDAtOWUxMC1mYjVmNmM5OWI2YmINClNVTU1BUlk6WWVhcmx5DQpSUlVMRTpGUkVRPVlFQVJMWTtCWU1PTlRIREFZPTQ7QllNT05USD0xDQpEVFNUQVJUO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDEwNFQxNjAwMDANCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDEwNFQxNzAwMDANClRSQU5TUDpPUEFRVUUNCkVORDpWRVZFTlQNCkVORDpWQ0FMRU5EQVINCg==
LyohCiAqIEZ1bGxDYWxlbmRhciB2My4wLjEgU3R5bGVzaGVldAogKiBEb2NzICYgTGljZW5zZTogaHR0cDovL2Z1bGxjYWxlbmRhci5pby8KICogKGMpIDIwMTYgQWRhbSBTaGF3CiAqLwoKCi5mYyB7CglkaXJlY3Rpb246IGx0cjsKCXRleHQtYWxpZ246IGxlZnQ7Cn0KCi5mYy1ydGwgewoJdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCmJvZHkgLmZjIHsgLyogZXh0cmEgcHJlY2VkZW5jZSB0byBvdmVyY29tZSBqcXVpICovCglmb250LXNpemU6IDFlbTsKfQoKCi8qIENvbG9ycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtdW50aGVtZWQgdGgsCi5mYy11bnRoZW1lZCB0ZCwKLmZjLXVudGhlbWVkIHRoZWFkLAouZmMtdW50aGVtZWQgdGJvZHksCi5mYy11bnRoZW1lZCAuZmMtZGl2aWRlciwKLmZjLXVudGhlbWVkIC5mYy1yb3csCi5mYy11bnRoZW1lZCAuZmMtY29udGVudCwgLyogZm9yIGd1dHRlciBib3JkZXIgKi8KLmZjLXVudGhlbWVkIC5mYy1wb3BvdmVyLAouZmMtdW50aGVtZWQgLmZjLWxpc3QtdmlldywKLmZjLXVudGhlbWVkIC5mYy1saXN0LWhlYWRpbmcgdGQgewoJYm9yZGVyLWNvbG9yOiAjZGRkOwp9CgouZmMtdW50aGVtZWQgLmZjLXBvcG92ZXIgewoJYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKfQoKLmZjLXVudGhlbWVkIC5mYy1kaXZpZGVyLAouZmMtdW50aGVtZWQgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciwKLmZjLXVudGhlbWVkIC5mYy1saXN0LWhlYWRpbmcgdGQgewoJYmFja2dyb3VuZDogI2VlZTsKfQoKLmZjLXVudGhlbWVkIC5mYy1wb3BvdmVyIC5mYy1oZWFkZXIgLmZjLWNsb3NlIHsKCWNvbG9yOiAjNjY2Owp9CgouZmMtdW50aGVtZWQgLmZjLXRvZGF5IHsKCWJhY2tncm91bmQ6ICNmY2Y4ZTM7Cn0KCi5mYy1oaWdobGlnaHQgeyAvKiB3aGVuIHVzZXIgaXMgc2VsZWN0aW5nIGNlbGxzICovCgliYWNrZ3JvdW5kOiAjYmNlOGYxOwoJb3BhY2l0eTogLjM7Cn0KCi5mYy1iZ2V2ZW50IHsgLyogZGVmYXVsdCBsb29rIGZvciBiYWNrZ3JvdW5kIGV2ZW50cyAqLwoJYmFja2dyb3VuZDogcmdiKDE0MywgMjIzLCAxMzApOwoJb3BhY2l0eTogLjM7Cn0KCi5mYy1ub25idXNpbmVzcyB7IC8qIGRlZmF1bHQgbG9vayBmb3Igbm9uLWJ1c2luZXNzLWhvdXJzIGFyZWFzICovCgkvKiB3aWxsIGluaGVyaXQgLmZjLWJnZXZlbnQncyBzdHlsZXMgKi8KCWJhY2tncm91bmQ6ICNkN2Q3ZDc7Cn0KCgovKiBJY29ucyAoaW5saW5lIGVsZW1lbnRzIHdpdGggc3R5bGVkIHRleHQgdGhhdCBtb2NrIGFycm93IGljb25zKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtaWNvbiB7CglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgloZWlnaHQ6IDFlbTsKCWxpbmUtaGVpZ2h0OiAxZW07Cglmb250LXNpemU6IDFlbTsKCXRleHQtYWxpZ246IGNlbnRlcjsKCW92ZXJmbG93OiBoaWRkZW47Cglmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub3NwYWNlOwoKCS8qIGRvbid0IGFsbG93IGJyb3dzZXIgdGV4dC1zZWxlY3Rpb24gKi8KCS13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKCS13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Cgkta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7CgktbW96LXVzZXItc2VsZWN0OiBub25lOwoJLW1zLXVzZXItc2VsZWN0OiBub25lOwoJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgovKgpBY2NlcHRhYmxlIGZvbnQtZmFtaWx5IG92ZXJyaWRlcyBmb3IgaW5kaXZpZHVhbCBpY29uczoKCSJBcmlhbCIsIHNhbnMtc2VyaWYKCSJUaW1lcyBOZXcgUm9tYW4iLCBzZXJpZgoKTk9URTogdXNlIHBlcmNlbnRhZ2UgZm9udCBzaXplcyBvciBlbHNlIG9sZCBJRSBjaG9rZXMKKi8KCi5mYy1pY29uOmFmdGVyIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLmZjLWljb24tbGVmdC1zaW5nbGUtYXJyb3c6YWZ0ZXIgewoJY29udGVudDogIlwwMjAzOSI7Cglmb250LXdlaWdodDogYm9sZDsKCWZvbnQtc2l6ZTogMjAwJTsKCXRvcDogLTclOwp9CgouZmMtaWNvbi1yaWdodC1zaW5nbGUtYXJyb3c6YWZ0ZXIgewoJY29udGVudDogIlwwMjAzQSI7Cglmb250LXdlaWdodDogYm9sZDsKCWZvbnQtc2l6ZTogMjAwJTsKCXRvcDogLTclOwp9CgouZmMtaWNvbi1sZWZ0LWRvdWJsZS1hcnJvdzphZnRlciB7Cgljb250ZW50OiAiXDAwMEFCIjsKCWZvbnQtc2l6ZTogMTYwJTsKCXRvcDogLTclOwp9CgouZmMtaWNvbi1yaWdodC1kb3VibGUtYXJyb3c6YWZ0ZXIgewoJY29udGVudDogIlwwMDBCQiI7Cglmb250LXNpemU6IDE2MCU7Cgl0b3A6IC03JTsKfQoKLmZjLWljb24tbGVmdC10cmlhbmdsZTphZnRlciB7Cgljb250ZW50OiAiXDI1QzQiOwoJZm9udC1zaXplOiAxMjUlOwoJdG9wOiAzJTsKfQoKLmZjLWljb24tcmlnaHQtdHJpYW5nbGU6YWZ0ZXIgewoJY29udGVudDogIlwyNUJBIjsKCWZvbnQtc2l6ZTogMTI1JTsKCXRvcDogMyU7Cn0KCi5mYy1pY29uLWRvd24tdHJpYW5nbGU6YWZ0ZXIgewoJY29udGVudDogIlwyNUJDIjsKCWZvbnQtc2l6ZTogMTI1JTsKCXRvcDogMiU7Cn0KCi5mYy1pY29uLXg6YWZ0ZXIgewoJY29udGVudDogIlwwMDBENyI7Cglmb250LXNpemU6IDIwMCU7Cgl0b3A6IDYlOwp9CgoKLyogQnV0dG9ucyAoc3R5bGVkIDxidXR0b24+IHRhZ3MsIG5vcm1hbGl6ZWQgdG8gd29yayBjcm9zcy1icm93c2VyKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMgYnV0dG9uIHsKCS8qIGZvcmNlIGhlaWdodCB0byBpbmNsdWRlIHRoZSBib3JkZXIgYW5kIHBhZGRpbmcgKi8KCS1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKCS13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CgoJLyogZGltZW5zaW9ucyAqLwoJbWFyZ2luOiAwOwoJaGVpZ2h0OiAyLjFlbTsKCXBhZGRpbmc6IDAgLjZlbTsKCgkvKiB0ZXh0ICYgY3Vyc29yICovCglmb250LXNpemU6IDFlbTsgLyogbm9ybWFsaXplICovCgl3aGl0ZS1zcGFjZTogbm93cmFwOwoJY3Vyc29yOiBwb2ludGVyOwp9CgovKiBGaXJlZm94IGhhcyBhbiBhbm5veWluZyBpbm5lciBib3JkZXIgKi8KLmZjIGJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciB7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgfQoJCi5mYy1zdGF0ZS1kZWZhdWx0IHsgLyogbm9uLXRoZW1lICovCglib3JkZXI6IDFweCBzb2xpZDsKfQoKLmZjLXN0YXRlLWRlZmF1bHQuZmMtY29ybmVyLWxlZnQgeyAvKiBub24tdGhlbWUgKi8KCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsKCWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKfQoKLmZjLXN0YXRlLWRlZmF1bHQuZmMtY29ybmVyLXJpZ2h0IHsgLyogbm9uLXRoZW1lICovCglib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OwoJYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDRweDsKfQoKLyogaWNvbnMgaW4gYnV0dG9ucyAqLwoKLmZjIGJ1dHRvbiAuZmMtaWNvbiB7IC8qIG5vbi10aGVtZSAqLwoJcG9zaXRpb246IHJlbGF0aXZlOwoJdG9wOiAtMC4wNWVtOyAvKiBzZWVtcyB0byBiZSBhIGdvb2QgYWRqdXN0bWVudCBhY3Jvc3MgYnJvd3NlcnMgKi8KCW1hcmdpbjogMCAuMmVtOwoJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoJCi8qCiAgYnV0dG9uIHN0YXRlcwogIGJvcnJvd2VkIGZyb20gdHdpdHRlciBib290c3RyYXAgKGh0dHA6Ly90d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0cmFwLykKKi8KCi5mYy1zdGF0ZS1kZWZhdWx0IHsKCWJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7CgliYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNmZmZmZmYsICNlNmU2ZTYpOwoJYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDAgMCwgMCAxMDAlLCBmcm9tKCNmZmZmZmYpLCB0bygjZTZlNmU2KSk7CgliYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICNmZmZmZmYsICNlNmU2ZTYpOwoJYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2ZmZmZmZiwgI2U2ZTZlNik7CgliYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZmZmZmZmLCAjZTZlNmU2KTsKCWJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKCWJvcmRlci1jb2xvcjogI2U2ZTZlNiAjZTZlNmU2ICNiZmJmYmY7Cglib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xKSByZ2JhKDAsIDAsIDAsIDAuMSkgcmdiYSgwLCAwLCAwLCAwLjI1KTsKCWNvbG9yOiAjMzMzOwoJdGV4dC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpOwoJYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDUpOwp9CgouZmMtc3RhdGUtaG92ZXIsCi5mYy1zdGF0ZS1kb3duLAouZmMtc3RhdGUtYWN0aXZlLAouZmMtc3RhdGUtZGlzYWJsZWQgewoJY29sb3I6ICMzMzMzMzM7CgliYWNrZ3JvdW5kLWNvbG9yOiAjZTZlNmU2Owp9CgouZmMtc3RhdGUtaG92ZXIgewoJY29sb3I6ICMzMzMzMzM7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNXB4OwoJLXdlYmtpdC10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLXBvc2l0aW9uIDAuMXMgbGluZWFyOwoJICAgLW1vei10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLXBvc2l0aW9uIDAuMXMgbGluZWFyOwoJICAgICAtby10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLXBvc2l0aW9uIDAuMXMgbGluZWFyOwoJICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLXBvc2l0aW9uIDAuMXMgbGluZWFyOwp9CgouZmMtc3RhdGUtZG93biwKLmZjLXN0YXRlLWFjdGl2ZSB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwoJYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKCWJveC1zaGFkb3c6IGluc2V0IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTUpLCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA1KTsKfQoKLmZjLXN0YXRlLWRpc2FibGVkIHsKCWN1cnNvcjogZGVmYXVsdDsKCWJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CglvcGFjaXR5OiAwLjY1OwoJYm94LXNoYWRvdzogbm9uZTsKfQoKCi8qIEJ1dHRvbnMgR3JvdXBzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy1idXR0b24tZ3JvdXAgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgovKgpldmVyeSBidXR0b24gdGhhdCBpcyBub3QgZmlyc3QgaW4gYSBidXR0b24gZ3JvdXAgc2hvdWxkIHNjb290Y2ggb3ZlciBvbmUgcGl4ZWwgYW5kIGNvdmVyIHRoZQpwcmV2aW91cyBidXR0b24ncyBib3JkZXIuLi4KKi8KCi5mYyAuZmMtYnV0dG9uLWdyb3VwID4gKiB7IC8qIGV4dHJhIHByZWNlZGVuY2UgYi9jIGJ1dHRvbnMgaGF2ZSBtYXJnaW4gc2V0IHRvIHplcm8gKi8KCWZsb2F0OiBsZWZ0OwoJbWFyZ2luOiAwIDAgMCAtMXB4Owp9CgouZmMgLmZjLWJ1dHRvbi1ncm91cCA+IDpmaXJzdC1jaGlsZCB7IC8qIHNhbWUgKi8KCW1hcmdpbi1sZWZ0OiAwOwp9CgoKLyogUG9wb3ZlcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtcG9wb3ZlciB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cglib3gtc2hhZG93OiAwIDJweCA2cHggcmdiYSgwLDAsMCwuMTUpOwp9CgouZmMtcG9wb3ZlciAuZmMtaGVhZGVyIHsgLyogVE9ETzogYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggZmMtaGVhZC9mYy1ib2R5ICovCglwYWRkaW5nOiAycHggNHB4Owp9CgouZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy10aXRsZSB7CgltYXJnaW46IDAgMnB4Owp9CgouZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy1jbG9zZSB7CgljdXJzb3I6IHBvaW50ZXI7Cn0KCi5mYy1sdHIgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciAuZmMtdGl0bGUsCi5mYy1ydGwgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciAuZmMtY2xvc2UgewoJZmxvYXQ6IGxlZnQ7Cn0KCi5mYy1ydGwgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciAuZmMtdGl0bGUsCi5mYy1sdHIgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciAuZmMtY2xvc2UgewoJZmxvYXQ6IHJpZ2h0Owp9CgovKiB1bnRoZW1lZCAqLwoKLmZjLXVudGhlbWVkIC5mYy1wb3BvdmVyIHsKCWJvcmRlci13aWR0aDogMXB4OwoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKfQoKLmZjLXVudGhlbWVkIC5mYy1wb3BvdmVyIC5mYy1oZWFkZXIgLmZjLWNsb3NlIHsKCWZvbnQtc2l6ZTogLjllbTsKCW1hcmdpbi10b3A6IDJweDsKfQoKLyoganF1aSB0aGVtZWQgKi8KCi5mYy1wb3BvdmVyID4gLnVpLXdpZGdldC1oZWFkZXIgKyAudWktd2lkZ2V0LWNvbnRlbnQgewoJYm9yZGVyLXRvcDogMDsgLyogd2hlcmUgdGhleSBtZWV0LCBsZXQgdGhlIGhlYWRlciBoYXZlIHRoZSBib3JkZXIgKi8KfQoKCi8qIE1pc2MgUmV1c2FibGUgQ29tcG9uZW50cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtZGl2aWRlciB7Cglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiAxcHg7Cn0KCmhyLmZjLWRpdmlkZXIgewoJaGVpZ2h0OiAwOwoJbWFyZ2luOiAwOwoJcGFkZGluZzogMCAwIDJweDsgLyogaGVpZ2h0IGlzIHVucmVsaWFibGUgYWNyb3NzIGJyb3dzZXJzLCBzbyB1c2UgcGFkZGluZyAqLwoJYm9yZGVyLXdpZHRoOiAxcHggMDsKfQoKLmZjLWNsZWFyIHsKCWNsZWFyOiBib3RoOwp9CgouZmMtYmcsCi5mYy1iZ2V2ZW50LXNrZWxldG9uLAouZmMtaGlnaGxpZ2h0LXNrZWxldG9uLAouZmMtaGVscGVyLXNrZWxldG9uIHsKCS8qIHRoZXNlIGVsZW1lbnQgc2hvdWxkIGFsd2F5cyBjbGluZyB0byB0b3AtbGVmdC9yaWdodCBjb3JuZXJzICovCglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cn0KCi5mYy1iZyB7Cglib3R0b206IDA7IC8qIHN0cmVjaCBiZyB0byBib3R0b20gZWRnZSAqLwp9CgouZmMtYmcgdGFibGUgewoJaGVpZ2h0OiAxMDAlOyAvKiBzdHJlY2ggYmcgdG8gYm90dG9tIGVkZ2UgKi8KfQoKCi8qIFRhYmxlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMgdGFibGUgewoJd2lkdGg6IDEwMCU7Cglib3gtc2l6aW5nOiBib3JkZXItYm94OyAvKiBmaXggc2Nyb2xsYmFyIGlzc3VlIGluIGZpcmVmb3ggKi8KCXRhYmxlLWxheW91dDogZml4ZWQ7Cglib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJYm9yZGVyLXNwYWNpbmc6IDA7Cglmb250LXNpemU6IDFlbTsgLyogbm9ybWFsaXplIGNyb3NzLWJyb3dzZXIgKi8KfQoKLmZjIHRoIHsKCXRleHQtYWxpZ246IGNlbnRlcjsKfQoKLmZjIHRoLAouZmMgdGQgewoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKCWJvcmRlci13aWR0aDogMXB4OwoJcGFkZGluZzogMDsKCXZlcnRpY2FsLWFsaWduOiB0b3A7Cn0KCi5mYyB0ZC5mYy10b2RheSB7Cglib3JkZXItc3R5bGU6IGRvdWJsZTsgLyogb3ZlcmNvbWUgbmVpZ2hib3JpbmcgYm9yZGVycyAqLwp9CgoKLyogSW50ZXJuYWwgTmF2IExpbmtzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCmFbZGF0YS1nb3RvXSB7CgljdXJzb3I6IHBvaW50ZXI7Cn0KCmFbZGF0YS1nb3RvXTpob3ZlciB7Cgl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKCi8qIEZha2UgVGFibGUgUm93cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMgLmZjLXJvdyB7IC8qIGV4dHJhIHByZWNlZGVuY2UgdG8gb3ZlcmNvbWUgdGhlbWVzIHcvIC51aS13aWRnZXQtY29udGVudCBmb3JjaW5nIGEgMXB4IGJvcmRlciAqLwoJLyogbm8gdmlzaWJsZSBib3JkZXIgYnkgZGVmYXVsdC4gYnV0IG1ha2UgYXZhaWxhYmxlIGlmIG5lZWQgYmUgKHNjcm9sbGJhciB3aWR0aCBjb21wZW5zYXRpb24pICovCglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiAwOwp9CgouZmMtcm93IHRhYmxlIHsKCS8qIGRvbid0IHB1dCBsZWZ0L3JpZ2h0IGJvcmRlciBvbiBhbnl0aGluZyB3aXRoaW4gYSBmYWtlIHJvdy4KCSAgIHRoZSBvdXRlciB0Ym9keSB3aWxsIHdvcnJ5IGFib3V0IHRoaXMgKi8KCWJvcmRlci1sZWZ0OiAwIGhpZGRlbiB0cmFuc3BhcmVudDsKCWJvcmRlci1yaWdodDogMCBoaWRkZW4gdHJhbnNwYXJlbnQ7CgoJLyogbm8gYm90dG9tIGJvcmRlcnMgb24gcm93cyAqLwoJYm9yZGVyLWJvdHRvbTogMCBoaWRkZW4gdHJhbnNwYXJlbnQ7IAp9CgouZmMtcm93OmZpcnN0LWNoaWxkIHRhYmxlIHsKCWJvcmRlci10b3A6IDAgaGlkZGVuIHRyYW5zcGFyZW50OyAvKiBubyB0b3AgYm9yZGVyIG9uIGZpcnN0IHJvdyAqLwp9CgoKLyogRGF5IFJvdyAodXNlZCB3aXRoaW4gdGhlIGhlYWRlciBhbmQgdGhlIERheUdyaWQpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy1yb3cgewoJcG9zaXRpb246IHJlbGF0aXZlOwp9CgouZmMtcm93IC5mYy1iZyB7Cgl6LWluZGV4OiAxOwp9CgovKiBoaWdobGlnaHRpbmcgY2VsbHMgJiBiYWNrZ3JvdW5kIGV2ZW50IHNrZWxldG9uICovCgouZmMtcm93IC5mYy1iZ2V2ZW50LXNrZWxldG9uLAouZmMtcm93IC5mYy1oaWdobGlnaHQtc2tlbGV0b24gewoJYm90dG9tOiAwOyAvKiBzdHJldGNoIHNrZWxldG9uIHRvIGJvdHRvbSBvZiByb3cgKi8KfQoKLmZjLXJvdyAuZmMtYmdldmVudC1za2VsZXRvbiB0YWJsZSwKLmZjLXJvdyAuZmMtaGlnaGxpZ2h0LXNrZWxldG9uIHRhYmxlIHsKCWhlaWdodDogMTAwJTsgLyogc3RyZXRjaCBza2VsZXRvbiB0byBib3R0b20gb2Ygcm93ICovCn0KCi5mYy1yb3cgLmZjLWhpZ2hsaWdodC1za2VsZXRvbiB0ZCwKLmZjLXJvdyAuZmMtYmdldmVudC1za2VsZXRvbiB0ZCB7Cglib3JkZXItY29sb3I6IHRyYW5zcGFyZW50Owp9CgouZmMtcm93IC5mYy1iZ2V2ZW50LXNrZWxldG9uIHsKCXotaW5kZXg6IDI7Cgp9CgouZmMtcm93IC5mYy1oaWdobGlnaHQtc2tlbGV0b24gewoJei1pbmRleDogMzsKfQoKLyoKcm93IGNvbnRlbnQgKHdoaWNoIGNvbnRhaW5zIGRheS93ZWVrIG51bWJlcnMgYW5kIGV2ZW50cykgYXMgd2VsbCBhcyAiaGVscGVyIiAod2hpY2ggY29udGFpbnMKdGVtcG9yYXJ5IHJlbmRlcmVkIGV2ZW50cykuCiovCgouZmMtcm93IC5mYy1jb250ZW50LXNrZWxldG9uIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDQ7CglwYWRkaW5nLWJvdHRvbTogMnB4OyAvKiBtYXRjaGVzIHRoZSBzcGFjZSBhYm92ZSB0aGUgZXZlbnRzICovCn0KCi5mYy1yb3cgLmZjLWhlbHBlci1za2VsZXRvbiB7Cgl6LWluZGV4OiA1Owp9CgouZmMtcm93IC5mYy1jb250ZW50LXNrZWxldG9uIHRkLAouZmMtcm93IC5mYy1oZWxwZXItc2tlbGV0b24gdGQgewoJLyogc2VlLXRocm91Z2ggdG8gdGhlIGJhY2tncm91bmQgYmVsb3cgKi8KCWJhY2tncm91bmQ6IG5vbmU7IC8qIGluIGNhc2UgPHRkPnMgYXJlIGdsb2JhbGx5IHN0eWxlZCAqLwoJYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKCgkvKiBkb24ndCBwdXQgYSBib3JkZXIgYmV0d2VlbiBldmVudHMgYW5kL29yIHRoZSBkYXkgbnVtYmVyICovCglib3JkZXItYm90dG9tOiAwOwp9CgouZmMtcm93IC5mYy1jb250ZW50LXNrZWxldG9uIHRib2R5IHRkLCAvKiBjZWxscyB3aXRoIGV2ZW50cyBpbnNpZGUgKHNvIE5PVCB0aGUgZGF5IG51bWJlciBjZWxsKSAqLwouZmMtcm93IC5mYy1oZWxwZXItc2tlbGV0b24gdGJvZHkgdGQgewoJLyogZG9uJ3QgcHV0IGEgYm9yZGVyIGJldHdlZW4gZXZlbnQgY2VsbHMgKi8KCWJvcmRlci10b3A6IDA7Cn0KCgovKiBTY3JvbGxpbmcgQ29udGFpbmVyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy1zY3JvbGxlciB7Cgktd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7Cn0KCi8qIFRPRE86IG1vdmUgdG8gYWdlbmRhL2Jhc2ljICovCi5mYy1zY3JvbGxlciA+IC5mYy1kYXktZ3JpZCwKLmZjLXNjcm9sbGVyID4gLmZjLXRpbWUtZ3JpZCB7Cglwb3NpdGlvbjogcmVsYXRpdmU7IC8qIHJlLXNjb3BlIGFsbCBwb3NpdGlvbnMgKi8KCXdpZHRoOiAxMDAlOyAvKiBoYWNrIHRvIGZvcmNlIHJlLXNpemluZyB0aGlzIGlubmVyIGVsZW1lbnQgd2hlbiBzY3JvbGxiYXJzIGFwcGVhci9kaXNhcHBlYXIgKi8KfQoKCi8qIEdsb2JhbCBFdmVudCBTdHlsZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLWV2ZW50IHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsgLyogZm9yIHJlc2l6ZSBoYW5kbGUgYW5kIG90aGVyIGlubmVyIHBvc2l0aW9uaW5nICovCglkaXNwbGF5OiBibG9jazsgLyogbWFrZSB0aGUgPGE+IHRhZyBibG9jayAqLwoJZm9udC1zaXplOiAuODVlbTsKCWxpbmUtaGVpZ2h0OiAxLjM7Cglib3JkZXItcmFkaXVzOiAzcHg7Cglib3JkZXI6IDFweCBzb2xpZCAjM2E4N2FkOyAvKiBkZWZhdWx0IEJPUkRFUiBjb2xvciAqLwoJZm9udC13ZWlnaHQ6IG5vcm1hbDsgLyogdW5kbyBqcXVpJ3MgdWktd2lkZ2V0LWhlYWRlciBib2xkICovCn0KCi5mYy1ldmVudCwKLmZjLWV2ZW50LWRvdCB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjM2E4N2FkOyAvKiBkZWZhdWx0IEJBQ0tHUk9VTkQgY29sb3IgKi8KfQoKLyogb3ZlcnBvd2VyIHNvbWUgb2YgYm9vdHN0cmFwJ3MgYW5kIGpxdWkncyBzdHlsZXMgb24gPGE+IHRhZ3MgKi8KLmZjLWV2ZW50LAouZmMtZXZlbnQ6aG92ZXIsCi51aS13aWRnZXQgLmZjLWV2ZW50IHsKCWNvbG9yOiAjZmZmOyAvKiBkZWZhdWx0IFRFWFQgY29sb3IgKi8KCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgLyogaWYgPGE+IGhhcyBhbiBocmVmICovCn0KCi5mYy1ldmVudFtocmVmXSwKLmZjLWV2ZW50LmZjLWRyYWdnYWJsZSB7CgljdXJzb3I6IHBvaW50ZXI7IC8qIGdpdmUgZXZlbnRzIHdpdGggbGlua3MgYW5kIGRyYWdnYWJsZSBldmVudHMgYSBoYW5kIG1vdXNlIHBvaW50ZXIgKi8KfQoKLmZjLW5vdC1hbGxvd2VkLCAvKiBjYXVzZXMgYSAid2FybmluZyIgY3Vyc29yLiBhcHBsaWVkIG9uIGJvZHkgKi8KLmZjLW5vdC1hbGxvd2VkIC5mYy1ldmVudCB7IC8qIHRvIG92ZXJyaWRlIGFuIGV2ZW50J3MgY3VzdG9tIGN1cnNvciAqLwoJY3Vyc29yOiBub3QtYWxsb3dlZDsKfQoKLmZjLWV2ZW50IC5mYy1iZyB7IC8qIHRoZSBnZW5lcmljIC5mYy1iZyBhbHJlYWR5IGRvZXMgcG9zaXRpb24gKi8KCXotaW5kZXg6IDE7CgliYWNrZ3JvdW5kOiAjZmZmOwoJb3BhY2l0eTogLjI1Owp9CgouZmMtZXZlbnQgLmZjLWNvbnRlbnQgewoJcG9zaXRpb246IHJlbGF0aXZlOwoJei1pbmRleDogMjsKfQoKLyogcmVzaXplciAoY3Vyc29yIEFORCB0b3VjaCBkZXZpY2VzKSAqLwoKLmZjLWV2ZW50IC5mYy1yZXNpemVyIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXotaW5kZXg6IDQ7Cn0KCi8qIHJlc2l6ZXIgKHRvdWNoIGRldmljZXMpICovCgouZmMtZXZlbnQgLmZjLXJlc2l6ZXIgewoJZGlzcGxheTogbm9uZTsKfQoKLmZjLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtcmVzaXplciwKLmZjLWV2ZW50LmZjLXNlbGVjdGVkIC5mYy1yZXNpemVyIHsKCS8qIG9ubHkgc2hvdyB3aGVuIGhvdmVyaW5nIG9yIHNlbGVjdGVkICh3aXRoIHRvdWNoKSAqLwoJZGlzcGxheTogYmxvY2s7Cn0KCi8qIGhpdCBhcmVhICovCgouZmMtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXJlc2l6ZXI6YmVmb3JlIHsKCS8qIDQweDQwIHRvdWNoIGFyZWEgKi8KCWNvbnRlbnQ6ICIiOwoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogOTk5OTsgLyogdXNlciBvZiB0aGlzIHV0aWwgY2FuIHNjb3BlIHdpdGhpbiBhIGxvd2VyIHotaW5kZXggKi8KCXRvcDogNTAlOwoJbGVmdDogNTAlOwoJd2lkdGg6IDQwcHg7CgloZWlnaHQ6IDQwcHg7CgltYXJnaW4tbGVmdDogLTIwcHg7CgltYXJnaW4tdG9wOiAtMjBweDsKfQoKCi8qIEV2ZW50IFNlbGVjdGlvbiAob25seSBmb3IgdG91Y2ggZGV2aWNlcykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLWV2ZW50LmZjLXNlbGVjdGVkIHsKCXotaW5kZXg6IDk5OTkgIWltcG9ydGFudDsgLyogb3ZlcmNvbWVzIGlubGluZSB6LWluZGV4ICovCglib3gtc2hhZG93OiAwIDJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjIpOwp9CgouZmMtZXZlbnQuZmMtc2VsZWN0ZWQuZmMtZHJhZ2dpbmcgewoJYm94LXNoYWRvdzogMCAycHggN3B4IHJnYmEoMCwgMCwgMCwgMC4zKTsKfQoKCi8qIEhvcml6b250YWwgRXZlbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIGJpZ2dlciB0b3VjaCBhcmVhIHdoZW4gc2VsZWN0ZWQgKi8KLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQ6YmVmb3JlIHsKCWNvbnRlbnQ6ICIiOwoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogMzsgLyogYmVsb3cgcmVzaXplcnMgKi8KCXRvcDogLTEwcHg7Cglib3R0b206IC0xMHB4OwoJbGVmdDogMDsKCXJpZ2h0OiAwOwp9CgovKiBldmVudHMgdGhhdCBhcmUgY29udGludWluZyB0by9mcm9tIGFub3RoZXIgd2Vlay4ga2lsbCByb3VuZGVkIGNvcm5lcnMgYW5kIGJ1dHQgdXAgYWdhaW5zdCBlZGdlICovCgouZmMtbHRyIC5mYy1oLWV2ZW50LmZjLW5vdC1zdGFydCwKLmZjLXJ0bCAuZmMtaC1ldmVudC5mYy1ub3QtZW5kIHsKCW1hcmdpbi1sZWZ0OiAwOwoJYm9yZGVyLWxlZnQtd2lkdGg6IDA7CglwYWRkaW5nLWxlZnQ6IDFweDsgLyogcmVwbGFjZSB0aGUgYm9yZGVyIHdpdGggcGFkZGluZyAqLwoJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDsKCWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7Cn0KCi5mYy1sdHIgLmZjLWgtZXZlbnQuZmMtbm90LWVuZCwKLmZjLXJ0bCAuZmMtaC1ldmVudC5mYy1ub3Qtc3RhcnQgewoJbWFyZ2luLXJpZ2h0OiAwOwoJYm9yZGVyLXJpZ2h0LXdpZHRoOiAwOwoJcGFkZGluZy1yaWdodDogMXB4OyAvKiByZXBsYWNlIHRoZSBib3JkZXIgd2l0aCBwYWRkaW5nICovCglib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDsKCWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwOwp9CgovKiByZXNpemVyIChjdXJzb3IgQU5EIHRvdWNoIGRldmljZXMpICovCgovKiBsZWZ0IHJlc2l6ZXIgICovCi5mYy1sdHIgLmZjLWgtZXZlbnQgLmZjLXN0YXJ0LXJlc2l6ZXIsCi5mYy1ydGwgLmZjLWgtZXZlbnQgLmZjLWVuZC1yZXNpemVyIHsKCWN1cnNvcjogdy1yZXNpemU7CglsZWZ0OiAtMXB4OyAvKiBvdmVyY29tZSBib3JkZXIgKi8KfQoKLyogcmlnaHQgcmVzaXplciAqLwouZmMtbHRyIC5mYy1oLWV2ZW50IC5mYy1lbmQtcmVzaXplciwKLmZjLXJ0bCAuZmMtaC1ldmVudCAuZmMtc3RhcnQtcmVzaXplciB7CgljdXJzb3I6IGUtcmVzaXplOwoJcmlnaHQ6IC0xcHg7IC8qIG92ZXJjb21lIGJvcmRlciAqLwp9CgovKiByZXNpemVyIChtb3VzZSBkZXZpY2VzKSAqLwoKLmZjLWgtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1yZXNpemVyIHsKCXdpZHRoOiA3cHg7Cgl0b3A6IC0xcHg7IC8qIG92ZXJjb21lIHRvcCBib3JkZXIgKi8KCWJvdHRvbTogLTFweDsgLyogb3ZlcmNvbWUgYm90dG9tIGJvcmRlciAqLwp9CgovKiByZXNpemVyICh0b3VjaCBkZXZpY2VzKSAqLwoKLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXJlc2l6ZXIgewoJLyogOHg4IGxpdHRsZSBkb3QgKi8KCWJvcmRlci1yYWRpdXM6IDRweDsKCWJvcmRlci13aWR0aDogMXB4OwoJd2lkdGg6IDZweDsKCWhlaWdodDogNnB4OwoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKCWJvcmRlci1jb2xvcjogaW5oZXJpdDsKCWJhY2tncm91bmQ6ICNmZmY7CgkvKiB2ZXJ0aWNhbGx5IGNlbnRlciAqLwoJdG9wOiA1MCU7CgltYXJnaW4tdG9wOiAtNHB4Owp9CgovKiBsZWZ0IHJlc2l6ZXIgICovCi5mYy1sdHIgLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXN0YXJ0LXJlc2l6ZXIsCi5mYy1ydGwgLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLWVuZC1yZXNpemVyIHsKCW1hcmdpbi1sZWZ0OiAtNHB4OyAvKiBjZW50ZXJzIHRoZSA4eDggZG90IG9uIHRoZSBsZWZ0IGVkZ2UgKi8KfQoKLyogcmlnaHQgcmVzaXplciAqLwouZmMtbHRyIC5mYy1oLWV2ZW50LmZjLXNlbGVjdGVkIC5mYy1lbmQtcmVzaXplciwKLmZjLXJ0bCAuZmMtaC1ldmVudC5mYy1zZWxlY3RlZCAuZmMtc3RhcnQtcmVzaXplciB7CgltYXJnaW4tcmlnaHQ6IC00cHg7IC8qIGNlbnRlcnMgdGhlIDh4OCBkb3Qgb24gdGhlIHJpZ2h0IGVkZ2UgKi8KfQoKCi8qIERheUdyaWQgZXZlbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KV2UgdXNlIHRoZSBmdWxsICJmYy1kYXktZ3JpZC1ldmVudCIgY2xhc3MgaW5zdGVhZCBvZiB1c2luZyBkZXNjZW5kYW50cyBiZWNhdXNlIHRoZSBldmVudCB3b24ndApiZSBhIGRlc2NlbmRhbnQgb2YgdGhlIGdyaWQgd2hlbiBpdCBpcyBiZWluZyBkcmFnZ2VkLgoqLwoKLmZjLWRheS1ncmlkLWV2ZW50IHsKCW1hcmdpbjogMXB4IDJweCAwOyAvKiBzcGFjaW5nIGJldHdlZW4gZXZlbnRzIGFuZCBlZGdlcyAqLwoJcGFkZGluZzogMCAxcHg7Cn0KCnRyOmZpcnN0LWNoaWxkID4gdGQgPiAuZmMtZGF5LWdyaWQtZXZlbnQgewoJbWFyZ2luLXRvcDogMnB4OyAvKiBhIGxpdHRsZSBiaXQgbW9yZSBzcGFjZSBiZWZvcmUgdGhlIGZpcnN0IGV2ZW50ICovCn0KCi5mYy1kYXktZ3JpZC1ldmVudC5mYy1zZWxlY3RlZDphZnRlciB7Cgljb250ZW50OiAiIjsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXotaW5kZXg6IDE7IC8qIHNhbWUgei1pbmRleCBhcyBmYy1iZywgYmVoaW5kIHRleHQgKi8KCS8qIG92ZXJjb21lIHRoZSBib3JkZXJzICovCgl0b3A6IC0xcHg7CglyaWdodDogLTFweDsKCWJvdHRvbTogLTFweDsKCWxlZnQ6IC0xcHg7CgkvKiBkYXJrZW5pbmcgZWZmZWN0ICovCgliYWNrZ3JvdW5kOiAjMDAwOwoJb3BhY2l0eTogLjI1Owp9CgouZmMtZGF5LWdyaWQtZXZlbnQgLmZjLWNvbnRlbnQgeyAvKiBmb3JjZSBldmVudHMgdG8gYmUgb25lLWxpbmUgdGFsbCAqLwoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKCW92ZXJmbG93OiBoaWRkZW47Cn0KCi5mYy1kYXktZ3JpZC1ldmVudCAuZmMtdGltZSB7Cglmb250LXdlaWdodDogYm9sZDsKfQoKLyogcmVzaXplciAoY3Vyc29yIGRldmljZXMpICovCgovKiBsZWZ0IHJlc2l6ZXIgICovCi5mYy1sdHIgLmZjLWRheS1ncmlkLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtc3RhcnQtcmVzaXplciwKLmZjLXJ0bCAuZmMtZGF5LWdyaWQtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1lbmQtcmVzaXplciB7CgltYXJnaW4tbGVmdDogLTJweDsgLyogdG8gdGhlIGRheSBjZWxsJ3MgZWRnZSAqLwp9CgovKiByaWdodCByZXNpemVyICovCi5mYy1sdHIgLmZjLWRheS1ncmlkLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtZW5kLXJlc2l6ZXIsCi5mYy1ydGwgLmZjLWRheS1ncmlkLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtc3RhcnQtcmVzaXplciB7CgltYXJnaW4tcmlnaHQ6IC0ycHg7IC8qIHRvIHRoZSBkYXkgY2VsbCdzIGVkZ2UgKi8KfQoKCi8qIEV2ZW50IExpbWl0aW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qICJtb3JlIiBsaW5rIHRoYXQgcmVwcmVzZW50cyBoaWRkZW4gZXZlbnRzICovCgphLmZjLW1vcmUgewoJbWFyZ2luOiAxcHggM3B4OwoJZm9udC1zaXplOiAuODVlbTsKCWN1cnNvcjogcG9pbnRlcjsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKYS5mYy1tb3JlOmhvdmVyIHsKCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgouZmMtbGltaXRlZCB7IC8qIHJvd3MgYW5kIGNlbGxzIHRoYXQgYXJlIGhpZGRlbiBiZWNhdXNlIG9mIGEgIm1vcmUiIGxpbmsgKi8KCWRpc3BsYXk6IG5vbmU7Cn0KCi8qIHBvcG92ZXIgdGhhdCBhcHBlYXJzIHdoZW4gIm1vcmUiIGxpbmsgaXMgY2xpY2tlZCAqLwoKLmZjLWRheS1ncmlkIC5mYy1yb3cgewoJei1pbmRleDogMTsgLyogbWFrZSB0aGUgIm1vcmUiIHBvcG92ZXIgb25lIGhpZ2hlciB0aGFuIHRoaXMgKi8KfQoKLmZjLW1vcmUtcG9wb3ZlciB7Cgl6LWluZGV4OiAyOwoJd2lkdGg6IDIyMHB4Owp9CgouZmMtbW9yZS1wb3BvdmVyIC5mYy1ldmVudC1jb250YWluZXIgewoJcGFkZGluZzogMTBweDsKfQoKCi8qIE5vdyBJbmRpY2F0b3IKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLW5vdy1pbmRpY2F0b3IgewoJcG9zaXRpb246IGFic29sdXRlOwoJYm9yZGVyOiAwIHNvbGlkIHJlZDsKfQoKCi8qIFV0aWxpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtdW5zZWxlY3RhYmxlIHsKCS13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CgkgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOwoJICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKCSAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CgkgICAgICAgIHVzZXItc2VsZWN0OiBub25lOwoJLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lOwoJLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwp9CgoKCi8qIFRvb2xiYXIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLXRvb2xiYXIgewoJdGV4dC1hbGlnbjogY2VudGVyOwoJbWFyZ2luLWJvdHRvbTogMWVtOwp9CgouZmMtdG9vbGJhciAuZmMtbGVmdCB7CglmbG9hdDogbGVmdDsKfQoKLmZjLXRvb2xiYXIgLmZjLXJpZ2h0IHsKCWZsb2F0OiByaWdodDsKfQoKLmZjLXRvb2xiYXIgLmZjLWNlbnRlciB7CglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi8qIHRoZSB0aGluZ3Mgd2l0aGluIGVhY2ggbGVmdC9yaWdodC9jZW50ZXIgc2VjdGlvbiAqLwouZmMgLmZjLXRvb2xiYXIgPiAqID4gKiB7IC8qIGV4dHJhIHByZWNlZGVuY2UgdG8gb3ZlcnJpZGUgYnV0dG9uIGJvcmRlciBtYXJnaW5zICovCglmbG9hdDogbGVmdDsKCW1hcmdpbi1sZWZ0OiAuNzVlbTsKfQoKLyogdGhlIGZpcnN0IHRoaW5nIHdpdGhpbiBlYWNoIGxlZnQvY2VudGVyL3JpZ2h0IHNlY3Rpb24gKi8KLmZjIC5mYy10b29sYmFyID4gKiA+IDpmaXJzdC1jaGlsZCB7IC8qIGV4dHJhIHByZWNlZGVuY2UgdG8gb3ZlcnJpZGUgYnV0dG9uIGJvcmRlciBtYXJnaW5zICovCgltYXJnaW4tbGVmdDogMDsKfQoJCi8qIHRpdGxlIHRleHQgKi8KCi5mYy10b29sYmFyIGgyIHsKCW1hcmdpbjogMDsKfQoKLyogYnV0dG9uIGxheWVyaW5nIChmb3IgYm9yZGVyIHByZWNlZGVuY2UpICovCgouZmMtdG9vbGJhciBidXR0b24gewoJcG9zaXRpb246IHJlbGF0aXZlOwp9CgouZmMtdG9vbGJhciAuZmMtc3RhdGUtaG92ZXIsCi5mYy10b29sYmFyIC51aS1zdGF0ZS1ob3ZlciB7Cgl6LWluZGV4OiAyOwp9CgkKLmZjLXRvb2xiYXIgLmZjLXN0YXRlLWRvd24gewoJei1pbmRleDogMzsKfQoKLmZjLXRvb2xiYXIgLmZjLXN0YXRlLWFjdGl2ZSwKLmZjLXRvb2xiYXIgLnVpLXN0YXRlLWFjdGl2ZSB7Cgl6LWluZGV4OiA0Owp9CgouZmMtdG9vbGJhciBidXR0b246Zm9jdXMgewoJei1pbmRleDogNTsKfQoKCi8qIFZpZXcgU3RydWN0dXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIHVuZG8gdHdpdHRlciBib290c3RyYXAncyBib3gtc2l6aW5nIHJ1bGVzLiBub3JtYWxpemVzIHBvc2l0aW9uaW5nIHRlY2huaXF1ZXMgKi8KLyogZG9uJ3QgZG8gdGhpcyBmb3IgdGhlIHRvb2xiYXIgYmVjYXVzZSB3ZSdsbCB3YW50IGJvb3RzdHJhcCB0byBzdHlsZSB0aG9zZSBidXR0b25zIGFzIHNvbWUgcHQgKi8KLmZjLXZpZXctY29udGFpbmVyICosCi5mYy12aWV3LWNvbnRhaW5lciAqOmJlZm9yZSwKLmZjLXZpZXctY29udGFpbmVyICo6YWZ0ZXIgewoJLXdlYmtpdC1ib3gtc2l6aW5nOiBjb250ZW50LWJveDsKCSAgIC1tb3otYm94LXNpemluZzogY29udGVudC1ib3g7CgkgICAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94Owp9CgouZmMtdmlldywgLyogc2NvcGUgcG9zaXRpb25pbmcgYW5kIHotaW5kZXgncyBmb3IgZXZlcnl0aGluZyB3aXRoaW4gdGhlIHZpZXcgKi8KLmZjLXZpZXcgPiB0YWJsZSB7IC8qIHNvIGRyYWdnZWQgZWxlbWVudHMgY2FuIGJlIGFib3ZlIHRoZSB2aWV3J3MgbWFpbiBlbGVtZW50ICovCglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAxOwp9CgoKCi8qIEJhc2ljVmlldwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBkYXkgcm93IHN0cnVjdHVyZSAqLwoKLmZjLWJhc2ljV2Vlay12aWV3IC5mYy1jb250ZW50LXNrZWxldG9uLAouZmMtYmFzaWNEYXktdmlldyAuZmMtY29udGVudC1za2VsZXRvbiB7CgkvKiB0aGVyZSBtYXkgYmUgd2VlayBudW1iZXJzIGluIHRoZXNlIHZpZXdzLCBzbyBubyBwYWRkaW5nLXRvcCAqLwoJcGFkZGluZy1ib3R0b206IDFlbTsgLyogZW5zdXJlIGEgc3BhY2UgYXQgYm90dG9tIG9mIGNlbGwgZm9yIHVzZXIgc2VsZWN0aW5nL2NsaWNraW5nICovCn0KCi5mYy1iYXNpYy12aWV3IC5mYy1ib2R5IC5mYy1yb3cgewoJbWluLWhlaWdodDogNGVtOyAvKiBlbnN1cmUgdGhhdCBhbGwgcm93cyBhcmUgYXQgbGVhc3QgdGhpcyB0YWxsICovCn0KCi8qIGEgInJpZ2lkIiByb3cgd2lsbCB0YWtlIHVwIGEgY29uc3RhbnQgYW1vdW50IG9mIGhlaWdodCBiZWNhdXNlIGNvbnRlbnQtc2tlbGV0b24gaXMgYWJzb2x1dGUgKi8KCi5mYy1yb3cuZmMtcmlnaWQgewoJb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmZjLXJvdy5mYy1yaWdpZCAuZmMtY29udGVudC1za2VsZXRvbiB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cn0KCi8qIHdlZWsgYW5kIGRheSBudW1iZXIgc3R5bGluZyAqLwoKLmZjLWRheS10b3AuZmMtb3RoZXItbW9udGggewoJb3BhY2l0eTogMC4zOwp9CgouZmMtYmFzaWMtdmlldyAuZmMtd2Vlay1udW1iZXIsCi5mYy1iYXNpYy12aWV3IC5mYy1kYXktbnVtYmVyIHsKCXBhZGRpbmc6IDJweDsKfQoKLmZjLWJhc2ljLXZpZXcgdGguZmMtd2Vlay1udW1iZXIsCi5mYy1iYXNpYy12aWV3IHRoLmZjLWRheS1udW1iZXIgewoJcGFkZGluZzogMCAycHg7IC8qIGNvbHVtbiBoZWFkZXJzIGNhbid0IGhhdmUgYXMgbXVjaCB2IHNwYWNlICovCn0KCi5mYy1sdHIgLmZjLWJhc2ljLXZpZXcgLmZjLWRheS10b3AgLmZjLWRheS1udW1iZXIgeyBmbG9hdDogcmlnaHQ7IH0KLmZjLXJ0bCAuZmMtYmFzaWMtdmlldyAuZmMtZGF5LXRvcCAuZmMtZGF5LW51bWJlciB7IGZsb2F0OiBsZWZ0OyB9CgouZmMtbHRyIC5mYy1iYXNpYy12aWV3IC5mYy1kYXktdG9wIC5mYy13ZWVrLW51bWJlciB7IGZsb2F0OiBsZWZ0OyBib3JkZXItcmFkaXVzOiAwIDAgM3B4IDA7IH0KLmZjLXJ0bCAuZmMtYmFzaWMtdmlldyAuZmMtZGF5LXRvcCAuZmMtd2Vlay1udW1iZXIgeyBmbG9hdDogcmlnaHQ7IGJvcmRlci1yYWRpdXM6IDAgMCAwIDNweDsgfQoKLmZjLWJhc2ljLXZpZXcgLmZjLWRheS10b3AgLmZjLXdlZWstbnVtYmVyIHsKCW1pbi13aWR0aDogMS41ZW07Cgl0ZXh0LWFsaWduOiBjZW50ZXI7CgliYWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOwoJY29sb3I6ICM4MDgwODA7Cn0KCi8qIHdoZW4gd2Vlay9kYXkgbnVtYmVyIGhhdmUgb3duIGNvbHVtbiAqLwoKLmZjLWJhc2ljLXZpZXcgdGQuZmMtd2Vlay1udW1iZXIgewoJdGV4dC1hbGlnbjogY2VudGVyOwp9CgouZmMtYmFzaWMtdmlldyB0ZC5mYy13ZWVrLW51bWJlciA+ICogewoJLyogd29yayBhcm91bmQgdGhlIHdheSB3ZSBkbyBjb2x1bW4gcmVzaXppbmcgYW5kIGVuc3VyZSBhIG1pbmltdW0gd2lkdGggKi8KCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCW1pbi13aWR0aDogMS4yNWVtOwp9CgoKLyogQWdlbmRhVmlldyBhbGwtZGF5IGFyZWEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLWFnZW5kYS12aWV3IC5mYy1kYXktZ3JpZCB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAyOyAvKiBzbyB0aGUgIm1vcmUuLiIgcG9wb3ZlciB3aWxsIGJlIG92ZXIgdGhlIHRpbWUgZ3JpZCAqLwp9CgouZmMtYWdlbmRhLXZpZXcgLmZjLWRheS1ncmlkIC5mYy1yb3cgewoJbWluLWhlaWdodDogM2VtOyAvKiBhbGwtZGF5IHNlY3Rpb24gd2lsbCBuZXZlciBnZXQgc2hvcnRlciB0aGFuIHRoaXMgKi8KfQoKLmZjLWFnZW5kYS12aWV3IC5mYy1kYXktZ3JpZCAuZmMtcm93IC5mYy1jb250ZW50LXNrZWxldG9uIHsKCXBhZGRpbmctYm90dG9tOiAxZW07IC8qIGdpdmUgc3BhY2UgdW5kZXJuZWF0aCBldmVudHMgZm9yIGNsaWNraW5nL3NlbGVjdGluZyBkYXlzICovCn0KCgovKiBUaW1lR3JpZCBheGlzIHJ1bm5pbmcgZG93biB0aGUgc2lkZSAoZm9yIGJvdGggdGhlIGFsbC1kYXkgYXJlYSBhbmQgdGhlIHNsb3QgYXJlYSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjIC5mYy1heGlzIHsgLyogLmZjIHRvIG92ZXJjb21lIGRlZmF1bHQgY2VsbCBzdHlsZXMgKi8KCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CglwYWRkaW5nOiAwIDRweDsKCXdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5mYy1sdHIgLmZjLWF4aXMgewoJdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCi5mYy1ydGwgLmZjLWF4aXMgewoJdGV4dC1hbGlnbjogbGVmdDsKfQoKLnVpLXdpZGdldCB0ZC5mYy1heGlzIHsKCWZvbnQtd2VpZ2h0OiBub3JtYWw7IC8qIG92ZXJjb21lIGpxdWkgdGhlbWUgbWFraW5nIGl0IGJvbGQgKi8KfQoKCi8qIFRpbWVHcmlkIFN0cnVjdHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtdGltZS1ncmlkLWNvbnRhaW5lciwgLyogc28gc2Nyb2xsIGNvbnRhaW5lcidzIHotaW5kZXggaXMgYmVsb3cgYWxsLWRheSAqLwouZmMtdGltZS1ncmlkIHsgLyogc28gc2xhdHMvYmcvY29udGVudC9ldGMgcG9zaXRpb25zIGdldCBzY29wZWQgd2l0aGluIGhlcmUgKi8KCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDE7Cn0KCi5mYy10aW1lLWdyaWQgewoJbWluLWhlaWdodDogMTAwJTsgLyogc28gaWYgaGVpZ2h0IHNldHRpbmcgaXMgJ2F1dG8nLCAuZmMtYmcgc3RyZXRjaGVzIHRvIGZpbGwgaGVpZ2h0ICovCn0KCi5mYy10aW1lLWdyaWQgdGFibGUgeyAvKiBkb24ndCBwdXQgb3V0ZXIgYm9yZGVycyBvbiBzbGF0cy9iZy9jb250ZW50L2V0YyAqLwoJYm9yZGVyOiAwIGhpZGRlbiB0cmFuc3BhcmVudDsKfQoKLmZjLXRpbWUtZ3JpZCA+IC5mYy1iZyB7Cgl6LWluZGV4OiAxOwp9CgouZmMtdGltZS1ncmlkIC5mYy1zbGF0cywKLmZjLXRpbWUtZ3JpZCA+IGhyIHsgLyogdGhlIDxocj4gQWdlbmRhVmlldyBpbmplY3RzIHdoZW4gZ3JpZCBpcyBzaG9ydGVyIHRoYW4gc2Nyb2xsZXIgKi8KCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDI7Cn0KCi5mYy10aW1lLWdyaWQgLmZjLWNvbnRlbnQtY29sIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsgLyogYmVjYXVzZSBub3ctaW5kaWNhdG9yIGxpdmVzIGRpcmVjdGx5IGluc2lkZSAqLwp9CgouZmMtdGltZS1ncmlkIC5mYy1jb250ZW50LXNrZWxldG9uIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXotaW5kZXg6IDM7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cn0KCi8qIGRpdnMgd2l0aGluIGEgY2VsbCB3aXRoaW4gdGhlIGZjLWNvbnRlbnQtc2tlbGV0b24gKi8KCi5mYy10aW1lLWdyaWQgLmZjLWJ1c2luZXNzLWNvbnRhaW5lciB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAxOwp9CgouZmMtdGltZS1ncmlkIC5mYy1iZ2V2ZW50LWNvbnRhaW5lciB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAyOwp9CgouZmMtdGltZS1ncmlkIC5mYy1oaWdobGlnaHQtY29udGFpbmVyIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDM7Cn0KCi5mYy10aW1lLWdyaWQgLmZjLWV2ZW50LWNvbnRhaW5lciB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiA0Owp9CgouZmMtdGltZS1ncmlkIC5mYy1ub3ctaW5kaWNhdG9yLWxpbmUgewoJei1pbmRleDogNTsKfQoKLmZjLXRpbWUtZ3JpZCAuZmMtaGVscGVyLWNvbnRhaW5lciB7IC8qIGFsc28gaXMgZmMtZXZlbnQtY29udGFpbmVyICovCglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiA2Owp9CgoKLyogVGltZUdyaWQgU2xhdHMgKGxpbmVzIHRoYXQgcnVuIGhvcml6b250YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLXRpbWUtZ3JpZCAuZmMtc2xhdHMgdGQgewoJaGVpZ2h0OiAxLjVlbTsKCWJvcmRlci1ib3R0b206IDA7IC8qIGVhY2ggY2VsbCBpcyByZXNwb25zaWJsZSBmb3IgaXRzIHRvcCBib3JkZXIgKi8KfQoKLmZjLXRpbWUtZ3JpZCAuZmMtc2xhdHMgLmZjLW1pbm9yIHRkIHsKCWJvcmRlci10b3Atc3R5bGU6IGRvdHRlZDsKfQoKLmZjLXRpbWUtZ3JpZCAuZmMtc2xhdHMgLnVpLXdpZGdldC1jb250ZW50IHsgLyogZm9yIGpxdWkgdGhlbWUgKi8KCWJhY2tncm91bmQ6IG5vbmU7IC8qIHNlZSB0aHJvdWdoIHRvIGZjLWJnICovCn0KCgovKiBUaW1lR3JpZCBIaWdobGlnaHRpbmcgU2xvdHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLXRpbWUtZ3JpZCAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lciB7IC8qIGEgZGl2IHdpdGhpbiBhIGNlbGwgd2l0aGluIHRoZSBmYy1oaWdobGlnaHQtc2tlbGV0b24gKi8KCXBvc2l0aW9uOiByZWxhdGl2ZTsgLyogc2NvcGVzIHRoZSBsZWZ0L3JpZ2h0IG9mIHRoZSBmYy1oaWdobGlnaHQgdG8gYmUgaW4gdGhlIGNvbHVtbiAqLwp9CgouZmMtdGltZS1ncmlkIC5mYy1oaWdobGlnaHQgewoJcG9zaXRpb246IGFic29sdXRlOwoJbGVmdDogMDsKCXJpZ2h0OiAwOwoJLyogdG9wIGFuZCBib3R0b20gd2lsbCBiZSBpbiBieSBKUyAqLwp9CgoKLyogVGltZUdyaWQgRXZlbnQgQ29udGFpbm1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLWx0ciAuZmMtdGltZS1ncmlkIC5mYy1ldmVudC1jb250YWluZXIgeyAvKiBzcGFjZSBvbiB0aGUgc2lkZXMgb2YgZXZlbnRzIGZvciBMVFIgKGRlZmF1bHQpICovCgltYXJnaW46IDAgMi41JSAwIDJweDsKfQoKLmZjLXJ0bCAuZmMtdGltZS1ncmlkIC5mYy1ldmVudC1jb250YWluZXIgeyAvKiBzcGFjZSBvbiB0aGUgc2lkZXMgb2YgZXZlbnRzIGZvciBSVEwgKi8KCW1hcmdpbjogMCAycHggMCAyLjUlOwp9CgouZmMtdGltZS1ncmlkIC5mYy1ldmVudCwKLmZjLXRpbWUtZ3JpZCAuZmMtYmdldmVudCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl6LWluZGV4OiAxOyAvKiBzY29wZSBpbm5lciB6LWluZGV4J3MgKi8KfQoKLmZjLXRpbWUtZ3JpZCAuZmMtYmdldmVudCB7CgkvKiBiYWNrZ3JvdW5kIGV2ZW50cyBhbHdheXMgc3BhbiBmdWxsIHdpZHRoICovCglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cn0KCgovKiBHZW5lcmljIFZlcnRpY2FsIEV2ZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy12LWV2ZW50LmZjLW5vdC1zdGFydCB7IC8qIGV2ZW50cyB0aGF0IGFyZSBjb250aW51aW5nIGZyb20gYW5vdGhlciBkYXkgKi8KCS8qIHJlcGxhY2Ugc3BhY2UgbWFkZSBieSB0aGUgdG9wIGJvcmRlciB3aXRoIHBhZGRpbmcgKi8KCWJvcmRlci10b3Atd2lkdGg6IDA7CglwYWRkaW5nLXRvcDogMXB4OwoKCS8qIHJlbW92ZSB0b3Agcm91bmRlZCBjb3JuZXJzICovCglib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwOwoJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7Cn0KCi5mYy12LWV2ZW50LmZjLW5vdC1lbmQgewoJLyogcmVwbGFjZSBzcGFjZSBtYWRlIGJ5IHRoZSB0b3AgYm9yZGVyIHdpdGggcGFkZGluZyAqLwoJYm9yZGVyLWJvdHRvbS13aWR0aDogMDsKCXBhZGRpbmctYm90dG9tOiAxcHg7CgoJLyogcmVtb3ZlIGJvdHRvbSByb3VuZGVkIGNvcm5lcnMgKi8KCWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7Cglib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDsKfQoKCi8qIFRpbWVHcmlkIEV2ZW50IFN0eWxpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpXZSB1c2UgdGhlIGZ1bGwgImZjLXRpbWUtZ3JpZC1ldmVudCIgY2xhc3MgaW5zdGVhZCBvZiB1c2luZyBkZXNjZW5kYW50cyBiZWNhdXNlIHRoZSBldmVudCB3b24ndApiZSBhIGRlc2NlbmRhbnQgb2YgdGhlIGdyaWQgd2hlbiBpdCBpcyBiZWluZyBkcmFnZ2VkLgoqLwoKLmZjLXRpbWUtZ3JpZC1ldmVudCB7CglvdmVyZmxvdzogaGlkZGVuOyAvKiBkb24ndCBsZXQgdGhlIGJnIGZsb3cgb3ZlciByb3VuZGVkIGNvcm5lcnMgKi8KfQoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zZWxlY3RlZCB7CgkvKiBuZWVkIHRvIGFsbG93IHRvdWNoIHJlc2l6ZXJzIHRvIGV4dGVuZCBvdXRzaWRlIGV2ZW50J3MgYm91bmRpbmcgYm94ICovCgkvKiBjb21tb24gZmMtc2VsZWN0ZWQgc3R5bGVzIGhpZGUgdGhlIGZjLWJnLCBzbyBkb24ndCBuZWVkIHRoaXMgYW55d2F5ICovCglvdmVyZmxvdzogdmlzaWJsZTsKfQoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zZWxlY3RlZCAuZmMtYmcgewoJZGlzcGxheTogbm9uZTsgLyogaGlkZSBzZW1pLXdoaXRlIGJhY2tncm91bmQsIHRvIGFwcGVhciBkYXJrZXIgKi8KfQoKLmZjLXRpbWUtZ3JpZC1ldmVudCAuZmMtY29udGVudCB7CglvdmVyZmxvdzogaGlkZGVuOyAvKiBmb3Igd2hlbiAuZmMtc2VsZWN0ZWQgKi8KfQoKLmZjLXRpbWUtZ3JpZC1ldmVudCAuZmMtdGltZSwKLmZjLXRpbWUtZ3JpZC1ldmVudCAuZmMtdGl0bGUgewoJcGFkZGluZzogMCAxcHg7Cn0KCi5mYy10aW1lLWdyaWQtZXZlbnQgLmZjLXRpbWUgewoJZm9udC1zaXplOiAuODVlbTsKCXdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi8qIHNob3J0IG1vZGUsIHdoZXJlIHRpbWUgYW5kIHRpdGxlIGFyZSBvbiB0aGUgc2FtZSBsaW5lICovCgouZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNob3J0IC5mYy1jb250ZW50IHsKCS8qIGRvbid0IHdyYXAgdG8gc2Vjb25kIGxpbmUgKG5vdyB0aGF0IGNvbnRlbnRzIHdpbGwgYmUgaW5saW5lKSAqLwoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGltZSwKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGl0bGUgewoJLyogcHV0IHRoZSB0aW1lIGFuZCB0aXRsZSBvbiB0aGUgc2FtZSBsaW5lICovCglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9CgouZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNob3J0IC5mYy10aW1lIHNwYW4gewoJZGlzcGxheTogbm9uZTsgLyogZG9uJ3QgZGlzcGxheSB0aGUgZnVsbCB0aW1lIHRleHQuLi4gKi8KfQoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGltZTpiZWZvcmUgewoJY29udGVudDogYXR0cihkYXRhLXN0YXJ0KTsgLyogLi4uaW5zdGVhZCwgZGlzcGxheSBvbmx5IHRoZSBzdGFydCB0aW1lICovCn0KCi5mYy10aW1lLWdyaWQtZXZlbnQuZmMtc2hvcnQgLmZjLXRpbWU6YWZ0ZXIgewoJY29udGVudDogIlwwMDBBMC1cMDAwQTAiOyAvKiBzZXBlcmF0ZSB3aXRoIGEgZGFzaCwgd3JhcHBlZCBpbiBuYnNwJ3MgKi8KfQoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGl0bGUgewoJZm9udC1zaXplOiAuODVlbTsgLyogbWFrZSB0aGUgdGl0bGUgdGV4dCB0aGUgc2FtZSBzaXplIGFzIHRoZSB0aW1lICovCglwYWRkaW5nOiAwOyAvKiB1bmRvIHBhZGRpbmcgZnJvbSBhYm92ZSAqLwp9CgovKiByZXNpemVyIChjdXJzb3IgZGV2aWNlKSAqLwoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1hbGxvdy1tb3VzZS1yZXNpemUgLmZjLXJlc2l6ZXIgewoJbGVmdDogMDsKCXJpZ2h0OiAwOwoJYm90dG9tOiAwOwoJaGVpZ2h0OiA4cHg7CglvdmVyZmxvdzogaGlkZGVuOwoJbGluZS1oZWlnaHQ6IDhweDsKCWZvbnQtc2l6ZTogMTFweDsKCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7CgljdXJzb3I6IHMtcmVzaXplOwp9CgouZmMtdGltZS1ncmlkLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtcmVzaXplcjphZnRlciB7Cgljb250ZW50OiAiPSI7Cn0KCi8qIHJlc2l6ZXIgKHRvdWNoIGRldmljZSkgKi8KCi5mYy10aW1lLWdyaWQtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXJlc2l6ZXIgewoJLyogMTB4MTAgZG90ICovCglib3JkZXItcmFkaXVzOiA1cHg7Cglib3JkZXItd2lkdGg6IDFweDsKCXdpZHRoOiA4cHg7CgloZWlnaHQ6IDhweDsKCWJvcmRlci1zdHlsZTogc29saWQ7Cglib3JkZXItY29sb3I6IGluaGVyaXQ7CgliYWNrZ3JvdW5kOiAjZmZmOwoJLyogaG9yaXpvbnRhbGx5IGNlbnRlciAqLwoJbGVmdDogNTAlOwoJbWFyZ2luLWxlZnQ6IC01cHg7CgkvKiBjZW50ZXIgb24gdGhlIGJvdHRvbSBlZGdlICovCglib3R0b206IC01cHg7Cn0KCgovKiBOb3cgSW5kaWNhdG9yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy10aW1lLWdyaWQgLmZjLW5vdy1pbmRpY2F0b3ItbGluZSB7Cglib3JkZXItdG9wLXdpZHRoOiAxcHg7CglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cn0KCi8qIGFycm93IG9uIGF4aXMgKi8KCi5mYy10aW1lLWdyaWQgLmZjLW5vdy1pbmRpY2F0b3ItYXJyb3cgewoJbWFyZ2luLXRvcDogLTVweDsgLyogdmVydGljYWxseSBjZW50ZXIgb24gdG9wIGNvb3JkaW5hdGUgKi8KfQoKLmZjLWx0ciAuZmMtdGltZS1ncmlkIC5mYy1ub3ctaW5kaWNhdG9yLWFycm93IHsKCWxlZnQ6IDA7CgkvKiB0cmlhbmdsZSBwb2ludGluZyByaWdodC4uLiAqLwoJYm9yZGVyLXdpZHRoOiA1cHggMCA1cHggNnB4OwoJYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQ7Cglib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDsKfQoKLmZjLXJ0bCAuZmMtdGltZS1ncmlkIC5mYy1ub3ctaW5kaWNhdG9yLWFycm93IHsKCXJpZ2h0OiAwOwoJLyogdHJpYW5nbGUgcG9pbnRpbmcgbGVmdC4uLiAqLwoJYm9yZGVyLXdpZHRoOiA1cHggNnB4IDVweCAwOwoJYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQ7Cglib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDsKfQoKCgovKiBMaXN0IFZpZXcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyogcG9zc2libHkgcmV1c2FibGUgKi8KCi5mYy1ldmVudC1kb3QgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJd2lkdGg6IDEwcHg7CgloZWlnaHQ6IDEwcHg7Cglib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi8qIHZpZXcgd3JhcHBlciAqLwoKLmZjLXJ0bCAuZmMtbGlzdC12aWV3IHsKCWRpcmVjdGlvbjogcnRsOyAvKiB1bmxpa2UgY29yZSB2aWV3cywgbGV2ZXJhZ2UgYnJvd3NlciBSVEwgKi8KfQoKLmZjLWxpc3QtdmlldyB7Cglib3JkZXItd2lkdGg6IDFweDsKCWJvcmRlci1zdHlsZTogc29saWQ7Cn0KCi8qIHRhYmxlIHJlc2V0cyAqLwoKLmZjIC5mYy1saXN0LXRhYmxlIHsKCXRhYmxlLWxheW91dDogYXV0bzsgLyogZm9yIHNocmlua3dyYXBwaW5nIGNlbGwgY29udGVudCAqLwp9CgouZmMtbGlzdC10YWJsZSB0ZCB7Cglib3JkZXItd2lkdGg6IDFweCAwIDA7CglwYWRkaW5nOiA4cHggMTRweDsKfQoKLmZjLWxpc3QtdGFibGUgdHI6Zmlyc3QtY2hpbGQgdGQgewoJYm9yZGVyLXRvcC13aWR0aDogMDsKfQoKLyogZGF5IGhlYWRpbmdzIHdpdGggdGhlIGxpc3QgKi8KCi5mYy1saXN0LWhlYWRpbmcgewoJYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4Owp9CgouZmMtbGlzdC1oZWFkaW5nIHRkIHsKCWZvbnQtd2VpZ2h0OiBib2xkOwp9CgouZmMtbHRyIC5mYy1saXN0LWhlYWRpbmctbWFpbiB7IGZsb2F0OiBsZWZ0OyB9Ci5mYy1sdHIgLmZjLWxpc3QtaGVhZGluZy1hbHQgeyBmbG9hdDogcmlnaHQ7IH0KCi5mYy1ydGwgLmZjLWxpc3QtaGVhZGluZy1tYWluIHsgZmxvYXQ6IHJpZ2h0OyB9Ci5mYy1ydGwgLmZjLWxpc3QtaGVhZGluZy1hbHQgeyBmbG9hdDogbGVmdDsgfQoKLyogZXZlbnQgbGlzdCBpdGVtcyAqLwoKLmZjLWxpc3QtaXRlbS5mYy1oYXMtdXJsIHsKCWN1cnNvcjogcG9pbnRlcjsgLyogd2hvbGUgcm93IHdpbGwgYmUgY2xpY2thYmxlICovCn0KCi5mYy1saXN0LWl0ZW06aG92ZXIgdGQgewoJYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsKfQoKLmZjLWxpc3QtaXRlbS1tYXJrZXIsCi5mYy1saXN0LWl0ZW0tdGltZSB7Cgl3aGl0ZS1zcGFjZTogbm93cmFwOwoJd2lkdGg6IDFweDsKfQoKLyogbWFrZSB0aGUgZG90IGNsb3NlciB0byB0aGUgZXZlbnQgdGl0bGUgKi8KLmZjLWx0ciAuZmMtbGlzdC1pdGVtLW1hcmtlciB7IHBhZGRpbmctcmlnaHQ6IDA7IH0KLmZjLXJ0bCAuZmMtbGlzdC1pdGVtLW1hcmtlciB7IHBhZGRpbmctbGVmdDogMDsgfQoKLmZjLWxpc3QtaXRlbS10aXRsZSBhIHsKCS8qIGV2ZXJ5IGV2ZW50IHRpdGxlIGNlbGwgaGFzIGFuIDxhPiB0YWcgKi8KCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCWNvbG9yOiBpbmhlcml0Owp9CgouZmMtbGlzdC1pdGVtLXRpdGxlIGFbaHJlZl06aG92ZXIgewoJLyogaG92ZXIgZWZmZWN0IG9ubHkgb24gdGl0bGVzIHdpdGggaHJlZnMgKi8KCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgovKiBtZXNzYWdlIHdoZW4gbm8gZXZlbnRzICovCgouZmMtbGlzdC1lbXB0eS13cmFwMiB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cglib3R0b206IDA7Cn0KCi5mYy1saXN0LWVtcHR5LXdyYXAxIHsKCXdpZHRoOiAxMDAlOwoJaGVpZ2h0OiAxMDAlOwoJZGlzcGxheTogdGFibGU7Cn0KCi5mYy1saXN0LWVtcHR5IHsKCWRpc3BsYXk6IHRhYmxlLWNlbGw7Cgl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoJdGV4dC1hbGlnbjogY2VudGVyOwp9CgouZmMtdW50aGVtZWQgLmZjLWxpc3QtZW1wdHkgeyAvKiB0aGVtZSB3aWxsIHByb3ZpZGUgb3duIGJhY2tncm91bmQgKi8KCWJhY2tncm91bmQtY29sb3I6ICNlZWU7Cn0K
LyohCiAqIEZ1bGxDYWxlbmRhciB2My4wLjEgU3R5bGVzaGVldAogKiBEb2NzICYgTGljZW5zZTogaHR0cDovL2Z1bGxjYWxlbmRhci5pby8KICogKGMpIDIwMTYgQWRhbSBTaGF3CiAqLy5mYy1pY29uLGJvZHkgLmZje2ZvbnQtc2l6ZToxZW19LmZjLWJ1dHRvbi1ncm91cCwuZmMtaWNvbntkaXNwbGF5OmlubGluZS1ibG9ja30uZmMtYmcsLmZjLXJvdyAuZmMtYmdldmVudC1za2VsZXRvbiwuZmMtcm93IC5mYy1oaWdobGlnaHQtc2tlbGV0b257Ym90dG9tOjB9LmZjLWljb24sLmZjLXVuc2VsZWN0YWJsZXsta2h0bWwtdXNlci1zZWxlY3Q6bm9uZTstd2Via2l0LXRvdWNoLWNhbGxvdXQ6bm9uZX0uZmN7ZGlyZWN0aW9uOmx0cjt0ZXh0LWFsaWduOmxlZnR9LmZjLXJ0bHt0ZXh0LWFsaWduOnJpZ2h0fS5mYyB0aCwuZmMtYmFzaWMtdmlldyB0ZC5mYy13ZWVrLW51bWJlciwuZmMtaWNvbiwuZmMtdG9vbGJhcnt0ZXh0LWFsaWduOmNlbnRlcn0uZmMtdW50aGVtZWQgLmZjLWNvbnRlbnQsLmZjLXVudGhlbWVkIC5mYy1kaXZpZGVyLC5mYy11bnRoZW1lZCAuZmMtbGlzdC1oZWFkaW5nIHRkLC5mYy11bnRoZW1lZCAuZmMtbGlzdC12aWV3LC5mYy11bnRoZW1lZCAuZmMtcG9wb3ZlciwuZmMtdW50aGVtZWQgLmZjLXJvdywuZmMtdW50aGVtZWQgdGJvZHksLmZjLXVudGhlbWVkIHRkLC5mYy11bnRoZW1lZCB0aCwuZmMtdW50aGVtZWQgdGhlYWR7Ym9yZGVyLWNvbG9yOiNkZGR9LmZjLXVudGhlbWVkIC5mYy1wb3BvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZn0uZmMtdW50aGVtZWQgLmZjLWRpdmlkZXIsLmZjLXVudGhlbWVkIC5mYy1saXN0LWhlYWRpbmcgdGQsLmZjLXVudGhlbWVkIC5mYy1wb3BvdmVyIC5mYy1oZWFkZXJ7YmFja2dyb3VuZDojZWVlfS5mYy11bnRoZW1lZCAuZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy1jbG9zZXtjb2xvcjojNjY2fS5mYy11bnRoZW1lZCAuZmMtdG9kYXl7YmFja2dyb3VuZDojZmNmOGUzfS5mYy1oaWdobGlnaHR7YmFja2dyb3VuZDojYmNlOGYxO29wYWNpdHk6LjN9LmZjLWJnZXZlbnR7YmFja2dyb3VuZDojOGZkZjgyO29wYWNpdHk6LjN9LmZjLW5vbmJ1c2luZXNze2JhY2tncm91bmQ6I2Q3ZDdkN30uZmMtaWNvbntoZWlnaHQ6MWVtO2xpbmUtaGVpZ2h0OjFlbTtvdmVyZmxvdzpoaWRkZW47Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3IixDb3VyaWVyLG1vbm9zcGFjZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LmZjLWljb246YWZ0ZXJ7cG9zaXRpb246cmVsYXRpdmV9LmZjLWljb24tbGVmdC1zaW5nbGUtYXJyb3c6YWZ0ZXJ7Y29udGVudDoiXDAyMDM5Ijtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjIwMCU7dG9wOi03JX0uZmMtaWNvbi1yaWdodC1zaW5nbGUtYXJyb3c6YWZ0ZXJ7Y29udGVudDoiXDAyMDNBIjtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjIwMCU7dG9wOi03JX0uZmMtaWNvbi1sZWZ0LWRvdWJsZS1hcnJvdzphZnRlcntjb250ZW50OiJcMDAwQUIiO2ZvbnQtc2l6ZToxNjAlO3RvcDotNyV9LmZjLWljb24tcmlnaHQtZG91YmxlLWFycm93OmFmdGVye2NvbnRlbnQ6IlwwMDBCQiI7Zm9udC1zaXplOjE2MCU7dG9wOi03JX0uZmMtaWNvbi1sZWZ0LXRyaWFuZ2xlOmFmdGVye2NvbnRlbnQ6IlwyNUM0Ijtmb250LXNpemU6MTI1JTt0b3A6MyV9LmZjLWljb24tcmlnaHQtdHJpYW5nbGU6YWZ0ZXJ7Y29udGVudDoiXDI1QkEiO2ZvbnQtc2l6ZToxMjUlO3RvcDozJX0uZmMtaWNvbi1kb3duLXRyaWFuZ2xlOmFmdGVye2NvbnRlbnQ6IlwyNUJDIjtmb250LXNpemU6MTI1JTt0b3A6MiV9LmZjLWljb24teDphZnRlcntjb250ZW50OiJcMDAwRDciO2ZvbnQtc2l6ZToyMDAlO3RvcDo2JX0uZmMgYnV0dG9uey1tb3otYm94LXNpemluZzpib3JkZXItYm94Oy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDttYXJnaW46MDtoZWlnaHQ6Mi4xZW07cGFkZGluZzowIC42ZW07Zm9udC1zaXplOjFlbTt3aGl0ZS1zcGFjZTpub3dyYXA7Y3Vyc29yOnBvaW50ZXJ9LmZjIGJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcnttYXJnaW46MDtwYWRkaW5nOjB9LmZjLXN0YXRlLWRlZmF1bHR7Ym9yZGVyOjFweCBzb2xpZDtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCh0b3AsI2ZmZiwjZTZlNmU2KTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMCwwIDEwMCUsZnJvbSgjZmZmKSx0bygjZTZlNmU2KSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsI2ZmZiwjZTZlNmU2KTtiYWNrZ3JvdW5kLWltYWdlOi1vLWxpbmVhci1ncmFkaWVudCh0b3AsI2ZmZiwjZTZlNmU2KTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sI2ZmZiwjZTZlNmU2KTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDtib3JkZXItY29sb3I6I2U2ZTZlNiAjZTZlNmU2ICNiZmJmYmY7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEpIHJnYmEoMCwwLDAsLjEpIHJnYmEoMCwwLDAsLjI1KTtjb2xvcjojMzMzO3RleHQtc2hhZG93OjAgMXB4IDFweCByZ2JhKDI1NSwyNTUsMjU1LC43NSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjIpLDAgMXB4IDJweCByZ2JhKDAsMCwwLC4wNSl9LmZjLXN0YXRlLWRlZmF1bHQuZmMtY29ybmVyLWxlZnR7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHh9LmZjLXN0YXRlLWRlZmF1bHQuZmMtY29ybmVyLXJpZ2h0e2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHh9LmZjIGJ1dHRvbiAuZmMtaWNvbntwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6LS4wNWVtO21hcmdpbjowIC4yZW07dmVydGljYWwtYWxpZ246bWlkZGxlfS5mYy1zdGF0ZS1hY3RpdmUsLmZjLXN0YXRlLWRpc2FibGVkLC5mYy1zdGF0ZS1kb3duLC5mYy1zdGF0ZS1ob3Zlcntjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2U2ZTZlNn0uZmMtc3RhdGUtaG92ZXJ7Y29sb3I6IzMzMzt0ZXh0LWRlY29yYXRpb246bm9uZTtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE1cHg7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQtcG9zaXRpb24gLjFzIGxpbmVhcjstbW96LXRyYW5zaXRpb246YmFja2dyb3VuZC1wb3NpdGlvbiAuMXMgbGluZWFyOy1vLXRyYW5zaXRpb246YmFja2dyb3VuZC1wb3NpdGlvbiAuMXMgbGluZWFyO3RyYW5zaXRpb246YmFja2dyb3VuZC1wb3NpdGlvbiAuMXMgbGluZWFyfS5mYy1zdGF0ZS1hY3RpdmUsLmZjLXN0YXRlLWRvd257YmFja2dyb3VuZC1jb2xvcjojY2NjO2JhY2tncm91bmQtaW1hZ2U6bm9uZTtib3gtc2hhZG93Omluc2V0IDAgMnB4IDRweCByZ2JhKDAsMCwwLC4xNSksMCAxcHggMnB4IHJnYmEoMCwwLDAsLjA1KX0uZmMtc3RhdGUtZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHQ7YmFja2dyb3VuZC1pbWFnZTpub25lO29wYWNpdHk6LjY1O2JveC1zaGFkb3c6bm9uZX0uZmMtZXZlbnQuZmMtZHJhZ2dhYmxlLC5mYy1ldmVudFtocmVmXSwuZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy1jbG9zZSxhW2RhdGEtZ290b117Y3Vyc29yOnBvaW50ZXJ9LmZjIC5mYy1idXR0b24tZ3JvdXA+KntmbG9hdDpsZWZ0O21hcmdpbjowIDAgMCAtMXB4fS5mYyAuZmMtYnV0dG9uLWdyb3VwPjpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDowfS5mYy1wb3BvdmVye3Bvc2l0aW9uOmFic29sdXRlO2JveC1zaGFkb3c6MCAycHggNnB4IHJnYmEoMCwwLDAsLjE1KX0uZmMtcG9wb3ZlciAuZmMtaGVhZGVye3BhZGRpbmc6MnB4IDRweH0uZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy10aXRsZXttYXJnaW46MCAycHh9LmZjLWx0ciAuZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy10aXRsZSwuZmMtcnRsIC5mYy1wb3BvdmVyIC5mYy1oZWFkZXIgLmZjLWNsb3Nle2Zsb2F0OmxlZnR9LmZjLWx0ciAuZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy1jbG9zZSwuZmMtcnRsIC5mYy1wb3BvdmVyIC5mYy1oZWFkZXIgLmZjLXRpdGxle2Zsb2F0OnJpZ2h0fS5mYy11bnRoZW1lZCAuZmMtcG9wb3Zlcntib3JkZXItd2lkdGg6MXB4O2JvcmRlci1zdHlsZTpzb2xpZH0uZmMtdW50aGVtZWQgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciAuZmMtY2xvc2V7Zm9udC1zaXplOi45ZW07bWFyZ2luLXRvcDoycHh9LmZjLXBvcG92ZXI+LnVpLXdpZGdldC1oZWFkZXIrLnVpLXdpZGdldC1jb250ZW50e2JvcmRlci10b3A6MH0uZmMtZGl2aWRlcntib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjFweH1oci5mYy1kaXZpZGVye2hlaWdodDowO21hcmdpbjowO3BhZGRpbmc6MCAwIDJweDtib3JkZXItd2lkdGg6MXB4IDB9LmZjLWJnIHRhYmxlLC5mYy1yb3cgLmZjLWJnZXZlbnQtc2tlbGV0b24gdGFibGUsLmZjLXJvdyAuZmMtaGlnaGxpZ2h0LXNrZWxldG9uIHRhYmxle2hlaWdodDoxMDAlfS5mYy1jbGVhcntjbGVhcjpib3RofS5mYy1iZywuZmMtYmdldmVudC1za2VsZXRvbiwuZmMtaGVscGVyLXNrZWxldG9uLC5mYy1oaWdobGlnaHQtc2tlbGV0b257cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3JpZ2h0OjB9LmZjIHRhYmxle3dpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3RhYmxlLWxheW91dDpmaXhlZDtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MDtmb250LXNpemU6MWVtfS5mYyB0ZCwuZmMgdGh7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDoxcHg7cGFkZGluZzowO3ZlcnRpY2FsLWFsaWduOnRvcH0uZmMgdGQuZmMtdG9kYXl7Ym9yZGVyLXN0eWxlOmRvdWJsZX1hW2RhdGEtZ290b106aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uZmMgLmZjLXJvd3tib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjB9LmZjLXJvdyB0YWJsZXtib3JkZXItbGVmdDowIGhpZGRlbiB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6MCBoaWRkZW4gdHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbTowIGhpZGRlbiB0cmFuc3BhcmVudH0uZmMtcm93OmZpcnN0LWNoaWxkIHRhYmxle2JvcmRlci10b3A6MCBoaWRkZW4gdHJhbnNwYXJlbnR9LmZjLXJvd3twb3NpdGlvbjpyZWxhdGl2ZX0uZmMtcm93IC5mYy1iZ3t6LWluZGV4OjF9LmZjLXJvdyAuZmMtYmdldmVudC1za2VsZXRvbiB0ZCwuZmMtcm93IC5mYy1oaWdobGlnaHQtc2tlbGV0b24gdGR7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5mYy1yb3cgLmZjLWJnZXZlbnQtc2tlbGV0b257ei1pbmRleDoyfS5mYy1yb3cgLmZjLWhpZ2hsaWdodC1za2VsZXRvbnt6LWluZGV4OjN9LmZjLXJvdyAuZmMtY29udGVudC1za2VsZXRvbntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjQ7cGFkZGluZy1ib3R0b206MnB4fS5mYy1yb3cgLmZjLWhlbHBlci1za2VsZXRvbnt6LWluZGV4OjV9LmZjLXJvdyAuZmMtY29udGVudC1za2VsZXRvbiB0ZCwuZmMtcm93IC5mYy1oZWxwZXItc2tlbGV0b24gdGR7YmFja2dyb3VuZDowIDA7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206MH0uZmMtcm93IC5mYy1jb250ZW50LXNrZWxldG9uIHRib2R5IHRkLC5mYy1yb3cgLmZjLWhlbHBlci1za2VsZXRvbiB0Ym9keSB0ZHtib3JkZXItdG9wOjB9LmZjLXNjcm9sbGVyey13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofS5mYy1yb3cuZmMtcmlnaWQsLmZjLXRpbWUtZ3JpZC1ldmVudHtvdmVyZmxvdzpoaWRkZW59LmZjLXNjcm9sbGVyPi5mYy1kYXktZ3JpZCwuZmMtc2Nyb2xsZXI+LmZjLXRpbWUtZ3JpZHtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlfS5mYy1ldmVudHtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTouODVlbTtsaW5lLWhlaWdodDoxLjM7Ym9yZGVyLXJhZGl1czozcHg7Ym9yZGVyOjFweCBzb2xpZCAjM2E4N2FkO2ZvbnQtd2VpZ2h0OjQwMH0uZmMtZXZlbnQsLmZjLWV2ZW50LWRvdHtiYWNrZ3JvdW5kLWNvbG9yOiMzYTg3YWR9LmZjLWV2ZW50LC5mYy1ldmVudDpob3ZlciwudWktd2lkZ2V0IC5mYy1ldmVudHtjb2xvcjojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lfS5mYy1ub3QtYWxsb3dlZCwuZmMtbm90LWFsbG93ZWQgLmZjLWV2ZW50e2N1cnNvcjpub3QtYWxsb3dlZH0uZmMtZXZlbnQgLmZjLWJne3otaW5kZXg6MTtiYWNrZ3JvdW5kOiNmZmY7b3BhY2l0eTouMjV9LmZjLWV2ZW50IC5mYy1jb250ZW50e3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6Mn0uZmMtZXZlbnQgLmZjLXJlc2l6ZXJ7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDo0O2Rpc3BsYXk6bm9uZX0uZmMtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1yZXNpemVyLC5mYy1ldmVudC5mYy1zZWxlY3RlZCAuZmMtcmVzaXplcntkaXNwbGF5OmJsb2NrfS5mYy1ldmVudC5mYy1zZWxlY3RlZCAuZmMtcmVzaXplcjpiZWZvcmV7Y29udGVudDoiIjtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4Ojk5OTk7dG9wOjUwJTtsZWZ0OjUwJTt3aWR0aDo0MHB4O2hlaWdodDo0MHB4O21hcmdpbi1sZWZ0Oi0yMHB4O21hcmdpbi10b3A6LTIwcHh9LmZjLWV2ZW50LmZjLXNlbGVjdGVke3otaW5kZXg6OTk5OSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDJweCA1cHggcmdiYSgwLDAsMCwuMil9LmZjLWV2ZW50LmZjLXNlbGVjdGVkLmZjLWRyYWdnaW5ne2JveC1zaGFkb3c6MCAycHggN3B4IHJnYmEoMCwwLDAsLjMpfS5mYy1oLWV2ZW50LmZjLXNlbGVjdGVkOmJlZm9yZXtjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mzt0b3A6LTEwcHg7Ym90dG9tOi0xMHB4O2xlZnQ6MDtyaWdodDowfS5mYy1sdHIgLmZjLWgtZXZlbnQuZmMtbm90LXN0YXJ0LC5mYy1ydGwgLmZjLWgtZXZlbnQuZmMtbm90LWVuZHttYXJnaW4tbGVmdDowO2JvcmRlci1sZWZ0LXdpZHRoOjA7cGFkZGluZy1sZWZ0OjFweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5mYy1sdHIgLmZjLWgtZXZlbnQuZmMtbm90LWVuZCwuZmMtcnRsIC5mYy1oLWV2ZW50LmZjLW5vdC1zdGFydHttYXJnaW4tcmlnaHQ6MDtib3JkZXItcmlnaHQtd2lkdGg6MDtwYWRkaW5nLXJpZ2h0OjFweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LmZjLWx0ciAuZmMtaC1ldmVudCAuZmMtc3RhcnQtcmVzaXplciwuZmMtcnRsIC5mYy1oLWV2ZW50IC5mYy1lbmQtcmVzaXplcntjdXJzb3I6dy1yZXNpemU7bGVmdDotMXB4fS5mYy1sdHIgLmZjLWgtZXZlbnQgLmZjLWVuZC1yZXNpemVyLC5mYy1ydGwgLmZjLWgtZXZlbnQgLmZjLXN0YXJ0LXJlc2l6ZXJ7Y3Vyc29yOmUtcmVzaXplO3JpZ2h0Oi0xcHh9LmZjLWgtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1yZXNpemVye3dpZHRoOjdweDt0b3A6LTFweDtib3R0b206LTFweH0uZmMtaC1ldmVudC5mYy1zZWxlY3RlZCAuZmMtcmVzaXplcntib3JkZXItcmFkaXVzOjRweDtib3JkZXItd2lkdGg6MXB4O3dpZHRoOjZweDtoZWlnaHQ6NnB4O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOiNmZmY7dG9wOjUwJTttYXJnaW4tdG9wOi00cHh9LmZjLWx0ciAuZmMtaC1ldmVudC5mYy1zZWxlY3RlZCAuZmMtc3RhcnQtcmVzaXplciwuZmMtcnRsIC5mYy1oLWV2ZW50LmZjLXNlbGVjdGVkIC5mYy1lbmQtcmVzaXplcnttYXJnaW4tbGVmdDotNHB4fS5mYy1sdHIgLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLWVuZC1yZXNpemVyLC5mYy1ydGwgLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXN0YXJ0LXJlc2l6ZXJ7bWFyZ2luLXJpZ2h0Oi00cHh9LmZjLWRheS1ncmlkLWV2ZW50e21hcmdpbjoxcHggMnB4IDA7cGFkZGluZzowIDFweH10cjpmaXJzdC1jaGlsZD50ZD4uZmMtZGF5LWdyaWQtZXZlbnR7bWFyZ2luLXRvcDoycHh9LmZjLWRheS1ncmlkLWV2ZW50LmZjLXNlbGVjdGVkOmFmdGVye2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO3RvcDotMXB4O3JpZ2h0Oi0xcHg7Ym90dG9tOi0xcHg7bGVmdDotMXB4O2JhY2tncm91bmQ6IzAwMDtvcGFjaXR5Oi4yNX0uZmMtZGF5LWdyaWQtZXZlbnQgLmZjLWNvbnRlbnR7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbn0uZmMtZGF5LWdyaWQtZXZlbnQgLmZjLXRpbWV7Zm9udC13ZWlnaHQ6NzAwfS5mYy1sdHIgLmZjLWRheS1ncmlkLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtc3RhcnQtcmVzaXplciwuZmMtcnRsIC5mYy1kYXktZ3JpZC1ldmVudC5mYy1hbGxvdy1tb3VzZS1yZXNpemUgLmZjLWVuZC1yZXNpemVye21hcmdpbi1sZWZ0Oi0ycHh9LmZjLWx0ciAuZmMtZGF5LWdyaWQtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1lbmQtcmVzaXplciwuZmMtcnRsIC5mYy1kYXktZ3JpZC1ldmVudC5mYy1hbGxvdy1tb3VzZS1yZXNpemUgLmZjLXN0YXJ0LXJlc2l6ZXJ7bWFyZ2luLXJpZ2h0Oi0ycHh9YS5mYy1tb3Jle21hcmdpbjoxcHggM3B4O2ZvbnQtc2l6ZTouODVlbTtjdXJzb3I6cG9pbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZX1hLmZjLW1vcmU6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uZmMtbGltaXRlZHtkaXNwbGF5Om5vbmV9LmZjLWRheS1ncmlkIC5mYy1yb3d7ei1pbmRleDoxfS5mYy1tb3JlLXBvcG92ZXJ7ei1pbmRleDoyO3dpZHRoOjIyMHB4fS5mYy1tb3JlLXBvcG92ZXIgLmZjLWV2ZW50LWNvbnRhaW5lcntwYWRkaW5nOjEwcHh9LmZjLW5vdy1pbmRpY2F0b3J7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjAgc29saWQgcmVkfS5mYy11bnNlbGVjdGFibGV7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0uZmMtdG9vbGJhcnttYXJnaW4tYm90dG9tOjFlbX0uZmMtdG9vbGJhciAuZmMtbGVmdHtmbG9hdDpsZWZ0fS5mYy10b29sYmFyIC5mYy1yaWdodHtmbG9hdDpyaWdodH0uZmMtdG9vbGJhciAuZmMtY2VudGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5mYyAuZmMtdG9vbGJhcj4qPip7ZmxvYXQ6bGVmdDttYXJnaW4tbGVmdDouNzVlbX0uZmMgLmZjLXRvb2xiYXI+Kj46Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MH0uZmMtdG9vbGJhciBoMnttYXJnaW46MH0uZmMtdG9vbGJhciBidXR0b257cG9zaXRpb246cmVsYXRpdmV9LmZjLXRvb2xiYXIgLmZjLXN0YXRlLWhvdmVyLC5mYy10b29sYmFyIC51aS1zdGF0ZS1ob3Zlcnt6LWluZGV4OjJ9LmZjLXRvb2xiYXIgLmZjLXN0YXRlLWRvd257ei1pbmRleDozfS5mYy10b29sYmFyIC5mYy1zdGF0ZS1hY3RpdmUsLmZjLXRvb2xiYXIgLnVpLXN0YXRlLWFjdGl2ZXt6LWluZGV4OjR9LmZjLXRvb2xiYXIgYnV0dG9uOmZvY3Vze3otaW5kZXg6NX0uZmMtdmlldy1jb250YWluZXIgKiwuZmMtdmlldy1jb250YWluZXIgOmFmdGVyLC5mYy12aWV3LWNvbnRhaW5lciA6YmVmb3Jley13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveH0uZmMtdmlldywuZmMtdmlldz50YWJsZXtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9LmZjLWJhc2ljRGF5LXZpZXcgLmZjLWNvbnRlbnQtc2tlbGV0b24sLmZjLWJhc2ljV2Vlay12aWV3IC5mYy1jb250ZW50LXNrZWxldG9ue3BhZGRpbmctYm90dG9tOjFlbX0uZmMtYmFzaWMtdmlldyAuZmMtYm9keSAuZmMtcm93e21pbi1oZWlnaHQ6NGVtfS5mYy1yb3cuZmMtcmlnaWQgLmZjLWNvbnRlbnQtc2tlbGV0b257cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3JpZ2h0OjB9LmZjLWRheS10b3AuZmMtb3RoZXItbW9udGh7b3BhY2l0eTouM30uZmMtYmFzaWMtdmlldyAuZmMtZGF5LW51bWJlciwuZmMtYmFzaWMtdmlldyAuZmMtd2Vlay1udW1iZXJ7cGFkZGluZzoycHh9LmZjLWJhc2ljLXZpZXcgdGguZmMtZGF5LW51bWJlciwuZmMtYmFzaWMtdmlldyB0aC5mYy13ZWVrLW51bWJlcntwYWRkaW5nOjAgMnB4fS5mYy1sdHIgLmZjLWJhc2ljLXZpZXcgLmZjLWRheS10b3AgLmZjLWRheS1udW1iZXJ7ZmxvYXQ6cmlnaHR9LmZjLXJ0bCAuZmMtYmFzaWMtdmlldyAuZmMtZGF5LXRvcCAuZmMtZGF5LW51bWJlcntmbG9hdDpsZWZ0fS5mYy1sdHIgLmZjLWJhc2ljLXZpZXcgLmZjLWRheS10b3AgLmZjLXdlZWstbnVtYmVye2Zsb2F0OmxlZnQ7Ym9yZGVyLXJhZGl1czowIDAgM3B4fS5mYy1ydGwgLmZjLWJhc2ljLXZpZXcgLmZjLWRheS10b3AgLmZjLXdlZWstbnVtYmVye2Zsb2F0OnJpZ2h0O2JvcmRlci1yYWRpdXM6MCAwIDAgM3B4fS5mYy1iYXNpYy12aWV3IC5mYy1kYXktdG9wIC5mYy13ZWVrLW51bWJlcnttaW4td2lkdGg6MS41ZW07dGV4dC1hbGlnbjpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojZjJmMmYyO2NvbG9yOmdyZXl9LmZjLWJhc2ljLXZpZXcgdGQuZmMtd2Vlay1udW1iZXI+KntkaXNwbGF5OmlubGluZS1ibG9jazttaW4td2lkdGg6MS4yNWVtfS5mYy1hZ2VuZGEtdmlldyAuZmMtZGF5LWdyaWR7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyfS5mYy1hZ2VuZGEtdmlldyAuZmMtZGF5LWdyaWQgLmZjLXJvd3ttaW4taGVpZ2h0OjNlbX0uZmMtYWdlbmRhLXZpZXcgLmZjLWRheS1ncmlkIC5mYy1yb3cgLmZjLWNvbnRlbnQtc2tlbGV0b257cGFkZGluZy1ib3R0b206MWVtfS5mYyAuZmMtYXhpc3t2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7cGFkZGluZzowIDRweDt3aGl0ZS1zcGFjZTpub3dyYXB9LmZjLWx0ciAuZmMtYXhpc3t0ZXh0LWFsaWduOnJpZ2h0fS5mYy1ydGwgLmZjLWF4aXN7dGV4dC1hbGlnbjpsZWZ0fS51aS13aWRnZXQgdGQuZmMtYXhpc3tmb250LXdlaWdodDo0MDB9LmZjLXRpbWUtZ3JpZCwuZmMtdGltZS1ncmlkLWNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9LmZjLXRpbWUtZ3JpZHttaW4taGVpZ2h0OjEwMCV9LmZjLXRpbWUtZ3JpZCB0YWJsZXtib3JkZXI6MCBoaWRkZW4gdHJhbnNwYXJlbnR9LmZjLXRpbWUtZ3JpZD4uZmMtYmd7ei1pbmRleDoxfS5mYy10aW1lLWdyaWQgLmZjLXNsYXRzLC5mYy10aW1lLWdyaWQ+aHJ7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyfS5mYy10aW1lLWdyaWQgLmZjLWNvbnRlbnQtY29se3Bvc2l0aW9uOnJlbGF0aXZlfS5mYy10aW1lLWdyaWQgLmZjLWNvbnRlbnQtc2tlbGV0b257cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDozO3RvcDowO2xlZnQ6MDtyaWdodDowfS5mYy10aW1lLWdyaWQgLmZjLWJ1c2luZXNzLWNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9LmZjLXRpbWUtZ3JpZCAuZmMtYmdldmVudC1jb250YWluZXJ7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyfS5mYy10aW1lLWdyaWQgLmZjLWhpZ2hsaWdodC1jb250YWluZXJ7ei1pbmRleDozO3Bvc2l0aW9uOnJlbGF0aXZlfS5mYy10aW1lLWdyaWQgLmZjLWV2ZW50LWNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjR9LmZjLXRpbWUtZ3JpZCAuZmMtbm93LWluZGljYXRvci1saW5le3otaW5kZXg6NX0uZmMtdGltZS1ncmlkIC5mYy1oZWxwZXItY29udGFpbmVye3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6Nn0uZmMtdGltZS1ncmlkIC5mYy1zbGF0cyB0ZHtoZWlnaHQ6MS41ZW07Ym9yZGVyLWJvdHRvbTowfS5mYy10aW1lLWdyaWQgLmZjLXNsYXRzIC5mYy1taW5vciB0ZHtib3JkZXItdG9wLXN0eWxlOmRvdHRlZH0uZmMtdGltZS1ncmlkIC5mYy1zbGF0cyAudWktd2lkZ2V0LWNvbnRlbnR7YmFja2dyb3VuZDowIDB9LmZjLXRpbWUtZ3JpZCAuZmMtaGlnaGxpZ2h0e3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDtyaWdodDowfS5mYy1sdHIgLmZjLXRpbWUtZ3JpZCAuZmMtZXZlbnQtY29udGFpbmVye21hcmdpbjowIDIuNSUgMCAycHh9LmZjLXJ0bCAuZmMtdGltZS1ncmlkIC5mYy1ldmVudC1jb250YWluZXJ7bWFyZ2luOjAgMnB4IDAgMi41JX0uZmMtdGltZS1ncmlkIC5mYy1iZ2V2ZW50LC5mYy10aW1lLWdyaWQgLmZjLWV2ZW50e3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MX0uZmMtdGltZS1ncmlkIC5mYy1iZ2V2ZW50e2xlZnQ6MDtyaWdodDowfS5mYy12LWV2ZW50LmZjLW5vdC1zdGFydHtib3JkZXItdG9wLXdpZHRoOjA7cGFkZGluZy10b3A6MXB4O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS5mYy12LWV2ZW50LmZjLW5vdC1lbmR7Ym9yZGVyLWJvdHRvbS13aWR0aDowO3BhZGRpbmctYm90dG9tOjFweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MH0uZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNlbGVjdGVke292ZXJmbG93OnZpc2libGV9LmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zZWxlY3RlZCAuZmMtYmd7ZGlzcGxheTpub25lfS5mYy10aW1lLWdyaWQtZXZlbnQgLmZjLWNvbnRlbnR7b3ZlcmZsb3c6aGlkZGVufS5mYy10aW1lLWdyaWQtZXZlbnQgLmZjLXRpbWUsLmZjLXRpbWUtZ3JpZC1ldmVudCAuZmMtdGl0bGV7cGFkZGluZzowIDFweH0uZmMtdGltZS1ncmlkLWV2ZW50IC5mYy10aW1le2ZvbnQtc2l6ZTouODVlbTt3aGl0ZS1zcGFjZTpub3dyYXB9LmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtY29udGVudHt3aGl0ZS1zcGFjZTpub3dyYXB9LmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGltZSwuZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNob3J0IC5mYy10aXRsZXtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjp0b3B9LmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGltZSBzcGFue2Rpc3BsYXk6bm9uZX0uZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNob3J0IC5mYy10aW1lOmJlZm9yZXtjb250ZW50OmF0dHIoZGF0YS1zdGFydCl9LmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGltZTphZnRlcntjb250ZW50OiJcMDAwQTAtXDAwMEEwIn0uZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNob3J0IC5mYy10aXRsZXtmb250LXNpemU6Ljg1ZW07cGFkZGluZzowfS5mYy10aW1lLWdyaWQtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1yZXNpemVye2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO2hlaWdodDo4cHg7b3ZlcmZsb3c6aGlkZGVuO2xpbmUtaGVpZ2h0OjhweDtmb250LXNpemU6MTFweDtmb250LWZhbWlseTptb25vc3BhY2U7dGV4dC1hbGlnbjpjZW50ZXI7Y3Vyc29yOnMtcmVzaXplfS5mYy10aW1lLWdyaWQtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1yZXNpemVyOmFmdGVye2NvbnRlbnQ6Ij0ifS5mYy10aW1lLWdyaWQtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXJlc2l6ZXJ7Ym9yZGVyLXJhZGl1czo1cHg7Ym9yZGVyLXdpZHRoOjFweDt3aWR0aDo4cHg7aGVpZ2h0OjhweDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLWNvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDojZmZmO2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi01cHg7Ym90dG9tOi01cHh9LmZjLXRpbWUtZ3JpZCAuZmMtbm93LWluZGljYXRvci1saW5le2JvcmRlci10b3Atd2lkdGg6MXB4O2xlZnQ6MDtyaWdodDowfS5mYy10aW1lLWdyaWQgLmZjLW5vdy1pbmRpY2F0b3ItYXJyb3d7bWFyZ2luLXRvcDotNXB4fS5mYy1sdHIgLmZjLXRpbWUtZ3JpZCAuZmMtbm93LWluZGljYXRvci1hcnJvd3tsZWZ0OjA7Ym9yZGVyLXdpZHRoOjVweCAwIDVweCA2cHg7Ym9yZGVyLXRvcC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItYm90dG9tLWNvbG9yOnRyYW5zcGFyZW50fS5mYy1ydGwgLmZjLXRpbWUtZ3JpZCAuZmMtbm93LWluZGljYXRvci1hcnJvd3tyaWdodDowO2JvcmRlci13aWR0aDo1cHggNnB4IDVweCAwO2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbS1jb2xvcjp0cmFuc3BhcmVudH0uZmMtZXZlbnQtZG90e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7Ym9yZGVyLXJhZGl1czo1cHh9LmZjLXJ0bCAuZmMtbGlzdC12aWV3e2RpcmVjdGlvbjpydGx9LmZjLWxpc3Qtdmlld3tib3JkZXItd2lkdGg6MXB4O2JvcmRlci1zdHlsZTpzb2xpZH0uZmMgLmZjLWxpc3QtdGFibGV7dGFibGUtbGF5b3V0OmF1dG99LmZjLWxpc3QtdGFibGUgdGR7Ym9yZGVyLXdpZHRoOjFweCAwIDA7cGFkZGluZzo4cHggMTRweH0uZmMtbGlzdC10YWJsZSB0cjpmaXJzdC1jaGlsZCB0ZHtib3JkZXItdG9wLXdpZHRoOjB9LmZjLWxpc3QtaGVhZGluZ3tib3JkZXItYm90dG9tLXdpZHRoOjFweH0uZmMtbGlzdC1oZWFkaW5nIHRke2ZvbnQtd2VpZ2h0OjcwMH0uZmMtbHRyIC5mYy1saXN0LWhlYWRpbmctbWFpbntmbG9hdDpsZWZ0fS5mYy1sdHIgLmZjLWxpc3QtaGVhZGluZy1hbHQsLmZjLXJ0bCAuZmMtbGlzdC1oZWFkaW5nLW1haW57ZmxvYXQ6cmlnaHR9LmZjLXJ0bCAuZmMtbGlzdC1oZWFkaW5nLWFsdHtmbG9hdDpsZWZ0fS5mYy1saXN0LWl0ZW0uZmMtaGFzLXVybHtjdXJzb3I6cG9pbnRlcn0uZmMtbGlzdC1pdGVtOmhvdmVyIHRke2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNX0uZmMtbGlzdC1pdGVtLW1hcmtlciwuZmMtbGlzdC1pdGVtLXRpbWV7d2hpdGUtc3BhY2U6bm93cmFwO3dpZHRoOjFweH0uZmMtbHRyIC5mYy1saXN0LWl0ZW0tbWFya2Vye3BhZGRpbmctcmlnaHQ6MH0uZmMtcnRsIC5mYy1saXN0LWl0ZW0tbWFya2Vye3BhZGRpbmctbGVmdDowfS5mYy1saXN0LWl0ZW0tdGl0bGUgYXt0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjppbmhlcml0fS5mYy1saXN0LWl0ZW0tdGl0bGUgYVtocmVmXTpob3Zlcnt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfS5mYy1saXN0LWVtcHR5LXdyYXAye3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowfS5mYy1saXN0LWVtcHR5LXdyYXAxe3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7ZGlzcGxheTp0YWJsZX0uZmMtbGlzdC1lbXB0eXtkaXNwbGF5OnRhYmxlLWNlbGw7dmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyfS5mYy11bnRoZW1lZCAuZmMtbGlzdC1lbXB0eXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9
LyohCiAqIEZ1bGxDYWxlbmRhciBTY2hlZHVsZXIgdjEuNC4wCiAqIERvY3MgJiBMaWNlbnNlOiBodHRwOi8vZnVsbGNhbGVuZGFyLmlvL3NjaGVkdWxlci8KICogKGMpIDIwMTYgQWRhbSBTaGF3CiAqLwoKLyogVE9ETzogYnJlYWsgdGhpcyBmaWxlIHVwICovCgovKiBTY3JvbGxlcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtc2Nyb2xsZXItY2xpcCB7CglvdmVyZmxvdzogaGlkZGVuOyAvKiBmb3IgY2xpcHBpbmcgc2Nyb2xsYmFycyAqLwoJcG9zaXRpb246IHJlbGF0aXZlOyAvKiBzbyB0aGluZ3MgbGlrZSBzY3JvbGxmb2xsb3dlcnMgY2FuIGF0dGFjaCB0byB0aGlzICovCn0KCi8qIHN1cHJlc3NlcyByZW5kZXJpbmcgb2YgbmF0aXZlIHNjcm9sbGJhcnMgKi8KLyogb24gLmZjLXNjcm9sbGVyICovCi5mYy1uby1zY3JvbGxiYXJzIHsKCWJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMCk7IC8qIGhhY2sgZm9yIGR5bmFtaWMgRE9NIG5vZGVzIChpbiBDaHJvbWUgT1NYIGF0IGxlYXN0KSAqLwp9Ci5mYy1uby1zY3JvbGxiYXJzOjotd2Via2l0LXNjcm9sbGJhciB7Cgl3aWR0aDogMDsKCWhlaWdodDogMDsKfQoKLmZjLXNjcm9sbGVyLWNhbnZhcyB7Cglwb3NpdGlvbjogcmVsYXRpdmU7IC8qIG9yaWdpbiBmb3IgYmcgKi8KCWJveC1zaXppbmc6IGJvcmRlci1ib3g7IC8qIHNvIHRoYXQgcGFkZGluZyAoZm9yIGd1dHRlcikgd2lsbCBiZSBwYXJ0IG9mIGhlaWdodCAqLwoJbWluLWhlaWdodDogMTAwJTsKfQoKLmZjLXNjcm9sbGVyLWNhbnZhcyA+IC5mYy1iZyB7Cgl6LWluZGV4OiAxOyAvKiBtYWtlIGRlZmF1bHQ/ICovCn0KCi5mYy1zY3JvbGxlci1jYW52YXMgPiAuZmMtY29udGVudCB7Cgl6LWluZGV4OiAyOyAvKiBtYWtlIGRlZmF1bHQ/ICovCglwb3NpdGlvbjogcmVsYXRpdmU7IC8qIG9yaWdpbiBmb3IgaW5uZXIgY29udGVudCAqLwoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKCWJvcmRlci13aWR0aDogMDsKfQoKLyogZm9yIHRoZW1lZCwgaGFyZCB0byBnZXQgdGhlIGJvcmRlci1jb2xvciwgc28ganVzdCBmb3JnZXQgaXQgKFJFVklTSVQpICovCi51aS13aWRnZXQgLmZjLXNjcm9sbGVyLWNhbnZhcyA+IC5mYy1jb250ZW50IHsKCWJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KCi5mYy1zY3JvbGxlci1jYW52YXMuZmMtZ3V0dGVyLWxlZnQgPiAuZmMtY29udGVudCB7IGJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7IG1hcmdpbi1sZWZ0OiAtMXB4IH0KLmZjLXNjcm9sbGVyLWNhbnZhcy5mYy1ndXR0ZXItcmlnaHQgPiAuZmMtY29udGVudCB7IGJvcmRlci1yaWdodC13aWR0aDogMXB4OyBtYXJnaW4tcmlnaHQ6IC0xcHggfQouZmMtc2Nyb2xsZXItY2FudmFzLmZjLWd1dHRlci10b3AgPiAuZmMtY29udGVudCB7IGJvcmRlci10b3Atd2lkdGg6IDFweDsgbWFyZ2luLXRvcDogLTFweCB9Ci5mYy1zY3JvbGxlci1jYW52YXMuZmMtZ3V0dGVyLWJvdHRvbSA+IC5mYy1jb250ZW50IHsgYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4OyBtYXJnaW4tYm90dG9tOiAtMXB4IH0KCgovKiBWaWV3IFN0cnVjdHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtcnRsIC5mYy10aW1lbGluZSB7CglkaXJlY3Rpb246IHJ0bDsKfQoKLmZjLXRpbWVsaW5lIC5mYy1kaXZpZGVyIHsKCXdpZHRoOiAzcHg7Cglib3JkZXItc3R5bGU6IGRvdWJsZTsgLyogb3ZlcmNvbWUgbmVpZ2hib3JpbmcgYm9yZGVycyAqLwp9CgouZmMtdGltZWxpbmUgLmZjLWhlYWQgPiB0ciA+IC5mYy1kaXZpZGVyIHsKCWJvcmRlci1ib3R0b206IDA7Cn0KCi5mYy10aW1lbGluZSAuZmMtYm9keSA+IHRyID4gLmZjLWRpdmlkZXIgewoJYm9yZGVyLXRvcDogMDsKfQoKLmZjLXRpbWVsaW5lIC5mYy1ib2R5IC5mYy1kaXZpZGVyLnVpLXdpZGdldC1oZWFkZXIgewoJYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKfQoKLmZjLXNjcm9sbGVkIC5mYy1oZWFkIC5mYy1zY3JvbGxlciB7Cgl6LWluZGV4OiAyOyAvKiBzbyBkcm9wIHNoYWRvdyB3aWxsIGdvIGFib3ZlIGJvZHkgcGFuZXMgKi8KfQoKLmZjLXRpbWVsaW5lLmZjLXNjcm9sbGVkIC5mYy1oZWFkIC5mYy1zY3JvbGxlciB7Cglib3gtc2hhZG93OiAwIDNweCA0cHggcmdiYSgwLDAsMCwwLjA3NSk7Cn0KCi5mYy10aW1lbGluZSAuZmMtYm9keSAuZmMtc2Nyb2xsZXIgewoJei1pbmRleDogMTsKfQoKLyoKb24gYWxsIHRhYmxlcyB0aGF0IGV4cGFuZCB0byB0aGUgZWRnZXMsIGtpbGwgdGhlIG91dGVyIGJvcmRlciwKYmVjYXVzZSB0aGUgY29udGFpbmVyIGVsZW1lbnRzIHRha2UgY2FyZSBvZiBpdAoqLwouZmMtdGltZWxpbmUgLmZjLXNjcm9sbGVyLWNhbnZhcyA+IGRpdiA+IHRhYmxlLAouZmMtdGltZWxpbmUgLmZjLXNjcm9sbGVyLWNhbnZhcyA+IGRpdiA+IGRpdiA+IHRhYmxlIHsKCWJvcmRlci1zdHlsZTogaGlkZGVuOwp9CgoKLyogVGFibGUgQ2VsbCBDb21tb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLXRpbWVsaW5lIHRoLAouZmMtdGltZWxpbmUgdGQgewoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLmZjLXRpbWVsaW5lIC5mYy1jZWxsLWNvbnRlbnQgewoJb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmZjLXRpbWVsaW5lIC5mYy1jZWxsLXRleHQgewoJcGFkZGluZy1sZWZ0OiA0cHg7CglwYWRkaW5nLXJpZ2h0OiA0cHg7Cn0KCi5mYy10aW1lbGluZSAuZmMtY29sLXJlc2l6ZXIgewoJY3Vyc29yOiBjb2wtcmVzaXplOwp9CgovKgpDZWxscyBhdCB0aGUgc3RhcnQgb2YgYSB3ZWVrClRPRE86IGZpZ3VyZSBvdXQgYmV0dGVyIHN0eWxpbmcKCi5mYy1sdHIgLmZjLXRpbWVsaW5lIC5mYy1lbS1jZWxsIGRpdiB7Cglib3JkZXItbGVmdDogM3B4IHNvbGlkICNlZWU7CgloZWlnaHQ6IDEwMCU7Cn0KLmZjLXJ0bCAuZmMtdGltZWxpbmUgLmZjLWVtLWNlbGwgewoJYm9yZGVyLXJpZ2h0LXdpZHRoOiAzcHg7Cn0KKi8KCi8qIGhlYWQgKi8KCi5mYy10aW1lbGluZSB0aCB7Cgl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgouZmMtdGltZWxpbmUgLmZjLWhlYWQgLmZjLWNlbGwtY29udGVudCB7CglwYWRkaW5nLXRvcDogM3B4OwoJcGFkZGluZy1ib3R0b206IDNweDsKfQoKLyogYm9keSAqLwoKLmZjLXRpbWVsaW5lIC5mYy1ib2R5IC51aS13aWRnZXQtY29udGVudCB7CgliYWNrZ3JvdW5kLWltYWdlOiBub25lOwp9CgoKLyogUmVzb3VyY2UgQXJlYQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtcmVzb3VyY2UtYXJlYSB7Cgl3aWR0aDogMzAlOwp9CgouZmMtcmVzb3VyY2UtYXJlYSBjb2wgewoJd2lkdGg6IDQwJTsKCW1pbi13aWR0aDogNzBweDsgLyogd2lsbCBiZSByZWFkIGJ5IEpTICovCn0KCi5mYy1yZXNvdXJjZS1hcmVhIGNvbC5mYy1tYWluLWNvbCB7Cgl3aWR0aDogNjAlOyAvKiBtYWtlIHRoZSBmaXJzdCBjb2x1bW4gaW4gYSBuZXN0ZWQgc2V0dXAgYmlnZ2VyICovCn0KCgouZmMtZmxhdCAuZmMtZXhwYW5kZXItc3BhY2UgeyAvKiBmYy1mbGF0IGlzIG9wcG9zaXRlIG9mIGZjLW5lc3RlZCAqLwoJZGlzcGxheTogbm9uZTsKfQoKCi5mYy1sdHIgLmZjLXJlc291cmNlLWFyZWEgdHIgPiAqIHsKCXRleHQtYWxpZ246IGxlZnQ7Cn0KLmZjLXJ0bCAuZmMtcmVzb3VyY2UtYXJlYSB0ciA+ICogewoJdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCi5mYy1yZXNvdXJjZS1hcmVhIC5mYy1jZWxsLWNvbnRlbnQgewoJcGFkZGluZy1sZWZ0OiA0cHg7CglwYWRkaW5nLXJpZ2h0OiA0cHg7Cn0KCi8qIGhlYWQgKi8KCi5mYy1yZXNvdXJjZS1hcmVhIC5mYy1zdXBlciB0aCB7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5mYy1yZXNvdXJjZS1hcmVhIHRoID4gZGl2IHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNlbGwtY29udGVudCB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAxOwp9CgouZmMtcmVzb3VyY2UtYXJlYSB0aCAuZmMtY29sLXJlc2l6ZXIgewoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogMjsKCXRvcDogMDsKCWJvdHRvbTogMDsKCXdpZHRoOiA1cHg7Cn0KCi5mYy1sdHIgLmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNvbC1yZXNpemVyIHsKCXJpZ2h0OiAtM3B4Owp9Ci5mYy1ydGwgLmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNvbC1yZXNpemVyIHsKCWxlZnQ6IC0zcHg7Cn0KCi8qIGJvZHkgKi8KCnRyLmZjLWNvbGxhcHNlZCA+IHRkLCAvKiBiZWZvcmUgdGhlIHRyYW5zaXRpb24gKHByZXZlbnRzIGluaXRpYWwgZmxpY2tlcikgKi8KdHIuZmMtdHJhbnNpdGlvbmluZyA+IHRkIHsgLyogZHVyaW5nIHRoZSB0cmFuc2l0aW9uICovCglvdmVyZmxvdzogaGlkZGVuOyAvKiBwcmV2ZW50cyBhYnNvbHV0ZWx5LXBvc2l0aW9uZWQgZXZlbnRzIGZyb20gYmxlZWRpbmcgb3V0ICovCn0KCnRyLmZjLXRyYW5zaXRpb25pbmcgPiB0ZCA+IGRpdiB7Cgl0cmFuc2l0aW9uOiBtYXJnaW4tdG9wIDAuMnM7Cn0KCnRyLmZjLWNvbGxhcHNlZCA+IHRkID4gZGl2IHsKCW1hcmdpbi10b3A6IC0xMHB4Owp9CgoKLmZjLWJvZHkgLmZjLXJlc291cmNlLWFyZWEgLmZjLWNlbGwtY29udGVudCB7IC8qIG1pZ2h0IEJFIHRoZSBjZWxsICovCglwYWRkaW5nLXRvcDogOHB4OwoJcGFkZGluZy1ib3R0b206IDhweDsKfQoKLmZjLW5vLW92ZXJsYXAgLmZjLWJvZHkgLmZjLXJlc291cmNlLWFyZWEgLmZjLWNlbGwtY29udGVudCB7IC8qIG1pZ2h0IEJFIHRoZSBjZWxsICovCglwYWRkaW5nLXRvcDogNXB4OwoJcGFkZGluZy1ib3R0b206IDVweDsKfQoKLmZjLXJlc291cmNlLWFyZWEgLmZjLWljb24geyAvKiB0aGUgZXhwYW5kZXIgYW5kIHNwYWNlcnMgYmVmb3JlIHRoZSBleHBhbmRlciAqLwoJd2lkdGg6IDFlbTsgLyogZW5zdXJlIGNvbnN0YW50IHdpZHRoLCBlc3AgZm9yIGVtcHR5IGljb25zICovCglmb250LXNpemU6IC45ZW07Cgl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoJbWFyZ2luLXRvcDogLTElOwp9CgouZmMtcmVzb3VyY2UtYXJlYSAuZmMtZXhwYW5kZXIgewoJY3Vyc29yOiBwb2ludGVyOwoJY29sb3I6ICM2NjY7IC8qIGZvciB0aGUgaWNvbiB3aXRoaW4gKi8KfQoKCi8qIFRpbWUgQXJlYQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtdGltZS1hcmVhIGNvbCB7CgltaW4td2lkdGg6IDIuMmVtOyAvKiBkZXRlY3RlZCBieSBKUyAqLwp9CgovKiBoZWFkICovCgouZmMtbHRyIC5mYy10aW1lLWFyZWEgLmZjLWNocm9ubyB0aCB7Cgl0ZXh0LWFsaWduOiBsZWZ0Owp9Ci5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtY2hyb25vIHRoIHsKCXRleHQtYWxpZ246IHJpZ2h0Owp9CgovKiBib2R5IHNsYXRzICh2ZXJ0aWNhbCBsaW5lcykgKi8KCi5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIHsgLyogZmMtYmcgaXMgcmVzcG9uc2libGUgZm9yIGEgbG90IG9mIHRoaXMgbm93ISAqLwoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogMTsKCXRvcDogMDsKCWxlZnQ6IDA7CglyaWdodDogMDsKCWJvdHRvbTogMDsKfQoKLmZjLXRpbWUtYXJlYSAuZmMtc2xhdHMgdGFibGUgewoJaGVpZ2h0OiAxMDAlOwp9CgouZmMtdGltZS1hcmVhIC5mYy1zbGF0cyAuZmMtbWlub3IgewoJYm9yZGVyLXN0eWxlOiBkb3R0ZWQ7Cn0KCi5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIHRkIHsKCWJvcmRlci13aWR0aDogMCAxcHg7IC8qIG5lZWQgdG8gZG8gdGhpcy4gc29tZXRpbWVzIC0xIG1hcmdpbiB3b3VsZG4ndCBoaWRlIHRoZSBkb3R0ZWQgKi8KfQoKLmZjLWx0ciAuZmMtdGltZS1hcmVhIC5mYy1zbGF0cyB0ZCB7Cglib3JkZXItcmlnaHQtd2lkdGg6IDA7Cn0KLmZjLXJ0bCAuZmMtdGltZS1hcmVhIC5mYy1zbGF0cyB0ZCB7Cglib3JkZXItbGVmdC13aWR0aDogMDsKfQoKLyogYm9keSBjb250ZW50IGNvbnRhaW5lcnMKICAgY2FuIGJlIHdpdGhpbiByb3dzIG9yIGRpcmVjdGx5IHdpdGhpbiB0aGUgcGFuZSdzIGNvbnRlbnQKKi8KCi5mYy10aW1lLWFyZWEgLmZjLWJnZXZlbnQtY29udGFpbmVyLAouZmMtdGltZS1hcmVhIC5mYy1oaWdobGlnaHQtY29udGFpbmVyIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXotaW5kZXg6IDI7IC8qIG9ubHkgZm9yIGRpcmVjdGx5IHdpdGhpbiBwYW5lLiBub3QgZm9yIHJvdy4gb3ZlcnJpZGRlbiBsYXRlciAqLwoJdG9wOiAwOwoJYm90dG9tOiAwOwoJd2lkdGg6IDA7Cn0KCi5mYy1sdHIgLmZjLXRpbWUtYXJlYSAuZmMtaGVscGVyLWNvbnRhaW5lciwgLyogb25seSB3aXRoaW4gcm93ICovCi5mYy1sdHIgLmZjLXRpbWUtYXJlYSAuZmMtYmdldmVudC1jb250YWluZXIsCi5mYy1sdHIgLmZjLXRpbWUtYXJlYSAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lciB7CglsZWZ0OiAwOwp9Ci5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtaGVscGVyLWNvbnRhaW5lciwgLyogb25seSB3aXRoaW4gcm93ICovCi5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtYmdldmVudC1jb250YWluZXIsCi5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lciB7CglyaWdodDogMDsKfQoKLmZjLXRpbWUtYXJlYSAuZmMtYmdldmVudCwKLmZjLXRpbWUtYXJlYSAuZmMtaGlnaGxpZ2h0IHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogMDsKCWJvdHRvbTogMDsKfQoKLyogYm9keSByZXNvdXJjZSByb3dzICovCgouZmMtdGltZS1hcmVhIC5mYy1yb3dzIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDM7Cn0KCi5mYy10aW1lLWFyZWEgLmZjLXJvd3MgLnVpLXdpZGdldC1jb250ZW50IHsKCWJhY2tncm91bmQ6IG5vbmU7Cn0KCi5mYy10aW1lLWFyZWEgLmZjLXJvd3MgdGQgPiBkaXYgewoJcG9zaXRpb246IHJlbGF0aXZlOwp9CgouZmMtdGltZS1hcmVhIC5mYy1yb3dzIC5mYy1iZ2V2ZW50LWNvbnRhaW5lciwKLmZjLXRpbWUtYXJlYSAuZmMtcm93cyAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lciB7Cgl6LWluZGV4OiAxOwp9CgouZmMtdGltZS1hcmVhIC5mYy1ldmVudC1jb250YWluZXIgewoJcG9zaXRpb246IHJlbGF0aXZlOwoJei1pbmRleDogMjsgLyogYWJvdmUgYmdldmVudCBhbmQgaGlnaGxpZ2h0ICovCgl3aWR0aDogMDsgLyogZm9yIGV2ZW50IHBvc2l0aW9uaW5nLiB3aWxsIGVuZCB1cCBvbiBjb3JyZWN0IHNpZGUgYmFzZWQgb24gZGlyICovCn0KCi5mYy10aW1lLWFyZWEgLmZjLWhlbHBlci1jb250YWluZXIgeyAvKiBhbHNvIGFuIGZjLWV2ZW50LWNvbnRhaW5lciAqLwoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogMzsKCXRvcDogMDsKfQoKLmZjLXRpbWUtYXJlYSAuZmMtZXZlbnQtY29udGFpbmVyIHsKCXBhZGRpbmctYm90dG9tOiA4cHg7Cgl0b3A6IC0xcHg7Cn0KCi5mYy10aW1lLWFyZWEgdHI6Zmlyc3QtY2hpbGQgLmZjLWV2ZW50LWNvbnRhaW5lciB7Cgl0b3A6IDA7Cn0KCi5mYy1uby1vdmVybGFwIC5mYy10aW1lLWFyZWEgLmZjLWV2ZW50LWNvbnRhaW5lciB7CglwYWRkaW5nLWJvdHRvbTogMDsKCXRvcDogMDsKfQoKCi8qIE5vdyBJbmRpY2F0b3IKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLXRpbWVsaW5lIC5mYy1ub3ctaW5kaWNhdG9yIHsgLyogYm90aCB0aGUgYXJyb3cgYW5kIHRoZSBsaW5lICovCgl6LWluZGV4OiAzOyAvKiBvbmUgYWJvdmUgc2Nyb2xsZXIncyBmYy1jb250ZW50ICovCgl0b3A6IDA7Cn0KCi5mYy10aW1lLWFyZWEgLmZjLW5vdy1pbmRpY2F0b3ItYXJyb3cgewoJbWFyZ2luOiAwIC02cHg7IC8qIDUsIHRoZW4gb25lIG1vcmUgdG8gY291bnRlcmFjdCBzY3JvbGxlcidzIG5lZ2F0aXZlIG1hcmdpbnMgKi8KCS8qIHRyaWFuZ2xlIHBvaW50aW5nIGRvd24uLi4gKi8KCWJvcmRlci13aWR0aDogNnB4IDVweCAwIDVweDsKCWJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudDsKCWJvcmRlci1yaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KCi5mYy10aW1lLWFyZWEgLmZjLW5vdy1pbmRpY2F0b3ItbGluZSB7CgltYXJnaW46IDAgLTFweDsgLyogY291bnRlcmFjdCBzY3JvbGxlcidzIG5lZ2F0aXZlIG1hcmdpbnMgKi8KCWJvdHRvbTogMDsKCWJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7Cn0KCgovKiBUaW1lIEdyaWQgRXZlbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy10aW1lbGluZS1ldmVudCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cglib3JkZXItcmFkaXVzOiAwOwoJcGFkZGluZzogMnB4IDA7CgltYXJnaW4tYm90dG9tOiAxcHg7Cn0KCi5mYy1uby1vdmVybGFwIC5mYy10aW1lbGluZS1ldmVudCB7CglwYWRkaW5nOiA1cHggMDsKCW1hcmdpbi1ib3R0b206IDA7Cn0KCi8qIGRvbid0IG92ZXJsYXAgZ3JpZCBsaW5lcyBhdCB0aGUgZXZlbnQncyBlbmQgKi8KLmZjLWx0ciAuZmMtdGltZWxpbmUtZXZlbnQgeyBtYXJnaW4tcmlnaHQ6IDFweCB9Ci5mYy1ydGwgLmZjLXRpbWVsaW5lLWV2ZW50IHsgbWFyZ2luLWxlZnQ6IDFweCB9CgouZmMtdGltZWxpbmUtZXZlbnQgLmZjLWNvbnRlbnQgewoJcGFkZGluZzogMCAxcHg7Cgl3aGl0ZS1zcGFjZTogbm93cmFwOwoJb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aW1lIHsKCWZvbnQtd2VpZ2h0OiBib2xkOwoJcGFkZGluZzogMCAxcHg7Cn0KCi5mYy1ydGwgLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aW1lIHsKCWRpc3BsYXk6IGlubGluZS1ibG9jazsgLyogd2lsbCBmb3JjZSBpdCBvbiB0aGUgb3RoZXIgc2lkZSAqLwp9CgouZmMtdGltZWxpbmUtZXZlbnQgLmZjLXRpdGxlIHsKCXBhZGRpbmc6IDAgMXB4Owp9CgouZmMtdGltZWxpbmUtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLWJnIHsKCWRpc3BsYXk6IG5vbmU7IC8qIGhpZGUgc2VtaS13aGl0ZSBiYWNrZ3JvdW5kLCB0byBhcHBlYXIgZGFya2VyICovCn0KCgovKiBmb2xsb3dlciBsb2dpYyAqLwoKCi5mYy1sdHIgLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aXRsZSB7CglwYWRkaW5nLWxlZnQ6IDEwcHg7CgltYXJnaW4tbGVmdDogLThweDsKfQouZmMtcnRsIC5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGUgewoJcGFkZGluZy1yaWdodDogMTBweDsKCW1hcmdpbi1yaWdodDogLThweDsKfQoKLmZjLWx0ciAuZmMtdGltZWxpbmUtZXZlbnQuZmMtbm90LXN0YXJ0IC5mYy10aXRsZSB7CgltYXJnaW4tbGVmdDogLTJweDsKfQouZmMtcnRsIC5mYy10aW1lbGluZS1ldmVudC5mYy1ub3Qtc3RhcnQgLmZjLXRpdGxlIHsKCW1hcmdpbi1yaWdodDogLTJweDsKfQoKLmZjLXRpbWVsaW5lLWV2ZW50LmZjLW5vdC1zdGFydCAuZmMtdGl0bGUsCi5mYy1ib2R5IC5mYy10aW1lLWFyZWEgLmZjLWZvbGxvd2luZyB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5mYy10aW1lbGluZS1ldmVudC5mYy1ub3Qtc3RhcnQgLmZjLXRpdGxlOmJlZm9yZSwKLmZjLWJvZHkgLmZjLXRpbWUtYXJlYSAuZmMtZm9sbG93aW5nOmJlZm9yZSB7IC8qIGdlbmVyaWMgYXJyb3cgKi8KCWNvbnRlbnQ6ICIiOwoJcG9zaXRpb246IGFic29sdXRlOwoJdG9wOiA1MCU7CgltYXJnaW4tdG9wOiAtNXB4OwoJYm9yZGVyOiA1cHggc29saWQgIzAwMDsKCWJvcmRlci10b3AtY29sb3I6IHRyYW5zcGFyZW50OwoJYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7CglvcGFjaXR5OiAuNTsKfQoKLmZjLWx0ciAuZmMtdGltZWxpbmUtZXZlbnQuZmMtbm90LXN0YXJ0IC5mYy10aXRsZTpiZWZvcmUsCi5mYy1sdHIgLmZjLWJvZHkgLmZjLXRpbWUtYXJlYSAuZmMtZm9sbG93aW5nOmJlZm9yZSB7IC8qIExUUi4gbGVmdCBwb2ludGluZyBhcnJvdyAqLwoJYm9yZGVyLWxlZnQ6IDA7CglsZWZ0OiAycHg7Cn0KCi5mYy1ydGwgLmZjLXRpbWVsaW5lLWV2ZW50LmZjLW5vdC1zdGFydCAuZmMtdGl0bGU6YmVmb3JlLAouZmMtcnRsIC5mYy1ib2R5IC5mYy10aW1lLWFyZWEgLmZjLWZvbGxvd2luZzpiZWZvcmUgeyAvKiBSVEwuIHJpZ2h0IHBvaW50aW5nIGFycm93ICovCglib3JkZXItcmlnaHQ6IDA7CglyaWdodDogMnB4Owp9CgoKLyogTGljZW5zZSBNZXNzYWdlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy1saWNlbnNlLW1lc3NhZ2UgewoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogOTk5OTk7Cglib3R0b206IDFweDsKCWxlZnQ6IDFweDsKCWJhY2tncm91bmQ6ICNlZWU7Cglib3JkZXItY29sb3I6ICNkZGQ7Cglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiAxcHggMXB4IDAgMDsKCXBhZGRpbmc6IDJweCA0cHg7Cglmb250LXNpemU6IDEycHg7Cglib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogM3B4Owp9Cg==
LyohCiAqIEZ1bGxDYWxlbmRhciBTY2hlZHVsZXIgdjEuNC4wCiAqIERvY3MgJiBMaWNlbnNlOiBodHRwOi8vZnVsbGNhbGVuZGFyLmlvL3NjaGVkdWxlci8KICogKGMpIDIwMTYgQWRhbSBTaGF3CiAqLy5mYy1yZXNvdXJjZS1hcmVhIC5mYy1jZWxsLWNvbnRlbnQsLmZjLXRpbWVsaW5lIC5mYy1jZWxsLXRleHR7cGFkZGluZy1sZWZ0OjRweDtwYWRkaW5nLXJpZ2h0OjRweH0uZmMtcmVzb3VyY2UtYXJlYSB0aD5kaXYsLmZjLXNjcm9sbGVyLWNhbnZhcywuZmMtc2Nyb2xsZXItY2FudmFzPi5mYy1jb250ZW50LC5mYy1zY3JvbGxlci1jbGlwe3Bvc2l0aW9uOnJlbGF0aXZlfS5mYy1zY3JvbGxlci1jbGlwLC5mYy10aW1lbGluZSAuZmMtY2VsbC1jb250ZW50LHRyLmZjLWNvbGxhcHNlZD50ZCx0ci5mYy10cmFuc2l0aW9uaW5nPnRke292ZXJmbG93OmhpZGRlbn0uZmMtbm8tc2Nyb2xsYmFyc3tiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMCl9LmZjLXRpbWVsaW5lIC5mYy1ib2R5IC5mYy1kaXZpZGVyLnVpLXdpZGdldC1oZWFkZXIsLmZjLXRpbWVsaW5lIC5mYy1ib2R5IC51aS13aWRnZXQtY29udGVudHtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LmZjLW5vLXNjcm9sbGJhcnM6Oi13ZWJraXQtc2Nyb2xsYmFye3dpZHRoOjA7aGVpZ2h0OjB9LmZjLXNjcm9sbGVyLWNhbnZhc3tib3gtc2l6aW5nOmJvcmRlci1ib3g7bWluLWhlaWdodDoxMDAlfS5mYy1zY3JvbGxlci1jYW52YXM+LmZjLWJne3otaW5kZXg6MX0uZmMtc2Nyb2xsZXItY2FudmFzPi5mYy1jb250ZW50e3otaW5kZXg6Mjtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjB9LnVpLXdpZGdldCAuZmMtc2Nyb2xsZXItY2FudmFzPi5mYy1jb250ZW50e2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0uZmMtc2Nyb2xsZXItY2FudmFzLmZjLWd1dHRlci1sZWZ0Pi5mYy1jb250ZW50e2JvcmRlci1sZWZ0LXdpZHRoOjFweDttYXJnaW4tbGVmdDotMXB4fS5mYy1zY3JvbGxlci1jYW52YXMuZmMtZ3V0dGVyLXJpZ2h0Pi5mYy1jb250ZW50e2JvcmRlci1yaWdodC13aWR0aDoxcHg7bWFyZ2luLXJpZ2h0Oi0xcHh9LmZjLXNjcm9sbGVyLWNhbnZhcy5mYy1ndXR0ZXItdG9wPi5mYy1jb250ZW50e2JvcmRlci10b3Atd2lkdGg6MXB4O21hcmdpbi10b3A6LTFweH0uZmMtc2Nyb2xsZXItY2FudmFzLmZjLWd1dHRlci1ib3R0b20+LmZjLWNvbnRlbnR7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHg7bWFyZ2luLWJvdHRvbTotMXB4fS5mYy1ydGwgLmZjLXRpbWVsaW5le2RpcmVjdGlvbjpydGx9LmZjLXRpbWVsaW5lIC5mYy1kaXZpZGVye3dpZHRoOjNweDtib3JkZXItc3R5bGU6ZG91YmxlfS5mYy10aW1lbGluZSAuZmMtaGVhZD50cj4uZmMtZGl2aWRlcntib3JkZXItYm90dG9tOjB9LmZjLXRpbWVsaW5lIC5mYy1ib2R5PnRyPi5mYy1kaXZpZGVye2JvcmRlci10b3A6MH0uZmMtc2Nyb2xsZWQgLmZjLWhlYWQgLmZjLXNjcm9sbGVye3otaW5kZXg6Mn0uZmMtdGltZWxpbmUuZmMtc2Nyb2xsZWQgLmZjLWhlYWQgLmZjLXNjcm9sbGVye2JveC1zaGFkb3c6MCAzcHggNHB4IHJnYmEoMCwwLDAsLjA3NSl9LmZjLXRpbWVsaW5lIC5mYy1ib2R5IC5mYy1zY3JvbGxlcnt6LWluZGV4OjF9LmZjLXRpbWVsaW5lIC5mYy1zY3JvbGxlci1jYW52YXM+ZGl2PmRpdj50YWJsZSwuZmMtdGltZWxpbmUgLmZjLXNjcm9sbGVyLWNhbnZhcz5kaXY+dGFibGV7Ym9yZGVyLXN0eWxlOmhpZGRlbn0uZmMtdGltZWxpbmUgdGQsLmZjLXRpbWVsaW5lIHRoe3doaXRlLXNwYWNlOm5vd3JhcH0uZmMtdGltZWxpbmUgLmZjLWNvbC1yZXNpemVye2N1cnNvcjpjb2wtcmVzaXplfS5mYy10aW1lbGluZSB0aHt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmZjLXRpbWVsaW5lIC5mYy1oZWFkIC5mYy1jZWxsLWNvbnRlbnR7cGFkZGluZy10b3A6M3B4O3BhZGRpbmctYm90dG9tOjNweH0uZmMtcmVzb3VyY2UtYXJlYXt3aWR0aDozMCV9LmZjLXJlc291cmNlLWFyZWEgY29se3dpZHRoOjQwJTttaW4td2lkdGg6NzBweH0uZmMtcmVzb3VyY2UtYXJlYSBjb2wuZmMtbWFpbi1jb2x7d2lkdGg6NjAlfS5mYy1mbGF0IC5mYy1leHBhbmRlci1zcGFjZXtkaXNwbGF5Om5vbmV9LmZjLWx0ciAuZmMtcmVzb3VyY2UtYXJlYSB0cj4qe3RleHQtYWxpZ246bGVmdH0uZmMtcnRsIC5mYy1yZXNvdXJjZS1hcmVhIHRyPip7dGV4dC1hbGlnbjpyaWdodH0uZmMtcmVzb3VyY2UtYXJlYSAuZmMtc3VwZXIgdGh7dGV4dC1hbGlnbjpjZW50ZXJ9LmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNlbGwtY29udGVudHtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9LmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNvbC1yZXNpemVyLC5mYy10aW1lLWFyZWEgLmZjLWJnZXZlbnQsLmZjLXRpbWUtYXJlYSAuZmMtaGlnaGxpZ2h0LC5mYy10aW1lLWFyZWEgLmZjLXNsYXRze3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowfS5mYy1yZXNvdXJjZS1hcmVhIHRoIC5mYy1jb2wtcmVzaXplcnt6LWluZGV4OjI7d2lkdGg6NXB4fS5mYy1sdHIgLmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNvbC1yZXNpemVye3JpZ2h0Oi0zcHh9LmZjLXJ0bCAuZmMtcmVzb3VyY2UtYXJlYSB0aCAuZmMtY29sLXJlc2l6ZXJ7bGVmdDotM3B4fXRyLmZjLXRyYW5zaXRpb25pbmc+dGQ+ZGl2e3RyYW5zaXRpb246bWFyZ2luLXRvcCAuMnN9dHIuZmMtY29sbGFwc2VkPnRkPmRpdnttYXJnaW4tdG9wOi0xMHB4fS5mYy1ib2R5IC5mYy1yZXNvdXJjZS1hcmVhIC5mYy1jZWxsLWNvbnRlbnR7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0uZmMtbm8tb3ZlcmxhcCAuZmMtYm9keSAuZmMtcmVzb3VyY2UtYXJlYSAuZmMtY2VsbC1jb250ZW50e3BhZGRpbmctdG9wOjVweDtwYWRkaW5nLWJvdHRvbTo1cHh9LmZjLXJlc291cmNlLWFyZWEgLmZjLWljb257d2lkdGg6MWVtO2ZvbnQtc2l6ZTouOWVtO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tdG9wOi0xJX0uZmMtcmVzb3VyY2UtYXJlYSAuZmMtZXhwYW5kZXJ7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY2Nn0uZmMtdGltZS1hcmVhIGNvbHttaW4td2lkdGg6Mi4yZW19LmZjLWx0ciAuZmMtdGltZS1hcmVhIC5mYy1jaHJvbm8gdGh7dGV4dC1hbGlnbjpsZWZ0fS5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtY2hyb25vIHRoe3RleHQtYWxpZ246cmlnaHR9LmZjLXRpbWUtYXJlYSAuZmMtc2xhdHN7ei1pbmRleDoxO2xlZnQ6MDtyaWdodDowfS5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIHRhYmxle2hlaWdodDoxMDAlfS5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIC5mYy1taW5vcntib3JkZXItc3R5bGU6ZG90dGVkfS5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIHRke2JvcmRlci13aWR0aDowIDFweH0uZmMtbHRyIC5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIHRke2JvcmRlci1yaWdodC13aWR0aDowfS5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtc2xhdHMgdGR7Ym9yZGVyLWxlZnQtd2lkdGg6MH0uZmMtdGltZS1hcmVhIC5mYy1iZ2V2ZW50LWNvbnRhaW5lciwuZmMtdGltZS1hcmVhIC5mYy1oaWdobGlnaHQtY29udGFpbmVye3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mjt0b3A6MDtib3R0b206MDt3aWR0aDowfS5mYy1sdHIgLmZjLXRpbWUtYXJlYSAuZmMtYmdldmVudC1jb250YWluZXIsLmZjLWx0ciAuZmMtdGltZS1hcmVhIC5mYy1oZWxwZXItY29udGFpbmVyLC5mYy1sdHIgLmZjLXRpbWUtYXJlYSAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lcntsZWZ0OjB9LmZjLXJ0bCAuZmMtdGltZS1hcmVhIC5mYy1iZ2V2ZW50LWNvbnRhaW5lciwuZmMtcnRsIC5mYy10aW1lLWFyZWEgLmZjLWhlbHBlci1jb250YWluZXIsLmZjLXJ0bCAuZmMtdGltZS1hcmVhIC5mYy1oaWdobGlnaHQtY29udGFpbmVye3JpZ2h0OjB9LmZjLXRpbWUtYXJlYSAuZmMtcm93c3twb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjN9LmZjLXRpbWUtYXJlYSAuZmMtcm93cyAudWktd2lkZ2V0LWNvbnRlbnR7YmFja2dyb3VuZDowIDB9LmZjLXRpbWUtYXJlYSAuZmMtcm93cyB0ZD5kaXZ7cG9zaXRpb246cmVsYXRpdmV9LmZjLXRpbWUtYXJlYSAuZmMtcm93cyAuZmMtYmdldmVudC1jb250YWluZXIsLmZjLXRpbWUtYXJlYSAuZmMtcm93cyAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lcnt6LWluZGV4OjF9LmZjLXRpbWUtYXJlYSAuZmMtZXZlbnQtY29udGFpbmVye3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6Mjt3aWR0aDowfS5mYy10aW1lLWFyZWEgLmZjLWhlbHBlci1jb250YWluZXJ7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDozO3RvcDowfS5mYy10aW1lLWFyZWEgLmZjLWV2ZW50LWNvbnRhaW5lcntwYWRkaW5nLWJvdHRvbTo4cHg7dG9wOi0xcHh9LmZjLXRpbWUtYXJlYSB0cjpmaXJzdC1jaGlsZCAuZmMtZXZlbnQtY29udGFpbmVye3RvcDowfS5mYy1uby1vdmVybGFwIC5mYy10aW1lLWFyZWEgLmZjLWV2ZW50LWNvbnRhaW5lcntwYWRkaW5nLWJvdHRvbTowO3RvcDowfS5mYy10aW1lbGluZSAuZmMtbm93LWluZGljYXRvcnt6LWluZGV4OjM7dG9wOjB9LmZjLXRpbWUtYXJlYSAuZmMtbm93LWluZGljYXRvci1hcnJvd3ttYXJnaW46MCAtNnB4O2JvcmRlci13aWR0aDo2cHggNXB4IDA7Ym9yZGVyLWxlZnQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS5mYy10aW1lLWFyZWEgLmZjLW5vdy1pbmRpY2F0b3ItbGluZXttYXJnaW46MCAtMXB4O2JvdHRvbTowO2JvcmRlci1sZWZ0LXdpZHRoOjFweH0uZmMtdGltZWxpbmUtZXZlbnR7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czowO3BhZGRpbmc6MnB4IDA7bWFyZ2luLWJvdHRvbToxcHh9LmZjLW5vLW92ZXJsYXAgLmZjLXRpbWVsaW5lLWV2ZW50e3BhZGRpbmc6NXB4IDA7bWFyZ2luLWJvdHRvbTowfS5mYy1sdHIgLmZjLXRpbWVsaW5lLWV2ZW50e21hcmdpbi1yaWdodDoxcHh9LmZjLXJ0bCAuZmMtdGltZWxpbmUtZXZlbnR7bWFyZ2luLWxlZnQ6MXB4fS5mYy10aW1lbGluZS1ldmVudCAuZmMtY29udGVudHtwYWRkaW5nOjAgMXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW59LmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aW1le2ZvbnQtd2VpZ2h0OjcwMDtwYWRkaW5nOjAgMXB4fS5mYy1ydGwgLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aW1le2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGV7cGFkZGluZzowIDFweH0uZmMtdGltZWxpbmUtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLWJne2Rpc3BsYXk6bm9uZX0uZmMtbHRyIC5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGV7cGFkZGluZy1sZWZ0OjEwcHg7bWFyZ2luLWxlZnQ6LThweH0uZmMtcnRsIC5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGV7cGFkZGluZy1yaWdodDoxMHB4O21hcmdpbi1yaWdodDotOHB4fS5mYy1sdHIgLmZjLXRpbWVsaW5lLWV2ZW50LmZjLW5vdC1zdGFydCAuZmMtdGl0bGV7bWFyZ2luLWxlZnQ6LTJweH0uZmMtcnRsIC5mYy10aW1lbGluZS1ldmVudC5mYy1ub3Qtc3RhcnQgLmZjLXRpdGxle21hcmdpbi1yaWdodDotMnB4fS5mYy1ib2R5IC5mYy10aW1lLWFyZWEgLmZjLWZvbGxvd2luZywuZmMtdGltZWxpbmUtZXZlbnQuZmMtbm90LXN0YXJ0IC5mYy10aXRsZXtwb3NpdGlvbjpyZWxhdGl2ZX0uZmMtYm9keSAuZmMtdGltZS1hcmVhIC5mYy1mb2xsb3dpbmc6YmVmb3JlLC5mYy10aW1lbGluZS1ldmVudC5mYy1ub3Qtc3RhcnQgLmZjLXRpdGxlOmJlZm9yZXtjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7bWFyZ2luLXRvcDotNXB4O2JvcmRlcjo1cHggc29saWQgIzAwMDtib3JkZXItdG9wLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1ib3R0b20tY29sb3I6dHJhbnNwYXJlbnQ7b3BhY2l0eTouNX0uZmMtbHRyIC5mYy1ib2R5IC5mYy10aW1lLWFyZWEgLmZjLWZvbGxvd2luZzpiZWZvcmUsLmZjLWx0ciAuZmMtdGltZWxpbmUtZXZlbnQuZmMtbm90LXN0YXJ0IC5mYy10aXRsZTpiZWZvcmV7Ym9yZGVyLWxlZnQ6MDtsZWZ0OjJweH0uZmMtcnRsIC5mYy1ib2R5IC5mYy10aW1lLWFyZWEgLmZjLWZvbGxvd2luZzpiZWZvcmUsLmZjLXJ0bCAuZmMtdGltZWxpbmUtZXZlbnQuZmMtbm90LXN0YXJ0IC5mYy10aXRsZTpiZWZvcmV7Ym9yZGVyLXJpZ2h0OjA7cmlnaHQ6MnB4fS5mYy1saWNlbnNlLW1lc3NhZ2V7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDo5OTk5OTtib3R0b206MXB4O2xlZnQ6MXB4O2JhY2tncm91bmQ6I2VlZTtib3JkZXItY29sb3I6I2RkZDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjFweCAxcHggMCAwO3BhZGRpbmc6MnB4IDRweDtmb250LXNpemU6MTJweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czozcHh9
LyoqKgpTcGVjdHJ1bSBDb2xvcnBpY2tlciB2MS44LjAKaHR0cHM6Ly9naXRodWIuY29tL2Jncmlucy9zcGVjdHJ1bQpBdXRob3I6IEJyaWFuIEdyaW5zdGVhZApMaWNlbnNlOiBNSVQKKioqLwoKLnNwLWNvbnRhaW5lciB7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgbGVmdDowOwogICAgZGlzcGxheTppbmxpbmUtYmxvY2s7CiAgICAqZGlzcGxheTogaW5saW5lOwogICAgKnpvb206IDE7CiAgICAvKiBodHRwczovL2dpdGh1Yi5jb20vYmdyaW5zL3NwZWN0cnVtL2lzc3Vlcy80MCAqLwogICAgei1pbmRleDogOTk5OTk5NDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KLnNwLWNvbnRhaW5lci5zcC1mbGF0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLyogRml4IGZvciAqIHsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfSAqLwouc3AtY29udGFpbmVyLAouc3AtY29udGFpbmVyICogewogICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICAgICAgIC1tb3otYm94LXNpemluZzogY29udGVudC1ib3g7CiAgICAgICAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94Owp9CgovKiBodHRwOi8vYW5zY2lhdGgudHVtYmxyLmNvbS9wb3N0LzczNDc0OTU4NjkvY3NzLWFzcGVjdC1yYXRpbyAqLwouc3AtdG9wIHsKICBwb3NpdGlvbjpyZWxhdGl2ZTsKICB3aWR0aDogMTAwJTsKICBkaXNwbGF5OmlubGluZS1ibG9jazsKfQouc3AtdG9wLWlubmVyIHsKICAgcG9zaXRpb246YWJzb2x1dGU7CiAgIHRvcDowOwogICBsZWZ0OjA7CiAgIGJvdHRvbTowOwogICByaWdodDowOwp9Ci5zcC1jb2xvciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6MDsKICAgIGxlZnQ6MDsKICAgIGJvdHRvbTowOwogICAgcmlnaHQ6MjAlOwp9Ci5zcC1odWUgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOjA7CiAgICByaWdodDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0Ojg0JTsKICAgIGhlaWdodDogMTAwJTsKfQoKLnNwLWNsZWFyLWVuYWJsZWQgLnNwLWh1ZSB7CiAgICB0b3A6MzNweDsKICAgIGhlaWdodDogNzcuNSU7Cn0KCi5zcC1maWxsIHsKICAgIHBhZGRpbmctdG9wOiA4MCU7Cn0KLnNwLXNhdCwgLnNwLXZhbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6MDsKICAgIGxlZnQ6MDsKICAgIHJpZ2h0OjA7CiAgICBib3R0b206MDsKfQoKLnNwLWFscGhhLWVuYWJsZWQgLnNwLXRvcCB7CiAgICBtYXJnaW4tYm90dG9tOiAxOHB4Owp9Ci5zcC1hbHBoYS1lbmFibGVkIC5zcC1hbHBoYSB7CiAgICBkaXNwbGF5OiBibG9jazsKfQouc3AtYWxwaGEtaGFuZGxlIHsKICAgIHBvc2l0aW9uOmFic29sdXRlOwogICAgdG9wOi00cHg7CiAgICBib3R0b206IC00cHg7CiAgICB3aWR0aDogNnB4OwogICAgbGVmdDogNTAlOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgIG9wYWNpdHk6IC44Owp9Ci5zcC1hbHBoYSB7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYm90dG9tOiAtMTRweDsKICAgIHJpZ2h0OiAwOwogICAgbGVmdDogMDsKICAgIGhlaWdodDogOHB4Owp9Ci5zcC1hbHBoYS1pbm5lciB7CiAgICBib3JkZXI6IHNvbGlkIDFweCAjMzMzOwp9Cgouc3AtY2xlYXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKLnNwLWNsZWFyLnNwLWNsZWFyLWRpc3BsYXkgewogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwp9Cgouc3AtY2xlYXItZW5hYmxlZCAuc3AtY2xlYXIgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowcHg7CiAgICByaWdodDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0Ojg0JTsKICAgIGhlaWdodDogMjhweDsKfQoKLyogRG9uJ3QgYWxsb3cgdGV4dCBzZWxlY3Rpb24gKi8KLnNwLWNvbnRhaW5lciwgLnNwLXJlcGxhY2VyLCAuc3AtcHJldmlldywgLnNwLWRyYWdnZXIsIC5zcC1zbGlkZXIsIC5zcC1hbHBoYSwgLnNwLWNsZWFyLCAuc3AtYWxwaGEtaGFuZGxlLCAuc3AtY29udGFpbmVyLnNwLWRyYWdnaW5nIC5zcC1pbnB1dCwgLnNwLWNvbnRhaW5lciBidXR0b24gIHsKICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTsKICAgIC1tb3otdXNlci1zZWxlY3Q6IC1tb3otbm9uZTsKICAgIC1vLXVzZXItc2VsZWN0Om5vbmU7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLnNwLWNvbnRhaW5lci5zcC1pbnB1dC1kaXNhYmxlZCAuc3AtaW5wdXQtY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLnNwLWNvbnRhaW5lci5zcC1idXR0b25zLWRpc2FibGVkIC5zcC1idXR0b24tY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLnNwLWNvbnRhaW5lci5zcC1wYWxldHRlLWJ1dHRvbnMtZGlzYWJsZWQgLnNwLXBhbGV0dGUtYnV0dG9uLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5zcC1wYWxldHRlLW9ubHkgLnNwLXBpY2tlci1jb250YWluZXIgewogICAgZGlzcGxheTogbm9uZTsKfQouc3AtcGFsZXR0ZS1kaXNhYmxlZCAuc3AtcGFsZXR0ZS1jb250YWluZXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKLnNwLWluaXRpYWwtZGlzYWJsZWQgLnNwLWluaXRpYWwgewogICAgZGlzcGxheTogbm9uZTsKfQoKCi8qIEdyYWRpZW50cyBmb3IgaHVlLCBzYXR1cmF0aW9uIGFuZCB2YWx1ZSBpbnN0ZWFkIG9mIGltYWdlcy4gIE5vdCBwcmV0dHkuLi4gYnV0IGl0IHdvcmtzICovCi5zcC1zYXQgewogICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsICAwIDAsIDEwMCUgMCwgZnJvbSgjRkZGKSwgdG8ocmdiYSgyMDQsIDE1NCwgMTI5LCAwKSkpOwogICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgI0ZGRiwgcmdiYSgyMDQsIDE1NCwgMTI5LCAwKSk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCAjZmZmLCByZ2JhKDIwNCwgMTU0LCAxMjksIDApKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCAjZmZmLCByZ2JhKDIwNCwgMTU0LCAxMjksIDApKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgI2ZmZiwgcmdiYSgyMDQsIDE1NCwgMTI5LCAwKSk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICNmZmYsIHJnYmEoMjA0LCAxNTQsIDEyOSwgMCkpOwogICAgLW1zLWZpbHRlcjogInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChHcmFkaWVudFR5cGUgPSAxLCBzdGFydENvbG9yc3RyPSNGRkZGRkZGRiwgZW5kQ29sb3JzdHI9IzAwQ0M5QTgxKSI7CiAgICBmaWx0ZXIgOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoR3JhZGllbnRUeXBlID0gMSwgc3RhcnRDb2xvcnN0cj0nI0ZGRkZGRkZGJywgZW5kQ29sb3JzdHI9JyMwMENDOUE4MScpOwp9Ci5zcC12YWwgewogICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDAgMTAwJSwgMCAwLCBmcm9tKCMwMDAwMDApLCB0byhyZ2JhKDIwNCwgMTU0LCAxMjksIDApKSk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChib3R0b20sICMwMDAwMDAsIHJnYmEoMjA0LCAxNTQsIDEyOSwgMCkpOwogICAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQoYm90dG9tLCAjMDAwLCByZ2JhKDIwNCwgMTU0LCAxMjksIDApKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudChib3R0b20sICMwMDAsIHJnYmEoMjA0LCAxNTQsIDEyOSwgMCkpOwogICAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudChib3R0b20sICMwMDAsIHJnYmEoMjA0LCAxNTQsIDEyOSwgMCkpOwogICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHRvcCwgIzAwMCwgcmdiYSgyMDQsIDE1NCwgMTI5LCAwKSk7CiAgICAtbXMtZmlsdGVyOiAicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9IzAwQ0M5QTgxLCBlbmRDb2xvcnN0cj0jRkYwMDAwMDApIjsKICAgIGZpbHRlciA6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjMDBDQzlBODEnLCBlbmRDb2xvcnN0cj0nI0ZGMDAwMDAwJyk7Cn0KCi5zcC1odWUgewogICAgYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjZmYwMDAwIDAlLCAjZmZmZjAwIDE3JSwgIzAwZmYwMCAzMyUsICMwMGZmZmYgNTAlLCAjMDAwMGZmIDY3JSwgI2ZmMDBmZiA4MyUsICNmZjAwMDAgMTAwJSk7CiAgICBiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgI2ZmMDAwMCAwJSwgI2ZmZmYwMCAxNyUsICMwMGZmMDAgMzMlLCAjMDBmZmZmIDUwJSwgIzAwMDBmZiA2NyUsICNmZjAwZmYgODMlLCAjZmYwMDAwIDEwMCUpOwogICAgYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2ZmMDAwMCAwJSwgI2ZmZmYwMCAxNyUsICMwMGZmMDAgMzMlLCAjMDBmZmZmIDUwJSwgIzAwMDBmZiA2NyUsICNmZjAwZmYgODMlLCAjZmYwMDAwIDEwMCUpOwogICAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgZnJvbSgjZmYwMDAwKSwgY29sb3Itc3RvcCgwLjE3LCAjZmZmZjAwKSwgY29sb3Itc3RvcCgwLjMzLCAjMDBmZjAwKSwgY29sb3Itc3RvcCgwLjUsICMwMGZmZmYpLCBjb2xvci1zdG9wKDAuNjcsICMwMDAwZmYpLCBjb2xvci1zdG9wKDAuODMsICNmZjAwZmYpLCB0bygjZmYwMDAwKSk7CiAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICNmZjAwMDAgMCUsICNmZmZmMDAgMTclLCAjMDBmZjAwIDMzJSwgIzAwZmZmZiA1MCUsICMwMDAwZmYgNjclLCAjZmYwMGZmIDgzJSwgI2ZmMDAwMCAxMDAlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNmZjAwMDAgMCUsICNmZmZmMDAgMTclLCAjMDBmZjAwIDMzJSwgIzAwZmZmZiA1MCUsICMwMDAwZmYgNjclLCAjZmYwMGZmIDgzJSwgI2ZmMDAwMCAxMDAlKTsKfQoKLyogSUUgZmlsdGVycyBkbyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBjb2xvciBzdG9wcy4KICAgR2VuZXJhdGUgNiBkaXZzLCBsaW5lIHRoZW0gdXAsIGFuZCBkbyB0d28gY29sb3IgZ3JhZGllbnRzIGZvciBlYWNoLgogICBZZXMsIHJlYWxseS4KICovCi5zcC0xIHsKICAgIGhlaWdodDoxNyU7CiAgICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjZmYwMDAwJywgZW5kQ29sb3JzdHI9JyNmZmZmMDAnKTsKfQouc3AtMiB7CiAgICBoZWlnaHQ6MTYlOwogICAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI2ZmZmYwMCcsIGVuZENvbG9yc3RyPScjMDBmZjAwJyk7Cn0KLnNwLTMgewogICAgaGVpZ2h0OjE3JTsKICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyMwMGZmMDAnLCBlbmRDb2xvcnN0cj0nIzAwZmZmZicpOwp9Ci5zcC00IHsKICAgIGhlaWdodDoxNyU7CiAgICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjMDBmZmZmJywgZW5kQ29sb3JzdHI9JyMwMDAwZmYnKTsKfQouc3AtNSB7CiAgICBoZWlnaHQ6MTYlOwogICAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nIzAwMDBmZicsIGVuZENvbG9yc3RyPScjZmYwMGZmJyk7Cn0KLnNwLTYgewogICAgaGVpZ2h0OjE3JTsKICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyNmZjAwZmYnLCBlbmRDb2xvcnN0cj0nI2ZmMDAwMCcpOwp9Cgouc3AtaGlkZGVuIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLyogQ2xlYXJmaXggaGFjayAqLwouc3AtY2Y6YmVmb3JlLCAuc3AtY2Y6YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogdGFibGU7IH0KLnNwLWNmOmFmdGVyIHsgY2xlYXI6IGJvdGg7IH0KLnNwLWNmIHsgKnpvb206IDE7IH0KCi8qIE1vYmlsZSBkZXZpY2VzLCBtYWtlIGh1ZSBzbGlkZXIgYmlnZ2VyIHNvIGl0IGlzIGVhc2llciB0byBzbGlkZSAqLwpAbWVkaWEgKG1heC1kZXZpY2Utd2lkdGg6IDQ4MHB4KSB7CiAgICAuc3AtY29sb3IgeyByaWdodDogNDAlOyB9CiAgICAuc3AtaHVlIHsgbGVmdDogNjMlOyB9CiAgICAuc3AtZmlsbCB7IHBhZGRpbmctdG9wOiA2MCU7IH0KfQouc3AtZHJhZ2dlciB7CiAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgaGVpZ2h0OiA1cHg7CiAgIHdpZHRoOiA1cHg7CiAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmY7CiAgIGJhY2tncm91bmQ6ICMwMDA7CiAgIGN1cnNvcjogcG9pbnRlcjsKICAgcG9zaXRpb246YWJzb2x1dGU7CiAgIHRvcDowOwogICBsZWZ0OiAwOwp9Ci5zcC1zbGlkZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOjA7CiAgICBjdXJzb3I6cG9pbnRlcjsKICAgIGhlaWdodDogM3B4OwogICAgbGVmdDogLTFweDsKICAgIHJpZ2h0OiAtMXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgb3BhY2l0eTogLjg7Cn0KCi8qClRoZW1lIGF1dGhvcnM6CkhlcmUgYXJlIHRoZSBiYXNpYyB0aGVtZWFibGUgZGlzcGxheSBvcHRpb25zIChjb2xvcnMsIGZvbnRzLCBnbG9iYWwgd2lkdGhzKS4KU2VlIGh0dHA6Ly9iZ3JpbnMuZ2l0aHViLmlvL3NwZWN0cnVtL3RoZW1lcy8gZm9yIGluc3RydWN0aW9ucy4KKi8KCi5zcC1jb250YWluZXIgewogICAgYm9yZGVyLXJhZGl1czogMDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNFQ0VDRUM7CiAgICBib3JkZXI6IHNvbGlkIDFweCAjZjBjNDlCOwogICAgcGFkZGluZzogMDsKfQouc3AtY29udGFpbmVyLCAuc3AtY29udGFpbmVyIGJ1dHRvbiwgLnNwLWNvbnRhaW5lciBpbnB1dCwgLnNwLWNvbG9yLCAuc3AtaHVlLCAuc3AtY2xlYXIgewogICAgZm9udDogbm9ybWFsIDEycHggIkx1Y2lkYSBHcmFuZGUiLCAiTHVjaWRhIFNhbnMgVW5pY29kZSIsICJMdWNpZGEgU2FucyIsIEdlbmV2YSwgVmVyZGFuYSwgc2Fucy1zZXJpZjsKICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIC1tcy1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQouc3AtdG9wIHsKICAgIG1hcmdpbi1ib3R0b206IDNweDsKfQouc3AtY29sb3IsIC5zcC1odWUsIC5zcC1jbGVhciB7CiAgICBib3JkZXI6IHNvbGlkIDFweCAjNjY2Owp9CgovKiBJbnB1dCAqLwouc3AtaW5wdXQtY29udGFpbmVyIHsKICAgIGZsb2F0OnJpZ2h0OwogICAgd2lkdGg6IDEwMHB4OwogICAgbWFyZ2luLWJvdHRvbTogNHB4Owp9Ci5zcC1pbml0aWFsLWRpc2FibGVkICAuc3AtaW5wdXQtY29udGFpbmVyIHsKICAgIHdpZHRoOiAxMDAlOwp9Ci5zcC1pbnB1dCB7CiAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50OwogICBib3JkZXI6IDFweCBpbnNldDsKICAgcGFkZGluZzogNHB4IDVweDsKICAgbWFyZ2luOiAwOwogICB3aWR0aDogMTAwJTsKICAgYmFja2dyb3VuZDp0cmFuc3BhcmVudDsKICAgYm9yZGVyLXJhZGl1czogM3B4OwogICBjb2xvcjogIzIyMjsKfQouc3AtaW5wdXQ6Zm9jdXMgIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkIG9yYW5nZTsKfQouc3AtaW5wdXQuc3AtdmFsaWRhdGlvbi1lcnJvciB7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZWQ7CiAgICBiYWNrZ3JvdW5kOiAjZmRkOwp9Ci5zcC1waWNrZXItY29udGFpbmVyICwgLnNwLXBhbGV0dGUtY29udGFpbmVyIHsKICAgIGZsb2F0OmxlZnQ7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgcGFkZGluZy1ib3R0b206IDMwMHB4OwogICAgbWFyZ2luLWJvdHRvbTogLTI5MHB4Owp9Ci5zcC1waWNrZXItY29udGFpbmVyIHsKICAgIHdpZHRoOiAxNzJweDsKICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggI2ZmZjsKfQoKLyogUGFsZXR0ZXMgKi8KLnNwLXBhbGV0dGUtY29udGFpbmVyIHsKICAgIGJvcmRlci1yaWdodDogc29saWQgMXB4ICNjY2M7Cn0KCi5zcC1wYWxldHRlLW9ubHkgLnNwLXBhbGV0dGUtY29udGFpbmVyIHsKICAgIGJvcmRlcjogMDsKfQoKLnNwLXBhbGV0dGUgLnNwLXRodW1iLWVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgcG9zaXRpb246cmVsYXRpdmU7CiAgICBmbG9hdDpsZWZ0OwogICAgd2lkdGg6IDI0cHg7CiAgICBoZWlnaHQ6IDE1cHg7CiAgICBtYXJnaW46IDNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlcjpzb2xpZCAycHggdHJhbnNwYXJlbnQ7Cn0KLnNwLXBhbGV0dGUgLnNwLXRodW1iLWVsOmhvdmVyLCAuc3AtcGFsZXR0ZSAuc3AtdGh1bWItZWwuc3AtdGh1bWItYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogb3JhbmdlOwp9Ci5zcC10aHVtYi1lbCB7CiAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKfQoKLyogSW5pdGlhbCAqLwouc3AtaW5pdGlhbCB7CiAgICBmbG9hdDogbGVmdDsKICAgIGJvcmRlcjogc29saWQgMXB4ICMzMzM7Cn0KLnNwLWluaXRpYWwgc3BhbiB7CiAgICB3aWR0aDogMzBweDsKICAgIGhlaWdodDogMjVweDsKICAgIGJvcmRlcjpub25lOwogICAgZGlzcGxheTpibG9jazsKICAgIGZsb2F0OmxlZnQ7CiAgICBtYXJnaW46MDsKfQoKLnNwLWluaXRpYWwgLnNwLWNsZWFyLWRpc3BsYXkgewogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwp9CgovKiBCdXR0b25zICovCi5zcC1wYWxldHRlLWJ1dHRvbi1jb250YWluZXIsCi5zcC1idXR0b24tY29udGFpbmVyIHsKICAgIGZsb2F0OiByaWdodDsKfQoKLyogUmVwbGFjZXIgKHRoZSBsaXR0bGUgcHJldmlldyBkaXYgdGhhdCBzaG93cyB1cCBpbnN0ZWFkIG9mIHRoZSA8aW5wdXQ+KSAqLwouc3AtcmVwbGFjZXIgewogICAgbWFyZ2luOjA7CiAgICBvdmVyZmxvdzpoaWRkZW47CiAgICBjdXJzb3I6cG9pbnRlcjsKICAgIHBhZGRpbmc6IDRweDsKICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrOwogICAgKnpvb206IDE7CiAgICAqZGlzcGxheTogaW5saW5lOwogICAgYm9yZGVyOiBzb2xpZCAxcHggIzkxNzY1ZDsKICAgIGJhY2tncm91bmQ6ICNlZWU7CiAgICBjb2xvcjogIzMzMzsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KLnNwLXJlcGxhY2VyOmhvdmVyLCAuc3AtcmVwbGFjZXIuc3AtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogI0YwQzQ5QjsKICAgIGNvbG9yOiAjMTExOwp9Ci5zcC1yZXBsYWNlci5zcC1kaXNhYmxlZCB7CiAgICBjdXJzb3I6ZGVmYXVsdDsKICAgIGJvcmRlci1jb2xvcjogc2lsdmVyOwogICAgY29sb3I6IHNpbHZlcjsKfQouc3AtZGQgewogICAgcGFkZGluZzogMnB4IDA7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTZweDsKICAgIGZsb2F0OmxlZnQ7CiAgICBmb250LXNpemU6MTBweDsKfQouc3AtcHJldmlldyB7CiAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKICAgIHdpZHRoOjI1cHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBib3JkZXI6IHNvbGlkIDFweCAjMjIyOwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICBmbG9hdDpsZWZ0OwogICAgei1pbmRleDogMDsKfQoKLnNwLXBhbGV0dGUgewogICAgKndpZHRoOiAyMjBweDsKICAgIG1heC13aWR0aDogMjIwcHg7Cn0KLnNwLXBhbGV0dGUgLnNwLXRodW1iLWVsIHsKICAgIHdpZHRoOjE2cHg7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBtYXJnaW46MnB4IDFweDsKICAgIGJvcmRlcjogc29saWQgMXB4ICNkMGQwZDA7Cn0KCi5zcC1jb250YWluZXIgewogICAgcGFkZGluZy1ib3R0b206MDsKfQoKCi8qIEJ1dHRvbnM6IGh0dHA6Ly9oZWxsb2hhcHB5Lm9yZy9jc3MzLWJ1dHRvbnMvICovCi5zcC1jb250YWluZXIgYnV0dG9uIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOwogIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgI2VlZWVlZSwgI2NjY2NjYyk7CiAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjZWVlZWVlLCAjY2NjY2NjKTsKICBiYWNrZ3JvdW5kLWltYWdlOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgI2VlZWVlZSwgI2NjY2NjYyk7CiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2VlZWVlZSwgI2NjY2NjYyk7CiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2VlZWVlZSwgI2NjY2NjYyk7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2JiYjsKICBib3JkZXItcmFkaXVzOiAzcHg7CiAgY29sb3I6ICMzMzM7CiAgZm9udC1zaXplOiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxOwogIHBhZGRpbmc6IDVweCA0cHg7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHRleHQtc2hhZG93OiAwIDFweCAwICNlZWU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQouc3AtY29udGFpbmVyIGJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkOwogICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjZGRkZGRkLCAjYmJiYmJiKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI2RkZGRkZCwgI2JiYmJiYik7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgI2RkZGRkZCwgI2JiYmJiYik7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAjZGRkZGRkLCAjYmJiYmJiKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNkZGRkZGQsICNiYmJiYmIpOwogICAgYm9yZGVyOiAxcHggc29saWQgI2JiYjsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjOTk5OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2RkZDsKfQouc3AtY29udGFpbmVyIGJ1dHRvbjphY3RpdmUgewogICAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjODg4OwogICAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDAgNXB4IDJweCAjYWFhYWFhLCAwIDFweCAwIDAgI2VlZWVlZTsKICAgIC1tb3otYm94LXNoYWRvdzogaW5zZXQgMCAwIDVweCAycHggI2FhYWFhYSwgMCAxcHggMCAwICNlZWVlZWU7CiAgICAtbXMtYm94LXNoYWRvdzogaW5zZXQgMCAwIDVweCAycHggI2FhYWFhYSwgMCAxcHggMCAwICNlZWVlZWU7CiAgICAtby1ib3gtc2hhZG93OiBpbnNldCAwIDAgNXB4IDJweCAjYWFhYWFhLCAwIDFweCAwIDAgI2VlZWVlZTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCA1cHggMnB4ICNhYWFhYWEsIDAgMXB4IDAgMCAjZWVlZWVlOwp9Ci5zcC1jYW5jZWwgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6ICNkOTNmM2YgIWltcG9ydGFudDsKICAgIG1hcmdpbjowOwogICAgcGFkZGluZzoycHg7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsKCn0KLnNwLWNhbmNlbDpob3ZlciB7CiAgICBjb2xvcjogI2Q5M2YzZiAhaW1wb3J0YW50OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0KCgouc3AtcGFsZXR0ZSBzcGFuOmhvdmVyLCAuc3AtcGFsZXR0ZSBzcGFuLnNwLXRodW1iLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6ICMwMDA7Cn0KCi5zcC1wcmV2aWV3LCAuc3AtYWxwaGEsIC5zcC10aHVtYi1lbCB7CiAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUF3QUFBQU1DQUlBQUFEWkY4dXdBQUFBR1VsRVFWUVlWMk00Z3dIK1l3Q0dJYXNJVXdoVDI1QlZCQUR0ellOWXJIdnY0Z0FBQUFCSlJVNUVya0pnZ2c9PSk7Cn0KLnNwLXByZXZpZXctaW5uZXIsIC5zcC1hbHBoYS1pbm5lciwgLnNwLXRodW1iLWlubmVyIHsKICAgIGRpc3BsYXk6YmxvY2s7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowO2xlZnQ6MDtib3R0b206MDtyaWdodDowOwp9Cgouc3AtcGFsZXR0ZSAuc3AtdGh1bWItaW5uZXIgewogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogNTAlIDUwJTsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Cn0KCi5zcC1wYWxldHRlIC5zcC10aHVtYi1saWdodC5zcC10aHVtYi1hY3RpdmUgLnNwLXRodW1iLWlubmVyIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJJQUFBQVNDQVlBQUFCV3pvNVhBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQUlWSlJFRlVlTnBpWUJoc2dKRk1mZnhBWEFCbE41SnJ1VDRRM3dmaS8wRHNUNjRoOFVEOEhtcElQQ1dHL0tlbUlmT0pDVUIrQW9hY3g2RUdCWnlIQnFJK1dzREN3dVE5bWh4ZWcyQTIxME50Zm84a2xrOXNPTWlqYVVSbTd5YzFVUDJSTkNNYktFOU9ESzFITTZpZWdZTGtmeDhwbGlnQzlsQ0Q3S21Sb2YwWmhqUUFDREFBY2VvdnJ0cFZCUmtBQUFBQVNVVk9SSzVDWUlJPSk7Cn0KCi5zcC1wYWxldHRlIC5zcC10aHVtYi1kYXJrLnNwLXRodW1iLWFjdGl2ZSAuc3AtdGh1bWItaW5uZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQklBQUFBU0NBWUFBQUJXem81WEFBQUFBWE5TUjBJQXJzNGM2UUFBQUFSblFVMUJBQUN4and2OFlRVUFBQUFKY0VoWmN3QUFEc01BQUE3REFjZHZxR1FBQUFBYWRFVllkRk52Wm5SM1lYSmxBRkJoYVc1MExrNUZWQ0IyTXk0MUxqRXdNUFJ5b1FBQUFNZEpSRUZVT0UrdGtnc053ekFNUk11Z0VBYWhFQWFoRUFaaEVBcWxFQVpoRUFvaEVBWWg4MVgyZEltOGZLcEVzcExHdnVkUE9zVVlweEUyQklKQ3JvSm1FVzlxSitNS2FCRmhFTU5hYlN5OW9JY0lQd3JCK2FmdkFVRm9LNEgwdE1hUTNYdGxyZ2dEaE9WVk11VDRFNU1NRzBGQmJDRVl6allUN094TEV2SUhRTFkyeld3UTNEKzlsdXlPUVRmS0RpRkQzaVVJZlBrOFZxcktqZ0FpU2ZHRlBlY3JnNkhONm0vaUJjd2lEQW83V2lCZWF3YStLd2g3dFpvU0NHTE1xd2xTQXpWRGhvSys2dkg0RzBQNXdka0FBQUFBU1VWT1JLNUNZSUk9KTsKfQoKLnNwLWNsZWFyLWRpc3BsYXkgewogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEZBQVVBUGNBQUFBQUFKbVptWjJkblo2ZW5xS2lvcU9qbzZTa3BLV2xwYWFtcHFlbnA2aW9xS21wcWFxcXFxdXJxL0h4OGZMeTh2VDA5UFgxOWZmMzkvajQrUG41K2ZyNit2djcrd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSDVCQUVBQVA4QUxBQUFBQUFVQUJRQUFBaWhBUDlGb1BDdm9NR0RCeTA4K0VkaFFBSUpDQ015YkNEQUFZVUVBUkJBbEZpUVFvTUFCUWhLVUpCeFkwU1BJQ0VZSEJuZ2dFbURLQXVvUE1qUzVjR1lNeEhXM0lpVDQ3OEpKQThNL0NqVFowR2dMUmVrTkdwd0FzWUFCSEl5cGNBZ1FNc0lURHRXSllCUjZOU3FNaWNvOWNxUjZ0S2ZZN0dlQkN1VndsaXBETm1lZkF0VHJrU3pCMVJhSUFvWG9kc0FCaVpBRUZCMDZnSUJXQzFtTFZnQmEwQUFPdz09KTsKfQo=
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgQXBwb2ludG1lbnQgQ2FsZW5kYXIKICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKICAgICNFZGl0QXBwb2ludG1lbnRGb3JtIHsKICAgICAgICB3aWR0aDogNTYwcHg7CiAgICB9CgogICAgLklubGluZUJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgfQoKICAgIC5GaWx0ZXJNZXNzYWdlIHRkIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLkNhbGVuZGFyQ29sb3IgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNCQkI7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgfQoKICAgIC5mYy1jb250ZW50IC5JY29ucywKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgPiAuSWNvbnMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgIH0KCiAgICAuZmMtY29udGVudCBpIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDAuOWVtOwogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICAgIG9wYWNpdHk6IDAuMzsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDJweDsKICAgIH0KCiAgICB0cjpob3ZlciB0ZCAuZmMtY29udGVudCBpIHsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgIH0KCiAgICAuZmMgYnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjRUVFOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNCQkI7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHRyYW5zaXRpb246IGFsbCBlYXNlLWluIDAuMnM7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDNweCA3cHggNnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgY29sb3I6ICMzMzM7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIHRleHQtc2hhZG93OiAwIDFweCAwICNGRkY7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgfQoKICAgICNEYXRlcGlja2VyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgei1pbmRleDogMTAwOwogICAgfQoKICAgICNEYXRlcGlja2VyT3ZlcmxheSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHotaW5kZXg6IDUwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgIH0KCiAgICAuQXBwb2ludG1lbnRUb29sdGlwIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7CiAgICAgICAgd2lkdGg6IDM3NXB4OwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgIH0KCiAgICAuQXBwb2ludG1lbnRUb29sdGlwID4gLkljb25zIGkgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBsaW5lLWhlaWdodDogMC45ZW07CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7CiAgICB9CgogICAgLkFwcG9pbnRtZW50VG9vbHRpcCA+IGZpZWxkc2V0IHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgfQoKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgPiBmaWVsZHNldDpsYXN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICB9CgogICAgLkFwcG9pbnRtZW50VG9vbHRpcCA+IGZpZWxkc2V0ID4gbGFiZWwgewogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjJlbTsKICAgICAgICBjb2xvcjogIzkyOTI5MjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgICAgIHBhZGRpbmctYm90dG9tOiAxcHg7CiAgICAgICAgcGFkZGluZy10b3A6IDAuM2VtOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHdpZHRoOiAzMCU7CiAgICB9CgogICAgLkFwcG9pbnRtZW50VG9vbHRpcCA+IGZpZWxkc2V0ID4gLlZhbHVlIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNGVtOwogICAgICAgIHBhZGRpbmctdG9wOiAwLjJlbTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIG1heC1oZWlnaHQ6IDUuNmVtOwogICAgfQoKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgPiBmaWVsZHNldCA+IC5WYWx1ZTplbXB0eSwKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgPiBmaWVsZHNldCA+IC5WYWx1ZTplbXB0eSArIGxhYmVsLAogICAgLkFwcG9pbnRtZW50VG9vbHRpcCA+IGZpZWxkc2V0ID4gLlZhbHVlOmVtcHR5IH4gZGl2LkNsZWFyIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgLkZsYWcgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIH0KCiAgICAuQ2FsZW5kYXJXaWRnZXQgLnVpLWRhdGVwaWNrZXItdHJpZ2dlciB7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgIH0KCiAgICAuUmVhZE9ubHlWYWx1ZSB7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgfQoKICAgIC5SZWFkT25seVZhbHVlI0xvY2F0aW9uIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB9CgogICAgI1JlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2IC5GaWVsZEV4cGxhbmF0aW9uOm50aC1jaGlsZCgyKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgIH0KCiAgICAjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiAuRmllbGRFeHBsYW5hdGlvbiwKICAgICNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiAuRmllbGRFeHBsYW5hdGlvbiwKICAgICNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IC5GaWVsZEV4cGxhbmF0aW9uIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgfQoKICAgIC5QbHVnaW5Db250YWluZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNGMkYyRjI7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI0NDQzsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgYm94LXNoYWRvdzogMXB4IDFweCA1cHggI0NDQyBpbnNldDsKICAgICAgICBwYWRkaW5nOiAycHggOHB4IDRweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgfQoKICAgIC5QbHVnaW5Db250YWluZXI6ZW1wdHkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CgogICAgLlBsdWdpbkNvbnRhaW5lciBhIHsKICAgICAgICBsaW5lLWhlaWdodDogMWVtOwogICAgfQoKICAgIC5QbHVnaW5Db250YWluZXIgYTpmaXJzdC1jaGlsZCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDk2JTsKICAgIH0KCiAgICAuZmMtYWdlbmRhLXZpZXcgdGguZmMtcmVzb3VyY2UtY2VsbCB7CiAgICAgICAgY29sb3I6ICM0QjRCNEI7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB9CgogICAgLmZjLXN0YXRlLWRlZmF1bHQuZmMtY29ybmVyLWxlZnQgewogICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDsKICAgIH0KCiAgICAuZmMtc3RhdGUtZGVmYXVsdC5mYy1jb3JuZXItcmlnaHQgewogICAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwOwogICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwOwogICAgfQoKICAgIC5mYy1zdGF0ZS1ob3ZlciwKICAgIC5mYy1zdGF0ZS1kb3duLAogICAgLmZjLXN0YXRlLWFjdGl2ZSwKICAgIC5mYy1zdGF0ZS1kaXNhYmxlZCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0U1RTVFNSAhaW1wb3J0YW50OwogICAgICAgIGJvcmRlci1jb2xvcjogIzk5OSAhaW1wb3J0YW50OwogICAgfQoKICAgIC5mYy1zdGF0ZS1kb3duLAogICAgLmZjLXN0YXRlLWFjdGl2ZSB7CiAgICAgICAgYm94LXNoYWRvdzogMXB4IDFweCAzcHggI0IwQjBCMCBpbnNldCwgLTFweCAtMXB4IDNweCAjQjBCMEIwIGluc2V0OwogICAgfQoKICAgIC5mYy10b29sYmFyIGgyIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBtYXJnaW4tdG9wOiA2cHg7CiAgICB9CgogICAgLmZjLXZpZXcgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNGREZERkQ7CiAgICB9CgogICAgLmZjLXZpZXcgdGFibGUgdGhlYWQuZmMtaGVhZCB7CiAgICAgICAgYmFja2dyb3VuZDogI0VFRUVFRTsKICAgIH0KCiAgICAuZmMtdmlldyB0YWJsZSB0aGVhZC5mYy1oZWFkIHRoLmZjLXdpZGdldC1oZWFkZXIgewogICAgICAgIGNvbG9yOiAjNEI0QjRCOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKICAgIH0KCiAgICAuZmMtZm9sbG93aW5nIHsKICAgICAgICBwYWRkaW5nLXRvcDogMnB4ICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLmZjLXdpZGdldC1oZWFkZXIgLmZjLWZvbGxvd2luZyB7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBwYWRkaW5nLXRvcDogMXB4ICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLldlZWtOdW1iZXIsCiAgICAuZmMtd2Vlay1udW1iZXIgewogICAgICAgIGNvbG9yOiAjQjBCMEIwICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLmZjLXJlc291cmNlLWFyZWEgfiAuZmMtdGltZS1hcmVhIC5mYy1mb2xsb3dpbmcgewogICAgICAgIHBhZGRpbmctdG9wOiAxcHggIWltcG9ydGFudDsKICAgIH0KCiAgICAuZmMtbW9udGgtdmlldyB0aC5mYy13aWRnZXQtaGVhZGVyLAogICAgLmZjLWFnZW5kYS12aWV3IHRoLmZjLXdpZGdldC1oZWFkZXIgewogICAgICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDNweDsKICAgIH0KCiAgICAuZmMtbHRyIC5mYy10aW1lLWdyaWQgLmZjLWV2ZW50LWNvbnRhaW5lciB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7CiAgICB9CgogICAgLmZjLXRpbWUtYXJlYSAuZmMtZXZlbnQtY29udGFpbmVyIHsKICAgICAgICB0b3A6IDJweDsKICAgIH0KCiAgICAuZmMgLmZjLXRvZGF5IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGMUFCOwogICAgfQoKICAgIC51aS1hdXRvY29tcGxldGUgewogICAgICAgIHotaW5kZXg6IDQwMDAgIWltcG9ydGFudDsKICAgIH0KCiAgICAuQnV0dG9uVGFibGUgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgICBtYXJnaW4tbGVmdDogNXB4OwogICAgfQoKICAgIC5CdXR0b25UYWJsZSBidXR0b24gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgfQoKICAgIC5CdXR0b25UYWJsZSAuZmMgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7CiAgICB9CgogICAgLkZpZWxkSW5saW5lIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgY29sb3I6ICMwMDA7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDsKICAgIH0KCiAgICAjQ29udGV4dFNldHRpbmdzRGlhbG9nUmVzb3VyY2VPdmVydmlldyB7CiAgICAgICAgbWF4LWhlaWdodDogNjAwcHg7CiAgICAgICAgd2lkdGg6IDk1MHB4OwogICAgfQoKICAgICNSZXN0b3JlRGVmYXVsdFNldHRpbmdzIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICB9CgogICAgdHI6aG92ZXIgdGQgYSNSZXN0b3JlRGVmYXVsdFNldHRpbmdzIGkgewogICAgICAgIGNvbG9yOiAjOTk5OwogICAgfQoKICAgIHRyIHRkIGEjUmVzdG9yZURlZmF1bHRTZXR0aW5nczpob3ZlciBpIHsKICAgICAgICBjb2xvcjogIzAwMDsKICAgIH0KCiAgICAuRmllbGQuSW5mbyBhIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgIH0KCiAgICAuRmllbGQgYS5CdXR0b246YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgfQoKICAgIC5GaWVsZCBhLkJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogaW5saW5lOwogICAgICAgIHBhZGRpbmc6IDNweCA3cHg7CiAgICB9CgogICAgLkZpZWxkIGEuQnV0dG9uOmhvdmVyIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICB9CgogICAgLkZpZWxkLkluZm8gYS5CdXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMzRTZDN0M7CiAgICB9CgogICAgLkZpZWxkLkluZm8gYS5CdXR0b246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM0QjdDOEU7CiAgICB9CgogICAgLkZpZWxkLkluZm8gYS5CdXR0b24gaSB7CiAgICAgICAgY29sb3I6ICM4OUM2RDE7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb250LUF3ZXNvbWUgY2hhcmFjdGVyIGNsYXNzZXMKICAgICAqLwogICAgLmZhLWNoYXItYTpiZWZvcmUsIC5mYS1jaGFyLWI6YmVmb3JlLCAuZmEtY2hhci1jOmJlZm9yZSwgLmZhLWNoYXItZDpiZWZvcmUsIC5mYS1jaGFyLWU6YmVmb3JlLAogICAgLmZhLWNoYXItZjpiZWZvcmUsIC5mYS1jaGFyLWc6YmVmb3JlLCAuZmEtY2hhci1oOmJlZm9yZSwgLmZhLWNoYXItaTpiZWZvcmUsIC5mYS1jaGFyLWo6YmVmb3JlLAogICAgLmZhLWNoYXItazpiZWZvcmUsIC5mYS1jaGFyLWw6YmVmb3JlLCAuZmEtY2hhci1tOmJlZm9yZSwgLmZhLWNoYXItbjpiZWZvcmUsIC5mYS1jaGFyLW86YmVmb3JlLAogICAgLmZhLWNoYXItcDpiZWZvcmUsIC5mYS1jaGFyLXE6YmVmb3JlLCAuZmEtY2hhci1yOmJlZm9yZSwgLmZhLWNoYXItczpiZWZvcmUsIC5mYS1jaGFyLXQ6YmVmb3JlLAogICAgLmZhLWNoYXItdTpiZWZvcmUsIC5mYS1jaGFyLXY6YmVmb3JlLCAuZmEtY2hhci13OmJlZm9yZSwgLmZhLWNoYXIteDpiZWZvcmUsIC5mYS1jaGFyLXk6YmVmb3JlLAogICAgLmZhLWNoYXItejpiZWZvcmUsIC5mYS1jaGFyLTA6YmVmb3JlLCAuZmEtY2hhci0xOmJlZm9yZSwgLmZhLWNoYXItMjpiZWZvcmUsIC5mYS1jaGFyLTM6YmVmb3JlLAogICAgLmZhLWNoYXItNDpiZWZvcmUsIC5mYS1jaGFyLTU6YmVmb3JlLCAuZmEtY2hhci02OmJlZm9yZSwgLmZhLWNoYXItNzpiZWZvcmUsIC5mYS1jaGFyLTg6YmVmb3JlLAogICAgLmZhLWNoYXItOTpiZWZvcmUgewogICAgICAgIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgfQogICAgLmZhLWNoYXItYTpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJBIjsKICAgIH0KICAgIC5mYS1jaGFyLWI6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiQiI7CiAgICB9CiAgICAuZmEtY2hhci1jOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIkMiOwogICAgfQogICAgLmZhLWNoYXItZDpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJEIjsKICAgIH0KICAgIC5mYS1jaGFyLWU6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiRSI7CiAgICB9CiAgICAuZmEtY2hhci1mOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIkYiOwogICAgfQogICAgLmZhLWNoYXItZzpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJHIjsKICAgIH0KICAgIC5mYS1jaGFyLWg6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiSCI7CiAgICB9CiAgICAuZmEtY2hhci1pOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIkkiOwogICAgfQogICAgLmZhLWNoYXItajpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJKIjsKICAgIH0KICAgIC5mYS1jaGFyLWs6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiSyI7CiAgICB9CiAgICAuZmEtY2hhci1sOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIkwiOwogICAgfQogICAgLmZhLWNoYXItbTpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJNIjsKICAgIH0KICAgIC5mYS1jaGFyLW46YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiTiI7CiAgICB9CiAgICAuZmEtY2hhci1vOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIk8iOwogICAgfQogICAgLmZhLWNoYXItcDpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJQIjsKICAgIH0KICAgIC5mYS1jaGFyLXE6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiUSI7CiAgICB9CiAgICAuZmEtY2hhci1yOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIlIiOwogICAgfQogICAgLmZhLWNoYXItczpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJTIjsKICAgIH0KICAgIC5mYS1jaGFyLXQ6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiVCI7CiAgICB9CiAgICAuZmEtY2hhci11OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIlUiOwogICAgfQogICAgLmZhLWNoYXItdjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJWIjsKICAgIH0KICAgIC5mYS1jaGFyLXc6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiVyI7CiAgICB9CiAgICAuZmEtY2hhci14OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIlgiOwogICAgfQogICAgLmZhLWNoYXIteTpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJZIjsKICAgIH0KICAgIC5mYS1jaGFyLXo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiWiI7CiAgICB9CiAgICAuZmEtY2hhci0wOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIjAiOwogICAgfQogICAgLmZhLWNoYXItMTpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICIxIjsKICAgIH0KICAgIC5mYS1jaGFyLTI6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiMiI7CiAgICB9CiAgICAuZmEtY2hhci0zOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIjMiOwogICAgfQogICAgLmZhLWNoYXItNDpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICI0IjsKICAgIH0KICAgIC5mYS1jaGFyLTU6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiNSI7CiAgICB9CiAgICAuZmEtY2hhci02OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIjYiOwogICAgfQogICAgLmZhLWNoYXItNzpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICI3IjsKICAgIH0KICAgIC5mYS1jaGFyLTg6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiOCI7CiAgICB9CiAgICAuZmEtY2hhci05OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIjkiOwogICAgfQoKfSAvKiBlbmQgQG1lZGlhICovCgpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDBweCkgYW5kIChtYXgtd2lkdGg6IDEwMjRweCkgewoKICAgICNDb250ZXh0U2V0dGluZ3NEaWFsb2dSZXNvdXJjZU92ZXJ2aWV3LAogICAgI0VkaXRBcHBvaW50bWVudEZvcm0gewogICAgICAgIHdpZHRoOiBhdXRvOwogICAgfQoKfSAvKiBlbmQgQG1lZGlhICovCg==
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgQXBwb2ludG1lbnQgQ2FsZW5kYXIgQWdlbmRhIE92ZXJ2aWV3CiAqLwoKQG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uLHR2LGhhbmRoZWxkIHsKCiAgICAuQ29sb3IgewogICAgICAgIHdpZHRoOiAxNHB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI0JCQjsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMjUpOwogICAgfQoKICAgIC5CdXR0b25zIHsKICAgICAgICBtYXJnaW46IDRweCAzcHggMnB4OwogICAgfQoKICAgIC5IZWFkZXJMZWZ0LAogICAgLlJUTCAuSGVhZGVyUmlnaHQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgfQoKICAgIC5IZWFkZXJMZWZ0LkJ1dHRvbnMgYSwKICAgIC5SVEwgLkhlYWRlclJpZ2h0LkJ1dHRvbnMgYSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAzcHg7CiAgICB9CgogICAgLkhlYWRlckNlbnRlciB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIG1hcmdpbi10b3A6IDlweDsKICAgIH0KCiAgICAuSGVhZGVyQ2VudGVyIGgyIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgIH0KCiAgICAuSGVhZGVyUmlnaHQsCiAgICAuUlRMIC5IZWFkZXJMZWZ0IHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICB9CgogICAgLkhlYWRlclJpZ2h0LkJ1dHRvbnMgYSwKICAgIC5SVEwgLkhlYWRlckxlZnQuQnV0dG9ucyBhIHsKICAgICAgICBtYXJnaW4tbGVmdDogM3B4OwogICAgfQoKICAgIC5EYXRlRGl2aWRlciB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLkRhdGVEaXZpZGVyIHRkIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUVFOwogICAgICAgIGJvcmRlci10b3A6IDFweCBkb3R0ZWQgI0NDQzsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICNDQ0M7CiAgICAgICAgbGluZS1oZWlnaHQ6IDJlbTsKICAgIH0KCiAgICAuRGF0ZURpdmlkZXIuRmlyc3QgPiB0ZCB7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgIH0KCiAgICAuVGFibGVTbWFsbCB0Ym9keSB0ci5EYXRlRGl2aWRlcjpob3ZlciB0ZCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0VFRTsKICAgIH0KCiAgICAuT3ZlcnZpZXdDb250cm9sLkxvYWRpbmcgLkNvbnRyb2xSb3cgewogICAgICAgIGJhY2tncm91bmQ6ICNEREQgdXJsKCIuLi9pbWcvbG9hZGVyLmdpZiIpIG5vLXJlcGVhdCByaWdodCA1cHggY2VudGVyOwogICAgfQoKICAgIC5SVEwgLk92ZXJ2aWV3Q29udHJvbC5Mb2FkaW5nIC5Db250cm9sUm93IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjREREIHVybCgiLi4vaW1nL2xvYWRlci5naWYiKSBuby1yZXBlYXQgbGVmdCA1cHggY2VudGVyOwogICAgfQoKfSAvKiBlbmQgQG1lZGlhICovCg==
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgQXBwb2ludG1lbnQgQ2FsZW5kYXIgTWFuYWdlCiAqLwoKQG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uLHR2LGhhbmRoZWxkIHsKCiAgICAuV2lkZ2V0U2ltcGxlIGZpZWxkc2V0LlNlcGFyYXRlZCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0U5RTlFOTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDQ0NDOwogICAgICAgIG1hcmdpbjogOXB4IDA7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgfQoKICAgIC5JbmxpbmVCdXR0b24gewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgcGFkZGluZzogMDsKICAgIH0KCiAgICB0ci5JbnZhbGlkIC5Eb3dubG9hZExpbmssCiAgICB0ci5JbnZhbGlkIC5JbmxpbmVCdXR0b24gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CgogICAgLkNhbGVuZGFyQ29sb3IgewogICAgICAgIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNCQkI7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgfQoKICAgIC5JbnZhbGlkIC5DYWxlbmRhckNvbG9yIHsKICAgICAgICBvcGFjaXR5OiAwLjM7CiAgICB9CgogICAgLyoqCiAgICAgKiBTcGVjdHJ1bSBDb2xvciBwaWNrZXIKICAgICAqLwogICAgLkNvbG9yUGFsZXR0ZUJ1dHRvbi5zcC1yZXBsYWNlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRjsKICAgICAgICBib3gtc2hhZG93OiAxcHggMXB4IDNweCAjRUVFIGluc2V0LCAtMXB4IC0xcHggM3B4ICNFRUUgaW5zZXQ7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjQzBDMEMwICNDOUM5QzkgI0M5QzlDOTsKICAgICAgICBwYWRkaW5nOiAzcHggNHB4ICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUJ1dHRvbi5zcC1yZXBsYWNlcjpob3ZlciB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjQzBDMEMwICNDOUM5QzkgI0M5QzlDOTsKICAgIH0KCiAgICAuQ29sb3JQYWxldHRlQnV0dG9uLnNwLXJlcGxhY2VyOmZvY3VzLAogICAgLkNvbG9yUGFsZXR0ZUJ1dHRvbi5zcC1yZXBsYWNlci5zcC1hY3RpdmUgewogICAgICAgIGJvcmRlci1jb2xvcjogI0Y5MjsKICAgIH0KCiAgICAuQ29sb3JQYWxldHRlQnV0dG9uIC5zcC1wcmV2aWV3IHsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVCdXR0b24gLnNwLXByZXZpZXctaW5uZXIsCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyIC5zcC10aHVtYi1pbm5lciB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI0JCQjsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMjUpOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIgLnNwLXRodW1iLWlubmVyOmhvdmVyIHsKICAgICAgICBib3JkZXItY29sb3I6ICNGOTI7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUJ1dHRvbiAuc3AtZGQgewogICAgICAgIGZvbnQtc2l6ZTogOXB4OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiA4cHg7CiAgICAgICAgcGFkZGluZzogNHB4IDA7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIsCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyLnNwLWNvbnRhaW5lciBidXR0b24sCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyLnNwLWNvbnRhaW5lciBpbnB1dCB7CiAgICAgICAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIgewogICAgICAgIGJvcmRlci1jb2xvcjogI0MwQzBDMCAjQzlDOUM5ICNDOUM5Qzk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRjsKICAgIH0KCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyLnNwLWNvbnRhaW5lciBidXR0b24gewogICAgICAgIGNvbG9yOiAjMzMzOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICAgICAgbWluLWhlaWdodDogMTJweDsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgICAgYmFja2dyb3VuZDogI0VFRTsKICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNCQkI7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgZWFzZS1pbiAwLjJzOwogICAgICAgIHRleHQtc2hhZG93OiAwIDFweCAwICNFRUU7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIgYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNFNUU1RTU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjOTk5OwogICAgICAgIGNvbG9yOiAjMDAwOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIuc3AtY29udGFpbmVyIGlucHV0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgfQogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIgLnNwLWlucHV0LnNwLXZhbGlkYXRpb24tZXJyb3IgewogICAgICAgIGJhY2tncm91bmQ6ICNGRkY7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIgLnNwLWNhbmNlbCB7CiAgICAgICAgY29sb3I6ICNGOTIgIWltcG9ydGFudDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIgLnNwLWNhbmNlbDpob3ZlciB7CiAgICAgICAgY29sb3I6ICNGNzIgIWltcG9ydGFudDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lciAuc3AtcGFsZXR0ZS1jb250YWluZXIsCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyIC5zcC1waWNrZXItY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nOiA1cHggNXB4IDI5NXB4OwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIgLnNwLXBhbGV0dGUtdG9nZ2xlIHsKICAgICAgICBtYXJnaW4tdG9wOiAzcHg7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lciAuc3AtcGFsZXR0ZSB7CiAgICAgICAgbWF4LXdpZHRoOiAyNDBweDsKICAgIH0KCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyIC5zcC1wYWxldHRlIC5zcC10aHVtYi1lbCB7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIG1hcmdpbjogMnB4OwogICAgfQoKICAgIGlucHV0W3JlYWRvbmx5XSArIC5Db2xvclBhbGV0dGVCdXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNEREQ7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB9Cgp9IC8qIGVuZCBAbWVkaWEgKi8K
LyohCiAqIEZ1bGxDYWxlbmRhciB2My4wLjEKICogRG9jcyAmIExpY2Vuc2U6IGh0dHA6Ly9mdWxsY2FsZW5kYXIuaW8vCiAqIChjKSAyMDE2IEFkYW0gU2hhdwogKi8KCihmdW5jdGlvbihmYWN0b3J5KSB7CglpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CgkJZGVmaW5lKFsgJ2pxdWVyeScsICdtb21lbnQnIF0sIGZhY3RvcnkpOwoJfQoJZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7IC8vIE5vZGUvQ29tbW9uSlMKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ21vbWVudCcpKTsKCX0KCWVsc2UgewoJCWZhY3RvcnkoalF1ZXJ5LCBtb21lbnQpOwoJfQp9KShmdW5jdGlvbigkLCBtb21lbnQpIHsKCjs7Cgp2YXIgRkMgPSAkLmZ1bGxDYWxlbmRhciA9IHsKCXZlcnNpb246ICIzLjAuMSIsCglpbnRlcm5hbEFwaVZlcnNpb246IDYKfTsKdmFyIGZjVmlld3MgPSBGQy52aWV3cyA9IHt9OwoKCiQuZm4uZnVsbENhbGVuZGFyID0gZnVuY3Rpb24ob3B0aW9ucykgewoJdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOyAvLyBmb3IgYSBwb3NzaWJsZSBtZXRob2QgY2FsbAoJdmFyIHJlcyA9IHRoaXM7IC8vIHdoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAodGhpcyBqUXVlcnkgb2JqZWN0IGJ5IGRlZmF1bHQpCgoJdGhpcy5lYWNoKGZ1bmN0aW9uKGksIF9lbGVtZW50KSB7IC8vIGxvb3AgZWFjaCBET00gZWxlbWVudCBpbnZvbHZlZAoJCXZhciBlbGVtZW50ID0gJChfZWxlbWVudCk7CgkJdmFyIGNhbGVuZGFyID0gZWxlbWVudC5kYXRhKCdmdWxsQ2FsZW5kYXInKTsgLy8gZ2V0IHRoZSBleGlzdGluZyBjYWxlbmRhciBvYmplY3QgKGlmIGFueSkKCQl2YXIgc2luZ2xlUmVzOyAvLyB0aGUgcmV0dXJuZWQgdmFsdWUgb2YgdGhpcyBzaW5nbGUgbWV0aG9kIGNhbGwKCgkJLy8gYSBtZXRob2QgY2FsbAoJCWlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHsKCQkJaWYgKGNhbGVuZGFyICYmICQuaXNGdW5jdGlvbihjYWxlbmRhcltvcHRpb25zXSkpIHsKCQkJCXNpbmdsZVJlcyA9IGNhbGVuZGFyW29wdGlvbnNdLmFwcGx5KGNhbGVuZGFyLCBhcmdzKTsKCQkJCWlmICghaSkgewoJCQkJCXJlcyA9IHNpbmdsZVJlczsgLy8gcmVjb3JkIHRoZSBmaXJzdCBtZXRob2QgY2FsbCByZXN1bHQKCQkJCX0KCQkJCWlmIChvcHRpb25zID09PSAnZGVzdHJveScpIHsgLy8gZm9yIHRoZSBkZXN0cm95IG1ldGhvZCwgbXVzdCByZW1vdmUgQ2FsZW5kYXIgb2JqZWN0IGRhdGEKCQkJCQllbGVtZW50LnJlbW92ZURhdGEoJ2Z1bGxDYWxlbmRhcicpOwoJCQkJfQoJCQl9CgkJfQoJCS8vIGEgbmV3IGNhbGVuZGFyIGluaXRpYWxpemF0aW9uCgkJZWxzZSBpZiAoIWNhbGVuZGFyKSB7IC8vIGRvbid0IGluaXRpYWxpemUgdHdpY2UKCQkJY2FsZW5kYXIgPSBuZXcgQ2FsZW5kYXIoZWxlbWVudCwgb3B0aW9ucyk7CgkJCWVsZW1lbnQuZGF0YSgnZnVsbENhbGVuZGFyJywgY2FsZW5kYXIpOwoJCQljYWxlbmRhci5yZW5kZXIoKTsKCQl9Cgl9KTsKCQoJcmV0dXJuIHJlczsKfTsKCgp2YXIgY29tcGxleE9wdGlvbnMgPSBbIC8vIG5hbWVzIG9mIG9wdGlvbnMgdGhhdCBhcmUgb2JqZWN0cyB3aG9zZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBjb21iaW5lZAoJJ2hlYWRlcicsCgknYnV0dG9uVGV4dCcsCgknYnV0dG9uSWNvbnMnLAoJJ3RoZW1lQnV0dG9uSWNvbnMnCl07CgoKLy8gTWVyZ2VzIGFuIGFycmF5IG9mIG9wdGlvbiBvYmplY3RzIGludG8gYSBzaW5nbGUgb2JqZWN0CmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyhvcHRpb25PYmpzKSB7CglyZXR1cm4gbWVyZ2VQcm9wcyhvcHRpb25PYmpzLCBjb21wbGV4T3B0aW9ucyk7Cn0KCjs7CgovLyBleHBvcnRzCkZDLmludGVyc2VjdFJhbmdlcyA9IGludGVyc2VjdFJhbmdlczsKRkMuYXBwbHlBbGwgPSBhcHBseUFsbDsKRkMuZGVib3VuY2UgPSBkZWJvdW5jZTsKRkMuaXNJbnQgPSBpc0ludDsKRkMuaHRtbEVzY2FwZSA9IGh0bWxFc2NhcGU7CkZDLmNzc1RvU3RyID0gY3NzVG9TdHI7CkZDLnByb3h5ID0gcHJveHk7CkZDLmNhcGl0YWxpc2VGaXJzdExldHRlciA9IGNhcGl0YWxpc2VGaXJzdExldHRlcjsKCgovKiBGdWxsQ2FsZW5kYXItc3BlY2lmaWMgRE9NIFV0aWxpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgovLyBHaXZlbiB0aGUgc2Nyb2xsYmFyIHdpZHRocyBvZiBzb21lIG90aGVyIGNvbnRhaW5lciwgY3JlYXRlIGJvcmRlcnMvbWFyZ2lucyBvbiByb3dFbHMgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIGxlZnQKLy8gYW5kIHJpZ2h0IHNwYWNlIHRoYXQgd2FzIG9mZnNldCBieSB0aGUgc2Nyb2xsYmFycy4gQSAxLXBpeGVsIGJvcmRlciBmaXJzdCwgdGhlbiBtYXJnaW4gYmV5b25kIHRoYXQuCmZ1bmN0aW9uIGNvbXBlbnNhdGVTY3JvbGwocm93RWxzLCBzY3JvbGxiYXJXaWR0aHMpIHsKCWlmIChzY3JvbGxiYXJXaWR0aHMubGVmdCkgewoJCXJvd0Vscy5jc3MoewoJCQknYm9yZGVyLWxlZnQtd2lkdGgnOiAxLAoJCQknbWFyZ2luLWxlZnQnOiBzY3JvbGxiYXJXaWR0aHMubGVmdCAtIDEKCQl9KTsKCX0KCWlmIChzY3JvbGxiYXJXaWR0aHMucmlnaHQpIHsKCQlyb3dFbHMuY3NzKHsKCQkJJ2JvcmRlci1yaWdodC13aWR0aCc6IDEsCgkJCSdtYXJnaW4tcmlnaHQnOiBzY3JvbGxiYXJXaWR0aHMucmlnaHQgLSAxCgkJfSk7Cgl9Cn0KCgovLyBVbmRvZXMgY29tcGVuc2F0ZVNjcm9sbCBhbmQgcmVzdG9yZXMgYWxsIGJvcmRlcnMvbWFyZ2lucwpmdW5jdGlvbiB1bmNvbXBlbnNhdGVTY3JvbGwocm93RWxzKSB7Cglyb3dFbHMuY3NzKHsKCQknbWFyZ2luLWxlZnQnOiAnJywKCQknbWFyZ2luLXJpZ2h0JzogJycsCgkJJ2JvcmRlci1sZWZ0LXdpZHRoJzogJycsCgkJJ2JvcmRlci1yaWdodC13aWR0aCc6ICcnCgl9KTsKfQoKCi8vIE1ha2UgdGhlIG1vdXNlIGN1cnNvciBleHByZXNzIHRoYXQgYW4gZXZlbnQgaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQgYXJlYQpmdW5jdGlvbiBkaXNhYmxlQ3Vyc29yKCkgewoJJCgnYm9keScpLmFkZENsYXNzKCdmYy1ub3QtYWxsb3dlZCcpOwp9CgoKLy8gUmV0dXJucyB0aGUgbW91c2UgY3Vyc29yIHRvIGl0cyBvcmlnaW5hbCBsb29rCmZ1bmN0aW9uIGVuYWJsZUN1cnNvcigpIHsKCSQoJ2JvZHknKS5yZW1vdmVDbGFzcygnZmMtbm90LWFsbG93ZWQnKTsKfQoKCi8vIEdpdmVuIGEgdG90YWwgYXZhaWxhYmxlIGhlaWdodCB0byBmaWxsLCBoYXZlIGBlbHNgIChlc3NlbnRpYWxseSBjaGlsZCByb3dzKSBleHBhbmQgdG8gYWNjb21vZGF0ZS4KLy8gQnkgZGVmYXVsdCwgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIHNob3J0ZXIgdGhhbiB0aGUgcmVjb21tZW5kZWQgaGVpZ2h0IGFyZSBleHBhbmRlZCB1bmlmb3JtbHksIG5vdCBjb25zaWRlcmluZwovLyBhbnkgb3RoZXIgZWxzIHRoYXQgYXJlIGFscmVhZHkgdG9vIHRhbGwuIGlmIGBzaG91bGRSZWRpc3RyaWJ1dGVgIGlzIG9uLCBpdCBjb25zaWRlcnMgdGhlc2UgdGFsbCByb3dzIGFuZCAKLy8gcmVkdWNlcyB0aGUgYXZhaWxhYmxlIGhlaWdodC4KZnVuY3Rpb24gZGlzdHJpYnV0ZUhlaWdodChlbHMsIGF2YWlsYWJsZUhlaWdodCwgc2hvdWxkUmVkaXN0cmlidXRlKSB7CgoJLy8gKkZMT09SSU5HIE5PVEUqOiB3ZSBmbG9vciBpbiBjZXJ0YWluIHBsYWNlcyBiZWNhdXNlIHpvb20gY2FuIGdpdmUgaW5hY2N1cmF0ZSBmbG9hdGluZy1wb2ludCBkaW1lbnNpb25zLAoJLy8gYW5kIGl0IGlzIGJldHRlciB0byBiZSBzaG9ydGVyIHRoYW4gdGFsbGVyLCB0byBhdm9pZCBjcmVhdGluZyB1bm5lY2Vzc2FyeSBzY3JvbGxiYXJzLgoKCXZhciBtaW5PZmZzZXQxID0gTWF0aC5mbG9vcihhdmFpbGFibGVIZWlnaHQgLyBlbHMubGVuZ3RoKTsgLy8gZm9yIG5vbi1sYXN0IGVsZW1lbnQKCXZhciBtaW5PZmZzZXQyID0gTWF0aC5mbG9vcihhdmFpbGFibGVIZWlnaHQgLSBtaW5PZmZzZXQxICogKGVscy5sZW5ndGggLSAxKSk7IC8vIGZvciBsYXN0IGVsZW1lbnQgKkZMT09SSU5HIE5PVEUqCgl2YXIgZmxleEVscyA9IFtdOyAvLyBlbGVtZW50cyB0aGF0IGFyZSBhbGxvd2VkIHRvIGV4cGFuZC4gYXJyYXkgb2YgRE9NIG5vZGVzCgl2YXIgZmxleE9mZnNldHMgPSBbXTsgLy8gYW1vdW50IG9mIHZlcnRpY2FsIHNwYWNlIGl0IHRha2VzIHVwCgl2YXIgZmxleEhlaWdodHMgPSBbXTsgLy8gYWN0dWFsIGNzcyBoZWlnaHQKCXZhciB1c2VkSGVpZ2h0ID0gMDsKCgl1bmRpc3RyaWJ1dGVIZWlnaHQoZWxzKTsgLy8gZ2l2ZSBhbGwgZWxlbWVudHMgdGhlaXIgbmF0dXJhbCBoZWlnaHQKCgkvLyBmaW5kIGVsZW1lbnRzIHRoYXQgYXJlIGJlbG93IHRoZSByZWNvbW1lbmRlZCBoZWlnaHQgKGV4cGFuZGFibGUpLgoJLy8gaW1wb3J0YW50IHRvIHF1ZXJ5IGZvciBoZWlnaHRzIGluIGEgc2luZ2xlIGZpcnN0IHBhc3MgKHRvIGF2b2lkIHJlZmxvdyBvc2NpbGxhdGlvbikuCgllbHMuZWFjaChmdW5jdGlvbihpLCBlbCkgewoJCXZhciBtaW5PZmZzZXQgPSBpID09PSBlbHMubGVuZ3RoIC0gMSA/IG1pbk9mZnNldDIgOiBtaW5PZmZzZXQxOwoJCXZhciBuYXR1cmFsT2Zmc2V0ID0gJChlbCkub3V0ZXJIZWlnaHQodHJ1ZSk7CgoJCWlmIChuYXR1cmFsT2Zmc2V0IDwgbWluT2Zmc2V0KSB7CgkJCWZsZXhFbHMucHVzaChlbCk7CgkJCWZsZXhPZmZzZXRzLnB1c2gobmF0dXJhbE9mZnNldCk7CgkJCWZsZXhIZWlnaHRzLnB1c2goJChlbCkuaGVpZ2h0KCkpOwoJCX0KCQllbHNlIHsKCQkJLy8gdGhpcyBlbGVtZW50IHN0cmV0Y2hlcyBwYXN0IHJlY29tbWVuZGVkIGhlaWdodCAobm9uLWV4cGFuZGFibGUpLiBtYXJrIHRoZSBzcGFjZSBhcyBvY2N1cGllZC4KCQkJdXNlZEhlaWdodCArPSBuYXR1cmFsT2Zmc2V0OwoJCX0KCX0pOwoKCS8vIHJlYWRqdXN0IHRoZSByZWNvbW1lbmRlZCBoZWlnaHQgdG8gb25seSBjb25zaWRlciB0aGUgaGVpZ2h0IGF2YWlsYWJsZSB0byBub24tbWF4ZWQtb3V0IHJvd3MuCglpZiAoc2hvdWxkUmVkaXN0cmlidXRlKSB7CgkJYXZhaWxhYmxlSGVpZ2h0IC09IHVzZWRIZWlnaHQ7CgkJbWluT2Zmc2V0MSA9IE1hdGguZmxvb3IoYXZhaWxhYmxlSGVpZ2h0IC8gZmxleEVscy5sZW5ndGgpOwoJCW1pbk9mZnNldDIgPSBNYXRoLmZsb29yKGF2YWlsYWJsZUhlaWdodCAtIG1pbk9mZnNldDEgKiAoZmxleEVscy5sZW5ndGggLSAxKSk7IC8vICpGTE9PUklORyBOT1RFKgoJfQoKCS8vIGFzc2lnbiBoZWlnaHRzIHRvIGFsbCBleHBhbmRhYmxlIGVsZW1lbnRzCgkkKGZsZXhFbHMpLmVhY2goZnVuY3Rpb24oaSwgZWwpIHsKCQl2YXIgbWluT2Zmc2V0ID0gaSA9PT0gZmxleEVscy5sZW5ndGggLSAxID8gbWluT2Zmc2V0MiA6IG1pbk9mZnNldDE7CgkJdmFyIG5hdHVyYWxPZmZzZXQgPSBmbGV4T2Zmc2V0c1tpXTsKCQl2YXIgbmF0dXJhbEhlaWdodCA9IGZsZXhIZWlnaHRzW2ldOwoJCXZhciBuZXdIZWlnaHQgPSBtaW5PZmZzZXQgLSAobmF0dXJhbE9mZnNldCAtIG5hdHVyYWxIZWlnaHQpOyAvLyBzdWJ0cmFjdCB0aGUgbWFyZ2luL3BhZGRpbmcKCgkJaWYgKG5hdHVyYWxPZmZzZXQgPCBtaW5PZmZzZXQpIHsgLy8gd2UgY2hlY2sgdGhpcyBhZ2FpbiBiZWNhdXNlIHJlZGlzdHJpYnV0aW9uIG1pZ2h0IGhhdmUgY2hhbmdlZCB0aGluZ3MKCQkJJChlbCkuaGVpZ2h0KG5ld0hlaWdodCk7CgkJfQoJfSk7Cn0KCgovLyBVbmRvZXMgZGlzdHJ1YnV0ZUhlaWdodCwgcmVzdG9yaW5nIGFsbCBlbHMgdG8gdGhlaXIgbmF0dXJhbCBoZWlnaHQKZnVuY3Rpb24gdW5kaXN0cmlidXRlSGVpZ2h0KGVscykgewoJZWxzLmhlaWdodCgnJyk7Cn0KCgovLyBHaXZlbiBgZWxzYCwgYSBqUXVlcnkgc2V0IG9mIDx0ZD4gY2VsbHMsIGZpbmQgdGhlIGNlbGwgd2l0aCB0aGUgbGFyZ2VzdCBuYXR1cmFsIHdpZHRoIGFuZCBzZXQgdGhlIHdpZHRocyBvZiBhbGwgdGhlCi8vIGNlbGxzIHRvIGJlIHRoYXQgd2lkdGguCi8vIFBSRVJFUVVJU0lURTogaWYgeW91IHdhbnQgYSBjZWxsIHRvIHRha2UgdXAgd2lkdGgsIGl0IG5lZWRzIHRvIGhhdmUgYSBzaW5nbGUgaW5uZXIgZWxlbWVudCB3LyBkaXNwbGF5OmlubGluZQpmdW5jdGlvbiBtYXRjaENlbGxXaWR0aHMoZWxzKSB7Cgl2YXIgbWF4SW5uZXJXaWR0aCA9IDA7CgoJZWxzLmZpbmQoJz4gKicpLmVhY2goZnVuY3Rpb24oaSwgaW5uZXJFbCkgewoJCXZhciBpbm5lcldpZHRoID0gJChpbm5lckVsKS5vdXRlcldpZHRoKCk7CgkJaWYgKGlubmVyV2lkdGggPiBtYXhJbm5lcldpZHRoKSB7CgkJCW1heElubmVyV2lkdGggPSBpbm5lcldpZHRoOwoJCX0KCX0pOwoKCW1heElubmVyV2lkdGgrKzsgLy8gc29tZXRpbWVzIG5vdCBhY2N1cmF0ZSBvZiB3aWR0aCB0aGUgdGV4dCBuZWVkcyB0byBzdGF5IG9uIG9uZSBsaW5lLiBpbnN1cmFuY2UKCgllbHMud2lkdGgobWF4SW5uZXJXaWR0aCk7CgoJcmV0dXJuIG1heElubmVyV2lkdGg7Cn0KCgovLyBHaXZlbiBvbmUgZWxlbWVudCB0aGF0IHJlc2lkZXMgaW5zaWRlIGFub3RoZXIsCi8vIFN1YnRyYWN0cyB0aGUgaGVpZ2h0IG9mIHRoZSBpbm5lciBlbGVtZW50IGZyb20gdGhlIG91dGVyIGVsZW1lbnQuCmZ1bmN0aW9uIHN1YnRyYWN0SW5uZXJFbEhlaWdodChvdXRlckVsLCBpbm5lckVsKSB7Cgl2YXIgYm90aCA9IG91dGVyRWwuYWRkKGlubmVyRWwpOwoJdmFyIGRpZmY7CgoJLy8gZWZmaW4nIElFOC85LzEwLzExIHNvbWV0aW1lcyByZXR1cm5zIDAgZm9yIGRpbWVuc2lvbnMuIHRoaXMgd2VpcmQgaGFjayB3YXMgdGhlIG9ubHkgdGhpbmcgdGhhdCB3b3JrZWQKCWJvdGguY3NzKHsKCQlwb3NpdGlvbjogJ3JlbGF0aXZlJywgLy8gY2F1c2UgYSByZWZsb3csIHdoaWNoIHdpbGwgZm9yY2UgZnJlc2ggZGltZW5zaW9uIHJlY2FsY3VsYXRpb24KCQlsZWZ0OiAtMSAvLyBlbnN1cmUgcmVmbG93IGluIGNhc2UgdGhlIGVsIHdhcyBhbHJlYWR5IHJlbGF0aXZlLiBuZWdhdGl2ZSBpcyBsZXNzIGxpa2VseSB0byBjYXVzZSBuZXcgc2Nyb2xsCgl9KTsKCWRpZmYgPSBvdXRlckVsLm91dGVySGVpZ2h0KCkgLSBpbm5lckVsLm91dGVySGVpZ2h0KCk7IC8vIGdyYWIgdGhlIGRpbWVuc2lvbnMKCWJvdGguY3NzKHsgcG9zaXRpb246ICcnLCBsZWZ0OiAnJyB9KTsgLy8gdW5kbyBoYWNrCgoJcmV0dXJuIGRpZmY7Cn0KCgovKiBFbGVtZW50IEdlb20gVXRpbGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKRkMuZ2V0T3V0ZXJSZWN0ID0gZ2V0T3V0ZXJSZWN0OwpGQy5nZXRDbGllbnRSZWN0ID0gZ2V0Q2xpZW50UmVjdDsKRkMuZ2V0Q29udGVudFJlY3QgPSBnZXRDb250ZW50UmVjdDsKRkMuZ2V0U2Nyb2xsYmFyV2lkdGhzID0gZ2V0U2Nyb2xsYmFyV2lkdGhzOwoKCi8vIGJvcnJvd2VkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkvYmxvYi8xLjExLjAvdWkvY29yZS5qcyNMNTEKZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KGVsKSB7Cgl2YXIgcG9zaXRpb24gPSBlbC5jc3MoJ3Bvc2l0aW9uJyksCgkJc2Nyb2xsUGFyZW50ID0gZWwucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJdmFyIHBhcmVudCA9ICQodGhpcyk7CgkJCXJldHVybiAoLyhhdXRvfHNjcm9sbCkvKS50ZXN0KAoJCQkJcGFyZW50LmNzcygnb3ZlcmZsb3cnKSArIHBhcmVudC5jc3MoJ292ZXJmbG93LXknKSArIHBhcmVudC5jc3MoJ292ZXJmbG93LXgnKQoJCQkpOwoJCX0pLmVxKDApOwoKCXJldHVybiBwb3NpdGlvbiA9PT0gJ2ZpeGVkJyB8fCAhc2Nyb2xsUGFyZW50Lmxlbmd0aCA/ICQoZWxbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkgOiBzY3JvbGxQYXJlbnQ7Cn0KCgovLyBRdWVyaWVzIHRoZSBvdXRlciBib3VuZGluZyBhcmVhIG9mIGEgalF1ZXJ5IGVsZW1lbnQuCi8vIFJldHVybnMgYSByZWN0YW5nbGUgd2l0aCBhYnNvbHV0ZSBjb29yZGluYXRlczogbGVmdCwgcmlnaHQgKGV4Y2x1c2l2ZSksIHRvcCwgYm90dG9tIChleGNsdXNpdmUpLgovLyBPcmlnaW4gaXMgb3B0aW9uYWwuCmZ1bmN0aW9uIGdldE91dGVyUmVjdChlbCwgb3JpZ2luKSB7Cgl2YXIgb2Zmc2V0ID0gZWwub2Zmc2V0KCk7Cgl2YXIgbGVmdCA9IG9mZnNldC5sZWZ0IC0gKG9yaWdpbiA/IG9yaWdpbi5sZWZ0IDogMCk7Cgl2YXIgdG9wID0gb2Zmc2V0LnRvcCAtIChvcmlnaW4gPyBvcmlnaW4udG9wIDogMCk7CgoJcmV0dXJuIHsKCQlsZWZ0OiBsZWZ0LAoJCXJpZ2h0OiBsZWZ0ICsgZWwub3V0ZXJXaWR0aCgpLAoJCXRvcDogdG9wLAoJCWJvdHRvbTogdG9wICsgZWwub3V0ZXJIZWlnaHQoKQoJfTsKfQoKCi8vIFF1ZXJpZXMgdGhlIGFyZWEgd2l0aGluIHRoZSBtYXJnaW4vYm9yZGVyL3Njcm9sbGJhcnMgb2YgYSBqUXVlcnkgZWxlbWVudC4gRG9lcyBub3QgZ28gd2l0aGluIHRoZSBwYWRkaW5nLgovLyBSZXR1cm5zIGEgcmVjdGFuZ2xlIHdpdGggYWJzb2x1dGUgY29vcmRpbmF0ZXM6IGxlZnQsIHJpZ2h0IChleGNsdXNpdmUpLCB0b3AsIGJvdHRvbSAoZXhjbHVzaXZlKS4KLy8gT3JpZ2luIGlzIG9wdGlvbmFsLgovLyBOT1RFOiBzaG91bGQgdXNlIGNsaWVudExlZnQvY2xpZW50VG9wLCBidXQgdmVyeSB1bnJlbGlhYmxlIGNyb3NzLWJyb3dzZXIuCmZ1bmN0aW9uIGdldENsaWVudFJlY3QoZWwsIG9yaWdpbikgewoJdmFyIG9mZnNldCA9IGVsLm9mZnNldCgpOwoJdmFyIHNjcm9sbGJhcldpZHRocyA9IGdldFNjcm9sbGJhcldpZHRocyhlbCk7Cgl2YXIgbGVmdCA9IG9mZnNldC5sZWZ0ICsgZ2V0Q3NzRmxvYXQoZWwsICdib3JkZXItbGVmdC13aWR0aCcpICsgc2Nyb2xsYmFyV2lkdGhzLmxlZnQgLSAob3JpZ2luID8gb3JpZ2luLmxlZnQgOiAwKTsKCXZhciB0b3AgPSBvZmZzZXQudG9wICsgZ2V0Q3NzRmxvYXQoZWwsICdib3JkZXItdG9wLXdpZHRoJykgKyBzY3JvbGxiYXJXaWR0aHMudG9wIC0gKG9yaWdpbiA/IG9yaWdpbi50b3AgOiAwKTsKCglyZXR1cm4gewoJCWxlZnQ6IGxlZnQsCgkJcmlnaHQ6IGxlZnQgKyBlbFswXS5jbGllbnRXaWR0aCwgLy8gY2xpZW50V2lkdGggaW5jbHVkZXMgcGFkZGluZyBidXQgTk9UIHNjcm9sbGJhcnMKCQl0b3A6IHRvcCwKCQlib3R0b206IHRvcCArIGVsWzBdLmNsaWVudEhlaWdodCAvLyBjbGllbnRIZWlnaHQgaW5jbHVkZXMgcGFkZGluZyBidXQgTk9UIHNjcm9sbGJhcnMKCX07Cn0KCgovLyBRdWVyaWVzIHRoZSBhcmVhIHdpdGhpbiB0aGUgbWFyZ2luL2JvcmRlci9wYWRkaW5nIG9mIGEgalF1ZXJ5IGVsZW1lbnQuIEFzc3VtZWQgbm90IHRvIGhhdmUgc2Nyb2xsYmFycy4KLy8gUmV0dXJucyBhIHJlY3RhbmdsZSB3aXRoIGFic29sdXRlIGNvb3JkaW5hdGVzOiBsZWZ0LCByaWdodCAoZXhjbHVzaXZlKSwgdG9wLCBib3R0b20gKGV4Y2x1c2l2ZSkuCi8vIE9yaWdpbiBpcyBvcHRpb25hbC4KZnVuY3Rpb24gZ2V0Q29udGVudFJlY3QoZWwsIG9yaWdpbikgewoJdmFyIG9mZnNldCA9IGVsLm9mZnNldCgpOyAvLyBqdXN0IG91dHNpZGUgb2YgYm9yZGVyLCBtYXJnaW4gbm90IGluY2x1ZGVkCgl2YXIgbGVmdCA9IG9mZnNldC5sZWZ0ICsgZ2V0Q3NzRmxvYXQoZWwsICdib3JkZXItbGVmdC13aWR0aCcpICsgZ2V0Q3NzRmxvYXQoZWwsICdwYWRkaW5nLWxlZnQnKSAtCgkJKG9yaWdpbiA/IG9yaWdpbi5sZWZ0IDogMCk7Cgl2YXIgdG9wID0gb2Zmc2V0LnRvcCArIGdldENzc0Zsb2F0KGVsLCAnYm9yZGVyLXRvcC13aWR0aCcpICsgZ2V0Q3NzRmxvYXQoZWwsICdwYWRkaW5nLXRvcCcpIC0KCQkob3JpZ2luID8gb3JpZ2luLnRvcCA6IDApOwoKCXJldHVybiB7CgkJbGVmdDogbGVmdCwKCQlyaWdodDogbGVmdCArIGVsLndpZHRoKCksCgkJdG9wOiB0b3AsCgkJYm90dG9tOiB0b3AgKyBlbC5oZWlnaHQoKQoJfTsKfQoKCi8vIFJldHVybnMgdGhlIGNvbXB1dGVkIGxlZnQvcmlnaHQvdG9wL2JvdHRvbSBzY3JvbGxiYXIgd2lkdGhzIGZvciB0aGUgZ2l2ZW4galF1ZXJ5IGVsZW1lbnQuCi8vIE5PVEU6IHNob3VsZCB1c2UgY2xpZW50TGVmdC9jbGllbnRUb3AsIGJ1dCB2ZXJ5IHVucmVsaWFibGUgY3Jvc3MtYnJvd3Nlci4KZnVuY3Rpb24gZ2V0U2Nyb2xsYmFyV2lkdGhzKGVsKSB7Cgl2YXIgbGVmdFJpZ2h0V2lkdGggPSBlbC5pbm5lcldpZHRoKCkgLSBlbFswXS5jbGllbnRXaWR0aDsgLy8gdGhlIHBhZGRpbmdzIGNhbmNlbCBvdXQsIGxlYXZpbmcgdGhlIHNjcm9sbGJhcnMKCXZhciB3aWR0aHMgPSB7CgkJbGVmdDogMCwKCQlyaWdodDogMCwKCQl0b3A6IDAsCgkJYm90dG9tOiBlbC5pbm5lckhlaWdodCgpIC0gZWxbMF0uY2xpZW50SGVpZ2h0IC8vIHRoZSBwYWRkaW5ncyBjYW5jZWwgb3V0LCBsZWF2aW5nIHRoZSBib3R0b20gc2Nyb2xsYmFyCgl9OwoKCWlmIChnZXRJc0xlZnRSdGxTY3JvbGxiYXJzKCkgJiYgZWwuY3NzKCdkaXJlY3Rpb24nKSA9PSAncnRsJykgeyAvLyBpcyB0aGUgc2Nyb2xsYmFyIG9uIHRoZSBsZWZ0IHNpZGU/CgkJd2lkdGhzLmxlZnQgPSBsZWZ0UmlnaHRXaWR0aDsKCX0KCWVsc2UgewoJCXdpZHRocy5yaWdodCA9IGxlZnRSaWdodFdpZHRoOwoJfQoKCXJldHVybiB3aWR0aHM7Cn0KCgovLyBMb2dpYyBmb3IgZGV0ZXJtaW5pbmcgaWYsIHdoZW4gdGhlIGVsZW1lbnQgaXMgcmlnaHQtdG8tbGVmdCwgdGhlIHNjcm9sbGJhciBhcHBlYXJzIG9uIHRoZSBsZWZ0IHNpZGUKCnZhciBfaXNMZWZ0UnRsU2Nyb2xsYmFycyA9IG51bGw7CgpmdW5jdGlvbiBnZXRJc0xlZnRSdGxTY3JvbGxiYXJzKCkgeyAvLyByZXNwb25zaWJsZSBmb3IgY2FjaGluZyB0aGUgY29tcHV0YXRpb24KCWlmIChfaXNMZWZ0UnRsU2Nyb2xsYmFycyA9PT0gbnVsbCkgewoJCV9pc0xlZnRSdGxTY3JvbGxiYXJzID0gY29tcHV0ZUlzTGVmdFJ0bFNjcm9sbGJhcnMoKTsKCX0KCXJldHVybiBfaXNMZWZ0UnRsU2Nyb2xsYmFyczsKfQoKZnVuY3Rpb24gY29tcHV0ZUlzTGVmdFJ0bFNjcm9sbGJhcnMoKSB7IC8vIGNyZWF0ZXMgYW4gb2Zmc2NyZWVuIHRlc3QgZWxlbWVudCwgdGhlbiByZW1vdmVzIGl0Cgl2YXIgZWwgPSAkKCc8ZGl2PjxkaXYvPjwvZGl2PicpCgkJLmNzcyh7CgkJCXBvc2l0aW9uOiAnYWJzb2x1dGUnLAoJCQl0b3A6IC0xMDAwLAoJCQlsZWZ0OiAwLAoJCQlib3JkZXI6IDAsCgkJCXBhZGRpbmc6IDAsCgkJCW92ZXJmbG93OiAnc2Nyb2xsJywKCQkJZGlyZWN0aW9uOiAncnRsJwoJCX0pCgkJLmFwcGVuZFRvKCdib2R5Jyk7Cgl2YXIgaW5uZXJFbCA9IGVsLmNoaWxkcmVuKCk7Cgl2YXIgcmVzID0gaW5uZXJFbC5vZmZzZXQoKS5sZWZ0ID4gZWwub2Zmc2V0KCkubGVmdDsgLy8gaXMgdGhlIGlubmVyIGRpdiBzaGlmdGVkIHRvIGFjY29tbW9kYXRlIGEgbGVmdCBzY3JvbGxiYXI/CgllbC5yZW1vdmUoKTsKCXJldHVybiByZXM7Cn0KCgovLyBSZXRyaWV2ZXMgYSBqUXVlcnkgZWxlbWVudCdzIGNvbXB1dGVkIENTUyB2YWx1ZSBhcyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KLy8gSWYgdGhlIHF1ZXJpZWQgdmFsdWUgaXMgbm9uLW51bWVyaWMgKGV4OiBJRSBjYW4gcmV0dXJuICJtZWRpdW0iIGZvciBib3JkZXIgd2lkdGgpLCB3aWxsIGp1c3QgcmV0dXJuIHplcm8uCmZ1bmN0aW9uIGdldENzc0Zsb2F0KGVsLCBwcm9wKSB7CglyZXR1cm4gcGFyc2VGbG9hdChlbC5jc3MocHJvcCkpIHx8IDA7Cn0KCgovKiBNb3VzZSAvIFRvdWNoIFV0aWxpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCkZDLnByZXZlbnREZWZhdWx0ID0gcHJldmVudERlZmF1bHQ7CgoKLy8gUmV0dXJucyBhIGJvb2xlYW4gd2hldGhlciB0aGlzIHdhcyBhIGxlZnQgbW91c2UgY2xpY2sgYW5kIG5vIGN0cmwga2V5ICh3aGljaCBtZWFucyByaWdodCBjbGljayBvbiBNYWMpCmZ1bmN0aW9uIGlzUHJpbWFyeU1vdXNlQnV0dG9uKGV2KSB7CglyZXR1cm4gZXYud2hpY2ggPT0gMSAmJiAhZXYuY3RybEtleTsKfQoKCmZ1bmN0aW9uIGdldEV2WChldikgewoJaWYgKGV2LnBhZ2VYICE9PSB1bmRlZmluZWQpIHsKCQlyZXR1cm4gZXYucGFnZVg7Cgl9Cgl2YXIgdG91Y2hlcyA9IGV2Lm9yaWdpbmFsRXZlbnQudG91Y2hlczsKCWlmICh0b3VjaGVzKSB7CgkJcmV0dXJuIHRvdWNoZXNbMF0ucGFnZVg7Cgl9Cn0KCgpmdW5jdGlvbiBnZXRFdlkoZXYpIHsKCWlmIChldi5wYWdlWSAhPT0gdW5kZWZpbmVkKSB7CgkJcmV0dXJuIGV2LnBhZ2VZOwoJfQoJdmFyIHRvdWNoZXMgPSBldi5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7CglpZiAodG91Y2hlcykgewoJCXJldHVybiB0b3VjaGVzWzBdLnBhZ2VZOwoJfQp9CgoKZnVuY3Rpb24gZ2V0RXZJc1RvdWNoKGV2KSB7CglyZXR1cm4gL150b3VjaC8udGVzdChldi50eXBlKTsKfQoKCmZ1bmN0aW9uIHByZXZlbnRTZWxlY3Rpb24oZWwpIHsKCWVsLmFkZENsYXNzKCdmYy11bnNlbGVjdGFibGUnKQoJCS5vbignc2VsZWN0c3RhcnQnLCBwcmV2ZW50RGVmYXVsdCk7Cn0KCgovLyBTdG9wcyBhIG1vdXNlL3RvdWNoIGV2ZW50IGZyb20gZG9pbmcgaXQncyBuYXRpdmUgYnJvd3NlciBhY3Rpb24KZnVuY3Rpb24gcHJldmVudERlZmF1bHQoZXYpIHsKCWV2LnByZXZlbnREZWZhdWx0KCk7Cn0KCgovLyBhdHRhY2ggYSBoYW5kbGVyIHRvIGdldCBjYWxsZWQgd2hlbiBBTlkgc2Nyb2xsIGFjdGlvbiBoYXBwZW5zIG9uIHRoZSBwYWdlLgovLyB0aGlzIHdhcyBpbXBvc3NpYmxlIHRvIGRvIHdpdGggbm9ybWFsIG9uL29mZiBiZWNhdXNlICdzY3JvbGwnIGRvZXNuJ3QgYnViYmxlLgovLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zMjk1NDU2NS85NjM0MgovLyByZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLgpmdW5jdGlvbiBiaW5kQW55U2Nyb2xsKGhhbmRsZXIpIHsKCWlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgewoJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVyLCB0cnVlKTsgLy8gdXNlQ2FwdHVyZT10cnVlCgkJcmV0dXJuIHRydWU7Cgl9CglyZXR1cm4gZmFsc2U7Cn0KCgovLyB1bmRvZXMgYmluZEFueVNjcm9sbC4gbXVzdCBwYXNzIGluIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi4KLy8gcmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzcy4KZnVuY3Rpb24gdW5iaW5kQW55U2Nyb2xsKGhhbmRsZXIpIHsKCWlmICh3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcikgewoJCXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVyLCB0cnVlKTsgLy8gdXNlQ2FwdHVyZT10cnVlCgkJcmV0dXJuIHRydWU7Cgl9CglyZXR1cm4gZmFsc2U7Cn0KCgovKiBHZW5lcmFsIEdlb21ldHJ5IFV0aWxzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKRkMuaW50ZXJzZWN0UmVjdHMgPSBpbnRlcnNlY3RSZWN0czsKCi8vIFJldHVybnMgYSBuZXcgcmVjdGFuZ2xlIHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIHJlY3RhbmdsZXMuIElmIHRoZXkgZG9uJ3QgaW50ZXJzZWN0LCByZXR1cm5zIGZhbHNlCmZ1bmN0aW9uIGludGVyc2VjdFJlY3RzKHJlY3QxLCByZWN0MikgewoJdmFyIHJlcyA9IHsKCQlsZWZ0OiBNYXRoLm1heChyZWN0MS5sZWZ0LCByZWN0Mi5sZWZ0KSwKCQlyaWdodDogTWF0aC5taW4ocmVjdDEucmlnaHQsIHJlY3QyLnJpZ2h0KSwKCQl0b3A6IE1hdGgubWF4KHJlY3QxLnRvcCwgcmVjdDIudG9wKSwKCQlib3R0b206IE1hdGgubWluKHJlY3QxLmJvdHRvbSwgcmVjdDIuYm90dG9tKQoJfTsKCglpZiAocmVzLmxlZnQgPCByZXMucmlnaHQgJiYgcmVzLnRvcCA8IHJlcy5ib3R0b20pIHsKCQlyZXR1cm4gcmVzOwoJfQoJcmV0dXJuIGZhbHNlOwp9CgoKLy8gUmV0dXJucyBhIG5ldyBwb2ludCB0aGF0IHdpbGwgaGF2ZSBiZWVuIG1vdmVkIHRvIHJlc2lkZSB3aXRoaW4gdGhlIGdpdmVuIHJlY3RhbmdsZQpmdW5jdGlvbiBjb25zdHJhaW5Qb2ludChwb2ludCwgcmVjdCkgewoJcmV0dXJuIHsKCQlsZWZ0OiBNYXRoLm1pbihNYXRoLm1heChwb2ludC5sZWZ0LCByZWN0LmxlZnQpLCByZWN0LnJpZ2h0KSwKCQl0b3A6IE1hdGgubWluKE1hdGgubWF4KHBvaW50LnRvcCwgcmVjdC50b3ApLCByZWN0LmJvdHRvbSkKCX07Cn0KCgovLyBSZXR1cm5zIGEgcG9pbnQgdGhhdCBpcyB0aGUgY2VudGVyIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUKZnVuY3Rpb24gZ2V0UmVjdENlbnRlcihyZWN0KSB7CglyZXR1cm4gewoJCWxlZnQ6IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDIsCgkJdG9wOiAocmVjdC50b3AgKyByZWN0LmJvdHRvbSkgLyAyCgl9Owp9CgoKLy8gU3VidHJhY3RzIHBvaW50MidzIGNvb3JkaW5hdGVzIGZyb20gcG9pbnQxJ3MgY29vcmRpbmF0ZXMsIHJldHVybmluZyBhIGRlbHRhCmZ1bmN0aW9uIGRpZmZQb2ludHMocG9pbnQxLCBwb2ludDIpIHsKCXJldHVybiB7CgkJbGVmdDogcG9pbnQxLmxlZnQgLSBwb2ludDIubGVmdCwKCQl0b3A6IHBvaW50MS50b3AgLSBwb2ludDIudG9wCgl9Owp9CgoKLyogT2JqZWN0IE9yZGVyaW5nIGJ5IEZpZWxkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKRkMucGFyc2VGaWVsZFNwZWNzID0gcGFyc2VGaWVsZFNwZWNzOwpGQy5jb21wYXJlQnlGaWVsZFNwZWNzID0gY29tcGFyZUJ5RmllbGRTcGVjczsKRkMuY29tcGFyZUJ5RmllbGRTcGVjID0gY29tcGFyZUJ5RmllbGRTcGVjOwpGQy5mbGV4aWJsZUNvbXBhcmUgPSBmbGV4aWJsZUNvbXBhcmU7CgoKZnVuY3Rpb24gcGFyc2VGaWVsZFNwZWNzKGlucHV0KSB7Cgl2YXIgc3BlY3MgPSBbXTsKCXZhciB0b2tlbnMgPSBbXTsKCXZhciBpLCB0b2tlbjsKCglpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykgewoJCXRva2VucyA9IGlucHV0LnNwbGl0KC9ccyosXHMqLyk7Cgl9CgllbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicpIHsKCQl0b2tlbnMgPSBbIGlucHV0IF07Cgl9CgllbHNlIGlmICgkLmlzQXJyYXkoaW5wdXQpKSB7CgkJdG9rZW5zID0gaW5wdXQ7Cgl9CgoJZm9yIChpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewoJCXRva2VuID0gdG9rZW5zW2ldOwoKCQlpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykgewoJCQlzcGVjcy5wdXNoKAoJCQkJdG9rZW4uY2hhckF0KDApID09ICctJyA/CgkJCQkJeyBmaWVsZDogdG9rZW4uc3Vic3RyaW5nKDEpLCBvcmRlcjogLTEgfSA6CgkJCQkJeyBmaWVsZDogdG9rZW4sIG9yZGVyOiAxIH0KCQkJKTsKCQl9CgkJZWxzZSBpZiAodHlwZW9mIHRva2VuID09PSAnZnVuY3Rpb24nKSB7CgkJCXNwZWNzLnB1c2goeyBmdW5jOiB0b2tlbiB9KTsKCQl9Cgl9CgoJcmV0dXJuIHNwZWNzOwp9CgoKZnVuY3Rpb24gY29tcGFyZUJ5RmllbGRTcGVjcyhvYmoxLCBvYmoyLCBmaWVsZFNwZWNzKSB7Cgl2YXIgaTsKCXZhciBjbXA7CgoJZm9yIChpID0gMDsgaSA8IGZpZWxkU3BlY3MubGVuZ3RoOyBpKyspIHsKCQljbXAgPSBjb21wYXJlQnlGaWVsZFNwZWMob2JqMSwgb2JqMiwgZmllbGRTcGVjc1tpXSk7CgkJaWYgKGNtcCkgewoJCQlyZXR1cm4gY21wOwoJCX0KCX0KCglyZXR1cm4gMDsKfQoKCmZ1bmN0aW9uIGNvbXBhcmVCeUZpZWxkU3BlYyhvYmoxLCBvYmoyLCBmaWVsZFNwZWMpIHsKCWlmIChmaWVsZFNwZWMuZnVuYykgewoJCXJldHVybiBmaWVsZFNwZWMuZnVuYyhvYmoxLCBvYmoyKTsKCX0KCXJldHVybiBmbGV4aWJsZUNvbXBhcmUob2JqMVtmaWVsZFNwZWMuZmllbGRdLCBvYmoyW2ZpZWxkU3BlYy5maWVsZF0pICoKCQkoZmllbGRTcGVjLm9yZGVyIHx8IDEpOwp9CgoKZnVuY3Rpb24gZmxleGlibGVDb21wYXJlKGEsIGIpIHsKCWlmICghYSAmJiAhYikgewoJCXJldHVybiAwOwoJfQoJaWYgKGIgPT0gbnVsbCkgewoJCXJldHVybiAtMTsKCX0KCWlmIChhID09IG51bGwpIHsKCQlyZXR1cm4gMTsKCX0KCWlmICgkLnR5cGUoYSkgPT09ICdzdHJpbmcnIHx8ICQudHlwZShiKSA9PT0gJ3N0cmluZycpIHsKCQlyZXR1cm4gU3RyaW5nKGEpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGIpKTsKCX0KCXJldHVybiBhIC0gYjsKfQoKCi8qIEZ1bGxDYWxlbmRhci1zcGVjaWZpYyBNaXNjIFV0aWxpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgovLyBDb21wdXRlcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gcmFuZ2VzLiBXaWxsIHJldHVybiBmcmVzaCBkYXRlIGNsb25lcyBpbiBhIHJhbmdlLgovLyBSZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBpbnRlcnNlY3Rpb24uCi8vIEV4cGVjdHMgYWxsIGRhdGVzIHRvIGJlIG5vcm1hbGl6ZWQgdG8gdGhlIHNhbWUgdGltZXpvbmUgYmVmb3JlaGFuZC4KLy8gVE9ETzogbW92ZSB0byBkYXRlIHNlY3Rpb24/CmZ1bmN0aW9uIGludGVyc2VjdFJhbmdlcyhzdWJqZWN0UmFuZ2UsIGNvbnN0cmFpbnRSYW5nZSkgewoJdmFyIHN1YmplY3RTdGFydCA9IHN1YmplY3RSYW5nZS5zdGFydDsKCXZhciBzdWJqZWN0RW5kID0gc3ViamVjdFJhbmdlLmVuZDsKCXZhciBjb25zdHJhaW50U3RhcnQgPSBjb25zdHJhaW50UmFuZ2Uuc3RhcnQ7Cgl2YXIgY29uc3RyYWludEVuZCA9IGNvbnN0cmFpbnRSYW5nZS5lbmQ7Cgl2YXIgc2VnU3RhcnQsIHNlZ0VuZDsKCXZhciBpc1N0YXJ0LCBpc0VuZDsKCglpZiAoc3ViamVjdEVuZCA+IGNvbnN0cmFpbnRTdGFydCAmJiBzdWJqZWN0U3RhcnQgPCBjb25zdHJhaW50RW5kKSB7IC8vIGluIGJvdW5kcyBhdCBhbGw/CgoJCWlmIChzdWJqZWN0U3RhcnQgPj0gY29uc3RyYWludFN0YXJ0KSB7CgkJCXNlZ1N0YXJ0ID0gc3ViamVjdFN0YXJ0LmNsb25lKCk7CgkJCWlzU3RhcnQgPSB0cnVlOwoJCX0KCQllbHNlIHsKCQkJc2VnU3RhcnQgPSBjb25zdHJhaW50U3RhcnQuY2xvbmUoKTsKCQkJaXNTdGFydCA9ICBmYWxzZTsKCQl9CgoJCWlmIChzdWJqZWN0RW5kIDw9IGNvbnN0cmFpbnRFbmQpIHsKCQkJc2VnRW5kID0gc3ViamVjdEVuZC5jbG9uZSgpOwoJCQlpc0VuZCA9IHRydWU7CgkJfQoJCWVsc2UgewoJCQlzZWdFbmQgPSBjb25zdHJhaW50RW5kLmNsb25lKCk7CgkJCWlzRW5kID0gZmFsc2U7CgkJfQoKCQlyZXR1cm4gewoJCQlzdGFydDogc2VnU3RhcnQsCgkJCWVuZDogc2VnRW5kLAoJCQlpc1N0YXJ0OiBpc1N0YXJ0LAoJCQlpc0VuZDogaXNFbmQKCQl9OwoJfQp9CgoKLyogRGF0ZSBVdGlsaXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpGQy5jb21wdXRlSW50ZXJ2YWxVbml0ID0gY29tcHV0ZUludGVydmFsVW5pdDsKRkMuZGl2aWRlUmFuZ2VCeUR1cmF0aW9uID0gZGl2aWRlUmFuZ2VCeUR1cmF0aW9uOwpGQy5kaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24gPSBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb247CkZDLm11bHRpcGx5RHVyYXRpb24gPSBtdWx0aXBseUR1cmF0aW9uOwpGQy5kdXJhdGlvbkhhc1RpbWUgPSBkdXJhdGlvbkhhc1RpbWU7Cgp2YXIgZGF5SURzID0gWyAnc3VuJywgJ21vbicsICd0dWUnLCAnd2VkJywgJ3RodScsICdmcmknLCAnc2F0JyBdOwp2YXIgaW50ZXJ2YWxVbml0cyA9IFsgJ3llYXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgJ21pbGxpc2Vjb25kJyBdOwoKCi8vIERpZmZzIHRoZSB0d28gbW9tZW50cyBpbnRvIGEgRHVyYXRpb24gd2hlcmUgZnVsbC1kYXlzIGFyZSByZWNvcmRlZCBmaXJzdCwgdGhlbiB0aGUgcmVtYWluaW5nIHRpbWUuCi8vIE1vbWVudHMgd2lsbCBoYXZlIHRoZWlyIHRpbWV6b25lcyBub3JtYWxpemVkLgpmdW5jdGlvbiBkaWZmRGF5VGltZShhLCBiKSB7CglyZXR1cm4gbW9tZW50LmR1cmF0aW9uKHsKCQlkYXlzOiBhLmNsb25lKCkuc3RyaXBUaW1lKCkuZGlmZihiLmNsb25lKCkuc3RyaXBUaW1lKCksICdkYXlzJyksCgkJbXM6IGEudGltZSgpIC0gYi50aW1lKCkgLy8gdGltZS1vZi1kYXkgZnJvbSBkYXkgc3RhcnQuIGRpc3JlZ2FyZHMgdGltZXpvbmUKCX0pOwp9CgoKLy8gRGlmZnMgdGhlIHR3byBtb21lbnRzIHZpYSB0aGVpciBzdGFydC1vZi1kYXkgKHJlZ2FyZGxlc3Mgb2YgdGltZXpvbmUpLiBQcm9kdWNlcyB3aG9sZS1kYXkgZHVyYXRpb25zLgpmdW5jdGlvbiBkaWZmRGF5KGEsIGIpIHsKCXJldHVybiBtb21lbnQuZHVyYXRpb24oewoJCWRheXM6IGEuY2xvbmUoKS5zdHJpcFRpbWUoKS5kaWZmKGIuY2xvbmUoKS5zdHJpcFRpbWUoKSwgJ2RheXMnKQoJfSk7Cn0KCgovLyBEaWZmcyB0d28gbW9tZW50cywgcHJvZHVjaW5nIGEgZHVyYXRpb24sIG1hZGUgb2YgYSB3aG9sZS11bml0LWluY3JlbWVudCBvZiB0aGUgZ2l2ZW4gdW5pdC4gVXNlcyByb3VuZGluZy4KZnVuY3Rpb24gZGlmZkJ5VW5pdChhLCBiLCB1bml0KSB7CglyZXR1cm4gbW9tZW50LmR1cmF0aW9uKAoJCU1hdGgucm91bmQoYS5kaWZmKGIsIHVuaXQsIHRydWUpKSwgLy8gcmV0dXJuRmxvYXQ9dHJ1ZQoJCXVuaXQKCSk7Cn0KCgovLyBDb21wdXRlcyB0aGUgdW5pdCBuYW1lIG9mIHRoZSBsYXJnZXN0IHdob2xlLXVuaXQgcGVyaW9kIG9mIHRpbWUuCi8vIEZvciBleGFtcGxlLCA0OCBob3VycyB3aWxsIGJlICJkYXlzIiB3aGVyZWFzIDQ5IGhvdXJzIHdpbGwgYmUgImhvdXJzIi4KLy8gQWNjZXB0cyBzdGFydC9lbmQsIGEgcmFuZ2Ugb2JqZWN0LCBvciBhbiBvcmlnaW5hbCBkdXJhdGlvbiBvYmplY3QuCmZ1bmN0aW9uIGNvbXB1dGVJbnRlcnZhbFVuaXQoc3RhcnQsIGVuZCkgewoJdmFyIGksIHVuaXQ7Cgl2YXIgdmFsOwoKCWZvciAoaSA9IDA7IGkgPCBpbnRlcnZhbFVuaXRzLmxlbmd0aDsgaSsrKSB7CgkJdW5pdCA9IGludGVydmFsVW5pdHNbaV07CgkJdmFsID0gY29tcHV0ZVJhbmdlQXModW5pdCwgc3RhcnQsIGVuZCk7CgoJCWlmICh2YWwgPj0gMSAmJiBpc0ludCh2YWwpKSB7CgkJCWJyZWFrOwoJCX0KCX0KCglyZXR1cm4gdW5pdDsgLy8gd2lsbCBiZSAibWlsbGlzZWNvbmRzIiBpZiBub3RoaW5nIGVsc2UgbWF0Y2hlcwp9CgoKLy8gQ29tcHV0ZXMgdGhlIG51bWJlciBvZiB1bml0cyAobGlrZSAiaG91cnMiKSBpbiB0aGUgZ2l2ZW4gcmFuZ2UuCi8vIFJhbmdlIGNhbiBiZSBhIHtzdGFydCxlbmR9IG9iamVjdCwgc2VwYXJhdGUgc3RhcnQvZW5kIGFyZ3MsIG9yIGEgRHVyYXRpb24uCi8vIFJlc3VsdHMgYXJlIGJhc2VkIG9uIE1vbWVudCdzIC5hcygpIGFuZCAuZGlmZigpIG1ldGhvZHMsIHNvIHJlc3VsdHMgY2FuIGRlcGVuZCBvbiBpbnRlcm5hbCBoYW5kbGluZwovLyBvZiBtb250aC1kaWZmaW5nIGxvZ2ljICh3aGljaCB0ZW5kcyB0byB2YXJ5IGZyb20gdmVyc2lvbiB0byB2ZXJzaW9uKS4KZnVuY3Rpb24gY29tcHV0ZVJhbmdlQXModW5pdCwgc3RhcnQsIGVuZCkgewoKCWlmIChlbmQgIT0gbnVsbCkgeyAvLyBnaXZlbiBzdGFydCwgZW5kCgkJcmV0dXJuIGVuZC5kaWZmKHN0YXJ0LCB1bml0LCB0cnVlKTsKCX0KCWVsc2UgaWYgKG1vbWVudC5pc0R1cmF0aW9uKHN0YXJ0KSkgeyAvLyBnaXZlbiBkdXJhdGlvbgoJCXJldHVybiBzdGFydC5hcyh1bml0KTsKCX0KCWVsc2UgeyAvLyBnaXZlbiB7IHN0YXJ0LCBlbmQgfSByYW5nZSBvYmplY3QKCQlyZXR1cm4gc3RhcnQuZW5kLmRpZmYoc3RhcnQuc3RhcnQsIHVuaXQsIHRydWUpOwoJfQp9CgoKLy8gSW50ZWxsaWdlbnRseSBkaXZpZGVzIGEgcmFuZ2UgKHNwZWNpZmllZCBieSBhIHN0YXJ0L2VuZCBwYXJhbXMpIGJ5IGEgZHVyYXRpb24KZnVuY3Rpb24gZGl2aWRlUmFuZ2VCeUR1cmF0aW9uKHN0YXJ0LCBlbmQsIGR1cikgewoJdmFyIG1vbnRoczsKCglpZiAoZHVyYXRpb25IYXNUaW1lKGR1cikpIHsKCQlyZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cjsKCX0KCW1vbnRocyA9IGR1ci5hc01vbnRocygpOwoJaWYgKE1hdGguYWJzKG1vbnRocykgPj0gMSAmJiBpc0ludChtb250aHMpKSB7CgkJcmV0dXJuIGVuZC5kaWZmKHN0YXJ0LCAnbW9udGhzJywgdHJ1ZSkgLyBtb250aHM7Cgl9CglyZXR1cm4gZW5kLmRpZmYoc3RhcnQsICdkYXlzJywgdHJ1ZSkgLyBkdXIuYXNEYXlzKCk7Cn0KCgovLyBJbnRlbGxpZ2VudGx5IGRpdmlkZXMgb25lIGR1cmF0aW9uIGJ5IGFub3RoZXIKZnVuY3Rpb24gZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uKGR1cjEsIGR1cjIpIHsKCXZhciBtb250aHMxLCBtb250aHMyOwoKCWlmIChkdXJhdGlvbkhhc1RpbWUoZHVyMSkgfHwgZHVyYXRpb25IYXNUaW1lKGR1cjIpKSB7CgkJcmV0dXJuIGR1cjEgLyBkdXIyOwoJfQoJbW9udGhzMSA9IGR1cjEuYXNNb250aHMoKTsKCW1vbnRoczIgPSBkdXIyLmFzTW9udGhzKCk7CglpZiAoCgkJTWF0aC5hYnMobW9udGhzMSkgPj0gMSAmJiBpc0ludChtb250aHMxKSAmJgoJCU1hdGguYWJzKG1vbnRoczIpID49IDEgJiYgaXNJbnQobW9udGhzMikKCSkgewoJCXJldHVybiBtb250aHMxIC8gbW9udGhzMjsKCX0KCXJldHVybiBkdXIxLmFzRGF5cygpIC8gZHVyMi5hc0RheXMoKTsKfQoKCi8vIEludGVsbGlnZW50bHkgbXVsdGlwbGllcyBhIGR1cmF0aW9uIGJ5IGEgbnVtYmVyCmZ1bmN0aW9uIG11bHRpcGx5RHVyYXRpb24oZHVyLCBuKSB7Cgl2YXIgbW9udGhzOwoKCWlmIChkdXJhdGlvbkhhc1RpbWUoZHVyKSkgewoJCXJldHVybiBtb21lbnQuZHVyYXRpb24oZHVyICogbik7Cgl9Cgltb250aHMgPSBkdXIuYXNNb250aHMoKTsKCWlmIChNYXRoLmFicyhtb250aHMpID49IDEgJiYgaXNJbnQobW9udGhzKSkgewoJCXJldHVybiBtb21lbnQuZHVyYXRpb24oeyBtb250aHM6IG1vbnRocyAqIG4gfSk7Cgl9CglyZXR1cm4gbW9tZW50LmR1cmF0aW9uKHsgZGF5czogZHVyLmFzRGF5cygpICogbiB9KTsKfQoKCi8vIFJldHVybnMgYSBib29sZWFuIGFib3V0IHdoZXRoZXIgdGhlIGdpdmVuIGR1cmF0aW9uIGhhcyBhbnkgdGltZSBwYXJ0cyAoaG91cnMvbWludXRlcy9zZWNvbmRzL21zKQpmdW5jdGlvbiBkdXJhdGlvbkhhc1RpbWUoZHVyKSB7CglyZXR1cm4gQm9vbGVhbihkdXIuaG91cnMoKSB8fCBkdXIubWludXRlcygpIHx8IGR1ci5zZWNvbmRzKCkgfHwgZHVyLm1pbGxpc2Vjb25kcygpKTsKfQoKCmZ1bmN0aW9uIGlzTmF0aXZlRGF0ZShpbnB1dCkgewoJcmV0dXJuICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBEYXRlXScgfHwgaW5wdXQgaW5zdGFuY2VvZiBEYXRlOwp9CgoKLy8gUmV0dXJucyBhIGJvb2xlYW4gYWJvdXQgd2hldGhlciB0aGUgZ2l2ZW4gaW5wdXQgaXMgYSB0aW1lIHN0cmluZywgbGlrZSAiMDY6NDA6MDAiIG9yICIwNjowMCIKZnVuY3Rpb24gaXNUaW1lU3RyaW5nKHN0cikgewoJcmV0dXJuIC9eXGQrXDpcZCsoPzpcOlxkK1wuPyg/OlxkezN9KT8pPyQvLnRlc3Qoc3RyKTsKfQoKCi8qIExvZ2dpbmcgYW5kIERlYnVnCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKRkMubG9nID0gZnVuY3Rpb24oKSB7Cgl2YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlOwoKCWlmIChjb25zb2xlICYmIGNvbnNvbGUubG9nKSB7CgkJcmV0dXJuIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cyk7Cgl9Cn07CgpGQy53YXJuID0gZnVuY3Rpb24oKSB7Cgl2YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlOwoKCWlmIChjb25zb2xlICYmIGNvbnNvbGUud2FybikgewoJCXJldHVybiBjb25zb2xlLndhcm4uYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTsKCX0KCWVsc2UgewoJCXJldHVybiBGQy5sb2cuYXBwbHkoRkMsIGFyZ3VtZW50cyk7Cgl9Cn07CgoKLyogR2VuZXJhbCBVdGlsaXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2YXIgaGFzT3duUHJvcE1ldGhvZCA9IHt9Lmhhc093blByb3BlcnR5OwoKCi8vIE1lcmdlcyBhbiBhcnJheSBvZiBvYmplY3RzIGludG8gYSBzaW5nbGUgb2JqZWN0LgovLyBUaGUgc2Vjb25kIGFyZ3VtZW50IGFsbG93cyBmb3IgYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgd2hvJ3Mgb2JqZWN0IHZhbHVlcyB3aWxsIGJlIG1lcmdlZCB0b2dldGhlci4KZnVuY3Rpb24gbWVyZ2VQcm9wcyhwcm9wT2JqcywgY29tcGxleFByb3BzKSB7Cgl2YXIgZGVzdCA9IHt9OwoJdmFyIGksIG5hbWU7Cgl2YXIgY29tcGxleE9ianM7Cgl2YXIgaiwgdmFsOwoJdmFyIHByb3BzOwoKCWlmIChjb21wbGV4UHJvcHMpIHsKCQlmb3IgKGkgPSAwOyBpIDwgY29tcGxleFByb3BzLmxlbmd0aDsgaSsrKSB7CgkJCW5hbWUgPSBjb21wbGV4UHJvcHNbaV07CgkJCWNvbXBsZXhPYmpzID0gW107CgoJCQkvLyBjb2xsZWN0IHRoZSB0cmFpbGluZyBvYmplY3QgdmFsdWVzLCBzdG9wcGluZyB3aGVuIGEgbm9uLW9iamVjdCBpcyBkaXNjb3ZlcmVkCgkJCWZvciAoaiA9IHByb3BPYmpzLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7CgkJCQl2YWwgPSBwcm9wT2Jqc1tqXVtuYW1lXTsKCgkJCQlpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHsKCQkJCQljb21wbGV4T2Jqcy51bnNoaWZ0KHZhbCk7CgkJCQl9CgkJCQllbHNlIGlmICh2YWwgIT09IHVuZGVmaW5lZCkgewoJCQkJCWRlc3RbbmFtZV0gPSB2YWw7IC8vIGlmIHRoZXJlIHdlcmUgbm8gb2JqZWN0cywgdGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoKCQkJLy8gaWYgdGhlIHRyYWlsaW5nIHZhbHVlcyB3ZXJlIG9iamVjdHMsIHVzZSB0aGUgbWVyZ2VkIHZhbHVlCgkJCWlmIChjb21wbGV4T2Jqcy5sZW5ndGgpIHsKCQkJCWRlc3RbbmFtZV0gPSBtZXJnZVByb3BzKGNvbXBsZXhPYmpzKTsKCQkJfQoJCX0KCX0KCgkvLyBjb3B5IHZhbHVlcyBpbnRvIHRoZSBkZXN0aW5hdGlvbiwgZ29pbmcgZnJvbSBsYXN0IHRvIGZpcnN0Cglmb3IgKGkgPSBwcm9wT2Jqcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCXByb3BzID0gcHJvcE9ianNbaV07CgoJCWZvciAobmFtZSBpbiBwcm9wcykgewoJCQlpZiAoIShuYW1lIGluIGRlc3QpKSB7IC8vIGlmIGFscmVhZHkgYXNzaWduZWQgYnkgcHJldmlvdXMgcHJvcHMgb3IgY29tcGxleCBwcm9wcywgZG9uJ3QgcmVhc3NpZ24KCQkJCWRlc3RbbmFtZV0gPSBwcm9wc1tuYW1lXTsKCQkJfQoJCX0KCX0KCglyZXR1cm4gZGVzdDsKfQoKCi8vIENyZWF0ZSBhbiBvYmplY3QgdGhhdCBoYXMgdGhlIGdpdmVuIHByb3RvdHlwZS4gSnVzdCBsaWtlIE9iamVjdC5jcmVhdGUKZnVuY3Rpb24gY3JlYXRlT2JqZWN0KHByb3RvKSB7Cgl2YXIgZiA9IGZ1bmN0aW9uKCkge307CglmLnByb3RvdHlwZSA9IHByb3RvOwoJcmV0dXJuIG5ldyBmKCk7Cn0KCgpmdW5jdGlvbiBjb3B5T3duUHJvcHMoc3JjLCBkZXN0KSB7Cglmb3IgKHZhciBuYW1lIGluIHNyYykgewoJCWlmIChoYXNPd25Qcm9wKHNyYywgbmFtZSkpIHsKCQkJZGVzdFtuYW1lXSA9IHNyY1tuYW1lXTsKCQl9Cgl9Cn0KCgpmdW5jdGlvbiBoYXNPd25Qcm9wKG9iaiwgbmFtZSkgewoJcmV0dXJuIGhhc093blByb3BNZXRob2QuY2FsbChvYmosIG5hbWUpOwp9CgoKLy8gSXMgdGhlIGdpdmVuIHZhbHVlIGEgbm9uLW9iamVjdCBub24tZnVuY3Rpb24gdmFsdWU/CmZ1bmN0aW9uIGlzQXRvbWljKHZhbCkgewoJcmV0dXJuIC91bmRlZmluZWR8bnVsbHxib29sZWFufG51bWJlcnxzdHJpbmcvLnRlc3QoJC50eXBlKHZhbCkpOwp9CgoKZnVuY3Rpb24gYXBwbHlBbGwoZnVuY3Rpb25zLCB0aGlzT2JqLCBhcmdzKSB7CglpZiAoJC5pc0Z1bmN0aW9uKGZ1bmN0aW9ucykpIHsKCQlmdW5jdGlvbnMgPSBbIGZ1bmN0aW9ucyBdOwoJfQoJaWYgKGZ1bmN0aW9ucykgewoJCXZhciBpOwoJCXZhciByZXQ7CgkJZm9yIChpPTA7IGk8ZnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7CgkJCXJldCA9IGZ1bmN0aW9uc1tpXS5hcHBseSh0aGlzT2JqLCBhcmdzKSB8fCByZXQ7CgkJfQoJCXJldHVybiByZXQ7Cgl9Cn0KCgpmdW5jdGlvbiBmaXJzdERlZmluZWQoKSB7Cglmb3IgKHZhciBpPTA7IGk8YXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CgkJaWYgKGFyZ3VtZW50c1tpXSAhPT0gdW5kZWZpbmVkKSB7CgkJCXJldHVybiBhcmd1bWVudHNbaV07CgkJfQoJfQp9CgoKZnVuY3Rpb24gaHRtbEVzY2FwZShzKSB7CglyZXR1cm4gKHMgKyAnJykucmVwbGFjZSgvJi9nLCAnJmFtcDsnKQoJCS5yZXBsYWNlKC88L2csICcmbHQ7JykKCQkucmVwbGFjZSgvPi9nLCAnJmd0OycpCgkJLnJlcGxhY2UoLycvZywgJyYjMDM5OycpCgkJLnJlcGxhY2UoLyIvZywgJyZxdW90OycpCgkJLnJlcGxhY2UoL1xuL2csICc8YnIgLz4nKTsKfQoKCmZ1bmN0aW9uIHN0cmlwSHRtbEVudGl0aWVzKHRleHQpIHsKCXJldHVybiB0ZXh0LnJlcGxhY2UoLyYuKj87L2csICcnKTsKfQoKCi8vIEdpdmVuIGEgaGFzaCBvZiBDU1MgcHJvcGVydGllcywgcmV0dXJucyBhIHN0cmluZyBvZiBDU1MuCi8vIFVzZXMgcHJvcGVydHkgbmFtZXMgYXMtaXMgKG5vIGNhbWVsLWNhc2UgY29udmVyc2lvbikuIFdpbGwgbm90IG1ha2Ugc3RhdGVtZW50cyBmb3IgbnVsbC91bmRlZmluZWQgdmFsdWVzLgpmdW5jdGlvbiBjc3NUb1N0cihjc3NQcm9wcykgewoJdmFyIHN0YXRlbWVudHMgPSBbXTsKCgkkLmVhY2goY3NzUHJvcHMsIGZ1bmN0aW9uKG5hbWUsIHZhbCkgewoJCWlmICh2YWwgIT0gbnVsbCkgewoJCQlzdGF0ZW1lbnRzLnB1c2gobmFtZSArICc6JyArIHZhbCk7CgkJfQoJfSk7CgoJcmV0dXJuIHN0YXRlbWVudHMuam9pbignOycpOwp9CgoKLy8gR2l2ZW4gYW4gb2JqZWN0IGhhc2ggb2YgSFRNTCBhdHRyaWJ1dGUgbmFtZXMgdG8gdmFsdWVzLAovLyBnZW5lcmF0ZXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgaW5qZWN0ZWQgYmV0d2VlbiA8ID4gaW4gSFRNTApmdW5jdGlvbiBhdHRyc1RvU3RyKGF0dHJzKSB7Cgl2YXIgcGFydHMgPSBbXTsKCgkkLmVhY2goYXR0cnMsIGZ1bmN0aW9uKG5hbWUsIHZhbCkgewoJCWlmICh2YWwgIT0gbnVsbCkgewoJCQlwYXJ0cy5wdXNoKG5hbWUgKyAnPSInICsgaHRtbEVzY2FwZSh2YWwpICsgJyInKTsKCQl9Cgl9KTsKCglyZXR1cm4gcGFydHMuam9pbignICcpOwp9CgoKZnVuY3Rpb24gY2FwaXRhbGlzZUZpcnN0TGV0dGVyKHN0cikgewoJcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTsKfQoKCmZ1bmN0aW9uIGNvbXBhcmVOdW1iZXJzKGEsIGIpIHsgLy8gZm9yIC5zb3J0KCkKCXJldHVybiBhIC0gYjsKfQoKCmZ1bmN0aW9uIGlzSW50KG4pIHsKCXJldHVybiBuICUgMSA9PT0gMDsKfQoKCi8vIFJldHVybnMgYSBtZXRob2QgYm91bmQgdG8gdGhlIGdpdmVuIG9iamVjdCBjb250ZXh0LgovLyBKdXN0IGxpa2Ugb25lIG9mIHRoZSBqUXVlcnkucHJveHkgc2lnbmF0dXJlcywgYnV0IHdpdGhvdXQgdGhlIHVuZGVzaXJlZCBiZWhhdmlvciBvZiB0cmVhdGluZyB0aGUgc2FtZSBtZXRob2Qgd2l0aAovLyBkaWZmZXJlbnQgY29udGV4dHMgYXMgaWRlbnRpY2FsIHdoZW4gYmluZGluZy91bmJpbmRpbmcgZXZlbnRzLgpmdW5jdGlvbiBwcm94eShvYmosIG1ldGhvZE5hbWUpIHsKCXZhciBtZXRob2QgPSBvYmpbbWV0aG9kTmFtZV07CgoJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCXJldHVybiBtZXRob2QuYXBwbHkob2JqLCBhcmd1bWVudHMpOwoJfTsKfQoKCi8vIFJldHVybnMgYSBmdW5jdGlvbiwgdGhhdCwgYXMgbG9uZyBhcyBpdCBjb250aW51ZXMgdG8gYmUgaW52b2tlZCwgd2lsbCBub3QKLy8gYmUgdHJpZ2dlcmVkLiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgaXQgc3RvcHMgYmVpbmcgY2FsbGVkIGZvcgovLyBOIG1pbGxpc2Vjb25kcy4gSWYgYGltbWVkaWF0ZWAgaXMgcGFzc2VkLCB0cmlnZ2VyIHRoZSBmdW5jdGlvbiBvbiB0aGUKLy8gbGVhZGluZyBlZGdlLCBpbnN0ZWFkIG9mIHRoZSB0cmFpbGluZy4KLy8gaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL2Jsb2IvMS42LjAvdW5kZXJzY29yZS5qcyNMNzE0CmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIGltbWVkaWF0ZSkgewoJdmFyIHRpbWVvdXQsIGFyZ3MsIGNvbnRleHQsIHRpbWVzdGFtcCwgcmVzdWx0OwoKCXZhciBsYXRlciA9IGZ1bmN0aW9uKCkgewoJCXZhciBsYXN0ID0gK25ldyBEYXRlKCkgLSB0aW1lc3RhbXA7CgkJaWYgKGxhc3QgPCB3YWl0KSB7CgkJCXRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0IC0gbGFzdCk7CgkJfQoJCWVsc2UgewoJCQl0aW1lb3V0ID0gbnVsbDsKCQkJaWYgKCFpbW1lZGlhdGUpIHsKCQkJCXJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7CgkJCQljb250ZXh0ID0gYXJncyA9IG51bGw7CgkJCX0KCQl9Cgl9OwoKCXJldHVybiBmdW5jdGlvbigpIHsKCQljb250ZXh0ID0gdGhpczsKCQlhcmdzID0gYXJndW1lbnRzOwoJCXRpbWVzdGFtcCA9ICtuZXcgRGF0ZSgpOwoJCXZhciBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0OwoJCWlmICghdGltZW91dCkgewoJCQl0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7CgkJfQoJCWlmIChjYWxsTm93KSB7CgkJCXJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7CgkJCWNvbnRleHQgPSBhcmdzID0gbnVsbDsKCQl9CgkJcmV0dXJuIHJlc3VsdDsKCX07Cn0KCgovLyBIQUNLIGFyb3VuZCBqUXVlcnkncyBub3cgQSsgcHJvbWlzZXM6IGV4ZWN1dGUgY2FsbGJhY2sgc3luY2hyb25vdXNseSBpZiBhbHJlYWR5IHJlc29sdmVkLgovLyB0aGVuRnVuYyBzaG91bGRuJ3QgYWNjZXB0IGFyZ3MuCi8vIHNpbWlsYXIgdG8gd2hlblJlc291cmNlcyBpbiBTY2hlZHVsZXIgcGx1Z2luLgpmdW5jdGlvbiBzeW5jVGhlbihwcm9taXNlLCB0aGVuRnVuYykgewoJLy8gbm90IGEgcHJvbWlzZSwgb3IgYW4gYWxyZWFkeS1yZXNvbHZlZCBwcm9taXNlPwoJaWYgKCFwcm9taXNlIHx8ICFwcm9taXNlLnRoZW4gfHwgcHJvbWlzZS5zdGF0ZSgpID09PSAncmVzb2x2ZWQnKSB7CgkJcmV0dXJuICQud2hlbih0aGVuRnVuYygpKTsgLy8gcmVzb2x2ZSBpbW1lZGlhdGVseQoJfQoJZWxzZSBpZiAodGhlbkZ1bmMpIHsKCQlyZXR1cm4gcHJvbWlzZS50aGVuKHRoZW5GdW5jKTsKCX0KfQoKOzsKCi8qCkdFTkVSQUwgTk9URSBvbiBtb21lbnRzIHRocm91Z2hvdXQgdGhlICplbnRpcmUgcmVzdCogb2YgdGhlIGNvZGViYXNlOgpBbGwgbW9tZW50cyBhcmUgYXNzdW1lZCB0byBiZSBhbWJpZ3VvdXNseS16b25lZCB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLAp3aXRoIHRoZSBOT1RBQkxFIEVYQ0VPUFRJT04gb2Ygc3RhcnQvZW5kIGRhdGVzIHRoYXQgbGl2ZSBvbiAqRXZlbnQgT2JqZWN0cyouCkFtYmlndW91c2x5LVRJTUVEIG1vbWVudHMgYXJlIGFzc3VtZWQgdG8gYmUgYW1iaWd1b3VzbHktem9uZWQgYnkgbmF0dXJlLgoqLwoKdmFyIGFtYmlnRGF0ZU9mTW9udGhSZWdleCA9IC9eXHMqXGR7NH0tXGRcZCQvOwp2YXIgYW1iaWdUaW1lT3Jab25lUmVnZXggPQoJL15ccypcZHs0fS0oPzooXGRcZC1cZFxkKXwoV1xkXGQkKXwoV1xkXGQtXGQpfChcZFxkXGQpKSgoVHwgKShcZFxkKDpcZFxkKDpcZFxkKFwuXGQrKT8pPyk/KT8pPyQvOwp2YXIgbmV3TW9tZW50UHJvdG8gPSBtb21lbnQuZm47IC8vIHdoZXJlIHdlIHdpbGwgYXR0YWNoIG91ciBuZXcgbWV0aG9kcwp2YXIgb2xkTW9tZW50UHJvdG8gPSAkLmV4dGVuZCh7fSwgbmV3TW9tZW50UHJvdG8pOyAvLyBjb3B5IG9mIG9yaWdpbmFsIG1vbWVudCBtZXRob2RzCgovLyB0ZWxsIG1vbWVudGpzIHRvIHRyYW5zZmVyIHRoZXNlIHByb3BlcnRpZXMgdXBvbiBjbG9uZQp2YXIgbW9tZW50UHJvcGVydGllcyA9IG1vbWVudC5tb21lbnRQcm9wZXJ0aWVzOwptb21lbnRQcm9wZXJ0aWVzLnB1c2goJ19mdWxsQ2FsZW5kYXInKTsKbW9tZW50UHJvcGVydGllcy5wdXNoKCdfYW1iaWdUaW1lJyk7Cm1vbWVudFByb3BlcnRpZXMucHVzaCgnX2FtYmlnWm9uZScpOwoKCi8vIENyZWF0aW5nCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIENyZWF0ZXMgYSBuZXcgbW9tZW50LCBzaW1pbGFyIHRvIHRoZSB2YW5pbGxhIG1vbWVudCguLi4pIGNvbnN0cnVjdG9yLCBidXQgd2l0aAovLyBleHRyYSBmZWF0dXJlcyAoYW1iaWd1b3VzIHRpbWUsIGVuaGFuY2VkIGZvcm1hdHRpbmcpLiBXaGVuIGdpdmVuIGFuIGV4aXN0aW5nIG1vbWVudCwKLy8gaXQgd2lsbCBmdW5jdGlvbiBhcyBhIGNsb25lIChhbmQgcmV0YWluIHRoZSB6b25lIG9mIHRoZSBtb21lbnQpLiBBbnl0aGluZyBlbHNlIHdpbGwKLy8gcmVzdWx0IGluIGEgbW9tZW50IGluIHRoZSBsb2NhbCB6b25lLgpGQy5tb21lbnQgPSBmdW5jdGlvbigpIHsKCXJldHVybiBtYWtlTW9tZW50KGFyZ3VtZW50cyk7Cn07CgovLyBTYW1lcyBhcyBGQy5tb21lbnQsIGJ1dCBmb3JjZXMgdGhlIHJlc3VsdGluZyBtb21lbnQgdG8gYmUgaW4gdGhlIFVUQyB0aW1lem9uZS4KRkMubW9tZW50LnV0YyA9IGZ1bmN0aW9uKCkgewoJdmFyIG1vbSA9IG1ha2VNb21lbnQoYXJndW1lbnRzLCB0cnVlKTsKCgkvLyBGb3JjZSBpdCBpbnRvIFVUQyBiZWNhdXNlIG1ha2VNb21lbnQgZG9lc24ndCBndWFyYW50ZWUgaXQKCS8vIChpZiBnaXZlbiBhIHByZS1leGlzdGluZyBtb21lbnQgZm9yIGV4YW1wbGUpCglpZiAobW9tLmhhc1RpbWUoKSkgeyAvLyBkb24ndCBnaXZlIGFtYmlndW91c2x5LXRpbWVkIG1vbWVudHMgYSBVVEMgem9uZQoJCW1vbS51dGMoKTsKCX0KCglyZXR1cm4gbW9tOwp9OwoKLy8gU2FtZSBhcyBGQy5tb21lbnQsIGJ1dCB3aGVuIGdpdmVuIGFuIElTTzg2MDEgc3RyaW5nLCB0aGUgdGltZXpvbmUgb2Zmc2V0IGlzIHByZXNlcnZlZC4KLy8gSVNPODYwMSBzdHJpbmdzIHdpdGggbm8gdGltZXpvbmUgb2Zmc2V0IHdpbGwgYmVjb21lIGFtYmlndW91c2x5IHpvbmVkLgpGQy5tb21lbnQucGFyc2Vab25lID0gZnVuY3Rpb24oKSB7CglyZXR1cm4gbWFrZU1vbWVudChhcmd1bWVudHMsIHRydWUsIHRydWUpOwp9OwoKLy8gQnVpbGRzIGFuIGVuaGFuY2VkIG1vbWVudCBmcm9tIGFyZ3MuIFdoZW4gZ2l2ZW4gYW4gZXhpc3RpbmcgbW9tZW50LCBpdCBjbG9uZXMuIFdoZW4gZ2l2ZW4gYQovLyBuYXRpdmUgRGF0ZSwgb3IgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzICh0aGUgY3VycmVudCB0aW1lKSwgdGhlIHJlc3VsdGluZyBtb21lbnQgd2lsbCBiZSBsb2NhbC4KLy8gQW55dGhpbmcgZWxzZSBuZWVkcyB0byBiZSAicGFyc2VkIiAoYSBzdHJpbmcgb3IgYW4gYXJyYXkpLCBhbmQgd2lsbCBiZSBhZmZlY3RlZCBieToKLy8gICAgcGFyc2VBc1VUQyAtIGlmIHRoZXJlIGlzIG5vIHpvbmUgaW5mb3JtYXRpb24sIHNob3VsZCB3ZSBwYXJzZSB0aGUgaW5wdXQgaW4gVVRDPwovLyAgICBwYXJzZVpvbmUgLSBpZiB0aGVyZSBpcyB6b25lIGluZm9ybWF0aW9uLCBzaG91bGQgd2UgZm9yY2UgdGhlIHpvbmUgb2YgdGhlIG1vbWVudD8KZnVuY3Rpb24gbWFrZU1vbWVudChhcmdzLCBwYXJzZUFzVVRDLCBwYXJzZVpvbmUpIHsKCXZhciBpbnB1dCA9IGFyZ3NbMF07Cgl2YXIgaXNTaW5nbGVTdHJpbmcgPSBhcmdzLmxlbmd0aCA9PSAxICYmIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZyc7Cgl2YXIgaXNBbWJpZ1RpbWU7Cgl2YXIgaXNBbWJpZ1pvbmU7Cgl2YXIgYW1iaWdNYXRjaDsKCXZhciBtb207CgoJaWYgKG1vbWVudC5pc01vbWVudChpbnB1dCkgfHwgaXNOYXRpdmVEYXRlKGlucHV0KSB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSB7CgkJbW9tID0gbW9tZW50LmFwcGx5KG51bGwsIGFyZ3MpOwoJfQoJZWxzZSB7IC8vICJwYXJzaW5nIiBpcyByZXF1aXJlZAoJCWlzQW1iaWdUaW1lID0gZmFsc2U7CgkJaXNBbWJpZ1pvbmUgPSBmYWxzZTsKCgkJaWYgKGlzU2luZ2xlU3RyaW5nKSB7CgkJCWlmIChhbWJpZ0RhdGVPZk1vbnRoUmVnZXgudGVzdChpbnB1dCkpIHsKCQkJCS8vIGFjY2VwdCBzdHJpbmdzIGxpa2UgJzIwMTQtMDUnLCBidXQgY29udmVydCB0byB0aGUgZmlyc3Qgb2YgdGhlIG1vbnRoCgkJCQlpbnB1dCArPSAnLTAxJzsKCQkJCWFyZ3MgPSBbIGlucHV0IF07IC8vIGZvciB3aGVuIHdlIHBhc3MgaXQgb24gdG8gbW9tZW50J3MgY29uc3RydWN0b3IKCQkJCWlzQW1iaWdUaW1lID0gdHJ1ZTsKCQkJCWlzQW1iaWdab25lID0gdHJ1ZTsKCQkJfQoJCQllbHNlIGlmICgoYW1iaWdNYXRjaCA9IGFtYmlnVGltZU9yWm9uZVJlZ2V4LmV4ZWMoaW5wdXQpKSkgewoJCQkJaXNBbWJpZ1RpbWUgPSAhYW1iaWdNYXRjaFs1XTsgLy8gbm8gdGltZSBwYXJ0PwoJCQkJaXNBbWJpZ1pvbmUgPSB0cnVlOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCQuaXNBcnJheShpbnB1dCkpIHsKCQkJLy8gYXJyYXlzIGhhdmUgbm8gdGltZXpvbmUgaW5mb3JtYXRpb24sIHNvIGFzc3VtZSBhbWJpZ3VvdXMgem9uZQoJCQlpc0FtYmlnWm9uZSA9IHRydWU7CgkJfQoJCS8vIG90aGVyd2lzZSwgcHJvYmFibHkgYSBzdHJpbmcgd2l0aCBhIGZvcm1hdAoKCQlpZiAocGFyc2VBc1VUQyB8fCBpc0FtYmlnVGltZSkgewoJCQltb20gPSBtb21lbnQudXRjLmFwcGx5KG1vbWVudCwgYXJncyk7CgkJfQoJCWVsc2UgewoJCQltb20gPSBtb21lbnQuYXBwbHkobnVsbCwgYXJncyk7CgkJfQoKCQlpZiAoaXNBbWJpZ1RpbWUpIHsKCQkJbW9tLl9hbWJpZ1RpbWUgPSB0cnVlOwoJCQltb20uX2FtYmlnWm9uZSA9IHRydWU7IC8vIGFtYmlndW91cyB0aW1lIGFsd2F5cyBtZWFucyBhbWJpZ3VvdXMgem9uZQoJCX0KCQllbHNlIGlmIChwYXJzZVpvbmUpIHsgLy8gbGV0J3MgcmVjb3JkIHRoZSBpbnB1dHRlZCB6b25lIHNvbWVob3cKCQkJaWYgKGlzQW1iaWdab25lKSB7CgkJCQltb20uX2FtYmlnWm9uZSA9IHRydWU7CgkJCX0KCQkJZWxzZSBpZiAoaXNTaW5nbGVTdHJpbmcpIHsKCQkJCW1vbS51dGNPZmZzZXQoaW5wdXQpOyAvLyBpZiBub3QgYSB2YWxpZCB6b25lLCB3aWxsIGFzc2lnbiBVVEMKCQkJfQoJCX0KCX0KCgltb20uX2Z1bGxDYWxlbmRhciA9IHRydWU7IC8vIGZsYWcgZm9yIGV4dGVuZGVkIGZ1bmN0aW9uYWxpdHkKCglyZXR1cm4gbW9tOwp9CgoKLy8gV2VlayBOdW1iZXIKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCi8vIFJldHVybnMgdGhlIHdlZWsgbnVtYmVyLCBjb25zaWRlcmluZyB0aGUgbG9jYWxlJ3MgY3VzdG9tIHdlZWsgbnVtYmVyIGNhbGN1YXRpb24KLy8gYHdlZWtzYCBpcyBhbiBhbGlhcyBmb3IgYHdlZWtgCm5ld01vbWVudFByb3RvLndlZWsgPSBuZXdNb21lbnRQcm90by53ZWVrcyA9IGZ1bmN0aW9uKGlucHV0KSB7Cgl2YXIgd2Vla0NhbGMgPSB0aGlzLl9sb2NhbGUuX2Z1bGxDYWxlbmRhcl93ZWVrQ2FsYzsKCglpZiAoaW5wdXQgPT0gbnVsbCAmJiB0eXBlb2Ygd2Vla0NhbGMgPT09ICdmdW5jdGlvbicpIHsgLy8gY3VzdG9tIGZ1bmN0aW9uIG9ubHkgd29ya3MgZm9yIGdldHRlcgoJCXJldHVybiB3ZWVrQ2FsYyh0aGlzKTsKCX0KCWVsc2UgaWYgKHdlZWtDYWxjID09PSAnSVNPJykgewoJCXJldHVybiBvbGRNb21lbnRQcm90by5pc29XZWVrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIElTTyBnZXR0ZXIvc2V0dGVyCgl9CgoJcmV0dXJuIG9sZE1vbWVudFByb3RvLndlZWsuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gbG9jYWwgZ2V0dGVyL3NldHRlcgp9OwoKCi8vIFRpbWUtb2YtZGF5Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIEdFVFRFUgovLyBSZXR1cm5zIGEgRHVyYXRpb24gd2l0aCB0aGUgaG91cnMvbWludXRlcy9zZWNvbmRzL21zIHZhbHVlcyBvZiB0aGUgbW9tZW50LgovLyBJZiB0aGUgbW9tZW50IGhhcyBhbiBhbWJpZ3VvdXMgdGltZSwgYSBkdXJhdGlvbiBvZiAwMDowMCB3aWxsIGJlIHJldHVybmVkLgovLwovLyBTRVRURVIKLy8gWW91IGNhbiBzdXBwbHkgYSBEdXJhdGlvbiwgYSBNb21lbnQsIG9yIGEgRHVyYXRpb24tbGlrZSBhcmd1bWVudC4KLy8gV2hlbiBzZXR0aW5nIHRoZSB0aW1lLCBhbmQgdGhlIG1vbWVudCBoYXMgYW4gYW1iaWd1b3VzIHRpbWUsIGl0IHRoZW4gYmVjb21lcyB1bmFtYmlndW91cy4KbmV3TW9tZW50UHJvdG8udGltZSA9IGZ1bmN0aW9uKHRpbWUpIHsKCgkvLyBGYWxsYmFjayB0byB0aGUgb3JpZ2luYWwgbWV0aG9kIChpZiB0aGVyZSBpcyBvbmUpIGlmIHRoaXMgbW9tZW50IHdhc24ndCBjcmVhdGVkIHZpYSBGdWxsQ2FsZW5kYXIuCgkvLyBgdGltZWAgaXMgYSBnZW5lcmljIGVub3VnaCBtZXRob2QgbmFtZSB3aGVyZSB0aGlzIHByZWNhdXRpb24gaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGNvbGxpc2lvbnMgdy8gb3RoZXIgcGx1Z2lucy4KCWlmICghdGhpcy5fZnVsbENhbGVuZGFyKSB7CgkJcmV0dXJuIG9sZE1vbWVudFByb3RvLnRpbWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCX0KCglpZiAodGltZSA9PSBudWxsKSB7IC8vIGdldHRlcgoJCXJldHVybiBtb21lbnQuZHVyYXRpb24oewoJCQlob3VyczogdGhpcy5ob3VycygpLAoJCQltaW51dGVzOiB0aGlzLm1pbnV0ZXMoKSwKCQkJc2Vjb25kczogdGhpcy5zZWNvbmRzKCksCgkJCW1pbGxpc2Vjb25kczogdGhpcy5taWxsaXNlY29uZHMoKQoJCX0pOwoJfQoJZWxzZSB7IC8vIHNldHRlcgoKCQl0aGlzLl9hbWJpZ1RpbWUgPSBmYWxzZTsgLy8gbWFyayB0aGF0IHRoZSBtb21lbnQgbm93IGhhcyBhIHRpbWUKCgkJaWYgKCFtb21lbnQuaXNEdXJhdGlvbih0aW1lKSAmJiAhbW9tZW50LmlzTW9tZW50KHRpbWUpKSB7CgkJCXRpbWUgPSBtb21lbnQuZHVyYXRpb24odGltZSk7CgkJfQoKCQkvLyBUaGUgZGF5IHZhbHVlIHNob3VsZCBjYXVzZSBvdmVyZmxvdyAoc28gMjQgaG91cnMgYmVjb21lcyAwMDowMDowMCBvZiBuZXh0IGRheSkuCgkJLy8gT25seSBmb3IgRHVyYXRpb24gdGltZXMsIG5vdCBNb21lbnQgdGltZXMuCgkJdmFyIGRheUhvdXJzID0gMDsKCQlpZiAobW9tZW50LmlzRHVyYXRpb24odGltZSkpIHsKCQkJZGF5SG91cnMgPSBNYXRoLmZsb29yKHRpbWUuYXNEYXlzKCkpICogMjQ7CgkJfQoKCQkvLyBXZSBuZWVkIHRvIHNldCB0aGUgaW5kaXZpZHVhbCBmaWVsZHMuCgkJLy8gQ2FuJ3QgdXNlIHN0YXJ0T2YoJ2RheScpIHRoZW4gYWRkIGR1cmF0aW9uLiBJbiBjYXNlIG9mIERTVCBhdCBzdGFydCBvZiBkYXkuCgkJcmV0dXJuIHRoaXMuaG91cnMoZGF5SG91cnMgKyB0aW1lLmhvdXJzKCkpCgkJCS5taW51dGVzKHRpbWUubWludXRlcygpKQoJCQkuc2Vjb25kcyh0aW1lLnNlY29uZHMoKSkKCQkJLm1pbGxpc2Vjb25kcyh0aW1lLm1pbGxpc2Vjb25kcygpKTsKCX0KfTsKCi8vIENvbnZlcnRzIHRoZSBtb21lbnQgdG8gVVRDLCBzdHJpcHBpbmcgb3V0IGl0cyB0aW1lLW9mLWRheSBhbmQgdGltZXpvbmUgb2Zmc2V0LAovLyBidXQgcHJlc2VydmluZyBpdHMgWU1ELiBBIG1vbWVudCB3aXRoIGEgc3RyaXBwZWQgdGltZSB3aWxsIGRpc3BsYXkgbm8gdGltZQovLyBub3IgdGltZXpvbmUgb2Zmc2V0IHdoZW4gLmZvcm1hdCgpIGlzIGNhbGxlZC4KbmV3TW9tZW50UHJvdG8uc3RyaXBUaW1lID0gZnVuY3Rpb24oKSB7CgoJaWYgKCF0aGlzLl9hbWJpZ1RpbWUpIHsKCgkJdGhpcy51dGModHJ1ZSk7IC8vIGtlZXBMb2NhbFRpbWU9dHJ1ZSAoZm9yIGtlZXBpbmcgKmRhdGUqIHZhbHVlKQoKCQkvLyBzZXQgdGltZSB0byB6ZXJvCgkJdGhpcy5zZXQoewoJCQlob3VyczogMCwKCQkJbWludXRlczogMCwKCQkJc2Vjb25kczogMCwKCQkJbXM6IDAKCQl9KTsKCgkJLy8gTWFyayB0aGUgdGltZSBhcyBhbWJpZ3VvdXMuIFRoaXMgbmVlZHMgdG8gaGFwcGVuIGFmdGVyIHRoZSAudXRjKCkgY2FsbCwgd2hpY2ggbWlnaHQgY2FsbCAudXRjT2Zmc2V0KCksCgkJLy8gd2hpY2ggY2xlYXJzIGFsbCBhbWJpZyBmbGFncy4KCQl0aGlzLl9hbWJpZ1RpbWUgPSB0cnVlOwoJCXRoaXMuX2FtYmlnWm9uZSA9IHRydWU7IC8vIGlmIGFtYmlndW91cyB0aW1lLCBhbHNvIGFtYmlndW91cyB0aW1lem9uZSBvZmZzZXQKCX0KCglyZXR1cm4gdGhpczsgLy8gZm9yIGNoYWluaW5nCn07CgovLyBSZXR1cm5zIGlmIHRoZSBtb21lbnQgaGFzIGEgbm9uLWFtYmlndW91cyB0aW1lIChib29sZWFuKQpuZXdNb21lbnRQcm90by5oYXNUaW1lID0gZnVuY3Rpb24oKSB7CglyZXR1cm4gIXRoaXMuX2FtYmlnVGltZTsKfTsKCgovLyBUaW1lem9uZQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBDb252ZXJ0cyB0aGUgbW9tZW50IHRvIFVUQywgc3RyaXBwaW5nIG91dCBpdHMgdGltZXpvbmUgb2Zmc2V0LCBidXQgcHJlc2VydmluZyBpdHMKLy8gWU1EIGFuZCB0aW1lLW9mLWRheS4gQSBtb21lbnQgd2l0aCBhIHN0cmlwcGVkIHRpbWV6b25lIG9mZnNldCB3aWxsIGRpc3BsYXkgbm8KLy8gdGltZXpvbmUgb2Zmc2V0IHdoZW4gLmZvcm1hdCgpIGlzIGNhbGxlZC4KbmV3TW9tZW50UHJvdG8uc3RyaXBab25lID0gZnVuY3Rpb24oKSB7Cgl2YXIgd2FzQW1iaWdUaW1lOwoKCWlmICghdGhpcy5fYW1iaWdab25lKSB7CgoJCXdhc0FtYmlnVGltZSA9IHRoaXMuX2FtYmlnVGltZTsKCgkJdGhpcy51dGModHJ1ZSk7IC8vIGtlZXBMb2NhbFRpbWU9dHJ1ZSAoZm9yIGtlZXBpbmcgZGF0ZSBhbmQgdGltZSB2YWx1ZXMpCgoJCS8vIHRoZSBhYm92ZSBjYWxsIHRvIC51dGMoKS8udXRjT2Zmc2V0KCkgdW5mb3J0dW5hdGVseSBtaWdodCBjbGVhciB0aGUgYW1iaWcgZmxhZ3MsIHNvIHJlc3RvcmUKCQl0aGlzLl9hbWJpZ1RpbWUgPSB3YXNBbWJpZ1RpbWUgfHwgZmFsc2U7CgoJCS8vIE1hcmsgdGhlIHpvbmUgYXMgYW1iaWd1b3VzLiBUaGlzIG5lZWRzIHRvIGhhcHBlbiBhZnRlciB0aGUgLnV0YygpIGNhbGwsIHdoaWNoIG1pZ2h0IGNhbGwgLnV0Y09mZnNldCgpLAoJCS8vIHdoaWNoIGNsZWFycyB0aGUgYW1iaWcgZmxhZ3MuCgkJdGhpcy5fYW1iaWdab25lID0gdHJ1ZTsKCX0KCglyZXR1cm4gdGhpczsgLy8gZm9yIGNoYWluaW5nCn07CgovLyBSZXR1cm5zIG9mIHRoZSBtb21lbnQgaGFzIGEgbm9uLWFtYmlndW91cyB0aW1lem9uZSBvZmZzZXQgKGJvb2xlYW4pCm5ld01vbWVudFByb3RvLmhhc1pvbmUgPSBmdW5jdGlvbigpIHsKCXJldHVybiAhdGhpcy5fYW1iaWdab25lOwp9OwoKCi8vIGltcGxpY2l0bHkgbWFya3MgYSB6b25lCm5ld01vbWVudFByb3RvLmxvY2FsID0gZnVuY3Rpb24oa2VlcExvY2FsVGltZSkgewoKCS8vIGZvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBhbWJpZ3VvdXNseS16b25lZCB0byBsb2NhbCwKCS8vIGtlZXAgdGhlIHRpbWUgdmFsdWVzIHdoZW4gY29udmVydGluZyBmcm9tIFVUQyAtPiBsb2NhbAoJb2xkTW9tZW50UHJvdG8ubG9jYWwuY2FsbCh0aGlzLCB0aGlzLl9hbWJpZ1pvbmUgfHwga2VlcExvY2FsVGltZSk7CgoJLy8gZW5zdXJlIG5vbi1hbWJpZ3VvdXMKCS8vIHRoaXMgcHJvYmFibHkgYWxyZWFkeSBoYXBwZW5lZCB2aWEgbG9jYWwoKSAtPiB1dGNPZmZzZXQoKSwgYnV0IGRvbid0IHJlbHkgb24gTW9tZW50J3MgaW50ZXJuYWxzCgl0aGlzLl9hbWJpZ1RpbWUgPSBmYWxzZTsKCXRoaXMuX2FtYmlnWm9uZSA9IGZhbHNlOwoKCXJldHVybiB0aGlzOyAvLyBmb3IgY2hhaW5pbmcKfTsKCgovLyBpbXBsaWNpdGx5IG1hcmtzIGEgem9uZQpuZXdNb21lbnRQcm90by51dGMgPSBmdW5jdGlvbihrZWVwTG9jYWxUaW1lKSB7CgoJb2xkTW9tZW50UHJvdG8udXRjLmNhbGwodGhpcywga2VlcExvY2FsVGltZSk7CgoJLy8gZW5zdXJlIG5vbi1hbWJpZ3VvdXMKCS8vIHRoaXMgcHJvYmFibHkgYWxyZWFkeSBoYXBwZW5lZCB2aWEgdXRjKCkgLT4gdXRjT2Zmc2V0KCksIGJ1dCBkb24ndCByZWx5IG9uIE1vbWVudCdzIGludGVybmFscwoJdGhpcy5fYW1iaWdUaW1lID0gZmFsc2U7Cgl0aGlzLl9hbWJpZ1pvbmUgPSBmYWxzZTsKCglyZXR1cm4gdGhpczsKfTsKCgovLyBpbXBsaWNpdGx5IG1hcmtzIGEgem9uZSAod2lsbCBwcm9iYWJseSBnZXQgY2FsbGVkIHVwb24gLnV0YygpIGFuZCAubG9jYWwoKSkKbmV3TW9tZW50UHJvdG8udXRjT2Zmc2V0ID0gZnVuY3Rpb24odHpvKSB7CgoJaWYgKHR6byAhPSBudWxsKSB7IC8vIHNldHRlcgoJCS8vIHRoZXNlIGFzc2lnbm1lbnRzIG5lZWRzIHRvIGhhcHBlbiBiZWZvcmUgdGhlIG9yaWdpbmFsIHpvbmUgbWV0aG9kIGlzIGNhbGxlZC4KCQkvLyBJIGZvcmdldCB3aHksIHNvbWV0aGluZyB0byBkbyB3aXRoIGEgYnJvd3NlciBjcmFzaC4KCQl0aGlzLl9hbWJpZ1RpbWUgPSBmYWxzZTsKCQl0aGlzLl9hbWJpZ1pvbmUgPSBmYWxzZTsKCX0KCglyZXR1cm4gb2xkTW9tZW50UHJvdG8udXRjT2Zmc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn07CgoKLy8gRm9ybWF0dGluZwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpuZXdNb21lbnRQcm90by5mb3JtYXQgPSBmdW5jdGlvbigpIHsKCWlmICh0aGlzLl9mdWxsQ2FsZW5kYXIgJiYgYXJndW1lbnRzWzBdKSB7IC8vIGFuIGVuaGFuY2VkIG1vbWVudD8gYW5kIGEgZm9ybWF0IHN0cmluZyBwcm92aWRlZD8KCQlyZXR1cm4gZm9ybWF0RGF0ZSh0aGlzLCBhcmd1bWVudHNbMF0pOyAvLyBvdXIgZXh0ZW5kZWQgZm9ybWF0dGluZwoJfQoJaWYgKHRoaXMuX2FtYmlnVGltZSkgewoJCXJldHVybiBvbGRNb21lbnRGb3JtYXQodGhpcywgJ1lZWVktTU0tREQnKTsKCX0KCWlmICh0aGlzLl9hbWJpZ1pvbmUpIHsKCQlyZXR1cm4gb2xkTW9tZW50Rm9ybWF0KHRoaXMsICdZWVlZLU1NLUREW1RdSEg6bW06c3MnKTsKCX0KCXJldHVybiBvbGRNb21lbnRQcm90by5mb3JtYXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfTsKCm5ld01vbWVudFByb3RvLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24oKSB7CglpZiAodGhpcy5fYW1iaWdUaW1lKSB7CgkJcmV0dXJuIG9sZE1vbWVudEZvcm1hdCh0aGlzLCAnWVlZWS1NTS1ERCcpOwoJfQoJaWYgKHRoaXMuX2FtYmlnWm9uZSkgewoJCXJldHVybiBvbGRNb21lbnRGb3JtYXQodGhpcywgJ1lZWVktTU0tRERbVF1ISDptbTpzcycpOwoJfQoJcmV0dXJuIG9sZE1vbWVudFByb3RvLnRvSVNPU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn07Cgo7OwoKLy8gU2luZ2xlIERhdGUgRm9ybWF0dGluZwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKLy8gY2FsbCB0aGlzIGlmIHlvdSB3YW50IE1vbWVudCdzIG9yaWdpbmFsIGZvcm1hdCBtZXRob2QgdG8gYmUgdXNlZApmdW5jdGlvbiBvbGRNb21lbnRGb3JtYXQobW9tLCBmb3JtYXRTdHIpIHsKCXJldHVybiBvbGRNb21lbnRQcm90by5mb3JtYXQuY2FsbChtb20sIGZvcm1hdFN0cik7IC8vIG9sZE1vbWVudFByb3RvIGRlZmluZWQgaW4gbW9tZW50LWV4dC5qcwp9CgoKLy8gRm9ybWF0cyBgZGF0ZWAgd2l0aCBhIE1vbWVudCBmb3JtYXR0aW5nIHN0cmluZywgYnV0IGFsbG93IG91ciBub24temVybyBhcmVhcyBhbmQKLy8gYWRkaXRpb25hbCB0b2tlbi4KZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlLCBmb3JtYXRTdHIpIHsKCXJldHVybiBmb3JtYXREYXRlV2l0aENodW5rcyhkYXRlLCBnZXRGb3JtYXRTdHJpbmdDaHVua3MoZm9ybWF0U3RyKSk7Cn0KCgpmdW5jdGlvbiBmb3JtYXREYXRlV2l0aENodW5rcyhkYXRlLCBjaHVua3MpIHsKCXZhciBzID0gJyc7Cgl2YXIgaTsKCglmb3IgKGk9MDsgaTxjaHVua3MubGVuZ3RoOyBpKyspIHsKCQlzICs9IGZvcm1hdERhdGVXaXRoQ2h1bmsoZGF0ZSwgY2h1bmtzW2ldKTsKCX0KCglyZXR1cm4gczsKfQoKCi8vIGFkZGl0aW9uIGZvcm1hdHRpbmcgdG9rZW5zIHdlIHdhbnQgcmVjb2duaXplZAp2YXIgdG9rZW5PdmVycmlkZXMgPSB7Cgl0OiBmdW5jdGlvbihkYXRlKSB7IC8vICJhIiBvciAicCIKCQlyZXR1cm4gb2xkTW9tZW50Rm9ybWF0KGRhdGUsICdhJykuY2hhckF0KDApOwoJfSwKCVQ6IGZ1bmN0aW9uKGRhdGUpIHsgLy8gIkEiIG9yICJQIgoJCXJldHVybiBvbGRNb21lbnRGb3JtYXQoZGF0ZSwgJ0EnKS5jaGFyQXQoMCk7Cgl9Cn07CgoKZnVuY3Rpb24gZm9ybWF0RGF0ZVdpdGhDaHVuayhkYXRlLCBjaHVuaykgewoJdmFyIHRva2VuOwoJdmFyIG1heWJlU3RyOwoKCWlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7IC8vIGEgbGl0ZXJhbCBzdHJpbmcKCQlyZXR1cm4gY2h1bms7Cgl9CgllbHNlIGlmICgodG9rZW4gPSBjaHVuay50b2tlbikpIHsgLy8gYSB0b2tlbiwgbGlrZSAiWVlZWSIKCQlpZiAodG9rZW5PdmVycmlkZXNbdG9rZW5dKSB7CgkJCXJldHVybiB0b2tlbk92ZXJyaWRlc1t0b2tlbl0oZGF0ZSk7IC8vIHVzZSBvdXIgY3VzdG9tIHRva2VuCgkJfQoJCXJldHVybiBvbGRNb21lbnRGb3JtYXQoZGF0ZSwgdG9rZW4pOwoJfQoJZWxzZSBpZiAoY2h1bmsubWF5YmUpIHsgLy8gYSBncm91cGluZyBvZiBvdGhlciBjaHVua3MgdGhhdCBtdXN0IGJlIG5vbi16ZXJvCgkJbWF5YmVTdHIgPSBmb3JtYXREYXRlV2l0aENodW5rcyhkYXRlLCBjaHVuay5tYXliZSk7CgkJaWYgKG1heWJlU3RyLm1hdGNoKC9bMS05XS8pKSB7CgkJCXJldHVybiBtYXliZVN0cjsKCQl9Cgl9CgoJcmV0dXJuICcnOwp9CgoKLy8gRGF0ZSBSYW5nZSBGb3JtYXR0aW5nCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVE9ETzogbWFrZSBpdCB3b3JrIHdpdGggdGltZXpvbmUgb2Zmc2V0CgovLyBVc2luZyBhIGZvcm1hdHRpbmcgc3RyaW5nIG1lYW50IGZvciBhIHNpbmdsZSBkYXRlLCBnZW5lcmF0ZSBhIHJhbmdlIHN0cmluZywgbGlrZQovLyAiU2VwIDIgLSA5IDIwMTMiLCB0aGF0IGludGVsbGlnZW50bHkgaW5zZXJ0cyBhIHNlcGFyYXRvciB3aGVyZSB0aGUgZGF0ZXMgZGlmZmVyLgovLyBJZiB0aGUgZGF0ZXMgYXJlIHRoZSBzYW1lIGFzIGZhciBhcyB0aGUgZm9ybWF0IHN0cmluZyBpcyBjb25jZXJuZWQsIGp1c3QgcmV0dXJuIGEgc2luZ2xlCi8vIHJlbmRlcmluZyBvZiBvbmUgZGF0ZSwgd2l0aG91dCBhbnkgc2VwYXJhdG9yLgpmdW5jdGlvbiBmb3JtYXRSYW5nZShkYXRlMSwgZGF0ZTIsIGZvcm1hdFN0ciwgc2VwYXJhdG9yLCBpc1JUTCkgewoJdmFyIGxvY2FsZURhdGE7CgoJZGF0ZTEgPSBGQy5tb21lbnQucGFyc2Vab25lKGRhdGUxKTsKCWRhdGUyID0gRkMubW9tZW50LnBhcnNlWm9uZShkYXRlMik7CgoJbG9jYWxlRGF0YSA9IGRhdGUxLmxvY2FsZURhdGEoKTsKCgkvLyBFeHBhbmQgbG9jYWxpemVkIGZvcm1hdCBzdHJpbmdzLCBsaWtlICJMTCIgLT4gIk1NTU0gRCBZWVlZIgoJZm9ybWF0U3RyID0gbG9jYWxlRGF0YS5sb25nRGF0ZUZvcm1hdChmb3JtYXRTdHIpIHx8IGZvcm1hdFN0cjsKCS8vIEJUVywgdGhpcyBpcyBub3QgaW1wb3J0YW50IGZvciBgZm9ybWF0RGF0ZWAgYmVjYXVzZSBpdCBpcyBpbXBvc3NpYmxlIHRvIHB1dCBjdXN0b20gdG9rZW5zCgkvLyBvciBub24temVybyBhcmVhcyBpbiBNb21lbnQncyBsb2NhbGl6ZWQgZm9ybWF0IHN0cmluZ3MuCgoJc2VwYXJhdG9yID0gc2VwYXJhdG9yIHx8ICcgLSAnOwoKCXJldHVybiBmb3JtYXRSYW5nZVdpdGhDaHVua3MoCgkJZGF0ZTEsCgkJZGF0ZTIsCgkJZ2V0Rm9ybWF0U3RyaW5nQ2h1bmtzKGZvcm1hdFN0ciksCgkJc2VwYXJhdG9yLAoJCWlzUlRMCgkpOwp9CkZDLmZvcm1hdFJhbmdlID0gZm9ybWF0UmFuZ2U7IC8vIGV4cG9zZQoKCmZ1bmN0aW9uIGZvcm1hdFJhbmdlV2l0aENodW5rcyhkYXRlMSwgZGF0ZTIsIGNodW5rcywgc2VwYXJhdG9yLCBpc1JUTCkgewoJdmFyIHVuem9uZWREYXRlMSA9IGRhdGUxLmNsb25lKCkuc3RyaXBab25lKCk7IC8vIGZvciBmb3JtYXRTaW1pbGFyQ2h1bmsKCXZhciB1bnpvbmVkRGF0ZTIgPSBkYXRlMi5jbG9uZSgpLnN0cmlwWm9uZSgpOyAvLyAiCgl2YXIgY2h1bmtTdHI7IC8vIHRoZSByZW5kZXJpbmcgb2YgdGhlIGNodW5rCgl2YXIgbGVmdEk7Cgl2YXIgbGVmdFN0ciA9ICcnOwoJdmFyIHJpZ2h0STsKCXZhciByaWdodFN0ciA9ICcnOwoJdmFyIG1pZGRsZUk7Cgl2YXIgbWlkZGxlU3RyMSA9ICcnOwoJdmFyIG1pZGRsZVN0cjIgPSAnJzsKCXZhciBtaWRkbGVTdHIgPSAnJzsKCgkvLyBTdGFydCBhdCB0aGUgbGVmdG1vc3Qgc2lkZSBvZiB0aGUgZm9ybWF0dGluZyBzdHJpbmcgYW5kIGNvbnRpbnVlIHVudGlsIHlvdSBoaXQgYSB0b2tlbgoJLy8gdGhhdCBpcyBub3QgdGhlIHNhbWUgYmV0d2VlbiBkYXRlcy4KCWZvciAobGVmdEk9MDsgbGVmdEk8Y2h1bmtzLmxlbmd0aDsgbGVmdEkrKykgewoJCWNodW5rU3RyID0gZm9ybWF0U2ltaWxhckNodW5rKGRhdGUxLCBkYXRlMiwgdW56b25lZERhdGUxLCB1bnpvbmVkRGF0ZTIsIGNodW5rc1tsZWZ0SV0pOwoJCWlmIChjaHVua1N0ciA9PT0gZmFsc2UpIHsKCQkJYnJlYWs7CgkJfQoJCWxlZnRTdHIgKz0gY2h1bmtTdHI7Cgl9CgoJLy8gU2ltaWxhcmx5LCBzdGFydCBhdCB0aGUgcmlnaHRtb3N0IHNpZGUgb2YgdGhlIGZvcm1hdHRpbmcgc3RyaW5nIGFuZCBtb3ZlIGxlZnQKCWZvciAocmlnaHRJPWNodW5rcy5sZW5ndGgtMTsgcmlnaHRJPmxlZnRJOyByaWdodEktLSkgewoJCWNodW5rU3RyID0gZm9ybWF0U2ltaWxhckNodW5rKGRhdGUxLCBkYXRlMiwgdW56b25lZERhdGUxLCB1bnpvbmVkRGF0ZTIsICBjaHVua3NbcmlnaHRJXSk7CgkJaWYgKGNodW5rU3RyID09PSBmYWxzZSkgewoJCQlicmVhazsKCQl9CgkJcmlnaHRTdHIgPSBjaHVua1N0ciArIHJpZ2h0U3RyOwoJfQoKCS8vIFRoZSBhcmVhIGluIHRoZSBtaWRkbGUgaXMgZGlmZmVyZW50IGZvciBib3RoIG9mIHRoZSBkYXRlcy4KCS8vIENvbGxlY3QgdGhlbSBkaXN0aW5jdGx5IHNvIHdlIGNhbiBqYW0gdGhlbSB0b2dldGhlciBsYXRlci4KCWZvciAobWlkZGxlST1sZWZ0STsgbWlkZGxlSTw9cmlnaHRJOyBtaWRkbGVJKyspIHsKCQltaWRkbGVTdHIxICs9IGZvcm1hdERhdGVXaXRoQ2h1bmsoZGF0ZTEsIGNodW5rc1ttaWRkbGVJXSk7CgkJbWlkZGxlU3RyMiArPSBmb3JtYXREYXRlV2l0aENodW5rKGRhdGUyLCBjaHVua3NbbWlkZGxlSV0pOwoJfQoKCWlmIChtaWRkbGVTdHIxIHx8IG1pZGRsZVN0cjIpIHsKCQlpZiAoaXNSVEwpIHsKCQkJbWlkZGxlU3RyID0gbWlkZGxlU3RyMiArIHNlcGFyYXRvciArIG1pZGRsZVN0cjE7CgkJfQoJCWVsc2UgewoJCQltaWRkbGVTdHIgPSBtaWRkbGVTdHIxICsgc2VwYXJhdG9yICsgbWlkZGxlU3RyMjsKCQl9Cgl9CgoJcmV0dXJuIGxlZnRTdHIgKyBtaWRkbGVTdHIgKyByaWdodFN0cjsKfQoKCnZhciBzaW1pbGFyVW5pdE1hcCA9IHsKCVk6ICd5ZWFyJywKCU06ICdtb250aCcsCglEOiAnZGF5JywgLy8gZGF5IG9mIG1vbnRoCglkOiAnZGF5JywgLy8gZGF5IG9mIHdlZWsKCS8vIHByZXZlbnRzIGEgc2VwYXJhdG9yIGJldHdlZW4gYW55dGhpbmcgdGltZS1yZWxhdGVkLi4uCglBOiAnc2Vjb25kJywgLy8gQU0vUE0KCWE6ICdzZWNvbmQnLCAvLyBhbS9wbQoJVDogJ3NlY29uZCcsIC8vIEEvUAoJdDogJ3NlY29uZCcsIC8vIGEvcAoJSDogJ3NlY29uZCcsIC8vIGhvdXIgKDI0KQoJaDogJ3NlY29uZCcsIC8vIGhvdXIgKDEyKQoJbTogJ3NlY29uZCcsIC8vIG1pbnV0ZQoJczogJ3NlY29uZCcgLy8gc2Vjb25kCn07Ci8vIFRPRE86IHdlZWsgbWF5YmU/CgoKLy8gR2l2ZW4gYSBmb3JtYXR0aW5nIGNodW5rLCBhbmQgZ2l2ZW4gdGhhdCBib3RoIGRhdGVzIGFyZSBzaW1pbGFyIGluIHRoZSByZWdhcmQgdGhlCi8vIGZvcm1hdHRpbmcgY2h1bmsgaXMgY29uY2VybmVkLCBmb3JtYXQgZGF0ZTEgYWdhaW5zdCBgY2h1bmtgLiBPdGhlcndpc2UsIHJldHVybiBgZmFsc2VgLgpmdW5jdGlvbiBmb3JtYXRTaW1pbGFyQ2h1bmsoZGF0ZTEsIGRhdGUyLCB1bnpvbmVkRGF0ZTEsIHVuem9uZWREYXRlMiwgY2h1bmspIHsKCXZhciB0b2tlbjsKCXZhciB1bml0OwoKCWlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7IC8vIGEgbGl0ZXJhbCBzdHJpbmcKCQlyZXR1cm4gY2h1bms7Cgl9CgllbHNlIGlmICgodG9rZW4gPSBjaHVuay50b2tlbikpIHsKCQl1bml0ID0gc2ltaWxhclVuaXRNYXBbdG9rZW4uY2hhckF0KDApXTsKCgkJLy8gYXJlIHRoZSBkYXRlcyB0aGUgc2FtZSBmb3IgdGhpcyB1bml0IG9mIG1lYXN1cmVtZW50PwoJCS8vIHVzZSB0aGUgdW56b25lZCBkYXRlcyBmb3IgdGhpcyBjYWxjdWxhdGlvbiBiZWNhdXNlIHVucmVsaWFibGUgd2hlbiBuZWFyIERTVCAoYnVnICMyMzk2KQoJCWlmICh1bml0ICYmIHVuem9uZWREYXRlMS5pc1NhbWUodW56b25lZERhdGUyLCB1bml0KSkgewoJCQlyZXR1cm4gb2xkTW9tZW50Rm9ybWF0KGRhdGUxLCB0b2tlbik7IC8vIHdvdWxkIGJlIHRoZSBzYW1lIGlmIHdlIHVzZWQgYGRhdGUyYAoJCQkvLyBCVFcsIGRvbid0IHN1cHBvcnQgY3VzdG9tIHRva2VucwoJCX0KCX0KCglyZXR1cm4gZmFsc2U7IC8vIHRoZSBjaHVuayBpcyBOT1QgdGhlIHNhbWUgZm9yIHRoZSB0d28gZGF0ZXMKCS8vIEJUVywgZG9uJ3Qgc3VwcG9ydCBzcGxpdHRpbmcgb24gbm9uLXplcm8gYXJlYXMKfQoKCi8vIENodW5raW5nIFV0aWxzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgp2YXIgZm9ybWF0U3RyaW5nQ2h1bmtDYWNoZSA9IHt9OwoKCmZ1bmN0aW9uIGdldEZvcm1hdFN0cmluZ0NodW5rcyhmb3JtYXRTdHIpIHsKCWlmIChmb3JtYXRTdHIgaW4gZm9ybWF0U3RyaW5nQ2h1bmtDYWNoZSkgewoJCXJldHVybiBmb3JtYXRTdHJpbmdDaHVua0NhY2hlW2Zvcm1hdFN0cl07Cgl9CglyZXR1cm4gKGZvcm1hdFN0cmluZ0NodW5rQ2FjaGVbZm9ybWF0U3RyXSA9IGNodW5rRm9ybWF0U3RyaW5nKGZvcm1hdFN0cikpOwp9CgoKLy8gQnJlYWsgdGhlIGZvcm1hdHRpbmcgc3RyaW5nIGludG8gYW4gYXJyYXkgb2YgY2h1bmtzCmZ1bmN0aW9uIGNodW5rRm9ybWF0U3RyaW5nKGZvcm1hdFN0cikgewoJdmFyIGNodW5rcyA9IFtdOwoJdmFyIGNodW5rZXIgPSAvXFsoW15cXV0qKVxdfFwoKFteXCldKilcKXwoTFRTfExUfChcdylcNCpvPyl8KFteXHdcW1woXSspL2c7IC8vIFRPRE86IG1vcmUgZGVzY3JpbWluYXRpb24KCXZhciBtYXRjaDsKCgl3aGlsZSAoKG1hdGNoID0gY2h1bmtlci5leGVjKGZvcm1hdFN0cikpKSB7CgkJaWYgKG1hdGNoWzFdKSB7IC8vIGEgbGl0ZXJhbCBzdHJpbmcgaW5zaWRlIFsgLi4uIF0KCQkJY2h1bmtzLnB1c2gobWF0Y2hbMV0pOwoJCX0KCQllbHNlIGlmIChtYXRjaFsyXSkgeyAvLyBub24temVybyBmb3JtYXR0aW5nIGluc2lkZSAoIC4uLiApCgkJCWNodW5rcy5wdXNoKHsgbWF5YmU6IGNodW5rRm9ybWF0U3RyaW5nKG1hdGNoWzJdKSB9KTsKCQl9CgkJZWxzZSBpZiAobWF0Y2hbM10pIHsgLy8gYSBmb3JtYXR0aW5nIHRva2VuCgkJCWNodW5rcy5wdXNoKHsgdG9rZW46IG1hdGNoWzNdIH0pOwoJCX0KCQllbHNlIGlmIChtYXRjaFs1XSkgeyAvLyBhbiB1bmVuY2xvc2VkIGxpdGVyYWwgc3RyaW5nCgkJCWNodW5rcy5wdXNoKG1hdGNoWzVdKTsKCQl9Cgl9CgoJcmV0dXJuIGNodW5rczsKfQoKCi8vIE1pc2MgVXRpbHMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCi8vIGdyYW51bGFyaXR5IG9ubHkgZ29lcyB1cCB1bnRpbCBkYXkKLy8gVE9ETzogdW5pZnkgd2l0aCBzaW1pbGFyVW5pdE1hcAp2YXIgdG9rZW5HcmFudWxhcml0aWVzID0gewoJWTogeyB2YWx1ZTogMSwgdW5pdDogJ3llYXInIH0sCglNOiB7IHZhbHVlOiAyLCB1bml0OiAnbW9udGgnIH0sCglXOiB7IHZhbHVlOiAzLCB1bml0OiAnd2VlaycgfSwKCXc6IHsgdmFsdWU6IDMsIHVuaXQ6ICd3ZWVrJyB9LAoJRDogeyB2YWx1ZTogNCwgdW5pdDogJ2RheScgfSwgLy8gZGF5IG9mIG1vbnRoCglkOiB7IHZhbHVlOiA0LCB1bml0OiAnZGF5JyB9IC8vIGRheSBvZiB3ZWVrCn07CgovLyByZXR1cm5zIGEgdW5pdCBzdHJpbmcsIGVpdGhlciAneWVhcicsICdtb250aCcsICdkYXknLCBvciBudWxsCi8vIGZvciB0aGUgbW9zdCBncmFudWxhciBmb3JtYXR0aW5nIHRva2VuIGluIHRoZSBzdHJpbmcuCkZDLnF1ZXJ5TW9zdEdyYW51bGFyRm9ybWF0VW5pdCA9IGZ1bmN0aW9uKGZvcm1hdFN0cikgewoJdmFyIGNodW5rcyA9IGdldEZvcm1hdFN0cmluZ0NodW5rcyhmb3JtYXRTdHIpOwoJdmFyIGksIGNodW5rOwoJdmFyIGNhbmRpZGF0ZTsKCXZhciBiZXN0OwoKCWZvciAoaSA9IDA7IGkgPCBjaHVua3MubGVuZ3RoOyBpKyspIHsKCQljaHVuayA9IGNodW5rc1tpXTsKCQlpZiAoY2h1bmsudG9rZW4pIHsKCQkJY2FuZGlkYXRlID0gdG9rZW5HcmFudWxhcml0aWVzW2NodW5rLnRva2VuLmNoYXJBdCgwKV07CgkJCWlmIChjYW5kaWRhdGUpIHsKCQkJCWlmICghYmVzdCB8fCBjYW5kaWRhdGUudmFsdWUgPiBiZXN0LnZhbHVlKSB7CgkJCQkJYmVzdCA9IGNhbmRpZGF0ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCglpZiAoYmVzdCkgewoJCXJldHVybiBiZXN0LnVuaXQ7Cgl9CgoJcmV0dXJuIG51bGw7Cn07Cgo7OwoKRkMuQ2xhc3MgPSBDbGFzczsgLy8gZXhwb3J0CgovLyBDbGFzcyB0aGF0IGFsbCBvdGhlciBjbGFzc2VzIHdpbGwgaW5oZXJpdCBmcm9tCmZ1bmN0aW9uIENsYXNzKCkgeyB9CgoKLy8gQ2FsbGVkIG9uIGEgY2xhc3MgdG8gY3JlYXRlIGEgc3ViY2xhc3MuCi8vIExhc3QgYXJndW1lbnQgY29udGFpbnMgaW5zdGFuY2UgbWV0aG9kcy4gQW55IGFyZ3VtZW50IGJlZm9yZSB0aGUgbGFzdCBhcmUgY29uc2lkZXJlZCBtaXhpbnMuCkNsYXNzLmV4dGVuZCA9IGZ1bmN0aW9uKCkgewoJdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7Cgl2YXIgaTsKCXZhciBtZW1iZXJzOwoKCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewoJCW1lbWJlcnMgPSBhcmd1bWVudHNbaV07CgkJaWYgKGkgPCBsZW4gLSAxKSB7IC8vIG5vdCB0aGUgbGFzdCBhcmd1bWVudD8KCQkJbWl4SW50b0NsYXNzKHRoaXMsIG1lbWJlcnMpOwoJCX0KCX0KCglyZXR1cm4gZXh0ZW5kQ2xhc3ModGhpcywgbWVtYmVycyB8fCB7fSk7IC8vIG1lbWJlcnMgd2lsbCBiZSB1bmRlZmluZWQgaWYgbm8gYXJndW1lbnRzCn07CgoKLy8gQWRkcyBuZXcgbWVtYmVyIHZhcmlhYmxlcy9tZXRob2RzIHRvIHRoZSBjbGFzcydzIHByb3RvdHlwZS4KLy8gQ2FuIGJlIGNhbGxlZCB3aXRoIGFub3RoZXIgY2xhc3MsIG9yIGEgcGxhaW4gb2JqZWN0IGhhc2ggY29udGFpbmluZyBuZXcgbWVtYmVycy4KQ2xhc3MubWl4aW4gPSBmdW5jdGlvbihtZW1iZXJzKSB7CgltaXhJbnRvQ2xhc3ModGhpcywgbWVtYmVycyk7Cn07CgoKZnVuY3Rpb24gZXh0ZW5kQ2xhc3Moc3VwZXJDbGFzcywgbWVtYmVycykgewoJdmFyIHN1YkNsYXNzOwoKCS8vIGVuc3VyZSBhIGNvbnN0cnVjdG9yIGZvciB0aGUgc3ViY2xhc3MsIGZvcndhcmRpbmcgYWxsIGFyZ3VtZW50cyB0byB0aGUgc3VwZXItY29uc3RydWN0b3IgaWYgaXQgZG9lc24ndCBleGlzdAoJaWYgKGhhc093blByb3AobWVtYmVycywgJ2NvbnN0cnVjdG9yJykpIHsKCQlzdWJDbGFzcyA9IG1lbWJlcnMuY29uc3RydWN0b3I7Cgl9CglpZiAodHlwZW9mIHN1YkNsYXNzICE9PSAnZnVuY3Rpb24nKSB7CgkJc3ViQ2xhc3MgPSBtZW1iZXJzLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7CgkJCXN1cGVyQ2xhc3MuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCQl9OwoJfQoKCS8vIGJ1aWxkIHRoZSBiYXNlIHByb3RvdHlwZSBmb3IgdGhlIHN1YmNsYXNzLCB3aGljaCBpcyBhbiBuZXcgb2JqZWN0IGNoYWluZWQgdG8gdGhlIHN1cGVyY2xhc3MncyBwcm90b3R5cGUKCXN1YkNsYXNzLnByb3RvdHlwZSA9IGNyZWF0ZU9iamVjdChzdXBlckNsYXNzLnByb3RvdHlwZSk7CgoJLy8gY29weSBlYWNoIG1lbWJlciB2YXJpYWJsZS9tZXRob2Qgb250byB0aGUgdGhlIHN1YmNsYXNzJ3MgcHJvdG90eXBlCgljb3B5T3duUHJvcHMobWVtYmVycywgc3ViQ2xhc3MucHJvdG90eXBlKTsKCgkvLyBjb3B5IG92ZXIgYWxsIGNsYXNzIHZhcmlhYmxlcy9tZXRob2RzIHRvIHRoZSBzdWJjbGFzcywgc3VjaCBhcyBgZXh0ZW5kYCBhbmQgYG1peGluYAoJY29weU93blByb3BzKHN1cGVyQ2xhc3MsIHN1YkNsYXNzKTsKCglyZXR1cm4gc3ViQ2xhc3M7Cn0KCgpmdW5jdGlvbiBtaXhJbnRvQ2xhc3ModGhlQ2xhc3MsIG1lbWJlcnMpIHsKCWNvcHlPd25Qcm9wcyhtZW1iZXJzLCB0aGVDbGFzcy5wcm90b3R5cGUpOwp9Cjs7Cgp2YXIgRW1pdHRlck1peGluID0gRkMuRW1pdHRlck1peGluID0gewoKCS8vIGpRdWVyeS1pZmljYXRpb24gdmlhICQodGhpcykgYWxsb3dzIGEgbm9uLURPTSBvYmplY3QgdG8gaGF2ZQoJLy8gdGhlIHNhbWUgZXZlbnQgaGFuZGxpbmcgY2FwYWJpbGl0aWVzIChpbmNsdWRpbmcgbmFtZXNwYWNlcykuCgoKCW9uOiBmdW5jdGlvbih0eXBlcywgaGFuZGxlcikgewoKCQkvLyBoYW5kbGVycyBhcmUgYWx3YXlzIGNhbGxlZCB3aXRoIGFuICJldmVudCIgb2JqZWN0IGFzIHRoZWlyIGZpcnN0IHBhcmFtLgoJCS8vIHNuZWFrIHRoZSBgdGhpc2AgY29udGV4dCBhbmQgYXJndW1lbnRzIGludG8gdGhlIGV4dHJhIHBhcmFtZXRlciBvYmplY3QKCQkvLyBhbmQgZm9yd2FyZCB0aGVtIG9uIHRvIHRoZSBvcmlnaW5hbCBoYW5kbGVyLgoJCXZhciBpbnRlcmNlcHQgPSBmdW5jdGlvbihldiwgZXh0cmEpIHsKCQkJcmV0dXJuIGhhbmRsZXIuYXBwbHkoCgkJCQlleHRyYS5jb250ZXh0IHx8IHRoaXMsCgkJCQlleHRyYS5hcmdzIHx8IFtdCgkJCSk7CgkJfTsKCgkJLy8gbWltaWNrIGpRdWVyeSdzIGludGVybmFsICJwcm94eSIgc3lzdGVtIChyaXNreSwgSSBrbm93KQoJCS8vIGNhdXNpbmcgYWxsIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIC5ndWlkIHRvIGFwcGVhciB0byBiZSB0aGUgc2FtZS4KCQkvLyBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9ibG9iLzIuMi40L3NyYy9jb3JlLmpzI0w0NDgKCQkvLyB0aGlzIGlzIG5lZWRlZCBmb3IgY2FsbGluZyAub2ZmIHdpdGggdGhlIG9yaWdpbmFsIG5vbi1pbnRlcmNlcHQgaGFuZGxlci4KCQlpZiAoIWhhbmRsZXIuZ3VpZCkgewoJCQloYW5kbGVyLmd1aWQgPSAkLmd1aWQrKzsKCQl9CgkJaW50ZXJjZXB0Lmd1aWQgPSBoYW5kbGVyLmd1aWQ7CgoJCSQodGhpcykub24odHlwZXMsIGludGVyY2VwdCk7CgoJCXJldHVybiB0aGlzOyAvLyBmb3IgY2hhaW5pbmcKCX0sCgoKCW9mZjogZnVuY3Rpb24odHlwZXMsIGhhbmRsZXIpIHsKCQkkKHRoaXMpLm9mZih0eXBlcywgaGFuZGxlcik7CgoJCXJldHVybiB0aGlzOyAvLyBmb3IgY2hhaW5pbmcKCX0sCgoKCXRyaWdnZXI6IGZ1bmN0aW9uKHR5cGVzKSB7CgkJdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOyAvLyBhcmd1bWVudHMgYWZ0ZXIgdGhlIGZpcnN0CgoJCS8vIHBhc3MgaW4gImV4dHJhIiBpbmZvIHRvIHRoZSBpbnRlcmNlcHQKCQkkKHRoaXMpLnRyaWdnZXJIYW5kbGVyKHR5cGVzLCB7IGFyZ3M6IGFyZ3MgfSk7CgoJCXJldHVybiB0aGlzOyAvLyBmb3IgY2hhaW5pbmcKCX0sCgoKCXRyaWdnZXJXaXRoOiBmdW5jdGlvbih0eXBlcywgY29udGV4dCwgYXJncykgewoKCQkvLyBgdHJpZ2dlckhhbmRsZXJgIGlzIGxlc3MgcmVsaWFudCBvbiB0aGUgRE9NIGNvbXBhcmVkIHRvIGB0cmlnZ2VyYC4KCQkvLyBwYXNzIGluICJleHRyYSIgaW5mbyB0byB0aGUgaW50ZXJjZXB0LgoJCSQodGhpcykudHJpZ2dlckhhbmRsZXIodHlwZXMsIHsgY29udGV4dDogY29udGV4dCwgYXJnczogYXJncyB9KTsKCgkJcmV0dXJuIHRoaXM7IC8vIGZvciBjaGFpbmluZwoJfQoKfTsKCjs7CgovKgpVdGlsaXR5IG1ldGhvZHMgZm9yIGVhc2lseSBsaXN0ZW5pbmcgdG8gZXZlbnRzIG9uIGFub3RoZXIgb2JqZWN0LAphbmQgbW9yZSBpbXBvcnRhbnRseSwgZWFzaWx5IHVubGlzdGVuaW5nIGZyb20gdGhlbS4KKi8KdmFyIExpc3RlbmVyTWl4aW4gPSBGQy5MaXN0ZW5lck1peGluID0gKGZ1bmN0aW9uKCkgewoJdmFyIGd1aWQgPSAwOwoJdmFyIExpc3RlbmVyTWl4aW4gPSB7CgoJCWxpc3RlbmVySWQ6IG51bGwsCgoJCS8qCgkJR2l2ZW4gYW4gYG90aGVyYCBvYmplY3QgdGhhdCBoYXMgb24vb2ZmIG1ldGhvZHMsIGJpbmQgdGhlIGdpdmVuIGBjYWxsYmFja2AgdG8gYW4gZXZlbnQgYnkgdGhlIGdpdmVuIG5hbWUuCgkJVGhlIGBjYWxsYmFja2Agd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgYHRoaXNgIGNvbnRleHQgb2YgdGhlIG9iamVjdCB0aGF0IC5saXN0ZW5UbyBpcyBiZWluZyBjYWxsZWQgb24uCgkJQ2FuIGJlIGNhbGxlZDoKCQkJLmxpc3RlblRvKG90aGVyLCBldmVudE5hbWUsIGNhbGxiYWNrKQoJCU9SCgkJCS5saXN0ZW5UbyhvdGhlciwgewoJCQkJZXZlbnROYW1lMTogY2FsbGJhY2sxLAoJCQkJZXZlbnROYW1lMjogY2FsbGJhY2syCgkJCX0pCgkJKi8KCQlsaXN0ZW5UbzogZnVuY3Rpb24ob3RoZXIsIGFyZywgY2FsbGJhY2spIHsKCQkJaWYgKHR5cGVvZiBhcmcgPT09ICdvYmplY3QnKSB7IC8vIGdpdmVuIGRpY3Rpb25hcnkgb2YgY2FsbGJhY2tzCgkJCQlmb3IgKHZhciBldmVudE5hbWUgaW4gYXJnKSB7CgkJCQkJaWYgKGFyZy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7CgkJCQkJCXRoaXMubGlzdGVuVG8ob3RoZXIsIGV2ZW50TmFtZSwgYXJnW2V2ZW50TmFtZV0pOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykgewoJCQkJb3RoZXIub24oCgkJCQkJYXJnICsgJy4nICsgdGhpcy5nZXRMaXN0ZW5lck5hbWVzcGFjZSgpLCAvLyB1c2UgZXZlbnQgbmFtZXNwYWNpbmcgdG8gaWRlbnRpZnkgdGhpcyBvYmplY3QKCQkJCQkkLnByb3h5KGNhbGxiYWNrLCB0aGlzKSAvLyBhbHdheXMgdXNlIGB0aGlzYCBjb250ZXh0CgkJCQkJCS8vIHRoZSB1c3VhbGx5LXVuZGVzaXJlZCBqUXVlcnkgZ3VpZCBiZWhhdmlvciBkb2Vzbid0IG1hdHRlciwKCQkJCQkJLy8gYmVjYXVzZSB3ZSBhbHdheXMgdW5iaW5kIHZpYSBuYW1lc3BhY2UKCQkJCSk7CgkJCX0KCQl9LAoKCQkvKgoJCUNhdXNlcyB0aGUgY3VycmVudCBvYmplY3QgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gZXZlbnRzIG9uIHRoZSBgb3RoZXJgIG9iamVjdC4KCQlgZXZlbnROYW1lYCBpcyBvcHRpb25hbC4gSWYgb21pdHRlZCwgd2lsbCBzdG9wIGxpc3RlbmluZyB0byBBTEwgZXZlbnRzIG9uIGBvdGhlcmAuCgkJKi8KCQlzdG9wTGlzdGVuaW5nVG86IGZ1bmN0aW9uKG90aGVyLCBldmVudE5hbWUpIHsKCQkJb3RoZXIub2ZmKChldmVudE5hbWUgfHwgJycpICsgJy4nICsgdGhpcy5nZXRMaXN0ZW5lck5hbWVzcGFjZSgpKTsKCQl9LAoKCQkvKgoJCVJldHVybnMgYSBzdHJpbmcsIHVuaXF1ZSB0byB0aGlzIG9iamVjdCwgdG8gYmUgdXNlZCBmb3IgZXZlbnQgbmFtZXNwYWNpbmcKCQkqLwoJCWdldExpc3RlbmVyTmFtZXNwYWNlOiBmdW5jdGlvbigpIHsKCQkJaWYgKHRoaXMubGlzdGVuZXJJZCA9PSBudWxsKSB7CgkJCQl0aGlzLmxpc3RlbmVySWQgPSBndWlkKys7CgkJCX0KCQkJcmV0dXJuICdfbGlzdGVuZXInICsgdGhpcy5saXN0ZW5lcklkOwoJCX0KCgl9OwoJcmV0dXJuIExpc3RlbmVyTWl4aW47Cn0pKCk7Cjs7CgovLyBzaW1wbGUgY2xhc3MgZm9yIHRvZ2dsZSBhIGBpc0lnbm9yaW5nTW91c2VgIGZsYWcgb24gZGVsYXkKLy8gaW5pdE1vdXNlSWdub3JpbmcgbXVzdCBmaXJzdCBiZSBjYWxsZWQsIHdpdGggYSBtaWxsaXNlY29uZCBkZWxheSBzZXR0aW5nLgp2YXIgTW91c2VJZ25vcmVyTWl4aW4gPSB7CgoJaXNJZ25vcmluZ01vdXNlOiBmYWxzZSwgLy8gYm9vbAoJZGVsYXlVbmlnbm9yZU1vdXNlOiBudWxsLCAvLyBtZXRob2QKCgoJaW5pdE1vdXNlSWdub3Jpbmc6IGZ1bmN0aW9uKGRlbGF5KSB7CgkJdGhpcy5kZWxheVVuaWdub3JlTW91c2UgPSBkZWJvdW5jZShwcm94eSh0aGlzLCAndW5pZ25vcmVNb3VzZScpLCBkZWxheSB8fCAxMDAwKTsKCX0sCgoKCS8vIHRlbXBvcmFyaWx5IGlnbm9yZSBtb3VzZSBhY3Rpb25zIG9uIHNlZ21lbnRzCgl0ZW1wSWdub3JlTW91c2U6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNJZ25vcmluZ01vdXNlID0gdHJ1ZTsKCQl0aGlzLmRlbGF5VW5pZ25vcmVNb3VzZSgpOwoJfSwKCgoJLy8gZGVsYXlVbmlnbm9yZU1vdXNlIGV2ZW50dWFsbHkgY2FsbHMgdGhpcwoJdW5pZ25vcmVNb3VzZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5pc0lnbm9yaW5nTW91c2UgPSBmYWxzZTsKCX0KCn07Cgo7OwoKLyogQSByZWN0YW5ndWxhciBwYW5lbCB0aGF0IGlzIGFic29sdXRlbHkgcG9zaXRpb25lZCBvdmVyIG90aGVyIGNvbnRlbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk9wdGlvbnM6CgktIGNsYXNzTmFtZSAoc3RyaW5nKQoJLSBjb250ZW50IChIVE1MIHN0cmluZyBvciBqUXVlcnkgZWxlbWVudCBzZXQpCgktIHBhcmVudEVsCgktIHRvcAoJLSBsZWZ0CgktIHJpZ2h0ICh0aGUgeCBjb29yZCBvZiB3aGVyZSB0aGUgcmlnaHQgZWRnZSBzaG91bGQgYmUuIG5vdCBhICJDU1MiIHJpZ2h0KQoJLSBhdXRvSGlkZSAoYm9vbGVhbikKCS0gc2hvdyAoY2FsbGJhY2spCgktIGhpZGUgKGNhbGxiYWNrKQoqLwoKdmFyIFBvcG92ZXIgPSBDbGFzcy5leHRlbmQoTGlzdGVuZXJNaXhpbiwgewoKCWlzSGlkZGVuOiB0cnVlLAoJb3B0aW9uczogbnVsbCwKCWVsOiBudWxsLCAvLyB0aGUgY29udGFpbmVyIGVsZW1lbnQgZm9yIHRoZSBwb3BvdmVyLiBnZW5lcmF0ZWQgYnkgdGhpcyBvYmplY3QKCW1hcmdpbjogMTAsIC8vIHRoZSBzcGFjZSByZXF1aXJlZCBiZXR3ZWVuIHRoZSBwb3BvdmVyIGFuZCB0aGUgZWRnZXMgb2YgdGhlIHNjcm9sbCBjb250YWluZXIKCgoJY29uc3RydWN0b3I6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJfSwKCgoJLy8gU2hvd3MgdGhlIHBvcG92ZXIgb24gdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4gUmVuZGVycyBpdCBpZiBub3QgYWxyZWFkeQoJc2hvdzogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaXNIaWRkZW4pIHsKCQkJaWYgKCF0aGlzLmVsKSB7CgkJCQl0aGlzLnJlbmRlcigpOwoJCQl9CgkJCXRoaXMuZWwuc2hvdygpOwoJCQl0aGlzLnBvc2l0aW9uKCk7CgkJCXRoaXMuaXNIaWRkZW4gPSBmYWxzZTsKCQkJdGhpcy50cmlnZ2VyKCdzaG93Jyk7CgkJfQoJfSwKCgoJLy8gSGlkZXMgdGhlIHBvcG92ZXIsIHRocm91Z2ggQ1NTLCBidXQgZG9lcyBub3QgcmVtb3ZlIGl0IGZyb20gdGhlIERPTQoJaGlkZTogZnVuY3Rpb24oKSB7CgkJaWYgKCF0aGlzLmlzSGlkZGVuKSB7CgkJCXRoaXMuZWwuaGlkZSgpOwoJCQl0aGlzLmlzSGlkZGVuID0gdHJ1ZTsKCQkJdGhpcy50cmlnZ2VyKCdoaWRlJyk7CgkJfQoJfSwKCgoJLy8gQ3JlYXRlcyBgdGhpcy5lbGAgYW5kIHJlbmRlcnMgY29udGVudCBpbnNpZGUgb2YgaXQKCXJlbmRlcjogZnVuY3Rpb24oKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKCgkJdGhpcy5lbCA9ICQoJzxkaXYgY2xhc3M9ImZjLXBvcG92ZXIiLz4nKQoJCQkuYWRkQ2xhc3Mob3B0aW9ucy5jbGFzc05hbWUgfHwgJycpCgkJCS5jc3MoewoJCQkJLy8gcG9zaXRpb24gaW5pdGlhbGx5IHRvIHRoZSB0b3AgbGVmdCB0byBhdm9pZCBjcmVhdGluZyBzY3JvbGxiYXJzCgkJCQl0b3A6IDAsCgkJCQlsZWZ0OiAwCgkJCX0pCgkJCS5hcHBlbmQob3B0aW9ucy5jb250ZW50KQoJCQkuYXBwZW5kVG8ob3B0aW9ucy5wYXJlbnRFbCk7CgoJCS8vIHdoZW4gYSBjbGljayBoYXBwZW5zIG9uIGFueXRoaW5nIGluc2lkZSB3aXRoIGEgJ2ZjLWNsb3NlJyBjbGFzc05hbWUsIGhpZGUgdGhlIHBvcG92ZXIKCQl0aGlzLmVsLm9uKCdjbGljaycsICcuZmMtY2xvc2UnLCBmdW5jdGlvbigpIHsKCQkJX3RoaXMuaGlkZSgpOwoJCX0pOwoKCQlpZiAob3B0aW9ucy5hdXRvSGlkZSkgewoJCQl0aGlzLmxpc3RlblRvKCQoZG9jdW1lbnQpLCAnbW91c2Vkb3duJywgdGhpcy5kb2N1bWVudE1vdXNlZG93bik7CgkJfQoJfSwKCgoJLy8gVHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzICphbnl3aGVyZSogaW4gdGhlIGRvY3VtZW50LCBmb3IgdGhlIGF1dG9IaWRlIGZlYXR1cmUKCWRvY3VtZW50TW91c2Vkb3duOiBmdW5jdGlvbihldikgewoJCS8vIG9ubHkgaGlkZSB0aGUgcG9wb3ZlciBpZiB0aGUgY2xpY2sgaGFwcGVuZWQgb3V0c2lkZSB0aGUgcG9wb3ZlcgoJCWlmICh0aGlzLmVsICYmICEkKGV2LnRhcmdldCkuY2xvc2VzdCh0aGlzLmVsKS5sZW5ndGgpIHsKCQkJdGhpcy5oaWRlKCk7CgkJfQoJfSwKCgoJLy8gSGlkZXMgYW5kIHVucmVnaXN0ZXJzIGFueSBoYW5kbGVycwoJcmVtb3ZlRWxlbWVudDogZnVuY3Rpb24oKSB7CgkJdGhpcy5oaWRlKCk7CgoJCWlmICh0aGlzLmVsKSB7CgkJCXRoaXMuZWwucmVtb3ZlKCk7CgkJCXRoaXMuZWwgPSBudWxsOwoJCX0KCgkJdGhpcy5zdG9wTGlzdGVuaW5nVG8oJChkb2N1bWVudCksICdtb3VzZWRvd24nKTsKCX0sCgoKCS8vIFBvc2l0aW9ucyB0aGUgcG9wb3ZlciBvcHRpbWFsbHksIHVzaW5nIHRoZSB0b3AvbGVmdC9yaWdodCBvcHRpb25zCglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgkJdmFyIG9yaWdpbiA9IHRoaXMuZWwub2Zmc2V0UGFyZW50KCkub2Zmc2V0KCk7CgkJdmFyIHdpZHRoID0gdGhpcy5lbC5vdXRlcldpZHRoKCk7CgkJdmFyIGhlaWdodCA9IHRoaXMuZWwub3V0ZXJIZWlnaHQoKTsKCQl2YXIgd2luZG93RWwgPSAkKHdpbmRvdyk7CgkJdmFyIHZpZXdwb3J0RWwgPSBnZXRTY3JvbGxQYXJlbnQodGhpcy5lbCk7CgkJdmFyIHZpZXdwb3J0VG9wOwoJCXZhciB2aWV3cG9ydExlZnQ7CgkJdmFyIHZpZXdwb3J0T2Zmc2V0OwoJCXZhciB0b3A7IC8vIHRoZSAicG9zaXRpb24iIChub3QgIm9mZnNldCIpIHZhbHVlcyBmb3IgdGhlIHBvcG92ZXIKCQl2YXIgbGVmdDsgLy8KCgkJLy8gY29tcHV0ZSB0b3AgYW5kIGxlZnQKCQl0b3AgPSBvcHRpb25zLnRvcCB8fCAwOwoJCWlmIChvcHRpb25zLmxlZnQgIT09IHVuZGVmaW5lZCkgewoJCQlsZWZ0ID0gb3B0aW9ucy5sZWZ0OwoJCX0KCQllbHNlIGlmIChvcHRpb25zLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHsKCQkJbGVmdCA9IG9wdGlvbnMucmlnaHQgLSB3aWR0aDsgLy8gZGVyaXZlIHRoZSBsZWZ0IHZhbHVlIGZyb20gdGhlIHJpZ2h0IHZhbHVlCgkJfQoJCWVsc2UgewoJCQlsZWZ0ID0gMDsKCQl9CgoJCWlmICh2aWV3cG9ydEVsLmlzKHdpbmRvdykgfHwgdmlld3BvcnRFbC5pcyhkb2N1bWVudCkpIHsgLy8gbm9ybWFsaXplIGdldFNjcm9sbFBhcmVudCdzIHJlc3VsdAoJCQl2aWV3cG9ydEVsID0gd2luZG93RWw7CgkJCXZpZXdwb3J0VG9wID0gMDsgLy8gdGhlIHdpbmRvdyBpcyBhbHdheXMgYXQgdGhlIHRvcCBsZWZ0CgkJCXZpZXdwb3J0TGVmdCA9IDA7IC8vIChhbmQgLm9mZnNldCgpIHdvbid0IHdvcmsgaWYgY2FsbGVkIGhlcmUpCgkJfQoJCWVsc2UgewoJCQl2aWV3cG9ydE9mZnNldCA9IHZpZXdwb3J0RWwub2Zmc2V0KCk7CgkJCXZpZXdwb3J0VG9wID0gdmlld3BvcnRPZmZzZXQudG9wOwoJCQl2aWV3cG9ydExlZnQgPSB2aWV3cG9ydE9mZnNldC5sZWZ0OwoJCX0KCgkJLy8gaWYgdGhlIHdpbmRvdyBpcyBzY3JvbGxlZCwgaXQgY2F1c2VzIHRoZSB2aXNpYmxlIGFyZWEgdG8gYmUgZnVydGhlciBkb3duCgkJdmlld3BvcnRUb3AgKz0gd2luZG93RWwuc2Nyb2xsVG9wKCk7CgkJdmlld3BvcnRMZWZ0ICs9IHdpbmRvd0VsLnNjcm9sbExlZnQoKTsKCgkJLy8gY29uc3RyYWluIHRvIHRoZSB2aWV3IHBvcnQuIGlmIGNvbnN0cmFpbmVkIGJ5IHR3byBlZGdlcywgZ2l2ZSBwcmVjZWRlbmNlIHRvIHRvcC9sZWZ0CgkJaWYgKG9wdGlvbnMudmlld3BvcnRDb25zdHJhaW4gIT09IGZhbHNlKSB7CgkJCXRvcCA9IE1hdGgubWluKHRvcCwgdmlld3BvcnRUb3AgKyB2aWV3cG9ydEVsLm91dGVySGVpZ2h0KCkgLSBoZWlnaHQgLSB0aGlzLm1hcmdpbik7CgkJCXRvcCA9IE1hdGgubWF4KHRvcCwgdmlld3BvcnRUb3AgKyB0aGlzLm1hcmdpbik7CgkJCWxlZnQgPSBNYXRoLm1pbihsZWZ0LCB2aWV3cG9ydExlZnQgKyB2aWV3cG9ydEVsLm91dGVyV2lkdGgoKSAtIHdpZHRoIC0gdGhpcy5tYXJnaW4pOwoJCQlsZWZ0ID0gTWF0aC5tYXgobGVmdCwgdmlld3BvcnRMZWZ0ICsgdGhpcy5tYXJnaW4pOwoJCX0KCgkJdGhpcy5lbC5jc3MoewoJCQl0b3A6IHRvcCAtIG9yaWdpbi50b3AsCgkJCWxlZnQ6IGxlZnQgLSBvcmlnaW4ubGVmdAoJCX0pOwoJfSwKCgoJLy8gVHJpZ2dlcnMgYSBjYWxsYmFjay4gQ2FsbHMgYSBmdW5jdGlvbiBpbiB0aGUgb3B0aW9uIGhhc2ggb2YgdGhlIHNhbWUgbmFtZS4KCS8vIEFyZ3VtZW50cyBiZXlvbmQgdGhlIGZpcnN0IGBuYW1lYCBhcmUgZm9yd2FyZGVkIG9uLgoJLy8gVE9ETzogYmV0dGVyIGNvZGUgcmV1c2UgZm9yIHRoaXMuIFJlcGVhdCBjb2RlCgl0cmlnZ2VyOiBmdW5jdGlvbihuYW1lKSB7CgkJaWYgKHRoaXMub3B0aW9uc1tuYW1lXSkgewoJCQl0aGlzLm9wdGlvbnNbbmFtZV0uYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CgkJfQoJfQoKfSk7Cgo7OwoKLyoKQSBjYWNoZSBmb3IgdGhlIGxlZnQvcmlnaHQvdG9wL2JvdHRvbS93aWR0aC9oZWlnaHQgdmFsdWVzIGZvciBvbmUgb3IgbW9yZSBlbGVtZW50cy4KV29ya3Mgd2l0aCBib3RoIG9mZnNldCAoZnJvbSB0b3BsZWZ0IGRvY3VtZW50KSBhbmQgcG9zaXRpb24gKGZyb20gb2Zmc2V0UGFyZW50KS4KCm9wdGlvbnM6Ci0gZWxzCi0gaXNIb3Jpem9udGFsCi0gaXNWZXJ0aWNhbAoqLwp2YXIgQ29vcmRDYWNoZSA9IEZDLkNvb3JkQ2FjaGUgPSBDbGFzcy5leHRlbmQoewoKCWVsczogbnVsbCwgLy8galF1ZXJ5IHNldCAoYXNzdW1lZCB0byBiZSBzaWJsaW5ncykKCWZvcmNlZE9mZnNldFBhcmVudEVsOiBudWxsLCAvLyBvcHRpb25zIGNhbiBvdmVycmlkZSB0aGUgbmF0dXJhbCBvZmZzZXRQYXJlbnQKCW9yaWdpbjogbnVsbCwgLy8ge2xlZnQsdG9wfSBwb3NpdGlvbiBvZiBvZmZzZXRQYXJlbnQgb2YgZWxzCglib3VuZGluZ1JlY3Q6IG51bGwsIC8vIGNvbnN0cmFpbiBjb3JkaW5hdGVzIHRvIHRoaXMgcmVjdGFuZ2xlLiB7bGVmdCxyaWdodCx0b3AsYm90dG9tfSBvciBudWxsCglpc0hvcml6b250YWw6IGZhbHNlLCAvLyB3aGV0aGVyIHRvIHF1ZXJ5IGZvciBsZWZ0L3JpZ2h0L3dpZHRoCglpc1ZlcnRpY2FsOiBmYWxzZSwgLy8gd2hldGhlciB0byBxdWVyeSBmb3IgdG9wL2JvdHRvbS9oZWlnaHQKCgkvLyBhcnJheXMgb2YgY29vcmRpbmF0ZXMgKG9mZnNldHMgZnJvbSB0b3BsZWZ0IG9mIGRvY3VtZW50KQoJbGVmdHM6IG51bGwsCglyaWdodHM6IG51bGwsCgl0b3BzOiBudWxsLAoJYm90dG9tczogbnVsbCwKCgoJY29uc3RydWN0b3I6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKCQl0aGlzLmVscyA9ICQob3B0aW9ucy5lbHMpOwoJCXRoaXMuaXNIb3Jpem9udGFsID0gb3B0aW9ucy5pc0hvcml6b250YWw7CgkJdGhpcy5pc1ZlcnRpY2FsID0gb3B0aW9ucy5pc1ZlcnRpY2FsOwoJCXRoaXMuZm9yY2VkT2Zmc2V0UGFyZW50RWwgPSBvcHRpb25zLm9mZnNldFBhcmVudCA/ICQob3B0aW9ucy5vZmZzZXRQYXJlbnQpIDogbnVsbDsKCX0sCgoKCS8vIFF1ZXJpZXMgdGhlIGVscyBmb3IgY29vcmRpbmF0ZXMgYW5kIHN0b3JlcyB0aGVtLgoJLy8gQ2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgdXNpbmcgYW5kIG9mIHRoZSBnZXQqIG1ldGhvZHMgYmVsb3cuCglidWlsZDogZnVuY3Rpb24oKSB7CgkJdmFyIG9mZnNldFBhcmVudEVsID0gdGhpcy5mb3JjZWRPZmZzZXRQYXJlbnRFbCB8fCB0aGlzLmVscy5lcSgwKS5vZmZzZXRQYXJlbnQoKTsKCgkJdGhpcy5vcmlnaW4gPSBvZmZzZXRQYXJlbnRFbC5vZmZzZXQoKTsKCQl0aGlzLmJvdW5kaW5nUmVjdCA9IHRoaXMucXVlcnlCb3VuZGluZ1JlY3QoKTsKCgkJaWYgKHRoaXMuaXNIb3Jpem9udGFsKSB7CgkJCXRoaXMuYnVpbGRFbEhvcml6b250YWxzKCk7CgkJfQoJCWlmICh0aGlzLmlzVmVydGljYWwpIHsKCQkJdGhpcy5idWlsZEVsVmVydGljYWxzKCk7CgkJfQoJfSwKCgoJLy8gRGVzdHJveXMgYWxsIGludGVybmFsIGRhdGEgYWJvdXQgY29vcmRpbmF0ZXMsIGZyZWVpbmcgbWVtb3J5CgljbGVhcjogZnVuY3Rpb24oKSB7CgkJdGhpcy5vcmlnaW4gPSBudWxsOwoJCXRoaXMuYm91bmRpbmdSZWN0ID0gbnVsbDsKCQl0aGlzLmxlZnRzID0gbnVsbDsKCQl0aGlzLnJpZ2h0cyA9IG51bGw7CgkJdGhpcy50b3BzID0gbnVsbDsKCQl0aGlzLmJvdHRvbXMgPSBudWxsOwoJfSwKCgoJLy8gV2hlbiBjYWxsZWQsIGlmIGNvb3JkIGNhY2hlcyBhcmVuJ3QgYnVpbHQsIGJ1aWxkcyB0aGVtCgllbnN1cmVCdWlsdDogZnVuY3Rpb24oKSB7CgkJaWYgKCF0aGlzLm9yaWdpbikgewoJCQl0aGlzLmJ1aWxkKCk7CgkJfQoJfSwKCgoJLy8gUG9wdWxhdGVzIHRoZSBsZWZ0L3JpZ2h0IGludGVybmFsIGNvb3JkaW5hdGUgYXJyYXlzCglidWlsZEVsSG9yaXpvbnRhbHM6IGZ1bmN0aW9uKCkgewoJCXZhciBsZWZ0cyA9IFtdOwoJCXZhciByaWdodHMgPSBbXTsKCgkJdGhpcy5lbHMuZWFjaChmdW5jdGlvbihpLCBub2RlKSB7CgkJCXZhciBlbCA9ICQobm9kZSk7CgkJCXZhciBsZWZ0ID0gZWwub2Zmc2V0KCkubGVmdDsKCQkJdmFyIHdpZHRoID0gZWwub3V0ZXJXaWR0aCgpOwoKCQkJbGVmdHMucHVzaChsZWZ0KTsKCQkJcmlnaHRzLnB1c2gobGVmdCArIHdpZHRoKTsKCQl9KTsKCgkJdGhpcy5sZWZ0cyA9IGxlZnRzOwoJCXRoaXMucmlnaHRzID0gcmlnaHRzOwoJfSwKCgoJLy8gUG9wdWxhdGVzIHRoZSB0b3AvYm90dG9tIGludGVybmFsIGNvb3JkaW5hdGUgYXJyYXlzCglidWlsZEVsVmVydGljYWxzOiBmdW5jdGlvbigpIHsKCQl2YXIgdG9wcyA9IFtdOwoJCXZhciBib3R0b21zID0gW107CgoJCXRoaXMuZWxzLmVhY2goZnVuY3Rpb24oaSwgbm9kZSkgewoJCQl2YXIgZWwgPSAkKG5vZGUpOwoJCQl2YXIgdG9wID0gZWwub2Zmc2V0KCkudG9wOwoJCQl2YXIgaGVpZ2h0ID0gZWwub3V0ZXJIZWlnaHQoKTsKCgkJCXRvcHMucHVzaCh0b3ApOwoJCQlib3R0b21zLnB1c2godG9wICsgaGVpZ2h0KTsKCQl9KTsKCgkJdGhpcy50b3BzID0gdG9wczsKCQl0aGlzLmJvdHRvbXMgPSBib3R0b21zOwoJfSwKCgoJLy8gR2l2ZW4gYSBsZWZ0IG9mZnNldCAoZnJvbSBkb2N1bWVudCBsZWZ0KSwgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGVsIHRoYXQgaXQgaG9yaXpvbnRhbGx5IGludGVyc2VjdHMuCgkvLyBJZiBubyBpbnRlcnNlY3Rpb24gaXMgbWFkZSwgcmV0dXJucyB1bmRlZmluZWQuCglnZXRIb3Jpem9udGFsSW5kZXg6IGZ1bmN0aW9uKGxlZnRPZmZzZXQpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgoJCXZhciBsZWZ0cyA9IHRoaXMubGVmdHM7CgkJdmFyIHJpZ2h0cyA9IHRoaXMucmlnaHRzOwoJCXZhciBsZW4gPSBsZWZ0cy5sZW5ndGg7CgkJdmFyIGk7CgoJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewoJCQlpZiAobGVmdE9mZnNldCA+PSBsZWZ0c1tpXSAmJiBsZWZ0T2Zmc2V0IDwgcmlnaHRzW2ldKSB7CgkJCQlyZXR1cm4gaTsKCQkJfQoJCX0KCX0sCgoKCS8vIEdpdmVuIGEgdG9wIG9mZnNldCAoZnJvbSBkb2N1bWVudCB0b3ApLCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZWwgdGhhdCBpdCB2ZXJ0aWNhbGx5IGludGVyc2VjdHMuCgkvLyBJZiBubyBpbnRlcnNlY3Rpb24gaXMgbWFkZSwgcmV0dXJucyB1bmRlZmluZWQuCglnZXRWZXJ0aWNhbEluZGV4OiBmdW5jdGlvbih0b3BPZmZzZXQpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgoJCXZhciB0b3BzID0gdGhpcy50b3BzOwoJCXZhciBib3R0b21zID0gdGhpcy5ib3R0b21zOwoJCXZhciBsZW4gPSB0b3BzLmxlbmd0aDsKCQl2YXIgaTsKCgkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkJCWlmICh0b3BPZmZzZXQgPj0gdG9wc1tpXSAmJiB0b3BPZmZzZXQgPCBib3R0b21zW2ldKSB7CgkJCQlyZXR1cm4gaTsKCQkJfQoJCX0KCX0sCgoKCS8vIEdldHMgdGhlIGxlZnQgb2Zmc2V0IChmcm9tIGRvY3VtZW50IGxlZnQpIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleAoJZ2V0TGVmdE9mZnNldDogZnVuY3Rpb24obGVmdEluZGV4KSB7CgkJdGhpcy5lbnN1cmVCdWlsdCgpOwoJCXJldHVybiB0aGlzLmxlZnRzW2xlZnRJbmRleF07Cgl9LAoKCgkvLyBHZXRzIHRoZSBsZWZ0IHBvc2l0aW9uIChmcm9tIG9mZnNldFBhcmVudCBsZWZ0KSBvZiB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXgKCWdldExlZnRQb3NpdGlvbjogZnVuY3Rpb24obGVmdEluZGV4KSB7CgkJdGhpcy5lbnN1cmVCdWlsdCgpOwoJCXJldHVybiB0aGlzLmxlZnRzW2xlZnRJbmRleF0gLSB0aGlzLm9yaWdpbi5sZWZ0OwoJfSwKCgoJLy8gR2V0cyB0aGUgcmlnaHQgb2Zmc2V0IChmcm9tIGRvY3VtZW50IGxlZnQpIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleC4KCS8vIFRoaXMgdmFsdWUgaXMgTk9UIHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudCdzIHJpZ2h0IGVkZ2UsIGxpa2UgdGhlIENTUyBjb25jZXB0IG9mICJyaWdodCIgd291bGQgYmUuCglnZXRSaWdodE9mZnNldDogZnVuY3Rpb24obGVmdEluZGV4KSB7CgkJdGhpcy5lbnN1cmVCdWlsdCgpOwoJCXJldHVybiB0aGlzLnJpZ2h0c1tsZWZ0SW5kZXhdOwoJfSwKCgoJLy8gR2V0cyB0aGUgcmlnaHQgcG9zaXRpb24gKGZyb20gb2Zmc2V0UGFyZW50IGxlZnQpIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleC4KCS8vIFRoaXMgdmFsdWUgaXMgTk9UIHJlbGF0aXZlIHRvIHRoZSBvZmZzZXRQYXJlbnQncyByaWdodCBlZGdlLCBsaWtlIHRoZSBDU1MgY29uY2VwdCBvZiAicmlnaHQiIHdvdWxkIGJlLgoJZ2V0UmlnaHRQb3NpdGlvbjogZnVuY3Rpb24obGVmdEluZGV4KSB7CgkJdGhpcy5lbnN1cmVCdWlsdCgpOwoJCXJldHVybiB0aGlzLnJpZ2h0c1tsZWZ0SW5kZXhdIC0gdGhpcy5vcmlnaW4ubGVmdDsKCX0sCgoKCS8vIEdldHMgdGhlIHdpZHRoIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleAoJZ2V0V2lkdGg6IGZ1bmN0aW9uKGxlZnRJbmRleCkgewoJCXRoaXMuZW5zdXJlQnVpbHQoKTsKCQlyZXR1cm4gdGhpcy5yaWdodHNbbGVmdEluZGV4XSAtIHRoaXMubGVmdHNbbGVmdEluZGV4XTsKCX0sCgoKCS8vIEdldHMgdGhlIHRvcCBvZmZzZXQgKGZyb20gZG9jdW1lbnQgdG9wKSBvZiB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXgKCWdldFRvcE9mZnNldDogZnVuY3Rpb24odG9wSW5kZXgpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgkJcmV0dXJuIHRoaXMudG9wc1t0b3BJbmRleF07Cgl9LAoKCgkvLyBHZXRzIHRoZSB0b3AgcG9zaXRpb24gKGZyb20gb2Zmc2V0UGFyZW50IHRvcCkgb2YgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uCglnZXRUb3BQb3NpdGlvbjogZnVuY3Rpb24odG9wSW5kZXgpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgkJcmV0dXJuIHRoaXMudG9wc1t0b3BJbmRleF0gLSB0aGlzLm9yaWdpbi50b3A7Cgl9LAoKCS8vIEdldHMgdGhlIGJvdHRvbSBvZmZzZXQgKGZyb20gdGhlIGRvY3VtZW50IHRvcCkgb2YgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4LgoJLy8gVGhpcyB2YWx1ZSBpcyBOT1QgcmVsYXRpdmUgdG8gdGhlIG9mZnNldFBhcmVudCdzIGJvdHRvbSBlZGdlLCBsaWtlIHRoZSBDU1MgY29uY2VwdCBvZiAiYm90dG9tIiB3b3VsZCBiZS4KCWdldEJvdHRvbU9mZnNldDogZnVuY3Rpb24odG9wSW5kZXgpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgkJcmV0dXJuIHRoaXMuYm90dG9tc1t0b3BJbmRleF07Cgl9LAoKCgkvLyBHZXRzIHRoZSBib3R0b20gcG9zaXRpb24gKGZyb20gdGhlIG9mZnNldFBhcmVudCB0b3ApIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleC4KCS8vIFRoaXMgdmFsdWUgaXMgTk9UIHJlbGF0aXZlIHRvIHRoZSBvZmZzZXRQYXJlbnQncyBib3R0b20gZWRnZSwgbGlrZSB0aGUgQ1NTIGNvbmNlcHQgb2YgImJvdHRvbSIgd291bGQgYmUuCglnZXRCb3R0b21Qb3NpdGlvbjogZnVuY3Rpb24odG9wSW5kZXgpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgkJcmV0dXJuIHRoaXMuYm90dG9tc1t0b3BJbmRleF0gLSB0aGlzLm9yaWdpbi50b3A7Cgl9LAoKCgkvLyBHZXRzIHRoZSBoZWlnaHQgb2YgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4CglnZXRIZWlnaHQ6IGZ1bmN0aW9uKHRvcEluZGV4KSB7CgkJdGhpcy5lbnN1cmVCdWlsdCgpOwoJCXJldHVybiB0aGlzLmJvdHRvbXNbdG9wSW5kZXhdIC0gdGhpcy50b3BzW3RvcEluZGV4XTsKCX0sCgoKCS8vIEJvdW5kaW5nIFJlY3QKCS8vIFRPRE86IGRlY291cGxlIHRoaXMgZnJvbSBDb29yZENhY2hlCgoJLy8gQ29tcHV0ZSBhbmQgcmV0dXJuIHdoYXQgdGhlIGVsZW1lbnRzJyBib3VuZGluZyByZWN0YW5nbGUgaXMsIGZyb20gdGhlIHVzZXIncyBwZXJzcGVjdGl2ZS4KCS8vIFJpZ2h0IG5vdywgb25seSByZXR1cm5zIGEgcmVjdGFuZ2xlIGlmIGNvbnN0cmFpbmVkIGJ5IGFuIG92ZXJmbG93OnNjcm9sbCBlbGVtZW50LgoJcXVlcnlCb3VuZGluZ1JlY3Q6IGZ1bmN0aW9uKCkgewoJCXZhciBzY3JvbGxQYXJlbnRFbCA9IGdldFNjcm9sbFBhcmVudCh0aGlzLmVscy5lcSgwKSk7CgoJCWlmICghc2Nyb2xsUGFyZW50RWwuaXMoZG9jdW1lbnQpKSB7CgkJCXJldHVybiBnZXRDbGllbnRSZWN0KHNjcm9sbFBhcmVudEVsKTsKCQl9Cgl9LAoKCWlzUG9pbnRJbkJvdW5kczogZnVuY3Rpb24obGVmdE9mZnNldCwgdG9wT2Zmc2V0KSB7CgkJcmV0dXJuIHRoaXMuaXNMZWZ0SW5Cb3VuZHMobGVmdE9mZnNldCkgJiYgdGhpcy5pc1RvcEluQm91bmRzKHRvcE9mZnNldCk7Cgl9LAoKCWlzTGVmdEluQm91bmRzOiBmdW5jdGlvbihsZWZ0T2Zmc2V0KSB7CgkJcmV0dXJuICF0aGlzLmJvdW5kaW5nUmVjdCB8fCAobGVmdE9mZnNldCA+PSB0aGlzLmJvdW5kaW5nUmVjdC5sZWZ0ICYmIGxlZnRPZmZzZXQgPCB0aGlzLmJvdW5kaW5nUmVjdC5yaWdodCk7Cgl9LAoKCWlzVG9wSW5Cb3VuZHM6IGZ1bmN0aW9uKHRvcE9mZnNldCkgewoJCXJldHVybiAhdGhpcy5ib3VuZGluZ1JlY3QgfHwgKHRvcE9mZnNldCA+PSB0aGlzLmJvdW5kaW5nUmVjdC50b3AgJiYgdG9wT2Zmc2V0IDwgdGhpcy5ib3VuZGluZ1JlY3QuYm90dG9tKTsKCX0KCn0pOwoKOzsKCi8qIFRyYWNrcyBhIGRyYWcncyBtb3VzZSBtb3ZlbWVudCwgZmlyaW5nIHZhcmlvdXMgaGFuZGxlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8vIFRPRE86IHVzZSBFbWl0dGVyCgp2YXIgRHJhZ0xpc3RlbmVyID0gRkMuRHJhZ0xpc3RlbmVyID0gQ2xhc3MuZXh0ZW5kKExpc3RlbmVyTWl4aW4sIE1vdXNlSWdub3Jlck1peGluLCB7CgoJb3B0aW9uczogbnVsbCwKCXN1YmplY3RFbDogbnVsbCwKCgkvLyBjb29yZGluYXRlcyBvZiB0aGUgaW5pdGlhbCBtb3VzZWRvd24KCW9yaWdpblg6IG51bGwsCglvcmlnaW5ZOiBudWxsLAoKCS8vIHRoZSB3cmFwcGluZyBlbGVtZW50IHRoYXQgc2Nyb2xscywgb3IgTUlHSFQgc2Nyb2xsIGlmIHRoZXJlJ3Mgb3ZlcmZsb3cuCgkvLyBUT0RPOiBkbyB0aGlzIGZvciB3cmFwcGVycyB0aGF0IGhhdmUgb3ZlcmZsb3c6aGlkZGVuIGFzIHdlbGwuCglzY3JvbGxFbDogbnVsbCwKCglpc0ludGVyYWN0aW5nOiBmYWxzZSwKCWlzRGlzdGFuY2VTdXJwYXNzZWQ6IGZhbHNlLAoJaXNEZWxheUVuZGVkOiBmYWxzZSwKCWlzRHJhZ2dpbmc6IGZhbHNlLAoJaXNUb3VjaDogZmFsc2UsCgoJZGVsYXk6IG51bGwsCglkZWxheVRpbWVvdXRJZDogbnVsbCwKCW1pbkRpc3RhbmNlOiBudWxsLAoKCWhhbmRsZVRvdWNoU2Nyb2xsUHJveHk6IG51bGwsIC8vIGNhbGxzIGhhbmRsZVRvdWNoU2Nyb2xsLCBhbHdheXMgYm91bmQgdG8gYHRoaXNgCgoKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbihvcHRpb25zKSB7CgkJdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCQl0aGlzLmhhbmRsZVRvdWNoU2Nyb2xsUHJveHkgPSBwcm94eSh0aGlzLCAnaGFuZGxlVG91Y2hTY3JvbGwnKTsKCQl0aGlzLmluaXRNb3VzZUlnbm9yaW5nKDUwMCk7Cgl9LAoKCgkvLyBJbnRlcmFjdGlvbiAoaGlnaC1sZXZlbCkKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCXN0YXJ0SW50ZXJhY3Rpb246IGZ1bmN0aW9uKGV2LCBleHRyYU9wdGlvbnMpIHsKCQl2YXIgaXNUb3VjaCA9IGdldEV2SXNUb3VjaChldik7CgoJCWlmIChldi50eXBlID09PSAnbW91c2Vkb3duJykgewoJCQlpZiAodGhpcy5pc0lnbm9yaW5nTW91c2UpIHsKCQkJCXJldHVybjsKCQkJfQoJCQllbHNlIGlmICghaXNQcmltYXJ5TW91c2VCdXR0b24oZXYpKSB7CgkJCQlyZXR1cm47CgkJCX0KCQkJZWxzZSB7CgkJCQlldi5wcmV2ZW50RGVmYXVsdCgpOyAvLyBwcmV2ZW50cyBuYXRpdmUgc2VsZWN0aW9uIGluIG1vc3QgYnJvd3NlcnMKCQkJfQoJCX0KCgkJaWYgKCF0aGlzLmlzSW50ZXJhY3RpbmcpIHsKCgkJCS8vIHByb2Nlc3Mgb3B0aW9ucwoJCQlleHRyYU9wdGlvbnMgPSBleHRyYU9wdGlvbnMgfHwge307CgkJCXRoaXMuZGVsYXkgPSBmaXJzdERlZmluZWQoZXh0cmFPcHRpb25zLmRlbGF5LCB0aGlzLm9wdGlvbnMuZGVsYXksIDApOwoJCQl0aGlzLm1pbkRpc3RhbmNlID0gZmlyc3REZWZpbmVkKGV4dHJhT3B0aW9ucy5kaXN0YW5jZSwgdGhpcy5vcHRpb25zLmRpc3RhbmNlLCAwKTsKCQkJdGhpcy5zdWJqZWN0RWwgPSB0aGlzLm9wdGlvbnMuc3ViamVjdEVsOwoKCQkJdGhpcy5pc0ludGVyYWN0aW5nID0gdHJ1ZTsKCQkJdGhpcy5pc1RvdWNoID0gaXNUb3VjaDsKCQkJdGhpcy5pc0RlbGF5RW5kZWQgPSBmYWxzZTsKCQkJdGhpcy5pc0Rpc3RhbmNlU3VycGFzc2VkID0gZmFsc2U7CgoJCQl0aGlzLm9yaWdpblggPSBnZXRFdlgoZXYpOwoJCQl0aGlzLm9yaWdpblkgPSBnZXRFdlkoZXYpOwoJCQl0aGlzLnNjcm9sbEVsID0gZ2V0U2Nyb2xsUGFyZW50KCQoZXYudGFyZ2V0KSk7CgoJCQl0aGlzLmJpbmRIYW5kbGVycygpOwoJCQl0aGlzLmluaXRBdXRvU2Nyb2xsKCk7CgkJCXRoaXMuaGFuZGxlSW50ZXJhY3Rpb25TdGFydChldik7CgkJCXRoaXMuc3RhcnREZWxheShldik7CgoJCQlpZiAoIXRoaXMubWluRGlzdGFuY2UpIHsKCQkJCXRoaXMuaGFuZGxlRGlzdGFuY2VTdXJwYXNzZWQoZXYpOwoJCQl9CgkJfQoJfSwKCgoJaGFuZGxlSW50ZXJhY3Rpb25TdGFydDogZnVuY3Rpb24oZXYpIHsKCQl0aGlzLnRyaWdnZXIoJ2ludGVyYWN0aW9uU3RhcnQnLCBldik7Cgl9LAoKCgllbmRJbnRlcmFjdGlvbjogZnVuY3Rpb24oZXYsIGlzQ2FuY2VsbGVkKSB7CgkJaWYgKHRoaXMuaXNJbnRlcmFjdGluZykgewoJCQl0aGlzLmVuZERyYWcoZXYpOwoKCQkJaWYgKHRoaXMuZGVsYXlUaW1lb3V0SWQpIHsKCQkJCWNsZWFyVGltZW91dCh0aGlzLmRlbGF5VGltZW91dElkKTsKCQkJCXRoaXMuZGVsYXlUaW1lb3V0SWQgPSBudWxsOwoJCQl9CgoJCQl0aGlzLmRlc3Ryb3lBdXRvU2Nyb2xsKCk7CgkJCXRoaXMudW5iaW5kSGFuZGxlcnMoKTsKCgkJCXRoaXMuaXNJbnRlcmFjdGluZyA9IGZhbHNlOwoJCQl0aGlzLmhhbmRsZUludGVyYWN0aW9uRW5kKGV2LCBpc0NhbmNlbGxlZCk7CgoJCQkvLyBhIHRvdWNoc3RhcnQrdG91Y2hlbmQgb24gdGhlIHNhbWUgZWxlbWVudCB3aWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGFkZGl0aW9uIHNpbXVsYXRlZCBldmVudHM6CgkJCS8vIG1vdXNlb3ZlciArIG1vdXNlb3V0ICsgY2xpY2sKCQkJLy8gbGV0J3MgaWdub3JlIHRoZXNlIGJvZ3VzIGV2ZW50cwoJCQlpZiAodGhpcy5pc1RvdWNoKSB7CgkJCQl0aGlzLnRlbXBJZ25vcmVNb3VzZSgpOwoJCQl9CgkJfQoJfSwKCgoJaGFuZGxlSW50ZXJhY3Rpb25FbmQ6IGZ1bmN0aW9uKGV2LCBpc0NhbmNlbGxlZCkgewoJCXRoaXMudHJpZ2dlcignaW50ZXJhY3Rpb25FbmQnLCBldiwgaXNDYW5jZWxsZWQgfHwgZmFsc2UpOwoJfSwKCgoJLy8gQmluZGluZyBUbyBET00KCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCWJpbmRIYW5kbGVyczogZnVuY3Rpb24oKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgdG91Y2hTdGFydElnbm9yZXMgPSAxOwoKCQlpZiAodGhpcy5pc1RvdWNoKSB7CgkJCXRoaXMubGlzdGVuVG8oJChkb2N1bWVudCksIHsKCQkJCXRvdWNobW92ZTogdGhpcy5oYW5kbGVUb3VjaE1vdmUsCgkJCQl0b3VjaGVuZDogdGhpcy5lbmRJbnRlcmFjdGlvbiwKCQkJCXRvdWNoY2FuY2VsOiB0aGlzLmVuZEludGVyYWN0aW9uLAoKCQkJCS8vIFNvbWV0aW1lcyB0b3VjaGVuZCBkb2Vzbid0IGZpcmUKCQkJCS8vIChjYW4ndCBmaWd1cmUgb3V0IHdoeS4gdG91Y2hjYW5jZWwgZG9lc24ndCBmaXJlIGVpdGhlci4gaGFzIHRvIGRvIHdpdGggc2Nyb2xsaW5nPykKCQkJCS8vIElmIGFub3RoZXIgdG91Y2hzdGFydCBoYXBwZW5zLCB3ZSBrbm93IGl0J3MgYm9ndXMsIHNvIGNhbmNlbCB0aGUgZHJhZy4KCQkJCS8vIHRvdWNoZW5kIHdpbGwgY29udGludWUgdG8gYmUgYnJva2VuIHVudGlsIHVzZXIgZG9lcyBhIHNob3J0dGFwL3Njcm9sbCwgYnV0IHRoaXMgaXMgYmVzdCB3ZSBjYW4gZG8uCgkJCQl0b3VjaHN0YXJ0OiBmdW5jdGlvbihldikgewoJCQkJCWlmICh0b3VjaFN0YXJ0SWdub3JlcykgeyAvLyBiaW5kSGFuZGxlcnMgaXMgY2FsbGVkIGZyb20gd2l0aGluIGEgdG91Y2hzdGFydCwKCQkJCQkJdG91Y2hTdGFydElnbm9yZXMtLTsgLy8gYW5kIHdlIGRvbid0IHdhbnQgdGhpcyB0byBmaXJlIGltbWVkaWF0ZWx5LCBzbyBpZ25vcmUuCgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQlfdGhpcy5lbmRJbnRlcmFjdGlvbihldiwgdHJ1ZSk7IC8vIGlzQ2FuY2VsbGVkPXRydWUKCQkJCQl9CgkJCQl9CgkJCX0pOwoKCQkJLy8gbGlzdGVuIHRvIEFMTCBzY3JvbGwgYWN0aW9ucyBvbiB0aGUgcGFnZQoJCQlpZiAoCgkJCQkhYmluZEFueVNjcm9sbCh0aGlzLmhhbmRsZVRvdWNoU2Nyb2xsUHJveHkpICYmIC8vIGhvcGVmdWxseSB0aGlzIHdvcmtzIGFuZCBzaG9ydC1jaXJjdWl0cyB0aGUgcmVzdAoJCQkJdGhpcy5zY3JvbGxFbCAvLyBvdGhlcndpc2UsIGF0dGFjaCBhIHNpbmdsZSBoYW5kbGVyIHRvIHRoaXMKCQkJKSB7CgkJCQl0aGlzLmxpc3RlblRvKHRoaXMuc2Nyb2xsRWwsICdzY3JvbGwnLCB0aGlzLmhhbmRsZVRvdWNoU2Nyb2xsKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJdGhpcy5saXN0ZW5UbygkKGRvY3VtZW50KSwgewoJCQkJbW91c2Vtb3ZlOiB0aGlzLmhhbmRsZU1vdXNlTW92ZSwKCQkJCW1vdXNldXA6IHRoaXMuZW5kSW50ZXJhY3Rpb24KCQkJfSk7CgkJfQoKCQl0aGlzLmxpc3RlblRvKCQoZG9jdW1lbnQpLCB7CgkJCXNlbGVjdHN0YXJ0OiBwcmV2ZW50RGVmYXVsdCwgLy8gZG9uJ3QgYWxsb3cgc2VsZWN0aW9uIHdoaWxlIGRyYWdnaW5nCgkJCWNvbnRleHRtZW51OiBwcmV2ZW50RGVmYXVsdCAvLyBsb25nIHRhcHMgd291bGQgb3BlbiBtZW51IG9uIENocm9tZSBkZXYgdG9vbHMKCQl9KTsKCX0sCgoKCXVuYmluZEhhbmRsZXJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnN0b3BMaXN0ZW5pbmdUbygkKGRvY3VtZW50KSk7CgoJCS8vIHVuYmluZCBzY3JvbGwgbGlzdGVuaW5nCgkJdW5iaW5kQW55U2Nyb2xsKHRoaXMuaGFuZGxlVG91Y2hTY3JvbGxQcm94eSk7CgkJaWYgKHRoaXMuc2Nyb2xsRWwpIHsKCQkJdGhpcy5zdG9wTGlzdGVuaW5nVG8odGhpcy5zY3JvbGxFbCwgJ3Njcm9sbCcpOwoJCX0KCX0sCgoKCS8vIERyYWcgKGhpZ2gtbGV2ZWwpCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgkvLyBleHRyYU9wdGlvbnMgaWdub3JlZCBpZiBkcmFnIGFscmVhZHkgc3RhcnRlZAoJc3RhcnREcmFnOiBmdW5jdGlvbihldiwgZXh0cmFPcHRpb25zKSB7CgkJdGhpcy5zdGFydEludGVyYWN0aW9uKGV2LCBleHRyYU9wdGlvbnMpOyAvLyBlbnN1cmUgaW50ZXJhY3Rpb24gYmVnYW4KCgkJaWYgKCF0aGlzLmlzRHJhZ2dpbmcpIHsKCQkJdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTsKCQkJdGhpcy5oYW5kbGVEcmFnU3RhcnQoZXYpOwoJCX0KCX0sCgoKCWhhbmRsZURyYWdTdGFydDogZnVuY3Rpb24oZXYpIHsKCQl0aGlzLnRyaWdnZXIoJ2RyYWdTdGFydCcsIGV2KTsKCX0sCgoKCWhhbmRsZU1vdmU6IGZ1bmN0aW9uKGV2KSB7CgkJdmFyIGR4ID0gZ2V0RXZYKGV2KSAtIHRoaXMub3JpZ2luWDsKCQl2YXIgZHkgPSBnZXRFdlkoZXYpIC0gdGhpcy5vcmlnaW5ZOwoJCXZhciBtaW5EaXN0YW5jZSA9IHRoaXMubWluRGlzdGFuY2U7CgkJdmFyIGRpc3RhbmNlU3E7IC8vIGN1cnJlbnQgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luLCBzcXVhcmVkCgoJCWlmICghdGhpcy5pc0Rpc3RhbmNlU3VycGFzc2VkKSB7CgkJCWRpc3RhbmNlU3EgPSBkeCAqIGR4ICsgZHkgKiBkeTsKCQkJaWYgKGRpc3RhbmNlU3EgPj0gbWluRGlzdGFuY2UgKiBtaW5EaXN0YW5jZSkgeyAvLyB1c2UgcHl0aGFnb3JlYW4gdGhlb3JlbQoJCQkJdGhpcy5oYW5kbGVEaXN0YW5jZVN1cnBhc3NlZChldik7CgkJCX0KCQl9CgoJCWlmICh0aGlzLmlzRHJhZ2dpbmcpIHsKCQkJdGhpcy5oYW5kbGVEcmFnKGR4LCBkeSwgZXYpOwoJCX0KCX0sCgoKCS8vIENhbGxlZCB3aGlsZSB0aGUgbW91c2UgaXMgYmVpbmcgbW92ZWQgYW5kIHdoZW4gd2Uga25vdyBhIGxlZ2l0aW1hdGUgZHJhZyBpcyB0YWtpbmcgcGxhY2UKCWhhbmRsZURyYWc6IGZ1bmN0aW9uKGR4LCBkeSwgZXYpIHsKCQl0aGlzLnRyaWdnZXIoJ2RyYWcnLCBkeCwgZHksIGV2KTsKCQl0aGlzLnVwZGF0ZUF1dG9TY3JvbGwoZXYpOyAvLyB3aWxsIHBvc3NpYmx5IGNhdXNlIHNjcm9sbGluZwoJfSwKCgoJZW5kRHJhZzogZnVuY3Rpb24oZXYpIHsKCQlpZiAodGhpcy5pc0RyYWdnaW5nKSB7CgkJCXRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlOwoJCQl0aGlzLmhhbmRsZURyYWdFbmQoZXYpOwoJCX0KCX0sCgoKCWhhbmRsZURyYWdFbmQ6IGZ1bmN0aW9uKGV2KSB7CgkJdGhpcy50cmlnZ2VyKCdkcmFnRW5kJywgZXYpOwoJfSwKCgoJLy8gRGVsYXkKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCXN0YXJ0RGVsYXk6IGZ1bmN0aW9uKGluaXRpYWxFdikgewoJCXZhciBfdGhpcyA9IHRoaXM7CgoJCWlmICh0aGlzLmRlbGF5KSB7CgkJCXRoaXMuZGVsYXlUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJX3RoaXMuaGFuZGxlRGVsYXlFbmQoaW5pdGlhbEV2KTsKCQkJfSwgdGhpcy5kZWxheSk7CgkJfQoJCWVsc2UgewoJCQl0aGlzLmhhbmRsZURlbGF5RW5kKGluaXRpYWxFdik7CgkJfQoJfSwKCgoJaGFuZGxlRGVsYXlFbmQ6IGZ1bmN0aW9uKGluaXRpYWxFdikgewoJCXRoaXMuaXNEZWxheUVuZGVkID0gdHJ1ZTsKCgkJaWYgKHRoaXMuaXNEaXN0YW5jZVN1cnBhc3NlZCkgewoJCQl0aGlzLnN0YXJ0RHJhZyhpbml0aWFsRXYpOwoJCX0KCX0sCgoKCS8vIERpc3RhbmNlCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgloYW5kbGVEaXN0YW5jZVN1cnBhc3NlZDogZnVuY3Rpb24oZXYpIHsKCQl0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQgPSB0cnVlOwoKCQlpZiAodGhpcy5pc0RlbGF5RW5kZWQpIHsKCQkJdGhpcy5zdGFydERyYWcoZXYpOwoJCX0KCX0sCgoKCS8vIE1vdXNlIC8gVG91Y2gKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCWhhbmRsZVRvdWNoTW92ZTogZnVuY3Rpb24oZXYpIHsKCQkvLyBwcmV2ZW50IGluZXJ0aWEgYW5kIHRvdWNobW92ZS1zY3JvbGxpbmcgd2hpbGUgZHJhZ2dpbmcKCQlpZiAodGhpcy5pc0RyYWdnaW5nKSB7CgkJCWV2LnByZXZlbnREZWZhdWx0KCk7CgkJfQoKCQl0aGlzLmhhbmRsZU1vdmUoZXYpOwoJfSwKCgoJaGFuZGxlTW91c2VNb3ZlOiBmdW5jdGlvbihldikgewoJCXRoaXMuaGFuZGxlTW92ZShldik7Cgl9LAoKCgkvLyBTY3JvbGxpbmcgKHVucmVsYXRlZCB0byBhdXRvLXNjcm9sbCkKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCWhhbmRsZVRvdWNoU2Nyb2xsOiBmdW5jdGlvbihldikgewoJCS8vIGlmIHRoZSBkcmFnIGlzIGJlaW5nIGluaXRpYXRlZCBieSB0b3VjaCwgYnV0IGEgc2Nyb2xsIGhhcHBlbnMgYmVmb3JlCgkJLy8gdGhlIGRyYWctaW5pdGlhdGluZyBkZWxheSBpcyBvdmVyLCBjYW5jZWwgdGhlIGRyYWcKCQlpZiAoIXRoaXMuaXNEcmFnZ2luZykgewoJCQl0aGlzLmVuZEludGVyYWN0aW9uKGV2LCB0cnVlKTsgLy8gaXNDYW5jZWxsZWQ9dHJ1ZQoJCX0KCX0sCgoKCS8vIFV0aWxzCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgkvLyBUcmlnZ2VycyBhIGNhbGxiYWNrLiBDYWxscyBhIGZ1bmN0aW9uIGluIHRoZSBvcHRpb24gaGFzaCBvZiB0aGUgc2FtZSBuYW1lLgoJLy8gQXJndW1lbnRzIGJleW9uZCB0aGUgZmlyc3QgYG5hbWVgIGFyZSBmb3J3YXJkZWQgb24uCgl0cmlnZ2VyOiBmdW5jdGlvbihuYW1lKSB7CgkJaWYgKHRoaXMub3B0aW9uc1tuYW1lXSkgewoJCQl0aGlzLm9wdGlvbnNbbmFtZV0uYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CgkJfQoJCS8vIG1ha2VzIF9tZXRob2RzIGNhbGxhYmxlIGJ5IGV2ZW50IG5hbWUuIFRPRE86IGtpbGwgdGhpcwoJCWlmICh0aGlzWydfJyArIG5hbWVdKSB7CgkJCXRoaXNbJ18nICsgbmFtZV0uYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CgkJfQoJfQoKCn0pOwoKOzsKLyoKdGhpcy5zY3JvbGxFbCBpcyBzZXQgaW4gRHJhZ0xpc3RlbmVyCiovCkRyYWdMaXN0ZW5lci5taXhpbih7CgoJaXNBdXRvU2Nyb2xsOiBmYWxzZSwKCglzY3JvbGxCb3VuZHM6IG51bGwsIC8vIHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0IH0KCXNjcm9sbFRvcFZlbDogbnVsbCwgLy8gcGl4ZWxzIHBlciBzZWNvbmQKCXNjcm9sbExlZnRWZWw6IG51bGwsIC8vIHBpeGVscyBwZXIgc2Vjb25kCglzY3JvbGxJbnRlcnZhbElkOiBudWxsLCAvLyBJRCBvZiBzZXRUaW1lb3V0IGZvciBzY3JvbGxpbmcgYW5pbWF0aW9uIGxvb3AKCgkvLyBkZWZhdWx0cwoJc2Nyb2xsU2Vuc2l0aXZpdHk6IDMwLCAvLyBwaXhlbHMgZnJvbSBlZGdlIGZvciBzY3JvbGxpbmcgdG8gc3RhcnQKCXNjcm9sbFNwZWVkOiAyMDAsIC8vIHBpeGVscyBwZXIgc2Vjb25kLCBhdCBtYXhpbXVtIHNwZWVkCglzY3JvbGxJbnRlcnZhbE1zOiA1MCwgLy8gbWlsbGlzZWNvbmQgd2FpdCBiZXR3ZWVuIHNjcm9sbCBpbmNyZW1lbnQKCgoJaW5pdEF1dG9TY3JvbGw6IGZ1bmN0aW9uKCkgewoJCXZhciBzY3JvbGxFbCA9IHRoaXMuc2Nyb2xsRWw7CgoJCXRoaXMuaXNBdXRvU2Nyb2xsID0KCQkJdGhpcy5vcHRpb25zLnNjcm9sbCAmJgoJCQlzY3JvbGxFbCAmJgoJCQkhc2Nyb2xsRWwuaXMod2luZG93KSAmJgoJCQkhc2Nyb2xsRWwuaXMoZG9jdW1lbnQpOwoKCQlpZiAodGhpcy5pc0F1dG9TY3JvbGwpIHsKCQkJLy8gZGVib3VuY2UgbWFrZXMgc3VyZSByYXBpZCBjYWxscyBkb24ndCBoYXBwZW4KCQkJdGhpcy5saXN0ZW5UbyhzY3JvbGxFbCwgJ3Njcm9sbCcsIGRlYm91bmNlKHRoaXMuaGFuZGxlRGVib3VuY2VkU2Nyb2xsLCAxMDApKTsKCQl9Cgl9LAoKCglkZXN0cm95QXV0b1Njcm9sbDogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbmRBdXRvU2Nyb2xsKCk7IC8vIGtpbGwgYW55IGFuaW1hdGlvbiBsb29wCgoJCS8vIHJlbW92ZSB0aGUgc2Nyb2xsIGhhbmRsZXIgaWYgdGhlcmUgaXMgYSBzY3JvbGxFbAoJCWlmICh0aGlzLmlzQXV0b1Njcm9sbCkgewoJCQl0aGlzLnN0b3BMaXN0ZW5pbmdUbyh0aGlzLnNjcm9sbEVsLCAnc2Nyb2xsJyk7IC8vIHdpbGwgcHJvYmFibHkgZ2V0IHJlbW92ZWQgYnkgdW5iaW5kSGFuZGxlcnMgdG9vIDooCgkJfQoJfSwKCgoJLy8gQ29tcHV0ZXMgYW5kIHN0b3JlcyB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHNjcm9sbEVsCgljb21wdXRlU2Nyb2xsQm91bmRzOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5pc0F1dG9TY3JvbGwpIHsKCQkJdGhpcy5zY3JvbGxCb3VuZHMgPSBnZXRPdXRlclJlY3QodGhpcy5zY3JvbGxFbCk7CgkJCS8vIFRPRE86IHVzZSBnZXRDbGllbnRSZWN0IGluIGZ1dHVyZS4gYnV0IHByZXZlbnRzIGF1dG8gc2Nyb2xsaW5nIHdoZW4gb24gdG9wIG9mIHNjcm9sbGJhcnMKCQl9Cgl9LAoKCgkvLyBDYWxsZWQgd2hlbiB0aGUgZHJhZ2dpbmcgaXMgaW4gcHJvZ3Jlc3MgYW5kIHNjcm9sbGluZyBzaG91bGQgYmUgdXBkYXRlZAoJdXBkYXRlQXV0b1Njcm9sbDogZnVuY3Rpb24oZXYpIHsKCQl2YXIgc2Vuc2l0aXZpdHkgPSB0aGlzLnNjcm9sbFNlbnNpdGl2aXR5OwoJCXZhciBib3VuZHMgPSB0aGlzLnNjcm9sbEJvdW5kczsKCQl2YXIgdG9wQ2xvc2VuZXNzLCBib3R0b21DbG9zZW5lc3M7CgkJdmFyIGxlZnRDbG9zZW5lc3MsIHJpZ2h0Q2xvc2VuZXNzOwoJCXZhciB0b3BWZWwgPSAwOwoJCXZhciBsZWZ0VmVsID0gMDsKCgkJaWYgKGJvdW5kcykgeyAvLyBvbmx5IHNjcm9sbCBpZiBzY3JvbGxFbCBleGlzdHMKCgkJCS8vIGNvbXB1dGUgY2xvc2VuZXNzIHRvIGVkZ2VzLiB2YWxpZCByYW5nZSBpcyBmcm9tIDAuMCAtIDEuMAoJCQl0b3BDbG9zZW5lc3MgPSAoc2Vuc2l0aXZpdHkgLSAoZ2V0RXZZKGV2KSAtIGJvdW5kcy50b3ApKSAvIHNlbnNpdGl2aXR5OwoJCQlib3R0b21DbG9zZW5lc3MgPSAoc2Vuc2l0aXZpdHkgLSAoYm91bmRzLmJvdHRvbSAtIGdldEV2WShldikpKSAvIHNlbnNpdGl2aXR5OwoJCQlsZWZ0Q2xvc2VuZXNzID0gKHNlbnNpdGl2aXR5IC0gKGdldEV2WChldikgLSBib3VuZHMubGVmdCkpIC8gc2Vuc2l0aXZpdHk7CgkJCXJpZ2h0Q2xvc2VuZXNzID0gKHNlbnNpdGl2aXR5IC0gKGJvdW5kcy5yaWdodCAtIGdldEV2WChldikpKSAvIHNlbnNpdGl2aXR5OwoKCQkJLy8gdHJhbnNsYXRlIHZlcnRpY2FsIGNsb3NlbmVzcyBpbnRvIHZlbG9jaXR5LgoJCQkvLyBtb3VzZSBtdXN0IGJlIGNvbXBsZXRlbHkgaW4gYm91bmRzIGZvciB2ZWxvY2l0eSB0byBoYXBwZW4uCgkJCWlmICh0b3BDbG9zZW5lc3MgPj0gMCAmJiB0b3BDbG9zZW5lc3MgPD0gMSkgewoJCQkJdG9wVmVsID0gdG9wQ2xvc2VuZXNzICogdGhpcy5zY3JvbGxTcGVlZCAqIC0xOyAvLyBuZWdhdGl2ZS4gZm9yIHNjcm9sbGluZyB1cAoJCQl9CgkJCWVsc2UgaWYgKGJvdHRvbUNsb3NlbmVzcyA+PSAwICYmIGJvdHRvbUNsb3NlbmVzcyA8PSAxKSB7CgkJCQl0b3BWZWwgPSBib3R0b21DbG9zZW5lc3MgKiB0aGlzLnNjcm9sbFNwZWVkOwoJCQl9CgoJCQkvLyB0cmFuc2xhdGUgaG9yaXpvbnRhbCBjbG9zZW5lc3MgaW50byB2ZWxvY2l0eQoJCQlpZiAobGVmdENsb3NlbmVzcyA+PSAwICYmIGxlZnRDbG9zZW5lc3MgPD0gMSkgewoJCQkJbGVmdFZlbCA9IGxlZnRDbG9zZW5lc3MgKiB0aGlzLnNjcm9sbFNwZWVkICogLTE7IC8vIG5lZ2F0aXZlLiBmb3Igc2Nyb2xsaW5nIGxlZnQKCQkJfQoJCQllbHNlIGlmIChyaWdodENsb3NlbmVzcyA+PSAwICYmIHJpZ2h0Q2xvc2VuZXNzIDw9IDEpIHsKCQkJCWxlZnRWZWwgPSByaWdodENsb3NlbmVzcyAqIHRoaXMuc2Nyb2xsU3BlZWQ7CgkJCX0KCQl9CgoJCXRoaXMuc2V0U2Nyb2xsVmVsKHRvcFZlbCwgbGVmdFZlbCk7Cgl9LAoKCgkvLyBTZXRzIHRoZSBzcGVlZC1vZi1zY3JvbGxpbmcgZm9yIHRoZSBzY3JvbGxFbAoJc2V0U2Nyb2xsVmVsOiBmdW5jdGlvbih0b3BWZWwsIGxlZnRWZWwpIHsKCgkJdGhpcy5zY3JvbGxUb3BWZWwgPSB0b3BWZWw7CgkJdGhpcy5zY3JvbGxMZWZ0VmVsID0gbGVmdFZlbDsKCgkJdGhpcy5jb25zdHJhaW5TY3JvbGxWZWwoKTsgLy8gbWFzc2FnZXMgaW50byByZWFsaXN0aWMgdmFsdWVzCgoJCS8vIGlmIHRoZXJlIGlzIG5vbi16ZXJvIHZlbG9jaXR5LCBhbmQgYW4gYW5pbWF0aW9uIGxvb3AgaGFzbid0IGFscmVhZHkgc3RhcnRlZCwgdGhlbiBTVEFSVAoJCWlmICgodGhpcy5zY3JvbGxUb3BWZWwgfHwgdGhpcy5zY3JvbGxMZWZ0VmVsKSAmJiAhdGhpcy5zY3JvbGxJbnRlcnZhbElkKSB7CgkJCXRoaXMuc2Nyb2xsSW50ZXJ2YWxJZCA9IHNldEludGVydmFsKAoJCQkJcHJveHkodGhpcywgJ3Njcm9sbEludGVydmFsRnVuYycpLCAvLyBzY29wZSB0byBgdGhpc2AKCQkJCXRoaXMuc2Nyb2xsSW50ZXJ2YWxNcwoJCQkpOwoJCX0KCX0sCgoKCS8vIEZvcmNlcyBzY3JvbGxUb3BWZWwgYW5kIHNjcm9sbExlZnRWZWwgdG8gYmUgemVybyBpZiBzY3JvbGxpbmcgaGFzIGFscmVhZHkgZ29uZSBhbGwgdGhlIHdheQoJY29uc3RyYWluU2Nyb2xsVmVsOiBmdW5jdGlvbigpIHsKCQl2YXIgZWwgPSB0aGlzLnNjcm9sbEVsOwoKCQlpZiAodGhpcy5zY3JvbGxUb3BWZWwgPCAwKSB7IC8vIHNjcm9sbGluZyB1cD8KCQkJaWYgKGVsLnNjcm9sbFRvcCgpIDw9IDApIHsgLy8gYWxyZWFkeSBzY3JvbGxlZCBhbGwgdGhlIHdheSB1cD8KCQkJCXRoaXMuc2Nyb2xsVG9wVmVsID0gMDsKCQkJfQoJCX0KCQllbHNlIGlmICh0aGlzLnNjcm9sbFRvcFZlbCA+IDApIHsgLy8gc2Nyb2xsaW5nIGRvd24/CgkJCWlmIChlbC5zY3JvbGxUb3AoKSArIGVsWzBdLmNsaWVudEhlaWdodCA+PSBlbFswXS5zY3JvbGxIZWlnaHQpIHsgLy8gYWxyZWFkeSBzY3JvbGxlZCBhbGwgdGhlIHdheSBkb3duPwoJCQkJdGhpcy5zY3JvbGxUb3BWZWwgPSAwOwoJCQl9CgkJfQoKCQlpZiAodGhpcy5zY3JvbGxMZWZ0VmVsIDwgMCkgeyAvLyBzY3JvbGxpbmcgbGVmdD8KCQkJaWYgKGVsLnNjcm9sbExlZnQoKSA8PSAwKSB7IC8vIGFscmVhZHkgc2Nyb2xsZWQgYWxsIHRoZSBsZWZ0PwoJCQkJdGhpcy5zY3JvbGxMZWZ0VmVsID0gMDsKCQkJfQoJCX0KCQllbHNlIGlmICh0aGlzLnNjcm9sbExlZnRWZWwgPiAwKSB7IC8vIHNjcm9sbGluZyByaWdodD8KCQkJaWYgKGVsLnNjcm9sbExlZnQoKSArIGVsWzBdLmNsaWVudFdpZHRoID49IGVsWzBdLnNjcm9sbFdpZHRoKSB7IC8vIGFscmVhZHkgc2Nyb2xsZWQgYWxsIHRoZSB3YXkgcmlnaHQ/CgkJCQl0aGlzLnNjcm9sbExlZnRWZWwgPSAwOwoJCQl9CgkJfQoJfSwKCgoJLy8gVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBkdXJpbmcgZXZlcnkgaXRlcmF0aW9uIG9mIHRoZSBzY3JvbGxpbmcgYW5pbWF0aW9uIGxvb3AKCXNjcm9sbEludGVydmFsRnVuYzogZnVuY3Rpb24oKSB7CgkJdmFyIGVsID0gdGhpcy5zY3JvbGxFbDsKCQl2YXIgZnJhYyA9IHRoaXMuc2Nyb2xsSW50ZXJ2YWxNcyAvIDEwMDA7IC8vIGNvbnNpZGVyaW5nIGFuaW1hdGlvbiBmcmVxdWVuY3ksIHdoYXQgdGhlIHZlbCBzaG91bGQgYmUgbXVsdCdkIGJ5CgoJCS8vIGNoYW5nZSB0aGUgdmFsdWUgb2Ygc2Nyb2xsRWwncyBzY3JvbGwKCQlpZiAodGhpcy5zY3JvbGxUb3BWZWwpIHsKCQkJZWwuc2Nyb2xsVG9wKGVsLnNjcm9sbFRvcCgpICsgdGhpcy5zY3JvbGxUb3BWZWwgKiBmcmFjKTsKCQl9CgkJaWYgKHRoaXMuc2Nyb2xsTGVmdFZlbCkgewoJCQllbC5zY3JvbGxMZWZ0KGVsLnNjcm9sbExlZnQoKSArIHRoaXMuc2Nyb2xsTGVmdFZlbCAqIGZyYWMpOwoJCX0KCgkJdGhpcy5jb25zdHJhaW5TY3JvbGxWZWwoKTsgLy8gc2luY2UgdGhlIHNjcm9sbCB2YWx1ZXMgY2hhbmdlZCwgcmVjb21wdXRlIHRoZSB2ZWxvY2l0aWVzCgoJCS8vIGlmIHNjcm9sbGVkIGFsbCB0aGUgd2F5LCB3aGljaCBjYXVzZXMgdGhlIHZlbHMgdG8gYmUgemVybywgc3RvcCB0aGUgYW5pbWF0aW9uIGxvb3AKCQlpZiAoIXRoaXMuc2Nyb2xsVG9wVmVsICYmICF0aGlzLnNjcm9sbExlZnRWZWwpIHsKCQkJdGhpcy5lbmRBdXRvU2Nyb2xsKCk7CgkJfQoJfSwKCgoJLy8gS2lsbHMgYW55IGV4aXN0aW5nIHNjcm9sbGluZyBhbmltYXRpb24gbG9vcAoJZW5kQXV0b1Njcm9sbDogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuc2Nyb2xsSW50ZXJ2YWxJZCkgewoJCQljbGVhckludGVydmFsKHRoaXMuc2Nyb2xsSW50ZXJ2YWxJZCk7CgkJCXRoaXMuc2Nyb2xsSW50ZXJ2YWxJZCA9IG51bGw7CgoJCQl0aGlzLmhhbmRsZVNjcm9sbEVuZCgpOwoJCX0KCX0sCgoKCS8vIEdldCBjYWxsZWQgd2hlbiB0aGUgc2Nyb2xsRWwgaXMgc2Nyb2xsZWQgKE5PVEU6IHRoaXMgaXMgZGVsYXllZCB2aWEgZGVib3VuY2UpCgloYW5kbGVEZWJvdW5jZWRTY3JvbGw6IGZ1bmN0aW9uKCkgewoJCS8vIHJlY29tcHV0ZSBhbGwgY29vcmRpbmF0ZXMsIGJ1dCAqb25seSogaWYgdGhpcyBpcyAqbm90KiBwYXJ0IG9mIG91ciBzY3JvbGxpbmcgYW5pbWF0aW9uCgkJaWYgKCF0aGlzLnNjcm9sbEludGVydmFsSWQpIHsKCQkJdGhpcy5oYW5kbGVTY3JvbGxFbmQoKTsKCQl9Cgl9LAoKCgkvLyBDYWxsZWQgd2hlbiBzY3JvbGxpbmcgaGFzIHN0b3BwZWQsIHdoZXRoZXIgdGhyb3VnaCBhdXRvIHNjcm9sbCwgb3IgdGhlIHVzZXIgc2Nyb2xsaW5nCgloYW5kbGVTY3JvbGxFbmQ6IGZ1bmN0aW9uKCkgewoJfQoKfSk7Cjs7CgovKiBUcmFja3MgbW91c2UgbW92ZW1lbnRzIG92ZXIgYSBjb21wb25lbnQgYW5kIHJhaXNlcyBldmVudHMgYWJvdXQgd2hpY2ggaGl0IHRoZSBtb3VzZSBpcyBvdmVyLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kb3B0aW9uczoKLSBzdWJqZWN0RWwKLSBzdWJqZWN0Q2VudGVyCiovCgp2YXIgSGl0RHJhZ0xpc3RlbmVyID0gRHJhZ0xpc3RlbmVyLmV4dGVuZCh7CgoJY29tcG9uZW50OiBudWxsLCAvLyBjb252ZXJ0cyBjb29yZGluYXRlcyB0byBoaXRzCgkJLy8gbWV0aG9kczogcHJlcGFyZUhpdHMsIHJlbGVhc2VIaXRzLCBxdWVyeUhpdAoKCW9yaWdIaXQ6IG51bGwsIC8vIHRoZSBoaXQgdGhlIG1vdXNlIHdhcyBvdmVyIHdoZW4gbGlzdGVuaW5nIHN0YXJ0ZWQKCWhpdDogbnVsbCwgLy8gdGhlIGhpdCB0aGUgbW91c2UgaXMgb3ZlcgoJY29vcmRBZGp1c3Q6IG51bGwsIC8vIGRlbHRhIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgbW91c2UgY29vcmRpbmF0ZXMgd2hlbiBjb21wdXRpbmcgY29sbGlzaW9ucwoKCgljb25zdHJ1Y3RvcjogZnVuY3Rpb24oY29tcG9uZW50LCBvcHRpb25zKSB7CgkJRHJhZ0xpc3RlbmVyLmNhbGwodGhpcywgb3B0aW9ucyk7IC8vIGNhbGwgdGhlIHN1cGVyLWNvbnN0cnVjdG9yCgoJCXRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gZHJhZyBsaXN0ZW5pbmcgc3RhcnRzIChidXQgYSByZWFsIGRyYWcgaGFzIG5vdCBuZWNlc3NhcmlseSBiZWdhbikuCgkvLyBldiBtaWdodCBiZSB1bmRlZmluZWQgaWYgZHJhZ2dpbmcgd2FzIHN0YXJ0ZWQgbWFudWFsbHkuCgloYW5kbGVJbnRlcmFjdGlvblN0YXJ0OiBmdW5jdGlvbihldikgewoJCXZhciBzdWJqZWN0RWwgPSB0aGlzLnN1YmplY3RFbDsKCQl2YXIgc3ViamVjdFJlY3Q7CgkJdmFyIG9yaWdQb2ludDsKCQl2YXIgcG9pbnQ7CgoJCXRoaXMuY29tcHV0ZUNvb3JkcygpOwoKCQlpZiAoZXYpIHsKCQkJb3JpZ1BvaW50ID0geyBsZWZ0OiBnZXRFdlgoZXYpLCB0b3A6IGdldEV2WShldikgfTsKCQkJcG9pbnQgPSBvcmlnUG9pbnQ7CgoJCQkvLyBjb25zdHJhaW4gdGhlIHBvaW50IHRvIGJvdW5kcyBvZiB0aGUgZWxlbWVudCBiZWluZyBkcmFnZ2VkCgkJCWlmIChzdWJqZWN0RWwpIHsKCQkJCXN1YmplY3RSZWN0ID0gZ2V0T3V0ZXJSZWN0KHN1YmplY3RFbCk7IC8vIHVzZWQgZm9yIGNlbnRlcmluZyBhcyB3ZWxsCgkJCQlwb2ludCA9IGNvbnN0cmFpblBvaW50KHBvaW50LCBzdWJqZWN0UmVjdCk7CgkJCX0KCgkJCXRoaXMub3JpZ0hpdCA9IHRoaXMucXVlcnlIaXQocG9pbnQubGVmdCwgcG9pbnQudG9wKTsKCgkJCS8vIHRyZWF0IHRoZSBjZW50ZXIgb2YgdGhlIHN1YmplY3QgYXMgdGhlIGNvbGxpc2lvbiBwb2ludD8KCQkJaWYgKHN1YmplY3RFbCAmJiB0aGlzLm9wdGlvbnMuc3ViamVjdENlbnRlcikgewoKCQkJCS8vIG9ubHkgY29uc2lkZXIgdGhlIGFyZWEgdGhlIHN1YmplY3Qgb3ZlcmxhcHMgdGhlIGhpdC4gYmVzdCBmb3IgbGFyZ2Ugc3ViamVjdHMuCgkJCQkvLyBUT0RPOiBza2lwIHRoaXMgaWYgaGl0IGRpZG4ndCBzdXBwbHkgbGVmdC9yaWdodC90b3AvYm90dG9tCgkJCQlpZiAodGhpcy5vcmlnSGl0KSB7CgkJCQkJc3ViamVjdFJlY3QgPSBpbnRlcnNlY3RSZWN0cyh0aGlzLm9yaWdIaXQsIHN1YmplY3RSZWN0KSB8fAoJCQkJCQlzdWJqZWN0UmVjdDsgLy8gaW4gY2FzZSB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24KCQkJCX0KCgkJCQlwb2ludCA9IGdldFJlY3RDZW50ZXIoc3ViamVjdFJlY3QpOwoJCQl9CgoJCQl0aGlzLmNvb3JkQWRqdXN0ID0gZGlmZlBvaW50cyhwb2ludCwgb3JpZ1BvaW50KTsgLy8gcG9pbnQgLSBvcmlnUG9pbnQKCQl9CgkJZWxzZSB7CgkJCXRoaXMub3JpZ0hpdCA9IG51bGw7CgkJCXRoaXMuY29vcmRBZGp1c3QgPSBudWxsOwoJCX0KCgkJLy8gY2FsbCB0aGUgc3VwZXItbWV0aG9kLiBkbyBpdCBhZnRlciBvcmlnSGl0IGhhcyBiZWVuIGNvbXB1dGVkCgkJRHJhZ0xpc3RlbmVyLnByb3RvdHlwZS5oYW5kbGVJbnRlcmFjdGlvblN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cgl9LAoKCgkvLyBSZWNvbXB1dGVzIHRoZSBkcmFnLWNyaXRpY2FsIHBvc2l0aW9ucyBvZiBlbGVtZW50cwoJY29tcHV0ZUNvb3JkczogZnVuY3Rpb24oKSB7CgkJdGhpcy5jb21wb25lbnQucHJlcGFyZUhpdHMoKTsKCQl0aGlzLmNvbXB1dGVTY3JvbGxCb3VuZHMoKTsgLy8gd2h5IGlzIHRoaXMgaGVyZT8/Pz8/PwoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gdGhlIGFjdHVhbCBkcmFnIGhhcyBzdGFydGVkCgloYW5kbGVEcmFnU3RhcnQ6IGZ1bmN0aW9uKGV2KSB7CgkJdmFyIGhpdDsKCgkJRHJhZ0xpc3RlbmVyLnByb3RvdHlwZS5oYW5kbGVEcmFnU3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gY2FsbCB0aGUgc3VwZXItbWV0aG9kCgoJCS8vIG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIHRoaXMub3JpZ0hpdCBpZiB0aGUgbWluLWRpc3RhbmNlIGlzIGxhcmdlCgkJaGl0ID0gdGhpcy5xdWVyeUhpdChnZXRFdlgoZXYpLCBnZXRFdlkoZXYpKTsKCgkJLy8gcmVwb3J0IHRoZSBpbml0aWFsIGhpdCB0aGUgbW91c2UgaXMgb3ZlcgoJCS8vIGVzcGVjaWFsbHkgaW1wb3J0YW50IGlmIG5vIG1pbi1kaXN0YW5jZSBhbmQgZHJhZyBzdGFydHMgaW1tZWRpYXRlbHkKCQlpZiAoaGl0KSB7CgkJCXRoaXMuaGFuZGxlSGl0T3ZlcihoaXQpOwoJCX0KCX0sCgoKCS8vIENhbGxlZCB3aGVuIHRoZSBkcmFnIG1vdmVzCgloYW5kbGVEcmFnOiBmdW5jdGlvbihkeCwgZHksIGV2KSB7CgkJdmFyIGhpdDsKCgkJRHJhZ0xpc3RlbmVyLnByb3RvdHlwZS5oYW5kbGVEcmFnLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGNhbGwgdGhlIHN1cGVyLW1ldGhvZAoKCQloaXQgPSB0aGlzLnF1ZXJ5SGl0KGdldEV2WChldiksIGdldEV2WShldikpOwoKCQlpZiAoIWlzSGl0c0VxdWFsKGhpdCwgdGhpcy5oaXQpKSB7IC8vIGEgZGlmZmVyZW50IGhpdCB0aGFuIGJlZm9yZT8KCQkJaWYgKHRoaXMuaGl0KSB7CgkJCQl0aGlzLmhhbmRsZUhpdE91dCgpOwoJCQl9CgkJCWlmIChoaXQpIHsKCQkJCXRoaXMuaGFuZGxlSGl0T3ZlcihoaXQpOwoJCQl9CgkJfQoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gZHJhZ2dpbmcgaGFzIGJlZW4gc3RvcHBlZAoJaGFuZGxlRHJhZ0VuZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5oYW5kbGVIaXREb25lKCk7CgkJRHJhZ0xpc3RlbmVyLnByb3RvdHlwZS5oYW5kbGVEcmFnRW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGNhbGwgdGhlIHN1cGVyLW1ldGhvZAoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gYSB0aGUgbW91c2UgaGFzIGp1c3QgbW92ZWQgb3ZlciBhIG5ldyBoaXQKCWhhbmRsZUhpdE92ZXI6IGZ1bmN0aW9uKGhpdCkgewoJCXZhciBpc09yaWcgPSBpc0hpdHNFcXVhbChoaXQsIHRoaXMub3JpZ0hpdCk7CgoJCXRoaXMuaGl0ID0gaGl0OwoKCQl0aGlzLnRyaWdnZXIoJ2hpdE92ZXInLCB0aGlzLmhpdCwgaXNPcmlnLCB0aGlzLm9yaWdIaXQpOwoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gdGhlIG1vdXNlIGhhcyBqdXN0IG1vdmVkIG91dCBvZiBhIGhpdAoJaGFuZGxlSGl0T3V0OiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5oaXQpIHsKCQkJdGhpcy50cmlnZ2VyKCdoaXRPdXQnLCB0aGlzLmhpdCk7CgkJCXRoaXMuaGFuZGxlSGl0RG9uZSgpOwoJCQl0aGlzLmhpdCA9IG51bGw7CgkJfQoJfSwKCgoJLy8gQ2FsbGVkIGFmdGVyIGEgaGl0T3V0LiBBbHNvIGNhbGxlZCBiZWZvcmUgYSBkcmFnU3RvcAoJaGFuZGxlSGl0RG9uZTogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaGl0KSB7CgkJCXRoaXMudHJpZ2dlcignaGl0RG9uZScsIHRoaXMuaGl0KTsKCQl9Cgl9LAoKCgkvLyBDYWxsZWQgd2hlbiB0aGUgaW50ZXJhY3Rpb24gZW5kcywgd2hldGhlciB0aGVyZSB3YXMgYSByZWFsIGRyYWcgb3Igbm90CgloYW5kbGVJbnRlcmFjdGlvbkVuZDogZnVuY3Rpb24oKSB7CgkJRHJhZ0xpc3RlbmVyLnByb3RvdHlwZS5oYW5kbGVJbnRlcmFjdGlvbkVuZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBjYWxsIHRoZSBzdXBlci1tZXRob2QKCgkJdGhpcy5vcmlnSGl0ID0gbnVsbDsKCQl0aGlzLmhpdCA9IG51bGw7CgoJCXRoaXMuY29tcG9uZW50LnJlbGVhc2VIaXRzKCk7Cgl9LAoKCgkvLyBDYWxsZWQgd2hlbiBzY3JvbGxpbmcgaGFzIHN0b3BwZWQsIHdoZXRoZXIgdGhyb3VnaCBhdXRvIHNjcm9sbCwgb3IgdGhlIHVzZXIgc2Nyb2xsaW5nCgloYW5kbGVTY3JvbGxFbmQ6IGZ1bmN0aW9uKCkgewoJCURyYWdMaXN0ZW5lci5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsRW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGNhbGwgdGhlIHN1cGVyLW1ldGhvZAoKCQl0aGlzLmNvbXB1dGVDb29yZHMoKTsgLy8gaGl0cycgYWJzb2x1dGUgcG9zaXRpb25zIHdpbGwgYmUgaW4gbmV3IHBsYWNlcy4gcmVjb21wdXRlCgl9LAoKCgkvLyBHZXRzIHRoZSBoaXQgdW5kZXJuZWF0aCB0aGUgY29vcmRpbmF0ZXMgZm9yIHRoZSBnaXZlbiBtb3VzZSBldmVudAoJcXVlcnlIaXQ6IGZ1bmN0aW9uKGxlZnQsIHRvcCkgewoKCQlpZiAodGhpcy5jb29yZEFkanVzdCkgewoJCQlsZWZ0ICs9IHRoaXMuY29vcmRBZGp1c3QubGVmdDsKCQkJdG9wICs9IHRoaXMuY29vcmRBZGp1c3QudG9wOwoJCX0KCgkJcmV0dXJuIHRoaXMuY29tcG9uZW50LnF1ZXJ5SGl0KGxlZnQsIHRvcCk7Cgl9Cgp9KTsKCgovLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgaGl0cyBhcmUgaWRlbnRpY2FsbHkgZXF1YWwuIGBmYWxzZWAgb3RoZXJ3aXNlLiBNdXN0IGJlIGZyb20gdGhlIHNhbWUgY29tcG9uZW50LgovLyBUd28gbnVsbCB2YWx1ZXMgd2lsbCBiZSBjb25zaWRlcmVkIGVxdWFsLCBhcyB0d28gIm91dCBvZiB0aGUgY29tcG9uZW50IiBzdGF0ZXMgYXJlIHRoZSBzYW1lLgpmdW5jdGlvbiBpc0hpdHNFcXVhbChoaXQwLCBoaXQxKSB7CgoJaWYgKCFoaXQwICYmICFoaXQxKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoJaWYgKGhpdDAgJiYgaGl0MSkgewoJCXJldHVybiBoaXQwLmNvbXBvbmVudCA9PT0gaGl0MS5jb21wb25lbnQgJiYKCQkJaXNIaXRQcm9wc1dpdGhpbihoaXQwLCBoaXQxKSAmJgoJCQlpc0hpdFByb3BzV2l0aGluKGhpdDEsIGhpdDApOyAvLyBlbnN1cmVzIGFsbCBwcm9wcyBhcmUgaWRlbnRpY2FsCgl9CgoJcmV0dXJuIGZhbHNlOwp9CgoKLy8gUmV0dXJucyB0cnVlIGlmIGFsbCBvZiBzdWJIaXQncyBub24tc3RhbmRhcmQgcHJvcGVydGllcyBhcmUgd2l0aGluIHN1cGVySGl0CmZ1bmN0aW9uIGlzSGl0UHJvcHNXaXRoaW4oc3ViSGl0LCBzdXBlckhpdCkgewoJZm9yICh2YXIgcHJvcE5hbWUgaW4gc3ViSGl0KSB7CgkJaWYgKCEvXihjb21wb25lbnR8bGVmdHxyaWdodHx0b3B8Ym90dG9tKSQvLnRlc3QocHJvcE5hbWUpKSB7CgkJCWlmIChzdWJIaXRbcHJvcE5hbWVdICE9PSBzdXBlckhpdFtwcm9wTmFtZV0pIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCX0KCXJldHVybiB0cnVlOwp9Cgo7OwoKLyogQ3JlYXRlcyBhIGNsb25lIG9mIGFuIGVsZW1lbnQgYW5kIGxldHMgaXQgdHJhY2sgdGhlIG1vdXNlIGFzIGl0IG1vdmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKdmFyIE1vdXNlRm9sbG93ZXIgPSBDbGFzcy5leHRlbmQoTGlzdGVuZXJNaXhpbiwgewoKCW9wdGlvbnM6IG51bGwsCgoJc291cmNlRWw6IG51bGwsIC8vIHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBjbG9uZWQgYW5kIG1hZGUgdG8gbG9vayBsaWtlIGl0IGlzIGRyYWdnaW5nCgllbDogbnVsbCwgLy8gdGhlIGNsb25lIG9mIGBzb3VyY2VFbGAgdGhhdCB3aWxsIHRyYWNrIHRoZSBtb3VzZQoJcGFyZW50RWw6IG51bGwsIC8vIHRoZSBlbGVtZW50IHRoYXQgYGVsYCAodGhlIGNsb25lKSB3aWxsIGJlIGF0dGFjaGVkIHRvCgoJLy8gdGhlIGluaXRpYWwgcG9zaXRpb24gb2YgZWwsIHJlbGF0aXZlIHRvIHRoZSBvZmZzZXQgcGFyZW50LiBtYWRlIHRvIG1hdGNoIHRoZSBpbml0aWFsIG9mZnNldCBvZiBzb3VyY2VFbAoJdG9wMDogbnVsbCwKCWxlZnQwOiBudWxsLAoKCS8vIHRoZSBhYnNvbHV0ZSBjb29yZGluYXRlcyBvZiB0aGUgaW5pdGlhdGluZyB0b3VjaC9tb3VzZSBhY3Rpb24KCXkwOiBudWxsLAoJeDA6IG51bGwsCgoJLy8gdGhlIG51bWJlciBvZiBwaXhlbHMgdGhlIG1vdXNlIGhhcyBtb3ZlZCBmcm9tIGl0cyBpbml0aWFsIHBvc2l0aW9uCgl0b3BEZWx0YTogbnVsbCwKCWxlZnREZWx0YTogbnVsbCwKCglpc0ZvbGxvd2luZzogZmFsc2UsCglpc0hpZGRlbjogZmFsc2UsCglpc0FuaW1hdGluZzogZmFsc2UsIC8vIGRvaW5nIHRoZSByZXZlcnQgYW5pbWF0aW9uPwoKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbihzb3VyY2VFbCwgb3B0aW9ucykgewoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCXRoaXMuc291cmNlRWwgPSBzb3VyY2VFbDsKCQl0aGlzLnBhcmVudEVsID0gb3B0aW9ucy5wYXJlbnRFbCA/ICQob3B0aW9ucy5wYXJlbnRFbCkgOiBzb3VyY2VFbC5wYXJlbnQoKTsgLy8gZGVmYXVsdCB0byBzb3VyY2VFbCdzIHBhcmVudAoJfSwKCgoJLy8gQ2F1c2VzIHRoZSBlbGVtZW50IHRvIHN0YXJ0IGZvbGxvd2luZyB0aGUgbW91c2UKCXN0YXJ0OiBmdW5jdGlvbihldikgewoJCWlmICghdGhpcy5pc0ZvbGxvd2luZykgewoJCQl0aGlzLmlzRm9sbG93aW5nID0gdHJ1ZTsKCgkJCXRoaXMueTAgPSBnZXRFdlkoZXYpOwoJCQl0aGlzLngwID0gZ2V0RXZYKGV2KTsKCQkJdGhpcy50b3BEZWx0YSA9IDA7CgkJCXRoaXMubGVmdERlbHRhID0gMDsKCgkJCWlmICghdGhpcy5pc0hpZGRlbikgewoJCQkJdGhpcy51cGRhdGVQb3NpdGlvbigpOwoJCQl9CgoJCQlpZiAoZ2V0RXZJc1RvdWNoKGV2KSkgewoJCQkJdGhpcy5saXN0ZW5UbygkKGRvY3VtZW50KSwgJ3RvdWNobW92ZScsIHRoaXMuaGFuZGxlTW92ZSk7CgkJCX0KCQkJZWxzZSB7CgkJCQl0aGlzLmxpc3RlblRvKCQoZG9jdW1lbnQpLCAnbW91c2Vtb3ZlJywgdGhpcy5oYW5kbGVNb3ZlKTsKCQkJfQoJCX0KCX0sCgoKCS8vIENhdXNlcyB0aGUgZWxlbWVudCB0byBzdG9wIGZvbGxvd2luZyB0aGUgbW91c2UuIElmIHNob3VsZFJldmVydCBpcyB0cnVlLCB3aWxsIGFuaW1hdGUgYmFjayB0byBvcmlnaW5hbCBwb3NpdGlvbi4KCS8vIGBjYWxsYmFja2AgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4gSWYgbm8gYW5pbWF0aW9uLCBpdCBpcyBpbnZva2VkIGltbWVkaWF0ZWx5LgoJc3RvcDogZnVuY3Rpb24oc2hvdWxkUmV2ZXJ0LCBjYWxsYmFjaykgewoJCXZhciBfdGhpcyA9IHRoaXM7CgkJdmFyIHJldmVydER1cmF0aW9uID0gdGhpcy5vcHRpb25zLnJldmVydER1cmF0aW9uOwoKCQlmdW5jdGlvbiBjb21wbGV0ZSgpIHsgLy8gbWlnaHQgYmUgY2FsbGVkIGJ5IC5hbmltYXRlKCksIHdoaWNoIG1pZ2h0IGNoYW5nZSBgdGhpc2AgY29udGV4dAoJCQlfdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlOwoJCQlfdGhpcy5yZW1vdmVFbGVtZW50KCk7CgoJCQlfdGhpcy50b3AwID0gX3RoaXMubGVmdDAgPSBudWxsOyAvLyByZXNldCBzdGF0ZSBmb3IgZnV0dXJlIHVwZGF0ZVBvc2l0aW9uIGNhbGxzCgoJCQlpZiAoY2FsbGJhY2spIHsKCQkJCWNhbGxiYWNrKCk7CgkJCX0KCQl9CgoJCWlmICh0aGlzLmlzRm9sbG93aW5nICYmICF0aGlzLmlzQW5pbWF0aW5nKSB7IC8vIGRpc2FsbG93IG1vcmUgdGhhbiBvbmUgc3RvcCBhbmltYXRpb24gYXQgYSB0aW1lCgkJCXRoaXMuaXNGb2xsb3dpbmcgPSBmYWxzZTsKCgkJCXRoaXMuc3RvcExpc3RlbmluZ1RvKCQoZG9jdW1lbnQpKTsKCgkJCWlmIChzaG91bGRSZXZlcnQgJiYgcmV2ZXJ0RHVyYXRpb24gJiYgIXRoaXMuaXNIaWRkZW4pIHsgLy8gZG8gYSByZXZlcnQgYW5pbWF0aW9uPwoJCQkJdGhpcy5pc0FuaW1hdGluZyA9IHRydWU7CgkJCQl0aGlzLmVsLmFuaW1hdGUoewoJCQkJCXRvcDogdGhpcy50b3AwLAoJCQkJCWxlZnQ6IHRoaXMubGVmdDAKCQkJCX0sIHsKCQkJCQlkdXJhdGlvbjogcmV2ZXJ0RHVyYXRpb24sCgkJCQkJY29tcGxldGU6IGNvbXBsZXRlCgkJCQl9KTsKCQkJfQoJCQllbHNlIHsKCQkJCWNvbXBsZXRlKCk7CgkJCX0KCQl9Cgl9LAoKCgkvLyBHZXRzIHRoZSB0cmFja2luZyBlbGVtZW50LiBDcmVhdGUgaXQgaWYgbmVjZXNzYXJ5CglnZXRFbDogZnVuY3Rpb24oKSB7CgkJdmFyIGVsID0gdGhpcy5lbDsKCgkJaWYgKCFlbCkgewoJCQllbCA9IHRoaXMuZWwgPSB0aGlzLnNvdXJjZUVsLmNsb25lKCkKCQkJCS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuYWRkaXRpb25hbENsYXNzIHx8ICcnKQoJCQkJLmNzcyh7CgkJCQkJcG9zaXRpb246ICdhYnNvbHV0ZScsCgkJCQkJdmlzaWJpbGl0eTogJycsIC8vIGluIGNhc2Ugb3JpZ2luYWwgZWxlbWVudCB3YXMgaGlkZGVuIChjb21tb25seSB0aHJvdWdoIGhpZGVFdmVudHMoKSkKCQkJCQlkaXNwbGF5OiB0aGlzLmlzSGlkZGVuID8gJ25vbmUnIDogJycsIC8vIGZvciB3aGVuIGluaXRpYWxseSBoaWRkZW4KCQkJCQltYXJnaW46IDAsCgkJCQkJcmlnaHQ6ICdhdXRvJywgLy8gZXJhc2UgYW5kIHNldCB3aWR0aCBpbnN0ZWFkCgkJCQkJYm90dG9tOiAnYXV0bycsIC8vIGVyYXNlIGFuZCBzZXQgaGVpZ2h0IGluc3RlYWQKCQkJCQl3aWR0aDogdGhpcy5zb3VyY2VFbC53aWR0aCgpLCAvLyBleHBsaWNpdCBoZWlnaHQgaW4gY2FzZSB0aGVyZSB3YXMgYSAncmlnaHQnIHZhbHVlCgkJCQkJaGVpZ2h0OiB0aGlzLnNvdXJjZUVsLmhlaWdodCgpLCAvLyBleHBsaWNpdCB3aWR0aCBpbiBjYXNlIHRoZXJlIHdhcyBhICdib3R0b20nIHZhbHVlCgkJCQkJb3BhY2l0eTogdGhpcy5vcHRpb25zLm9wYWNpdHkgfHwgJycsCgkJCQkJekluZGV4OiB0aGlzLm9wdGlvbnMuekluZGV4CgkJCQl9KTsKCgkJCS8vIHdlIGRvbid0IHdhbnQgbG9uZyB0YXBzIG9yIGFueSBtb3VzZSBpbnRlcmFjdGlvbiBjYXVzaW5nIHNlbGVjdGlvbi9tZW51cy4KCQkJLy8gd291bGQgdXNlIHByZXZlbnRTZWxlY3Rpb24oKSwgYnV0IHRoYXQgcHJldmVudHMgc2VsZWN0c3RhcnQsIGNhdXNpbmcgcHJvYmxlbXMuCgkJCWVsLmFkZENsYXNzKCdmYy11bnNlbGVjdGFibGUnKTsKCgkJCWVsLmFwcGVuZFRvKHRoaXMucGFyZW50RWwpOwoJCX0KCgkJcmV0dXJuIGVsOwoJfSwKCgoJLy8gUmVtb3ZlcyB0aGUgdHJhY2tpbmcgZWxlbWVudCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQKCXJlbW92ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmVsKSB7CgkJCXRoaXMuZWwucmVtb3ZlKCk7CgkJCXRoaXMuZWwgPSBudWxsOwoJCX0KCX0sCgoKCS8vIFVwZGF0ZSB0aGUgQ1NTIHBvc2l0aW9uIG9mIHRoZSB0cmFja2luZyBlbGVtZW50Cgl1cGRhdGVQb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIHNvdXJjZU9mZnNldDsKCQl2YXIgb3JpZ2luOwoKCQl0aGlzLmdldEVsKCk7IC8vIGVuc3VyZSB0aGlzLmVsCgoJCS8vIG1ha2Ugc3VyZSBvcmlnaW4gaW5mbyB3YXMgY29tcHV0ZWQKCQlpZiAodGhpcy50b3AwID09PSBudWxsKSB7CgkJCXNvdXJjZU9mZnNldCA9IHRoaXMuc291cmNlRWwub2Zmc2V0KCk7CgkJCW9yaWdpbiA9IHRoaXMuZWwub2Zmc2V0UGFyZW50KCkub2Zmc2V0KCk7CgkJCXRoaXMudG9wMCA9IHNvdXJjZU9mZnNldC50b3AgLSBvcmlnaW4udG9wOwoJCQl0aGlzLmxlZnQwID0gc291cmNlT2Zmc2V0LmxlZnQgLSBvcmlnaW4ubGVmdDsKCQl9CgoJCXRoaXMuZWwuY3NzKHsKCQkJdG9wOiB0aGlzLnRvcDAgKyB0aGlzLnRvcERlbHRhLAoJCQlsZWZ0OiB0aGlzLmxlZnQwICsgdGhpcy5sZWZ0RGVsdGEKCQl9KTsKCX0sCgoKCS8vIEdldHMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgbW92ZXMgdGhlIG1vdXNlCgloYW5kbGVNb3ZlOiBmdW5jdGlvbihldikgewoJCXRoaXMudG9wRGVsdGEgPSBnZXRFdlkoZXYpIC0gdGhpcy55MDsKCQl0aGlzLmxlZnREZWx0YSA9IGdldEV2WChldikgLSB0aGlzLngwOwoKCQlpZiAoIXRoaXMuaXNIaWRkZW4pIHsKCQkJdGhpcy51cGRhdGVQb3NpdGlvbigpOwoJCX0KCX0sCgoKCS8vIFRlbXBvcmFyaWx5IG1ha2VzIHRoZSB0cmFja2luZyBlbGVtZW50IGludmlzaWJsZS4gQ2FuIGJlIGNhbGxlZCBiZWZvcmUgZm9sbG93aW5nIHN0YXJ0cwoJaGlkZTogZnVuY3Rpb24oKSB7CgkJaWYgKCF0aGlzLmlzSGlkZGVuKSB7CgkJCXRoaXMuaXNIaWRkZW4gPSB0cnVlOwoJCQlpZiAodGhpcy5lbCkgewoJCQkJdGhpcy5lbC5oaWRlKCk7CgkJCX0KCQl9Cgl9LAoKCgkvLyBTaG93IHRoZSB0cmFja2luZyBlbGVtZW50IGFmdGVyIGl0IGhhcyBiZWVuIHRlbXBvcmFyaWx5IGhpZGRlbgoJc2hvdzogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaXNIaWRkZW4pIHsKCQkJdGhpcy5pc0hpZGRlbiA9IGZhbHNlOwoJCQl0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7CgkJCXRoaXMuZ2V0RWwoKS5zaG93KCk7CgkJfQoJfQoKfSk7Cgo7OwoKLyogQW4gYWJzdHJhY3QgY2xhc3MgY29tcHJpc2VkIG9mIGEgImdyaWQiIG9mIGFyZWFzIHRoYXQgZWFjaCByZXByZXNlbnQgYSBzcGVjaWZpYyBkYXRldGltZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCnZhciBHcmlkID0gRkMuR3JpZCA9IENsYXNzLmV4dGVuZChMaXN0ZW5lck1peGluLCBNb3VzZUlnbm9yZXJNaXhpbiwgewoKCS8vIHNlbGYtY29uZmlnLCBvdmVycmlkYWJsZSBieSBzdWJjbGFzc2VzCgloYXNEYXlJbnRlcmFjdGlvbnM6IHRydWUsIC8vIGNhbiB1c2VyIGNsaWNrL3NlbGVjdCByYW5nZXMgb2YgdGltZT8KCgl2aWV3OiBudWxsLCAvLyBhIFZpZXcgb2JqZWN0Cglpc1JUTDogbnVsbCwgLy8gc2hvcnRjdXQgdG8gdGhlIHZpZXcncyBpc1JUTCBvcHRpb24KCglzdGFydDogbnVsbCwKCWVuZDogbnVsbCwKCgllbDogbnVsbCwgLy8gdGhlIGNvbnRhaW5pbmcgZWxlbWVudAoJZWxzQnlGaWxsOiBudWxsLCAvLyBhIGhhc2ggb2YgalF1ZXJ5IGVsZW1lbnQgc2V0cyB1c2VkIGZvciByZW5kZXJpbmcgZWFjaCBmaWxsLiBLZXllZCBieSBmaWxsIG5hbWUuCgoJLy8gZGVyaXZlZCBmcm9tIG9wdGlvbnMKCWV2ZW50VGltZUZvcm1hdDogbnVsbCwKCWRpc3BsYXlFdmVudFRpbWU6IG51bGwsCglkaXNwbGF5RXZlbnRFbmQ6IG51bGwsCgoJbWluUmVzaXplRHVyYXRpb246IG51bGwsIC8vIFRPRE86IGhhY2suIHNldCBieSBzdWJjbGFzc2VzLiBtaW51bXVtIGV2ZW50IHJlc2l6ZSBkdXJhdGlvbgoKCS8vIGlmIGRlZmluZWQsIGhvbGRzIHRoZSB1bml0IGlkZW50aWZpZWQgKGV4OiAieWVhciIgb3IgIm1vbnRoIikgdGhhdCBkZXRlcm1pbmVzIHRoZSBsZXZlbCBvZiBncmFudWxhcml0eQoJLy8gb2YgdGhlIGRhdGUgYXJlYXMuIGlmIG5vdCBkZWZpbmVkLCBhc3N1bWVzIHRvIGJlIGRheSBhbmQgdGltZSBncmFudWxhcml0eS4KCS8vIFRPRE86IHBvcnQgaXNUaW1lU2NhbGUgaW50byBzYW1lIHN5c3RlbT8KCWxhcmdlVW5pdDogbnVsbCwKCglkYXlEcmFnTGlzdGVuZXI6IG51bGwsCglzZWdEcmFnTGlzdGVuZXI6IG51bGwsCglzZWdSZXNpemVMaXN0ZW5lcjogbnVsbCwKCWV4dGVybmFsRHJhZ0xpc3RlbmVyOiBudWxsLAoKCgljb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlldykgewoJCXRoaXMudmlldyA9IHZpZXc7CgkJdGhpcy5pc1JUTCA9IHZpZXcub3B0KCdpc1JUTCcpOwoJCXRoaXMuZWxzQnlGaWxsID0ge307CgoJCXRoaXMuZGF5RHJhZ0xpc3RlbmVyID0gdGhpcy5idWlsZERheURyYWdMaXN0ZW5lcigpOwoJCXRoaXMuaW5pdE1vdXNlSWdub3JpbmcoKTsKCX0sCgoKCS8qIE9wdGlvbnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEdlbmVyYXRlcyB0aGUgZm9ybWF0IHN0cmluZyB1c2VkIGZvciBldmVudCB0aW1lIHRleHQsIGlmIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgYnkgJ3RpbWVGb3JtYXQnCgljb21wdXRlRXZlbnRUaW1lRm9ybWF0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy52aWV3Lm9wdCgnc21hbGxUaW1lRm9ybWF0Jyk7Cgl9LAoKCgkvLyBEZXRlcm1pbmVzIHdoZXRoZXIgZXZlbnRzIHNob3VsZCBoYXZlIHRoZWlyIGVuZCB0aW1lcyBkaXNwbGF5ZWQsIGlmIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgYnkgJ2Rpc3BsYXlFdmVudFRpbWUnLgoJLy8gT25seSBhcHBsaWVzIHRvIG5vbi1hbGwtZGF5IGV2ZW50cy4KCWNvbXB1dGVEaXNwbGF5RXZlbnRUaW1lOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0sCgoKCS8vIERldGVybWluZXMgd2hldGhlciBldmVudHMgc2hvdWxkIGhhdmUgdGhlaXIgZW5kIHRpbWVzIGRpc3BsYXllZCwgaWYgbm90IGV4cGxpY2l0bHkgZGVmaW5lZCBieSAnZGlzcGxheUV2ZW50RW5kJwoJY29tcHV0ZURpc3BsYXlFdmVudEVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRydWU7Cgl9LAoKCgkvKiBEYXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gVGVsbHMgdGhlIGdyaWQgYWJvdXQgd2hhdCBwZXJpb2Qgb2YgdGltZSB0byBkaXNwbGF5LgoJLy8gQW55IGRhdGUtcmVsYXRlZCBpbnRlcm5hbCBkYXRhIHNob3VsZCBiZSBnZW5lcmF0ZWQuCglzZXRSYW5nZTogZnVuY3Rpb24ocmFuZ2UpIHsKCQl0aGlzLnN0YXJ0ID0gcmFuZ2Uuc3RhcnQuY2xvbmUoKTsKCQl0aGlzLmVuZCA9IHJhbmdlLmVuZC5jbG9uZSgpOwoKCQl0aGlzLnJhbmdlVXBkYXRlZCgpOwoJCXRoaXMucHJvY2Vzc1JhbmdlT3B0aW9ucygpOwoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gaW50ZXJuYWwgdmFyaWFibGVzIHRoYXQgcmVseSBvbiB0aGUgcmFuZ2Ugc2hvdWxkIGJlIHVwZGF0ZWQKCXJhbmdlVXBkYXRlZDogZnVuY3Rpb24oKSB7Cgl9LAoKCgkvLyBVcGRhdGVzIHZhbHVlcyB0aGF0IHJlbHkgb24gb3B0aW9ucyBhbmQgYWxzbyByZWxhdGUgdG8gcmFuZ2UKCXByb2Nlc3NSYW5nZU9wdGlvbnM6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBkaXNwbGF5RXZlbnRUaW1lOwoJCXZhciBkaXNwbGF5RXZlbnRFbmQ7CgoJCXRoaXMuZXZlbnRUaW1lRm9ybWF0ID0KCQkJdmlldy5vcHQoJ2V2ZW50VGltZUZvcm1hdCcpIHx8CgkJCXZpZXcub3B0KCd0aW1lRm9ybWF0JykgfHwgLy8gZGVwcmVjYXRlZAoJCQl0aGlzLmNvbXB1dGVFdmVudFRpbWVGb3JtYXQoKTsKCgkJZGlzcGxheUV2ZW50VGltZSA9IHZpZXcub3B0KCdkaXNwbGF5RXZlbnRUaW1lJyk7CgkJaWYgKGRpc3BsYXlFdmVudFRpbWUgPT0gbnVsbCkgewoJCQlkaXNwbGF5RXZlbnRUaW1lID0gdGhpcy5jb21wdXRlRGlzcGxheUV2ZW50VGltZSgpOyAvLyBtaWdodCBiZSBiYXNlZCBvZmYgb2YgcmFuZ2UKCQl9CgoJCWRpc3BsYXlFdmVudEVuZCA9IHZpZXcub3B0KCdkaXNwbGF5RXZlbnRFbmQnKTsKCQlpZiAoZGlzcGxheUV2ZW50RW5kID09IG51bGwpIHsKCQkJZGlzcGxheUV2ZW50RW5kID0gdGhpcy5jb21wdXRlRGlzcGxheUV2ZW50RW5kKCk7IC8vIG1pZ2h0IGJlIGJhc2VkIG9mZiBvZiByYW5nZQoJCX0KCgkJdGhpcy5kaXNwbGF5RXZlbnRUaW1lID0gZGlzcGxheUV2ZW50VGltZTsKCQl0aGlzLmRpc3BsYXlFdmVudEVuZCA9IGRpc3BsYXlFdmVudEVuZDsKCX0sCgoKCS8vIENvbnZlcnRzIGEgc3BhbiAoaGFzIHVuem9uZWQgc3RhcnQvZW5kIGFuZCBhbnkgb3RoZXIgZ3JpZC1zcGVjaWZpYyBsb2NhdGlvbiBpbmZvcm1hdGlvbikKCS8vIGludG8gYW4gYXJyYXkgb2Ygc2VnbWVudHMgKHBpZWNlcyBvZiBldmVudHMgd2hvc2UgZm9ybWF0IGlzIGRlY2lkZWQgYnkgdGhlIGdyaWQpLgoJc3BhblRvU2VnczogZnVuY3Rpb24oc3BhbikgewoJCS8vIHN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQKCX0sCgoKCS8vIERpZmZzIHRoZSB0d28gZGF0ZXMsIHJldHVybmluZyBhIGR1cmF0aW9uLCBiYXNlZCBvbiBncmFudWxhcml0eSBvZiB0aGUgZ3JpZAoJLy8gVE9ETzogcG9ydCBpc1RpbWVTY2FsZSBpbnRvIHRoaXMgc3lzdGVtPwoJZGlmZkRhdGVzOiBmdW5jdGlvbihhLCBiKSB7CgkJaWYgKHRoaXMubGFyZ2VVbml0KSB7CgkJCXJldHVybiBkaWZmQnlVbml0KGEsIGIsIHRoaXMubGFyZ2VVbml0KTsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiBkaWZmRGF5VGltZShhLCBiKTsKCQl9Cgl9LAoKCgkvKiBIaXQgQXJlYQoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQ2FsbGVkIGJlZm9yZSBvbmUgb3IgbW9yZSBxdWVyeUhpdCBjYWxscyBtaWdodCBoYXBwZW4uIFNob3VsZCBwcmVwYXJlIGFueSBjYWNoZWQgY29vcmRpbmF0ZXMgZm9yIHF1ZXJ5SGl0CglwcmVwYXJlSGl0czogZnVuY3Rpb24oKSB7Cgl9LAoKCgkvLyBDYWxsZWQgd2hlbiBxdWVyeUhpdCBjYWxscyBoYXZlIHN1YnNpZGVkLiBHb29kIHBsYWNlIHRvIGNsZWFyIGFueSBjb29yZGluYXRlIGNhY2hlcy4KCXJlbGVhc2VIaXRzOiBmdW5jdGlvbigpIHsKCX0sCgoKCS8vIEdpdmVuIGNvb3JkaW5hdGVzIGZyb20gdGhlIHRvcGxlZnQgb2YgdGhlIGRvY3VtZW50LCByZXR1cm4gZGF0YSBhYm91dCB0aGUgZGF0ZS1yZWxhdGVkIGFyZWEgdW5kZXJuZWF0aC4KCS8vIENhbiByZXR1cm4gYW4gb2JqZWN0IHdpdGggYXJiaXRyYXJ5IHByb3BlcnRpZXMgKGFsdGhvdWdoIHRvcC9yaWdodC9sZWZ0L2JvdHRvbSBhcmUgZW5jb3VyYWdlZCkuCgkvLyBNdXN0IGhhdmUgYSBgZ3JpZGAgcHJvcGVydHksIGEgcmVmZXJlbmNlIHRvIHRoaXMgY3VycmVudCBncmlkLiBUT0RPOiBhdm9pZCB0aGlzCgkvLyBUaGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IGdldEhpdFNwYW4gYW5kIGdldEhpdEVsLgoJcXVlcnlIaXQ6IGZ1bmN0aW9uKGxlZnRPZmZzZXQsIHRvcE9mZnNldCkgewoJfSwKCgoJLy8gR2l2ZW4gcG9zaXRpb24tbGV2ZWwgaW5mb3JtYXRpb24gYWJvdXQgYSBkYXRlLXJlbGF0ZWQgYXJlYSB3aXRoaW4gdGhlIGdyaWQsCgkvLyBzaG91bGQgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGF0IGxlYXN0IGEgc3RhcnQvZW5kIGRhdGUuIENhbiBwcm92aWRlIG90aGVyIGluZm9ybWF0aW9uIGFzIHdlbGwuCglnZXRIaXRTcGFuOiBmdW5jdGlvbihoaXQpIHsKCX0sCgoKCS8vIEdpdmVuIHBvc2l0aW9uLWxldmVsIGluZm9ybWF0aW9uIGFib3V0IGEgZGF0ZS1yZWxhdGVkIGFyZWEgd2l0aGluIHRoZSBncmlkLAoJLy8gc2hvdWxkIHJldHVybiBhIGpRdWVyeSBlbGVtZW50IHRoYXQgYmVzdCByZXByZXNlbnRzIGl0LiBwYXNzZWQgdG8gZGF5Q2xpY2sgY2FsbGJhY2suCglnZXRIaXRFbDogZnVuY3Rpb24oaGl0KSB7Cgl9LAoKCgkvKiBSZW5kZXJpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFNldHMgdGhlIGNvbnRhaW5lciBlbGVtZW50IHRoYXQgdGhlIGdyaWQgc2hvdWxkIHJlbmRlciBpbnNpZGUgb2YuCgkvLyBEb2VzIG90aGVyIERPTS1yZWxhdGVkIGluaXRpYWxpemF0aW9ucy4KCXNldEVsZW1lbnQ6IGZ1bmN0aW9uKGVsKSB7CgkJdGhpcy5lbCA9IGVsOwoKCQlpZiAodGhpcy5oYXNEYXlJbnRlcmFjdGlvbnMpIHsKCQkJcHJldmVudFNlbGVjdGlvbihlbCk7CgoJCQl0aGlzLmJpbmREYXlIYW5kbGVyKCd0b3VjaHN0YXJ0JywgdGhpcy5kYXlUb3VjaFN0YXJ0KTsKCQkJdGhpcy5iaW5kRGF5SGFuZGxlcignbW91c2Vkb3duJywgdGhpcy5kYXlNb3VzZWRvd24pOwoJCX0KCgkJLy8gYXR0YWNoIGV2ZW50LWVsZW1lbnQtcmVsYXRlZCBoYW5kbGVycy4gaW4gR3JpZC5ldmVudHMKCQkvLyBzYW1lIGdhcmJhZ2UgY29sbGVjdGlvbiBub3RlIGFzIGFib3ZlLgoJCXRoaXMuYmluZFNlZ0hhbmRsZXJzKCk7CgoJCXRoaXMuYmluZEdsb2JhbEhhbmRsZXJzKCk7Cgl9LAoKCgliaW5kRGF5SGFuZGxlcjogZnVuY3Rpb24obmFtZSwgaGFuZGxlcikgewoJCXZhciBfdGhpcyA9IHRoaXM7CgoJCS8vIGF0dGFjaCBhIGhhbmRsZXIgdG8gdGhlIGdyaWQncyByb290IGVsZW1lbnQuCgkJLy8galF1ZXJ5IHdpbGwgdGFrZSBjYXJlIG9mIHVucmVnaXN0ZXJpbmcgdGhlbSB3aGVuIHJlbW92ZUVsZW1lbnQgZ2V0cyBjYWxsZWQuCgkJdGhpcy5lbC5vbihuYW1lLCBmdW5jdGlvbihldikgewoJCQlpZiAoCgkJCQkhJChldi50YXJnZXQpLmlzKAoJCQkJCV90aGlzLnNlZ1NlbGVjdG9yICsgJywnICsgLy8gZGlyZWN0bHkgb24gYW4gZXZlbnQgZWxlbWVudAoJCQkJCV90aGlzLnNlZ1NlbGVjdG9yICsgJyAqLCcgKyAvLyB3aXRoaW4gYW4gZXZlbnQgZWxlbWVudAoJCQkJCScuZmMtbW9yZSwnICsgLy8gYSAibW9yZS4uIiBsaW5rCgkJCQkJJ2FbZGF0YS1nb3RvXScgLy8gYSBjbGlja2FibGUgbmF2IGxpbmsKCQkJCSkKCQkJKSB7CgkJCQlyZXR1cm4gaGFuZGxlci5jYWxsKF90aGlzLCBldik7CgkJCX0KCQl9KTsKCX0sCgoKCS8vIFJlbW92ZXMgdGhlIGdyaWQncyBjb250YWluZXIgZWxlbWVudCBmcm9tIHRoZSBET00uIFVuZG9lcyBhbnkgb3RoZXIgRE9NLXJlbGF0ZWQgYXR0YWNobWVudHMuCgkvLyBET0VTIE5PVCByZW1vdmUgYW55IGNvbnRlbnQgYmVmb3JlaGFuZCAoZG9lc24ndCBjbGVhciBldmVudHMgb3IgY2FsbCB1bnJlbmRlckRhdGVzKSwgdW5saWtlIFZpZXcKCXJlbW92ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5iaW5kR2xvYmFsSGFuZGxlcnMoKTsKCQl0aGlzLmNsZWFyRHJhZ0xpc3RlbmVycygpOwoKCQl0aGlzLmVsLnJlbW92ZSgpOwoKCQkvLyBOT1RFOiB3ZSBkb24ndCBudWxsLW91dCB0aGlzLmVsIGZvciB0aGUgc2FtZSByZWFzb25zIHdlIGRvbid0IGRvIGl0IHdpdGhpbiBWaWV3OjpyZW1vdmVFbGVtZW50Cgl9LAoKCgkvLyBSZW5kZXJzIHRoZSBiYXNpYyBzdHJ1Y3R1cmUgb2YgZ3JpZCB2aWV3IGJlZm9yZSBhbnkgY29udGVudCBpcyByZW5kZXJlZAoJcmVuZGVyU2tlbGV0b246IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudAoJfSwKCgoJLy8gUmVuZGVycyB0aGUgZ3JpZCdzIGRhdGUtcmVsYXRlZCBjb250ZW50IChsaWtlIGFyZWFzIHRoYXQgcmVwcmVzZW50IGRheXMvdGltZXMpLgoJLy8gQXNzdW1lcyBzZXRSYW5nZSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBhbmQgdGhlIHNrZWxldG9uIGhhcyBhbHJlYWR5IGJlZW4gcmVuZGVyZWQuCglyZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgdGhlIGdyaWQncyBkYXRlLXJlbGF0ZWQgY29udGVudAoJdW5yZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvKiBIYW5kbGVycwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQmluZHMgRE9NIGhhbmRsZXJzIHRvIGVsZW1lbnRzIHRoYXQgcmVzaWRlIG91dHNpZGUgdGhlIGdyaWQsIHN1Y2ggYXMgdGhlIGRvY3VtZW50CgliaW5kR2xvYmFsSGFuZGxlcnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMubGlzdGVuVG8oJChkb2N1bWVudCksIHsKCQkJZHJhZ3N0YXJ0OiB0aGlzLmV4dGVybmFsRHJhZ1N0YXJ0LCAvLyBqcXVpCgkJCXNvcnRzdGFydDogdGhpcy5leHRlcm5hbERyYWdTdGFydCAvLyBqcXVpCgkJfSk7Cgl9LAoKCgkvLyBVbmJpbmRzIERPTSBoYW5kbGVycyBmcm9tIGVsZW1lbnRzIHRoYXQgcmVzaWRlIG91dHNpZGUgdGhlIGdyaWQKCXVuYmluZEdsb2JhbEhhbmRsZXJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnN0b3BMaXN0ZW5pbmdUbygkKGRvY3VtZW50KSk7Cgl9LAoKCgkvLyBQcm9jZXNzIGEgbW91c2Vkb3duIG9uIGFuIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgZGF5LiBGb3IgZGF5IGNsaWNraW5nIGFuZCBzZWxlY3RpbmcuCglkYXlNb3VzZWRvd246IGZ1bmN0aW9uKGV2KSB7CgkJaWYgKCF0aGlzLmlzSWdub3JpbmdNb3VzZSkgewoJCQl0aGlzLmRheURyYWdMaXN0ZW5lci5zdGFydEludGVyYWN0aW9uKGV2LCB7CgkJCQkvL2Rpc3RhbmNlOiA1LCAvLyBuZWVkcyBtb3JlIHdvcmsgaWYgd2Ugd2FudCBkYXlDbGljayB0byBmaXJlIGNvcnJlY3RseQoJCQl9KTsKCQl9Cgl9LAoKCglkYXlUb3VjaFN0YXJ0OiBmdW5jdGlvbihldikgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoKCQkvLyBIQUNLIHRvIHByZXZlbnQgYSB1c2VyJ3MgY2xpY2thd2F5IGZvciB1bnNlbGVjdGluZyBhIHJhbmdlIG9yIGFuIGV2ZW50CgkJLy8gZnJvbSBjYXVzaW5nIGEgZGF5Q2xpY2suCgkJaWYgKHZpZXcuaXNTZWxlY3RlZCB8fCB2aWV3LnNlbGVjdGVkRXZlbnQpIHsKCQkJdGhpcy50ZW1wSWdub3JlTW91c2UoKTsKCQl9CgoJCXRoaXMuZGF5RHJhZ0xpc3RlbmVyLnN0YXJ0SW50ZXJhY3Rpb24oZXYsIHsKCQkJZGVsYXk6IHRoaXMudmlldy5vcHQoJ2xvbmdQcmVzc0RlbGF5JykKCQl9KTsKCX0sCgoKCS8vIENyZWF0ZXMgYSBsaXN0ZW5lciB0aGF0IHRyYWNrcyB0aGUgdXNlcidzIGRyYWcgYWNyb3NzIGRheSBlbGVtZW50cy4KCS8vIEZvciBkYXkgY2xpY2tpbmcgYW5kIHNlbGVjdGluZy4KCWJ1aWxkRGF5RHJhZ0xpc3RlbmVyOiBmdW5jdGlvbigpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBpc1NlbGVjdGFibGUgPSB2aWV3Lm9wdCgnc2VsZWN0YWJsZScpOwoJCXZhciBkYXlDbGlja0hpdDsgLy8gbnVsbCBpZiBpbnZhbGlkIGRheUNsaWNrCgkJdmFyIHNlbGVjdGlvblNwYW47IC8vIG51bGwgaWYgaW52YWxpZCBzZWxlY3Rpb24KCgkJLy8gdGhpcyBsaXN0ZW5lciB0cmFja3MgYSBtb3VzZWRvd24gb24gYSBkYXkgZWxlbWVudCwgYW5kIGEgc3Vic2VxdWVudCBkcmFnLgoJCS8vIGlmIHRoZSBkcmFnIGVuZHMgb24gdGhlIHNhbWUgZGF5LCBpdCBpcyBhICdkYXlDbGljaycuCgkJLy8gaWYgJ3NlbGVjdGFibGUnIGlzIGVuYWJsZWQsIHRoaXMgbGlzdGVuZXIgYWxzbyBkZXRlY3RzIHNlbGVjdGlvbnMuCgkJdmFyIGRyYWdMaXN0ZW5lciA9IG5ldyBIaXREcmFnTGlzdGVuZXIodGhpcywgewoJCQlzY3JvbGw6IHZpZXcub3B0KCdkcmFnU2Nyb2xsJyksCgkJCWludGVyYWN0aW9uU3RhcnQ6IGZ1bmN0aW9uKCkgewoJCQkJZGF5Q2xpY2tIaXQgPSBkcmFnTGlzdGVuZXIub3JpZ0hpdDsgLy8gZm9yIGRheUNsaWNrLCB3aGVyZSBubyBkcmFnZ2luZyBoYXBwZW5zCgkJCQlzZWxlY3Rpb25TcGFuID0gbnVsbDsKCQkJfSwKCQkJZHJhZ1N0YXJ0OiBmdW5jdGlvbigpIHsKCQkJCXZpZXcudW5zZWxlY3QoKTsgLy8gc2luY2Ugd2UgY291bGQgYmUgcmVuZGVyaW5nIGEgbmV3IHNlbGVjdGlvbiwgd2Ugd2FudCB0byBjbGVhciBhbnkgb2xkIG9uZQoJCQl9LAoJCQloaXRPdmVyOiBmdW5jdGlvbihoaXQsIGlzT3JpZywgb3JpZ0hpdCkgewoJCQkJaWYgKG9yaWdIaXQpIHsgLy8gY2xpY2sgbmVlZHMgdG8gaGF2ZSBzdGFydGVkIG9uIGEgaGl0CgoJCQkJCS8vIGlmIHVzZXIgZHJhZ2dlZCB0byBhbm90aGVyIGNlbGwgYXQgYW55IHBvaW50LCBpdCBjYW4gbm8gbG9uZ2VyIGJlIGEgZGF5Q2xpY2sKCQkJCQlpZiAoIWlzT3JpZykgewoJCQkJCQlkYXlDbGlja0hpdCA9IG51bGw7CgkJCQkJfQoKCQkJCQlpZiAoaXNTZWxlY3RhYmxlKSB7CgkJCQkJCXNlbGVjdGlvblNwYW4gPSBfdGhpcy5jb21wdXRlU2VsZWN0aW9uKAoJCQkJCQkJX3RoaXMuZ2V0SGl0U3BhbihvcmlnSGl0KSwKCQkJCQkJCV90aGlzLmdldEhpdFNwYW4oaGl0KQoJCQkJCQkpOwoJCQkJCQlpZiAoc2VsZWN0aW9uU3BhbikgewoJCQkJCQkJX3RoaXMucmVuZGVyU2VsZWN0aW9uKHNlbGVjdGlvblNwYW4pOwoJCQkJCQl9CgkJCQkJCWVsc2UgaWYgKHNlbGVjdGlvblNwYW4gPT09IGZhbHNlKSB7CgkJCQkJCQlkaXNhYmxlQ3Vyc29yKCk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0sCgkJCWhpdE91dDogZnVuY3Rpb24oKSB7IC8vIGNhbGxlZCBiZWZvcmUgbW91c2UgbW92ZXMgdG8gYSBkaWZmZXJlbnQgaGl0IE9SIG1vdmVkIG91dCBvZiBhbGwgaGl0cwoJCQkJZGF5Q2xpY2tIaXQgPSBudWxsOwoJCQkJc2VsZWN0aW9uU3BhbiA9IG51bGw7CgkJCQlfdGhpcy51bnJlbmRlclNlbGVjdGlvbigpOwoJCQl9LAoJCQloaXREb25lOiBmdW5jdGlvbigpIHsgLy8gY2FsbGVkIGFmdGVyIGEgaGl0T3V0IE9SIGJlZm9yZSBhIGRyYWdFbmQKCQkJCWVuYWJsZUN1cnNvcigpOwoJCQl9LAoJCQlpbnRlcmFjdGlvbkVuZDogZnVuY3Rpb24oZXYsIGlzQ2FuY2VsbGVkKSB7CgkJCQlpZiAoIWlzQ2FuY2VsbGVkKSB7CgkJCQkJaWYgKAoJCQkJCQlkYXlDbGlja0hpdCAmJgoJCQkJCQkhX3RoaXMuaXNJZ25vcmluZ01vdXNlIC8vIHNlZSBoYWNrIGluIGRheVRvdWNoU3RhcnQKCQkJCQkpIHsKCQkJCQkJdmlldy50cmlnZ2VyRGF5Q2xpY2soCgkJCQkJCQlfdGhpcy5nZXRIaXRTcGFuKGRheUNsaWNrSGl0KSwKCQkJCQkJCV90aGlzLmdldEhpdEVsKGRheUNsaWNrSGl0KSwKCQkJCQkJCWV2CgkJCQkJCSk7CgkJCQkJfQoJCQkJCWlmIChzZWxlY3Rpb25TcGFuKSB7CgkJCQkJCS8vIHRoZSBzZWxlY3Rpb24gd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiByZW5kZXJlZC4ganVzdCByZXBvcnQgaXQKCQkJCQkJdmlldy5yZXBvcnRTZWxlY3Rpb24oc2VsZWN0aW9uU3BhbiwgZXYpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0pOwoKCQlyZXR1cm4gZHJhZ0xpc3RlbmVyOwoJfSwKCgoJLy8gS2lsbHMgYWxsIGluLXByb2dyZXNzIGRyYWdnaW5nLgoJLy8gVXNlZnVsIGZvciB3aGVuIHB1YmxpYyBBUEkgbWV0aG9kcyB0aGF0IHJlc3VsdCBpbiByZS1yZW5kZXJpbmcgYXJlIGludm9rZWQgZHVyaW5nIGEgZHJhZy4KCS8vIEFsc28gdXNlZnVsIGZvciB3aGVuIHRvdWNoIGRldmljZXMgbWlzYmVoYXZlIGFuZCBkb24ndCBmaXJlIHRoZWlyIHRvdWNoZW5kLgoJY2xlYXJEcmFnTGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLmRheURyYWdMaXN0ZW5lci5lbmRJbnRlcmFjdGlvbigpOwoKCQlpZiAodGhpcy5zZWdEcmFnTGlzdGVuZXIpIHsKCQkJdGhpcy5zZWdEcmFnTGlzdGVuZXIuZW5kSW50ZXJhY3Rpb24oKTsgLy8gd2lsbCBjbGVhciB0aGlzLnNlZ0RyYWdMaXN0ZW5lcgoJCX0KCQlpZiAodGhpcy5zZWdSZXNpemVMaXN0ZW5lcikgewoJCQl0aGlzLnNlZ1Jlc2l6ZUxpc3RlbmVyLmVuZEludGVyYWN0aW9uKCk7IC8vIHdpbGwgY2xlYXIgdGhpcy5zZWdSZXNpemVMaXN0ZW5lcgoJCX0KCQlpZiAodGhpcy5leHRlcm5hbERyYWdMaXN0ZW5lcikgewoJCQl0aGlzLmV4dGVybmFsRHJhZ0xpc3RlbmVyLmVuZEludGVyYWN0aW9uKCk7IC8vIHdpbGwgY2xlYXIgdGhpcy5leHRlcm5hbERyYWdMaXN0ZW5lcgoJCX0KCX0sCgoKCS8qIEV2ZW50IEhlbHBlcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCS8vIFRPRE86IHNob3VsZCBwcm9iYWJseSBtb3ZlIHRoaXMgdG8gR3JpZC5ldmVudHMsIGxpa2Ugd2UgZGlkIGV2ZW50IGRyYWdnaW5nIC8gcmVzaXppbmcKCgoJLy8gUmVuZGVycyBhIG1vY2sgZXZlbnQgYXQgdGhlIGdpdmVuIGV2ZW50IGxvY2F0aW9uLCB3aGljaCBjb250YWlucyB6b25lZCBzdGFydC9lbmQgcHJvcGVydGllcy4KCS8vIFJldHVybnMgYWxsIG1vY2sgZXZlbnQgZWxlbWVudHMuCglyZW5kZXJFdmVudExvY2F0aW9uSGVscGVyOiBmdW5jdGlvbihldmVudExvY2F0aW9uLCBzb3VyY2VTZWcpIHsKCQl2YXIgZmFrZUV2ZW50ID0gdGhpcy5mYWJyaWNhdGVIZWxwZXJFdmVudChldmVudExvY2F0aW9uLCBzb3VyY2VTZWcpOwoKCQlyZXR1cm4gdGhpcy5yZW5kZXJIZWxwZXIoZmFrZUV2ZW50LCBzb3VyY2VTZWcpOyAvLyBkbyB0aGUgYWN0dWFsIHJlbmRlcmluZwoJfSwKCgoJLy8gQnVpbGRzIGEgZmFrZSBldmVudCBnaXZlbiB6b25lZCBldmVudCBkYXRlIHByb3BlcnRpZXMgYW5kIGEgc2VnbWVudCBpcyBzaG91bGQgYmUgaW5zcGlyZWQgZnJvbS4KCS8vIFRoZSByYW5nZSdzIGVuZCBjYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSB0aGUgbW9jayBldmVudCB0aGF0IGlzIHJlbmRlcmVkIHdpbGwgaGF2ZSBhIG51bGwgZW5kIHRpbWUuCgkvLyBgc291cmNlU2VnYCBpcyB0aGUgaW50ZXJuYWwgc2VnbWVudCBvYmplY3QgaW52b2x2ZWQgaW4gdGhlIGRyYWcuIElmIG51bGwsIHNvbWV0aGluZyBleHRlcm5hbCBpcyBkcmFnZ2luZy4KCWZhYnJpY2F0ZUhlbHBlckV2ZW50OiBmdW5jdGlvbihldmVudExvY2F0aW9uLCBzb3VyY2VTZWcpIHsKCQl2YXIgZmFrZUV2ZW50ID0gc291cmNlU2VnID8gY3JlYXRlT2JqZWN0KHNvdXJjZVNlZy5ldmVudCkgOiB7fTsgLy8gbWFzayB0aGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0IGlmIHBvc3NpYmxlCgoJCWZha2VFdmVudC5zdGFydCA9IGV2ZW50TG9jYXRpb24uc3RhcnQuY2xvbmUoKTsKCQlmYWtlRXZlbnQuZW5kID0gZXZlbnRMb2NhdGlvbi5lbmQgPyBldmVudExvY2F0aW9uLmVuZC5jbG9uZSgpIDogbnVsbDsKCQlmYWtlRXZlbnQuYWxsRGF5ID0gbnVsbDsgLy8gZm9yY2UgaXQgdG8gYmUgZnJlc2hseSBjb21wdXRlZCBieSBub3JtYWxpemVFdmVudERhdGVzCgkJdGhpcy52aWV3LmNhbGVuZGFyLm5vcm1hbGl6ZUV2ZW50RGF0ZXMoZmFrZUV2ZW50KTsKCgkJLy8gdGhpcyBleHRyYSBjbGFzc05hbWUgd2lsbCBiZSB1c2VmdWwgZm9yIGRpZmZlcmVudGlhdGluZyByZWFsIGV2ZW50cyBmcm9tIG1vY2sgZXZlbnRzIGluIENTUwoJCWZha2VFdmVudC5jbGFzc05hbWUgPSAoZmFrZUV2ZW50LmNsYXNzTmFtZSB8fCBbXSkuY29uY2F0KCdmYy1oZWxwZXInKTsKCgkJLy8gaWYgc29tZXRoaW5nIGV4dGVybmFsIGlzIGJlaW5nIGRyYWdnZWQgaW4sIGRvbid0IHJlbmRlciBhIHJlc2l6ZXIKCQlpZiAoIXNvdXJjZVNlZykgewoJCQlmYWtlRXZlbnQuZWRpdGFibGUgPSBmYWxzZTsKCQl9CgoJCXJldHVybiBmYWtlRXZlbnQ7Cgl9LAoKCgkvLyBSZW5kZXJzIGEgbW9jayBldmVudC4gR2l2ZW4gem9uZWQgZXZlbnQgZGF0ZSBwcm9wZXJ0aWVzLgoJLy8gTXVzdCByZXR1cm4gYWxsIG1vY2sgZXZlbnQgZWxlbWVudHMuCglyZW5kZXJIZWxwZXI6IGZ1bmN0aW9uKGV2ZW50TG9jYXRpb24sIHNvdXJjZVNlZykgewoJCS8vIHN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQKCX0sCgoKCS8vIFVucmVuZGVycyBhIG1vY2sgZXZlbnQKCXVucmVuZGVySGVscGVyOiBmdW5jdGlvbigpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvKiBTZWxlY3Rpb24KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlbmRlcnMgYSB2aXN1YWwgaW5kaWNhdGlvbiBvZiBhIHNlbGVjdGlvbi4gV2lsbCBoaWdobGlnaHQgYnkgZGVmYXVsdCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4KCS8vIEdpdmVuIGEgc3BhbiAodW56b25lZCBzdGFydC9lbmQgYW5kIG90aGVyIG1pc2MgZGF0YSkKCXJlbmRlclNlbGVjdGlvbjogZnVuY3Rpb24oc3BhbikgewoJCXRoaXMucmVuZGVySGlnaGxpZ2h0KHNwYW4pOwoJfSwKCgoJLy8gVW5yZW5kZXJzIGFueSB2aXN1YWwgaW5kaWNhdGlvbnMgb2YgYSBzZWxlY3Rpb24uIFdpbGwgdW5yZW5kZXIgYSBoaWdobGlnaHQgYnkgZGVmYXVsdC4KCXVucmVuZGVyU2VsZWN0aW9uOiBmdW5jdGlvbigpIHsKCQl0aGlzLnVucmVuZGVySGlnaGxpZ2h0KCk7Cgl9LAoKCgkvLyBHaXZlbiB0aGUgZmlyc3QgYW5kIGxhc3QgZGF0ZS1zcGFucyBvZiBhIHNlbGVjdGlvbiwgcmV0dXJucyBhbm90aGVyIGRhdGUtc3BhbiBvYmplY3QuCgkvLyBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBhbmQgcHJvdmlkZSBhZGRpdGlvbmFsIGRhdGEgaW4gdGhlIHNwYW4gb2JqZWN0LiBXaWxsIGJlIHBhc3NlZCB0byByZW5kZXJTZWxlY3Rpb24oKS4KCS8vIFdpbGwgcmV0dXJuIGZhbHNlIGlmIHRoZSBzZWxlY3Rpb24gaXMgaW52YWxpZCBhbmQgdGhpcyBzaG91bGQgYmUgaW5kaWNhdGVkIHRvIHRoZSB1c2VyLgoJLy8gV2lsbCByZXR1cm4gbnVsbC91bmRlZmluZWQgaWYgYSBzZWxlY3Rpb24gaW52YWxpZCBidXQgbm8gZXJyb3Igc2hvdWxkIGJlIHJlcG9ydGVkLgoJY29tcHV0ZVNlbGVjdGlvbjogZnVuY3Rpb24oc3BhbjAsIHNwYW4xKSB7CgkJdmFyIHNwYW4gPSB0aGlzLmNvbXB1dGVTZWxlY3Rpb25TcGFuKHNwYW4wLCBzcGFuMSk7CgoJCWlmIChzcGFuICYmICF0aGlzLnZpZXcuY2FsZW5kYXIuaXNTZWxlY3Rpb25TcGFuQWxsb3dlZChzcGFuKSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlyZXR1cm4gc3BhbjsKCX0sCgoKCS8vIEdpdmVuIHR3byBzcGFucywgbXVzdCByZXR1cm4gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28uCgkvLyBUT0RPOiBkbyB0aGlzIHNlcGFyYXRpb24gb2YgY29uY2VybnMgKGNvbWJpbmluZyBWUyB2YWxpZGF0aW9uKSBmb3IgZXZlbnQgZG5kL3Jlc2l6ZSB0b28uCgljb21wdXRlU2VsZWN0aW9uU3BhbjogZnVuY3Rpb24oc3BhbjAsIHNwYW4xKSB7CgkJdmFyIGRhdGVzID0gWyBzcGFuMC5zdGFydCwgc3BhbjAuZW5kLCBzcGFuMS5zdGFydCwgc3BhbjEuZW5kIF07CgoJCWRhdGVzLnNvcnQoY29tcGFyZU51bWJlcnMpOyAvLyBzb3J0cyBjaHJvbm9sb2dpY2FsbHkuIHdvcmtzIHdpdGggTW9tZW50cwoKCQlyZXR1cm4geyBzdGFydDogZGF0ZXNbMF0uY2xvbmUoKSwgZW5kOiBkYXRlc1szXS5jbG9uZSgpIH07Cgl9LAoKCgkvKiBIaWdobGlnaHQKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlbmRlcnMgYW4gZW1waGFzaXMgb24gdGhlIGdpdmVuIGRhdGUgcmFuZ2UuIEdpdmVuIGEgc3BhbiAodW56b25lZCBzdGFydC9lbmQgYW5kIG90aGVyIG1pc2MgZGF0YSkKCXJlbmRlckhpZ2hsaWdodDogZnVuY3Rpb24oc3BhbikgewoJCXRoaXMucmVuZGVyRmlsbCgnaGlnaGxpZ2h0JywgdGhpcy5zcGFuVG9TZWdzKHNwYW4pKTsKCX0sCgoKCS8vIFVucmVuZGVycyB0aGUgZW1waGFzaXMgb24gYSBkYXRlIHJhbmdlCgl1bnJlbmRlckhpZ2hsaWdodDogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckZpbGwoJ2hpZ2hsaWdodCcpOwoJfSwKCgoJLy8gR2VuZXJhdGVzIGFuIGFycmF5IG9mIGNsYXNzTmFtZXMgZm9yIHJlbmRlcmluZyB0aGUgaGlnaGxpZ2h0LiBVc2VkIGJ5IHRoZSBmaWxsIHN5c3RlbS4KCWhpZ2hsaWdodFNlZ0NsYXNzZXM6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBbICdmYy1oaWdobGlnaHQnIF07Cgl9LAoKCgkvKiBCdXNpbmVzcyBIb3VycwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7Cgl9LAoKCgl1bnJlbmRlckJ1c2luZXNzSG91cnM6IGZ1bmN0aW9uKCkgewoJfSwKCgoJLyogTm93IEluZGljYXRvcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJZ2V0Tm93SW5kaWNhdG9yVW5pdDogZnVuY3Rpb24oKSB7Cgl9LAoKCglyZW5kZXJOb3dJbmRpY2F0b3I6IGZ1bmN0aW9uKGRhdGUpIHsKCX0sCgoKCXVucmVuZGVyTm93SW5kaWNhdG9yOiBmdW5jdGlvbigpIHsKCX0sCgoKCS8qIEZpbGwgU3lzdGVtIChoaWdobGlnaHQsIGJhY2tncm91bmQgZXZlbnRzLCBidXNpbmVzcyBob3VycykKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglUT0RPOiByZW1vdmUgdGhpcyBzeXN0ZW0uIGxpa2Ugd2UgZGlkIGluIFRpbWVHcmlkCgkqLwoKCgkvLyBSZW5kZXJzIGEgc2V0IG9mIHJlY3RhbmdsZXMgb3ZlciB0aGUgZ2l2ZW4gc2VnbWVudHMgb2YgdGltZS4KCS8vIE1VU1QgUkVUVVJOIGEgc3Vic2V0IG9mIHNlZ3MsIHRoZSBzZWdzIHRoYXQgd2VyZSBhY3R1YWxseSByZW5kZXJlZC4KCS8vIFJlc3BvbnNpYmxlIGZvciBwb3B1bGF0aW5nIHRoaXMuZWxzQnlGaWxsLiBUT0RPOiBiZXR0ZXIgQVBJIGZvciBleHByZXNzaW5nIHRoaXMgcmVxdWlyZW1lbnQKCXJlbmRlckZpbGw6IGZ1bmN0aW9uKHR5cGUsIHNlZ3MpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYSBzcGVjaWZpYyB0eXBlIG9mIGZpbGwgdGhhdCBpcyBjdXJyZW50bHkgcmVuZGVyZWQgb24gdGhlIGdyaWQKCXVucmVuZGVyRmlsbDogZnVuY3Rpb24odHlwZSkgewoJCXZhciBlbCA9IHRoaXMuZWxzQnlGaWxsW3R5cGVdOwoKCQlpZiAoZWwpIHsKCQkJZWwucmVtb3ZlKCk7CgkJCWRlbGV0ZSB0aGlzLmVsc0J5RmlsbFt0eXBlXTsKCQl9Cgl9LAoKCgkvLyBSZW5kZXJzIGFuZCBhc3NpZ25zIGFuIGBlbGAgcHJvcGVydHkgZm9yIGVhY2ggZmlsbCBzZWdtZW50LiBHZW5lcmljIGVub3VnaCB0byB3b3JrIHdpdGggZGlmZmVyZW50IHR5cGVzLgoJLy8gT25seSByZXR1cm5zIHNlZ21lbnRzIHRoYXQgc3VjY2Vzc2Z1bGx5IHJlbmRlcmVkLgoJLy8gVG8gYmUgaGFybmVzc2VkIGJ5IHJlbmRlckZpbGwgKGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMpLgoJLy8gQW5hbGFnb3VzIHRvIHJlbmRlckZnU2VnRWxzLgoJcmVuZGVyRmlsbFNlZ0VsczogZnVuY3Rpb24odHlwZSwgc2VncykgewoJCXZhciBfdGhpcyA9IHRoaXM7CgkJdmFyIHNlZ0VsTWV0aG9kID0gdGhpc1t0eXBlICsgJ1NlZ0VsJ107CgkJdmFyIGh0bWwgPSAnJzsKCQl2YXIgcmVuZGVyZWRTZWdzID0gW107CgkJdmFyIGk7CgoJCWlmIChzZWdzLmxlbmd0aCkgewoKCQkJLy8gYnVpbGQgYSBsYXJnZSBjb25jYXRlbmF0aW9uIG9mIHNlZ21lbnQgSFRNTAoJCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQkJaHRtbCArPSB0aGlzLmZpbGxTZWdIdG1sKHR5cGUsIHNlZ3NbaV0pOwoJCQl9CgoJCQkvLyBHcmFiIGluZGl2aWR1YWwgZWxlbWVudHMgZnJvbSB0aGUgY29tYmluZWQgSFRNTCBzdHJpbmcuIFVzZSBlYWNoIGFzIHRoZSBkZWZhdWx0IHJlbmRlcmluZy4KCQkJLy8gVGhlbiwgY29tcHV0ZSB0aGUgJ2VsJyBmb3IgZWFjaCBzZWdtZW50LgoJCQkkKGh0bWwpLmVhY2goZnVuY3Rpb24oaSwgbm9kZSkgewoJCQkJdmFyIHNlZyA9IHNlZ3NbaV07CgkJCQl2YXIgZWwgPSAkKG5vZGUpOwoKCQkJCS8vIGFsbG93IGN1c3RvbSBmaWx0ZXIgbWV0aG9kcyBwZXItdHlwZQoJCQkJaWYgKHNlZ0VsTWV0aG9kKSB7CgkJCQkJZWwgPSBzZWdFbE1ldGhvZC5jYWxsKF90aGlzLCBzZWcsIGVsKTsKCQkJCX0KCgkJCQlpZiAoZWwpIHsgLy8gY3VzdG9tIGZpbHRlcnMgZGlkIG5vdCBjYW5jZWwgdGhlIHJlbmRlcgoJCQkJCWVsID0gJChlbCk7IC8vIGFsbG93IGN1c3RvbSBmaWx0ZXIgdG8gcmV0dXJuIHJhdyBET00gbm9kZQoKCQkJCQkvLyBjb3JyZWN0IGVsZW1lbnQgdHlwZT8gKHdvdWxkIGJlIGJhZCBpZiBhIG5vbi1URCB3ZXJlIGluc2VydGVkIGludG8gYSB0YWJsZSBmb3IgZXhhbXBsZSkKCQkJCQlpZiAoZWwuaXMoX3RoaXMuZmlsbFNlZ1RhZykpIHsKCQkJCQkJc2VnLmVsID0gZWw7CgkJCQkJCXJlbmRlcmVkU2Vncy5wdXNoKHNlZyk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQl9CgoJCXJldHVybiByZW5kZXJlZFNlZ3M7Cgl9LAoKCglmaWxsU2VnVGFnOiAnZGl2JywgLy8gc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKCgoJLy8gQnVpbGRzIHRoZSBIVE1MIG5lZWRlZCBmb3Igb25lIGZpbGwgc2VnbWVudC4gR2VuZXJpYyBlbm91Z2ggdG8gd29yayB3aXRoIGRpZmZlcmVudCB0eXBlcy4KCWZpbGxTZWdIdG1sOiBmdW5jdGlvbih0eXBlLCBzZWcpIHsKCgkJLy8gY3VzdG9tIGhvb2tzIHBlci10eXBlCgkJdmFyIGNsYXNzZXNNZXRob2QgPSB0aGlzW3R5cGUgKyAnU2VnQ2xhc3NlcyddOwoJCXZhciBjc3NNZXRob2QgPSB0aGlzW3R5cGUgKyAnU2VnQ3NzJ107CgoJCXZhciBjbGFzc2VzID0gY2xhc3Nlc01ldGhvZCA/IGNsYXNzZXNNZXRob2QuY2FsbCh0aGlzLCBzZWcpIDogW107CgkJdmFyIGNzcyA9IGNzc1RvU3RyKGNzc01ldGhvZCA/IGNzc01ldGhvZC5jYWxsKHRoaXMsIHNlZykgOiB7fSk7CgoJCXJldHVybiAnPCcgKyB0aGlzLmZpbGxTZWdUYWcgKwoJCQkoY2xhc3Nlcy5sZW5ndGggPyAnIGNsYXNzPSInICsgY2xhc3Nlcy5qb2luKCcgJykgKyAnIicgOiAnJykgKwoJCQkoY3NzID8gJyBzdHlsZT0iJyArIGNzcyArICciJyA6ICcnKSArCgkJCScgLz4nOwoJfSwKCgoKCS8qIEdlbmVyaWMgcmVuZGVyaW5nIHV0aWxpdGllcyBmb3Igc3ViY2xhc3NlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQ29tcHV0ZXMgSFRNTCBjbGFzc05hbWVzIGZvciBhIHNpbmdsZS1kYXkgZWxlbWVudAoJZ2V0RGF5Q2xhc3NlczogZnVuY3Rpb24oZGF0ZSkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciB0b2RheSA9IHZpZXcuY2FsZW5kYXIuZ2V0Tm93KCk7CgkJdmFyIGNsYXNzZXMgPSBbICdmYy0nICsgZGF5SURzW2RhdGUuZGF5KCldIF07CgoJCWlmICgKCQkJdmlldy5pbnRlcnZhbER1cmF0aW9uLmFzKCdtb250aHMnKSA9PSAxICYmCgkJCWRhdGUubW9udGgoKSAhPSB2aWV3LmludGVydmFsU3RhcnQubW9udGgoKQoJCSkgewoJCQljbGFzc2VzLnB1c2goJ2ZjLW90aGVyLW1vbnRoJyk7CgkJfQoKCQlpZiAoZGF0ZS5pc1NhbWUodG9kYXksICdkYXknKSkgewoJCQljbGFzc2VzLnB1c2goCgkJCQknZmMtdG9kYXknLAoJCQkJdmlldy5oaWdobGlnaHRTdGF0ZUNsYXNzCgkJCSk7CgkJfQoJCWVsc2UgaWYgKGRhdGUgPCB0b2RheSkgewoJCQljbGFzc2VzLnB1c2goJ2ZjLXBhc3QnKTsKCQl9CgkJZWxzZSB7CgkJCWNsYXNzZXMucHVzaCgnZmMtZnV0dXJlJyk7CgkJfQoKCQlyZXR1cm4gY2xhc3NlczsKCX0KCn0pOwoKOzsKCi8qIEV2ZW50LXJlbmRlcmluZyBhbmQgZXZlbnQtaW50ZXJhY3Rpb24gbWV0aG9kcyBmb3IgdGhlIGFic3RyYWN0IEdyaWQgY2xhc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpHcmlkLm1peGluKHsKCgkvLyBzZWxmLWNvbmZpZywgb3ZlcnJpZGFibGUgYnkgc3ViY2xhc3NlcwoJc2VnU2VsZWN0b3I6ICcuZmMtZXZlbnQtY29udGFpbmVyID4gKicsIC8vIHdoYXQgY29uc3RpdHV0ZXMgYW4gZXZlbnQgZWxlbWVudD8KCgltb3VzZWRPdmVyU2VnOiBudWxsLCAvLyB0aGUgc2VnbWVudCBvYmplY3QgdGhlIHVzZXIncyBtb3VzZSBpcyBvdmVyLiBudWxsIGlmIG92ZXIgbm90aGluZwoJaXNEcmFnZ2luZ1NlZzogZmFsc2UsIC8vIGlzIGEgc2VnbWVudCBiZWluZyBkcmFnZ2VkPyBib29sZWFuCglpc1Jlc2l6aW5nU2VnOiBmYWxzZSwgLy8gaXMgYSBzZWdtZW50IGJlaW5nIHJlc2l6ZWQ/IGJvb2xlYW4KCWlzRHJhZ2dpbmdFeHRlcm5hbDogZmFsc2UsIC8vIGpxdWktZHJhZ2dpbmcgYW4gZXh0ZXJuYWwgZWxlbWVudD8gYm9vbGVhbgoJc2VnczogbnVsbCwgLy8gdGhlICpldmVudCogc2VnbWVudHMgY3VycmVudGx5IHJlbmRlcmVkIGluIHRoZSBncmlkLiBUT0RPOiByZW5hbWUgdG8gYGV2ZW50U2Vnc2AKCgoJLy8gUmVuZGVycyB0aGUgZ2l2ZW4gZXZlbnRzIG9udG8gdGhlIGdyaWQKCXJlbmRlckV2ZW50czogZnVuY3Rpb24oZXZlbnRzKSB7CgkJdmFyIGJnRXZlbnRzID0gW107CgkJdmFyIGZnRXZlbnRzID0gW107CgkJdmFyIGk7CgoJCWZvciAoaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKCQkJKGlzQmdFdmVudChldmVudHNbaV0pID8gYmdFdmVudHMgOiBmZ0V2ZW50cykucHVzaChldmVudHNbaV0pOwoJCX0KCgkJdGhpcy5zZWdzID0gW10uY29uY2F0KCAvLyByZWNvcmQgYWxsIHNlZ3MKCQkJdGhpcy5yZW5kZXJCZ0V2ZW50cyhiZ0V2ZW50cyksCgkJCXRoaXMucmVuZGVyRmdFdmVudHMoZmdFdmVudHMpCgkJKTsKCX0sCgoKCXJlbmRlckJnRXZlbnRzOiBmdW5jdGlvbihldmVudHMpIHsKCQl2YXIgc2VncyA9IHRoaXMuZXZlbnRzVG9TZWdzKGV2ZW50cyk7CgoJCS8vIHJlbmRlckJnU2VncyBtaWdodCByZXR1cm4gYSBzdWJzZXQgb2Ygc2Vncywgc2VncyB0aGF0IHdlcmUgYWN0dWFsbHkgcmVuZGVyZWQKCQlyZXR1cm4gdGhpcy5yZW5kZXJCZ1NlZ3Moc2VncykgfHwgc2VnczsKCX0sCgoKCXJlbmRlckZnRXZlbnRzOiBmdW5jdGlvbihldmVudHMpIHsKCQl2YXIgc2VncyA9IHRoaXMuZXZlbnRzVG9TZWdzKGV2ZW50cyk7CgoJCS8vIHJlbmRlckZnU2VncyBtaWdodCByZXR1cm4gYSBzdWJzZXQgb2Ygc2Vncywgc2VncyB0aGF0IHdlcmUgYWN0dWFsbHkgcmVuZGVyZWQKCQlyZXR1cm4gdGhpcy5yZW5kZXJGZ1NlZ3Moc2VncykgfHwgc2VnczsKCX0sCgoKCS8vIFVucmVuZGVycyBhbGwgZXZlbnRzIGN1cnJlbnRseSByZW5kZXJlZCBvbiB0aGUgZ3JpZAoJdW5yZW5kZXJFdmVudHM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaGFuZGxlU2VnTW91c2VvdXQoKTsgLy8gdHJpZ2dlciBhbiBldmVudE1vdXNlb3V0IGlmIHVzZXIncyBtb3VzZSBpcyBvdmVyIGFuIGV2ZW50CgkJdGhpcy5jbGVhckRyYWdMaXN0ZW5lcnMoKTsKCgkJdGhpcy51bnJlbmRlckZnU2VncygpOwoJCXRoaXMudW5yZW5kZXJCZ1NlZ3MoKTsKCgkJdGhpcy5zZWdzID0gbnVsbDsKCX0sCgoKCS8vIFJldHJpZXZlcyBhbGwgcmVuZGVyZWQgc2VnbWVudCBvYmplY3RzIGN1cnJlbnRseSByZW5kZXJlZCBvbiB0aGUgZ3JpZAoJZ2V0RXZlbnRTZWdzOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5zZWdzIHx8IFtdOwoJfSwKCgoJLyogRm9yZWdyb3VuZCBTZWdtZW50IFJlbmRlcmluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBmb3JlZ3JvdW5kIGV2ZW50IHNlZ21lbnRzIG9udG8gdGhlIGdyaWQuIE1heSByZXR1cm4gYSBzdWJzZXQgb2Ygc2VncyB0aGF0IHdlcmUgcmVuZGVyZWQuCglyZW5kZXJGZ1NlZ3M6IGZ1bmN0aW9uKHNlZ3MpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYWxsIGN1cnJlbnRseSByZW5kZXJlZCBmb3JlZ3JvdW5kIHNlZ21lbnRzCgl1bnJlbmRlckZnU2VnczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudAoJfSwKCgoJLy8gUmVuZGVycyBhbmQgYXNzaWducyBhbiBgZWxgIHByb3BlcnR5IGZvciBlYWNoIGZvcmVncm91bmQgZXZlbnQgc2VnbWVudC4KCS8vIE9ubHkgcmV0dXJucyBzZWdtZW50cyB0aGF0IHN1Y2Nlc3NmdWxseSByZW5kZXJlZC4KCS8vIEEgdXRpbGl0eSB0aGF0IHN1YmNsYXNzZXMgbWF5IHVzZS4KCXJlbmRlckZnU2VnRWxzOiBmdW5jdGlvbihzZWdzLCBkaXNhYmxlUmVzaXppbmcpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgaHRtbCA9ICcnOwoJCXZhciByZW5kZXJlZFNlZ3MgPSBbXTsKCQl2YXIgaTsKCgkJaWYgKHNlZ3MubGVuZ3RoKSB7IC8vIGRvbid0IGJ1aWxkIGFuIGVtcHR5IGh0bWwgc3RyaW5nCgoJCQkvLyBidWlsZCBhIGxhcmdlIGNvbmNhdGVuYXRpb24gb2YgZXZlbnQgc2VnbWVudCBIVE1MCgkJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCQlodG1sICs9IHRoaXMuZmdTZWdIdG1sKHNlZ3NbaV0sIGRpc2FibGVSZXNpemluZyk7CgkJCX0KCgkJCS8vIEdyYWIgaW5kaXZpZHVhbCBlbGVtZW50cyBmcm9tIHRoZSBjb21iaW5lZCBIVE1MIHN0cmluZy4gVXNlIGVhY2ggYXMgdGhlIGRlZmF1bHQgcmVuZGVyaW5nLgoJCQkvLyBUaGVuLCBjb21wdXRlIHRoZSAnZWwnIGZvciBlYWNoIHNlZ21lbnQuIEFuIGVsIG1pZ2h0IGJlIG51bGwgaWYgdGhlIGV2ZW50UmVuZGVyIGNhbGxiYWNrIHJldHVybmVkIGZhbHNlLgoJCQkkKGh0bWwpLmVhY2goZnVuY3Rpb24oaSwgbm9kZSkgewoJCQkJdmFyIHNlZyA9IHNlZ3NbaV07CgkJCQl2YXIgZWwgPSB2aWV3LnJlc29sdmVFdmVudEVsKHNlZy5ldmVudCwgJChub2RlKSk7CgoJCQkJaWYgKGVsKSB7CgkJCQkJZWwuZGF0YSgnZmMtc2VnJywgc2VnKTsgLy8gdXNlZCBieSBoYW5kbGVycwoJCQkJCXNlZy5lbCA9IGVsOwoJCQkJCXJlbmRlcmVkU2Vncy5wdXNoKHNlZyk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJlbmRlcmVkU2VnczsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIG9mIGEgZm9yZWdyb3VuZCBldmVudCBzZWdtZW50LiBVc2VkIGJ5IHJlbmRlckZnU2VnRWxzKCkKCWZnU2VnSHRtbDogZnVuY3Rpb24oc2VnLCBkaXNhYmxlUmVzaXppbmcpIHsKCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQKCX0sCgoKCS8qIEJhY2tncm91bmQgU2VnbWVudCBSZW5kZXJpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlbmRlcnMgdGhlIGdpdmVuIGJhY2tncm91bmQgZXZlbnQgc2VnbWVudHMgb250byB0aGUgZ3JpZC4KCS8vIFJldHVybnMgYSBzdWJzZXQgb2YgdGhlIHNlZ3MgdGhhdCB3ZXJlIGFjdHVhbGx5IHJlbmRlcmVkLgoJcmVuZGVyQmdTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgkJcmV0dXJuIHRoaXMucmVuZGVyRmlsbCgnYmdFdmVudCcsIHNlZ3MpOwoJfSwKCgoJLy8gVW5yZW5kZXJzIGFsbCB0aGUgY3VycmVudGx5IHJlbmRlcmVkIGJhY2tncm91bmQgZXZlbnQgc2VnbWVudHMKCXVucmVuZGVyQmdTZWdzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnVucmVuZGVyRmlsbCgnYmdFdmVudCcpOwoJfSwKCgoJLy8gUmVuZGVycyBhIGJhY2tncm91bmQgZXZlbnQgZWxlbWVudCwgZ2l2ZW4gdGhlIGRlZmF1bHQgcmVuZGVyaW5nLiBDYWxsZWQgYnkgdGhlIGZpbGwgc3lzdGVtLgoJYmdFdmVudFNlZ0VsOiBmdW5jdGlvbihzZWcsIGVsKSB7CgkJcmV0dXJuIHRoaXMudmlldy5yZXNvbHZlRXZlbnRFbChzZWcuZXZlbnQsIGVsKTsgLy8gd2lsbCBmaWx0ZXIgdGhyb3VnaCBldmVudFJlbmRlcgoJfSwKCgoJLy8gR2VuZXJhdGVzIGFuIGFycmF5IG9mIGNsYXNzTmFtZXMgdG8gYmUgdXNlZCBmb3IgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIG9mIGEgYmFja2dyb3VuZCBldmVudC4KCS8vIENhbGxlZCBieSBmaWxsU2VnSHRtbC4KCWJnRXZlbnRTZWdDbGFzc2VzOiBmdW5jdGlvbihzZWcpIHsKCQl2YXIgZXZlbnQgPSBzZWcuZXZlbnQ7CgkJdmFyIHNvdXJjZSA9IGV2ZW50LnNvdXJjZSB8fCB7fTsKCgkJcmV0dXJuIFsgJ2ZjLWJnZXZlbnQnIF0uY29uY2F0KAoJCQlldmVudC5jbGFzc05hbWUsCgkJCXNvdXJjZS5jbGFzc05hbWUgfHwgW10KCQkpOwoJfSwKCgoJLy8gR2VuZXJhdGVzIGEgc2VtaWNvbG9uLXNlcGFyYXRlZCBDU1Mgc3RyaW5nIHRvIGJlIHVzZWQgZm9yIHRoZSBkZWZhdWx0IHJlbmRlcmluZyBvZiBhIGJhY2tncm91bmQgZXZlbnQuCgkvLyBDYWxsZWQgYnkgZmlsbFNlZ0h0bWwuCgliZ0V2ZW50U2VnQ3NzOiBmdW5jdGlvbihzZWcpIHsKCQlyZXR1cm4gewoJCQknYmFja2dyb3VuZC1jb2xvcic6IHRoaXMuZ2V0U2VnU2tpbkNzcyhzZWcpWydiYWNrZ3JvdW5kLWNvbG9yJ10KCQl9OwoJfSwKCgoJLy8gR2VuZXJhdGVzIGFuIGFycmF5IG9mIGNsYXNzTmFtZXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlbmRlcmluZyBidXNpbmVzcyBob3VycyBvdmVybGF5LiBDYWxsZWQgYnkgdGhlIGZpbGwgc3lzdGVtLgoJLy8gQ2FsbGVkIGJ5IGZpbGxTZWdIdG1sLgoJYnVzaW5lc3NIb3Vyc1NlZ0NsYXNzZXM6IGZ1bmN0aW9uKHNlZykgewoJCXJldHVybiBbICdmYy1ub25idXNpbmVzcycsICdmYy1iZ2V2ZW50JyBdOwoJfSwKCgoJLyogQnVzaW5lc3MgSG91cnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIENvbXB1dGUgYnVzaW5lc3MgaG91ciBzZWdzIGZvciB0aGUgZ3JpZCdzIGN1cnJlbnQgZGF0ZSByYW5nZS4KCS8vIENhbGxlciBtdXN0IGFzayBpZiB3aG9sZS1kYXkgYnVzaW5lc3MgaG91cnMgYXJlIG5lZWRlZC4KCWJ1aWxkQnVzaW5lc3NIb3VyU2VnczogZnVuY3Rpb24od2hvbGVEYXkpIHsKCQl2YXIgZXZlbnRzID0gdGhpcy52aWV3LmNhbGVuZGFyLmdldEN1cnJlbnRCdXNpbmVzc0hvdXJFdmVudHMod2hvbGVEYXkpOwoKCQkvLyBIQUNLLiBFdmVudHVhbGx5IHJlZmFjdG9yIGJ1c2luZXNzIGhvdXJzICJldmVudHMiIHN5c3RlbS4KCQkvLyBJZiBubyBldmVudHMgYXJlIGdpdmVuLCBidXQgYnVzaW5lc3NIb3VycyBpcyBhY3RpdmF0ZWQsIHRoaXMgbWVhbnMgdGhlIGVudGlyZSB2aXNpYmxlIHJhbmdlIHNob3VsZCBiZQoJCS8vIG1hcmtlZCBhcyAqbm90KiBidXNpbmVzcy1ob3VycywgdmlhIGludmVyc2UtYmFja2dyb3VuZCByZW5kZXJpbmcuCgkJaWYgKAoJCQkhZXZlbnRzLmxlbmd0aCAmJgoJCQl0aGlzLnZpZXcuY2FsZW5kYXIub3B0aW9ucy5idXNpbmVzc0hvdXJzIC8vIGRvbid0IGFjY2VzcyB2aWV3IG9wdGlvbi4gZG9lc24ndCB1cGRhdGUgd2l0aCBkeW5hbWljIG9wdGlvbnMKCQkpIHsKCQkJZXZlbnRzID0gWwoJCQkJJC5leHRlbmQoe30sIEJVU0lORVNTX0hPVVJfRVZFTlRfREVGQVVMVFMsIHsKCQkJCQlzdGFydDogdGhpcy52aWV3LmVuZCwgLy8gZ3VhcmFudGVlZCBvdXQtb2YtcmFuZ2UKCQkJCQllbmQ6IHRoaXMudmlldy5lbmQsICAgLy8gIgoJCQkJCWRvdzogbnVsbAoJCQkJfSkKCQkJXTsKCQl9CgoJCXJldHVybiB0aGlzLmV2ZW50c1RvU2VncyhldmVudHMpOwoJfSwKCgoJLyogSGFuZGxlcnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEF0dGFjaGVzIGV2ZW50LWVsZW1lbnQtcmVsYXRlZCBoYW5kbGVycyBmb3IgKmFsbCogcmVuZGVyZWQgZXZlbnQgc2VnbWVudHMgb2YgdGhlIHZpZXcuCgliaW5kU2VnSGFuZGxlcnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuYmluZFNlZ0hhbmRsZXJzVG9FbCh0aGlzLmVsKTsKCX0sCgoKCS8vIEF0dGFjaGVzIGV2ZW50LWVsZW1lbnQtcmVsYXRlZCBoYW5kbGVycyB0byBhbiBhcmJpdHJhcnkgY29udGFpbmVyIGVsZW1lbnQuIGxldmVyYWdlcyBidWJibGluZy4KCWJpbmRTZWdIYW5kbGVyc1RvRWw6IGZ1bmN0aW9uKGVsKSB7CgkJdGhpcy5iaW5kU2VnSGFuZGxlclRvRWwoZWwsICd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVTZWdUb3VjaFN0YXJ0KTsKCQl0aGlzLmJpbmRTZWdIYW5kbGVyVG9FbChlbCwgJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVTZWdUb3VjaEVuZCk7CgkJdGhpcy5iaW5kU2VnSGFuZGxlclRvRWwoZWwsICdtb3VzZWVudGVyJywgdGhpcy5oYW5kbGVTZWdNb3VzZW92ZXIpOwoJCXRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKGVsLCAnbW91c2VsZWF2ZScsIHRoaXMuaGFuZGxlU2VnTW91c2VvdXQpOwoJCXRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKGVsLCAnbW91c2Vkb3duJywgdGhpcy5oYW5kbGVTZWdNb3VzZWRvd24pOwoJCXRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKGVsLCAnY2xpY2snLCB0aGlzLmhhbmRsZVNlZ0NsaWNrKTsKCX0sCgoKCS8vIEV4ZWN1dGVzIGEgaGFuZGxlciBmb3IgYW55IGEgdXNlci1pbnRlcmFjdGlvbiBvbiBhIHNlZ21lbnQuCgkvLyBIYW5kbGVyIGdldHMgY2FsbGVkIHdpdGggKHNlZywgZXYpLCBhbmQgd2l0aCB0aGUgYHRoaXNgIGNvbnRleHQgb2YgdGhlIEdyaWQKCWJpbmRTZWdIYW5kbGVyVG9FbDogZnVuY3Rpb24oZWwsIG5hbWUsIGhhbmRsZXIpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoKCQllbC5vbihuYW1lLCB0aGlzLnNlZ1NlbGVjdG9yLCBmdW5jdGlvbihldikgewoJCQl2YXIgc2VnID0gJCh0aGlzKS5kYXRhKCdmYy1zZWcnKTsgLy8gZ3JhYiBzZWdtZW50IGRhdGEuIHB1dCB0aGVyZSBieSBWaWV3OjpyZW5kZXJFdmVudHMKCgkJCS8vIG9ubHkgY2FsbCB0aGUgaGFuZGxlcnMgaWYgdGhlcmUgaXMgbm90IGEgZHJhZy9yZXNpemUgaW4gcHJvZ3Jlc3MKCQkJaWYgKHNlZyAmJiAhX3RoaXMuaXNEcmFnZ2luZ1NlZyAmJiAhX3RoaXMuaXNSZXNpemluZ1NlZykgewoJCQkJcmV0dXJuIGhhbmRsZXIuY2FsbChfdGhpcywgc2VnLCBldik7IC8vIGNvbnRleHQgd2lsbCBiZSB0aGUgR3JpZAoJCQl9CgkJfSk7Cgl9LAoKCgloYW5kbGVTZWdDbGljazogZnVuY3Rpb24oc2VnLCBldikgewoJCXZhciByZXMgPSB0aGlzLnZpZXcudHJpZ2dlcignZXZlbnRDbGljaycsIHNlZy5lbFswXSwgc2VnLmV2ZW50LCBldik7IC8vIGNhbiByZXR1cm4gYGZhbHNlYCB0byBjYW5jZWwKCQlpZiAocmVzID09PSBmYWxzZSkgewoJCQlldi5wcmV2ZW50RGVmYXVsdCgpOwoJCX0KCX0sCgoKCS8vIFVwZGF0ZXMgaW50ZXJuYWwgc3RhdGUgYW5kIHRyaWdnZXJzIGhhbmRsZXJzIGZvciB3aGVuIGFuIGV2ZW50IGVsZW1lbnQgaXMgbW91c2VkIG92ZXIKCWhhbmRsZVNlZ01vdXNlb3ZlcjogZnVuY3Rpb24oc2VnLCBldikgewoJCWlmICgKCQkJIXRoaXMuaXNJZ25vcmluZ01vdXNlICYmCgkJCSF0aGlzLm1vdXNlZE92ZXJTZWcKCQkpIHsKCQkJdGhpcy5tb3VzZWRPdmVyU2VnID0gc2VnOwoJCQlpZiAodGhpcy52aWV3LmlzRXZlbnRSZXNpemFibGUoc2VnLmV2ZW50KSkgewoJCQkJc2VnLmVsLmFkZENsYXNzKCdmYy1hbGxvdy1tb3VzZS1yZXNpemUnKTsKCQkJfQoJCQl0aGlzLnZpZXcudHJpZ2dlcignZXZlbnRNb3VzZW92ZXInLCBzZWcuZWxbMF0sIHNlZy5ldmVudCwgZXYpOwoJCX0KCX0sCgoKCS8vIFVwZGF0ZXMgaW50ZXJuYWwgc3RhdGUgYW5kIHRyaWdnZXJzIGhhbmRsZXJzIGZvciB3aGVuIGFuIGV2ZW50IGVsZW1lbnQgaXMgbW91c2VkIG91dC4KCS8vIENhbiBiZSBnaXZlbiBubyBhcmd1bWVudHMsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBtb3VzZW91dCB0aGUgc2VnbWVudCB0aGF0IHdhcyBwcmV2aW91c2x5IG1vdXNlZCBvdmVyLgoJaGFuZGxlU2VnTW91c2VvdXQ6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQlldiA9IGV2IHx8IHt9OyAvLyBpZiBnaXZlbiBubyBhcmdzLCBtYWtlIGEgbW9jayBtb3VzZSBldmVudAoKCQlpZiAodGhpcy5tb3VzZWRPdmVyU2VnKSB7CgkJCXNlZyA9IHNlZyB8fCB0aGlzLm1vdXNlZE92ZXJTZWc7IC8vIGlmIGdpdmVuIG5vIGFyZ3MsIHVzZSB0aGUgY3VycmVudGx5IG1vdXNlZC1vdmVyIHNlZ21lbnQKCQkJdGhpcy5tb3VzZWRPdmVyU2VnID0gbnVsbDsKCQkJaWYgKHRoaXMudmlldy5pc0V2ZW50UmVzaXphYmxlKHNlZy5ldmVudCkpIHsKCQkJCXNlZy5lbC5yZW1vdmVDbGFzcygnZmMtYWxsb3ctbW91c2UtcmVzaXplJyk7CgkJCX0KCQkJdGhpcy52aWV3LnRyaWdnZXIoJ2V2ZW50TW91c2VvdXQnLCBzZWcuZWxbMF0sIHNlZy5ldmVudCwgZXYpOwoJCX0KCX0sCgoKCWhhbmRsZVNlZ01vdXNlZG93bjogZnVuY3Rpb24oc2VnLCBldikgewoJCXZhciBpc1Jlc2l6aW5nID0gdGhpcy5zdGFydFNlZ1Jlc2l6ZShzZWcsIGV2LCB7IGRpc3RhbmNlOiA1IH0pOwoKCQlpZiAoIWlzUmVzaXppbmcgJiYgdGhpcy52aWV3LmlzRXZlbnREcmFnZ2FibGUoc2VnLmV2ZW50KSkgewoJCQl0aGlzLmJ1aWxkU2VnRHJhZ0xpc3RlbmVyKHNlZykKCQkJCS5zdGFydEludGVyYWN0aW9uKGV2LCB7CgkJCQkJZGlzdGFuY2U6IDUKCQkJCX0pOwoJCX0KCX0sCgoKCWhhbmRsZVNlZ1RvdWNoU3RhcnQ6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgZXZlbnQgPSBzZWcuZXZlbnQ7CgkJdmFyIGlzU2VsZWN0ZWQgPSB2aWV3LmlzRXZlbnRTZWxlY3RlZChldmVudCk7CgkJdmFyIGlzRHJhZ2dhYmxlID0gdmlldy5pc0V2ZW50RHJhZ2dhYmxlKGV2ZW50KTsKCQl2YXIgaXNSZXNpemFibGUgPSB2aWV3LmlzRXZlbnRSZXNpemFibGUoZXZlbnQpOwoJCXZhciBpc1Jlc2l6aW5nID0gZmFsc2U7CgkJdmFyIGRyYWdMaXN0ZW5lcjsKCgkJaWYgKGlzU2VsZWN0ZWQgJiYgaXNSZXNpemFibGUpIHsKCQkJLy8gb25seSBhbGxvdyByZXNpemluZyBvZiB0aGUgZXZlbnQgaXMgc2VsZWN0ZWQKCQkJaXNSZXNpemluZyA9IHRoaXMuc3RhcnRTZWdSZXNpemUoc2VnLCBldik7CgkJfQoKCQlpZiAoIWlzUmVzaXppbmcgJiYgKGlzRHJhZ2dhYmxlIHx8IGlzUmVzaXphYmxlKSkgeyAvLyBhbGxvd2VkIHRvIGJlIHNlbGVjdGVkPwoKCQkJZHJhZ0xpc3RlbmVyID0gaXNEcmFnZ2FibGUgPwoJCQkJdGhpcy5idWlsZFNlZ0RyYWdMaXN0ZW5lcihzZWcpIDoKCQkJCXRoaXMuYnVpbGRTZWdTZWxlY3RMaXN0ZW5lcihzZWcpOyAvLyBzZWcgaXNuJ3QgZHJhZ2dhYmxlLCBidXQgc3RpbGwgbmVlZHMgdG8gYmUgc2VsZWN0ZWQKCgkJCWRyYWdMaXN0ZW5lci5zdGFydEludGVyYWN0aW9uKGV2LCB7IC8vIHdvbid0IHN0YXJ0IGlmIGFscmVhZHkgc3RhcnRlZAoJCQkJZGVsYXk6IGlzU2VsZWN0ZWQgPyAwIDogdGhpcy52aWV3Lm9wdCgnbG9uZ1ByZXNzRGVsYXknKSAvLyBkbyBkZWxheSBpZiBub3QgYWxyZWFkeSBzZWxlY3RlZAoJCQl9KTsKCQl9CgoJCS8vIGEgbG9uZyB0YXAgc2ltdWxhdGVzIGEgbW91c2VvdmVyLiBpZ25vcmUgdGhpcyBib2d1cyBtb3VzZW92ZXIuCgkJdGhpcy50ZW1wSWdub3JlTW91c2UoKTsKCX0sCgoKCWhhbmRsZVNlZ1RvdWNoRW5kOiBmdW5jdGlvbihzZWcsIGV2KSB7CgkJLy8gdG91Y2hzdGFydCt0b3VjaGVuZCA9IGNsaWNrLCB3aGljaCBzaW11bGF0ZXMgYSBtb3VzZW92ZXIuCgkJLy8gaWdub3JlIHRoaXMgYm9ndXMgbW91c2VvdmVyLgoJCXRoaXMudGVtcElnbm9yZU1vdXNlKCk7Cgl9LAoKCgkvLyByZXR1cm5zIGJvb2xlYW4gd2hldGhlciByZXNpemluZyBhY3R1YWxseSBzdGFydGVkIG9yIG5vdC4KCS8vIGFzc3VtZXMgdGhlIHNlZyBhbGxvd3MgcmVzaXppbmcuCgkvLyBgZHJhZ09wdGlvbnNgIGFyZSBvcHRpb25hbC4KCXN0YXJ0U2VnUmVzaXplOiBmdW5jdGlvbihzZWcsIGV2LCBkcmFnT3B0aW9ucykgewoJCWlmICgkKGV2LnRhcmdldCkuaXMoJy5mYy1yZXNpemVyJykpIHsKCQkJdGhpcy5idWlsZFNlZ1Jlc2l6ZUxpc3RlbmVyKHNlZywgJChldi50YXJnZXQpLmlzKCcuZmMtc3RhcnQtcmVzaXplcicpKQoJCQkJLnN0YXJ0SW50ZXJhY3Rpb24oZXYsIGRyYWdPcHRpb25zKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0sCgoKCgkvKiBFdmVudCBEcmFnZ2luZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQnVpbGRzIGEgbGlzdGVuZXIgdGhhdCB3aWxsIHRyYWNrIHVzZXItZHJhZ2dpbmcgb24gYW4gZXZlbnQgc2VnbWVudC4KCS8vIEdlbmVyaWMgZW5vdWdoIHRvIHdvcmsgd2l0aCBhbnkgdHlwZSBvZiBHcmlkLgoJLy8gSGFzIHNpZGUgZWZmZWN0IG9mIHNldHRpbmcvdW5zZXR0aW5nIGBzZWdEcmFnTGlzdGVuZXJgCglidWlsZFNlZ0RyYWdMaXN0ZW5lcjogZnVuY3Rpb24oc2VnKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgY2FsZW5kYXIgPSB2aWV3LmNhbGVuZGFyOwoJCXZhciBlbCA9IHNlZy5lbDsKCQl2YXIgZXZlbnQgPSBzZWcuZXZlbnQ7CgkJdmFyIGlzRHJhZ2dpbmc7CgkJdmFyIG1vdXNlRm9sbG93ZXI7IC8vIEEgY2xvbmUgb2YgdGhlIG9yaWdpbmFsIGVsZW1lbnQgdGhhdCB3aWxsIG1vdmUgd2l0aCB0aGUgbW91c2UKCQl2YXIgZHJvcExvY2F0aW9uOyAvLyB6b25lZCBldmVudCBkYXRlIHByb3BlcnRpZXMKCgkJaWYgKHRoaXMuc2VnRHJhZ0xpc3RlbmVyKSB7CgkJCXJldHVybiB0aGlzLnNlZ0RyYWdMaXN0ZW5lcjsKCQl9CgoJCS8vIFRyYWNrcyBtb3VzZSBtb3ZlbWVudCBvdmVyIHRoZSAqdmlldydzKiBjb29yZGluYXRlIG1hcC4gQWxsb3dzIGRyYWdnaW5nIGFuZCBkcm9wcGluZyBiZXR3ZWVuIHN1YmNvbXBvbmVudHMKCQkvLyBvZiB0aGUgdmlldy4KCQl2YXIgZHJhZ0xpc3RlbmVyID0gdGhpcy5zZWdEcmFnTGlzdGVuZXIgPSBuZXcgSGl0RHJhZ0xpc3RlbmVyKHZpZXcsIHsKCQkJc2Nyb2xsOiB2aWV3Lm9wdCgnZHJhZ1Njcm9sbCcpLAoJCQlzdWJqZWN0RWw6IGVsLAoJCQlzdWJqZWN0Q2VudGVyOiB0cnVlLAoJCQlpbnRlcmFjdGlvblN0YXJ0OiBmdW5jdGlvbihldikgewoJCQkJc2VnLmNvbXBvbmVudCA9IF90aGlzOyAvLyBmb3IgcmVuZGVyRHJhZwoJCQkJaXNEcmFnZ2luZyA9IGZhbHNlOwoJCQkJbW91c2VGb2xsb3dlciA9IG5ldyBNb3VzZUZvbGxvd2VyKHNlZy5lbCwgewoJCQkJCWFkZGl0aW9uYWxDbGFzczogJ2ZjLWRyYWdnaW5nJywKCQkJCQlwYXJlbnRFbDogdmlldy5lbCwKCQkJCQlvcGFjaXR5OiBkcmFnTGlzdGVuZXIuaXNUb3VjaCA/IG51bGwgOiB2aWV3Lm9wdCgnZHJhZ09wYWNpdHknKSwKCQkJCQlyZXZlcnREdXJhdGlvbjogdmlldy5vcHQoJ2RyYWdSZXZlcnREdXJhdGlvbicpLAoJCQkJCXpJbmRleDogMiAvLyBvbmUgYWJvdmUgdGhlIC5mYy12aWV3CgkJCQl9KTsKCQkJCW1vdXNlRm9sbG93ZXIuaGlkZSgpOyAvLyBkb24ndCBzaG93IHVudGlsIHdlIGtub3cgdGhpcyBpcyBhIHJlYWwgZHJhZwoJCQkJbW91c2VGb2xsb3dlci5zdGFydChldik7CgkJCX0sCgkJCWRyYWdTdGFydDogZnVuY3Rpb24oZXYpIHsKCQkJCWlmIChkcmFnTGlzdGVuZXIuaXNUb3VjaCAmJiAhdmlldy5pc0V2ZW50U2VsZWN0ZWQoZXZlbnQpKSB7CgkJCQkJLy8gaWYgbm90IHByZXZpb3VzbHkgc2VsZWN0ZWQsIHdpbGwgZmlyZSBhZnRlciBhIGRlbGF5LiB0aGVuLCBzZWxlY3QgdGhlIGV2ZW50CgkJCQkJdmlldy5zZWxlY3RFdmVudChldmVudCk7CgkJCQl9CgkJCQlpc0RyYWdnaW5nID0gdHJ1ZTsKCQkJCV90aGlzLmhhbmRsZVNlZ01vdXNlb3V0KHNlZywgZXYpOyAvLyBlbnN1cmUgYSBtb3VzZW91dCBvbiB0aGUgbWFuaXB1bGF0ZWQgZXZlbnQgaGFzIGJlZW4gcmVwb3J0ZWQKCQkJCV90aGlzLnNlZ0RyYWdTdGFydChzZWcsIGV2KTsKCQkJCXZpZXcuaGlkZUV2ZW50KGV2ZW50KTsgLy8gaGlkZSBhbGwgZXZlbnQgc2VnbWVudHMuIG91ciBtb3VzZUZvbGxvd2VyIHdpbGwgdGFrZSBvdmVyCgkJCX0sCgkJCWhpdE92ZXI6IGZ1bmN0aW9uKGhpdCwgaXNPcmlnLCBvcmlnSGl0KSB7CgkJCQl2YXIgZHJhZ0hlbHBlckVsczsKCgkJCQkvLyBzdGFydGluZyBoaXQgY291bGQgYmUgZm9yY2VkIChEYXlHcmlkLmxpbWl0KQoJCQkJaWYgKHNlZy5oaXQpIHsKCQkJCQlvcmlnSGl0ID0gc2VnLmhpdDsKCQkJCX0KCgkJCQkvLyBzaW5jZSB3ZSBhcmUgcXVlcnlpbmcgdGhlIHBhcmVudCB2aWV3LCBtaWdodCBub3QgYmVsb25nIHRvIHRoaXMgZ3JpZAoJCQkJZHJvcExvY2F0aW9uID0gX3RoaXMuY29tcHV0ZUV2ZW50RHJvcCgKCQkJCQlvcmlnSGl0LmNvbXBvbmVudC5nZXRIaXRTcGFuKG9yaWdIaXQpLAoJCQkJCWhpdC5jb21wb25lbnQuZ2V0SGl0U3BhbihoaXQpLAoJCQkJCWV2ZW50CgkJCQkpOwoKCQkJCWlmIChkcm9wTG9jYXRpb24gJiYgIWNhbGVuZGFyLmlzRXZlbnRTcGFuQWxsb3dlZChfdGhpcy5ldmVudFRvU3Bhbihkcm9wTG9jYXRpb24pLCBldmVudCkpIHsKCQkJCQlkaXNhYmxlQ3Vyc29yKCk7CgkJCQkJZHJvcExvY2F0aW9uID0gbnVsbDsKCQkJCX0KCgkJCQkvLyBpZiBhIHZhbGlkIGRyb3AgbG9jYXRpb24sIGhhdmUgdGhlIHN1YmNsYXNzIHJlbmRlciBhIHZpc3VhbCBpbmRpY2F0aW9uCgkJCQlpZiAoZHJvcExvY2F0aW9uICYmIChkcmFnSGVscGVyRWxzID0gdmlldy5yZW5kZXJEcmFnKGRyb3BMb2NhdGlvbiwgc2VnKSkpIHsKCgkJCQkJZHJhZ0hlbHBlckVscy5hZGRDbGFzcygnZmMtZHJhZ2dpbmcnKTsKCQkJCQlpZiAoIWRyYWdMaXN0ZW5lci5pc1RvdWNoKSB7CgkJCQkJCV90aGlzLmFwcGx5RHJhZ09wYWNpdHkoZHJhZ0hlbHBlckVscyk7CgkJCQkJfQoKCQkJCQltb3VzZUZvbGxvd2VyLmhpZGUoKTsgLy8gaWYgdGhlIHN1YmNsYXNzIGlzIGFscmVhZHkgdXNpbmcgYSBtb2NrIGV2ZW50ICJoZWxwZXIiLCBoaWRlIG91ciBvd24KCQkJCX0KCQkJCWVsc2UgewoJCQkJCW1vdXNlRm9sbG93ZXIuc2hvdygpOyAvLyBvdGhlcndpc2UsIGhhdmUgdGhlIGhlbHBlciBmb2xsb3cgdGhlIG1vdXNlIChubyBzbmFwcGluZykKCQkJCX0KCgkJCQlpZiAoaXNPcmlnKSB7CgkJCQkJZHJvcExvY2F0aW9uID0gbnVsbDsgLy8gbmVlZHMgdG8gaGF2ZSBtb3ZlZCBoaXRzIHRvIGJlIGEgdmFsaWQgZHJvcAoJCQkJfQoJCQl9LAoJCQloaXRPdXQ6IGZ1bmN0aW9uKCkgeyAvLyBjYWxsZWQgYmVmb3JlIG1vdXNlIG1vdmVzIHRvIGEgZGlmZmVyZW50IGhpdCBPUiBtb3ZlZCBvdXQgb2YgYWxsIGhpdHMKCQkJCXZpZXcudW5yZW5kZXJEcmFnKCk7IC8vIHVucmVuZGVyIHdoYXRldmVyIHdhcyBkb25lIGluIHJlbmRlckRyYWcKCQkJCW1vdXNlRm9sbG93ZXIuc2hvdygpOyAvLyBzaG93IGluIGNhc2Ugd2UgYXJlIG1vdmluZyBvdXQgb2YgYWxsIGhpdHMKCQkJCWRyb3BMb2NhdGlvbiA9IG51bGw7CgkJCX0sCgkJCWhpdERvbmU6IGZ1bmN0aW9uKCkgeyAvLyBDYWxsZWQgYWZ0ZXIgYSBoaXRPdXQgT1IgYmVmb3JlIGEgZHJhZ0VuZAoJCQkJZW5hYmxlQ3Vyc29yKCk7CgkJCX0sCgkJCWludGVyYWN0aW9uRW5kOiBmdW5jdGlvbihldikgewoJCQkJZGVsZXRlIHNlZy5jb21wb25lbnQ7IC8vIHByZXZlbnQgc2lkZSBlZmZlY3RzCgoJCQkJLy8gZG8gcmV2ZXJ0IGFuaW1hdGlvbiBpZiBoYXNuJ3QgY2hhbmdlZC4gY2FsbHMgYSBjYWxsYmFjayB3aGVuIGZpbmlzaGVkICh3aGV0aGVyIGFuaW1hdGlvbiBvciBub3QpCgkJCQltb3VzZUZvbGxvd2VyLnN0b3AoIWRyb3BMb2NhdGlvbiwgZnVuY3Rpb24oKSB7CgkJCQkJaWYgKGlzRHJhZ2dpbmcpIHsKCQkJCQkJdmlldy51bnJlbmRlckRyYWcoKTsKCQkJCQkJdmlldy5zaG93RXZlbnQoZXZlbnQpOwoJCQkJCQlfdGhpcy5zZWdEcmFnU3RvcChzZWcsIGV2KTsKCQkJCQl9CgkJCQkJaWYgKGRyb3BMb2NhdGlvbikgewoJCQkJCQl2aWV3LnJlcG9ydEV2ZW50RHJvcChldmVudCwgZHJvcExvY2F0aW9uLCB0aGlzLmxhcmdlVW5pdCwgZWwsIGV2KTsKCQkJCQl9CgkJCQl9KTsKCQkJCV90aGlzLnNlZ0RyYWdMaXN0ZW5lciA9IG51bGw7CgkJCX0KCQl9KTsKCgkJcmV0dXJuIGRyYWdMaXN0ZW5lcjsKCX0sCgoKCS8vIHNlZyBpc24ndCBkcmFnZ2FibGUsIGJ1dCBsZXQncyB1c2UgYSBnZW5lcmljIERyYWdMaXN0ZW5lcgoJLy8gc2ltcGx5IGZvciB0aGUgZGVsYXksIHNvIGl0IGNhbiBiZSBzZWxlY3RlZC4KCS8vIEhhcyBzaWRlIGVmZmVjdCBvZiBzZXR0aW5nL3Vuc2V0dGluZyBgc2VnRHJhZ0xpc3RlbmVyYAoJYnVpbGRTZWdTZWxlY3RMaXN0ZW5lcjogZnVuY3Rpb24oc2VnKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgZXZlbnQgPSBzZWcuZXZlbnQ7CgoJCWlmICh0aGlzLnNlZ0RyYWdMaXN0ZW5lcikgewoJCQlyZXR1cm4gdGhpcy5zZWdEcmFnTGlzdGVuZXI7CgkJfQoKCQl2YXIgZHJhZ0xpc3RlbmVyID0gdGhpcy5zZWdEcmFnTGlzdGVuZXIgPSBuZXcgRHJhZ0xpc3RlbmVyKHsKCQkJZHJhZ1N0YXJ0OiBmdW5jdGlvbihldikgewoJCQkJaWYgKGRyYWdMaXN0ZW5lci5pc1RvdWNoICYmICF2aWV3LmlzRXZlbnRTZWxlY3RlZChldmVudCkpIHsKCQkJCQkvLyBpZiBub3QgcHJldmlvdXNseSBzZWxlY3RlZCwgd2lsbCBmaXJlIGFmdGVyIGEgZGVsYXkuIHRoZW4sIHNlbGVjdCB0aGUgZXZlbnQKCQkJCQl2aWV3LnNlbGVjdEV2ZW50KGV2ZW50KTsKCQkJCX0KCQkJfSwKCQkJaW50ZXJhY3Rpb25FbmQ6IGZ1bmN0aW9uKGV2KSB7CgkJCQlfdGhpcy5zZWdEcmFnTGlzdGVuZXIgPSBudWxsOwoJCQl9CgkJfSk7CgoJCXJldHVybiBkcmFnTGlzdGVuZXI7Cgl9LAoKCgkvLyBDYWxsZWQgYmVmb3JlIGV2ZW50IHNlZ21lbnQgZHJhZ2dpbmcgc3RhcnRzCglzZWdEcmFnU3RhcnQ6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQl0aGlzLmlzRHJhZ2dpbmdTZWcgPSB0cnVlOwoJCXRoaXMudmlldy50cmlnZ2VyKCdldmVudERyYWdTdGFydCcsIHNlZy5lbFswXSwgc2VnLmV2ZW50LCBldiwge30pOyAvLyBsYXN0IGFyZ3VtZW50IGlzIGpxdWkgZHVtbXkKCX0sCgoKCS8vIENhbGxlZCBhZnRlciBldmVudCBzZWdtZW50IGRyYWdnaW5nIHN0b3BzCglzZWdEcmFnU3RvcDogZnVuY3Rpb24oc2VnLCBldikgewoJCXRoaXMuaXNEcmFnZ2luZ1NlZyA9IGZhbHNlOwoJCXRoaXMudmlldy50cmlnZ2VyKCdldmVudERyYWdTdG9wJywgc2VnLmVsWzBdLCBzZWcuZXZlbnQsIGV2LCB7fSk7IC8vIGxhc3QgYXJndW1lbnQgaXMganF1aSBkdW1teQoJfSwKCgoJLy8gR2l2ZW4gdGhlIHNwYW5zIGFuIGV2ZW50IGRyYWcgYmVnYW4sIGFuZCB0aGUgc3BhbiBldmVudCB3YXMgZHJvcHBlZCwgY2FsY3VsYXRlcyB0aGUgbmV3IHpvbmVkIHN0YXJ0L2VuZC9hbGxEYXkKCS8vIHZhbHVlcyBmb3IgdGhlIGV2ZW50LiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSBhbmQgc2V0IGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSB1c2VkIGJ5IHJlbmRlckRyYWcuCgkvLyBBIGZhbHN5IHJldHVybmVkIHZhbHVlIGluZGljYXRlcyBhbiBpbnZhbGlkIGRyb3AuCgkvLyBET0VTIE5PVCBjb25zaWRlciBvdmVybGFwL2NvbnN0cmFpbnQuCgljb21wdXRlRXZlbnREcm9wOiBmdW5jdGlvbihzdGFydFNwYW4sIGVuZFNwYW4sIGV2ZW50KSB7CgkJdmFyIGNhbGVuZGFyID0gdGhpcy52aWV3LmNhbGVuZGFyOwoJCXZhciBkcmFnU3RhcnQgPSBzdGFydFNwYW4uc3RhcnQ7CgkJdmFyIGRyYWdFbmQgPSBlbmRTcGFuLnN0YXJ0OwoJCXZhciBkZWx0YTsKCQl2YXIgZHJvcExvY2F0aW9uOyAvLyB6b25lZCBldmVudCBkYXRlIHByb3BlcnRpZXMKCgkJaWYgKGRyYWdTdGFydC5oYXNUaW1lKCkgPT09IGRyYWdFbmQuaGFzVGltZSgpKSB7CgkJCWRlbHRhID0gdGhpcy5kaWZmRGF0ZXMoZHJhZ0VuZCwgZHJhZ1N0YXJ0KTsKCgkJCS8vIGlmIGFuIGFsbC1kYXkgZXZlbnQgd2FzIGluIGEgdGltZWQgYXJlYSBhbmQgaXQgd2FzIGRyYWdnZWQgdG8gYSBkaWZmZXJlbnQgdGltZSwKCQkJLy8gZ3VhcmFudGVlIGFuIGVuZCBhbmQgYWRqdXN0IHN0YXJ0L2VuZCB0byBoYXZlIHRpbWVzCgkJCWlmIChldmVudC5hbGxEYXkgJiYgZHVyYXRpb25IYXNUaW1lKGRlbHRhKSkgewoJCQkJZHJvcExvY2F0aW9uID0gewoJCQkJCXN0YXJ0OiBldmVudC5zdGFydC5jbG9uZSgpLAoJCQkJCWVuZDogY2FsZW5kYXIuZ2V0RXZlbnRFbmQoZXZlbnQpLCAvLyB3aWxsIGJlIGFuIGFtYmlnIGRheQoJCQkJCWFsbERheTogZmFsc2UgLy8gZm9yIG5vcm1hbGl6ZUV2ZW50VGltZXMKCQkJCX07CgkJCQljYWxlbmRhci5ub3JtYWxpemVFdmVudFRpbWVzKGRyb3BMb2NhdGlvbik7CgkJCX0KCQkJLy8gb3RoZXdpc2UsIHdvcmsgb2ZmIGV4aXN0aW5nIHZhbHVlcwoJCQllbHNlIHsKCQkJCWRyb3BMb2NhdGlvbiA9IHBsdWNrRXZlbnREYXRlUHJvcHMoZXZlbnQpOwoJCQl9CgoJCQlkcm9wTG9jYXRpb24uc3RhcnQuYWRkKGRlbHRhKTsKCQkJaWYgKGRyb3BMb2NhdGlvbi5lbmQpIHsKCQkJCWRyb3BMb2NhdGlvbi5lbmQuYWRkKGRlbHRhKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJLy8gaWYgc3dpdGNoaW5nIGZyb20gZGF5IDwtPiB0aW1lZCwgc3RhcnQgc2hvdWxkIGJlIHJlc2V0IHRvIHRoZSBkcm9wcGVkIGRhdGUsIGFuZCB0aGUgZW5kIGNsZWFyZWQKCQkJZHJvcExvY2F0aW9uID0gewoJCQkJc3RhcnQ6IGRyYWdFbmQuY2xvbmUoKSwKCQkJCWVuZDogbnVsbCwgLy8gZW5kIHNob3VsZCBiZSBjbGVhcmVkCgkJCQlhbGxEYXk6ICFkcmFnRW5kLmhhc1RpbWUoKQoJCQl9OwoJCX0KCgkJcmV0dXJuIGRyb3BMb2NhdGlvbjsKCX0sCgoKCS8vIFV0aWxpdHkgZm9yIGFwcGx5IGRyYWdPcGFjaXR5IHRvIGEgalF1ZXJ5IHNldAoJYXBwbHlEcmFnT3BhY2l0eTogZnVuY3Rpb24oZWxzKSB7CgkJdmFyIG9wYWNpdHkgPSB0aGlzLnZpZXcub3B0KCdkcmFnT3BhY2l0eScpOwoKCQlpZiAob3BhY2l0eSAhPSBudWxsKSB7CgkJCWVscy5jc3MoJ29wYWNpdHknLCBvcGFjaXR5KTsKCQl9Cgl9LAoKCgkvKiBFeHRlcm5hbCBFbGVtZW50IERyYWdnaW5nCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBDYWxsZWQgd2hlbiBhIGpRdWVyeSBVSSBkcmFnIGlzIGluaXRpYXRlZCBhbnl3aGVyZSBpbiB0aGUgRE9NCglleHRlcm5hbERyYWdTdGFydDogZnVuY3Rpb24oZXYsIHVpKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGVsOwoJCXZhciBhY2NlcHQ7CgoJCWlmICh2aWV3Lm9wdCgnZHJvcHBhYmxlJykpIHsgLy8gb25seSBsaXN0ZW4gaWYgdGhpcyBzZXR0aW5nIGlzIG9uCgkJCWVsID0gJCgodWkgPyB1aS5pdGVtIDogbnVsbCkgfHwgZXYudGFyZ2V0KTsKCgkJCS8vIFRlc3QgdGhhdCB0aGUgZHJhZ2dlZCBlbGVtZW50IHBhc3NlcyB0aGUgZHJvcEFjY2VwdCBzZWxlY3RvciBvciBmaWx0ZXIgZnVuY3Rpb24uCgkJCS8vIEZZSSwgdGhlIGRlZmF1bHQgaXMgIioiIChtYXRjaGVzIGFsbCkKCQkJYWNjZXB0ID0gdmlldy5vcHQoJ2Ryb3BBY2NlcHQnKTsKCQkJaWYgKCQuaXNGdW5jdGlvbihhY2NlcHQpID8gYWNjZXB0LmNhbGwoZWxbMF0sIGVsKSA6IGVsLmlzKGFjY2VwdCkpIHsKCQkJCWlmICghdGhpcy5pc0RyYWdnaW5nRXh0ZXJuYWwpIHsgLy8gcHJldmVudCBkb3VibGUtbGlzdGVuaW5nIGlmIGZpcmVkIHR3aWNlCgkJCQkJdGhpcy5saXN0ZW5Ub0V4dGVybmFsRHJhZyhlbCwgZXYsIHVpKTsKCQkJCX0KCQkJfQoJCX0KCX0sCgoKCS8vIENhbGxlZCB3aGVuIGEgalF1ZXJ5IFVJIGRyYWcgc3RhcnRzIGFuZCBpdCBuZWVkcyB0byBiZSBtb25pdG9yZWQgZm9yIGRyb3BwaW5nCglsaXN0ZW5Ub0V4dGVybmFsRHJhZzogZnVuY3Rpb24oZWwsIGV2LCB1aSkgewoJCXZhciBfdGhpcyA9IHRoaXM7CgkJdmFyIGNhbGVuZGFyID0gdGhpcy52aWV3LmNhbGVuZGFyOwoJCXZhciBtZXRhID0gZ2V0RHJhZ2dlZEVsTWV0YShlbCk7IC8vIGV4dHJhIGRhdGEgYWJvdXQgZXZlbnQgZHJvcCwgaW5jbHVkaW5nIHBvc3NpYmxlIGV2ZW50IHRvIGNyZWF0ZQoJCXZhciBkcm9wTG9jYXRpb247IC8vIGEgbnVsbCB2YWx1ZSBzaWduYWxzIGFuIHVuc3VjY2Vzc2Z1bCBkcmFnCgoJCS8vIGxpc3RlbmVyIHRoYXQgdHJhY2tzIG1vdXNlIG1vdmVtZW50IG92ZXIgZGF0ZS1hc3NvY2lhdGVkIHBpeGVsIHJlZ2lvbnMKCQl2YXIgZHJhZ0xpc3RlbmVyID0gX3RoaXMuZXh0ZXJuYWxEcmFnTGlzdGVuZXIgPSBuZXcgSGl0RHJhZ0xpc3RlbmVyKHRoaXMsIHsKCQkJaW50ZXJhY3Rpb25TdGFydDogZnVuY3Rpb24oKSB7CgkJCQlfdGhpcy5pc0RyYWdnaW5nRXh0ZXJuYWwgPSB0cnVlOwoJCQl9LAoJCQloaXRPdmVyOiBmdW5jdGlvbihoaXQpIHsKCQkJCWRyb3BMb2NhdGlvbiA9IF90aGlzLmNvbXB1dGVFeHRlcm5hbERyb3AoCgkJCQkJaGl0LmNvbXBvbmVudC5nZXRIaXRTcGFuKGhpdCksIC8vIHNpbmNlIHdlIGFyZSBxdWVyeWluZyB0aGUgcGFyZW50IHZpZXcsIG1pZ2h0IG5vdCBiZWxvbmcgdG8gdGhpcyBncmlkCgkJCQkJbWV0YQoJCQkJKTsKCgkJCQlpZiAoIC8vIGludmFsaWQgaGl0PwoJCQkJCWRyb3BMb2NhdGlvbiAmJgoJCQkJCSFjYWxlbmRhci5pc0V4dGVybmFsU3BhbkFsbG93ZWQoX3RoaXMuZXZlbnRUb1NwYW4oZHJvcExvY2F0aW9uKSwgZHJvcExvY2F0aW9uLCBtZXRhLmV2ZW50UHJvcHMpCgkJCQkpIHsKCQkJCQlkaXNhYmxlQ3Vyc29yKCk7CgkJCQkJZHJvcExvY2F0aW9uID0gbnVsbDsKCQkJCX0KCgkJCQlpZiAoZHJvcExvY2F0aW9uKSB7CgkJCQkJX3RoaXMucmVuZGVyRHJhZyhkcm9wTG9jYXRpb24pOyAvLyBjYWxsZWQgd2l0aG91dCBhIHNlZyBwYXJhbWV0ZXIKCQkJCX0KCQkJfSwKCQkJaGl0T3V0OiBmdW5jdGlvbigpIHsKCQkJCWRyb3BMb2NhdGlvbiA9IG51bGw7IC8vIHNpZ25hbCB1bnN1Y2Nlc3NmdWwKCQkJfSwKCQkJaGl0RG9uZTogZnVuY3Rpb24oKSB7IC8vIENhbGxlZCBhZnRlciBhIGhpdE91dCBPUiBiZWZvcmUgYSBkcmFnRW5kCgkJCQllbmFibGVDdXJzb3IoKTsKCQkJCV90aGlzLnVucmVuZGVyRHJhZygpOwoJCQl9LAoJCQlpbnRlcmFjdGlvbkVuZDogZnVuY3Rpb24oZXYpIHsKCQkJCWlmIChkcm9wTG9jYXRpb24pIHsgLy8gZWxlbWVudCB3YXMgZHJvcHBlZCBvbiBhIHZhbGlkIGhpdAoJCQkJCV90aGlzLnZpZXcucmVwb3J0RXh0ZXJuYWxEcm9wKG1ldGEsIGRyb3BMb2NhdGlvbiwgZWwsIGV2LCB1aSk7CgkJCQl9CgkJCQlfdGhpcy5pc0RyYWdnaW5nRXh0ZXJuYWwgPSBmYWxzZTsKCQkJCV90aGlzLmV4dGVybmFsRHJhZ0xpc3RlbmVyID0gbnVsbDsKCQkJfQoJCX0pOwoKCQlkcmFnTGlzdGVuZXIuc3RhcnREcmFnKGV2KTsgLy8gc3RhcnQgbGlzdGVuaW5nIGltbWVkaWF0ZWx5Cgl9LAoKCgkvLyBHaXZlbiBhIGhpdCB0byBiZSBkcm9wcGVkIHVwb24sIGFuZCBtaXNjIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBqcXVpIGRyYWcgKGd1YXJhbnRlZWQgdG8gYmUgYSBwbGFpbiBvYmplY3QpLAoJLy8gcmV0dXJucyB0aGUgem9uZWQgc3RhcnQvZW5kIGRhdGVzIGZvciB0aGUgZXZlbnQgdGhhdCB3b3VsZCByZXN1bHQgZnJvbSB0aGUgaHlwb3RoZXRpY2FsIGRyb3AuIGVuZCBtaWdodCBiZSBudWxsLgoJLy8gUmV0dXJuaW5nIGEgbnVsbCB2YWx1ZSBzaWduYWxzIGFuIGludmFsaWQgZHJvcCBoaXQuCgkvLyBET0VTIE5PVCBjb25zaWRlciBvdmVybGFwL2NvbnN0cmFpbnQuCgljb21wdXRlRXh0ZXJuYWxEcm9wOiBmdW5jdGlvbihzcGFuLCBtZXRhKSB7CgkJdmFyIGNhbGVuZGFyID0gdGhpcy52aWV3LmNhbGVuZGFyOwoJCXZhciBkcm9wTG9jYXRpb24gPSB7CgkJCXN0YXJ0OiBjYWxlbmRhci5hcHBseVRpbWV6b25lKHNwYW4uc3RhcnQpLCAvLyBzaW11bGF0ZSBhIHpvbmVkIGV2ZW50IHN0YXJ0IGRhdGUKCQkJZW5kOiBudWxsCgkJfTsKCgkJLy8gaWYgZHJvcHBlZCBvbiBhbiBhbGwtZGF5IHNwYW4sIGFuZCBlbGVtZW50J3MgbWV0YWRhdGEgc3BlY2lmaWVkIGEgdGltZSwgc2V0IGl0CgkJaWYgKG1ldGEuc3RhcnRUaW1lICYmICFkcm9wTG9jYXRpb24uc3RhcnQuaGFzVGltZSgpKSB7CgkJCWRyb3BMb2NhdGlvbi5zdGFydC50aW1lKG1ldGEuc3RhcnRUaW1lKTsKCQl9CgoJCWlmIChtZXRhLmR1cmF0aW9uKSB7CgkJCWRyb3BMb2NhdGlvbi5lbmQgPSBkcm9wTG9jYXRpb24uc3RhcnQuY2xvbmUoKS5hZGQobWV0YS5kdXJhdGlvbik7CgkJfQoKCQlyZXR1cm4gZHJvcExvY2F0aW9uOwoJfSwKCgoKCS8qIERyYWcgUmVuZGVyaW5nIChmb3IgYm90aCBldmVudHMgYW5kIGFuIGV4dGVybmFsIGVsZW1lbnRzKQoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IG9yIGV4dGVybmFsIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZC4KCS8vIGBkcm9wTG9jYXRpb25gIGNvbnRhaW5zIGh5cG90aGV0aWNhbCBzdGFydC9lbmQvYWxsRGF5IHZhbHVlcyB0aGUgZXZlbnQgd291bGQgaGF2ZSBpZiBkcm9wcGVkLiBlbmQgY2FuIGJlIG51bGwuCgkvLyBgc2VnYCBpcyB0aGUgaW50ZXJuYWwgc2VnbWVudCBvYmplY3QgdGhhdCBpcyBiZWluZyBkcmFnZ2VkLiBJZiBkcmFnZ2luZyBhbiBleHRlcm5hbCBlbGVtZW50LCBgc2VnYCBpcyBudWxsLgoJLy8gQSB0cnV0aHkgcmV0dXJuZWQgdmFsdWUgaW5kaWNhdGVzIHRoaXMgbWV0aG9kIGhhcyByZW5kZXJlZCBhIGhlbHBlciBlbGVtZW50LgoJLy8gTXVzdCByZXR1cm4gZWxlbWVudHMgdXNlZCBmb3IgYW55IG1vY2sgZXZlbnRzLgoJcmVuZGVyRHJhZzogZnVuY3Rpb24oZHJvcExvY2F0aW9uLCBzZWcpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYSB2aXN1YWwgaW5kaWNhdGlvbiBvZiBhbiBldmVudCBvciBleHRlcm5hbCBlbGVtZW50IGJlaW5nIGRyYWdnZWQKCXVucmVuZGVyRHJhZzogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudAoJfSwKCgoJLyogUmVzaXppbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIENyZWF0ZXMgYSBsaXN0ZW5lciB0aGF0IHRyYWNrcyB0aGUgdXNlciBhcyB0aGV5IHJlc2l6ZSBhbiBldmVudCBzZWdtZW50LgoJLy8gR2VuZXJpYyBlbm91Z2ggdG8gd29yayB3aXRoIGFueSB0eXBlIG9mIEdyaWQuCglidWlsZFNlZ1Jlc2l6ZUxpc3RlbmVyOiBmdW5jdGlvbihzZWcsIGlzU3RhcnQpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBjYWxlbmRhciA9IHZpZXcuY2FsZW5kYXI7CgkJdmFyIGVsID0gc2VnLmVsOwoJCXZhciBldmVudCA9IHNlZy5ldmVudDsKCQl2YXIgZXZlbnRFbmQgPSBjYWxlbmRhci5nZXRFdmVudEVuZChldmVudCk7CgkJdmFyIGlzRHJhZ2dpbmc7CgkJdmFyIHJlc2l6ZUxvY2F0aW9uOyAvLyB6b25lZCBldmVudCBkYXRlIHByb3BlcnRpZXMuIGZhbHN5IGlmIGludmFsaWQgcmVzaXplCgoJCS8vIFRyYWNrcyBtb3VzZSBtb3ZlbWVudCBvdmVyIHRoZSAqZ3JpZCdzKiBjb29yZGluYXRlIG1hcAoJCXZhciBkcmFnTGlzdGVuZXIgPSB0aGlzLnNlZ1Jlc2l6ZUxpc3RlbmVyID0gbmV3IEhpdERyYWdMaXN0ZW5lcih0aGlzLCB7CgkJCXNjcm9sbDogdmlldy5vcHQoJ2RyYWdTY3JvbGwnKSwKCQkJc3ViamVjdEVsOiBlbCwKCQkJaW50ZXJhY3Rpb25TdGFydDogZnVuY3Rpb24oKSB7CgkJCQlpc0RyYWdnaW5nID0gZmFsc2U7CgkJCX0sCgkJCWRyYWdTdGFydDogZnVuY3Rpb24oZXYpIHsKCQkJCWlzRHJhZ2dpbmcgPSB0cnVlOwoJCQkJX3RoaXMuaGFuZGxlU2VnTW91c2VvdXQoc2VnLCBldik7IC8vIGVuc3VyZSBhIG1vdXNlb3V0IG9uIHRoZSBtYW5pcHVsYXRlZCBldmVudCBoYXMgYmVlbiByZXBvcnRlZAoJCQkJX3RoaXMuc2VnUmVzaXplU3RhcnQoc2VnLCBldik7CgkJCX0sCgkJCWhpdE92ZXI6IGZ1bmN0aW9uKGhpdCwgaXNPcmlnLCBvcmlnSGl0KSB7CgkJCQl2YXIgb3JpZ0hpdFNwYW4gPSBfdGhpcy5nZXRIaXRTcGFuKG9yaWdIaXQpOwoJCQkJdmFyIGhpdFNwYW4gPSBfdGhpcy5nZXRIaXRTcGFuKGhpdCk7CgoJCQkJcmVzaXplTG9jYXRpb24gPSBpc1N0YXJ0ID8KCQkJCQlfdGhpcy5jb21wdXRlRXZlbnRTdGFydFJlc2l6ZShvcmlnSGl0U3BhbiwgaGl0U3BhbiwgZXZlbnQpIDoKCQkJCQlfdGhpcy5jb21wdXRlRXZlbnRFbmRSZXNpemUob3JpZ0hpdFNwYW4sIGhpdFNwYW4sIGV2ZW50KTsKCgkJCQlpZiAocmVzaXplTG9jYXRpb24pIHsKCQkJCQlpZiAoIWNhbGVuZGFyLmlzRXZlbnRTcGFuQWxsb3dlZChfdGhpcy5ldmVudFRvU3BhbihyZXNpemVMb2NhdGlvbiksIGV2ZW50KSkgewoJCQkJCQlkaXNhYmxlQ3Vyc29yKCk7CgkJCQkJCXJlc2l6ZUxvY2F0aW9uID0gbnVsbDsKCQkJCQl9CgkJCQkJLy8gbm8gY2hhbmdlPyAoRllJLCBldmVudCBkYXRlcyBtaWdodCBoYXZlIHpvbmVzKQoJCQkJCWVsc2UgaWYgKAoJCQkJCQlyZXNpemVMb2NhdGlvbi5zdGFydC5pc1NhbWUoZXZlbnQuc3RhcnQuY2xvbmUoKS5zdHJpcFpvbmUoKSkgJiYKCQkJCQkJcmVzaXplTG9jYXRpb24uZW5kLmlzU2FtZShldmVudEVuZC5jbG9uZSgpLnN0cmlwWm9uZSgpKQoJCQkJCSkgewoJCQkJCQlyZXNpemVMb2NhdGlvbiA9IG51bGw7CgkJCQkJfQoJCQkJfQoKCQkJCWlmIChyZXNpemVMb2NhdGlvbikgewoJCQkJCXZpZXcuaGlkZUV2ZW50KGV2ZW50KTsKCQkJCQlfdGhpcy5yZW5kZXJFdmVudFJlc2l6ZShyZXNpemVMb2NhdGlvbiwgc2VnKTsKCQkJCX0KCQkJfSwKCQkJaGl0T3V0OiBmdW5jdGlvbigpIHsgLy8gY2FsbGVkIGJlZm9yZSBtb3VzZSBtb3ZlcyB0byBhIGRpZmZlcmVudCBoaXQgT1IgbW92ZWQgb3V0IG9mIGFsbCBoaXRzCgkJCQlyZXNpemVMb2NhdGlvbiA9IG51bGw7CgkJCX0sCgkJCWhpdERvbmU6IGZ1bmN0aW9uKCkgeyAvLyByZXNldHMgdGhlIHJlbmRlcmluZyB0byBzaG93IHRoZSBvcmlnaW5hbCBldmVudAoJCQkJX3RoaXMudW5yZW5kZXJFdmVudFJlc2l6ZSgpOwoJCQkJdmlldy5zaG93RXZlbnQoZXZlbnQpOwoJCQkJZW5hYmxlQ3Vyc29yKCk7CgkJCX0sCgkJCWludGVyYWN0aW9uRW5kOiBmdW5jdGlvbihldikgewoJCQkJaWYgKGlzRHJhZ2dpbmcpIHsKCQkJCQlfdGhpcy5zZWdSZXNpemVTdG9wKHNlZywgZXYpOwoJCQkJfQoJCQkJaWYgKHJlc2l6ZUxvY2F0aW9uKSB7IC8vIHZhbGlkIGRhdGUgdG8gcmVzaXplIHRvPwoJCQkJCXZpZXcucmVwb3J0RXZlbnRSZXNpemUoZXZlbnQsIHJlc2l6ZUxvY2F0aW9uLCB0aGlzLmxhcmdlVW5pdCwgZWwsIGV2KTsKCQkJCX0KCQkJCV90aGlzLnNlZ1Jlc2l6ZUxpc3RlbmVyID0gbnVsbDsKCQkJfQoJCX0pOwoKCQlyZXR1cm4gZHJhZ0xpc3RlbmVyOwoJfSwKCgoJLy8gQ2FsbGVkIGJlZm9yZSBldmVudCBzZWdtZW50IHJlc2l6aW5nIHN0YXJ0cwoJc2VnUmVzaXplU3RhcnQ6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQl0aGlzLmlzUmVzaXppbmdTZWcgPSB0cnVlOwoJCXRoaXMudmlldy50cmlnZ2VyKCdldmVudFJlc2l6ZVN0YXJ0Jywgc2VnLmVsWzBdLCBzZWcuZXZlbnQsIGV2LCB7fSk7IC8vIGxhc3QgYXJndW1lbnQgaXMganF1aSBkdW1teQoJfSwKCgoJLy8gQ2FsbGVkIGFmdGVyIGV2ZW50IHNlZ21lbnQgcmVzaXppbmcgc3RvcHMKCXNlZ1Jlc2l6ZVN0b3A6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQl0aGlzLmlzUmVzaXppbmdTZWcgPSBmYWxzZTsKCQl0aGlzLnZpZXcudHJpZ2dlcignZXZlbnRSZXNpemVTdG9wJywgc2VnLmVsWzBdLCBzZWcuZXZlbnQsIGV2LCB7fSk7IC8vIGxhc3QgYXJndW1lbnQgaXMganF1aSBkdW1teQoJfSwKCgoJLy8gUmV0dXJucyBuZXcgZGF0ZS1pbmZvcm1hdGlvbiBmb3IgYW4gZXZlbnQgc2VnbWVudCBiZWluZyByZXNpemVkIGZyb20gaXRzIHN0YXJ0Cgljb21wdXRlRXZlbnRTdGFydFJlc2l6ZTogZnVuY3Rpb24oc3RhcnRTcGFuLCBlbmRTcGFuLCBldmVudCkgewoJCXJldHVybiB0aGlzLmNvbXB1dGVFdmVudFJlc2l6ZSgnc3RhcnQnLCBzdGFydFNwYW4sIGVuZFNwYW4sIGV2ZW50KTsKCX0sCgoKCS8vIFJldHVybnMgbmV3IGRhdGUtaW5mb3JtYXRpb24gZm9yIGFuIGV2ZW50IHNlZ21lbnQgYmVpbmcgcmVzaXplZCBmcm9tIGl0cyBlbmQKCWNvbXB1dGVFdmVudEVuZFJlc2l6ZTogZnVuY3Rpb24oc3RhcnRTcGFuLCBlbmRTcGFuLCBldmVudCkgewoJCXJldHVybiB0aGlzLmNvbXB1dGVFdmVudFJlc2l6ZSgnZW5kJywgc3RhcnRTcGFuLCBlbmRTcGFuLCBldmVudCk7Cgl9LAoKCgkvLyBSZXR1cm5zIG5ldyB6b25lZCBkYXRlIGluZm9ybWF0aW9uIGZvciBhbiBldmVudCBzZWdtZW50IGJlaW5nIHJlc2l6ZWQgZnJvbSBpdHMgc3RhcnQgT1IgZW5kCgkvLyBgdHlwZWAgaXMgZWl0aGVyICdzdGFydCcgb3IgJ2VuZCcuCgkvLyBET0VTIE5PVCBjb25zaWRlciBvdmVybGFwL2NvbnN0cmFpbnQuCgljb21wdXRlRXZlbnRSZXNpemU6IGZ1bmN0aW9uKHR5cGUsIHN0YXJ0U3BhbiwgZW5kU3BhbiwgZXZlbnQpIHsKCQl2YXIgY2FsZW5kYXIgPSB0aGlzLnZpZXcuY2FsZW5kYXI7CgkJdmFyIGRlbHRhID0gdGhpcy5kaWZmRGF0ZXMoZW5kU3Bhblt0eXBlXSwgc3RhcnRTcGFuW3R5cGVdKTsKCQl2YXIgcmVzaXplTG9jYXRpb247IC8vIHpvbmVkIGV2ZW50IGRhdGUgcHJvcGVydGllcwoJCXZhciBkZWZhdWx0RHVyYXRpb247CgoJCS8vIGJ1aWxkIG9yaWdpbmFsIHZhbHVlcyB0byB3b3JrIGZyb20sIGd1YXJhbnRlZWluZyBhIHN0YXJ0IGFuZCBlbmQKCQlyZXNpemVMb2NhdGlvbiA9IHsKCQkJc3RhcnQ6IGV2ZW50LnN0YXJ0LmNsb25lKCksCgkJCWVuZDogY2FsZW5kYXIuZ2V0RXZlbnRFbmQoZXZlbnQpLAoJCQlhbGxEYXk6IGV2ZW50LmFsbERheQoJCX07CgoJCS8vIGlmIGFuIGFsbC1kYXkgZXZlbnQgd2FzIGluIGEgdGltZWQgYXJlYSBhbmQgd2FzIHJlc2l6ZWQgdG8gYSB0aW1lLCBhZGp1c3Qgc3RhcnQvZW5kIHRvIGhhdmUgdGltZXMKCQlpZiAocmVzaXplTG9jYXRpb24uYWxsRGF5ICYmIGR1cmF0aW9uSGFzVGltZShkZWx0YSkpIHsKCQkJcmVzaXplTG9jYXRpb24uYWxsRGF5ID0gZmFsc2U7CgkJCWNhbGVuZGFyLm5vcm1hbGl6ZUV2ZW50VGltZXMocmVzaXplTG9jYXRpb24pOwoJCX0KCgkJcmVzaXplTG9jYXRpb25bdHlwZV0uYWRkKGRlbHRhKTsgLy8gYXBwbHkgZGVsdGEgdG8gc3RhcnQgb3IgZW5kCgoJCS8vIGlmIHRoZSBldmVudCB3YXMgY29tcHJlc3NlZCB0b28gc21hbGwsIGZpbmQgYSBuZXcgcmVhc29uYWJsZSBkdXJhdGlvbiBmb3IgaXQKCQlpZiAoIXJlc2l6ZUxvY2F0aW9uLnN0YXJ0LmlzQmVmb3JlKHJlc2l6ZUxvY2F0aW9uLmVuZCkpIHsKCgkJCWRlZmF1bHREdXJhdGlvbiA9CgkJCQl0aGlzLm1pblJlc2l6ZUR1cmF0aW9uIHx8IC8vIFRPRE86IGhhY2sKCQkJCShldmVudC5hbGxEYXkgPwoJCQkJCWNhbGVuZGFyLmRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uIDoKCQkJCQljYWxlbmRhci5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uKTsKCgkJCWlmICh0eXBlID09ICdzdGFydCcpIHsgLy8gcmVzaXppbmcgdGhlIHN0YXJ0PwoJCQkJcmVzaXplTG9jYXRpb24uc3RhcnQgPSByZXNpemVMb2NhdGlvbi5lbmQuY2xvbmUoKS5zdWJ0cmFjdChkZWZhdWx0RHVyYXRpb24pOwoJCQl9CgkJCWVsc2UgeyAvLyByZXNpemluZyB0aGUgZW5kPwoJCQkJcmVzaXplTG9jYXRpb24uZW5kID0gcmVzaXplTG9jYXRpb24uc3RhcnQuY2xvbmUoKS5hZGQoZGVmYXVsdER1cmF0aW9uKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJlc2l6ZUxvY2F0aW9uOwoJfSwKCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IGJlaW5nIHJlc2l6ZWQuCgkvLyBgcmFuZ2VgIGhhcyB0aGUgdXBkYXRlZCBkYXRlcyBvZiB0aGUgZXZlbnQuIGBzZWdgIGlzIHRoZSBvcmlnaW5hbCBzZWdtZW50IG9iamVjdCBpbnZvbHZlZCBpbiB0aGUgZHJhZy4KCS8vIE11c3QgcmV0dXJuIGVsZW1lbnRzIHVzZWQgZm9yIGFueSBtb2NrIGV2ZW50cy4KCXJlbmRlckV2ZW50UmVzaXplOiBmdW5jdGlvbihyYW5nZSwgc2VnKSB7CgkJLy8gc3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudAoJfSwKCgoJLy8gVW5yZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYW4gZXZlbnQgYmVpbmcgcmVzaXplZC4KCXVucmVuZGVyRXZlbnRSZXNpemU6IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQKCX0sCgoKCS8qIFJlbmRlcmluZyBVdGlscwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQ29tcHV0ZSB0aGUgdGV4dCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gYW4gZXZlbnQncyBlbGVtZW50LgoJLy8gYHJhbmdlYCBjYW4gYmUgdGhlIEV2ZW50IG9iamVjdCBpdHNlbGYsIG9yIHNvbWV0aGluZyByYW5nZS1saWtlLCB3aXRoIGF0IGxlYXN0IGEgYHN0YXJ0YC4KCS8vIElmIGV2ZW50IHRpbWVzIGFyZSBkaXNhYmxlZCwgb3IgdGhlIGV2ZW50IGhhcyBubyB0aW1lLCB3aWxsIHJldHVybiBhIGJsYW5rIHN0cmluZy4KCS8vIElmIG5vdCBzcGVjaWZpZWQsIGZvcm1hdFN0ciB3aWxsIGRlZmF1bHQgdG8gdGhlIGV2ZW50VGltZUZvcm1hdCBzZXR0aW5nLAoJLy8gYW5kIGRpc3BsYXlFbmQgd2lsbCBkZWZhdWx0IHRvIHRoZSBkaXNwbGF5RXZlbnRFbmQgc2V0dGluZy4KCWdldEV2ZW50VGltZVRleHQ6IGZ1bmN0aW9uKHJhbmdlLCBmb3JtYXRTdHIsIGRpc3BsYXlFbmQpIHsKCgkJaWYgKGZvcm1hdFN0ciA9PSBudWxsKSB7CgkJCWZvcm1hdFN0ciA9IHRoaXMuZXZlbnRUaW1lRm9ybWF0OwoJCX0KCgkJaWYgKGRpc3BsYXlFbmQgPT0gbnVsbCkgewoJCQlkaXNwbGF5RW5kID0gdGhpcy5kaXNwbGF5RXZlbnRFbmQ7CgkJfQoKCQlpZiAodGhpcy5kaXNwbGF5RXZlbnRUaW1lICYmIHJhbmdlLnN0YXJ0Lmhhc1RpbWUoKSkgewoJCQlpZiAoZGlzcGxheUVuZCAmJiByYW5nZS5lbmQpIHsKCQkJCXJldHVybiB0aGlzLnZpZXcuZm9ybWF0UmFuZ2UocmFuZ2UsIGZvcm1hdFN0cik7CgkJCX0KCQkJZWxzZSB7CgkJCQlyZXR1cm4gcmFuZ2Uuc3RhcnQuZm9ybWF0KGZvcm1hdFN0cik7CgkJCX0KCQl9CgoJCXJldHVybiAnJzsKCX0sCgoKCS8vIEdlbmVyaWMgdXRpbGl0eSBmb3IgZ2VuZXJhdGluZyB0aGUgSFRNTCBjbGFzc05hbWVzIGZvciBhbiBldmVudCBzZWdtZW50J3MgZWxlbWVudAoJZ2V0U2VnQ2xhc3NlczogZnVuY3Rpb24oc2VnLCBpc0RyYWdnYWJsZSwgaXNSZXNpemFibGUpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgY2xhc3NlcyA9IFsKCQkJJ2ZjLWV2ZW50JywKCQkJc2VnLmlzU3RhcnQgPyAnZmMtc3RhcnQnIDogJ2ZjLW5vdC1zdGFydCcsCgkJCXNlZy5pc0VuZCA/ICdmYy1lbmQnIDogJ2ZjLW5vdC1lbmQnCgkJXS5jb25jYXQodGhpcy5nZXRTZWdDdXN0b21DbGFzc2VzKHNlZykpOwoKCQlpZiAoaXNEcmFnZ2FibGUpIHsKCQkJY2xhc3Nlcy5wdXNoKCdmYy1kcmFnZ2FibGUnKTsKCQl9CgkJaWYgKGlzUmVzaXphYmxlKSB7CgkJCWNsYXNzZXMucHVzaCgnZmMtcmVzaXphYmxlJyk7CgkJfQoKCQkvLyBldmVudCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQ/IGF0dGFjaCBhIGNsYXNzTmFtZS4KCQlpZiAodmlldy5pc0V2ZW50U2VsZWN0ZWQoc2VnLmV2ZW50KSkgewoJCQljbGFzc2VzLnB1c2goJ2ZjLXNlbGVjdGVkJyk7CgkJfQoKCQlyZXR1cm4gY2xhc3NlczsKCX0sCgoKCS8vIExpc3Qgb2YgY2xhc3NlcyB0aGF0IHdlcmUgZGVmaW5lZCBieSB0aGUgY2FsbGVyIG9mIHRoZSBBUEkgaW4gc29tZSB3YXkKCWdldFNlZ0N1c3RvbUNsYXNzZXM6IGZ1bmN0aW9uKHNlZykgewoJCXZhciBldmVudCA9IHNlZy5ldmVudDsKCgkJcmV0dXJuIFtdLmNvbmNhdCgKCQkJZXZlbnQuY2xhc3NOYW1lLCAvLyBndWFyYW50ZWVkIHRvIGJlIGFuIGFycmF5CgkJCWV2ZW50LnNvdXJjZSA/IGV2ZW50LnNvdXJjZS5jbGFzc05hbWUgOiBbXQoJCSk7Cgl9LAoKCgkvLyBVdGlsaXR5IGZvciBnZW5lcmF0aW5nIGV2ZW50IHNraW4tcmVsYXRlZCBDU1MgcHJvcGVydGllcwoJZ2V0U2VnU2tpbkNzczogZnVuY3Rpb24oc2VnKSB7CgkJcmV0dXJuIHsKCQkJJ2JhY2tncm91bmQtY29sb3InOiB0aGlzLmdldFNlZ0JhY2tncm91bmRDb2xvcihzZWcpLAoJCQknYm9yZGVyLWNvbG9yJzogdGhpcy5nZXRTZWdCb3JkZXJDb2xvcihzZWcpLAoJCQljb2xvcjogdGhpcy5nZXRTZWdUZXh0Q29sb3Ioc2VnKQoJCX07Cgl9LAoKCgkvLyBRdWVyaWVzIGZvciBjYWxsZXItc3BlY2lmaWVkIGNvbG9yLCB0aGVuIGZhbGxzIGJhY2sgdG8gZGVmYXVsdAoJZ2V0U2VnQmFja2dyb3VuZENvbG9yOiBmdW5jdGlvbihzZWcpIHsKCQlyZXR1cm4gc2VnLmV2ZW50LmJhY2tncm91bmRDb2xvciB8fAoJCQlzZWcuZXZlbnQuY29sb3IgfHwKCQkJdGhpcy5nZXRTZWdEZWZhdWx0QmFja2dyb3VuZENvbG9yKHNlZyk7Cgl9LAoKCglnZXRTZWdEZWZhdWx0QmFja2dyb3VuZENvbG9yOiBmdW5jdGlvbihzZWcpIHsKCQl2YXIgc291cmNlID0gc2VnLmV2ZW50LnNvdXJjZSB8fCB7fTsKCgkJcmV0dXJuIHNvdXJjZS5iYWNrZ3JvdW5kQ29sb3IgfHwKCQkJc291cmNlLmNvbG9yIHx8CgkJCXRoaXMudmlldy5vcHQoJ2V2ZW50QmFja2dyb3VuZENvbG9yJykgfHwKCQkJdGhpcy52aWV3Lm9wdCgnZXZlbnRDb2xvcicpOwoJfSwKCgoJLy8gUXVlcmllcyBmb3IgY2FsbGVyLXNwZWNpZmllZCBjb2xvciwgdGhlbiBmYWxscyBiYWNrIHRvIGRlZmF1bHQKCWdldFNlZ0JvcmRlckNvbG9yOiBmdW5jdGlvbihzZWcpIHsKCQlyZXR1cm4gc2VnLmV2ZW50LmJvcmRlckNvbG9yIHx8CgkJCXNlZy5ldmVudC5jb2xvciB8fAoJCQl0aGlzLmdldFNlZ0RlZmF1bHRCb3JkZXJDb2xvcihzZWcpOwoJfSwKCgoJZ2V0U2VnRGVmYXVsdEJvcmRlckNvbG9yOiBmdW5jdGlvbihzZWcpIHsKCQl2YXIgc291cmNlID0gc2VnLmV2ZW50LnNvdXJjZSB8fCB7fTsKCgkJcmV0dXJuIHNvdXJjZS5ib3JkZXJDb2xvciB8fAoJCQlzb3VyY2UuY29sb3IgfHwKCQkJdGhpcy52aWV3Lm9wdCgnZXZlbnRCb3JkZXJDb2xvcicpIHx8CgkJCXRoaXMudmlldy5vcHQoJ2V2ZW50Q29sb3InKTsKCX0sCgoKCS8vIFF1ZXJpZXMgZm9yIGNhbGxlci1zcGVjaWZpZWQgY29sb3IsIHRoZW4gZmFsbHMgYmFjayB0byBkZWZhdWx0CglnZXRTZWdUZXh0Q29sb3I6IGZ1bmN0aW9uKHNlZykgewoJCXJldHVybiBzZWcuZXZlbnQudGV4dENvbG9yIHx8CgkJCXRoaXMuZ2V0U2VnRGVmYXVsdFRleHRDb2xvcihzZWcpOwoJfSwKCgoJZ2V0U2VnRGVmYXVsdFRleHRDb2xvcjogZnVuY3Rpb24oc2VnKSB7CgkJdmFyIHNvdXJjZSA9IHNlZy5ldmVudC5zb3VyY2UgfHwge307CgoJCXJldHVybiBzb3VyY2UudGV4dENvbG9yIHx8CgkJCXRoaXMudmlldy5vcHQoJ2V2ZW50VGV4dENvbG9yJyk7Cgl9LAoKCgkvKiBDb252ZXJ0aW5nIGV2ZW50cyAtPiBldmVudFJhbmdlIC0+IGV2ZW50U3BhbiAtPiBldmVudFNlZ3MKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEdlbmVyYXRlcyBhbiBhcnJheSBvZiBzZWdtZW50cyBmb3IgdGhlIGdpdmVuIHNpbmdsZSBldmVudAoJLy8gQ2FuIGFjY2VwdCBhbiBldmVudCAibG9jYXRpb24iIGFzIHdlbGwgKHdoaWNoIG9ubHkgaGFzIHN0YXJ0L2VuZCBhbmQgbm8gYWxsRGF5KQoJZXZlbnRUb1NlZ3M6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIHRoaXMuZXZlbnRzVG9TZWdzKFsgZXZlbnQgXSk7Cgl9LAoKCglldmVudFRvU3BhbjogZnVuY3Rpb24oZXZlbnQpIHsKCQlyZXR1cm4gdGhpcy5ldmVudFRvU3BhbnMoZXZlbnQpWzBdOwoJfSwKCgoJLy8gR2VuZXJhdGVzIHNwYW5zIChhbHdheXMgdW56b25lZCkgZm9yIHRoZSBnaXZlbiBldmVudC4KCS8vIERvZXMgbm90IGRvIGFueSBpbnZlcnRpbmcgZm9yIGludmVyc2UtYmFja2dyb3VuZCBldmVudHMuCgkvLyBDYW4gYWNjZXB0IGFuIGV2ZW50ICJsb2NhdGlvbiIgYXMgd2VsbCAod2hpY2ggb25seSBoYXMgc3RhcnQvZW5kIGFuZCBubyBhbGxEYXkpCglldmVudFRvU3BhbnM6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIHJhbmdlID0gdGhpcy5ldmVudFRvUmFuZ2UoZXZlbnQpOwoJCXJldHVybiB0aGlzLmV2ZW50UmFuZ2VUb1NwYW5zKHJhbmdlLCBldmVudCk7Cgl9LAoKCgoJLy8gQ29udmVydHMgYW4gYXJyYXkgb2YgZXZlbnQgb2JqZWN0cyBpbnRvIGFuIGFycmF5IG9mIGV2ZW50IHNlZ21lbnQgb2JqZWN0cy4KCS8vIEEgY3VzdG9tIGBzZWdTbGljZUZ1bmNgIG1heSBiZSBnaXZlbiBmb3IgYXJiaXRyYXJpbHkgc2xpY2luZyB1cCBldmVudHMuCgkvLyBEb2Vzbid0IGd1YXJhbnRlZSBhbiBvcmRlciBmb3IgdGhlIHJlc3VsdGluZyBhcnJheS4KCWV2ZW50c1RvU2VnczogZnVuY3Rpb24oYWxsRXZlbnRzLCBzZWdTbGljZUZ1bmMpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoJCXZhciBldmVudHNCeUlkID0gZ3JvdXBFdmVudHNCeUlkKGFsbEV2ZW50cyk7CgkJdmFyIHNlZ3MgPSBbXTsKCgkJJC5lYWNoKGV2ZW50c0J5SWQsIGZ1bmN0aW9uKGlkLCBldmVudHMpIHsKCQkJdmFyIHJhbmdlcyA9IFtdOwoJCQl2YXIgaTsKCgkJCWZvciAoaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKCQkJCXJhbmdlcy5wdXNoKF90aGlzLmV2ZW50VG9SYW5nZShldmVudHNbaV0pKTsKCQkJfQoKCQkJLy8gaW52ZXJzZS1iYWNrZ3JvdW5kIGV2ZW50cyAodXRpbGl6ZSBvbmx5IHRoZSBmaXJzdCBldmVudCBpbiBjYWxjdWxhdGlvbnMpCgkJCWlmIChpc0ludmVyc2VCZ0V2ZW50KGV2ZW50c1swXSkpIHsKCQkJCXJhbmdlcyA9IF90aGlzLmludmVydFJhbmdlcyhyYW5nZXMpOwoKCQkJCWZvciAoaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKCQkJCQlzZWdzLnB1c2guYXBwbHkoc2VncywgLy8gYXBwZW5kIHRvCgkJCQkJCV90aGlzLmV2ZW50UmFuZ2VUb1NlZ3MocmFuZ2VzW2ldLCBldmVudHNbMF0sIHNlZ1NsaWNlRnVuYykpOwoJCQkJfQoJCQl9CgkJCS8vIG5vcm1hbCBldmVudCByYW5nZXMKCQkJZWxzZSB7CgkJCQlmb3IgKGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CgkJCQkJc2Vncy5wdXNoLmFwcGx5KHNlZ3MsIC8vIGFwcGVuZCB0bwoJCQkJCQlfdGhpcy5ldmVudFJhbmdlVG9TZWdzKHJhbmdlc1tpXSwgZXZlbnRzW2ldLCBzZWdTbGljZUZ1bmMpKTsKCQkJCX0KCQkJfQoJCX0pOwoKCQlyZXR1cm4gc2VnczsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgdW56b25lZCBzdGFydC9lbmQgZGF0ZXMgYW4gZXZlbnQgYXBwZWFycyB0byBvY2N1cHkKCS8vIENhbiBhY2NlcHQgYW4gZXZlbnQgImxvY2F0aW9uIiBhcyB3ZWxsICh3aGljaCBvbmx5IGhhcyBzdGFydC9lbmQgYW5kIG5vIGFsbERheSkKCWV2ZW50VG9SYW5nZTogZnVuY3Rpb24oZXZlbnQpIHsKCQl2YXIgY2FsZW5kYXIgPSB0aGlzLnZpZXcuY2FsZW5kYXI7CgkJdmFyIHN0YXJ0ID0gZXZlbnQuc3RhcnQuY2xvbmUoKS5zdHJpcFpvbmUoKTsKCQl2YXIgZW5kID0gKAoJCQkJZXZlbnQuZW5kID8KCQkJCQlldmVudC5lbmQuY2xvbmUoKSA6CgkJCQkJLy8gZGVyaXZlIHRoZSBlbmQgZnJvbSB0aGUgc3RhcnQgYW5kIGFsbERheS4gY29tcHV0ZSBhbGxEYXkgaWYgbmVjZXNzYXJ5CgkJCQkJY2FsZW5kYXIuZ2V0RGVmYXVsdEV2ZW50RW5kKAoJCQkJCQlldmVudC5hbGxEYXkgIT0gbnVsbCA/CgkJCQkJCQlldmVudC5hbGxEYXkgOgoJCQkJCQkJIWV2ZW50LnN0YXJ0Lmhhc1RpbWUoKSwKCQkJCQkJZXZlbnQuc3RhcnQKCQkJCQkpCgkJCSkuc3RyaXBab25lKCk7CgoJCS8vIGhhY2s6IGR5bmFtaWMgbG9jYWxlIGNoYW5nZSBmb3JnZXRzIHRvIHVwYXRlIHN0b3JlZCBldmVudCBsb2NhbGVkCgkJY2FsZW5kYXIubG9jYWxpemVNb21lbnQoc3RhcnQpOwoJCWNhbGVuZGFyLmxvY2FsaXplTW9tZW50KGVuZCk7CgoJCXJldHVybiB7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfTsKCX0sCgoKCS8vIEdpdmVuIGFuIGV2ZW50J3MgcmFuZ2UgKHVuem9uZWQgc3RhcnQvZW5kKSwgYW5kIHRoZSBldmVudCBpdHNlbGYsCgkvLyBzbGljZSBpbnRvIHNlZ21lbnRzICh1c2luZyB0aGUgc2VnU2xpY2VGdW5jIGZ1bmN0aW9uIGlmIHNwZWNpZmllZCkKCWV2ZW50UmFuZ2VUb1NlZ3M6IGZ1bmN0aW9uKHJhbmdlLCBldmVudCwgc2VnU2xpY2VGdW5jKSB7CgkJdmFyIHNwYW5zID0gdGhpcy5ldmVudFJhbmdlVG9TcGFucyhyYW5nZSwgZXZlbnQpOwoJCXZhciBzZWdzID0gW107CgkJdmFyIGk7CgoJCWZvciAoaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgewoJCQlzZWdzLnB1c2guYXBwbHkoc2VncywgLy8gYXBwZW5kIHRvCgkJCQl0aGlzLmV2ZW50U3BhblRvU2VncyhzcGFuc1tpXSwgZXZlbnQsIHNlZ1NsaWNlRnVuYykpOwoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCgkvLyBHaXZlbiBhbiBldmVudCdzIHVuem9uZWQgZGF0ZSByYW5nZSwgcmV0dXJuIGFuIGFycmF5IG9mICJzcGFuIiBvYmplY3RzLgoJLy8gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUuCglldmVudFJhbmdlVG9TcGFuczogZnVuY3Rpb24ocmFuZ2UsIGV2ZW50KSB7CgkJcmV0dXJuIFsgJC5leHRlbmQoe30sIHJhbmdlKSBdOyAvLyBjb3B5IGludG8gYSBzaW5nbGUtaXRlbSBhcnJheQoJfSwKCgoJLy8gR2l2ZW4gYW4gZXZlbnQncyBzcGFuICh1bnpvbmVkIHN0YXJ0L2VuZCBhbmQgb3RoZXIgbWlzYyBkYXRhKSwgYW5kIHRoZSBldmVudCBpdHNlbGYsCgkvLyBzbGljZXMgaW50byBzZWdtZW50cyBhbmQgYXR0YWNoZXMgZXZlbnQtZGVyaXZlZCBwcm9wZXJ0aWVzIHRvIHRoZW0uCglldmVudFNwYW5Ub1NlZ3M6IGZ1bmN0aW9uKHNwYW4sIGV2ZW50LCBzZWdTbGljZUZ1bmMpIHsKCQl2YXIgc2VncyA9IHNlZ1NsaWNlRnVuYyA/IHNlZ1NsaWNlRnVuYyhzcGFuKSA6IHRoaXMuc3BhblRvU2VncyhzcGFuKTsKCQl2YXIgaSwgc2VnOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQlzZWcgPSBzZWdzW2ldOwoJCQlzZWcuZXZlbnQgPSBldmVudDsKCQkJc2VnLmV2ZW50U3RhcnRNUyA9ICtzcGFuLnN0YXJ0OyAvLyBUT0RPOiBub3QgdGhlIGJlc3QgbmFtZSBhZnRlciBtYWtpbmcgc3BhbnMgdW56b25lZAoJCQlzZWcuZXZlbnREdXJhdGlvbk1TID0gc3Bhbi5lbmQgLSBzcGFuLnN0YXJ0OwoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCgkvLyBQcm9kdWNlcyBhIG5ldyBhcnJheSBvZiByYW5nZSBvYmplY3RzIHRoYXQgd2lsbCBjb3ZlciBhbGwgdGhlIHRpbWUgTk9UIGNvdmVyZWQgYnkgdGhlIGdpdmVuIHJhbmdlcy4KCS8vIFNJREUgRUZGRUNUOiB3aWxsIG11dGF0ZSB0aGUgZ2l2ZW4gYXJyYXkgYW5kIHdpbGwgdXNlIGl0cyBkYXRlIHJlZmVyZW5jZXMuCglpbnZlcnRSYW5nZXM6IGZ1bmN0aW9uKHJhbmdlcykgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciB2aWV3U3RhcnQgPSB2aWV3LnN0YXJ0LmNsb25lKCk7IC8vIG5lZWQgYSBjb3B5CgkJdmFyIHZpZXdFbmQgPSB2aWV3LmVuZC5jbG9uZSgpOyAvLyBuZWVkIGEgY29weQoJCXZhciBpbnZlcnNlUmFuZ2VzID0gW107CgkJdmFyIHN0YXJ0ID0gdmlld1N0YXJ0OyAvLyB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyByYW5nZS4gdGhlIHN0YXJ0IG9mIHRoZSBuZXcgcmFuZ2UKCQl2YXIgaSwgcmFuZ2U7CgoJCS8vIHJhbmdlcyBuZWVkIHRvIGJlIGluIG9yZGVyLiByZXF1aXJlZCBmb3Igb3VyIGRhdGUtd2Fsa2luZyBhbGdvcml0aG0KCQlyYW5nZXMuc29ydChjb21wYXJlUmFuZ2VzKTsKCgkJZm9yIChpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewoJCQlyYW5nZSA9IHJhbmdlc1tpXTsKCgkJCS8vIGFkZCB0aGUgc3BhbiBvZiB0aW1lIGJlZm9yZSB0aGUgZXZlbnQgKGlmIHRoZXJlIGlzIGFueSkKCQkJaWYgKHJhbmdlLnN0YXJ0ID4gc3RhcnQpIHsgLy8gY29tcGFyZSBtaWxsaXNlY29uZCB0aW1lIChza2lwIGFueSBhbWJpZyBsb2dpYykKCQkJCWludmVyc2VSYW5nZXMucHVzaCh7CgkJCQkJc3RhcnQ6IHN0YXJ0LAoJCQkJCWVuZDogcmFuZ2Uuc3RhcnQKCQkJCX0pOwoJCQl9CgoJCQlzdGFydCA9IHJhbmdlLmVuZDsKCQl9CgoJCS8vIGFkZCB0aGUgc3BhbiBvZiB0aW1lIGFmdGVyIHRoZSBsYXN0IGV2ZW50IChpZiB0aGVyZSBpcyBhbnkpCgkJaWYgKHN0YXJ0IDwgdmlld0VuZCkgeyAvLyBjb21wYXJlIG1pbGxpc2Vjb25kIHRpbWUgKHNraXAgYW55IGFtYmlnIGxvZ2ljKQoJCQlpbnZlcnNlUmFuZ2VzLnB1c2goewoJCQkJc3RhcnQ6IHN0YXJ0LAoJCQkJZW5kOiB2aWV3RW5kCgkJCX0pOwoJCX0KCgkJcmV0dXJuIGludmVyc2VSYW5nZXM7Cgl9LAoKCglzb3J0RXZlbnRTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgkJc2Vncy5zb3J0KHByb3h5KHRoaXMsICdjb21wYXJlRXZlbnRTZWdzJykpOwoJfSwKCgoJLy8gQSBjbXAgZnVuY3Rpb24gZm9yIGRldGVybWluaW5nIHdoaWNoIHNlZ21lbnRzIHNob3VsZCB0YWtlIHZpc3VhbCBwcmlvcml0eQoJY29tcGFyZUV2ZW50U2VnczogZnVuY3Rpb24oc2VnMSwgc2VnMikgewoJCXJldHVybiBzZWcxLmV2ZW50U3RhcnRNUyAtIHNlZzIuZXZlbnRTdGFydE1TIHx8IC8vIGVhcmxpZXIgZXZlbnRzIGdvIGZpcnN0CgkJCXNlZzIuZXZlbnREdXJhdGlvbk1TIC0gc2VnMS5ldmVudER1cmF0aW9uTVMgfHwgLy8gdGllPyBsb25nZXIgZXZlbnRzIGdvIGZpcnN0CgkJCXNlZzIuZXZlbnQuYWxsRGF5IC0gc2VnMS5ldmVudC5hbGxEYXkgfHwgLy8gdGllPyBwdXQgYWxsLWRheSBldmVudHMgZmlyc3QgKGJvb2xlYW5zIGNhc3QgdG8gMC8xKQoJCQljb21wYXJlQnlGaWVsZFNwZWNzKHNlZzEuZXZlbnQsIHNlZzIuZXZlbnQsIHRoaXMudmlldy5ldmVudE9yZGVyU3BlY3MpOwoJfQoKfSk7CgoKLyogVXRpbGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCmZ1bmN0aW9uIHBsdWNrRXZlbnREYXRlUHJvcHMoZXZlbnQpIHsKCXJldHVybiB7CgkJc3RhcnQ6IGV2ZW50LnN0YXJ0LmNsb25lKCksCgkJZW5kOiBldmVudC5lbmQgPyBldmVudC5lbmQuY2xvbmUoKSA6IG51bGwsCgkJYWxsRGF5OiBldmVudC5hbGxEYXkgLy8ga2VlcCBpdCB0aGUgc2FtZQoJfTsKfQpGQy5wbHVja0V2ZW50RGF0ZVByb3BzID0gcGx1Y2tFdmVudERhdGVQcm9wczsKCgpmdW5jdGlvbiBpc0JnRXZlbnQoZXZlbnQpIHsgLy8gcmV0dXJucyB0cnVlIGlmIGJhY2tncm91bmQgT1IgaW52ZXJzZS1iYWNrZ3JvdW5kCgl2YXIgcmVuZGVyaW5nID0gZ2V0RXZlbnRSZW5kZXJpbmcoZXZlbnQpOwoJcmV0dXJuIHJlbmRlcmluZyA9PT0gJ2JhY2tncm91bmQnIHx8IHJlbmRlcmluZyA9PT0gJ2ludmVyc2UtYmFja2dyb3VuZCc7Cn0KRkMuaXNCZ0V2ZW50ID0gaXNCZ0V2ZW50OyAvLyBleHBvcnQKCgpmdW5jdGlvbiBpc0ludmVyc2VCZ0V2ZW50KGV2ZW50KSB7CglyZXR1cm4gZ2V0RXZlbnRSZW5kZXJpbmcoZXZlbnQpID09PSAnaW52ZXJzZS1iYWNrZ3JvdW5kJzsKfQoKCmZ1bmN0aW9uIGdldEV2ZW50UmVuZGVyaW5nKGV2ZW50KSB7CglyZXR1cm4gZmlyc3REZWZpbmVkKChldmVudC5zb3VyY2UgfHwge30pLnJlbmRlcmluZywgZXZlbnQucmVuZGVyaW5nKTsKfQoKCmZ1bmN0aW9uIGdyb3VwRXZlbnRzQnlJZChldmVudHMpIHsKCXZhciBldmVudHNCeUlkID0ge307Cgl2YXIgaSwgZXZlbnQ7CgoJZm9yIChpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewoJCWV2ZW50ID0gZXZlbnRzW2ldOwoJCShldmVudHNCeUlkW2V2ZW50Ll9pZF0gfHwgKGV2ZW50c0J5SWRbZXZlbnQuX2lkXSA9IFtdKSkucHVzaChldmVudCk7Cgl9CgoJcmV0dXJuIGV2ZW50c0J5SWQ7Cn0KCgovLyBBIGNtcCBmdW5jdGlvbiBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggbm9uLWludmVydGVkICJyYW5nZXMiIChzZWUgYWJvdmUpIGhhcHBlbiBlYXJsaWVyCmZ1bmN0aW9uIGNvbXBhcmVSYW5nZXMocmFuZ2UxLCByYW5nZTIpIHsKCXJldHVybiByYW5nZTEuc3RhcnQgLSByYW5nZTIuc3RhcnQ7IC8vIGVhcmxpZXIgcmFuZ2VzIGdvIGZpcnN0Cn0KCgovKiBFeHRlcm5hbC1EcmFnZ2luZy1FbGVtZW50IERhdGEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovLyBSZXF1aXJlIGFsbCBIVE1MNSBkYXRhLSogYXR0cmlidXRlcyB1c2VkIGJ5IEZ1bGxDYWxlbmRhciB0byBoYXZlIHRoaXMgcHJlZml4LgovLyBBIHZhbHVlIG9mICcnIHdpbGwgcXVlcnkgYXR0cmlidXRlcyBsaWtlIGRhdGEtZXZlbnQuIEEgdmFsdWUgb2YgJ2ZjJyB3aWxsIHF1ZXJ5IGF0dHJpYnV0ZXMgbGlrZSBkYXRhLWZjLWV2ZW50LgpGQy5kYXRhQXR0clByZWZpeCA9ICcnOwoKLy8gR2l2ZW4gYSBqUXVlcnkgZWxlbWVudCB0aGF0IG1pZ2h0IHJlcHJlc2VudCBhIGRyYWdnZWQgRnVsbENhbGVuZGFyIGV2ZW50LCByZXR1cm5zIGFuIGludGVybWVkaWF0ZSBkYXRhIHN0cnVjdHVyZQovLyB0byBiZSB1c2VkIGZvciBFdmVudCBPYmplY3QgY3JlYXRpb24uCi8vIEEgZGVmaW5lZCBgLmV2ZW50UHJvcHNgLCBldmVuIHdoZW4gZW1wdHksIGluZGljYXRlcyB0aGF0IGFuIGV2ZW50IHNob3VsZCBiZSBjcmVhdGVkLgpmdW5jdGlvbiBnZXREcmFnZ2VkRWxNZXRhKGVsKSB7Cgl2YXIgcHJlZml4ID0gRkMuZGF0YUF0dHJQcmVmaXg7Cgl2YXIgZXZlbnRQcm9wczsgLy8gcHJvcGVydGllcyBmb3IgY3JlYXRpbmcgdGhlIGV2ZW50LCBub3QgcmVsYXRlZCB0byBkYXRlL3RpbWUKCXZhciBzdGFydFRpbWU7IC8vIGEgRHVyYXRpb24KCXZhciBkdXJhdGlvbjsKCXZhciBzdGljazsKCglpZiAocHJlZml4KSB7IHByZWZpeCArPSAnLSc7IH0KCWV2ZW50UHJvcHMgPSBlbC5kYXRhKHByZWZpeCArICdldmVudCcpIHx8IG51bGw7CgoJaWYgKGV2ZW50UHJvcHMpIHsKCQlpZiAodHlwZW9mIGV2ZW50UHJvcHMgPT09ICdvYmplY3QnKSB7CgkJCWV2ZW50UHJvcHMgPSAkLmV4dGVuZCh7fSwgZXZlbnRQcm9wcyk7IC8vIG1ha2UgYSBjb3B5CgkJfQoJCWVsc2UgeyAvLyBzb21ldGhpbmcgbGlrZSAxIG9yIHRydWUuIHN0aWxsIHNpZ25hbCBldmVudCBjcmVhdGlvbgoJCQlldmVudFByb3BzID0ge307CgkJfQoKCQkvLyBwbHVjayBzcGVjaWFsLWNhc2VkIGRhdGUvdGltZSBwcm9wZXJ0aWVzCgkJc3RhcnRUaW1lID0gZXZlbnRQcm9wcy5zdGFydDsKCQlpZiAoc3RhcnRUaW1lID09IG51bGwpIHsgc3RhcnRUaW1lID0gZXZlbnRQcm9wcy50aW1lOyB9IC8vIGFjY2VwdCAndGltZScgYXMgd2VsbAoJCWR1cmF0aW9uID0gZXZlbnRQcm9wcy5kdXJhdGlvbjsKCQlzdGljayA9IGV2ZW50UHJvcHMuc3RpY2s7CgkJZGVsZXRlIGV2ZW50UHJvcHMuc3RhcnQ7CgkJZGVsZXRlIGV2ZW50UHJvcHMudGltZTsKCQlkZWxldGUgZXZlbnRQcm9wcy5kdXJhdGlvbjsKCQlkZWxldGUgZXZlbnRQcm9wcy5zdGljazsKCX0KCgkvLyBmYWxsYmFjayB0byBzdGFuZGFsb25lIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIGRhdGUvdGltZSBwcm9wZXJ0aWVzCglpZiAoc3RhcnRUaW1lID09IG51bGwpIHsgc3RhcnRUaW1lID0gZWwuZGF0YShwcmVmaXggKyAnc3RhcnQnKTsgfQoJaWYgKHN0YXJ0VGltZSA9PSBudWxsKSB7IHN0YXJ0VGltZSA9IGVsLmRhdGEocHJlZml4ICsgJ3RpbWUnKTsgfSAvLyBhY2NlcHQgJ3RpbWUnIGFzIHdlbGwKCWlmIChkdXJhdGlvbiA9PSBudWxsKSB7IGR1cmF0aW9uID0gZWwuZGF0YShwcmVmaXggKyAnZHVyYXRpb24nKTsgfQoJaWYgKHN0aWNrID09IG51bGwpIHsgc3RpY2sgPSBlbC5kYXRhKHByZWZpeCArICdzdGljaycpOyB9CgoJLy8gbWFzc2FnZSBpbnRvIGNvcnJlY3QgZGF0YSB0eXBlcwoJc3RhcnRUaW1lID0gc3RhcnRUaW1lICE9IG51bGwgPyBtb21lbnQuZHVyYXRpb24oc3RhcnRUaW1lKSA6IG51bGw7CglkdXJhdGlvbiA9IGR1cmF0aW9uICE9IG51bGwgPyBtb21lbnQuZHVyYXRpb24oZHVyYXRpb24pIDogbnVsbDsKCXN0aWNrID0gQm9vbGVhbihzdGljayk7CgoJcmV0dXJuIHsgZXZlbnRQcm9wczogZXZlbnRQcm9wcywgc3RhcnRUaW1lOiBzdGFydFRpbWUsIGR1cmF0aW9uOiBkdXJhdGlvbiwgc3RpY2s6IHN0aWNrIH07Cn0KCgo7OwoKLyoKQSBzZXQgb2YgcmVuZGVyaW5nIGFuZCBkYXRlLXJlbGF0ZWQgbWV0aG9kcyBmb3IgYSB2aXN1YWwgY29tcG9uZW50IGNvbXByaXNlZCBvZiBvbmUgb3IgbW9yZSByb3dzIG9mIGRheSBjb2x1bW5zLgpQcmVyZXF1aXNpdGU6IHRoZSBvYmplY3QgYmVpbmcgbWl4ZWQgaW50byBuZWVkcyB0byBiZSBhICpHcmlkKgoqLwp2YXIgRGF5VGFibGVNaXhpbiA9IEZDLkRheVRhYmxlTWl4aW4gPSB7CgoJYnJlYWtPbldlZWtzOiBmYWxzZSwgLy8gc2hvdWxkIGNyZWF0ZSBhIG5ldyByb3cgZm9yIGVhY2ggd2Vlaz8KCWRheURhdGVzOiBudWxsLCAvLyB3aG9sZS1kYXkgZGF0ZXMgZm9yIGVhY2ggY29sdW1uLiBsZWZ0IHRvIHJpZ2h0CglkYXlJbmRpY2VzOiBudWxsLCAvLyBmb3IgZWFjaCBkYXkgZnJvbSBzdGFydCwgdGhlIG9mZnNldAoJZGF5c1BlclJvdzogbnVsbCwKCXJvd0NudDogbnVsbCwKCWNvbENudDogbnVsbCwKCWNvbEhlYWRGb3JtYXQ6IG51bGwsCgoKCS8vIFBvcHVsYXRlcyBpbnRlcm5hbCB2YXJpYWJsZXMgdXNlZCBmb3IgZGF0ZSBjYWxjdWxhdGlvbiBhbmQgcmVuZGVyaW5nCgl1cGRhdGVEYXlUYWJsZTogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGRhdGUgPSB0aGlzLnN0YXJ0LmNsb25lKCk7CgkJdmFyIGRheUluZGV4ID0gLTE7CgkJdmFyIGRheUluZGljZXMgPSBbXTsKCQl2YXIgZGF5RGF0ZXMgPSBbXTsKCQl2YXIgZGF5c1BlclJvdzsKCQl2YXIgZmlyc3REYXk7CgkJdmFyIHJvd0NudDsKCgkJd2hpbGUgKGRhdGUuaXNCZWZvcmUodGhpcy5lbmQpKSB7IC8vIGxvb3AgZWFjaCBkYXkgZnJvbSBzdGFydCB0byBlbmQKCQkJaWYgKHZpZXcuaXNIaWRkZW5EYXkoZGF0ZSkpIHsKCQkJCWRheUluZGljZXMucHVzaChkYXlJbmRleCArIDAuNSk7IC8vIG1hcmsgdGhhdCBpdCdzIGJldHdlZW4gaW5kaWNlcwoJCQl9CgkJCWVsc2UgewoJCQkJZGF5SW5kZXgrKzsKCQkJCWRheUluZGljZXMucHVzaChkYXlJbmRleCk7CgkJCQlkYXlEYXRlcy5wdXNoKGRhdGUuY2xvbmUoKSk7CgkJCX0KCQkJZGF0ZS5hZGQoMSwgJ2RheXMnKTsKCQl9CgoJCWlmICh0aGlzLmJyZWFrT25XZWVrcykgewoJCQkvLyBjb3VudCBjb2x1bW5zIHVudGlsIHRoZSBkYXktb2Ytd2VlayByZXBlYXRzCgkJCWZpcnN0RGF5ID0gZGF5RGF0ZXNbMF0uZGF5KCk7CgkJCWZvciAoZGF5c1BlclJvdyA9IDE7IGRheXNQZXJSb3cgPCBkYXlEYXRlcy5sZW5ndGg7IGRheXNQZXJSb3crKykgewoJCQkJaWYgKGRheURhdGVzW2RheXNQZXJSb3ddLmRheSgpID09IGZpcnN0RGF5KSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJcm93Q250ID0gTWF0aC5jZWlsKGRheURhdGVzLmxlbmd0aCAvIGRheXNQZXJSb3cpOwoJCX0KCQllbHNlIHsKCQkJcm93Q250ID0gMTsKCQkJZGF5c1BlclJvdyA9IGRheURhdGVzLmxlbmd0aDsKCQl9CgoJCXRoaXMuZGF5RGF0ZXMgPSBkYXlEYXRlczsKCQl0aGlzLmRheUluZGljZXMgPSBkYXlJbmRpY2VzOwoJCXRoaXMuZGF5c1BlclJvdyA9IGRheXNQZXJSb3c7CgkJdGhpcy5yb3dDbnQgPSByb3dDbnQ7CgkJCgkJdGhpcy51cGRhdGVEYXlUYWJsZUNvbHMoKTsKCX0sCgoKCS8vIENvbXB1dGVzIGFuZCBhc3NpZ25lZCB0aGUgY29sQ250IHByb3BlcnR5IGFuZCB1cGRhdGVzIGFueSBvcHRpb25zIHRoYXQgbWF5IGJlIGNvbXB1dGVkIGZyb20gaXQKCXVwZGF0ZURheVRhYmxlQ29sczogZnVuY3Rpb24oKSB7CgkJdGhpcy5jb2xDbnQgPSB0aGlzLmNvbXB1dGVDb2xDbnQoKTsKCQl0aGlzLmNvbEhlYWRGb3JtYXQgPSB0aGlzLnZpZXcub3B0KCdjb2x1bW5Gb3JtYXQnKSB8fCB0aGlzLmNvbXB1dGVDb2xIZWFkRm9ybWF0KCk7Cgl9LAoKCgkvLyBEZXRlcm1pbmVzIGhvdyBtYW55IGNvbHVtbnMgdGhlcmUgc2hvdWxkIGJlIGluIHRoZSB0YWJsZQoJY29tcHV0ZUNvbENudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZGF5c1BlclJvdzsKCX0sCgoKCS8vIENvbXB1dGVzIHRoZSBhbWJpZ3VvdXNseS10aW1lZCBtb21lbnQgZm9yIHRoZSBnaXZlbiBjZWxsCglnZXRDZWxsRGF0ZTogZnVuY3Rpb24ocm93LCBjb2wpIHsKCQlyZXR1cm4gdGhpcy5kYXlEYXRlc1sKCQkJCXRoaXMuZ2V0Q2VsbERheUluZGV4KHJvdywgY29sKQoJCQldLmNsb25lKCk7Cgl9LAoKCgkvLyBDb21wdXRlcyB0aGUgYW1iaWd1b3VzbHktdGltZWQgZGF0ZSByYW5nZSBmb3IgdGhlIGdpdmVuIGNlbGwKCWdldENlbGxSYW5nZTogZnVuY3Rpb24ocm93LCBjb2wpIHsKCQl2YXIgc3RhcnQgPSB0aGlzLmdldENlbGxEYXRlKHJvdywgY29sKTsKCQl2YXIgZW5kID0gc3RhcnQuY2xvbmUoKS5hZGQoMSwgJ2RheXMnKTsKCgkJcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9OwoJfSwKCgoJLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheSBjZWxscywgY2hyb25vbG9naWNhbGx5LCBmcm9tIHRoZSBmaXJzdCBvZiB0aGUgZ3JpZCAoMC1iYXNlZCkKCWdldENlbGxEYXlJbmRleDogZnVuY3Rpb24ocm93LCBjb2wpIHsKCQlyZXR1cm4gcm93ICogdGhpcy5kYXlzUGVyUm93ICsgdGhpcy5nZXRDb2xEYXlJbmRleChjb2wpOwoJfSwKCgoJLy8gUmV0dXJucyB0aGUgbnVtbmVyIG9mIGRheSBjZWxscywgY2hyb25vbG9naWNhbGx5LCBmcm9tIHRoZSBmaXJzdCBjZWxsIGluICphbnkgZ2l2ZW4gcm93KgoJZ2V0Q29sRGF5SW5kZXg6IGZ1bmN0aW9uKGNvbCkgewoJCWlmICh0aGlzLmlzUlRMKSB7CgkJCXJldHVybiB0aGlzLmNvbENudCAtIDEgLSBjb2w7CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gY29sOwoJCX0KCX0sCgoKCS8vIEdpdmVuIGEgZGF0ZSwgcmV0dXJucyBpdHMgY2hyb25vbG9jaWFsIGNlbGwtaW5kZXggZnJvbSB0aGUgZmlyc3QgY2VsbCBvZiB0aGUgZ3JpZC4KCS8vIElmIHRoZSBkYXRlIGxpZXMgYmV0d2VlbiBjZWxscyAoYmVjYXVzZSBvZiBoaWRkZW5EYXlzKSwgcmV0dXJucyBhIGZsb2F0aW5nLXBvaW50IHZhbHVlIGJldHdlZW4gb2Zmc2V0cy4KCS8vIElmIGJlZm9yZSB0aGUgZmlyc3Qgb2Zmc2V0LCByZXR1cm5zIGEgbmVnYXRpdmUgbnVtYmVyLgoJLy8gSWYgYWZ0ZXIgdGhlIGxhc3Qgb2Zmc2V0LCByZXR1cm5zIGFuIG9mZnNldCBwYXN0IHRoZSBsYXN0IGNlbGwgb2Zmc2V0LgoJLy8gT25seSB3b3JrcyBmb3IgKnN0YXJ0KiBkYXRlcyBvZiBjZWxscy4gV2lsbCBub3Qgd29yayBmb3IgZXhjbHVzaXZlIGVuZCBkYXRlcyBmb3IgY2VsbHMuCglnZXREYXRlRGF5SW5kZXg6IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgZGF5SW5kaWNlcyA9IHRoaXMuZGF5SW5kaWNlczsKCQl2YXIgZGF5T2Zmc2V0ID0gZGF0ZS5kaWZmKHRoaXMuc3RhcnQsICdkYXlzJyk7CgoJCWlmIChkYXlPZmZzZXQgPCAwKSB7CgkJCXJldHVybiBkYXlJbmRpY2VzWzBdIC0gMTsKCQl9CgkJZWxzZSBpZiAoZGF5T2Zmc2V0ID49IGRheUluZGljZXMubGVuZ3RoKSB7CgkJCXJldHVybiBkYXlJbmRpY2VzW2RheUluZGljZXMubGVuZ3RoIC0gMV0gKyAxOwoJCX0KCQllbHNlIHsKCQkJcmV0dXJuIGRheUluZGljZXNbZGF5T2Zmc2V0XTsKCQl9Cgl9LAoKCgkvKiBPcHRpb25zCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBDb21wdXRlcyBhIGRlZmF1bHQgY29sdW1uIGhlYWRlciBmb3JtYXR0aW5nIHN0cmluZyBpZiBgY29sRm9ybWF0YCBpcyBub3QgZXhwbGljaXRseSBkZWZpbmVkCgljb21wdXRlQ29sSGVhZEZvcm1hdDogZnVuY3Rpb24oKSB7CgkJLy8gaWYgbW9yZSB0aGFuIG9uZSB3ZWVrIHJvdywgb3IgaWYgdGhlcmUgYXJlIGEgbG90IG9mIGNvbHVtbnMgd2l0aCBub3QgbXVjaCBzcGFjZSwKCQkvLyBwdXQganVzdCB0aGUgZGF5IG51bWJlcnMgd2lsbCBiZSBpbiBlYWNoIGNlbGwKCQlpZiAodGhpcy5yb3dDbnQgPiAxIHx8IHRoaXMuY29sQ250ID4gMTApIHsKCQkJcmV0dXJuICdkZGQnOyAvLyAiU2F0IgoJCX0KCQkvLyBtdWx0aXBsZSBkYXlzLCBzbyBmdWxsIHNpbmdsZSBkYXRlIHN0cmluZyBXT04nVCBiZSBpbiB0aXRsZSB0ZXh0CgkJZWxzZSBpZiAodGhpcy5jb2xDbnQgPiAxKSB7CgkJCXJldHVybiB0aGlzLnZpZXcub3B0KCdkYXlPZk1vbnRoRm9ybWF0Jyk7IC8vICJTYXQgMTIvMTAiCgkJfQoJCS8vIHNpbmdsZSBkYXksIHNvIGZ1bGwgc2luZ2xlIGRhdGUgc3RyaW5nIHdpbGwgcHJvYmFibHkgYmUgaW4gdGl0bGUgdGV4dAoJCWVsc2UgewoJCQlyZXR1cm4gJ2RkZGQnOyAvLyAiU2F0dXJkYXkiCgkJfQoJfSwKCgoJLyogU2xpY2luZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gU2xpY2VzIHVwIGEgZGF0ZSByYW5nZSBpbnRvIGEgc2VnbWVudCBmb3IgZXZlcnkgd2Vlay1yb3cgaXQgaW50ZXJzZWN0cyB3aXRoCglzbGljZVJhbmdlQnlSb3c6IGZ1bmN0aW9uKHJhbmdlKSB7CgkJdmFyIGRheXNQZXJSb3cgPSB0aGlzLmRheXNQZXJSb3c7CgkJdmFyIG5vcm1hbFJhbmdlID0gdGhpcy52aWV3LmNvbXB1dGVEYXlSYW5nZShyYW5nZSk7IC8vIG1ha2Ugd2hvbGUtZGF5IHJhbmdlLCBjb25zaWRlcmluZyBuZXh0RGF5VGhyZXNob2xkCgkJdmFyIHJhbmdlRmlyc3QgPSB0aGlzLmdldERhdGVEYXlJbmRleChub3JtYWxSYW5nZS5zdGFydCk7IC8vIGluY2x1c2l2ZSBmaXJzdCBpbmRleAoJCXZhciByYW5nZUxhc3QgPSB0aGlzLmdldERhdGVEYXlJbmRleChub3JtYWxSYW5nZS5lbmQuY2xvbmUoKS5zdWJ0cmFjdCgxLCAnZGF5cycpKTsgLy8gaW5jbHVzaXZlIGxhc3QgaW5kZXgKCQl2YXIgc2VncyA9IFtdOwoJCXZhciByb3c7CgkJdmFyIHJvd0ZpcnN0LCByb3dMYXN0OyAvLyBpbmNsdXNpdmUgZGF5LWluZGV4IHJhbmdlIGZvciBjdXJyZW50IHJvdwoJCXZhciBzZWdGaXJzdCwgc2VnTGFzdDsgLy8gaW5jbHVzaXZlIGRheS1pbmRleCByYW5nZSBmb3Igc2VnbWVudAoKCQlmb3IgKHJvdyA9IDA7IHJvdyA8IHRoaXMucm93Q250OyByb3crKykgewoJCQlyb3dGaXJzdCA9IHJvdyAqIGRheXNQZXJSb3c7CgkJCXJvd0xhc3QgPSByb3dGaXJzdCArIGRheXNQZXJSb3cgLSAxOwoKCQkJLy8gaW50ZXJzZWN0IHNlZ21lbnQncyBvZmZzZXQgcmFuZ2Ugd2l0aCB0aGUgcm93J3MKCQkJc2VnRmlyc3QgPSBNYXRoLm1heChyYW5nZUZpcnN0LCByb3dGaXJzdCk7CgkJCXNlZ0xhc3QgPSBNYXRoLm1pbihyYW5nZUxhc3QsIHJvd0xhc3QpOwoKCQkJLy8gZGVhbCB3aXRoIGluLWJldHdlZW4gaW5kaWNlcwoJCQlzZWdGaXJzdCA9IE1hdGguY2VpbChzZWdGaXJzdCk7IC8vIGluLWJldHdlZW4gc3RhcnRzIHJvdW5kIHRvIG5leHQgY2VsbAoJCQlzZWdMYXN0ID0gTWF0aC5mbG9vcihzZWdMYXN0KTsgLy8gaW4tYmV0d2VlbiBlbmRzIHJvdW5kIHRvIHByZXYgY2VsbAoKCQkJaWYgKHNlZ0ZpcnN0IDw9IHNlZ0xhc3QpIHsgLy8gd2FzIHRoZXJlIGFueSBpbnRlcnNlY3Rpb24gd2l0aCB0aGUgY3VycmVudCByb3c/CgkJCQlzZWdzLnB1c2goewoJCQkJCXJvdzogcm93LAoKCQkJCQkvLyBub3JtYWxpemUgdG8gc3RhcnQgb2Ygcm93CgkJCQkJZmlyc3RSb3dEYXlJbmRleDogc2VnRmlyc3QgLSByb3dGaXJzdCwKCQkJCQlsYXN0Um93RGF5SW5kZXg6IHNlZ0xhc3QgLSByb3dGaXJzdCwKCgkJCQkJLy8gbXVzdCBiZSBtYXRjaGluZyBpbnRlZ2VycyB0byBiZSB0aGUgc2VnbWVudCdzIHN0YXJ0L2VuZAoJCQkJCWlzU3RhcnQ6IHNlZ0ZpcnN0ID09PSByYW5nZUZpcnN0LAoJCQkJCWlzRW5kOiBzZWdMYXN0ID09PSByYW5nZUxhc3QKCQkJCX0pOwoJCQl9CgkJfQoKCQlyZXR1cm4gc2VnczsKCX0sCgoKCS8vIFNsaWNlcyB1cCBhIGRhdGUgcmFuZ2UgaW50byBhIHNlZ21lbnQgZm9yIGV2ZXJ5IGRheS1jZWxsIGl0IGludGVyc2VjdHMgd2l0aC4KCS8vIFRPRE86IG1ha2UgbW9yZSBEUlkgd2l0aCBzbGljZVJhbmdlQnlSb3cgc29tZWhvdy4KCXNsaWNlUmFuZ2VCeURheTogZnVuY3Rpb24ocmFuZ2UpIHsKCQl2YXIgZGF5c1BlclJvdyA9IHRoaXMuZGF5c1BlclJvdzsKCQl2YXIgbm9ybWFsUmFuZ2UgPSB0aGlzLnZpZXcuY29tcHV0ZURheVJhbmdlKHJhbmdlKTsgLy8gbWFrZSB3aG9sZS1kYXkgcmFuZ2UsIGNvbnNpZGVyaW5nIG5leHREYXlUaHJlc2hvbGQKCQl2YXIgcmFuZ2VGaXJzdCA9IHRoaXMuZ2V0RGF0ZURheUluZGV4KG5vcm1hbFJhbmdlLnN0YXJ0KTsgLy8gaW5jbHVzaXZlIGZpcnN0IGluZGV4CgkJdmFyIHJhbmdlTGFzdCA9IHRoaXMuZ2V0RGF0ZURheUluZGV4KG5vcm1hbFJhbmdlLmVuZC5jbG9uZSgpLnN1YnRyYWN0KDEsICdkYXlzJykpOyAvLyBpbmNsdXNpdmUgbGFzdCBpbmRleAoJCXZhciBzZWdzID0gW107CgkJdmFyIHJvdzsKCQl2YXIgcm93Rmlyc3QsIHJvd0xhc3Q7IC8vIGluY2x1c2l2ZSBkYXktaW5kZXggcmFuZ2UgZm9yIGN1cnJlbnQgcm93CgkJdmFyIGk7CgkJdmFyIHNlZ0ZpcnN0LCBzZWdMYXN0OyAvLyBpbmNsdXNpdmUgZGF5LWluZGV4IHJhbmdlIGZvciBzZWdtZW50CgoJCWZvciAocm93ID0gMDsgcm93IDwgdGhpcy5yb3dDbnQ7IHJvdysrKSB7CgkJCXJvd0ZpcnN0ID0gcm93ICogZGF5c1BlclJvdzsKCQkJcm93TGFzdCA9IHJvd0ZpcnN0ICsgZGF5c1BlclJvdyAtIDE7CgoJCQlmb3IgKGkgPSByb3dGaXJzdDsgaSA8PSByb3dMYXN0OyBpKyspIHsKCgkJCQkvLyBpbnRlcnNlY3Qgc2VnbWVudCdzIG9mZnNldCByYW5nZSB3aXRoIHRoZSByb3cncwoJCQkJc2VnRmlyc3QgPSBNYXRoLm1heChyYW5nZUZpcnN0LCBpKTsKCQkJCXNlZ0xhc3QgPSBNYXRoLm1pbihyYW5nZUxhc3QsIGkpOwoKCQkJCS8vIGRlYWwgd2l0aCBpbi1iZXR3ZWVuIGluZGljZXMKCQkJCXNlZ0ZpcnN0ID0gTWF0aC5jZWlsKHNlZ0ZpcnN0KTsgLy8gaW4tYmV0d2VlbiBzdGFydHMgcm91bmQgdG8gbmV4dCBjZWxsCgkJCQlzZWdMYXN0ID0gTWF0aC5mbG9vcihzZWdMYXN0KTsgLy8gaW4tYmV0d2VlbiBlbmRzIHJvdW5kIHRvIHByZXYgY2VsbAoKCQkJCWlmIChzZWdGaXJzdCA8PSBzZWdMYXN0KSB7IC8vIHdhcyB0aGVyZSBhbnkgaW50ZXJzZWN0aW9uIHdpdGggdGhlIGN1cnJlbnQgcm93PwoJCQkJCXNlZ3MucHVzaCh7CgkJCQkJCXJvdzogcm93LAoKCQkJCQkJLy8gbm9ybWFsaXplIHRvIHN0YXJ0IG9mIHJvdwoJCQkJCQlmaXJzdFJvd0RheUluZGV4OiBzZWdGaXJzdCAtIHJvd0ZpcnN0LAoJCQkJCQlsYXN0Um93RGF5SW5kZXg6IHNlZ0xhc3QgLSByb3dGaXJzdCwKCgkJCQkJCS8vIG11c3QgYmUgbWF0Y2hpbmcgaW50ZWdlcnMgdG8gYmUgdGhlIHNlZ21lbnQncyBzdGFydC9lbmQKCQkJCQkJaXNTdGFydDogc2VnRmlyc3QgPT09IHJhbmdlRmlyc3QsCgkJCQkJCWlzRW5kOiBzZWdMYXN0ID09PSByYW5nZUxhc3QKCQkJCQl9KTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCgkvKiBIZWFkZXIgUmVuZGVyaW5nCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglyZW5kZXJIZWFkSHRtbDogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgoJCXJldHVybiAnJyArCgkJCSc8ZGl2IGNsYXNzPSJmYy1yb3cgJyArIHZpZXcud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIj4nICsKCQkJCSc8dGFibGU+JyArCgkJCQkJJzx0aGVhZD4nICsKCQkJCQkJdGhpcy5yZW5kZXJIZWFkVHJIdG1sKCkgKwoJCQkJCSc8L3RoZWFkPicgKwoJCQkJJzwvdGFibGU+JyArCgkJCSc8L2Rpdj4nOwoJfSwKCgoJcmVuZGVySGVhZEludHJvSHRtbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMucmVuZGVySW50cm9IdG1sKCk7IC8vIGZhbGwgYmFjayB0byBnZW5lcmljCgl9LAoKCglyZW5kZXJIZWFkVHJIdG1sOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gJycgKwoJCQknPHRyPicgKwoJCQkJKHRoaXMuaXNSVEwgPyAnJyA6IHRoaXMucmVuZGVySGVhZEludHJvSHRtbCgpKSArCgkJCQl0aGlzLnJlbmRlckhlYWREYXRlQ2VsbHNIdG1sKCkgKwoJCQkJKHRoaXMuaXNSVEwgPyB0aGlzLnJlbmRlckhlYWRJbnRyb0h0bWwoKSA6ICcnKSArCgkJCSc8L3RyPic7Cgl9LAoKCglyZW5kZXJIZWFkRGF0ZUNlbGxzSHRtbDogZnVuY3Rpb24oKSB7CgkJdmFyIGh0bWxzID0gW107CgkJdmFyIGNvbCwgZGF0ZTsKCgkJZm9yIChjb2wgPSAwOyBjb2wgPCB0aGlzLmNvbENudDsgY29sKyspIHsKCQkJZGF0ZSA9IHRoaXMuZ2V0Q2VsbERhdGUoMCwgY29sKTsKCQkJaHRtbHMucHVzaCh0aGlzLnJlbmRlckhlYWREYXRlQ2VsbEh0bWwoZGF0ZSkpOwoJCX0KCgkJcmV0dXJuIGh0bWxzLmpvaW4oJycpOwoJfSwKCgoJLy8gVE9ETzogd2hlbiBpbnRlcm5hbEFwaVZlcnNpb24sIGFjY2VwdCBhbiBvYmplY3QgZm9yIEhUTUwgYXR0cmlidXRlcwoJLy8gKGNvbHNwYW4gc2hvdWxkIGJlIG5vIGRpZmZlcmVudCkKCXJlbmRlckhlYWREYXRlQ2VsbEh0bWw6IGZ1bmN0aW9uKGRhdGUsIGNvbHNwYW4sIG90aGVyQXR0cnMpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCgkJcmV0dXJuICcnICsKCQkJJzx0aCBjbGFzcz0iZmMtZGF5LWhlYWRlciAnICsgdmlldy53aWRnZXRIZWFkZXJDbGFzcyArICcgZmMtJyArIGRheUlEc1tkYXRlLmRheSgpXSArICciJyArCgkJCQkodGhpcy5yb3dDbnQgPT09IDEgPwoJCQkJCScgZGF0YS1kYXRlPSInICsgZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSArICciJyA6CgkJCQkJJycpICsKCQkJCShjb2xzcGFuID4gMSA/CgkJCQkJJyBjb2xzcGFuPSInICsgY29sc3BhbiArICciJyA6CgkJCQkJJycpICsKCQkJCShvdGhlckF0dHJzID8KCQkJCQknICcgKyBvdGhlckF0dHJzIDoKCQkJCQknJykgKwoJCQkJJz4nICsKCQkJCS8vIGRvbid0IG1ha2UgYSBsaW5rIGlmIHRoZSBoZWFkaW5nIGNvdWxkIHJlcHJlc2VudCBtdWx0aXBsZSBkYXlzLCBvciBpZiB0aGVyZSdzIG9ubHkgb25lIGRheSAoZm9yY2VPZmYpCgkJCQl2aWV3LmJ1aWxkR290b0FuY2hvckh0bWwoCgkJCQkJeyBkYXRlOiBkYXRlLCBmb3JjZU9mZjogdGhpcy5yb3dDbnQgPiAxIHx8IHRoaXMuY29sQ250ID09PSAxIH0sCgkJCQkJaHRtbEVzY2FwZShkYXRlLmZvcm1hdCh0aGlzLmNvbEhlYWRGb3JtYXQpKSAvLyBpbm5lciBIVE1MCgkJCQkpICsKCQkJJzwvdGg+JzsKCX0sCgoKCS8qIEJhY2tncm91bmQgUmVuZGVyaW5nCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglyZW5kZXJCZ1RySHRtbDogZnVuY3Rpb24ocm93KSB7CgkJcmV0dXJuICcnICsKCQkJJzx0cj4nICsKCQkJCSh0aGlzLmlzUlRMID8gJycgOiB0aGlzLnJlbmRlckJnSW50cm9IdG1sKHJvdykpICsKCQkJCXRoaXMucmVuZGVyQmdDZWxsc0h0bWwocm93KSArCgkJCQkodGhpcy5pc1JUTCA/IHRoaXMucmVuZGVyQmdJbnRyb0h0bWwocm93KSA6ICcnKSArCgkJCSc8L3RyPic7Cgl9LAoKCglyZW5kZXJCZ0ludHJvSHRtbDogZnVuY3Rpb24ocm93KSB7CgkJcmV0dXJuIHRoaXMucmVuZGVySW50cm9IdG1sKCk7IC8vIGZhbGwgYmFjayB0byBnZW5lcmljCgl9LAoKCglyZW5kZXJCZ0NlbGxzSHRtbDogZnVuY3Rpb24ocm93KSB7CgkJdmFyIGh0bWxzID0gW107CgkJdmFyIGNvbCwgZGF0ZTsKCgkJZm9yIChjb2wgPSAwOyBjb2wgPCB0aGlzLmNvbENudDsgY29sKyspIHsKCQkJZGF0ZSA9IHRoaXMuZ2V0Q2VsbERhdGUocm93LCBjb2wpOwoJCQlodG1scy5wdXNoKHRoaXMucmVuZGVyQmdDZWxsSHRtbChkYXRlKSk7CgkJfQoKCQlyZXR1cm4gaHRtbHMuam9pbignJyk7Cgl9LAoKCglyZW5kZXJCZ0NlbGxIdG1sOiBmdW5jdGlvbihkYXRlLCBvdGhlckF0dHJzKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGNsYXNzZXMgPSB0aGlzLmdldERheUNsYXNzZXMoZGF0ZSk7CgoJCWNsYXNzZXMudW5zaGlmdCgnZmMtZGF5Jywgdmlldy53aWRnZXRDb250ZW50Q2xhc3MpOwoKCQlyZXR1cm4gJzx0ZCBjbGFzcz0iJyArIGNsYXNzZXMuam9pbignICcpICsgJyInICsKCQkJJyBkYXRhLWRhdGU9IicgKyBkYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpICsgJyInICsgLy8gaWYgZGF0ZSBoYXMgYSB0aW1lLCB3b24ndCBmb3JtYXQgaXQKCQkJKG90aGVyQXR0cnMgPwoJCQkJJyAnICsgb3RoZXJBdHRycyA6CgkJCQknJykgKwoJCQknPjwvdGQ+JzsKCX0sCgoKCS8qIEdlbmVyaWMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEdlbmVyYXRlcyB0aGUgZGVmYXVsdCBIVE1MIGludHJvIGZvciBhbnkgcm93LiBVc2VyIGNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlCglyZW5kZXJJbnRyb0h0bWw6IGZ1bmN0aW9uKCkgewoJfSwKCgoJLy8gVE9ETzogYSBnZW5lcmljIG1ldGhvZCBmb3IgZGVhbGluZyB3aXRoIDx0cj4sIFJUTCwgaW50cm8KCS8vIHdoZW4gaW5jcmVtZW50IGludGVybmFsQXBpVmVyc2lvbgoJLy8gd3JhcFRyIChzY2hlZHVsZXIpCgoKCS8qIFV0aWxzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBBcHBsaWVzIHRoZSBnZW5lcmljICJpbnRybyIgYW5kICJvdXRybyIgSFRNTCB0byB0aGUgZ2l2ZW4gY2VsbHMuCgkvLyBJbnRybyBtZWFucyB0aGUgbGVmdG1vc3QgY2VsbCB3aGVuIHRoZSBjYWxlbmRhciBpcyBMVFIgYW5kIHRoZSByaWdodG1vc3QgY2VsbCB3aGVuIFJUTC4gVmljZS12ZXJzYSBmb3Igb3V0cm8uCglib29rZW5kQ2VsbHM6IGZ1bmN0aW9uKHRyRWwpIHsKCQl2YXIgaW50cm9IdG1sID0gdGhpcy5yZW5kZXJJbnRyb0h0bWwoKTsKCgkJaWYgKGludHJvSHRtbCkgewoJCQlpZiAodGhpcy5pc1JUTCkgewoJCQkJdHJFbC5hcHBlbmQoaW50cm9IdG1sKTsKCQkJfQoJCQllbHNlIHsKCQkJCXRyRWwucHJlcGVuZChpbnRyb0h0bWwpOwoJCQl9CgkJfQoJfQoKfTsKCjs7CgovKiBBIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgYSBncmlkIG9mIHdob2xlLWRheXMgdGhhdCBydW5zIGhvcml6b250YWxseS4gVGhlcmUgY2FuIGJlIG11bHRpcGxlIHJvd3MsIG9uZSBwZXIgd2Vlay4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2YXIgRGF5R3JpZCA9IEZDLkRheUdyaWQgPSBHcmlkLmV4dGVuZChEYXlUYWJsZU1peGluLCB7CgoJbnVtYmVyc1Zpc2libGU6IGZhbHNlLCAvLyBzaG91bGQgcmVuZGVyIGEgcm93IGZvciBkYXkvd2VlayBudW1iZXJzPyBzZXQgYnkgb3V0c2lkZSB2aWV3LiBUT0RPOiBtYWtlIGludGVybmFsCglib3R0b21Db29yZFBhZGRpbmc6IDAsIC8vIGhhY2sgZm9yIGV4dGVuZGluZyB0aGUgaGl0IGFyZWEgZm9yIHRoZSBsYXN0IHJvdyBvZiB0aGUgY29vcmRpbmF0ZSBncmlkCgoJcm93RWxzOiBudWxsLCAvLyBzZXQgb2YgZmFrZSByb3cgZWxlbWVudHMKCWNlbGxFbHM6IG51bGwsIC8vIHNldCBvZiB3aG9sZS1kYXkgZWxlbWVudHMgY29tcHJpc2luZyB0aGUgcm93J3MgYmFja2dyb3VuZAoJaGVscGVyRWxzOiBudWxsLCAvLyBzZXQgb2YgY2VsbCBza2VsZXRvbiBlbGVtZW50cyBmb3IgcmVuZGVyaW5nIHRoZSBtb2NrIGV2ZW50ICJoZWxwZXIiCgoJcm93Q29vcmRDYWNoZTogbnVsbCwKCWNvbENvb3JkQ2FjaGU6IG51bGwsCgoKCS8vIFJlbmRlcnMgdGhlIHJvd3MgYW5kIGNvbHVtbnMgaW50byB0aGUgY29tcG9uZW50J3MgYHRoaXMuZWxgLCB3aGljaCBzaG91bGQgYWxyZWFkeSBiZSBhc3NpZ25lZC4KCS8vIGlzUmlnaWQgZGV0ZXJtaW5zIHdoZXRoZXIgdGhlIGluZGl2aWR1YWwgcm93cyBzaG91bGQgaWdub3JlIHRoZSBjb250ZW50cyBhbmQgYmUgYSBjb25zdGFudCBoZWlnaHQuCgkvLyBSZWxpZXMgb24gdGhlIHZpZXcncyBjb2xDbnQgYW5kIHJvd0NudC4gSW4gdGhlIGZ1dHVyZSwgdGhpcyBjb21wb25lbnQgc2hvdWxkIHByb2JhYmx5IGJlIHNlbGYtc3VmZmljaWVudC4KCXJlbmRlckRhdGVzOiBmdW5jdGlvbihpc1JpZ2lkKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIHJvd0NudCA9IHRoaXMucm93Q250OwoJCXZhciBjb2xDbnQgPSB0aGlzLmNvbENudDsKCQl2YXIgaHRtbCA9ICcnOwoJCXZhciByb3c7CgkJdmFyIGNvbDsKCgkJZm9yIChyb3cgPSAwOyByb3cgPCByb3dDbnQ7IHJvdysrKSB7CgkJCWh0bWwgKz0gdGhpcy5yZW5kZXJEYXlSb3dIdG1sKHJvdywgaXNSaWdpZCk7CgkJfQoJCXRoaXMuZWwuaHRtbChodG1sKTsKCgkJdGhpcy5yb3dFbHMgPSB0aGlzLmVsLmZpbmQoJy5mYy1yb3cnKTsKCQl0aGlzLmNlbGxFbHMgPSB0aGlzLmVsLmZpbmQoJy5mYy1kYXknKTsKCgkJdGhpcy5yb3dDb29yZENhY2hlID0gbmV3IENvb3JkQ2FjaGUoewoJCQllbHM6IHRoaXMucm93RWxzLAoJCQlpc1ZlcnRpY2FsOiB0cnVlCgkJfSk7CgkJdGhpcy5jb2xDb29yZENhY2hlID0gbmV3IENvb3JkQ2FjaGUoewoJCQllbHM6IHRoaXMuY2VsbEVscy5zbGljZSgwLCB0aGlzLmNvbENudCksIC8vIG9ubHkgdGhlIGZpcnN0IHJvdwoJCQlpc0hvcml6b250YWw6IHRydWUKCQl9KTsKCgkJLy8gdHJpZ2dlciBkYXlSZW5kZXIgd2l0aCBlYWNoIGNlbGwncyBlbGVtZW50CgkJZm9yIChyb3cgPSAwOyByb3cgPCByb3dDbnQ7IHJvdysrKSB7CgkJCWZvciAoY29sID0gMDsgY29sIDwgY29sQ250OyBjb2wrKykgewoJCQkJdmlldy50cmlnZ2VyKAoJCQkJCSdkYXlSZW5kZXInLAoJCQkJCW51bGwsCgkJCQkJdGhpcy5nZXRDZWxsRGF0ZShyb3csIGNvbCksCgkJCQkJdGhpcy5nZXRDZWxsRWwocm93LCBjb2wpCgkJCQkpOwoJCQl9CgkJfQoJfSwKCgoJdW5yZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJdGhpcy5yZW1vdmVTZWdQb3BvdmVyKCk7Cgl9LAoKCglyZW5kZXJCdXNpbmVzc0hvdXJzOiBmdW5jdGlvbigpIHsKCQl2YXIgc2VncyA9IHRoaXMuYnVpbGRCdXNpbmVzc0hvdXJTZWdzKHRydWUpOyAvLyB3aG9sZURheT10cnVlCgkJdGhpcy5yZW5kZXJGaWxsKCdidXNpbmVzc0hvdXJzJywgc2VncywgJ2JnZXZlbnQnKTsKCX0sCgoKCXVucmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckZpbGwoJ2J1c2luZXNzSG91cnMnKTsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgYSBzaW5nbGUgcm93LCB3aGljaCBpcyBhIGRpdiB0aGF0IHdyYXBzIGEgdGFibGUuCgkvLyBgcm93YCBpcyB0aGUgcm93IG51bWJlci4KCXJlbmRlckRheVJvd0h0bWw6IGZ1bmN0aW9uKHJvdywgaXNSaWdpZCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBjbGFzc2VzID0gWyAnZmMtcm93JywgJ2ZjLXdlZWsnLCB2aWV3LndpZGdldENvbnRlbnRDbGFzcyBdOwoKCQlpZiAoaXNSaWdpZCkgewoJCQljbGFzc2VzLnB1c2goJ2ZjLXJpZ2lkJyk7CgkJfQoKCQlyZXR1cm4gJycgKwoJCQknPGRpdiBjbGFzcz0iJyArIGNsYXNzZXMuam9pbignICcpICsgJyI+JyArCgkJCQknPGRpdiBjbGFzcz0iZmMtYmciPicgKwoJCQkJCSc8dGFibGU+JyArCgkJCQkJCXRoaXMucmVuZGVyQmdUckh0bWwocm93KSArCgkJCQkJJzwvdGFibGU+JyArCgkJCQknPC9kaXY+JyArCgkJCQknPGRpdiBjbGFzcz0iZmMtY29udGVudC1za2VsZXRvbiI+JyArCgkJCQkJJzx0YWJsZT4nICsKCQkJCQkJKHRoaXMubnVtYmVyc1Zpc2libGUgPwoJCQkJCQkJJzx0aGVhZD4nICsKCQkJCQkJCQl0aGlzLnJlbmRlck51bWJlclRySHRtbChyb3cpICsKCQkJCQkJCSc8L3RoZWFkPicgOgoJCQkJCQkJJycKCQkJCQkJCSkgKwoJCQkJCSc8L3RhYmxlPicgKwoJCQkJJzwvZGl2PicgKwoJCQknPC9kaXY+JzsKCX0sCgoKCS8qIEdyaWQgTnVtYmVyIFJlbmRlcmluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmVuZGVyTnVtYmVyVHJIdG1sOiBmdW5jdGlvbihyb3cpIHsKCQlyZXR1cm4gJycgKwoJCQknPHRyPicgKwoJCQkJKHRoaXMuaXNSVEwgPyAnJyA6IHRoaXMucmVuZGVyTnVtYmVySW50cm9IdG1sKHJvdykpICsKCQkJCXRoaXMucmVuZGVyTnVtYmVyQ2VsbHNIdG1sKHJvdykgKwoJCQkJKHRoaXMuaXNSVEwgPyB0aGlzLnJlbmRlck51bWJlckludHJvSHRtbChyb3cpIDogJycpICsKCQkJJzwvdHI+JzsKCX0sCgoKCXJlbmRlck51bWJlckludHJvSHRtbDogZnVuY3Rpb24ocm93KSB7CgkJcmV0dXJuIHRoaXMucmVuZGVySW50cm9IdG1sKCk7Cgl9LAoKCglyZW5kZXJOdW1iZXJDZWxsc0h0bWw6IGZ1bmN0aW9uKHJvdykgewoJCXZhciBodG1scyA9IFtdOwoJCXZhciBjb2wsIGRhdGU7CgoJCWZvciAoY29sID0gMDsgY29sIDwgdGhpcy5jb2xDbnQ7IGNvbCsrKSB7CgkJCWRhdGUgPSB0aGlzLmdldENlbGxEYXRlKHJvdywgY29sKTsKCQkJaHRtbHMucHVzaCh0aGlzLnJlbmRlck51bWJlckNlbGxIdG1sKGRhdGUpKTsKCQl9CgoJCXJldHVybiBodG1scy5qb2luKCcnKTsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgdGhlIDx0ZD5zIG9mIHRoZSAibnVtYmVyIiByb3cgaW4gdGhlIERheUdyaWQncyBjb250ZW50IHNrZWxldG9uLgoJLy8gVGhlIG51bWJlciByb3cgd2lsbCBvbmx5IGV4aXN0IGlmIGVpdGhlciBkYXkgbnVtYmVycyBvciB3ZWVrIG51bWJlcnMgYXJlIHR1cm5lZCBvbi4KCXJlbmRlck51bWJlckNlbGxIdG1sOiBmdW5jdGlvbihkYXRlKSB7CgkJdmFyIGh0bWwgPSAnJzsKCQl2YXIgY2xhc3NlczsKCQl2YXIgd2Vla0NhbGNGaXJzdERvVzsKCgkJaWYgKCF0aGlzLnZpZXcuZGF5TnVtYmVyc1Zpc2libGUgJiYgIXRoaXMudmlldy5jZWxsV2Vla051bWJlcnNWaXNpYmxlKSB7CgkJCS8vIG5vIG51bWJlcnMgaW4gZGF5IGNlbGwgKHdlZWsgbnVtYmVyIG11c3QgYmUgYWxvbmcgdGhlIHNpZGUpCgkJCXJldHVybiAnPHRkLz4nOyAvLyAgd2lsbCBjcmVhdGUgYW4gZW1wdHkgc3BhY2UgYWJvdmUgZXZlbnRzIDooCgkJfQoKCQljbGFzc2VzID0gdGhpcy5nZXREYXlDbGFzc2VzKGRhdGUpOwoJCWNsYXNzZXMudW5zaGlmdCgnZmMtZGF5LXRvcCcpOwoKCQlpZiAodGhpcy52aWV3LmNlbGxXZWVrTnVtYmVyc1Zpc2libGUpIHsKCQkJLy8gVG8gZGV0ZXJtaW5lIHRoZSBkYXkgb2Ygd2VlayBudW1iZXIgY2hhbmdlIHVuZGVyIElTTywgd2UgY2Fubm90CgkJCS8vIHJlbHkgb24gbW9tZW50LmpzIG1ldGhvZHMgc3VjaCBhcyBmaXJzdERheU9mV2VlaygpIG9yIHdlZWtkYXkoKSwKCQkJLy8gYmVjYXVzZSB0aGV5IHJlbHkgb24gdGhlIGxvY2FsZSdzIGRvdyAocG9zc2libHkgb3ZlcnJpZGRlbiBieQoJCQkvLyBvdXIgZmlyc3REYXkgb3B0aW9uKSwgd2hpY2ggbWF5IG5vdCBiZSBNb25kYXkuIFdlIGNhbm5vdCBjaGFuZ2UKCQkJLy8gZG93LCBiZWNhdXNlIHRoYXQgd291bGQgYWZmZWN0IHRoZSBjYWxlbmRhciBzdGFydCBkYXkgYXMgd2VsbC4KCQkJaWYgKGRhdGUuX2xvY2FsZS5fZnVsbENhbGVuZGFyX3dlZWtDYWxjID09PSAnSVNPJykgewoJCQkJd2Vla0NhbGNGaXJzdERvVyA9IDE7ICAvLyBNb25kYXkgYnkgSVNPIDg2MDEgZGVmaW5pdGlvbgoJCQl9CgkJCWVsc2UgewoJCQkJd2Vla0NhbGNGaXJzdERvVyA9IGRhdGUuX2xvY2FsZS5maXJzdERheU9mV2VlaygpOwoJCQl9CgkJfQoKCQlodG1sICs9ICc8dGQgY2xhc3M9IicgKyBjbGFzc2VzLmpvaW4oJyAnKSArICciIGRhdGEtZGF0ZT0iJyArIGRhdGUuZm9ybWF0KCkgKyAnIj4nOwoKCQlpZiAodGhpcy52aWV3LmNlbGxXZWVrTnVtYmVyc1Zpc2libGUgJiYgKGRhdGUuZGF5KCkgPT0gd2Vla0NhbGNGaXJzdERvVykpIHsKCQkJaHRtbCArPSB0aGlzLnZpZXcuYnVpbGRHb3RvQW5jaG9ySHRtbCgKCQkJCXsgZGF0ZTogZGF0ZSwgdHlwZTogJ3dlZWsnIH0sCgkJCQl7ICdjbGFzcyc6ICdmYy13ZWVrLW51bWJlcicgfSwKCQkJCWRhdGUuZm9ybWF0KCd3JykgLy8gaW5uZXIgSFRNTAoJCQkpOwoJCX0KCgkJaWYgKHRoaXMudmlldy5kYXlOdW1iZXJzVmlzaWJsZSkgewoJCQlodG1sICs9IHRoaXMudmlldy5idWlsZEdvdG9BbmNob3JIdG1sKAoJCQkJZGF0ZSwKCQkJCXsgJ2NsYXNzJzogJ2ZjLWRheS1udW1iZXInIH0sCgkJCQlkYXRlLmRhdGUoKSAvLyBpbm5lciBIVE1MCgkJCSk7CgkJfQoKCQlodG1sICs9ICc8L3RkPic7CgoJCXJldHVybiBodG1sOwoJfSwKCgoJLyogT3B0aW9ucwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQ29tcHV0ZXMgYSBkZWZhdWx0IGV2ZW50IHRpbWUgZm9ybWF0dGluZyBzdHJpbmcgaWYgYHRpbWVGb3JtYXRgIGlzIG5vdCBleHBsaWNpdGx5IGRlZmluZWQKCWNvbXB1dGVFdmVudFRpbWVGb3JtYXQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnZpZXcub3B0KCdleHRyYVNtYWxsVGltZUZvcm1hdCcpOyAvLyBsaWtlICI2cCIgb3IgIjY6MzBwIgoJfSwKCgoJLy8gQ29tcHV0ZXMgYSBkZWZhdWx0IGBkaXNwbGF5RXZlbnRFbmRgIHZhbHVlIGlmIG9uZSBpcyBub3QgZXhwbGljbHR5IGRlZmluZWQKCWNvbXB1dGVEaXNwbGF5RXZlbnRFbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmNvbENudCA9PSAxOyAvLyB3ZSdsbCBsaWtlbHkgaGF2ZSBzcGFjZSBpZiB0aGVyZSdzIG9ubHkgb25lIGRheQoJfSwKCgoJLyogRGF0ZXMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCXJhbmdlVXBkYXRlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy51cGRhdGVEYXlUYWJsZSgpOwoJfSwKCgoJLy8gU2xpY2VzIHVwIHRoZSBnaXZlbiBzcGFuICh1bnpvbmVkIHN0YXJ0L2VuZCB3aXRoIG90aGVyIG1pc2MgZGF0YSkgaW50byBhbiBhcnJheSBvZiBzZWdtZW50cwoJc3BhblRvU2VnczogZnVuY3Rpb24oc3BhbikgewoJCXZhciBzZWdzID0gdGhpcy5zbGljZVJhbmdlQnlSb3coc3Bhbik7CgkJdmFyIGksIHNlZzsKCgkJZm9yIChpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJc2VnID0gc2Vnc1tpXTsKCQkJaWYgKHRoaXMuaXNSVEwpIHsKCQkJCXNlZy5sZWZ0Q29sID0gdGhpcy5kYXlzUGVyUm93IC0gMSAtIHNlZy5sYXN0Um93RGF5SW5kZXg7CgkJCQlzZWcucmlnaHRDb2wgPSB0aGlzLmRheXNQZXJSb3cgLSAxIC0gc2VnLmZpcnN0Um93RGF5SW5kZXg7CgkJCX0KCQkJZWxzZSB7CgkJCQlzZWcubGVmdENvbCA9IHNlZy5maXJzdFJvd0RheUluZGV4OwoJCQkJc2VnLnJpZ2h0Q29sID0gc2VnLmxhc3RSb3dEYXlJbmRleDsKCQkJfQoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCgkvKiBIaXQgU3lzdGVtCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglwcmVwYXJlSGl0czogZnVuY3Rpb24oKSB7CgkJdGhpcy5jb2xDb29yZENhY2hlLmJ1aWxkKCk7CgkJdGhpcy5yb3dDb29yZENhY2hlLmJ1aWxkKCk7CgkJdGhpcy5yb3dDb29yZENhY2hlLmJvdHRvbXNbdGhpcy5yb3dDbnQgLSAxXSArPSB0aGlzLmJvdHRvbUNvb3JkUGFkZGluZzsgLy8gaGFjawoJfSwKCgoJcmVsZWFzZUhpdHM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuY29sQ29vcmRDYWNoZS5jbGVhcigpOwoJCXRoaXMucm93Q29vcmRDYWNoZS5jbGVhcigpOwoJfSwKCgoJcXVlcnlIaXQ6IGZ1bmN0aW9uKGxlZnRPZmZzZXQsIHRvcE9mZnNldCkgewoJCWlmICh0aGlzLmNvbENvb3JkQ2FjaGUuaXNMZWZ0SW5Cb3VuZHMobGVmdE9mZnNldCkgJiYgdGhpcy5yb3dDb29yZENhY2hlLmlzVG9wSW5Cb3VuZHModG9wT2Zmc2V0KSkgewoJCQl2YXIgY29sID0gdGhpcy5jb2xDb29yZENhY2hlLmdldEhvcml6b250YWxJbmRleChsZWZ0T2Zmc2V0KTsKCQkJdmFyIHJvdyA9IHRoaXMucm93Q29vcmRDYWNoZS5nZXRWZXJ0aWNhbEluZGV4KHRvcE9mZnNldCk7CgoJCQlpZiAocm93ICE9IG51bGwgJiYgY29sICE9IG51bGwpIHsKCQkJCXJldHVybiB0aGlzLmdldENlbGxIaXQocm93LCBjb2wpOwoJCQl9CgkJfQoJfSwKCgoJZ2V0SGl0U3BhbjogZnVuY3Rpb24oaGl0KSB7CgkJcmV0dXJuIHRoaXMuZ2V0Q2VsbFJhbmdlKGhpdC5yb3csIGhpdC5jb2wpOwoJfSwKCgoJZ2V0SGl0RWw6IGZ1bmN0aW9uKGhpdCkgewoJCXJldHVybiB0aGlzLmdldENlbGxFbChoaXQucm93LCBoaXQuY29sKTsKCX0sCgoKCS8qIENlbGwgU3lzdGVtCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJLy8gRllJOiB0aGUgZmlyc3QgY29sdW1uIGlzIHRoZSBsZWZ0bW9zdCBjb2x1bW4sIHJlZ2FyZGxlc3Mgb2YgZGF0ZQoKCglnZXRDZWxsSGl0OiBmdW5jdGlvbihyb3csIGNvbCkgewoJCXJldHVybiB7CgkJCXJvdzogcm93LAoJCQljb2w6IGNvbCwKCQkJY29tcG9uZW50OiB0aGlzLCAvLyBuZWVkZWQgdW5mb3J0dW5hdGVseSA6KAoJCQlsZWZ0OiB0aGlzLmNvbENvb3JkQ2FjaGUuZ2V0TGVmdE9mZnNldChjb2wpLAoJCQlyaWdodDogdGhpcy5jb2xDb29yZENhY2hlLmdldFJpZ2h0T2Zmc2V0KGNvbCksCgkJCXRvcDogdGhpcy5yb3dDb29yZENhY2hlLmdldFRvcE9mZnNldChyb3cpLAoJCQlib3R0b206IHRoaXMucm93Q29vcmRDYWNoZS5nZXRCb3R0b21PZmZzZXQocm93KQoJCX07Cgl9LAoKCglnZXRDZWxsRWw6IGZ1bmN0aW9uKHJvdywgY29sKSB7CgkJcmV0dXJuIHRoaXMuY2VsbEVscy5lcShyb3cgKiB0aGlzLmNvbENudCArIGNvbCk7Cgl9LAoKCgkvKiBFdmVudCBEcmFnIFZpc3VhbGl6YXRpb24KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkvLyBUT0RPOiBtb3ZlIHRvIERheUdyaWQuZXZlbnQsIHNpbWlsYXIgdG8gd2hhdCB3ZSBkaWQgd2l0aCBHcmlkJ3MgZHJhZyBtZXRob2RzCgoKCS8vIFJlbmRlcnMgYSB2aXN1YWwgaW5kaWNhdGlvbiBvZiBhbiBldmVudCBvciBleHRlcm5hbCBlbGVtZW50IGJlaW5nIGRyYWdnZWQuCgkvLyBgZXZlbnRMb2NhdGlvbmAgaGFzIHpvbmVkIHN0YXJ0IGFuZCBlbmQgKG9wdGlvbmFsKQoJcmVuZGVyRHJhZzogZnVuY3Rpb24oZXZlbnRMb2NhdGlvbiwgc2VnKSB7CgoJCS8vIGFsd2F5cyByZW5kZXIgYSBoaWdobGlnaHQgdW5kZXJuZWF0aAoJCXRoaXMucmVuZGVySGlnaGxpZ2h0KHRoaXMuZXZlbnRUb1NwYW4oZXZlbnRMb2NhdGlvbikpOwoKCQkvLyBpZiBhIHNlZ21lbnQgZnJvbSB0aGUgc2FtZSBjYWxlbmRhciBidXQgYW5vdGhlciBjb21wb25lbnQgaXMgYmVpbmcgZHJhZ2dlZCwgcmVuZGVyIGEgaGVscGVyIGV2ZW50CgkJaWYgKHNlZyAmJiBzZWcuY29tcG9uZW50ICE9PSB0aGlzKSB7CgkJCXJldHVybiB0aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIoZXZlbnRMb2NhdGlvbiwgc2VnKTsgLy8gcmV0dXJucyBtb2NrIGV2ZW50IGVsZW1lbnRzCgkJfQoJfSwKCgoJLy8gVW5yZW5kZXJzIGFueSB2aXN1YWwgaW5kaWNhdGlvbiBvZiBhIGhvdmVyaW5nIGV2ZW50Cgl1bnJlbmRlckRyYWc6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5yZW5kZXJIaWdobGlnaHQoKTsKCQl0aGlzLnVucmVuZGVySGVscGVyKCk7Cgl9LAoKCgkvKiBFdmVudCBSZXNpemUgVmlzdWFsaXphdGlvbgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IGJlaW5nIHJlc2l6ZWQKCXJlbmRlckV2ZW50UmVzaXplOiBmdW5jdGlvbihldmVudExvY2F0aW9uLCBzZWcpIHsKCQl0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKGV2ZW50TG9jYXRpb24pKTsKCQlyZXR1cm4gdGhpcy5yZW5kZXJFdmVudExvY2F0aW9uSGVscGVyKGV2ZW50TG9jYXRpb24sIHNlZyk7IC8vIHJldHVybnMgbW9jayBldmVudCBlbGVtZW50cwoJfSwKCgoJLy8gVW5yZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYW4gZXZlbnQgYmVpbmcgcmVzaXplZAoJdW5yZW5kZXJFdmVudFJlc2l6ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckhpZ2hsaWdodCgpOwoJCXRoaXMudW5yZW5kZXJIZWxwZXIoKTsKCX0sCgoKCS8qIEV2ZW50IEhlbHBlcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIG1vY2sgImhlbHBlciIgZXZlbnQuIGBzb3VyY2VTZWdgIGlzIHRoZSBhc3NvY2lhdGVkIGludGVybmFsIHNlZ21lbnQgb2JqZWN0LiBJdCBjYW4gYmUgbnVsbC4KCXJlbmRlckhlbHBlcjogZnVuY3Rpb24oZXZlbnQsIHNvdXJjZVNlZykgewoJCXZhciBoZWxwZXJOb2RlcyA9IFtdOwoJCXZhciBzZWdzID0gdGhpcy5ldmVudFRvU2VncyhldmVudCk7CgkJdmFyIHJvd1N0cnVjdHM7CgoJCXNlZ3MgPSB0aGlzLnJlbmRlckZnU2VnRWxzKHNlZ3MpOyAvLyBhc3NpZ25zIGVhY2ggc2VnJ3MgZWwgYW5kIHJldHVybnMgYSBzdWJzZXQgb2Ygc2VncyB0aGF0IHdlcmUgcmVuZGVyZWQKCQlyb3dTdHJ1Y3RzID0gdGhpcy5yZW5kZXJTZWdSb3dzKHNlZ3MpOwoKCQkvLyBpbmplY3QgZWFjaCBuZXcgZXZlbnQgc2tlbGV0b24gaW50byBlYWNoIGFzc29jaWF0ZWQgcm93CgkJdGhpcy5yb3dFbHMuZWFjaChmdW5jdGlvbihyb3csIHJvd05vZGUpIHsKCQkJdmFyIHJvd0VsID0gJChyb3dOb2RlKTsgLy8gdGhlIC5mYy1yb3cKCQkJdmFyIHNrZWxldG9uRWwgPSAkKCc8ZGl2IGNsYXNzPSJmYy1oZWxwZXItc2tlbGV0b24iPjx0YWJsZS8+PC9kaXY+Jyk7IC8vIHdpbGwgYmUgYWJzb2x1dGVseSBwb3NpdGlvbmVkCgkJCXZhciBza2VsZXRvblRvcDsKCgkJCS8vIElmIHRoZXJlIGlzIGFuIG9yaWdpbmFsIHNlZ21lbnQsIG1hdGNoIHRoZSB0b3AgcG9zaXRpb24uIE90aGVyd2lzZSwgcHV0IGl0IGF0IHRoZSByb3cncyB0b3AgbGV2ZWwKCQkJaWYgKHNvdXJjZVNlZyAmJiBzb3VyY2VTZWcucm93ID09PSByb3cpIHsKCQkJCXNrZWxldG9uVG9wID0gc291cmNlU2VnLmVsLnBvc2l0aW9uKCkudG9wOwoJCQl9CgkJCWVsc2UgewoJCQkJc2tlbGV0b25Ub3AgPSByb3dFbC5maW5kKCcuZmMtY29udGVudC1za2VsZXRvbiB0Ym9keScpLnBvc2l0aW9uKCkudG9wOwoJCQl9CgoJCQlza2VsZXRvbkVsLmNzcygndG9wJywgc2tlbGV0b25Ub3ApCgkJCQkuZmluZCgndGFibGUnKQoJCQkJCS5hcHBlbmQocm93U3RydWN0c1tyb3ddLnRib2R5RWwpOwoKCQkJcm93RWwuYXBwZW5kKHNrZWxldG9uRWwpOwoJCQloZWxwZXJOb2Rlcy5wdXNoKHNrZWxldG9uRWxbMF0pOwoJCX0pOwoKCQlyZXR1cm4gKCAvLyBtdXN0IHJldHVybiB0aGUgZWxlbWVudHMgcmVuZGVyZWQKCQkJdGhpcy5oZWxwZXJFbHMgPSAkKGhlbHBlck5vZGVzKSAvLyBhcnJheSAtPiBqUXVlcnkgc2V0CgkJKTsKCX0sCgoKCS8vIFVucmVuZGVycyBhbnkgdmlzdWFsIGluZGljYXRpb24gb2YgYSBtb2NrIGhlbHBlciBldmVudAoJdW5yZW5kZXJIZWxwZXI6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmhlbHBlckVscykgewoJCQl0aGlzLmhlbHBlckVscy5yZW1vdmUoKTsKCQkJdGhpcy5oZWxwZXJFbHMgPSBudWxsOwoJCX0KCX0sCgoKCS8qIEZpbGwgU3lzdGVtIChoaWdobGlnaHQsIGJhY2tncm91bmQgZXZlbnRzLCBidXNpbmVzcyBob3VycykKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCWZpbGxTZWdUYWc6ICd0ZCcsIC8vIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHRhZyBuYW1lCgoKCS8vIFJlbmRlcnMgYSBzZXQgb2YgcmVjdGFuZ2xlcyBvdmVyIHRoZSBnaXZlbiBzZWdtZW50cyBvZiBkYXlzLgoJLy8gT25seSByZXR1cm5zIHNlZ21lbnRzIHRoYXQgc3VjY2Vzc2Z1bGx5IHJlbmRlcmVkLgoJcmVuZGVyRmlsbDogZnVuY3Rpb24odHlwZSwgc2VncywgY2xhc3NOYW1lKSB7CgkJdmFyIG5vZGVzID0gW107CgkJdmFyIGksIHNlZzsKCQl2YXIgc2tlbGV0b25FbDsKCgkJc2VncyA9IHRoaXMucmVuZGVyRmlsbFNlZ0Vscyh0eXBlLCBzZWdzKTsgLy8gYXNzaWduZXMgYC5lbGAgdG8gZWFjaCBzZWcuIHJldHVybnMgc3VjY2Vzc2Z1bGx5IHJlbmRlcmVkIHNlZ3MKCgkJZm9yIChpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJc2VnID0gc2Vnc1tpXTsKCQkJc2tlbGV0b25FbCA9IHRoaXMucmVuZGVyRmlsbFJvdyh0eXBlLCBzZWcsIGNsYXNzTmFtZSk7CgkJCXRoaXMucm93RWxzLmVxKHNlZy5yb3cpLmFwcGVuZChza2VsZXRvbkVsKTsKCQkJbm9kZXMucHVzaChza2VsZXRvbkVsWzBdKTsKCQl9CgoJCXRoaXMuZWxzQnlGaWxsW3R5cGVdID0gJChub2Rlcyk7CgoJCXJldHVybiBzZWdzOwoJfSwKCgoJLy8gR2VuZXJhdGVzIHRoZSBIVE1MIG5lZWRlZCBmb3Igb25lIHJvdyBvZiBhIGZpbGwuIFJlcXVpcmVzIHRoZSBzZWcncyBlbCB0byBiZSByZW5kZXJlZC4KCXJlbmRlckZpbGxSb3c6IGZ1bmN0aW9uKHR5cGUsIHNlZywgY2xhc3NOYW1lKSB7CgkJdmFyIGNvbENudCA9IHRoaXMuY29sQ250OwoJCXZhciBzdGFydENvbCA9IHNlZy5sZWZ0Q29sOwoJCXZhciBlbmRDb2wgPSBzZWcucmlnaHRDb2wgKyAxOwoJCXZhciBza2VsZXRvbkVsOwoJCXZhciB0ckVsOwoKCQljbGFzc05hbWUgPSBjbGFzc05hbWUgfHwgdHlwZS50b0xvd2VyQ2FzZSgpOwoKCQlza2VsZXRvbkVsID0gJCgKCQkJJzxkaXYgY2xhc3M9ImZjLScgKyBjbGFzc05hbWUgKyAnLXNrZWxldG9uIj4nICsKCQkJCSc8dGFibGU+PHRyLz48L3RhYmxlPicgKwoJCQknPC9kaXY+JwoJCSk7CgkJdHJFbCA9IHNrZWxldG9uRWwuZmluZCgndHInKTsKCgkJaWYgKHN0YXJ0Q29sID4gMCkgewoJCQl0ckVsLmFwcGVuZCgnPHRkIGNvbHNwYW49IicgKyBzdGFydENvbCArICciLz4nKTsKCQl9CgoJCXRyRWwuYXBwZW5kKAoJCQlzZWcuZWwuYXR0cignY29sc3BhbicsIGVuZENvbCAtIHN0YXJ0Q29sKQoJCSk7CgoJCWlmIChlbmRDb2wgPCBjb2xDbnQpIHsKCQkJdHJFbC5hcHBlbmQoJzx0ZCBjb2xzcGFuPSInICsgKGNvbENudCAtIGVuZENvbCkgKyAnIi8+Jyk7CgkJfQoKCQl0aGlzLmJvb2tlbmRDZWxscyh0ckVsKTsKCgkJcmV0dXJuIHNrZWxldG9uRWw7Cgl9Cgp9KTsKCjs7CgovKiBFdmVudC1yZW5kZXJpbmcgbWV0aG9kcyBmb3IgdGhlIERheUdyaWQgY2xhc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpEYXlHcmlkLm1peGluKHsKCglyb3dTdHJ1Y3RzOiBudWxsLCAvLyBhbiBhcnJheSBvZiBvYmplY3RzLCBlYWNoIGhvbGRpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSByb3cncyBmb3JlZ3JvdW5kIGV2ZW50LXJlbmRlcmluZwoKCgkvLyBVbnJlbmRlcnMgYWxsIGV2ZW50cyBjdXJyZW50bHkgcmVuZGVyZWQgb24gdGhlIGdyaWQKCXVucmVuZGVyRXZlbnRzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnJlbW92ZVNlZ1BvcG92ZXIoKTsgLy8gcmVtb3ZlcyB0aGUgIm1vcmUuLiIgZXZlbnRzIHBvcG92ZXIKCQlHcmlkLnByb3RvdHlwZS51bnJlbmRlckV2ZW50cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBjYWxscyB0aGUgc3VwZXItbWV0aG9kCgl9LAoKCgkvLyBSZXRyaWV2ZXMgYWxsIHJlbmRlcmVkIHNlZ21lbnQgb2JqZWN0cyBjdXJyZW50bHkgcmVuZGVyZWQgb24gdGhlIGdyaWQKCWdldEV2ZW50U2VnczogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIEdyaWQucHJvdG90eXBlLmdldEV2ZW50U2Vncy5jYWxsKHRoaXMpIC8vIGdldCB0aGUgc2VnbWVudHMgZnJvbSB0aGUgc3VwZXItbWV0aG9kCgkJCS5jb25jYXQodGhpcy5wb3BvdmVyU2VncyB8fCBbXSk7IC8vIGFwcGVuZCB0aGUgc2VnbWVudHMgZnJvbSB0aGUgIm1vcmUuLi4iIHBvcG92ZXIKCX0sCgoKCS8vIFJlbmRlcnMgdGhlIGdpdmVuIGJhY2tncm91bmQgZXZlbnQgc2VnbWVudHMgb250byB0aGUgZ3JpZAoJcmVuZGVyQmdTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgoJCS8vIGRvbid0IHJlbmRlciB0aW1lZCBiYWNrZ3JvdW5kIGV2ZW50cwoJCXZhciBhbGxEYXlTZWdzID0gJC5ncmVwKHNlZ3MsIGZ1bmN0aW9uKHNlZykgewoJCQlyZXR1cm4gc2VnLmV2ZW50LmFsbERheTsKCQl9KTsKCgkJcmV0dXJuIEdyaWQucHJvdG90eXBlLnJlbmRlckJnU2Vncy5jYWxsKHRoaXMsIGFsbERheVNlZ3MpOyAvLyBjYWxsIHRoZSBzdXBlci1tZXRob2QKCX0sCgoKCS8vIFJlbmRlcnMgdGhlIGdpdmVuIGZvcmVncm91bmQgZXZlbnQgc2VnbWVudHMgb250byB0aGUgZ3JpZAoJcmVuZGVyRmdTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgkJdmFyIHJvd1N0cnVjdHM7CgoJCS8vIHJlbmRlciBhbiBgLmVsYCBvbiBlYWNoIHNlZwoJCS8vIHJldHVybnMgYSBzdWJzZXQgb2YgdGhlIHNlZ3MuIHNlZ3MgdGhhdCB3ZXJlIGFjdHVhbGx5IHJlbmRlcmVkCgkJc2VncyA9IHRoaXMucmVuZGVyRmdTZWdFbHMoc2Vncyk7CgoJCXJvd1N0cnVjdHMgPSB0aGlzLnJvd1N0cnVjdHMgPSB0aGlzLnJlbmRlclNlZ1Jvd3Moc2Vncyk7CgoJCS8vIGFwcGVuZCB0byBlYWNoIHJvdydzIGNvbnRlbnQgc2tlbGV0b24KCQl0aGlzLnJvd0Vscy5lYWNoKGZ1bmN0aW9uKGksIHJvd05vZGUpIHsKCQkJJChyb3dOb2RlKS5maW5kKCcuZmMtY29udGVudC1za2VsZXRvbiA+IHRhYmxlJykuYXBwZW5kKAoJCQkJcm93U3RydWN0c1tpXS50Ym9keUVsCgkJCSk7CgkJfSk7CgoJCXJldHVybiBzZWdzOyAvLyByZXR1cm4gb25seSB0aGUgc2VncyB0aGF0IHdlcmUgYWN0dWFsbHkgcmVuZGVyZWQKCX0sCgoKCS8vIFVucmVuZGVycyBhbGwgY3VycmVudGx5IHJlbmRlcmVkIGZvcmVncm91bmQgZXZlbnQgc2VnbWVudHMKCXVucmVuZGVyRmdTZWdzOiBmdW5jdGlvbigpIHsKCQl2YXIgcm93U3RydWN0cyA9IHRoaXMucm93U3RydWN0cyB8fCBbXTsKCQl2YXIgcm93U3RydWN0OwoKCQl3aGlsZSAoKHJvd1N0cnVjdCA9IHJvd1N0cnVjdHMucG9wKCkpKSB7CgkJCXJvd1N0cnVjdC50Ym9keUVsLnJlbW92ZSgpOwoJCX0KCgkJdGhpcy5yb3dTdHJ1Y3RzID0gbnVsbDsKCX0sCgoKCS8vIFVzZXMgdGhlIGdpdmVuIGV2ZW50cyBhcnJheSB0byBnZW5lcmF0ZSA8dGJvZHk+IGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIGVhY2ggcm93J3MgY29udGVudCBza2VsZXRvbi4KCS8vIFJldHVybnMgYW4gYXJyYXkgb2Ygcm93U3RydWN0IG9iamVjdHMgKHNlZSB0aGUgYm90dG9tIG9mIGByZW5kZXJTZWdSb3dgKS4KCS8vIFBSRUNPTkRJVElPTjogZWFjaCBzZWdtZW50IHNob3VkIGFscmVhZHkgaGF2ZSBhIHJlbmRlcmVkIGFuZCBhc3NpZ25lZCBgLmVsYAoJcmVuZGVyU2VnUm93czogZnVuY3Rpb24oc2VncykgewoJCXZhciByb3dTdHJ1Y3RzID0gW107CgkJdmFyIHNlZ1Jvd3M7CgkJdmFyIHJvdzsKCgkJc2VnUm93cyA9IHRoaXMuZ3JvdXBTZWdSb3dzKHNlZ3MpOyAvLyBncm91cCBpbnRvIG5lc3RlZCBhcnJheXMKCgkJLy8gaXRlcmF0ZSBlYWNoIHJvdyBvZiBzZWdtZW50IGdyb3VwaW5ncwoJCWZvciAocm93ID0gMDsgcm93IDwgc2VnUm93cy5sZW5ndGg7IHJvdysrKSB7CgkJCXJvd1N0cnVjdHMucHVzaCgKCQkJCXRoaXMucmVuZGVyU2VnUm93KHJvdywgc2VnUm93c1tyb3ddKQoJCQkpOwoJCX0KCgkJcmV0dXJuIHJvd1N0cnVjdHM7Cgl9LAoKCgkvLyBCdWlsZHMgdGhlIEhUTUwgdG8gYmUgdXNlZCBmb3IgdGhlIGRlZmF1bHQgZWxlbWVudCBmb3IgYW4gaW5kaXZpZHVhbCBzZWdtZW50CglmZ1NlZ0h0bWw6IGZ1bmN0aW9uKHNlZywgZGlzYWJsZVJlc2l6aW5nKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGV2ZW50ID0gc2VnLmV2ZW50OwoJCXZhciBpc0RyYWdnYWJsZSA9IHZpZXcuaXNFdmVudERyYWdnYWJsZShldmVudCk7CgkJdmFyIGlzUmVzaXphYmxlRnJvbVN0YXJ0ID0gIWRpc2FibGVSZXNpemluZyAmJiBldmVudC5hbGxEYXkgJiYKCQkJc2VnLmlzU3RhcnQgJiYgdmlldy5pc0V2ZW50UmVzaXphYmxlRnJvbVN0YXJ0KGV2ZW50KTsKCQl2YXIgaXNSZXNpemFibGVGcm9tRW5kID0gIWRpc2FibGVSZXNpemluZyAmJiBldmVudC5hbGxEYXkgJiYKCQkJc2VnLmlzRW5kICYmIHZpZXcuaXNFdmVudFJlc2l6YWJsZUZyb21FbmQoZXZlbnQpOwoJCXZhciBjbGFzc2VzID0gdGhpcy5nZXRTZWdDbGFzc2VzKHNlZywgaXNEcmFnZ2FibGUsIGlzUmVzaXphYmxlRnJvbVN0YXJ0IHx8IGlzUmVzaXphYmxlRnJvbUVuZCk7CgkJdmFyIHNraW5Dc3MgPSBjc3NUb1N0cih0aGlzLmdldFNlZ1NraW5Dc3Moc2VnKSk7CgkJdmFyIHRpbWVIdG1sID0gJyc7CgkJdmFyIHRpbWVUZXh0OwoJCXZhciB0aXRsZUh0bWw7CgoJCWNsYXNzZXMudW5zaGlmdCgnZmMtZGF5LWdyaWQtZXZlbnQnLCAnZmMtaC1ldmVudCcpOwoKCQkvLyBPbmx5IGRpc3BsYXkgYSB0aW1lZCBldmVudHMgdGltZSBpZiBpdCBpcyB0aGUgc3RhcnRpbmcgc2VnbWVudAoJCWlmIChzZWcuaXNTdGFydCkgewoJCQl0aW1lVGV4dCA9IHRoaXMuZ2V0RXZlbnRUaW1lVGV4dChldmVudCk7CgkJCWlmICh0aW1lVGV4dCkgewoJCQkJdGltZUh0bWwgPSAnPHNwYW4gY2xhc3M9ImZjLXRpbWUiPicgKyBodG1sRXNjYXBlKHRpbWVUZXh0KSArICc8L3NwYW4+JzsKCQkJfQoJCX0KCgkJdGl0bGVIdG1sID0KCQkJJzxzcGFuIGNsYXNzPSJmYy10aXRsZSI+JyArCgkJCQkoaHRtbEVzY2FwZShldmVudC50aXRsZSB8fCAnJykgfHwgJyZuYnNwOycpICsgLy8gd2UgYWx3YXlzIHdhbnQgb25lIGxpbmUgb2YgaGVpZ2h0CgkJCSc8L3NwYW4+JzsKCQkKCQlyZXR1cm4gJzxhIGNsYXNzPSInICsgY2xhc3Nlcy5qb2luKCcgJykgKyAnIicgKwoJCQkJKGV2ZW50LnVybCA/CgkJCQkJJyBocmVmPSInICsgaHRtbEVzY2FwZShldmVudC51cmwpICsgJyInIDoKCQkJCQknJwoJCQkJCSkgKwoJCQkJKHNraW5Dc3MgPwoJCQkJCScgc3R5bGU9IicgKyBza2luQ3NzICsgJyInIDoKCQkJCQknJwoJCQkJCSkgKwoJCQknPicgKwoJCQkJJzxkaXYgY2xhc3M9ImZjLWNvbnRlbnQiPicgKwoJCQkJCSh0aGlzLmlzUlRMID8KCQkJCQkJdGl0bGVIdG1sICsgJyAnICsgdGltZUh0bWwgOiAvLyBwdXQgYSBuYXR1cmFsIHNwYWNlIGluIGJldHdlZW4KCQkJCQkJdGltZUh0bWwgKyAnICcgKyB0aXRsZUh0bWwgICAvLwoJCQkJCQkpICsKCQkJCSc8L2Rpdj4nICsKCQkJCShpc1Jlc2l6YWJsZUZyb21TdGFydCA/CgkJCQkJJzxkaXYgY2xhc3M9ImZjLXJlc2l6ZXIgZmMtc3RhcnQtcmVzaXplciIgLz4nIDoKCQkJCQknJwoJCQkJCSkgKwoJCQkJKGlzUmVzaXphYmxlRnJvbUVuZCA/CgkJCQkJJzxkaXYgY2xhc3M9ImZjLXJlc2l6ZXIgZmMtZW5kLXJlc2l6ZXIiIC8+JyA6CgkJCQkJJycKCQkJCQkpICsKCQkJJzwvYT4nOwoJfSwKCgoJLy8gR2l2ZW4gYSByb3cgIyBhbmQgYW4gYXJyYXkgb2Ygc2VnbWVudHMgYWxsIGluIHRoZSBzYW1lIHJvdywgcmVuZGVyIGEgPHRib2R5PiBlbGVtZW50LCBhIHNrZWxldG9uIHRoYXQgY29udGFpbnMKCS8vIHRoZSBzZWdtZW50cy4gUmV0dXJucyBvYmplY3Qgd2l0aCBhIGJ1bmNoIG9mIGludGVybmFsIGRhdGEgYWJvdXQgaG93IHRoZSByZW5kZXIgd2FzIGNhbGN1bGF0ZWQuCgkvLyBOT1RFOiBtb2RpZmllcyByb3dTZWdzCglyZW5kZXJTZWdSb3c6IGZ1bmN0aW9uKHJvdywgcm93U2VncykgewoJCXZhciBjb2xDbnQgPSB0aGlzLmNvbENudDsKCQl2YXIgc2VnTGV2ZWxzID0gdGhpcy5idWlsZFNlZ0xldmVscyhyb3dTZWdzKTsgLy8gZ3JvdXAgaW50byBzdWItYXJyYXlzIG9mIGxldmVscwoJCXZhciBsZXZlbENudCA9IE1hdGgubWF4KDEsIHNlZ0xldmVscy5sZW5ndGgpOyAvLyBlbnN1cmUgYXQgbGVhc3Qgb25lIGxldmVsCgkJdmFyIHRib2R5ID0gJCgnPHRib2R5Lz4nKTsKCQl2YXIgc2VnTWF0cml4ID0gW107IC8vIGxvb2t1cCBmb3Igd2hpY2ggc2VnbWVudHMgYXJlIHJlbmRlcmVkIGludG8gd2hpY2ggbGV2ZWwrY29sIGNlbGxzCgkJdmFyIGNlbGxNYXRyaXggPSBbXTsgLy8gbG9va3VwIGZvciBhbGwgPHRkPiBlbGVtZW50cyBvZiB0aGUgbGV2ZWwrY29sIG1hdHJpeAoJCXZhciBsb25lQ2VsbE1hdHJpeCA9IFtdOyAvLyBsb29rdXAgZm9yIDx0ZD4gZWxlbWVudHMgdGhhdCBvbmx5IHRha2UgdXAgYSBzaW5nbGUgY29sdW1uCgkJdmFyIGksIGxldmVsU2VnczsKCQl2YXIgY29sOwoJCXZhciB0cjsKCQl2YXIgaiwgc2VnOwoJCXZhciB0ZDsKCgkJLy8gcG9wdWxhdGVzIGVtcHR5IGNlbGxzIGZyb20gdGhlIGN1cnJlbnQgY29sdW1uIChgY29sYCkgdG8gYGVuZENvbGAKCQlmdW5jdGlvbiBlbXB0eUNlbGxzVW50aWwoZW5kQ29sKSB7CgkJCXdoaWxlIChjb2wgPCBlbmRDb2wpIHsKCQkJCS8vIHRyeSB0byBncmFiIGEgY2VsbCBmcm9tIHRoZSBsZXZlbCBhYm92ZSBhbmQgZXh0ZW5kIGl0cyByb3dzcGFuLiBvdGhlcndpc2UsIGNyZWF0ZSBhIGZyZXNoIGNlbGwKCQkJCXRkID0gKGxvbmVDZWxsTWF0cml4W2kgLSAxXSB8fCBbXSlbY29sXTsKCQkJCWlmICh0ZCkgewoJCQkJCXRkLmF0dHIoCgkJCQkJCSdyb3dzcGFuJywKCQkJCQkJcGFyc2VJbnQodGQuYXR0cigncm93c3BhbicpIHx8IDEsIDEwKSArIDEKCQkJCQkpOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJdGQgPSAkKCc8dGQvPicpOwoJCQkJCXRyLmFwcGVuZCh0ZCk7CgkJCQl9CgkJCQljZWxsTWF0cml4W2ldW2NvbF0gPSB0ZDsKCQkJCWxvbmVDZWxsTWF0cml4W2ldW2NvbF0gPSB0ZDsKCQkJCWNvbCsrOwoJCQl9CgkJfQoKCQlmb3IgKGkgPSAwOyBpIDwgbGV2ZWxDbnQ7IGkrKykgeyAvLyBpdGVyYXRlIHRocm91Z2ggYWxsIGxldmVscwoJCQlsZXZlbFNlZ3MgPSBzZWdMZXZlbHNbaV07CgkJCWNvbCA9IDA7CgkJCXRyID0gJCgnPHRyLz4nKTsKCgkJCXNlZ01hdHJpeC5wdXNoKFtdKTsKCQkJY2VsbE1hdHJpeC5wdXNoKFtdKTsKCQkJbG9uZUNlbGxNYXRyaXgucHVzaChbXSk7CgoJCQkvLyBsZXZlbENudCBtaWdodCBiZSAxIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZSBubyBhY3R1YWwgbGV2ZWxzLiBwcm90ZWN0IGFnYWluc3QgdGhpcy4KCQkJLy8gdGhpcyBzaW5nbGUgZW1wdHkgcm93IGlzIHVzZWZ1bCBmb3Igc3R5bGluZy4KCQkJaWYgKGxldmVsU2VncykgewoJCQkJZm9yIChqID0gMDsgaiA8IGxldmVsU2Vncy5sZW5ndGg7IGorKykgeyAvLyBpdGVyYXRlIHRocm91Z2ggc2VnbWVudHMgaW4gbGV2ZWwKCQkJCQlzZWcgPSBsZXZlbFNlZ3Nbal07CgoJCQkJCWVtcHR5Q2VsbHNVbnRpbChzZWcubGVmdENvbCk7CgoJCQkJCS8vIGNyZWF0ZSBhIGNvbnRhaW5lciB0aGF0IG9jY3VwaWVzIG9yIG1vcmUgY29sdW1ucy4gYXBwZW5kIHRoZSBldmVudCBlbGVtZW50LgoJCQkJCXRkID0gJCgnPHRkIGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIiLz4nKS5hcHBlbmQoc2VnLmVsKTsKCQkJCQlpZiAoc2VnLmxlZnRDb2wgIT0gc2VnLnJpZ2h0Q29sKSB7CgkJCQkJCXRkLmF0dHIoJ2NvbHNwYW4nLCBzZWcucmlnaHRDb2wgLSBzZWcubGVmdENvbCArIDEpOwoJCQkJCX0KCQkJCQllbHNlIHsgLy8gYSBzaW5nbGUtY29sdW1uIHNlZ21lbnQKCQkJCQkJbG9uZUNlbGxNYXRyaXhbaV1bY29sXSA9IHRkOwoJCQkJCX0KCgkJCQkJd2hpbGUgKGNvbCA8PSBzZWcucmlnaHRDb2wpIHsKCQkJCQkJY2VsbE1hdHJpeFtpXVtjb2xdID0gdGQ7CgkJCQkJCXNlZ01hdHJpeFtpXVtjb2xdID0gc2VnOwoJCQkJCQljb2wrKzsKCQkJCQl9CgoJCQkJCXRyLmFwcGVuZCh0ZCk7CgkJCQl9CgkJCX0KCgkJCWVtcHR5Q2VsbHNVbnRpbChjb2xDbnQpOyAvLyBmaW5pc2ggb2ZmIHRoZSByb3cKCQkJdGhpcy5ib29rZW5kQ2VsbHModHIpOwoJCQl0Ym9keS5hcHBlbmQodHIpOwoJCX0KCgkJcmV0dXJuIHsgLy8gYSAicm93U3RydWN0IgoJCQlyb3c6IHJvdywgLy8gdGhlIHJvdyBudW1iZXIKCQkJdGJvZHlFbDogdGJvZHksCgkJCWNlbGxNYXRyaXg6IGNlbGxNYXRyaXgsCgkJCXNlZ01hdHJpeDogc2VnTWF0cml4LAoJCQlzZWdMZXZlbHM6IHNlZ0xldmVscywKCQkJc2Vnczogcm93U2VncwoJCX07Cgl9LAoKCgkvLyBTdGFja3MgYSBmbGF0IGFycmF5IG9mIHNlZ21lbnRzLCB3aGljaCBhcmUgYWxsIGFzc3VtZWQgdG8gYmUgaW4gdGhlIHNhbWUgcm93LCBpbnRvIHN1YmFycmF5cyBvZiB2ZXJ0aWNhbCBsZXZlbHMuCgkvLyBOT1RFOiBtb2RpZmllcyBzZWdzCglidWlsZFNlZ0xldmVsczogZnVuY3Rpb24oc2VncykgewoJCXZhciBsZXZlbHMgPSBbXTsKCQl2YXIgaSwgc2VnOwoJCXZhciBqOwoKCQkvLyBHaXZlIHByZWZlcmVuY2UgdG8gZWxlbWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLCBzbyB0aGV5IGhhdmUKCQkvLyBhIGNoYW5jZSB0byBiZSBjbG9zZXIgdG8gdGhlIHRvcC4KCQl0aGlzLnNvcnRFdmVudFNlZ3Moc2Vncyk7CgkJCgkJZm9yIChpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJc2VnID0gc2Vnc1tpXTsKCgkJCS8vIGxvb3AgdGhyb3VnaCBsZXZlbHMsIHN0YXJ0aW5nIHdpdGggdGhlIHRvcG1vc3QsIHVudGlsIHRoZSBzZWdtZW50IGRvZXNuJ3QgY29sbGlkZSB3aXRoIG90aGVyIHNlZ21lbnRzCgkJCWZvciAoaiA9IDA7IGogPCBsZXZlbHMubGVuZ3RoOyBqKyspIHsKCQkJCWlmICghaXNEYXlTZWdDb2xsaXNpb24oc2VnLCBsZXZlbHNbal0pKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJLy8gYGpgIG5vdyBob2xkcyB0aGUgZGVzaXJlZCBzdWJyb3cgaW5kZXgKCQkJc2VnLmxldmVsID0gajsKCgkJCS8vIGNyZWF0ZSBuZXcgbGV2ZWwgYXJyYXkgaWYgbmVlZGVkIGFuZCBhcHBlbmQgc2VnbWVudAoJCQkobGV2ZWxzW2pdIHx8IChsZXZlbHNbal0gPSBbXSkpLnB1c2goc2VnKTsKCQl9CgoJCS8vIG9yZGVyIHNlZ21lbnRzIGxlZnQtdG8tcmlnaHQuIHZlcnkgaW1wb3J0YW50IGlmIGNhbGVuZGFyIGlzIFJUTAoJCWZvciAoaiA9IDA7IGogPCBsZXZlbHMubGVuZ3RoOyBqKyspIHsKCQkJbGV2ZWxzW2pdLnNvcnQoY29tcGFyZURheVNlZ0NvbHMpOwoJCX0KCgkJcmV0dXJuIGxldmVsczsKCX0sCgoKCS8vIEdpdmVuIGEgZmxhdCBhcnJheSBvZiBzZWdtZW50cywgcmV0dXJuIGFuIGFycmF5IG9mIHN1Yi1hcnJheXMsIGdyb3VwZWQgYnkgZWFjaCBzZWdtZW50J3Mgcm93Cglncm91cFNlZ1Jvd3M6IGZ1bmN0aW9uKHNlZ3MpIHsKCQl2YXIgc2VnUm93cyA9IFtdOwoJCXZhciBpOwoKCQlmb3IgKGkgPSAwOyBpIDwgdGhpcy5yb3dDbnQ7IGkrKykgewoJCQlzZWdSb3dzLnB1c2goW10pOwoJCX0KCgkJZm9yIChpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJc2VnUm93c1tzZWdzW2ldLnJvd10ucHVzaChzZWdzW2ldKTsKCQl9CgoJCXJldHVybiBzZWdSb3dzOwoJfQoKfSk7CgoKLy8gQ29tcHV0ZXMgd2hldGhlciB0d28gc2VnbWVudHMnIGNvbHVtbnMgY29sbGlkZS4gVGhleSBhcmUgYXNzdW1lZCB0byBiZSBpbiB0aGUgc2FtZSByb3cuCmZ1bmN0aW9uIGlzRGF5U2VnQ29sbGlzaW9uKHNlZywgb3RoZXJTZWdzKSB7Cgl2YXIgaSwgb3RoZXJTZWc7CgoJZm9yIChpID0gMDsgaSA8IG90aGVyU2Vncy5sZW5ndGg7IGkrKykgewoJCW90aGVyU2VnID0gb3RoZXJTZWdzW2ldOwoKCQlpZiAoCgkJCW90aGVyU2VnLmxlZnRDb2wgPD0gc2VnLnJpZ2h0Q29sICYmCgkJCW90aGVyU2VnLnJpZ2h0Q29sID49IHNlZy5sZWZ0Q29sCgkJKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KCglyZXR1cm4gZmFsc2U7Cn0KCgovLyBBIGNtcCBmdW5jdGlvbiBmb3IgZGV0ZXJtaW5pbmcgdGhlIGxlZnRtb3N0IGV2ZW50CmZ1bmN0aW9uIGNvbXBhcmVEYXlTZWdDb2xzKGEsIGIpIHsKCXJldHVybiBhLmxlZnRDb2wgLSBiLmxlZnRDb2w7Cn0KCjs7CgovKiBNZXRob2RzIHJlbGF0ZSB0byBsaW1pdGluZyB0aGUgbnVtYmVyIGV2ZW50cyBmb3IgYSBnaXZlbiBkYXkgb24gYSBEYXlHcmlkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovLyBOT1RFOiBhbGwgdGhlIHNlZ3MgYmVpbmcgcGFzc2VkIGFyb3VuZCBpbiBoZXJlIGFyZSBmb3JlZ3JvdW5kIHNlZ3MKCkRheUdyaWQubWl4aW4oewoKCXNlZ1BvcG92ZXI6IG51bGwsIC8vIHRoZSBQb3BvdmVyIHRoYXQgaG9sZHMgZXZlbnRzIHRoYXQgY2FuJ3QgZml0IGluIGEgY2VsbC4gbnVsbCB3aGVuIG5vdCB2aXNpYmxlCglwb3BvdmVyU2VnczogbnVsbCwgLy8gYW4gYXJyYXkgb2Ygc2VnbWVudCBvYmplY3RzIHRoYXQgdGhlIHNlZ1BvcG92ZXIgaG9sZHMuIG51bGwgd2hlbiBub3QgdmlzaWJsZQoKCglyZW1vdmVTZWdQb3BvdmVyOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5zZWdQb3BvdmVyKSB7CgkJCXRoaXMuc2VnUG9wb3Zlci5oaWRlKCk7IC8vIGluIGhhbmRsZXIsIHdpbGwgY2FsbCBzZWdQb3BvdmVyJ3MgcmVtb3ZlRWxlbWVudAoJCX0KCX0sCgoKCS8vIExpbWl0cyB0aGUgbnVtYmVyIG9mICJsZXZlbHMiICh2ZXJ0aWNhbGx5IHN0YWNraW5nIGxheWVycyBvZiBldmVudHMpIGZvciBlYWNoIHJvdyBvZiB0aGUgZ3JpZC4KCS8vIGBsZXZlbExpbWl0YCBjYW4gYmUgZmFsc2UgKGRvbid0IGxpbWl0KSwgYSBudW1iZXIsIG9yIHRydWUgKHNob3VsZCBiZSBjb21wdXRlZCkuCglsaW1pdFJvd3M6IGZ1bmN0aW9uKGxldmVsTGltaXQpIHsKCQl2YXIgcm93U3RydWN0cyA9IHRoaXMucm93U3RydWN0cyB8fCBbXTsKCQl2YXIgcm93OyAvLyByb3cgIwoJCXZhciByb3dMZXZlbExpbWl0OwoKCQlmb3IgKHJvdyA9IDA7IHJvdyA8IHJvd1N0cnVjdHMubGVuZ3RoOyByb3crKykgewoJCQl0aGlzLnVubGltaXRSb3cocm93KTsKCgkJCWlmICghbGV2ZWxMaW1pdCkgewoJCQkJcm93TGV2ZWxMaW1pdCA9IGZhbHNlOwoJCQl9CgkJCWVsc2UgaWYgKHR5cGVvZiBsZXZlbExpbWl0ID09PSAnbnVtYmVyJykgewoJCQkJcm93TGV2ZWxMaW1pdCA9IGxldmVsTGltaXQ7CgkJCX0KCQkJZWxzZSB7CgkJCQlyb3dMZXZlbExpbWl0ID0gdGhpcy5jb21wdXRlUm93TGV2ZWxMaW1pdChyb3cpOwoJCQl9CgoJCQlpZiAocm93TGV2ZWxMaW1pdCAhPT0gZmFsc2UpIHsKCQkJCXRoaXMubGltaXRSb3cocm93LCByb3dMZXZlbExpbWl0KTsKCQkJfQoJCX0KCX0sCgoKCS8vIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgbGV2ZWxzIGEgcm93IHdpbGwgYWNjb21vZGF0ZSB3aXRob3V0IGdvaW5nIG91dHNpZGUgaXRzIGJvdW5kcy4KCS8vIEFzc3VtZXMgdGhlIHJvdyBpcyAicmlnaWQiIChtYWludGFpbnMgYSBjb25zdGFudCBoZWlnaHQgcmVnYXJkbGVzcyBvZiB3aGF0IGlzIGluc2lkZSkuCgkvLyBgcm93YCBpcyB0aGUgcm93IG51bWJlci4KCWNvbXB1dGVSb3dMZXZlbExpbWl0OiBmdW5jdGlvbihyb3cpIHsKCQl2YXIgcm93RWwgPSB0aGlzLnJvd0Vscy5lcShyb3cpOyAvLyB0aGUgY29udGFpbmluZyAiZmFrZSIgcm93IGRpdgoJCXZhciByb3dIZWlnaHQgPSByb3dFbC5oZWlnaHQoKTsgLy8gVE9ETzogY2FjaGUgc29tZWhvdz8KCQl2YXIgdHJFbHMgPSB0aGlzLnJvd1N0cnVjdHNbcm93XS50Ym9keUVsLmNoaWxkcmVuKCk7CgkJdmFyIGksIHRyRWw7CgkJdmFyIHRySGVpZ2h0OwoKCQlmdW5jdGlvbiBpdGVySW5uZXJIZWlnaHRzKGksIGNoaWxkTm9kZSkgewoJCQl0ckhlaWdodCA9IE1hdGgubWF4KHRySGVpZ2h0LCAkKGNoaWxkTm9kZSkub3V0ZXJIZWlnaHQoKSk7CgkJfQoKCQkvLyBSZXZlYWwgb25lIGxldmVsIDx0cj4gYXQgYSB0aW1lIGFuZCBzdG9wIHdoZW4gd2UgZmluZCBvbmUgb3V0IG9mIGJvdW5kcwoJCWZvciAoaSA9IDA7IGkgPCB0ckVscy5sZW5ndGg7IGkrKykgewoJCQl0ckVsID0gdHJFbHMuZXEoaSkucmVtb3ZlQ2xhc3MoJ2ZjLWxpbWl0ZWQnKTsgLy8gcmVzZXQgdG8gb3JpZ2luYWwgc3RhdGUgKHJldmVhbCkKCgkJCS8vIHdpdGggcm93c3BhbnM+MSBhbmQgSUU4LCB0ckVsLm91dGVySGVpZ2h0KCkgd291bGQgcmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhlIGxhcmdlc3QgY2VsbCwKCQkJLy8gc28gaW5zdGVhZCwgZmluZCB0aGUgdGFsbGVzdCBpbm5lciBjb250ZW50IGVsZW1lbnQuCgkJCXRySGVpZ2h0ID0gMDsKCQkJdHJFbC5maW5kKCc+IHRkID4gOmZpcnN0LWNoaWxkJykuZWFjaChpdGVySW5uZXJIZWlnaHRzKTsKCgkJCWlmICh0ckVsLnBvc2l0aW9uKCkudG9wICsgdHJIZWlnaHQgPiByb3dIZWlnaHQpIHsKCQkJCXJldHVybiBpOwoJCQl9CgkJfQoKCQlyZXR1cm4gZmFsc2U7IC8vIHNob3VsZCBub3QgbGltaXQgYXQgYWxsCgl9LAoKCgkvLyBMaW1pdHMgdGhlIGdpdmVuIGdyaWQgcm93IHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsZXZlbHMgYW5kIGluamVjdHMgIm1vcmUiIGxpbmtzIGlmIG5lY2Vzc2FyeS4KCS8vIGByb3dgIGlzIHRoZSByb3cgbnVtYmVyLgoJLy8gYGxldmVsTGltaXRgIGlzIGEgbnVtYmVyIGZvciB0aGUgbWF4aW11bSAoaW5jbHVzaXZlKSBudW1iZXIgb2YgbGV2ZWxzIGFsbG93ZWQuCglsaW1pdFJvdzogZnVuY3Rpb24ocm93LCBsZXZlbExpbWl0KSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgcm93U3RydWN0ID0gdGhpcy5yb3dTdHJ1Y3RzW3Jvd107CgkJdmFyIG1vcmVOb2RlcyA9IFtdOyAvLyBhcnJheSBvZiAibW9yZSIgPGE+IGxpbmtzIGFuZCA8dGQ+IERPTSBub2RlcwoJCXZhciBjb2wgPSAwOyAvLyBjb2wgIywgbGVmdC10by1yaWdodCAobm90IGNocm9ub2xvZ2ljYWxseSkKCQl2YXIgbGV2ZWxTZWdzOyAvLyBhcnJheSBvZiBzZWdtZW50IG9iamVjdHMgaW4gdGhlIGxhc3QgYWxsb3dhYmxlIGxldmVsLCBvcmRlcmVkIGxlZnQtdG8tcmlnaHQKCQl2YXIgY2VsbE1hdHJpeDsgLy8gYSBtYXRyaXggKGJ5IGxldmVsLCB0aGVuIGNvbHVtbikgb2YgYWxsIDx0ZD4galF1ZXJ5IGVsZW1lbnRzIGluIHRoZSByb3cKCQl2YXIgbGltaXRlZE5vZGVzOyAvLyBhcnJheSBvZiB0ZW1wb3JhcmlseSBoaWRkZW4gbGV2ZWwgPHRyPiBhbmQgc2VnbWVudCA8dGQ+IERPTSBub2RlcwoJCXZhciBpLCBzZWc7CgkJdmFyIHNlZ3NCZWxvdzsgLy8gYXJyYXkgb2Ygc2VnbWVudCBvYmplY3RzIGJlbG93IGBzZWdgIGluIHRoZSBjdXJyZW50IGBjb2xgCgkJdmFyIHRvdGFsU2Vnc0JlbG93OyAvLyB0b3RhbCBudW1iZXIgb2Ygc2VnbWVudHMgYmVsb3cgYHNlZ2AgaW4gYW55IG9mIHRoZSBjb2x1bW5zIGBzZWdgIG9jY3VwaWVzCgkJdmFyIGNvbFNlZ3NCZWxvdzsgLy8gYXJyYXkgb2Ygc2VnbWVudCBhcnJheXMsIGJlbG93IHNlZywgb25lIGZvciBlYWNoIGNvbHVtbiAob2Zmc2V0IGZyb20gc2VncydzIGZpcnN0IGNvbHVtbikKCQl2YXIgdGQsIHJvd3NwYW47CgkJdmFyIHNlZ01vcmVOb2RlczsgLy8gYXJyYXkgb2YgIm1vcmUiIDx0ZD4gY2VsbHMgdGhhdCB3aWxsIHN0YW5kLWluIGZvciB0aGUgY3VycmVudCBzZWcncyBjZWxsCgkJdmFyIGo7CgkJdmFyIG1vcmVUZCwgbW9yZVdyYXAsIG1vcmVMaW5rOwoKCQkvLyBJdGVyYXRlcyB0aHJvdWdoIGVtcHR5IGxldmVsIGNlbGxzIGFuZCBwbGFjZXMgIm1vcmUiIGxpbmtzIGluc2lkZSBpZiBuZWVkIGJlCgkJZnVuY3Rpb24gZW1wdHlDZWxsc1VudGlsKGVuZENvbCkgeyAvLyBnb2VzIGZyb20gY3VycmVudCBgY29sYCB0byBgZW5kQ29sYAoJCQl3aGlsZSAoY29sIDwgZW5kQ29sKSB7CgkJCQlzZWdzQmVsb3cgPSBfdGhpcy5nZXRDZWxsU2Vncyhyb3csIGNvbCwgbGV2ZWxMaW1pdCk7CgkJCQlpZiAoc2Vnc0JlbG93Lmxlbmd0aCkgewoJCQkJCXRkID0gY2VsbE1hdHJpeFtsZXZlbExpbWl0IC0gMV1bY29sXTsKCQkJCQltb3JlTGluayA9IF90aGlzLnJlbmRlck1vcmVMaW5rKHJvdywgY29sLCBzZWdzQmVsb3cpOwoJCQkJCW1vcmVXcmFwID0gJCgnPGRpdi8+JykuYXBwZW5kKG1vcmVMaW5rKTsKCQkJCQl0ZC5hcHBlbmQobW9yZVdyYXApOwoJCQkJCW1vcmVOb2Rlcy5wdXNoKG1vcmVXcmFwWzBdKTsKCQkJCX0KCQkJCWNvbCsrOwoJCQl9CgkJfQoKCQlpZiAobGV2ZWxMaW1pdCAmJiBsZXZlbExpbWl0IDwgcm93U3RydWN0LnNlZ0xldmVscy5sZW5ndGgpIHsgLy8gaXMgaXQgYWN0dWFsbHkgb3ZlciB0aGUgbGltaXQ/CgkJCWxldmVsU2VncyA9IHJvd1N0cnVjdC5zZWdMZXZlbHNbbGV2ZWxMaW1pdCAtIDFdOwoJCQljZWxsTWF0cml4ID0gcm93U3RydWN0LmNlbGxNYXRyaXg7CgoJCQlsaW1pdGVkTm9kZXMgPSByb3dTdHJ1Y3QudGJvZHlFbC5jaGlsZHJlbigpLnNsaWNlKGxldmVsTGltaXQpIC8vIGdldCBsZXZlbCA8dHI+IGVsZW1lbnRzIHBhc3QgdGhlIGxpbWl0CgkJCQkuYWRkQ2xhc3MoJ2ZjLWxpbWl0ZWQnKS5nZXQoKTsgLy8gaGlkZSBlbGVtZW50cyBhbmQgZ2V0IGEgc2ltcGxlIERPTS1ub2RlcyBhcnJheQoKCQkJLy8gaXRlcmF0ZSB0aG91Z2ggc2VnbWVudHMgaW4gdGhlIGxhc3QgYWxsb3dhYmxlIGxldmVsCgkJCWZvciAoaSA9IDA7IGkgPCBsZXZlbFNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJCXNlZyA9IGxldmVsU2Vnc1tpXTsKCQkJCWVtcHR5Q2VsbHNVbnRpbChzZWcubGVmdENvbCk7IC8vIHByb2Nlc3MgZW1wdHkgY2VsbHMgYmVmb3JlIHRoZSBzZWdtZW50CgoJCQkJLy8gZGV0ZXJtaW5lICphbGwqIHNlZ21lbnRzIGJlbG93IGBzZWdgIHRoYXQgb2NjdXB5IHRoZSBzYW1lIGNvbHVtbnMKCQkJCWNvbFNlZ3NCZWxvdyA9IFtdOwoJCQkJdG90YWxTZWdzQmVsb3cgPSAwOwoJCQkJd2hpbGUgKGNvbCA8PSBzZWcucmlnaHRDb2wpIHsKCQkJCQlzZWdzQmVsb3cgPSB0aGlzLmdldENlbGxTZWdzKHJvdywgY29sLCBsZXZlbExpbWl0KTsKCQkJCQljb2xTZWdzQmVsb3cucHVzaChzZWdzQmVsb3cpOwoJCQkJCXRvdGFsU2Vnc0JlbG93ICs9IHNlZ3NCZWxvdy5sZW5ndGg7CgkJCQkJY29sKys7CgkJCQl9CgoJCQkJaWYgKHRvdGFsU2Vnc0JlbG93KSB7IC8vIGRvIHdlIG5lZWQgdG8gcmVwbGFjZSB0aGlzIHNlZ21lbnQgd2l0aCBvbmUgb3IgbWFueSAibW9yZSIgbGlua3M/CgkJCQkJdGQgPSBjZWxsTWF0cml4W2xldmVsTGltaXQgLSAxXVtzZWcubGVmdENvbF07IC8vIHRoZSBzZWdtZW50J3MgcGFyZW50IGNlbGwKCQkJCQlyb3dzcGFuID0gdGQuYXR0cigncm93c3BhbicpIHx8IDE7CgkJCQkJc2VnTW9yZU5vZGVzID0gW107CgoJCQkJCS8vIG1ha2UgYSByZXBsYWNlbWVudCA8dGQ+IGZvciBlYWNoIGNvbHVtbiB0aGUgc2VnbWVudCBvY2N1cGllcy4gd2lsbCBiZSBvbmUgZm9yIGVhY2ggY29sc3BhbgoJCQkJCWZvciAoaiA9IDA7IGogPCBjb2xTZWdzQmVsb3cubGVuZ3RoOyBqKyspIHsKCQkJCQkJbW9yZVRkID0gJCgnPHRkIGNsYXNzPSJmYy1tb3JlLWNlbGwiLz4nKS5hdHRyKCdyb3dzcGFuJywgcm93c3Bhbik7CgkJCQkJCXNlZ3NCZWxvdyA9IGNvbFNlZ3NCZWxvd1tqXTsKCQkJCQkJbW9yZUxpbmsgPSB0aGlzLnJlbmRlck1vcmVMaW5rKAoJCQkJCQkJcm93LAoJCQkJCQkJc2VnLmxlZnRDb2wgKyBqLAoJCQkJCQkJWyBzZWcgXS5jb25jYXQoc2Vnc0JlbG93KSAvLyBjb3VudCBzZWcgYXMgaGlkZGVuIHRvbwoJCQkJCQkpOwoJCQkJCQltb3JlV3JhcCA9ICQoJzxkaXYvPicpLmFwcGVuZChtb3JlTGluayk7CgkJCQkJCW1vcmVUZC5hcHBlbmQobW9yZVdyYXApOwoJCQkJCQlzZWdNb3JlTm9kZXMucHVzaChtb3JlVGRbMF0pOwoJCQkJCQltb3JlTm9kZXMucHVzaChtb3JlVGRbMF0pOwoJCQkJCX0KCgkJCQkJdGQuYWRkQ2xhc3MoJ2ZjLWxpbWl0ZWQnKS5hZnRlcigkKHNlZ01vcmVOb2RlcykpOyAvLyBoaWRlIG9yaWdpbmFsIDx0ZD4gYW5kIGluamVjdCByZXBsYWNlbWVudHMKCQkJCQlsaW1pdGVkTm9kZXMucHVzaCh0ZFswXSk7CgkJCQl9CgkJCX0KCgkJCWVtcHR5Q2VsbHNVbnRpbCh0aGlzLmNvbENudCk7IC8vIGZpbmlzaCBvZmYgdGhlIGxldmVsCgkJCXJvd1N0cnVjdC5tb3JlRWxzID0gJChtb3JlTm9kZXMpOyAvLyBmb3IgZWFzeSB1bmRvaW5nIGxhdGVyCgkJCXJvd1N0cnVjdC5saW1pdGVkRWxzID0gJChsaW1pdGVkTm9kZXMpOyAvLyBmb3IgZWFzeSB1bmRvaW5nIGxhdGVyCgkJfQoJfSwKCgoJLy8gUmV2ZWFscyBhbGwgbGV2ZWxzIGFuZCByZW1vdmVzIGFsbCAibW9yZSItcmVsYXRlZCBlbGVtZW50cyBmb3IgYSBncmlkJ3Mgcm93LgoJLy8gYHJvd2AgaXMgYSByb3cgbnVtYmVyLgoJdW5saW1pdFJvdzogZnVuY3Rpb24ocm93KSB7CgkJdmFyIHJvd1N0cnVjdCA9IHRoaXMucm93U3RydWN0c1tyb3ddOwoKCQlpZiAocm93U3RydWN0Lm1vcmVFbHMpIHsKCQkJcm93U3RydWN0Lm1vcmVFbHMucmVtb3ZlKCk7CgkJCXJvd1N0cnVjdC5tb3JlRWxzID0gbnVsbDsKCQl9CgoJCWlmIChyb3dTdHJ1Y3QubGltaXRlZEVscykgewoJCQlyb3dTdHJ1Y3QubGltaXRlZEVscy5yZW1vdmVDbGFzcygnZmMtbGltaXRlZCcpOwoJCQlyb3dTdHJ1Y3QubGltaXRlZEVscyA9IG51bGw7CgkJfQoJfSwKCgoJLy8gUmVuZGVycyBhbiA8YT4gZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgaGlkZGVuIGV2ZW50IGVsZW1lbnQgZm9yIGEgY2VsbC4KCS8vIFJlc3BvbnNpYmxlIGZvciBhdHRhY2hpbmcgY2xpY2sgaGFuZGxlciBhcyB3ZWxsLgoJcmVuZGVyTW9yZUxpbms6IGZ1bmN0aW9uKHJvdywgY29sLCBoaWRkZW5TZWdzKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCgkJcmV0dXJuICQoJzxhIGNsYXNzPSJmYy1tb3JlIi8+JykKCQkJLnRleHQoCgkJCQl0aGlzLmdldE1vcmVMaW5rVGV4dChoaWRkZW5TZWdzLmxlbmd0aCkKCQkJKQoJCQkub24oJ2NsaWNrJywgZnVuY3Rpb24oZXYpIHsKCQkJCXZhciBjbGlja09wdGlvbiA9IHZpZXcub3B0KCdldmVudExpbWl0Q2xpY2snKTsKCQkJCXZhciBkYXRlID0gX3RoaXMuZ2V0Q2VsbERhdGUocm93LCBjb2wpOwoJCQkJdmFyIG1vcmVFbCA9ICQodGhpcyk7CgkJCQl2YXIgZGF5RWwgPSBfdGhpcy5nZXRDZWxsRWwocm93LCBjb2wpOwoJCQkJdmFyIGFsbFNlZ3MgPSBfdGhpcy5nZXRDZWxsU2Vncyhyb3csIGNvbCk7CgoJCQkJLy8gcmVzY29wZSB0aGUgc2VnbWVudHMgdG8gYmUgd2l0aGluIHRoZSBjZWxsJ3MgZGF0ZQoJCQkJdmFyIHJlc2xpY2VkQWxsU2VncyA9IF90aGlzLnJlc2xpY2VEYXlTZWdzKGFsbFNlZ3MsIGRhdGUpOwoJCQkJdmFyIHJlc2xpY2VkSGlkZGVuU2VncyA9IF90aGlzLnJlc2xpY2VEYXlTZWdzKGhpZGRlblNlZ3MsIGRhdGUpOwoKCQkJCWlmICh0eXBlb2YgY2xpY2tPcHRpb24gPT09ICdmdW5jdGlvbicpIHsKCQkJCQkvLyB0aGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIGFuIGF0b21pYyBvcHRpb24KCQkJCQljbGlja09wdGlvbiA9IHZpZXcudHJpZ2dlcignZXZlbnRMaW1pdENsaWNrJywgbnVsbCwgewoJCQkJCQlkYXRlOiBkYXRlLAoJCQkJCQlkYXlFbDogZGF5RWwsCgkJCQkJCW1vcmVFbDogbW9yZUVsLAoJCQkJCQlzZWdzOiByZXNsaWNlZEFsbFNlZ3MsCgkJCQkJCWhpZGRlblNlZ3M6IHJlc2xpY2VkSGlkZGVuU2VncwoJCQkJCX0sIGV2KTsKCQkJCX0KCgkJCQlpZiAoY2xpY2tPcHRpb24gPT09ICdwb3BvdmVyJykgewoJCQkJCV90aGlzLnNob3dTZWdQb3BvdmVyKHJvdywgY29sLCBtb3JlRWwsIHJlc2xpY2VkQWxsU2Vncyk7CgkJCQl9CgkJCQllbHNlIGlmICh0eXBlb2YgY2xpY2tPcHRpb24gPT09ICdzdHJpbmcnKSB7IC8vIGEgdmlldyBuYW1lCgkJCQkJdmlldy5jYWxlbmRhci56b29tVG8oZGF0ZSwgY2xpY2tPcHRpb24pOwoJCQkJfQoJCQl9KTsKCX0sCgoKCS8vIFJldmVhbHMgdGhlIHBvcG92ZXIgdGhhdCBkaXNwbGF5cyBhbGwgZXZlbnRzIHdpdGhpbiBhIGNlbGwKCXNob3dTZWdQb3BvdmVyOiBmdW5jdGlvbihyb3csIGNvbCwgbW9yZUxpbmssIHNlZ3MpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBtb3JlV3JhcCA9IG1vcmVMaW5rLnBhcmVudCgpOyAvLyB0aGUgPGRpdj4gd3JhcHBlciBhcm91bmQgdGhlIDxhPgoJCXZhciB0b3BFbDsgLy8gdGhlIGVsZW1lbnQgd2Ugd2FudCB0byBtYXRjaCB0aGUgdG9wIGNvb3JkaW5hdGUgb2YKCQl2YXIgb3B0aW9uczsKCgkJaWYgKHRoaXMucm93Q250ID09IDEpIHsKCQkJdG9wRWwgPSB2aWV3LmVsOyAvLyB3aWxsIGNhdXNlIHRoZSBwb3BvdmVyIHRvIGNvdmVyIGFueSBzb3J0IG9mIGhlYWRlcgoJCX0KCQllbHNlIHsKCQkJdG9wRWwgPSB0aGlzLnJvd0Vscy5lcShyb3cpOyAvLyB3aWxsIGFsaWduIHdpdGggdG9wIG9mIHJvdwoJCX0KCgkJb3B0aW9ucyA9IHsKCQkJY2xhc3NOYW1lOiAnZmMtbW9yZS1wb3BvdmVyJywKCQkJY29udGVudDogdGhpcy5yZW5kZXJTZWdQb3BvdmVyQ29udGVudChyb3csIGNvbCwgc2VncyksCgkJCXBhcmVudEVsOiB0aGlzLnZpZXcuZWwsIC8vIGF0dGFjaCB0byByb290IG9mIHZpZXcuIGd1YXJhbnRlZXMgb3V0c2lkZSBvZiBzY3JvbGxiYXJzLgoJCQl0b3A6IHRvcEVsLm9mZnNldCgpLnRvcCwKCQkJYXV0b0hpZGU6IHRydWUsIC8vIHdoZW4gdGhlIHVzZXIgY2xpY2tzIGVsc2V3aGVyZSwgaGlkZSB0aGUgcG9wb3ZlcgoJCQl2aWV3cG9ydENvbnN0cmFpbjogdmlldy5vcHQoJ3BvcG92ZXJWaWV3cG9ydENvbnN0cmFpbicpLAoJCQloaWRlOiBmdW5jdGlvbigpIHsKCQkJCS8vIGtpbGwgZXZlcnl0aGluZyB3aGVuIHRoZSBwb3BvdmVyIGlzIGhpZGRlbgoJCQkJX3RoaXMuc2VnUG9wb3Zlci5yZW1vdmVFbGVtZW50KCk7CgkJCQlfdGhpcy5zZWdQb3BvdmVyID0gbnVsbDsKCQkJCV90aGlzLnBvcG92ZXJTZWdzID0gbnVsbDsKCQkJfQoJCX07CgoJCS8vIERldGVybWluZSBob3Jpem9udGFsIGNvb3JkaW5hdGUuCgkJLy8gV2UgdXNlIHRoZSBtb3JlV3JhcCBpbnN0ZWFkIG9mIHRoZSA8dGQ+IHRvIGF2b2lkIGJvcmRlciBjb25mdXNpb24uCgkJaWYgKHRoaXMuaXNSVEwpIHsKCQkJb3B0aW9ucy5yaWdodCA9IG1vcmVXcmFwLm9mZnNldCgpLmxlZnQgKyBtb3JlV3JhcC5vdXRlcldpZHRoKCkgKyAxOyAvLyArMSB0byBiZSBvdmVyIGNlbGwgYm9yZGVyCgkJfQoJCWVsc2UgewoJCQlvcHRpb25zLmxlZnQgPSBtb3JlV3JhcC5vZmZzZXQoKS5sZWZ0IC0gMTsgLy8gLTEgdG8gYmUgb3ZlciBjZWxsIGJvcmRlcgoJCX0KCgkJdGhpcy5zZWdQb3BvdmVyID0gbmV3IFBvcG92ZXIob3B0aW9ucyk7CgkJdGhpcy5zZWdQb3BvdmVyLnNob3coKTsKCgkJLy8gdGhlIHBvcG92ZXIgZG9lc24ndCBsaXZlIHdpdGhpbiB0aGUgZ3JpZCdzIGNvbnRhaW5lciBlbGVtZW50LCBhbmQgdGh1cyB3b24ndCBnZXQgdGhlIGV2ZW50CgkJLy8gZGVsZWdhdGVkLWhhbmRsZXJzIGZvciBmcmVlLiBhdHRhY2ggZXZlbnQtcmVsYXRlZCBoYW5kbGVycyB0byB0aGUgcG9wb3Zlci4KCQl0aGlzLmJpbmRTZWdIYW5kbGVyc1RvRWwodGhpcy5zZWdQb3BvdmVyLmVsKTsKCX0sCgoKCS8vIEJ1aWxkcyB0aGUgaW5uZXIgRE9NIGNvbnRlbnRzIG9mIHRoZSBzZWdtZW50IHBvcG92ZXIKCXJlbmRlclNlZ1BvcG92ZXJDb250ZW50OiBmdW5jdGlvbihyb3csIGNvbCwgc2VncykgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBpc1RoZW1lID0gdmlldy5vcHQoJ3RoZW1lJyk7CgkJdmFyIHRpdGxlID0gdGhpcy5nZXRDZWxsRGF0ZShyb3csIGNvbCkuZm9ybWF0KHZpZXcub3B0KCdkYXlQb3BvdmVyRm9ybWF0JykpOwoJCXZhciBjb250ZW50ID0gJCgKCQkJJzxkaXYgY2xhc3M9ImZjLWhlYWRlciAnICsgdmlldy53aWRnZXRIZWFkZXJDbGFzcyArICciPicgKwoJCQkJJzxzcGFuIGNsYXNzPSJmYy1jbG9zZSAnICsKCQkJCQkoaXNUaGVtZSA/ICd1aS1pY29uIHVpLWljb24tY2xvc2V0aGljaycgOiAnZmMtaWNvbiBmYy1pY29uLXgnKSArCgkJCQknIj48L3NwYW4+JyArCgkJCQknPHNwYW4gY2xhc3M9ImZjLXRpdGxlIj4nICsKCQkJCQlodG1sRXNjYXBlKHRpdGxlKSArCgkJCQknPC9zcGFuPicgKwoJCQkJJzxkaXYgY2xhc3M9ImZjLWNsZWFyIi8+JyArCgkJCSc8L2Rpdj4nICsKCQkJJzxkaXYgY2xhc3M9ImZjLWJvZHkgJyArIHZpZXcud2lkZ2V0Q29udGVudENsYXNzICsgJyI+JyArCgkJCQknPGRpdiBjbGFzcz0iZmMtZXZlbnQtY29udGFpbmVyIj48L2Rpdj4nICsKCQkJJzwvZGl2PicKCQkpOwoJCXZhciBzZWdDb250YWluZXIgPSBjb250ZW50LmZpbmQoJy5mYy1ldmVudC1jb250YWluZXInKTsKCQl2YXIgaTsKCgkJLy8gcmVuZGVyIGVhY2ggc2VnJ3MgYGVsYCBhbmQgb25seSByZXR1cm4gdGhlIHZpc2libGUgc2VncwoJCXNlZ3MgPSB0aGlzLnJlbmRlckZnU2VnRWxzKHNlZ3MsIHRydWUpOyAvLyBkaXNhYmxlUmVzaXppbmc9dHJ1ZQoJCXRoaXMucG9wb3ZlclNlZ3MgPSBzZWdzOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoKCQkJLy8gYmVjYXVzZSBzZWdtZW50cyBpbiB0aGUgcG9wb3ZlciBhcmUgbm90IHBhcnQgb2YgYSBncmlkIGNvb3JkaW5hdGUgc3lzdGVtLCBwcm92aWRlIGEgaGludCB0byBhbnkKCQkJLy8gZ3JpZHMgdGhhdCB3YW50IHRvIGRvIGRyYWctbi1kcm9wIGFib3V0IHdoaWNoIGNlbGwgaXQgY2FtZSBmcm9tCgkJCXRoaXMucHJlcGFyZUhpdHMoKTsKCQkJc2Vnc1tpXS5oaXQgPSB0aGlzLmdldENlbGxIaXQocm93LCBjb2wpOwoJCQl0aGlzLnJlbGVhc2VIaXRzKCk7CgoJCQlzZWdDb250YWluZXIuYXBwZW5kKHNlZ3NbaV0uZWwpOwoJCX0KCgkJcmV0dXJuIGNvbnRlbnQ7Cgl9LAoKCgkvLyBHaXZlbiB0aGUgZXZlbnRzIHdpdGhpbiBhbiBhcnJheSBvZiBzZWdtZW50IG9iamVjdHMsIHJlc2xpY2UgdGhlbSB0byBiZSBpbiBhIHNpbmdsZSBkYXkKCXJlc2xpY2VEYXlTZWdzOiBmdW5jdGlvbihzZWdzLCBkYXlEYXRlKSB7CgoJCS8vIGJ1aWxkIGFuIGFycmF5IG9mIHRoZSBvcmlnaW5hbCBldmVudHMKCQl2YXIgZXZlbnRzID0gJC5tYXAoc2VncywgZnVuY3Rpb24oc2VnKSB7CgkJCXJldHVybiBzZWcuZXZlbnQ7CgkJfSk7CgoJCXZhciBkYXlTdGFydCA9IGRheURhdGUuY2xvbmUoKTsKCQl2YXIgZGF5RW5kID0gZGF5U3RhcnQuY2xvbmUoKS5hZGQoMSwgJ2RheXMnKTsKCQl2YXIgZGF5UmFuZ2UgPSB7IHN0YXJ0OiBkYXlTdGFydCwgZW5kOiBkYXlFbmQgfTsKCgkJLy8gc2xpY2UgdGhlIGV2ZW50cyB3aXRoIGEgY3VzdG9tIHNsaWNpbmcgZnVuY3Rpb24KCQlzZWdzID0gdGhpcy5ldmVudHNUb1NlZ3MoCgkJCWV2ZW50cywKCQkJZnVuY3Rpb24ocmFuZ2UpIHsKCQkJCXZhciBzZWcgPSBpbnRlcnNlY3RSYW5nZXMocmFuZ2UsIGRheVJhbmdlKTsgLy8gdW5kZWZpbmQgaWYgbm8gaW50ZXJzZWN0aW9uCgkJCQlyZXR1cm4gc2VnID8gWyBzZWcgXSA6IFtdOyAvLyBtdXN0IHJldHVybiBhbiBhcnJheSBvZiBzZWdtZW50cwoJCQl9CgkJKTsKCgkJLy8gZm9yY2UgYW4gb3JkZXIgYmVjYXVzZSBldmVudHNUb1NlZ3MgZG9lc24ndCBndWFyYW50ZWUgb25lCgkJdGhpcy5zb3J0RXZlbnRTZWdzKHNlZ3MpOwoKCQlyZXR1cm4gc2VnczsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgdGV4dCB0aGF0IHNob3VsZCBiZSBpbnNpZGUgYSAibW9yZSIgbGluaywgZ2l2ZW4gdGhlIG51bWJlciBvZiBldmVudHMgaXQgcmVwcmVzZW50cwoJZ2V0TW9yZUxpbmtUZXh0OiBmdW5jdGlvbihudW0pIHsKCQl2YXIgb3B0ID0gdGhpcy52aWV3Lm9wdCgnZXZlbnRMaW1pdFRleHQnKTsKCgkJaWYgKHR5cGVvZiBvcHQgPT09ICdmdW5jdGlvbicpIHsKCQkJcmV0dXJuIG9wdChudW0pOwoJCX0KCQllbHNlIHsKCQkJcmV0dXJuICcrJyArIG51bSArICcgJyArIG9wdDsKCQl9Cgl9LAoKCgkvLyBSZXR1cm5zIHNlZ21lbnRzIHdpdGhpbiBhIGdpdmVuIGNlbGwuCgkvLyBJZiBgc3RhcnRMZXZlbGAgaXMgc3BlY2lmaWVkLCByZXR1cm5zIG9ubHkgZXZlbnRzIGluY2x1ZGluZyBhbmQgYmVsb3cgdGhhdCBsZXZlbC4gT3RoZXJ3aXNlIHJldHVybnMgYWxsIHNlZ3MuCglnZXRDZWxsU2VnczogZnVuY3Rpb24ocm93LCBjb2wsIHN0YXJ0TGV2ZWwpIHsKCQl2YXIgc2VnTWF0cml4ID0gdGhpcy5yb3dTdHJ1Y3RzW3Jvd10uc2VnTWF0cml4OwoJCXZhciBsZXZlbCA9IHN0YXJ0TGV2ZWwgfHwgMDsKCQl2YXIgc2VncyA9IFtdOwoJCXZhciBzZWc7CgoJCXdoaWxlIChsZXZlbCA8IHNlZ01hdHJpeC5sZW5ndGgpIHsKCQkJc2VnID0gc2VnTWF0cml4W2xldmVsXVtjb2xdOwoJCQlpZiAoc2VnKSB7CgkJCQlzZWdzLnB1c2goc2VnKTsKCQkJfQoJCQlsZXZlbCsrOwoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9Cgp9KTsKCjs7CgovKiBBIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgb25lIG9yIG1vcmUgY29sdW1ucyBvZiB2ZXJ0aWNhbCB0aW1lIHNsb3RzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovLyBXZSBtaXhpbiBEYXlUYWJsZSwgZXZlbiB0aG91Z2ggdGhlcmUgaXMgb25seSBhIHNpbmdsZSByb3cgb2YgZGF5cwoKdmFyIFRpbWVHcmlkID0gRkMuVGltZUdyaWQgPSBHcmlkLmV4dGVuZChEYXlUYWJsZU1peGluLCB7CgoJc2xvdER1cmF0aW9uOiBudWxsLCAvLyBkdXJhdGlvbiBvZiBhICJzbG90IiwgYSBkaXN0aW5jdCB0aW1lIHNlZ21lbnQgb24gZ2l2ZW4gZGF5LCB2aXN1YWxpemVkIGJ5IGxpbmVzCglzbmFwRHVyYXRpb246IG51bGwsIC8vIGdyYW51bGFyaXR5IG9mIHRpbWUgZm9yIGRyYWdnaW5nIGFuZCBzZWxlY3RpbmcKCXNuYXBzUGVyU2xvdDogbnVsbCwKCW1pblRpbWU6IG51bGwsIC8vIER1cmF0aW9uIG9iamVjdCB0aGF0IGRlbm90ZXMgdGhlIGZpcnN0IHZpc2libGUgdGltZSBvZiBhbnkgZ2l2ZW4gZGF5CgltYXhUaW1lOiBudWxsLCAvLyBEdXJhdGlvbiBvYmplY3QgdGhhdCBkZW5vdGVzIHRoZSBleGNsdXNpdmUgdmlzaWJsZSBlbmQgdGltZSBvZiBhbnkgZ2l2ZW4gZGF5CglsYWJlbEZvcm1hdDogbnVsbCwgLy8gZm9ybWF0dGluZyBzdHJpbmcgZm9yIHRpbWVzIHJ1bm5pbmcgYWxvbmcgdmVydGljYWwgYXhpcwoJbGFiZWxJbnRlcnZhbDogbnVsbCwgLy8gZHVyYXRpb24gb2YgaG93IG9mdGVuIGEgbGFiZWwgc2hvdWxkIGJlIGRpc3BsYXllZCBmb3IgYSBzbG90CgoJY29sRWxzOiBudWxsLCAvLyBjZWxscyBlbGVtZW50cyBpbiB0aGUgZGF5LXJvdyBiYWNrZ3JvdW5kCglzbGF0Q29udGFpbmVyRWw6IG51bGwsIC8vIGRpdiB0aGF0IHdyYXBzIGFsbCB0aGUgc2xhdCByb3dzCglzbGF0RWxzOiBudWxsLCAvLyBlbGVtZW50cyBydW5uaW5nIGhvcml6b250YWxseSBhY3Jvc3MgYWxsIGNvbHVtbnMKCW5vd0luZGljYXRvckVsczogbnVsbCwKCgljb2xDb29yZENhY2hlOiBudWxsLAoJc2xhdENvb3JkQ2FjaGU6IG51bGwsCgoKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbigpIHsKCQlHcmlkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGNhbGwgdGhlIHN1cGVyLWNvbnN0cnVjdG9yCgoJCXRoaXMucHJvY2Vzc09wdGlvbnMoKTsKCX0sCgoKCS8vIFJlbmRlcnMgdGhlIHRpbWUgZ3JpZCBpbnRvIGB0aGlzLmVsYCwgd2hpY2ggc2hvdWxkIGFscmVhZHkgYmUgYXNzaWduZWQuCgkvLyBSZWxpZXMgb24gdGhlIHZpZXcncyBjb2xDbnQuIEluIHRoZSBmdXR1cmUsIHRoaXMgY29tcG9uZW50IHNob3VsZCBwcm9iYWJseSBiZSBzZWxmLXN1ZmZpY2llbnQuCglyZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbC5odG1sKHRoaXMucmVuZGVySHRtbCgpKTsKCQl0aGlzLmNvbEVscyA9IHRoaXMuZWwuZmluZCgnLmZjLWRheScpOwoJCXRoaXMuc2xhdENvbnRhaW5lckVsID0gdGhpcy5lbC5maW5kKCcuZmMtc2xhdHMnKTsKCQl0aGlzLnNsYXRFbHMgPSB0aGlzLnNsYXRDb250YWluZXJFbC5maW5kKCd0cicpOwoKCQl0aGlzLmNvbENvb3JkQ2FjaGUgPSBuZXcgQ29vcmRDYWNoZSh7CgkJCWVsczogdGhpcy5jb2xFbHMsCgkJCWlzSG9yaXpvbnRhbDogdHJ1ZQoJCX0pOwoJCXRoaXMuc2xhdENvb3JkQ2FjaGUgPSBuZXcgQ29vcmRDYWNoZSh7CgkJCWVsczogdGhpcy5zbGF0RWxzLAoJCQlpc1ZlcnRpY2FsOiB0cnVlCgkJfSk7CgoJCXRoaXMucmVuZGVyQ29udGVudFNrZWxldG9uKCk7Cgl9LAoKCgkvLyBSZW5kZXJzIHRoZSBiYXNpYyBIVE1MIHNrZWxldG9uIGZvciB0aGUgZ3JpZAoJcmVuZGVySHRtbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICcnICsKCQkJJzxkaXYgY2xhc3M9ImZjLWJnIj4nICsKCQkJCSc8dGFibGU+JyArCgkJCQkJdGhpcy5yZW5kZXJCZ1RySHRtbCgwKSArIC8vIHJvdz0wCgkJCQknPC90YWJsZT4nICsKCQkJJzwvZGl2PicgKwoJCQknPGRpdiBjbGFzcz0iZmMtc2xhdHMiPicgKwoJCQkJJzx0YWJsZT4nICsKCQkJCQl0aGlzLnJlbmRlclNsYXRSb3dIdG1sKCkgKwoJCQkJJzwvdGFibGU+JyArCgkJCSc8L2Rpdj4nOwoJfSwKCgoJLy8gR2VuZXJhdGVzIHRoZSBIVE1MIGZvciB0aGUgaG9yaXpvbnRhbCAic2xhdHMiIHRoYXQgcnVuIHdpZHRoLXdpc2UuIEhhcyBhIHRpbWUgYXhpcyBvbiBhIHNpZGUuIERlcGVuZHMgb24gUlRMLgoJcmVuZGVyU2xhdFJvd0h0bWw6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBpc1JUTCA9IHRoaXMuaXNSVEw7CgkJdmFyIGh0bWwgPSAnJzsKCQl2YXIgc2xvdFRpbWUgPSBtb21lbnQuZHVyYXRpb24oK3RoaXMubWluVGltZSk7IC8vIHdpc2ggdGhlcmUgd2FzIC5jbG9uZSgpIGZvciBkdXJhdGlvbnMKCQl2YXIgc2xvdERhdGU7IC8vIHdpbGwgYmUgb24gdGhlIHZpZXcncyBmaXJzdCBkYXksIGJ1dCB3ZSBvbmx5IGNhcmUgYWJvdXQgaXRzIHRpbWUKCQl2YXIgaXNMYWJlbGVkOwoJCXZhciBheGlzSHRtbDsKCgkJLy8gQ2FsY3VsYXRlIHRoZSB0aW1lIGZvciBlYWNoIHNsb3QKCQl3aGlsZSAoc2xvdFRpbWUgPCB0aGlzLm1heFRpbWUpIHsKCQkJc2xvdERhdGUgPSB0aGlzLnN0YXJ0LmNsb25lKCkudGltZShzbG90VGltZSk7CgkJCWlzTGFiZWxlZCA9IGlzSW50KGRpdmlkZUR1cmF0aW9uQnlEdXJhdGlvbihzbG90VGltZSwgdGhpcy5sYWJlbEludGVydmFsKSk7CgoJCQlheGlzSHRtbCA9CgkJCQknPHRkIGNsYXNzPSJmYy1heGlzIGZjLXRpbWUgJyArIHZpZXcud2lkZ2V0Q29udGVudENsYXNzICsgJyIgJyArIHZpZXcuYXhpc1N0eWxlQXR0cigpICsgJz4nICsKCQkJCQkoaXNMYWJlbGVkID8KCQkJCQkJJzxzcGFuPicgKyAvLyBmb3IgbWF0Y2hDZWxsV2lkdGhzCgkJCQkJCQlodG1sRXNjYXBlKHNsb3REYXRlLmZvcm1hdCh0aGlzLmxhYmVsRm9ybWF0KSkgKwoJCQkJCQknPC9zcGFuPicgOgoJCQkJCQknJwoJCQkJCQkpICsKCQkJCSc8L3RkPic7CgoJCQlodG1sICs9CgkJCQknPHRyIGRhdGEtdGltZT0iJyArIHNsb3REYXRlLmZvcm1hdCgnSEg6bW06c3MnKSArICciJyArCgkJCQkJKGlzTGFiZWxlZCA/ICcnIDogJyBjbGFzcz0iZmMtbWlub3IiJykgKwoJCQkJCSc+JyArCgkJCQkJKCFpc1JUTCA/IGF4aXNIdG1sIDogJycpICsKCQkJCQknPHRkIGNsYXNzPSInICsgdmlldy53aWRnZXRDb250ZW50Q2xhc3MgKyAnIi8+JyArCgkJCQkJKGlzUlRMID8gYXhpc0h0bWwgOiAnJykgKwoJCQkJIjwvdHI+IjsKCgkJCXNsb3RUaW1lLmFkZCh0aGlzLnNsb3REdXJhdGlvbik7CgkJfQoKCQlyZXR1cm4gaHRtbDsKCX0sCgoKCS8qIE9wdGlvbnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFBhcnNlcyB2YXJpb3VzIG9wdGlvbnMgaW50byBwcm9wZXJ0aWVzIG9mIHRoaXMgb2JqZWN0Cglwcm9jZXNzT3B0aW9uczogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIHNsb3REdXJhdGlvbiA9IHZpZXcub3B0KCdzbG90RHVyYXRpb24nKTsKCQl2YXIgc25hcER1cmF0aW9uID0gdmlldy5vcHQoJ3NuYXBEdXJhdGlvbicpOwoJCXZhciBpbnB1dDsKCgkJc2xvdER1cmF0aW9uID0gbW9tZW50LmR1cmF0aW9uKHNsb3REdXJhdGlvbik7CgkJc25hcER1cmF0aW9uID0gc25hcER1cmF0aW9uID8gbW9tZW50LmR1cmF0aW9uKHNuYXBEdXJhdGlvbikgOiBzbG90RHVyYXRpb247CgoJCXRoaXMuc2xvdER1cmF0aW9uID0gc2xvdER1cmF0aW9uOwoJCXRoaXMuc25hcER1cmF0aW9uID0gc25hcER1cmF0aW9uOwoJCXRoaXMuc25hcHNQZXJTbG90ID0gc2xvdER1cmF0aW9uIC8gc25hcER1cmF0aW9uOyAvLyBUT0RPOiBlbnN1cmUgYW4gaW50ZWdlciBtdWx0aXBsZT8KCgkJdGhpcy5taW5SZXNpemVEdXJhdGlvbiA9IHNuYXBEdXJhdGlvbjsgLy8gaGFjawoKCQl0aGlzLm1pblRpbWUgPSBtb21lbnQuZHVyYXRpb24odmlldy5vcHQoJ21pblRpbWUnKSk7CgkJdGhpcy5tYXhUaW1lID0gbW9tZW50LmR1cmF0aW9uKHZpZXcub3B0KCdtYXhUaW1lJykpOwoKCQkvLyBtaWdodCBiZSBhbiBhcnJheSB2YWx1ZSAoZm9yIFRpbWVsaW5lVmlldykuCgkJLy8gaWYgc28sIGdldHRpbmcgdGhlIG1vc3QgZ3JhbnVsYXIgZW50cnkgKHRoZSBsYXN0IG9uZSBwcm9iYWJseSkuCgkJaW5wdXQgPSB2aWV3Lm9wdCgnc2xvdExhYmVsRm9ybWF0Jyk7CgkJaWYgKCQuaXNBcnJheShpbnB1dCkpIHsKCQkJaW5wdXQgPSBpbnB1dFtpbnB1dC5sZW5ndGggLSAxXTsKCQl9CgoJCXRoaXMubGFiZWxGb3JtYXQgPQoJCQlpbnB1dCB8fAoJCQl2aWV3Lm9wdCgnc21hbGxUaW1lRm9ybWF0Jyk7IC8vIHRoZSBjb21wdXRlZCBkZWZhdWx0CgoJCWlucHV0ID0gdmlldy5vcHQoJ3Nsb3RMYWJlbEludGVydmFsJyk7CgkJdGhpcy5sYWJlbEludGVydmFsID0gaW5wdXQgPwoJCQltb21lbnQuZHVyYXRpb24oaW5wdXQpIDoKCQkJdGhpcy5jb21wdXRlTGFiZWxJbnRlcnZhbChzbG90RHVyYXRpb24pOwoJfSwKCgoJLy8gQ29tcHV0ZXMgYW4gYXV0b21hdGljIHZhbHVlIGZvciBzbG90TGFiZWxJbnRlcnZhbAoJY29tcHV0ZUxhYmVsSW50ZXJ2YWw6IGZ1bmN0aW9uKHNsb3REdXJhdGlvbikgewoJCXZhciBpOwoJCXZhciBsYWJlbEludGVydmFsOwoJCXZhciBzbG90c1BlckxhYmVsOwoKCQkvLyBmaW5kIHRoZSBzbWFsbGVzdCBzdG9jayBsYWJlbCBpbnRlcnZhbCB0aGF0IHJlc3VsdHMgaW4gbW9yZSB0aGFuIG9uZSBzbG90cy1wZXItbGFiZWwKCQlmb3IgKGkgPSBBR0VOREFfU1RPQ0tfU1VCX0RVUkFUSU9OUy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQlsYWJlbEludGVydmFsID0gbW9tZW50LmR1cmF0aW9uKEFHRU5EQV9TVE9DS19TVUJfRFVSQVRJT05TW2ldKTsKCQkJc2xvdHNQZXJMYWJlbCA9IGRpdmlkZUR1cmF0aW9uQnlEdXJhdGlvbihsYWJlbEludGVydmFsLCBzbG90RHVyYXRpb24pOwoJCQlpZiAoaXNJbnQoc2xvdHNQZXJMYWJlbCkgJiYgc2xvdHNQZXJMYWJlbCA+IDEpIHsKCQkJCXJldHVybiBsYWJlbEludGVydmFsOwoJCQl9CgkJfQoKCQlyZXR1cm4gbW9tZW50LmR1cmF0aW9uKHNsb3REdXJhdGlvbik7IC8vIGZhbGwgYmFjay4gY2xvbmUKCX0sCgoKCS8vIENvbXB1dGVzIGEgZGVmYXVsdCBldmVudCB0aW1lIGZvcm1hdHRpbmcgc3RyaW5nIGlmIGB0aW1lRm9ybWF0YCBpcyBub3QgZXhwbGljaXRseSBkZWZpbmVkCgljb21wdXRlRXZlbnRUaW1lRm9ybWF0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy52aWV3Lm9wdCgnbm9NZXJpZGllbVRpbWVGb3JtYXQnKTsgLy8gbGlrZSAiNjozMCIgKG5vIEFNL1BNKQoJfSwKCgoJLy8gQ29tcHV0ZXMgYSBkZWZhdWx0IGBkaXNwbGF5RXZlbnRFbmRgIHZhbHVlIGlmIG9uZSBpcyBub3QgZXhwbGljbHR5IGRlZmluZWQKCWNvbXB1dGVEaXNwbGF5RXZlbnRFbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0cnVlOwoJfSwKCgoJLyogSGl0IFN5c3RlbQoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcHJlcGFyZUhpdHM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuY29sQ29vcmRDYWNoZS5idWlsZCgpOwoJCXRoaXMuc2xhdENvb3JkQ2FjaGUuYnVpbGQoKTsKCX0sCgoKCXJlbGVhc2VIaXRzOiBmdW5jdGlvbigpIHsKCQl0aGlzLmNvbENvb3JkQ2FjaGUuY2xlYXIoKTsKCQkvLyBOT1RFOiBkb24ndCBjbGVhciBzbGF0Q29vcmRDYWNoZSBiZWNhdXNlIHdlIHJlbHkgb24gaXQgZm9yIGNvbXB1dGVUaW1lVG9wCgl9LAoKCglxdWVyeUhpdDogZnVuY3Rpb24obGVmdE9mZnNldCwgdG9wT2Zmc2V0KSB7CgkJdmFyIHNuYXBzUGVyU2xvdCA9IHRoaXMuc25hcHNQZXJTbG90OwoJCXZhciBjb2xDb29yZENhY2hlID0gdGhpcy5jb2xDb29yZENhY2hlOwoJCXZhciBzbGF0Q29vcmRDYWNoZSA9IHRoaXMuc2xhdENvb3JkQ2FjaGU7CgoJCWlmIChjb2xDb29yZENhY2hlLmlzTGVmdEluQm91bmRzKGxlZnRPZmZzZXQpICYmIHNsYXRDb29yZENhY2hlLmlzVG9wSW5Cb3VuZHModG9wT2Zmc2V0KSkgewoJCQl2YXIgY29sSW5kZXggPSBjb2xDb29yZENhY2hlLmdldEhvcml6b250YWxJbmRleChsZWZ0T2Zmc2V0KTsKCQkJdmFyIHNsYXRJbmRleCA9IHNsYXRDb29yZENhY2hlLmdldFZlcnRpY2FsSW5kZXgodG9wT2Zmc2V0KTsKCgkJCWlmIChjb2xJbmRleCAhPSBudWxsICYmIHNsYXRJbmRleCAhPSBudWxsKSB7CgkJCQl2YXIgc2xhdFRvcCA9IHNsYXRDb29yZENhY2hlLmdldFRvcE9mZnNldChzbGF0SW5kZXgpOwoJCQkJdmFyIHNsYXRIZWlnaHQgPSBzbGF0Q29vcmRDYWNoZS5nZXRIZWlnaHQoc2xhdEluZGV4KTsKCQkJCXZhciBwYXJ0aWFsID0gKHRvcE9mZnNldCAtIHNsYXRUb3ApIC8gc2xhdEhlaWdodDsgLy8gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGJldHdlZW4gMCBhbmQgMQoJCQkJdmFyIGxvY2FsU25hcEluZGV4ID0gTWF0aC5mbG9vcihwYXJ0aWFsICogc25hcHNQZXJTbG90KTsgLy8gdGhlIHNuYXAgIyByZWxhdGl2ZSB0byBzdGFydCBvZiBzbGF0CgkJCQl2YXIgc25hcEluZGV4ID0gc2xhdEluZGV4ICogc25hcHNQZXJTbG90ICsgbG9jYWxTbmFwSW5kZXg7CgkJCQl2YXIgc25hcFRvcCA9IHNsYXRUb3AgKyAobG9jYWxTbmFwSW5kZXggLyBzbmFwc1BlclNsb3QpICogc2xhdEhlaWdodDsKCQkJCXZhciBzbmFwQm90dG9tID0gc2xhdFRvcCArICgobG9jYWxTbmFwSW5kZXggKyAxKSAvIHNuYXBzUGVyU2xvdCkgKiBzbGF0SGVpZ2h0OwoKCQkJCXJldHVybiB7CgkJCQkJY29sOiBjb2xJbmRleCwKCQkJCQlzbmFwOiBzbmFwSW5kZXgsCgkJCQkJY29tcG9uZW50OiB0aGlzLCAvLyBuZWVkZWQgdW5mb3J0dW5hdGVseSA6KAoJCQkJCWxlZnQ6IGNvbENvb3JkQ2FjaGUuZ2V0TGVmdE9mZnNldChjb2xJbmRleCksCgkJCQkJcmlnaHQ6IGNvbENvb3JkQ2FjaGUuZ2V0UmlnaHRPZmZzZXQoY29sSW5kZXgpLAoJCQkJCXRvcDogc25hcFRvcCwKCQkJCQlib3R0b206IHNuYXBCb3R0b20KCQkJCX07CgkJCX0KCQl9Cgl9LAoKCglnZXRIaXRTcGFuOiBmdW5jdGlvbihoaXQpIHsKCQl2YXIgc3RhcnQgPSB0aGlzLmdldENlbGxEYXRlKDAsIGhpdC5jb2wpOyAvLyByb3c9MAoJCXZhciB0aW1lID0gdGhpcy5jb21wdXRlU25hcFRpbWUoaGl0LnNuYXApOyAvLyBwYXNzIGluIHRoZSBzbmFwLWluZGV4CgkJdmFyIGVuZDsKCgkJc3RhcnQudGltZSh0aW1lKTsKCQllbmQgPSBzdGFydC5jbG9uZSgpLmFkZCh0aGlzLnNuYXBEdXJhdGlvbik7CgoJCXJldHVybiB7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfTsKCX0sCgoKCWdldEhpdEVsOiBmdW5jdGlvbihoaXQpIHsKCQlyZXR1cm4gdGhpcy5jb2xFbHMuZXEoaGl0LmNvbCk7Cgl9LAoKCgkvKiBEYXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmFuZ2VVcGRhdGVkOiBmdW5jdGlvbigpIHsKCQl0aGlzLnVwZGF0ZURheVRhYmxlKCk7Cgl9LAoKCgkvLyBHaXZlbiBhIHJvdyBudW1iZXIgb2YgdGhlIGdyaWQsIHJlcHJlc2VudGluZyBhICJzbmFwIiwgcmV0dXJucyBhIHRpbWUgKER1cmF0aW9uKSBmcm9tIGl0cyBzdGFydC1vZi1kYXkKCWNvbXB1dGVTbmFwVGltZTogZnVuY3Rpb24oc25hcEluZGV4KSB7CgkJcmV0dXJuIG1vbWVudC5kdXJhdGlvbih0aGlzLm1pblRpbWUgKyB0aGlzLnNuYXBEdXJhdGlvbiAqIHNuYXBJbmRleCk7Cgl9LAoKCgkvLyBTbGljZXMgdXAgdGhlIGdpdmVuIHNwYW4gKHVuem9uZWQgc3RhcnQvZW5kIHdpdGggb3RoZXIgbWlzYyBkYXRhKSBpbnRvIGFuIGFycmF5IG9mIHNlZ21lbnRzCglzcGFuVG9TZWdzOiBmdW5jdGlvbihzcGFuKSB7CgkJdmFyIHNlZ3MgPSB0aGlzLnNsaWNlUmFuZ2VCeVRpbWVzKHNwYW4pOwoJCXZhciBpOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQlpZiAodGhpcy5pc1JUTCkgewoJCQkJc2Vnc1tpXS5jb2wgPSB0aGlzLmRheXNQZXJSb3cgLSAxIC0gc2Vnc1tpXS5kYXlJbmRleDsKCQkJfQoJCQllbHNlIHsKCQkJCXNlZ3NbaV0uY29sID0gc2Vnc1tpXS5kYXlJbmRleDsKCQkJfQoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCglzbGljZVJhbmdlQnlUaW1lczogZnVuY3Rpb24ocmFuZ2UpIHsKCQl2YXIgc2VncyA9IFtdOwoJCXZhciBzZWc7CgkJdmFyIGRheUluZGV4OwoJCXZhciBkYXlEYXRlOwoJCXZhciBkYXlSYW5nZTsKCgkJZm9yIChkYXlJbmRleCA9IDA7IGRheUluZGV4IDwgdGhpcy5kYXlzUGVyUm93OyBkYXlJbmRleCsrKSB7CgkJCWRheURhdGUgPSB0aGlzLmRheURhdGVzW2RheUluZGV4XS5jbG9uZSgpOyAvLyBUT0RPOiBiZXR0ZXIgQVBJIGZvciB0aGlzPwoJCQlkYXlSYW5nZSA9IHsKCQkJCXN0YXJ0OiBkYXlEYXRlLmNsb25lKCkudGltZSh0aGlzLm1pblRpbWUpLAoJCQkJZW5kOiBkYXlEYXRlLmNsb25lKCkudGltZSh0aGlzLm1heFRpbWUpCgkJCX07CgkJCXNlZyA9IGludGVyc2VjdFJhbmdlcyhyYW5nZSwgZGF5UmFuZ2UpOyAvLyBib3RoIHdpbGwgYmUgYW1iaWcgdGltZXpvbmUKCQkJaWYgKHNlZykgewoJCQkJc2VnLmRheUluZGV4ID0gZGF5SW5kZXg7CgkJCQlzZWdzLnB1c2goc2VnKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCgkvKiBDb29yZGluYXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJdXBkYXRlU2l6ZTogZnVuY3Rpb24oaXNSZXNpemUpIHsgLy8gTk9UIGEgc3RhbmRhcmQgR3JpZCBtZXRob2QKCQl0aGlzLnNsYXRDb29yZENhY2hlLmJ1aWxkKCk7CgoJCWlmIChpc1Jlc2l6ZSkgewoJCQl0aGlzLnVwZGF0ZVNlZ1ZlcnRpY2FscygKCQkJCVtdLmNvbmNhdCh0aGlzLmZnU2VncyB8fCBbXSwgdGhpcy5iZ1NlZ3MgfHwgW10sIHRoaXMuYnVzaW5lc3NTZWdzIHx8IFtdKQoJCQkpOwoJCX0KCX0sCgoKCWdldFRvdGFsU2xhdEhlaWdodDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuc2xhdENvbnRhaW5lckVsLm91dGVySGVpZ2h0KCk7Cgl9LAoKCgkvLyBDb21wdXRlcyB0aGUgdG9wIGNvb3JkaW5hdGUsIHJlbGF0aXZlIHRvIHRoZSBib3VuZHMgb2YgdGhlIGdyaWQsIG9mIHRoZSBnaXZlbiBkYXRlLgoJLy8gQSBgc3RhcnRPZkRheURhdGVgIG11c3QgYmUgZ2l2ZW4gZm9yIGF2b2lkaW5nIGFtYmlndWl0eSBvdmVyIGhvdyB0byB0cmVhdCBtaWRuaWdodC4KCWNvbXB1dGVEYXRlVG9wOiBmdW5jdGlvbihkYXRlLCBzdGFydE9mRGF5RGF0ZSkgewoJCXJldHVybiB0aGlzLmNvbXB1dGVUaW1lVG9wKAoJCQltb21lbnQuZHVyYXRpb24oCgkJCQlkYXRlIC0gc3RhcnRPZkRheURhdGUuY2xvbmUoKS5zdHJpcFRpbWUoKQoJCQkpCgkJKTsKCX0sCgoKCS8vIENvbXB1dGVzIHRoZSB0b3AgY29vcmRpbmF0ZSwgcmVsYXRpdmUgdG8gdGhlIGJvdW5kcyBvZiB0aGUgZ3JpZCwgb2YgdGhlIGdpdmVuIHRpbWUgKGEgRHVyYXRpb24pLgoJY29tcHV0ZVRpbWVUb3A6IGZ1bmN0aW9uKHRpbWUpIHsKCQl2YXIgbGVuID0gdGhpcy5zbGF0RWxzLmxlbmd0aDsKCQl2YXIgc2xhdENvdmVyYWdlID0gKHRpbWUgLSB0aGlzLm1pblRpbWUpIC8gdGhpcy5zbG90RHVyYXRpb247IC8vIGZsb2F0aW5nLXBvaW50IHZhbHVlIG9mICMgb2Ygc2xvdHMgY292ZXJlZAoJCXZhciBzbGF0SW5kZXg7CgkJdmFyIHNsYXRSZW1haW5kZXI7CgoJCS8vIGNvbXB1dGUgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgZm9yIGhvdyBtYW55IHNsYXRzIHNob3VsZCBiZSBwcm9ncmVzc2VkIHRocm91Z2guCgkJLy8gZnJvbSAwIHRvIG51bWJlciBvZiBzbGF0cyAoaW5jbHVzaXZlKQoJCS8vIGNvbnN0cmFpbmVkIGJlY2F1c2UgbWluVGltZS9tYXhUaW1lIG1pZ2h0IGJlIGN1c3RvbWl6ZWQuCgkJc2xhdENvdmVyYWdlID0gTWF0aC5tYXgoMCwgc2xhdENvdmVyYWdlKTsKCQlzbGF0Q292ZXJhZ2UgPSBNYXRoLm1pbihsZW4sIHNsYXRDb3ZlcmFnZSk7CgoJCS8vIGFuIGludGVnZXIgaW5kZXggb2YgdGhlIGZ1cnRoZXN0IHdob2xlIHNsYXQKCQkvLyBmcm9tIDAgdG8gbnVtYmVyIHNsYXRzICgqZXhjbHVzaXZlKiwgc28gbGVuLTEpCgkJc2xhdEluZGV4ID0gTWF0aC5mbG9vcihzbGF0Q292ZXJhZ2UpOwoJCXNsYXRJbmRleCA9IE1hdGgubWluKHNsYXRJbmRleCwgbGVuIC0gMSk7CgoJCS8vIGhvdyBtdWNoIGZ1cnRoZXIgdGhyb3VnaCB0aGUgc2xhdEluZGV4IHNsYXQgKGZyb20gMC4wLTEuMCkgbXVzdCBiZSBjb3ZlcmVkIGluIGFkZGl0aW9uLgoJCS8vIGNvdWxkIGJlIDEuMCBpZiBzbGF0Q292ZXJhZ2UgaXMgY292ZXJpbmcgKmFsbCogdGhlIHNsb3RzCgkJc2xhdFJlbWFpbmRlciA9IHNsYXRDb3ZlcmFnZSAtIHNsYXRJbmRleDsKCgkJcmV0dXJuIHRoaXMuc2xhdENvb3JkQ2FjaGUuZ2V0VG9wUG9zaXRpb24oc2xhdEluZGV4KSArCgkJCXRoaXMuc2xhdENvb3JkQ2FjaGUuZ2V0SGVpZ2h0KHNsYXRJbmRleCkgKiBzbGF0UmVtYWluZGVyOwoJfSwKCgoKCS8qIEV2ZW50IERyYWcgVmlzdWFsaXphdGlvbgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IGJlaW5nIGRyYWdnZWQgb3ZlciB0aGUgc3BlY2lmaWVkIGRhdGUocykuCgkvLyBBIHJldHVybmVkIHZhbHVlIG9mIGB0cnVlYCBzaWduYWxzIHRoYXQgYSBtb2NrICJoZWxwZXIiIGV2ZW50IGhhcyBiZWVuIHJlbmRlcmVkLgoJcmVuZGVyRHJhZzogZnVuY3Rpb24oZXZlbnRMb2NhdGlvbiwgc2VnKSB7CgoJCWlmIChzZWcpIHsgLy8gaWYgdGhlcmUgaXMgZXZlbnQgaW5mb3JtYXRpb24gZm9yIHRoaXMgZHJhZywgcmVuZGVyIGEgaGVscGVyIGV2ZW50CgoJCQkvLyByZXR1cm5zIG1vY2sgZXZlbnQgZWxlbWVudHMKCQkJLy8gc2lnbmFsIHRoYXQgYSBoZWxwZXIgaGFzIGJlZW4gcmVuZGVyZWQKCQkJcmV0dXJuIHRoaXMucmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcihldmVudExvY2F0aW9uLCBzZWcpOwoJCX0KCQllbHNlIHsKCQkJLy8gb3RoZXJ3aXNlLCBqdXN0IHJlbmRlciBhIGhpZ2hsaWdodAoJCQl0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKGV2ZW50TG9jYXRpb24pKTsKCQl9Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYW55IHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IGJlaW5nIGRyYWdnZWQKCXVucmVuZGVyRHJhZzogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckhlbHBlcigpOwoJCXRoaXMudW5yZW5kZXJIaWdobGlnaHQoKTsKCX0sCgoKCS8qIEV2ZW50IFJlc2l6ZSBWaXN1YWxpemF0aW9uCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBSZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYW4gZXZlbnQgYmVpbmcgcmVzaXplZAoJcmVuZGVyRXZlbnRSZXNpemU6IGZ1bmN0aW9uKGV2ZW50TG9jYXRpb24sIHNlZykgewoJCXJldHVybiB0aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIoZXZlbnRMb2NhdGlvbiwgc2VnKTsgLy8gcmV0dXJucyBtb2NrIGV2ZW50IGVsZW1lbnRzCgl9LAoKCgkvLyBVbnJlbmRlcnMgYW55IHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IGJlaW5nIHJlc2l6ZWQKCXVucmVuZGVyRXZlbnRSZXNpemU6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5yZW5kZXJIZWxwZXIoKTsKCX0sCgoKCS8qIEV2ZW50IEhlbHBlcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIG1vY2sgImhlbHBlciIgZXZlbnQuIGBzb3VyY2VTZWdgIGlzIHRoZSBvcmlnaW5hbCBzZWdtZW50IG9iamVjdCBhbmQgbWlnaHQgYmUgbnVsbCAoYW4gZXh0ZXJuYWwgZHJhZykKCXJlbmRlckhlbHBlcjogZnVuY3Rpb24oZXZlbnQsIHNvdXJjZVNlZykgewoJCXJldHVybiB0aGlzLnJlbmRlckhlbHBlclNlZ3ModGhpcy5ldmVudFRvU2VncyhldmVudCksIHNvdXJjZVNlZyk7IC8vIHJldHVybnMgbW9jayBldmVudCBlbGVtZW50cwoJfSwKCgoJLy8gVW5yZW5kZXJzIGFueSBtb2NrIGhlbHBlciBldmVudAoJdW5yZW5kZXJIZWxwZXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5yZW5kZXJIZWxwZXJTZWdzKCk7Cgl9LAoKCgkvKiBCdXNpbmVzcyBIb3VycwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJdGhpcy5yZW5kZXJCdXNpbmVzc1NlZ3MoCgkJCXRoaXMuYnVpbGRCdXNpbmVzc0hvdXJTZWdzKCkKCQkpOwoJfSwKCgoJdW5yZW5kZXJCdXNpbmVzc0hvdXJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnVucmVuZGVyQnVzaW5lc3NTZWdzKCk7Cgl9LAoKCgkvKiBOb3cgSW5kaWNhdG9yCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglnZXROb3dJbmRpY2F0b3JVbml0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gJ21pbnV0ZSc7IC8vIHdpbGwgcmVmcmVzaCBvbiB0aGUgbWludXRlCgl9LAoKCglyZW5kZXJOb3dJbmRpY2F0b3I6IGZ1bmN0aW9uKGRhdGUpIHsKCQkvLyBzZWcgc3lzdGVtIG1pZ2h0IGJlIG92ZXJraWxsLCBidXQgaXQgaGFuZGxlcyBzY2VuYXJpbyB3aGVyZSBsaW5lIG5lZWRzIHRvIGJlIHJlbmRlcmVkCgkJLy8gIG1vcmUgdGhhbiBvbmNlIGJlY2F1c2Ugb2YgY29sdW1ucyB3aXRoIHRoZSBzYW1lIGRhdGUgKHJlc291cmNlcyBjb2x1bW5zIGZvciBleGFtcGxlKQoJCXZhciBzZWdzID0gdGhpcy5zcGFuVG9TZWdzKHsgc3RhcnQ6IGRhdGUsIGVuZDogZGF0ZSB9KTsKCQl2YXIgdG9wID0gdGhpcy5jb21wdXRlRGF0ZVRvcChkYXRlLCBkYXRlKTsKCQl2YXIgbm9kZXMgPSBbXTsKCQl2YXIgaTsKCgkJLy8gcmVuZGVyIGxpbmVzIHdpdGhpbiB0aGUgY29sdW1ucwoJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCW5vZGVzLnB1c2goJCgnPGRpdiBjbGFzcz0iZmMtbm93LWluZGljYXRvciBmYy1ub3ctaW5kaWNhdG9yLWxpbmUiPjwvZGl2PicpCgkJCQkuY3NzKCd0b3AnLCB0b3ApCgkJCQkuYXBwZW5kVG8odGhpcy5jb2xDb250YWluZXJFbHMuZXEoc2Vnc1tpXS5jb2wpKVswXSk7CgkJfQoKCQkvLyByZW5kZXIgYW4gYXJyb3cgb3ZlciB0aGUgYXhpcwoJCWlmIChzZWdzLmxlbmd0aCA+IDApIHsgLy8gaXMgdGhlIGN1cnJlbnQgdGltZSBpbiB2aWV3PwoJCQlub2Rlcy5wdXNoKCQoJzxkaXYgY2xhc3M9ImZjLW5vdy1pbmRpY2F0b3IgZmMtbm93LWluZGljYXRvci1hcnJvdyI+PC9kaXY+JykKCQkJCS5jc3MoJ3RvcCcsIHRvcCkKCQkJCS5hcHBlbmRUbyh0aGlzLmVsLmZpbmQoJy5mYy1jb250ZW50LXNrZWxldG9uJykpWzBdKTsKCQl9CgoJCXRoaXMubm93SW5kaWNhdG9yRWxzID0gJChub2Rlcyk7Cgl9LAoKCgl1bnJlbmRlck5vd0luZGljYXRvcjogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMubm93SW5kaWNhdG9yRWxzKSB7CgkJCXRoaXMubm93SW5kaWNhdG9yRWxzLnJlbW92ZSgpOwoJCQl0aGlzLm5vd0luZGljYXRvckVscyA9IG51bGw7CgkJfQoJfSwKCgoJLyogU2VsZWN0aW9uCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBSZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYSBzZWxlY3Rpb24uIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCwgd2hpY2ggd2FzIHRvIHNpbXBseSByZW5kZXIgYSBoaWdobGlnaHQuCglyZW5kZXJTZWxlY3Rpb246IGZ1bmN0aW9uKHNwYW4pIHsKCQlpZiAodGhpcy52aWV3Lm9wdCgnc2VsZWN0SGVscGVyJykpIHsgLy8gdGhpcyBzZXR0aW5nIHNpZ25hbHMgdGhhdCBhIG1vY2sgaGVscGVyIGV2ZW50IHNob3VsZCBiZSByZW5kZXJlZAoKCQkJLy8gbm9ybWFsbHkgYWNjZXBzIGFuIGV2ZW50TG9jYXRpb24sIHNwYW4gaGFzIGEgc3RhcnQvZW5kLCB3aGljaCBpcyBnb29kIGVub3VnaAoJCQl0aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIoc3Bhbik7CgkJfQoJCWVsc2UgewoJCQl0aGlzLnJlbmRlckhpZ2hsaWdodChzcGFuKTsKCQl9Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYW55IHZpc3VhbCBpbmRpY2F0aW9uIG9mIGEgc2VsZWN0aW9uCgl1bnJlbmRlclNlbGVjdGlvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckhlbHBlcigpOwoJCXRoaXMudW5yZW5kZXJIaWdobGlnaHQoKTsKCX0sCgoKCS8qIEhpZ2hsaWdodAoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmVuZGVySGlnaGxpZ2h0OiBmdW5jdGlvbihzcGFuKSB7CgkJdGhpcy5yZW5kZXJIaWdobGlnaHRTZWdzKHRoaXMuc3BhblRvU2VncyhzcGFuKSk7Cgl9LAoKCgl1bnJlbmRlckhpZ2hsaWdodDogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckhpZ2hsaWdodFNlZ3MoKTsKCX0KCn0pOwoKOzsKCi8qIE1ldGhvZHMgZm9yIHJlbmRlcmluZyBTRUdNRU5UUywgcGllY2VzIG9mIGNvbnRlbnQgdGhhdCBsaXZlIG9uIHRoZSB2aWV3CiAoIHRoaXMgZmlsZSBpcyBubyBsb25nZXIganVzdCBmb3IgZXZlbnRzICkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpUaW1lR3JpZC5taXhpbih7CgoJY29sQ29udGFpbmVyRWxzOiBudWxsLCAvLyBjb250YWluZXJzIGZvciBlYWNoIGNvbHVtbgoKCS8vIGlubmVyLWNvbnRhaW5lcnMgZm9yIGVhY2ggY29sdW1uIHdoZXJlIGRpZmZlcmVudCB0eXBlcyBvZiBzZWdzIGxpdmUKCWZnQ29udGFpbmVyRWxzOiBudWxsLAoJYmdDb250YWluZXJFbHM6IG51bGwsCgloZWxwZXJDb250YWluZXJFbHM6IG51bGwsCgloaWdobGlnaHRDb250YWluZXJFbHM6IG51bGwsCglidXNpbmVzc0NvbnRhaW5lckVsczogbnVsbCwKCgkvLyBhcnJheXMgb2YgZGlmZmVyZW50IHR5cGVzIG9mIGRpc3BsYXllZCBzZWdtZW50cwoJZmdTZWdzOiBudWxsLAoJYmdTZWdzOiBudWxsLAoJaGVscGVyU2VnczogbnVsbCwKCWhpZ2hsaWdodFNlZ3M6IG51bGwsCglidXNpbmVzc1NlZ3M6IG51bGwsCgoKCS8vIFJlbmRlcnMgdGhlIERPTSB0aGF0IHRoZSB2aWV3J3MgY29udGVudCB3aWxsIGxpdmUgaW4KCXJlbmRlckNvbnRlbnRTa2VsZXRvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGNlbGxIdG1sID0gJyc7CgkJdmFyIGk7CgkJdmFyIHNrZWxldG9uRWw7CgoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLmNvbENudDsgaSsrKSB7CgkJCWNlbGxIdG1sICs9CgkJCQknPHRkPicgKwoJCQkJCSc8ZGl2IGNsYXNzPSJmYy1jb250ZW50LWNvbCI+JyArCgkJCQkJCSc8ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIgZmMtaGVscGVyLWNvbnRhaW5lciI+PC9kaXY+JyArCgkJCQkJCSc8ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIiPjwvZGl2PicgKwoJCQkJCQknPGRpdiBjbGFzcz0iZmMtaGlnaGxpZ2h0LWNvbnRhaW5lciI+PC9kaXY+JyArCgkJCQkJCSc8ZGl2IGNsYXNzPSJmYy1iZ2V2ZW50LWNvbnRhaW5lciI+PC9kaXY+JyArCgkJCQkJCSc8ZGl2IGNsYXNzPSJmYy1idXNpbmVzcy1jb250YWluZXIiPjwvZGl2PicgKwoJCQkJCSc8L2Rpdj4nICsKCQkJCSc8L3RkPic7CgkJfQoKCQlza2VsZXRvbkVsID0gJCgKCQkJJzxkaXYgY2xhc3M9ImZjLWNvbnRlbnQtc2tlbGV0b24iPicgKwoJCQkJJzx0YWJsZT4nICsKCQkJCQknPHRyPicgKyBjZWxsSHRtbCArICc8L3RyPicgKwoJCQkJJzwvdGFibGU+JyArCgkJCSc8L2Rpdj4nCgkJKTsKCgkJdGhpcy5jb2xDb250YWluZXJFbHMgPSBza2VsZXRvbkVsLmZpbmQoJy5mYy1jb250ZW50LWNvbCcpOwoJCXRoaXMuaGVscGVyQ29udGFpbmVyRWxzID0gc2tlbGV0b25FbC5maW5kKCcuZmMtaGVscGVyLWNvbnRhaW5lcicpOwoJCXRoaXMuZmdDb250YWluZXJFbHMgPSBza2VsZXRvbkVsLmZpbmQoJy5mYy1ldmVudC1jb250YWluZXI6bm90KC5mYy1oZWxwZXItY29udGFpbmVyKScpOwoJCXRoaXMuYmdDb250YWluZXJFbHMgPSBza2VsZXRvbkVsLmZpbmQoJy5mYy1iZ2V2ZW50LWNvbnRhaW5lcicpOwoJCXRoaXMuaGlnaGxpZ2h0Q29udGFpbmVyRWxzID0gc2tlbGV0b25FbC5maW5kKCcuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lcicpOwoJCXRoaXMuYnVzaW5lc3NDb250YWluZXJFbHMgPSBza2VsZXRvbkVsLmZpbmQoJy5mYy1idXNpbmVzcy1jb250YWluZXInKTsKCgkJdGhpcy5ib29rZW5kQ2VsbHMoc2tlbGV0b25FbC5maW5kKCd0cicpKTsgLy8gVE9ETzogZG8gdGhpcyBvbiBzdHJpbmcgbGV2ZWwKCQl0aGlzLmVsLmFwcGVuZChza2VsZXRvbkVsKTsKCX0sCgoKCS8qIEZvcmVncm91bmQgRXZlbnRzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglyZW5kZXJGZ1NlZ3M6IGZ1bmN0aW9uKHNlZ3MpIHsKCQlzZWdzID0gdGhpcy5yZW5kZXJGZ1NlZ3NJbnRvQ29udGFpbmVycyhzZWdzLCB0aGlzLmZnQ29udGFpbmVyRWxzKTsKCQl0aGlzLmZnU2VncyA9IHNlZ3M7CgkJcmV0dXJuIHNlZ3M7IC8vIG5lZWRlZCBmb3IgR3JpZDo6cmVuZGVyRXZlbnRzCgl9LAoKCgl1bnJlbmRlckZnU2VnczogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlck5hbWVkU2VncygnZmdTZWdzJyk7Cgl9LAoKCgkvKiBGb3JlZ3JvdW5kIEhlbHBlciBFdmVudHMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCXJlbmRlckhlbHBlclNlZ3M6IGZ1bmN0aW9uKHNlZ3MsIHNvdXJjZVNlZykgewoJCXZhciBoZWxwZXJFbHMgPSBbXTsKCQl2YXIgaSwgc2VnOwoJCXZhciBzb3VyY2VFbDsKCgkJc2VncyA9IHRoaXMucmVuZGVyRmdTZWdzSW50b0NvbnRhaW5lcnMoc2VncywgdGhpcy5oZWxwZXJDb250YWluZXJFbHMpOwoKCQkvLyBUcnkgdG8gbWFrZSB0aGUgc2VnbWVudCB0aGF0IGlzIGluIHRoZSBzYW1lIHJvdyBhcyBzb3VyY2VTZWcgbG9vayB0aGUgc2FtZQoJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCXNlZyA9IHNlZ3NbaV07CgkJCWlmIChzb3VyY2VTZWcgJiYgc291cmNlU2VnLmNvbCA9PT0gc2VnLmNvbCkgewoJCQkJc291cmNlRWwgPSBzb3VyY2VTZWcuZWw7CgkJCQlzZWcuZWwuY3NzKHsKCQkJCQlsZWZ0OiBzb3VyY2VFbC5jc3MoJ2xlZnQnKSwKCQkJCQlyaWdodDogc291cmNlRWwuY3NzKCdyaWdodCcpLAoJCQkJCSdtYXJnaW4tbGVmdCc6IHNvdXJjZUVsLmNzcygnbWFyZ2luLWxlZnQnKSwKCQkJCQknbWFyZ2luLXJpZ2h0Jzogc291cmNlRWwuY3NzKCdtYXJnaW4tcmlnaHQnKQoJCQkJfSk7CgkJCX0KCQkJaGVscGVyRWxzLnB1c2goc2VnLmVsWzBdKTsKCQl9CgoJCXRoaXMuaGVscGVyU2VncyA9IHNlZ3M7CgoJCXJldHVybiAkKGhlbHBlckVscyk7IC8vIG11c3QgcmV0dXJuIHJlbmRlcmVkIGhlbHBlcnMKCX0sCgoKCXVucmVuZGVySGVscGVyU2VnczogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlck5hbWVkU2VncygnaGVscGVyU2VncycpOwoJfSwKCgoJLyogQmFja2dyb3VuZCBFdmVudHMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCXJlbmRlckJnU2VnczogZnVuY3Rpb24oc2VncykgewoJCXNlZ3MgPSB0aGlzLnJlbmRlckZpbGxTZWdFbHMoJ2JnRXZlbnQnLCBzZWdzKTsgLy8gVE9ETzogb2xkIGZpbGwgc3lzdGVtCgkJdGhpcy51cGRhdGVTZWdWZXJ0aWNhbHMoc2Vncyk7CgkJdGhpcy5hdHRhY2hTZWdzQnlDb2wodGhpcy5ncm91cFNlZ3NCeUNvbChzZWdzKSwgdGhpcy5iZ0NvbnRhaW5lckVscyk7CgkJdGhpcy5iZ1NlZ3MgPSBzZWdzOwoJCXJldHVybiBzZWdzOyAvLyBuZWVkZWQgZm9yIEdyaWQ6OnJlbmRlckV2ZW50cwoJfSwKCgoJdW5yZW5kZXJCZ1NlZ3M6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5yZW5kZXJOYW1lZFNlZ3MoJ2JnU2VncycpOwoJfSwKCgoJLyogSGlnaGxpZ2h0CgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglyZW5kZXJIaWdobGlnaHRTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgkJc2VncyA9IHRoaXMucmVuZGVyRmlsbFNlZ0VscygnaGlnaGxpZ2h0Jywgc2Vncyk7IC8vIFRPRE86IG9sZCBmaWxsIHN5c3RlbQoJCXRoaXMudXBkYXRlU2VnVmVydGljYWxzKHNlZ3MpOwoJCXRoaXMuYXR0YWNoU2Vnc0J5Q29sKHRoaXMuZ3JvdXBTZWdzQnlDb2woc2VncyksIHRoaXMuaGlnaGxpZ2h0Q29udGFpbmVyRWxzKTsKCQl0aGlzLmhpZ2hsaWdodFNlZ3MgPSBzZWdzOwoJfSwKCgoJdW5yZW5kZXJIaWdobGlnaHRTZWdzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnVucmVuZGVyTmFtZWRTZWdzKCdoaWdobGlnaHRTZWdzJyk7Cgl9LAoKCgkvKiBCdXNpbmVzcyBIb3VycwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmVuZGVyQnVzaW5lc3NTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgkJc2VncyA9IHRoaXMucmVuZGVyRmlsbFNlZ0VscygnYnVzaW5lc3NIb3VycycsIHNlZ3MpOyAvLyBUT0RPOiBvbGQgZmlsbCBzeXN0ZW0KCQl0aGlzLnVwZGF0ZVNlZ1ZlcnRpY2FscyhzZWdzKTsKCQl0aGlzLmF0dGFjaFNlZ3NCeUNvbCh0aGlzLmdyb3VwU2Vnc0J5Q29sKHNlZ3MpLCB0aGlzLmJ1c2luZXNzQ29udGFpbmVyRWxzKTsKCQl0aGlzLmJ1c2luZXNzU2VncyA9IHNlZ3M7Cgl9LAoKCgl1bnJlbmRlckJ1c2luZXNzU2VnczogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlck5hbWVkU2VncygnYnVzaW5lc3NTZWdzJyk7Cgl9LAoKCgkvKiBTZWcgUmVuZGVyaW5nIFV0aWxzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBHaXZlbiBhIGZsYXQgYXJyYXkgb2Ygc2VnbWVudHMsIHJldHVybiBhbiBhcnJheSBvZiBzdWItYXJyYXlzLCBncm91cGVkIGJ5IGVhY2ggc2VnbWVudCdzIGNvbAoJZ3JvdXBTZWdzQnlDb2w6IGZ1bmN0aW9uKHNlZ3MpIHsKCQl2YXIgc2Vnc0J5Q29sID0gW107CgkJdmFyIGk7CgoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLmNvbENudDsgaSsrKSB7CgkJCXNlZ3NCeUNvbC5wdXNoKFtdKTsKCQl9CgoJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCXNlZ3NCeUNvbFtzZWdzW2ldLmNvbF0ucHVzaChzZWdzW2ldKTsKCQl9CgoJCXJldHVybiBzZWdzQnlDb2w7Cgl9LAoKCgkvLyBHaXZlbiBzZWdtZW50cyBncm91cGVkIGJ5IGNvbHVtbiwgaW5zZXJ0IHRoZSBzZWdtZW50cycgZWxlbWVudHMgaW50byBhIHBhcmFsbGVsIGFycmF5IG9mIGNvbnRhaW5lcgoJLy8gZWxlbWVudHMsIGVhY2ggbGl2aW5nIHdpdGhpbiBhIGNvbHVtbi4KCWF0dGFjaFNlZ3NCeUNvbDogZnVuY3Rpb24oc2Vnc0J5Q29sLCBjb250YWluZXJFbHMpIHsKCQl2YXIgY29sOwoJCXZhciBzZWdzOwoJCXZhciBpOwoKCQlmb3IgKGNvbCA9IDA7IGNvbCA8IHRoaXMuY29sQ250OyBjb2wrKykgeyAvLyBpdGVyYXRlIGVhY2ggY29sdW1uIGdyb3VwaW5nCgkJCXNlZ3MgPSBzZWdzQnlDb2xbY29sXTsKCgkJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCQljb250YWluZXJFbHMuZXEoY29sKS5hcHBlbmQoc2Vnc1tpXS5lbCk7CgkJCX0KCQl9Cgl9LAoKCgkvLyBHaXZlbiB0aGUgbmFtZSBvZiBhIHByb3BlcnR5IG9mIGB0aGlzYCBvYmplY3QsIGFzc3VtZWQgdG8gYmUgYW4gYXJyYXkgb2Ygc2VnbWVudHMsCgkvLyBsb29wcyB0aHJvdWdoIGVhY2ggc2VnbWVudCBhbmQgcmVtb3ZlcyBmcm9tIERPTS4gV2lsbCBudWxsLW91dCB0aGUgcHJvcGVydHkgYWZ0ZXJ3YXJkcy4KCXVucmVuZGVyTmFtZWRTZWdzOiBmdW5jdGlvbihwcm9wTmFtZSkgewoJCXZhciBzZWdzID0gdGhpc1twcm9wTmFtZV07CgkJdmFyIGk7CgoJCWlmIChzZWdzKSB7CgkJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCQlzZWdzW2ldLmVsLnJlbW92ZSgpOwoJCQl9CgkJCXRoaXNbcHJvcE5hbWVdID0gbnVsbDsKCQl9Cgl9LAoKCgoJLyogRm9yZWdyb3VuZCBFdmVudCBSZW5kZXJpbmcgVXRpbHMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEdpdmVuIGFuIGFycmF5IG9mIGZvcmVncm91bmQgc2VnbWVudHMsIHJlbmRlciBhIERPTSBlbGVtZW50IGZvciBlYWNoLCBjb21wdXRlcyBwb3NpdGlvbiwKCS8vIGFuZCBhdHRhY2hlcyB0byB0aGUgY29sdW1uIGlubmVyLWNvbnRhaW5lciBlbGVtZW50cy4KCXJlbmRlckZnU2Vnc0ludG9Db250YWluZXJzOiBmdW5jdGlvbihzZWdzLCBjb250YWluZXJFbHMpIHsKCQl2YXIgc2Vnc0J5Q29sOwoJCXZhciBjb2w7CgoJCXNlZ3MgPSB0aGlzLnJlbmRlckZnU2VnRWxzKHNlZ3MpOyAvLyB3aWxsIGNhbGwgZmdTZWdIdG1sCgkJc2Vnc0J5Q29sID0gdGhpcy5ncm91cFNlZ3NCeUNvbChzZWdzKTsKCgkJZm9yIChjb2wgPSAwOyBjb2wgPCB0aGlzLmNvbENudDsgY29sKyspIHsKCQkJdGhpcy51cGRhdGVGZ1NlZ0Nvb3JkcyhzZWdzQnlDb2xbY29sXSk7CgkJfQoKCQl0aGlzLmF0dGFjaFNlZ3NCeUNvbChzZWdzQnlDb2wsIGNvbnRhaW5lckVscyk7CgoJCXJldHVybiBzZWdzOwoJfSwKCgoJLy8gUmVuZGVycyB0aGUgSFRNTCBmb3IgYSBzaW5nbGUgZXZlbnQgc2VnbWVudCdzIGRlZmF1bHQgcmVuZGVyaW5nCglmZ1NlZ0h0bWw6IGZ1bmN0aW9uKHNlZywgZGlzYWJsZVJlc2l6aW5nKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGV2ZW50ID0gc2VnLmV2ZW50OwoJCXZhciBpc0RyYWdnYWJsZSA9IHZpZXcuaXNFdmVudERyYWdnYWJsZShldmVudCk7CgkJdmFyIGlzUmVzaXphYmxlRnJvbVN0YXJ0ID0gIWRpc2FibGVSZXNpemluZyAmJiBzZWcuaXNTdGFydCAmJiB2aWV3LmlzRXZlbnRSZXNpemFibGVGcm9tU3RhcnQoZXZlbnQpOwoJCXZhciBpc1Jlc2l6YWJsZUZyb21FbmQgPSAhZGlzYWJsZVJlc2l6aW5nICYmIHNlZy5pc0VuZCAmJiB2aWV3LmlzRXZlbnRSZXNpemFibGVGcm9tRW5kKGV2ZW50KTsKCQl2YXIgY2xhc3NlcyA9IHRoaXMuZ2V0U2VnQ2xhc3NlcyhzZWcsIGlzRHJhZ2dhYmxlLCBpc1Jlc2l6YWJsZUZyb21TdGFydCB8fCBpc1Jlc2l6YWJsZUZyb21FbmQpOwoJCXZhciBza2luQ3NzID0gY3NzVG9TdHIodGhpcy5nZXRTZWdTa2luQ3NzKHNlZykpOwoJCXZhciB0aW1lVGV4dDsKCQl2YXIgZnVsbFRpbWVUZXh0OyAvLyBtb3JlIHZlcmJvc2UgdGltZSB0ZXh0LiBmb3IgdGhlIHByaW50IHN0eWxlc2hlZXQKCQl2YXIgc3RhcnRUaW1lVGV4dDsgLy8ganVzdCB0aGUgc3RhcnQgdGltZSB0ZXh0CgoJCWNsYXNzZXMudW5zaGlmdCgnZmMtdGltZS1ncmlkLWV2ZW50JywgJ2ZjLXYtZXZlbnQnKTsKCgkJaWYgKHZpZXcuaXNNdWx0aURheUV2ZW50KGV2ZW50KSkgeyAvLyBpZiB0aGUgZXZlbnQgYXBwZWFycyB0byBzcGFuIG1vcmUgdGhhbiBvbmUgZGF5Li4uCgkJCS8vIERvbid0IGRpc3BsYXkgdGltZSB0ZXh0IG9uIHNlZ21lbnRzIHRoYXQgcnVuIGVudGlyZWx5IHRocm91Z2ggYSBkYXkuCgkJCS8vIFRoYXQgd291bGQgYXBwZWFyIGFzIG1pZG5pZ2h0LW1pZG5pZ2h0IGFuZCB3b3VsZCBsb29rIGR1bWIuCgkJCS8vIE90aGVyd2lzZSwgZGlzcGxheSB0aGUgdGltZSB0ZXh0IGZvciB0aGUgKnNlZ21lbnQncyogdGltZXMgKGxpa2UgNnBtLW1pZG5pZ2h0IG9yIG1pZG5pZ2h0LTEwYW0pCgkJCWlmIChzZWcuaXNTdGFydCB8fCBzZWcuaXNFbmQpIHsKCQkJCXRpbWVUZXh0ID0gdGhpcy5nZXRFdmVudFRpbWVUZXh0KHNlZyk7CgkJCQlmdWxsVGltZVRleHQgPSB0aGlzLmdldEV2ZW50VGltZVRleHQoc2VnLCAnTFQnKTsKCQkJCXN0YXJ0VGltZVRleHQgPSB0aGlzLmdldEV2ZW50VGltZVRleHQoc2VnLCBudWxsLCBmYWxzZSk7IC8vIGRpc3BsYXlFbmQ9ZmFsc2UKCQkJfQoJCX0gZWxzZSB7CgkJCS8vIERpc3BsYXkgdGhlIG5vcm1hbCB0aW1lIHRleHQgZm9yIHRoZSAqZXZlbnQncyogdGltZXMKCQkJdGltZVRleHQgPSB0aGlzLmdldEV2ZW50VGltZVRleHQoZXZlbnQpOwoJCQlmdWxsVGltZVRleHQgPSB0aGlzLmdldEV2ZW50VGltZVRleHQoZXZlbnQsICdMVCcpOwoJCQlzdGFydFRpbWVUZXh0ID0gdGhpcy5nZXRFdmVudFRpbWVUZXh0KGV2ZW50LCBudWxsLCBmYWxzZSk7IC8vIGRpc3BsYXlFbmQ9ZmFsc2UKCQl9CgoJCXJldHVybiAnPGEgY2xhc3M9IicgKyBjbGFzc2VzLmpvaW4oJyAnKSArICciJyArCgkJCShldmVudC51cmwgPwoJCQkJJyBocmVmPSInICsgaHRtbEVzY2FwZShldmVudC51cmwpICsgJyInIDoKCQkJCScnCgkJCQkpICsKCQkJKHNraW5Dc3MgPwoJCQkJJyBzdHlsZT0iJyArIHNraW5Dc3MgKyAnIicgOgoJCQkJJycKCQkJCSkgKwoJCQknPicgKwoJCQkJJzxkaXYgY2xhc3M9ImZjLWNvbnRlbnQiPicgKwoJCQkJCSh0aW1lVGV4dCA/CgkJCQkJCSc8ZGl2IGNsYXNzPSJmYy10aW1lIicgKwoJCQkJCQknIGRhdGEtc3RhcnQ9IicgKyBodG1sRXNjYXBlKHN0YXJ0VGltZVRleHQpICsgJyInICsKCQkJCQkJJyBkYXRhLWZ1bGw9IicgKyBodG1sRXNjYXBlKGZ1bGxUaW1lVGV4dCkgKyAnIicgKwoJCQkJCQknPicgKwoJCQkJCQkJJzxzcGFuPicgKyBodG1sRXNjYXBlKHRpbWVUZXh0KSArICc8L3NwYW4+JyArCgkJCQkJCSc8L2Rpdj4nIDoKCQkJCQkJJycKCQkJCQkJKSArCgkJCQkJKGV2ZW50LnRpdGxlID8KCQkJCQkJJzxkaXYgY2xhc3M9ImZjLXRpdGxlIj4nICsKCQkJCQkJCWh0bWxFc2NhcGUoZXZlbnQudGl0bGUpICsKCQkJCQkJJzwvZGl2PicgOgoJCQkJCQknJwoJCQkJCQkpICsKCQkJCSc8L2Rpdj4nICsKCQkJCSc8ZGl2IGNsYXNzPSJmYy1iZyIvPicgKwoJCQkJLyogVE9ETzogd3JpdGUgQ1NTIGZvciB0aGlzCgkJCQkoaXNSZXNpemFibGVGcm9tU3RhcnQgPwoJCQkJCSc8ZGl2IGNsYXNzPSJmYy1yZXNpemVyIGZjLXN0YXJ0LXJlc2l6ZXIiIC8+JyA6CgkJCQkJJycKCQkJCQkpICsKCQkJCSovCgkJCQkoaXNSZXNpemFibGVGcm9tRW5kID8KCQkJCQknPGRpdiBjbGFzcz0iZmMtcmVzaXplciBmYy1lbmQtcmVzaXplciIgLz4nIDoKCQkJCQknJwoJCQkJCSkgKwoJCQknPC9hPic7Cgl9LAoKCgkvKiBTZWcgUG9zaXRpb24gVXRpbHMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlZnJlc2hlcyB0aGUgQ1NTIHRvcC9ib3R0b20gY29vcmRpbmF0ZXMgZm9yIGVhY2ggc2VnbWVudCBlbGVtZW50LgoJLy8gV29ya3Mgd2hlbiBjYWxsZWQgYWZ0ZXIgaW5pdGlhbCByZW5kZXIsIGFmdGVyIGEgd2luZG93IHJlc2l6ZS96b29tIGZvciBleGFtcGxlLgoJdXBkYXRlU2VnVmVydGljYWxzOiBmdW5jdGlvbihzZWdzKSB7CgkJdGhpcy5jb21wdXRlU2VnVmVydGljYWxzKHNlZ3MpOwoJCXRoaXMuYXNzaWduU2VnVmVydGljYWxzKHNlZ3MpOwoJfSwKCgoJLy8gRm9yIGVhY2ggc2VnbWVudCBpbiBhbiBhcnJheSwgY29tcHV0ZXMgYW5kIGFzc2lnbnMgaXRzIHRvcCBhbmQgYm90dG9tIHByb3BlcnRpZXMKCWNvbXB1dGVTZWdWZXJ0aWNhbHM6IGZ1bmN0aW9uKHNlZ3MpIHsKCQl2YXIgaSwgc2VnOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQlzZWcgPSBzZWdzW2ldOwoJCQlzZWcudG9wID0gdGhpcy5jb21wdXRlRGF0ZVRvcChzZWcuc3RhcnQsIHNlZy5zdGFydCk7CgkJCXNlZy5ib3R0b20gPSB0aGlzLmNvbXB1dGVEYXRlVG9wKHNlZy5lbmQsIHNlZy5zdGFydCk7CgkJfQoJfSwKCgoJLy8gR2l2ZW4gc2VnbWVudHMgdGhhdCBhbHJlYWR5IGhhdmUgdGhlaXIgdG9wL2JvdHRvbSBwcm9wZXJ0aWVzIGNvbXB1dGVkLCBhcHBsaWVzIHRob3NlIHZhbHVlcyB0bwoJLy8gdGhlIHNlZ21lbnRzJyBlbGVtZW50cy4KCWFzc2lnblNlZ1ZlcnRpY2FsczogZnVuY3Rpb24oc2VncykgewoJCXZhciBpLCBzZWc7CgoJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCXNlZyA9IHNlZ3NbaV07CgkJCXNlZy5lbC5jc3ModGhpcy5nZW5lcmF0ZVNlZ1ZlcnRpY2FsQ3NzKHNlZykpOwoJCX0KCX0sCgoKCS8vIEdlbmVyYXRlcyBhbiBvYmplY3Qgd2l0aCBDU1MgcHJvcGVydGllcyBmb3IgdGhlIHRvcC9ib3R0b20gY29vcmRpbmF0ZXMgb2YgYSBzZWdtZW50IGVsZW1lbnQKCWdlbmVyYXRlU2VnVmVydGljYWxDc3M6IGZ1bmN0aW9uKHNlZykgewoJCXJldHVybiB7CgkJCXRvcDogc2VnLnRvcCwKCQkJYm90dG9tOiAtc2VnLmJvdHRvbSAvLyBmbGlwcGVkIGJlY2F1c2UgbmVlZHMgdG8gYmUgc3BhY2UgYmV5b25kIGJvdHRvbSBlZGdlIG9mIGV2ZW50IGNvbnRhaW5lcgoJCX07Cgl9LAoKCgkvKiBGb3JlZ3JvdW5kIEV2ZW50IFBvc2l0aW9uaW5nIFV0aWxzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBHaXZlbiBzZWdtZW50cyB0aGF0IGFyZSBhc3N1bWVkIHRvIGFsbCBsaXZlIGluIHRoZSAqc2FtZSBjb2x1bW4qLAoJLy8gY29tcHV0ZSB0aGVpciB2ZXJpY2FsL2hvcml6b250YWwgY29vcmRpbmF0ZXMgYW5kIGFzc2lnbiB0byB0aGVpciBlbGVtZW50cy4KCXVwZGF0ZUZnU2VnQ29vcmRzOiBmdW5jdGlvbihzZWdzKSB7CgkJdGhpcy5jb21wdXRlU2VnVmVydGljYWxzKHNlZ3MpOyAvLyBob3Jpem9udGFscyByZWxpZXMgb24gdGhpcwoJCXRoaXMuY29tcHV0ZUZnU2VnSG9yaXpvbnRhbHMoc2Vncyk7IC8vIGNvbXB1dGUgaG9yaXpvbnRhbCBjb29yZGluYXRlcywgei1pbmRleCdzLCBhbmQgcmVvcmRlciB0aGUgYXJyYXkKCQl0aGlzLmFzc2lnblNlZ1ZlcnRpY2FscyhzZWdzKTsKCQl0aGlzLmFzc2lnbkZnU2VnSG9yaXpvbnRhbHMoc2Vncyk7Cgl9LAoKCgkvLyBHaXZlbiBhbiBhcnJheSBvZiBzZWdtZW50cyB0aGF0IGFyZSBhbGwgaW4gdGhlIHNhbWUgY29sdW1uLCBzZXRzIHRoZSBiYWNrd2FyZENvb3JkIGFuZCBmb3J3YXJkQ29vcmQgb24gZWFjaC4KCS8vIE5PVEU6IEFsc28gcmVvcmRlcnMgdGhlIGdpdmVuIGFycmF5IGJ5IGRhdGUhCgljb21wdXRlRmdTZWdIb3Jpem9udGFsczogZnVuY3Rpb24oc2VncykgewoJCXZhciBsZXZlbHM7CgkJdmFyIGxldmVsMDsKCQl2YXIgaTsKCgkJdGhpcy5zb3J0RXZlbnRTZWdzKHNlZ3MpOyAvLyBvcmRlciBieSBjZXJ0YWluIGNyaXRlcmlhCgkJbGV2ZWxzID0gYnVpbGRTbG90U2VnTGV2ZWxzKHNlZ3MpOwoJCWNvbXB1dGVGb3J3YXJkU2xvdFNlZ3MobGV2ZWxzKTsKCgkJaWYgKChsZXZlbDAgPSBsZXZlbHNbMF0pKSB7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbGV2ZWwwLmxlbmd0aDsgaSsrKSB7CgkJCQljb21wdXRlU2xvdFNlZ1ByZXNzdXJlcyhsZXZlbDBbaV0pOwoJCQl9CgoJCQlmb3IgKGkgPSAwOyBpIDwgbGV2ZWwwLmxlbmd0aDsgaSsrKSB7CgkJCQl0aGlzLmNvbXB1dGVGZ1NlZ0ZvcndhcmRCYWNrKGxldmVsMFtpXSwgMCwgMCk7CgkJCX0KCQl9Cgl9LAoKCgkvLyBDYWxjdWxhdGUgc2VnLmZvcndhcmRDb29yZCBhbmQgc2VnLmJhY2t3YXJkQ29vcmQgZm9yIHRoZSBzZWdtZW50LCB3aGVyZSBib3RoIHZhbHVlcyByYW5nZQoJLy8gZnJvbSAwIHRvIDEuIElmIHRoZSBjYWxlbmRhciBpcyBsZWZ0LXRvLXJpZ2h0LCB0aGUgc2VnLmJhY2t3YXJkQ29vcmQgbWFwcyB0byAibGVmdCIgYW5kCgkvLyBzZWcuZm9yd2FyZENvb3JkIG1hcHMgdG8gInJpZ2h0IiAodmlhIHBlcmNlbnRhZ2UpLiBWaWNlLXZlcnNhIGlmIHRoZSBjYWxlbmRhciBpcyByaWdodC10by1sZWZ0LgoJLy8KCS8vIFRoZSBzZWdtZW50IG1pZ2h0IGJlIHBhcnQgb2YgYSAic2VyaWVzIiwgd2hpY2ggbWVhbnMgY29uc2VjdXRpdmUgc2VnbWVudHMgd2l0aCB0aGUgc2FtZSBwcmVzc3VyZQoJLy8gd2hvJ3Mgd2lkdGggaXMgdW5rbm93biB1bnRpbCBhbiBlZGdlIGhhcyBiZWVuIGhpdC4gYHNlcmllc0JhY2t3YXJkUHJlc3N1cmVgIGlzIHRoZSBudW1iZXIgb2YKCS8vIHNlZ21lbnRzIGJlaGluZCB0aGlzIG9uZSBpbiB0aGUgY3VycmVudCBzZXJpZXMsIGFuZCBgc2VyaWVzQmFja3dhcmRDb29yZGAgaXMgdGhlIHN0YXJ0aW5nCgkvLyBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBzZWdtZW50IGluIHRoZSBzZXJpZXMuCgljb21wdXRlRmdTZWdGb3J3YXJkQmFjazogZnVuY3Rpb24oc2VnLCBzZXJpZXNCYWNrd2FyZFByZXNzdXJlLCBzZXJpZXNCYWNrd2FyZENvb3JkKSB7CgkJdmFyIGZvcndhcmRTZWdzID0gc2VnLmZvcndhcmRTZWdzOwoJCXZhciBpOwoKCQlpZiAoc2VnLmZvcndhcmRDb29yZCA9PT0gdW5kZWZpbmVkKSB7IC8vIG5vdCBhbHJlYWR5IGNvbXB1dGVkCgoJCQlpZiAoIWZvcndhcmRTZWdzLmxlbmd0aCkgewoKCQkJCS8vIGlmIHRoZXJlIGFyZSBubyBmb3J3YXJkIHNlZ21lbnRzLCB0aGlzIHNlZ21lbnQgc2hvdWxkIGJ1dHQgdXAgYWdhaW5zdCB0aGUgZWRnZQoJCQkJc2VnLmZvcndhcmRDb29yZCA9IDE7CgkJCX0KCQkJZWxzZSB7CgoJCQkJLy8gc29ydCBoaWdoZXN0IHByZXNzdXJlIGZpcnN0CgkJCQl0aGlzLnNvcnRGb3J3YXJkU2Vncyhmb3J3YXJkU2Vncyk7CgoJCQkJLy8gdGhpcyBzZWdtZW50J3MgZm9yd2FyZENvb3JkIHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBiYWNrd2FyZENvb3JkIG9mIHRoZQoJCQkJLy8gaGlnaGVzdC1wcmVzc3VyZSBmb3J3YXJkIHNlZ21lbnQuCgkJCQl0aGlzLmNvbXB1dGVGZ1NlZ0ZvcndhcmRCYWNrKGZvcndhcmRTZWdzWzBdLCBzZXJpZXNCYWNrd2FyZFByZXNzdXJlICsgMSwgc2VyaWVzQmFja3dhcmRDb29yZCk7CgkJCQlzZWcuZm9yd2FyZENvb3JkID0gZm9yd2FyZFNlZ3NbMF0uYmFja3dhcmRDb29yZDsKCQkJfQoKCQkJLy8gY2FsY3VsYXRlIHRoZSBiYWNrd2FyZENvb3JkIGZyb20gdGhlIGZvcndhcmRDb29yZC4gY29uc2lkZXIgdGhlIHNlcmllcwoJCQlzZWcuYmFja3dhcmRDb29yZCA9IHNlZy5mb3J3YXJkQ29vcmQgLQoJCQkJKHNlZy5mb3J3YXJkQ29vcmQgLSBzZXJpZXNCYWNrd2FyZENvb3JkKSAvIC8vIGF2YWlsYWJsZSB3aWR0aCBmb3Igc2VyaWVzCgkJCQkoc2VyaWVzQmFja3dhcmRQcmVzc3VyZSArIDEpOyAvLyAjIG9mIHNlZ21lbnRzIGluIHRoZSBzZXJpZXMKCgkJCS8vIHVzZSB0aGlzIHNlZ21lbnQncyBjb29yZGluYXRlcyB0byBjb21wdXRlZCB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGxlc3MtcHJlc3N1cml6ZWQKCQkJLy8gZm9yd2FyZCBzZWdtZW50cwoJCQlmb3IgKGk9MDsgaTxmb3J3YXJkU2Vncy5sZW5ndGg7IGkrKykgewoJCQkJdGhpcy5jb21wdXRlRmdTZWdGb3J3YXJkQmFjayhmb3J3YXJkU2Vnc1tpXSwgMCwgc2VnLmZvcndhcmRDb29yZCk7CgkJCX0KCQl9Cgl9LAoKCglzb3J0Rm9yd2FyZFNlZ3M6IGZ1bmN0aW9uKGZvcndhcmRTZWdzKSB7CgkJZm9yd2FyZFNlZ3Muc29ydChwcm94eSh0aGlzLCAnY29tcGFyZUZvcndhcmRTZWdzJykpOwoJfSwKCgoJLy8gQSBjbXAgZnVuY3Rpb24gZm9yIGRldGVybWluaW5nIHdoaWNoIGZvcndhcmQgc2VnbWVudCB0byByZWx5IG9uIG1vcmUgd2hlbiBjb21wdXRpbmcgY29vcmRpbmF0ZXMuCgljb21wYXJlRm9yd2FyZFNlZ3M6IGZ1bmN0aW9uKHNlZzEsIHNlZzIpIHsKCQkvLyBwdXQgaGlnaGVyLXByZXNzdXJlIGZpcnN0CgkJcmV0dXJuIHNlZzIuZm9yd2FyZFByZXNzdXJlIC0gc2VnMS5mb3J3YXJkUHJlc3N1cmUgfHwKCQkJLy8gcHV0IHNlZ21lbnRzIHRoYXQgYXJlIGNsb3NlciB0byBpbml0aWFsIGVkZ2UgZmlyc3QgKGFuZCBmYXZvciBvbmVzIHdpdGggbm8gY29vcmRzIHlldCkKCQkJKHNlZzEuYmFja3dhcmRDb29yZCB8fCAwKSAtIChzZWcyLmJhY2t3YXJkQ29vcmQgfHwgMCkgfHwKCQkJLy8gZG8gbm9ybWFsIHNvcnRpbmcuLi4KCQkJdGhpcy5jb21wYXJlRXZlbnRTZWdzKHNlZzEsIHNlZzIpOwoJfSwKCgoJLy8gR2l2ZW4gZm9yZWdyb3VuZCBldmVudCBzZWdtZW50cyB0aGF0IGhhdmUgYWxyZWFkeSBoYWQgdGhlaXIgcG9zaXRpb24gY29vcmRpbmF0ZXMgY29tcHV0ZWQsCgkvLyBhc3NpZ25zIHBvc2l0aW9uLXJlbGF0ZWQgQ1NTIHZhbHVlcyB0byB0aGVpciBlbGVtZW50cy4KCWFzc2lnbkZnU2VnSG9yaXpvbnRhbHM6IGZ1bmN0aW9uKHNlZ3MpIHsKCQl2YXIgaSwgc2VnOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQlzZWcgPSBzZWdzW2ldOwoJCQlzZWcuZWwuY3NzKHRoaXMuZ2VuZXJhdGVGZ1NlZ0hvcml6b250YWxDc3Moc2VnKSk7CgoJCQkvLyBpZiB0aGUgaGVpZ2h0IGlzIHNob3J0LCBhZGQgYSBjbGFzc05hbWUgZm9yIGFsdGVybmF0ZSBzdHlsaW5nCgkJCWlmIChzZWcuYm90dG9tIC0gc2VnLnRvcCA8IDMwKSB7CgkJCQlzZWcuZWwuYWRkQ2xhc3MoJ2ZjLXNob3J0Jyk7CgkJCX0KCQl9Cgl9LAoKCgkvLyBHZW5lcmF0ZXMgYW4gb2JqZWN0IHdpdGggQ1NTIHByb3BlcnRpZXMvdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gYW4gZXZlbnQgc2VnbWVudCBlbGVtZW50LgoJLy8gQ29udGFpbnMgaW1wb3J0YW50IHBvc2l0aW9uaW5nLXJlbGF0ZWQgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIGFueSBldmVudCBlbGVtZW50LCBjdXN0b21pemVkIG9yIG5vdC4KCWdlbmVyYXRlRmdTZWdIb3Jpem9udGFsQ3NzOiBmdW5jdGlvbihzZWcpIHsKCQl2YXIgc2hvdWxkT3ZlcmxhcCA9IHRoaXMudmlldy5vcHQoJ3Nsb3RFdmVudE92ZXJsYXAnKTsKCQl2YXIgYmFja3dhcmRDb29yZCA9IHNlZy5iYWNrd2FyZENvb3JkOyAvLyB0aGUgbGVmdCBzaWRlIGlmIExUUi4gdGhlIHJpZ2h0IHNpZGUgaWYgUlRMLiBmbG9hdGluZy1wb2ludAoJCXZhciBmb3J3YXJkQ29vcmQgPSBzZWcuZm9yd2FyZENvb3JkOyAvLyB0aGUgcmlnaHQgc2lkZSBpZiBMVFIuIHRoZSBsZWZ0IHNpZGUgaWYgUlRMLiBmbG9hdGluZy1wb2ludAoJCXZhciBwcm9wcyA9IHRoaXMuZ2VuZXJhdGVTZWdWZXJ0aWNhbENzcyhzZWcpOyAvLyBnZXQgdG9wL2JvdHRvbSBmaXJzdAoJCXZhciBsZWZ0OyAvLyBhbW91bnQgb2Ygc3BhY2UgZnJvbSBsZWZ0IGVkZ2UsIGEgZnJhY3Rpb24gb2YgdGhlIHRvdGFsIHdpZHRoCgkJdmFyIHJpZ2h0OyAvLyBhbW91bnQgb2Ygc3BhY2UgZnJvbSByaWdodCBlZGdlLCBhIGZyYWN0aW9uIG9mIHRoZSB0b3RhbCB3aWR0aAoKCQlpZiAoc2hvdWxkT3ZlcmxhcCkgewoJCQkvLyBkb3VibGUgdGhlIHdpZHRoLCBidXQgZG9uJ3QgZ28gYmV5b25kIHRoZSBtYXhpbXVtIGZvcndhcmQgY29vcmRpbmF0ZSAoMS4wKQoJCQlmb3J3YXJkQ29vcmQgPSBNYXRoLm1pbigxLCBiYWNrd2FyZENvb3JkICsgKGZvcndhcmRDb29yZCAtIGJhY2t3YXJkQ29vcmQpICogMik7CgkJfQoKCQlpZiAodGhpcy5pc1JUTCkgewoJCQlsZWZ0ID0gMSAtIGZvcndhcmRDb29yZDsKCQkJcmlnaHQgPSBiYWNrd2FyZENvb3JkOwoJCX0KCQllbHNlIHsKCQkJbGVmdCA9IGJhY2t3YXJkQ29vcmQ7CgkJCXJpZ2h0ID0gMSAtIGZvcndhcmRDb29yZDsKCQl9CgoJCXByb3BzLnpJbmRleCA9IHNlZy5sZXZlbCArIDE7IC8vIGNvbnZlcnQgZnJvbSAwLWJhc2UgdG8gMS1iYXNlZAoJCXByb3BzLmxlZnQgPSBsZWZ0ICogMTAwICsgJyUnOwoJCXByb3BzLnJpZ2h0ID0gcmlnaHQgKiAxMDAgKyAnJSc7CgoJCWlmIChzaG91bGRPdmVybGFwICYmIHNlZy5mb3J3YXJkUHJlc3N1cmUpIHsKCQkJLy8gYWRkIHBhZGRpbmcgdG8gdGhlIGVkZ2Ugc28gdGhhdCBmb3J3YXJkIHN0YWNrZWQgZXZlbnRzIGRvbid0IGNvdmVyIHRoZSByZXNpemVyJ3MgaWNvbgoJCQlwcm9wc1t0aGlzLmlzUlRMID8gJ21hcmdpbkxlZnQnIDogJ21hcmdpblJpZ2h0J10gPSAxMCAqIDI7IC8vIDEwIGlzIGEgZ3Vlc3N0aW1hdGUgb2YgdGhlIGljb24ncyB3aWR0aAoJCX0KCgkJcmV0dXJuIHByb3BzOwoJfQoKfSk7CgoKLy8gQnVpbGRzIGFuIGFycmF5IG9mIHNlZ21lbnRzICJsZXZlbHMiLiBUaGUgZmlyc3QgbGV2ZWwgd2lsbCBiZSB0aGUgbGVmdG1vc3QgdGllciBvZiBzZWdtZW50cyBpZiB0aGUgY2FsZW5kYXIgaXMKLy8gbGVmdC10by1yaWdodCwgb3IgdGhlIHJpZ2h0bW9zdCBpZiB0aGUgY2FsZW5kYXIgaXMgcmlnaHQtdG8tbGVmdC4gQXNzdW1lcyB0aGUgc2VnbWVudHMgYXJlIGFscmVhZHkgb3JkZXJlZCBieSBkYXRlLgpmdW5jdGlvbiBidWlsZFNsb3RTZWdMZXZlbHMoc2VncykgewoJdmFyIGxldmVscyA9IFtdOwoJdmFyIGksIHNlZzsKCXZhciBqOwoKCWZvciAoaT0wOyBpPHNlZ3MubGVuZ3RoOyBpKyspIHsKCQlzZWcgPSBzZWdzW2ldOwoKCQkvLyBnbyB0aHJvdWdoIGFsbCB0aGUgbGV2ZWxzIGFuZCBzdG9wIG9uIHRoZSBmaXJzdCBsZXZlbCB3aGVyZSB0aGVyZSBhcmUgbm8gY29sbGlzaW9ucwoJCWZvciAoaj0wOyBqPGxldmVscy5sZW5ndGg7IGorKykgewoJCQlpZiAoIWNvbXB1dGVTbG90U2VnQ29sbGlzaW9ucyhzZWcsIGxldmVsc1tqXSkubGVuZ3RoKSB7CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJc2VnLmxldmVsID0gajsKCgkJKGxldmVsc1tqXSB8fCAobGV2ZWxzW2pdID0gW10pKS5wdXNoKHNlZyk7Cgl9CgoJcmV0dXJuIGxldmVsczsKfQoKCi8vIEZvciBldmVyeSBzZWdtZW50LCBmaWd1cmUgb3V0IHRoZSBvdGhlciBzZWdtZW50cyB0aGF0IGFyZSBpbiBzdWJzZXF1ZW50Ci8vIGxldmVscyB0aGF0IGFsc28gb2NjdXB5IHRoZSBzYW1lIHZlcnRpY2FsIHNwYWNlLiBBY2N1bXVsYXRlIGluIHNlZy5mb3J3YXJkU2VncwpmdW5jdGlvbiBjb21wdXRlRm9yd2FyZFNsb3RTZWdzKGxldmVscykgewoJdmFyIGksIGxldmVsOwoJdmFyIGosIHNlZzsKCXZhciBrOwoKCWZvciAoaT0wOyBpPGxldmVscy5sZW5ndGg7IGkrKykgewoJCWxldmVsID0gbGV2ZWxzW2ldOwoKCQlmb3IgKGo9MDsgajxsZXZlbC5sZW5ndGg7IGorKykgewoJCQlzZWcgPSBsZXZlbFtqXTsKCgkJCXNlZy5mb3J3YXJkU2VncyA9IFtdOwoJCQlmb3IgKGs9aSsxOyBrPGxldmVscy5sZW5ndGg7IGsrKykgewoJCQkJY29tcHV0ZVNsb3RTZWdDb2xsaXNpb25zKHNlZywgbGV2ZWxzW2tdLCBzZWcuZm9yd2FyZFNlZ3MpOwoJCQl9CgkJfQoJfQp9CgoKLy8gRmlndXJlIG91dCB3aGljaCBwYXRoIGZvcndhcmQgKHZpYSBzZWcuZm9yd2FyZFNlZ3MpIHJlc3VsdHMgaW4gdGhlIGxvbmdlc3QgcGF0aCB1bnRpbAovLyB0aGUgZnVydGhlc3QgZWRnZSBpcyByZWFjaGVkLiBUaGUgbnVtYmVyIG9mIHNlZ21lbnRzIGluIHRoaXMgcGF0aCB3aWxsIGJlIHNlZy5mb3J3YXJkUHJlc3N1cmUKZnVuY3Rpb24gY29tcHV0ZVNsb3RTZWdQcmVzc3VyZXMoc2VnKSB7Cgl2YXIgZm9yd2FyZFNlZ3MgPSBzZWcuZm9yd2FyZFNlZ3M7Cgl2YXIgZm9yd2FyZFByZXNzdXJlID0gMDsKCXZhciBpLCBmb3J3YXJkU2VnOwoKCWlmIChzZWcuZm9yd2FyZFByZXNzdXJlID09PSB1bmRlZmluZWQpIHsgLy8gbm90IGFscmVhZHkgY29tcHV0ZWQKCgkJZm9yIChpPTA7IGk8Zm9yd2FyZFNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJZm9yd2FyZFNlZyA9IGZvcndhcmRTZWdzW2ldOwoKCQkJLy8gZmlndXJlIG91dCB0aGUgY2hpbGQncyBtYXhpbXVtIGZvcndhcmQgcGF0aAoJCQljb21wdXRlU2xvdFNlZ1ByZXNzdXJlcyhmb3J3YXJkU2VnKTsKCgkJCS8vIGVpdGhlciB1c2UgdGhlIGV4aXN0aW5nIG1heGltdW0sIG9yIHVzZSB0aGUgY2hpbGQncyBmb3J3YXJkIHByZXNzdXJlCgkJCS8vIHBsdXMgb25lIChmb3IgdGhlIGZvcndhcmRTZWcgaXRzZWxmKQoJCQlmb3J3YXJkUHJlc3N1cmUgPSBNYXRoLm1heCgKCQkJCWZvcndhcmRQcmVzc3VyZSwKCQkJCTEgKyBmb3J3YXJkU2VnLmZvcndhcmRQcmVzc3VyZQoJCQkpOwoJCX0KCgkJc2VnLmZvcndhcmRQcmVzc3VyZSA9IGZvcndhcmRQcmVzc3VyZTsKCX0KfQoKCi8vIEZpbmQgYWxsIHRoZSBzZWdtZW50cyBpbiBgb3RoZXJTZWdzYCB0aGF0IHZlcnRpY2FsbHkgY29sbGlkZSB3aXRoIGBzZWdgLgovLyBBcHBlbmQgaW50byBhbiBvcHRpb25hbGx5LXN1cHBsaWVkIGByZXN1bHRzYCBhcnJheSBhbmQgcmV0dXJuLgpmdW5jdGlvbiBjb21wdXRlU2xvdFNlZ0NvbGxpc2lvbnMoc2VnLCBvdGhlclNlZ3MsIHJlc3VsdHMpIHsKCXJlc3VsdHMgPSByZXN1bHRzIHx8IFtdOwoKCWZvciAodmFyIGk9MDsgaTxvdGhlclNlZ3MubGVuZ3RoOyBpKyspIHsKCQlpZiAoaXNTbG90U2VnQ29sbGlzaW9uKHNlZywgb3RoZXJTZWdzW2ldKSkgewoJCQlyZXN1bHRzLnB1c2gob3RoZXJTZWdzW2ldKTsKCQl9Cgl9CgoJcmV0dXJuIHJlc3VsdHM7Cn0KCgovLyBEbyB0aGVzZSBzZWdtZW50cyBvY2N1cHkgdGhlIHNhbWUgdmVydGljYWwgc3BhY2U/CmZ1bmN0aW9uIGlzU2xvdFNlZ0NvbGxpc2lvbihzZWcxLCBzZWcyKSB7CglyZXR1cm4gc2VnMS5ib3R0b20gPiBzZWcyLnRvcCAmJiBzZWcxLnRvcCA8IHNlZzIuYm90dG9tOwp9Cgo7OwoKLyogQW4gYWJzdHJhY3QgY2xhc3MgZnJvbSB3aGljaCBvdGhlciB2aWV3cyBpbmhlcml0IGZyb20KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2YXIgVmlldyA9IEZDLlZpZXcgPSBDbGFzcy5leHRlbmQoRW1pdHRlck1peGluLCBMaXN0ZW5lck1peGluLCB7CgoJdHlwZTogbnVsbCwgLy8gc3ViY2xhc3MnIHZpZXcgbmFtZSAoc3RyaW5nKQoJbmFtZTogbnVsbCwgLy8gZGVwcmVjYXRlZC4gdXNlIGB0eXBlYCBpbnN0ZWFkCgl0aXRsZTogbnVsbCwgLy8gdGhlIHRleHQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgaGVhZGVyJ3MgdGl0bGUKCgljYWxlbmRhcjogbnVsbCwgLy8gb3duZXIgQ2FsZW5kYXIgb2JqZWN0CglvcHRpb25zOiBudWxsLCAvLyBoYXNoIGNvbnRhaW5pbmcgYWxsIG9wdGlvbnMuIGFscmVhZHkgbWVyZ2VkIHdpdGggdmlldy1zcGVjaWZpYy1vcHRpb25zCgllbDogbnVsbCwgLy8gdGhlIHZpZXcncyBjb250YWluaW5nIGVsZW1lbnQuIHNldCBieSBDYWxlbmRhcgoKCWRpc3BsYXlpbmc6IG51bGwsIC8vIGEgcHJvbWlzZSByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHJlbmRlcmluZy4gbnVsbCBpZiBubyByZW5kZXIgcmVxdWVzdGVkCglpc1NrZWxldG9uUmVuZGVyZWQ6IGZhbHNlLAoJaXNFdmVudHNSZW5kZXJlZDogZmFsc2UsCgoJLy8gcmFuZ2UgdGhlIHZpZXcgaXMgYWN0dWFsbHkgZGlzcGxheWluZyAobW9tZW50cykKCXN0YXJ0OiBudWxsLAoJZW5kOiBudWxsLCAvLyBleGNsdXNpdmUKCgkvLyByYW5nZSB0aGUgdmlldyBpcyBmb3JtYWxseSByZXNwb25zaWJsZSBmb3IgKG1vbWVudHMpCgkvLyBtYXkgYmUgZGlmZmVyZW50IGZyb20gc3RhcnQvZW5kLiBmb3IgZXhhbXBsZSwgYSBtb250aCB2aWV3IG1pZ2h0IGhhdmUgMXN0LTMxc3QsIGV4Y2x1ZGluZyBwYWRkZWQgZGF0ZXMKCWludGVydmFsU3RhcnQ6IG51bGwsCglpbnRlcnZhbEVuZDogbnVsbCwgLy8gZXhjbHVzaXZlCglpbnRlcnZhbER1cmF0aW9uOiBudWxsLAoJaW50ZXJ2YWxVbml0OiBudWxsLCAvLyBuYW1lIG9mIGxhcmdlc3QgdW5pdCBiZWluZyBkaXNwbGF5ZWQsIGxpa2UgIm1vbnRoIiBvciAid2VlayIKCglpc1JUTDogZmFsc2UsCglpc1NlbGVjdGVkOiBmYWxzZSwgLy8gYm9vbGVhbiB3aGV0aGVyIGEgcmFuZ2Ugb2YgdGltZSBpcyB1c2VyLXNlbGVjdGVkIG9yIG5vdAoJc2VsZWN0ZWRFdmVudDogbnVsbCwKCglldmVudE9yZGVyU3BlY3M6IG51bGwsIC8vIGNyaXRlcmlhIGZvciBvcmRlcmluZyBldmVudHMgd2hlbiB0aGV5IGhhdmUgc2FtZSBkYXRlL3RpbWUKCgkvLyBjbGFzc05hbWVzIHN0eWxlZCBieSBqcXVpIHRoZW1lcwoJd2lkZ2V0SGVhZGVyQ2xhc3M6IG51bGwsCgl3aWRnZXRDb250ZW50Q2xhc3M6IG51bGwsCgloaWdobGlnaHRTdGF0ZUNsYXNzOiBudWxsLAoKCS8vIGZvciBkYXRlIHV0aWxzLCBjb21wdXRlZCBmcm9tIG9wdGlvbnMKCW5leHREYXlUaHJlc2hvbGQ6IG51bGwsCglpc0hpZGRlbkRheUhhc2g6IG51bGwsCgoJLy8gbm93IGluZGljYXRvcgoJaXNOb3dJbmRpY2F0b3JSZW5kZXJlZDogbnVsbCwKCWluaXRpYWxOb3dEYXRlOiBudWxsLCAvLyByZXN1bHQgZmlyc3QgZ2V0Tm93IGNhbGwKCWluaXRpYWxOb3dRdWVyaWVkTXM6IG51bGwsIC8vIG1zIHRpbWUgdGhlIGdldE5vdyB3YXMgY2FsbGVkCglub3dJbmRpY2F0b3JUaW1lb3V0SUQ6IG51bGwsIC8vIGZvciByZWZyZXNoIHRpbWluZyBvZiBub3cgaW5kaWNhdG9yCglub3dJbmRpY2F0b3JJbnRlcnZhbElEOiBudWxsLCAvLyAiCgoKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbihjYWxlbmRhciwgdHlwZSwgb3B0aW9ucywgaW50ZXJ2YWxEdXJhdGlvbikgewoKCQl0aGlzLmNhbGVuZGFyID0gY2FsZW5kYXI7CgkJdGhpcy50eXBlID0gdGhpcy5uYW1lID0gdHlwZTsgLy8gLm5hbWUgaXMgZGVwcmVjYXRlZAoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5pbnRlcnZhbER1cmF0aW9uID0gaW50ZXJ2YWxEdXJhdGlvbiB8fCBtb21lbnQuZHVyYXRpb24oMSwgJ2RheScpOwoKCQl0aGlzLm5leHREYXlUaHJlc2hvbGQgPSBtb21lbnQuZHVyYXRpb24odGhpcy5vcHQoJ25leHREYXlUaHJlc2hvbGQnKSk7CgkJdGhpcy5pbml0VGhlbWluZ1Byb3BzKCk7CgkJdGhpcy5pbml0SGlkZGVuRGF5cygpOwoJCXRoaXMuaXNSVEwgPSB0aGlzLm9wdCgnaXNSVEwnKTsKCgkJdGhpcy5ldmVudE9yZGVyU3BlY3MgPSBwYXJzZUZpZWxkU3BlY3ModGhpcy5vcHQoJ2V2ZW50T3JkZXInKSk7CgoJCXRoaXMuaW5pdGlhbGl6ZSgpOwoJfSwKCgoJLy8gQSBnb29kIHBsYWNlIGZvciBzdWJjbGFzc2VzIHRvIGluaXRpYWxpemUgbWVtYmVyIHZhcmlhYmxlcwoJaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBjYW4gaW1wbGVtZW50Cgl9LAoKCgkvLyBSZXRyaWV2ZXMgYW4gb3B0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUKCW9wdDogZnVuY3Rpb24obmFtZSkgewoJCXJldHVybiB0aGlzLm9wdGlvbnNbbmFtZV07Cgl9LAoKCgkvLyBUcmlnZ2VycyBoYW5kbGVycyB0aGF0IGFyZSB2aWV3LXJlbGF0ZWQuIE1vZGlmaWVzIGFyZ3MgYmVmb3JlIHBhc3NpbmcgdG8gY2FsZW5kYXIuCgl0cmlnZ2VyOiBmdW5jdGlvbihuYW1lLCB0aGlzT2JqKSB7IC8vIGFyZ3VtZW50cyBiZXlvbmQgdGhpc09iaiBhcmUgcGFzc2VkIGFsb25nCgkJdmFyIGNhbGVuZGFyID0gdGhpcy5jYWxlbmRhcjsKCgkJcmV0dXJuIGNhbGVuZGFyLnRyaWdnZXIuYXBwbHkoCgkJCWNhbGVuZGFyLAoJCQlbbmFtZSwgdGhpc09iaiB8fCB0aGlzXS5jb25jYXQoCgkJCQlBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpLCAvLyBhcmd1bWVudHMgYmV5b25kIHRoaXNPYmoKCQkJCVsgdGhpcyBdIC8vIGFsd2F5cyBtYWtlIHRoZSBsYXN0IGFyZ3VtZW50IGEgcmVmZXJlbmNlIHRvIHRoZSB2aWV3LiBUT0RPOiBkZXByZWNhdGUKCQkJKQoJCSk7Cgl9LAoKCgkvKiBEYXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gVXBkYXRlcyBhbGwgaW50ZXJuYWwgZGF0ZXMgdG8gY2VudGVyIGFyb3VuZCB0aGUgZ2l2ZW4gY3VycmVudCB1bnpvbmVkIGRhdGUuCglzZXREYXRlOiBmdW5jdGlvbihkYXRlKSB7CgkJdGhpcy5zZXRSYW5nZSh0aGlzLmNvbXB1dGVSYW5nZShkYXRlKSk7Cgl9LAoKCgkvLyBVcGRhdGVzIGFsbCBpbnRlcm5hbCBkYXRlcyBmb3IgZGlzcGxheWluZyB0aGUgZ2l2ZW4gdW56b25lZCByYW5nZS4KCXNldFJhbmdlOiBmdW5jdGlvbihyYW5nZSkgewoJCSQuZXh0ZW5kKHRoaXMsIHJhbmdlKTsgLy8gYXNzaWducyBldmVyeSBwcm9wZXJ0eSB0byB0aGlzIG9iamVjdCdzIG1lbWJlciB2YXJpYWJsZXMKCQl0aGlzLnVwZGF0ZVRpdGxlKCk7Cgl9LAoKCgkvLyBHaXZlbiBhIHNpbmdsZSBjdXJyZW50IHVuem9uZWQgZGF0ZSwgcHJvZHVjZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHJhbmdlIHRvIGRpc3BsYXkuCgkvLyBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZS4gTXVzdCByZXR1cm4gYWxsIHByb3BlcnRpZXMuCgljb21wdXRlUmFuZ2U6IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgaW50ZXJ2YWxVbml0ID0gY29tcHV0ZUludGVydmFsVW5pdCh0aGlzLmludGVydmFsRHVyYXRpb24pOwoJCXZhciBpbnRlcnZhbFN0YXJ0ID0gZGF0ZS5jbG9uZSgpLnN0YXJ0T2YoaW50ZXJ2YWxVbml0KTsKCQl2YXIgaW50ZXJ2YWxFbmQgPSBpbnRlcnZhbFN0YXJ0LmNsb25lKCkuYWRkKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbik7CgkJdmFyIHN0YXJ0LCBlbmQ7CgoJCS8vIG5vcm1hbGl6ZSB0aGUgcmFuZ2UncyB0aW1lLWFtYmlndWl0eQoJCWlmICgveWVhcnxtb250aHx3ZWVrfGRheS8udGVzdChpbnRlcnZhbFVuaXQpKSB7IC8vIHdob2xlLWRheXM/CgkJCWludGVydmFsU3RhcnQuc3RyaXBUaW1lKCk7CgkJCWludGVydmFsRW5kLnN0cmlwVGltZSgpOwoJCX0KCQllbHNlIHsgLy8gbmVlZHMgdG8gaGF2ZSBhIHRpbWU/CgkJCWlmICghaW50ZXJ2YWxTdGFydC5oYXNUaW1lKCkpIHsKCQkJCWludGVydmFsU3RhcnQgPSB0aGlzLmNhbGVuZGFyLnRpbWUoMCk7IC8vIGdpdmUgMDA6MDAgdGltZQoJCQl9CgkJCWlmICghaW50ZXJ2YWxFbmQuaGFzVGltZSgpKSB7CgkJCQlpbnRlcnZhbEVuZCA9IHRoaXMuY2FsZW5kYXIudGltZSgwKTsgLy8gZ2l2ZSAwMDowMCB0aW1lCgkJCX0KCQl9CgoJCXN0YXJ0ID0gaW50ZXJ2YWxTdGFydC5jbG9uZSgpOwoJCXN0YXJ0ID0gdGhpcy5za2lwSGlkZGVuRGF5cyhzdGFydCk7CgkJZW5kID0gaW50ZXJ2YWxFbmQuY2xvbmUoKTsKCQllbmQgPSB0aGlzLnNraXBIaWRkZW5EYXlzKGVuZCwgLTEsIHRydWUpOyAvLyBleGNsdXNpdmVseSBtb3ZlIGJhY2t3YXJkcwoKCQlyZXR1cm4gewoJCQlpbnRlcnZhbFVuaXQ6IGludGVydmFsVW5pdCwKCQkJaW50ZXJ2YWxTdGFydDogaW50ZXJ2YWxTdGFydCwKCQkJaW50ZXJ2YWxFbmQ6IGludGVydmFsRW5kLAoJCQlzdGFydDogc3RhcnQsCgkJCWVuZDogZW5kCgkJfTsKCX0sCgoKCS8vIENvbXB1dGVzIHRoZSBuZXcgZGF0ZSB3aGVuIHRoZSB1c2VyIGhpdHMgdGhlIHByZXYgYnV0dG9uLCBnaXZlbiB0aGUgY3VycmVudCBkYXRlCgljb21wdXRlUHJldkRhdGU6IGZ1bmN0aW9uKGRhdGUpIHsKCQlyZXR1cm4gdGhpcy5tYXNzYWdlQ3VycmVudERhdGUoCgkJCWRhdGUuY2xvbmUoKS5zdGFydE9mKHRoaXMuaW50ZXJ2YWxVbml0KS5zdWJ0cmFjdCh0aGlzLmludGVydmFsRHVyYXRpb24pLCAtMQoJCSk7Cgl9LAoKCgkvLyBDb21wdXRlcyB0aGUgbmV3IGRhdGUgd2hlbiB0aGUgdXNlciBoaXRzIHRoZSBuZXh0IGJ1dHRvbiwgZ2l2ZW4gdGhlIGN1cnJlbnQgZGF0ZQoJY29tcHV0ZU5leHREYXRlOiBmdW5jdGlvbihkYXRlKSB7CgkJcmV0dXJuIHRoaXMubWFzc2FnZUN1cnJlbnREYXRlKAoJCQlkYXRlLmNsb25lKCkuc3RhcnRPZih0aGlzLmludGVydmFsVW5pdCkuYWRkKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbikKCQkpOwoJfSwKCgoJLy8gR2l2ZW4gYW4gYXJiaXRyYXJpbHkgY2FsY3VsYXRlZCBjdXJyZW50IGRhdGUgb2YgdGhlIGNhbGVuZGFyLCByZXR1cm5zIGEgZGF0ZSB0aGF0IGlzIGVuc3VyZWQgdG8gYmUgY29tcGxldGVseQoJLy8gdmlzaWJsZS4gYGRpcmVjdGlvbmAgaXMgb3B0aW9uYWwgYW5kIGluZGljYXRlcyB3aGljaCBkaXJlY3Rpb24gdGhlIGN1cnJlbnQgZGF0ZSB3YXMgYmVpbmcKCS8vIGluY3JlbWVudGVkIG9yIGRlY3JlbWVudGVkICgxIG9yIC0xKS4KCW1hc3NhZ2VDdXJyZW50RGF0ZTogZnVuY3Rpb24oZGF0ZSwgZGlyZWN0aW9uKSB7CgkJaWYgKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbi5hcygnZGF5cycpIDw9IDEpIHsgLy8gaWYgdGhlIHZpZXcgZGlzcGxheXMgYSBzaW5nbGUgZGF5IG9yIHNtYWxsZXIKCQkJaWYgKHRoaXMuaXNIaWRkZW5EYXkoZGF0ZSkpIHsKCQkJCWRhdGUgPSB0aGlzLnNraXBIaWRkZW5EYXlzKGRhdGUsIGRpcmVjdGlvbik7CgkJCQlkYXRlLnN0YXJ0T2YoJ2RheScpOwoJCQl9CgkJfQoKCQlyZXR1cm4gZGF0ZTsKCX0sCgoKCS8qIFRpdGxlIGFuZCBEYXRlIEZvcm1hdHRpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFNldHMgdGhlIHZpZXcncyB0aXRsZSBwcm9wZXJ0eSB0byB0aGUgbW9zdCB1cGRhdGVkIGNvbXB1dGVkIHZhbHVlCgl1cGRhdGVUaXRsZTogZnVuY3Rpb24oKSB7CgkJdGhpcy50aXRsZSA9IHRoaXMuY29tcHV0ZVRpdGxlKCk7Cgl9LAoKCgkvLyBDb21wdXRlcyB3aGF0IHRoZSB0aXRsZSBhdCB0aGUgdG9wIG9mIHRoZSBjYWxlbmRhciBzaG91bGQgYmUgZm9yIHRoaXMgdmlldwoJY29tcHV0ZVRpdGxlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5mb3JtYXRSYW5nZSgKCQkJewoJCQkJLy8gaW4gY2FzZSBpbnRlcnZhbFN0YXJ0L0VuZCBoYXMgYSB0aW1lLCBtYWtlIHN1cmUgdGltZXpvbmUgaXMgY29ycmVjdAoJCQkJc3RhcnQ6IHRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZSh0aGlzLmludGVydmFsU3RhcnQpLAoJCQkJZW5kOiB0aGlzLmNhbGVuZGFyLmFwcGx5VGltZXpvbmUodGhpcy5pbnRlcnZhbEVuZCkKCQkJfSwKCQkJdGhpcy5vcHQoJ3RpdGxlRm9ybWF0JykgfHwgdGhpcy5jb21wdXRlVGl0bGVGb3JtYXQoKSwKCQkJdGhpcy5vcHQoJ3RpdGxlUmFuZ2VTZXBhcmF0b3InKQoJCSk7Cgl9LAoKCgkvLyBHZW5lcmF0ZXMgdGhlIGZvcm1hdCBzdHJpbmcgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdGl0bGUgZm9yIHRoZSBjdXJyZW50IGRhdGUgcmFuZ2UuCgkvLyBBdHRlbXB0cyB0byBjb21wdXRlIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGZvcm1hdCBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQgd2l0aCBgdGl0bGVGb3JtYXRgLgoJY29tcHV0ZVRpdGxlRm9ybWF0OiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5pbnRlcnZhbFVuaXQgPT0gJ3llYXInKSB7CgkJCXJldHVybiAnWVlZWSc7CgkJfQoJCWVsc2UgaWYgKHRoaXMuaW50ZXJ2YWxVbml0ID09ICdtb250aCcpIHsKCQkJcmV0dXJuIHRoaXMub3B0KCdtb250aFllYXJGb3JtYXQnKTsgLy8gbGlrZSAiU2VwdGVtYmVyIDIwMTQiCgkJfQoJCWVsc2UgaWYgKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbi5hcygnZGF5cycpID4gMSkgewoJCQlyZXR1cm4gJ2xsJzsgLy8gbXVsdGktZGF5IHJhbmdlLiBzaG9ydGVyLCBsaWtlICJTZXAgOSAtIDEwIDIwMTQiCgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gJ0xMJzsgLy8gb25lIGRheS4gbG9uZ2VyLCBsaWtlICJTZXB0ZW1iZXIgOSAyMDE0IgoJCX0KCX0sCgoKCS8vIFV0aWxpdHkgZm9yIGZvcm1hdHRpbmcgYSByYW5nZS4gQWNjZXB0cyBhIHJhbmdlIG9iamVjdCwgZm9ybWF0dGluZyBzdHJpbmcsIGFuZCBvcHRpb25hbCBzZXBhcmF0b3IuCgkvLyBEaXNwbGF5cyBhbGwtZGF5IHJhbmdlcyBuYXR1cmFsbHksIHdpdGggYW4gaW5jbHVzaXZlIGVuZC4gVGFrZXMgdGhlIGN1cnJlbnQgaXNSVEwgaW50byBhY2NvdW50LgoJLy8gVGhlIHRpbWV6b25lcyBvZiB0aGUgZGF0ZXMgd2l0aGluIGByYW5nZWAgd2lsbCBiZSByZXNwZWN0ZWQuCglmb3JtYXRSYW5nZTogZnVuY3Rpb24ocmFuZ2UsIGZvcm1hdFN0ciwgc2VwYXJhdG9yKSB7CgkJdmFyIGVuZCA9IHJhbmdlLmVuZDsKCgkJaWYgKCFlbmQuaGFzVGltZSgpKSB7IC8vIGFsbC1kYXk/CgkJCWVuZCA9IGVuZC5jbG9uZSgpLnN1YnRyYWN0KDEpOyAvLyBjb252ZXJ0IHRvIGluY2x1c2l2ZS4gbGFzdCBtcyBvZiBwcmV2aW91cyBkYXkKCQl9CgoJCXJldHVybiBmb3JtYXRSYW5nZShyYW5nZS5zdGFydCwgZW5kLCBmb3JtYXRTdHIsIHNlcGFyYXRvciwgdGhpcy5vcHQoJ2lzUlRMJykpOwoJfSwKCgoJZ2V0QWxsRGF5SHRtbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMub3B0KCdhbGxEYXlIdG1sJykgfHwgaHRtbEVzY2FwZSh0aGlzLm9wdCgnYWxsRGF5VGV4dCcpKTsKCX0sCgoKCS8qIE5hdmlnYXRpb24KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEdlbmVyYXRlcyBIVE1MIGZvciBhbiBhbmNob3IgdG8gYW5vdGhlciB2aWV3IGludG8gdGhlIGNhbGVuZGFyLgoJLy8gV2lsbCBlaXRoZXIgZ2VuZXJhdGUgYW4gPGE+IHRhZyBvciBhIG5vbi1jbGlja2FibGUgPHNwYW4+IHRhZywgZGVwZW5kaW5nIG9uIGVuYWJsZWQgc2V0dGluZ3MuCgkvLyBgZ290b09wdGlvbnNgIGNhbiBlaXRoZXIgYmUgYSBtb21lbnQgaW5wdXQsIG9yIGFuIG9iamVjdCB3aXRoIHRoZSBmb3JtOgoJLy8geyBkYXRlLCB0eXBlLCBmb3JjZU9mZiB9CgkvLyBgdHlwZWAgaXMgYSB2aWV3LXR5cGUgbGlrZSAiZGF5IiBvciAid2VlayIuIGRlZmF1bHQgdmFsdWUgaXMgImRheSIuCgkvLyBgYXR0cnNgIGFuZCBgaW5uZXJIdG1sYCBhcmUgdXNlIHRvIGdlbmVyYXRlIHRoZSByZXN0IG9mIHRoZSBIVE1MIHRhZy4KCWJ1aWxkR290b0FuY2hvckh0bWw6IGZ1bmN0aW9uKGdvdG9PcHRpb25zLCBhdHRycywgaW5uZXJIdG1sKSB7CgkJdmFyIGRhdGUsIHR5cGUsIGZvcmNlT2ZmOwoJCXZhciBmaW5hbE9wdGlvbnM7CgoJCWlmICgkLmlzUGxhaW5PYmplY3QoZ290b09wdGlvbnMpKSB7CgkJCWRhdGUgPSBnb3RvT3B0aW9ucy5kYXRlOwoJCQl0eXBlID0gZ290b09wdGlvbnMudHlwZTsKCQkJZm9yY2VPZmYgPSBnb3RvT3B0aW9ucy5mb3JjZU9mZjsKCQl9CgkJZWxzZSB7CgkJCWRhdGUgPSBnb3RvT3B0aW9uczsgLy8gYSBzaW5nbGUgbW9tZW50IGlucHV0CgkJfQoJCWRhdGUgPSBGQy5tb21lbnQoZGF0ZSk7IC8vIGlmIGEgc3RyaW5nLCBwYXJzZSBpdAoKCQlmaW5hbE9wdGlvbnMgPSB7IC8vIGZvciBzZXJpYWxpemF0aW9uIGludG8gdGhlIGxpbmsKCQkJZGF0ZTogZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSwKCQkJdHlwZTogdHlwZSB8fCAnZGF5JwoJCX07CgoJCWlmICh0eXBlb2YgYXR0cnMgPT09ICdzdHJpbmcnKSB7CgkJCWlubmVySHRtbCA9IGF0dHJzOwoJCQlhdHRycyA9IG51bGw7CgkJfQoKCQlhdHRycyA9IGF0dHJzID8gJyAnICsgYXR0cnNUb1N0cihhdHRycykgOiAnJzsgLy8gd2lsbCBoYXZlIGEgbGVhZGluZyBzcGFjZQoJCWlubmVySHRtbCA9IGlubmVySHRtbCB8fCAnJzsKCgkJaWYgKCFmb3JjZU9mZiAmJiB0aGlzLm9wdCgnbmF2TGlua3MnKSkgewoJCQlyZXR1cm4gJzxhJyArIGF0dHJzICsKCQkJCScgZGF0YS1nb3RvPSInICsgaHRtbEVzY2FwZShKU09OLnN0cmluZ2lmeShmaW5hbE9wdGlvbnMpKSArICciPicgKwoJCQkJaW5uZXJIdG1sICsKCQkJCSc8L2E+JzsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiAnPHNwYW4nICsgYXR0cnMgKyAnPicgKwoJCQkJaW5uZXJIdG1sICsKCQkJCSc8L3NwYW4+JzsKCQl9Cgl9LAoKCgkvKiBSZW5kZXJpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFNldHMgdGhlIGNvbnRhaW5lciBlbGVtZW50IHRoYXQgdGhlIHZpZXcgc2hvdWxkIHJlbmRlciBpbnNpZGUgb2YuCgkvLyBEb2VzIG90aGVyIERPTS1yZWxhdGVkIGluaXRpYWxpemF0aW9ucy4KCXNldEVsZW1lbnQ6IGZ1bmN0aW9uKGVsKSB7CgkJdGhpcy5lbCA9IGVsOwoJCXRoaXMuYmluZEdsb2JhbEhhbmRsZXJzKCk7Cgl9LAoKCgkvLyBSZW1vdmVzIHRoZSB2aWV3J3MgY29udGFpbmVyIGVsZW1lbnQgZnJvbSB0aGUgRE9NLCBjbGVhcmluZyBhbnkgY29udGVudCBiZWZvcmVoYW5kLgoJLy8gVW5kb2VzIGFueSBvdGhlciBET00tcmVsYXRlZCBhdHRhY2htZW50cy4KCXJlbW92ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuY2xlYXIoKTsgLy8gY2xlYXJzIGFsbCBjb250ZW50CgoJCS8vIGNsZWFuIHVwIHRoZSBza2VsZXRvbgoJCWlmICh0aGlzLmlzU2tlbGV0b25SZW5kZXJlZCkgewoJCQl0aGlzLnVucmVuZGVyU2tlbGV0b24oKTsKCQkJdGhpcy5pc1NrZWxldG9uUmVuZGVyZWQgPSBmYWxzZTsKCQl9CgoJCXRoaXMudW5iaW5kR2xvYmFsSGFuZGxlcnMoKTsKCgkJdGhpcy5lbC5yZW1vdmUoKTsKCgkJLy8gTk9URTogZG9uJ3QgbnVsbC1vdXQgdGhpcy5lbCBpbiBjYXNlIHRoZSBWaWV3IHdhcyBkZXN0cm95ZWQgd2l0aGluIGFuIEFQSSBjYWxsYmFjay4KCQkvLyBXZSBkb24ndCBudWxsLW91dCB0aGUgVmlldydzIG90aGVyIGpRdWVyeSBlbGVtZW50IHJlZmVyZW5jZXMgdXBvbiBkZXN0cm95LAoJCS8vICBzbyB3ZSBzaG91bGRuJ3Qga2lsbCB0aGlzLmVsIGVpdGhlci4KCX0sCgoKCS8vIERvZXMgZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gZGlzcGxheSB0aGUgdmlldyBjZW50ZXJlZCBhcm91bmQgdGhlIGdpdmVuIHVuem9uZWQgZGF0ZS4KCS8vIERvZXMgZXZlcnkgdHlwZSBvZiByZW5kZXJpbmcgRVhDRVBUIHJlbmRlcmluZyBldmVudHMuCgkvLyBJcyBhc3ljaHJvbm91cyBhbmQgcmV0dXJucyBhIHByb21pc2UuCglkaXNwbGF5OiBmdW5jdGlvbihkYXRlLCBleHBsaWNpdFNjcm9sbFN0YXRlKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgcHJldlNjcm9sbFN0YXRlID0gbnVsbDsKCgkJaWYgKGV4cGxpY2l0U2Nyb2xsU3RhdGUgIT0gbnVsbCAmJiB0aGlzLmRpc3BsYXlpbmcpIHsgLy8gZG9uJ3QgbmVlZCBwcmV2U2Nyb2xsU3RhdGUgaWYgZXhwbGljaXRTY3JvbGxTdGF0ZQoJCQlwcmV2U2Nyb2xsU3RhdGUgPSB0aGlzLnF1ZXJ5U2Nyb2xsKCk7CgkJfQoKCQl0aGlzLmNhbGVuZGFyLmZyZWV6ZUNvbnRlbnRIZWlnaHQoKTsKCgkJcmV0dXJuIHN5bmNUaGVuKHRoaXMuY2xlYXIoKSwgZnVuY3Rpb24oKSB7IC8vIGNsZWFyIHRoZSBjb250ZW50IGZpcnN0CgkJCXJldHVybiAoCgkJCQlfdGhpcy5kaXNwbGF5aW5nID0KCQkJCQlzeW5jVGhlbihfdGhpcy5kaXNwbGF5VmlldyhkYXRlKSwgZnVuY3Rpb24oKSB7IC8vIGRpc3BsYXlWaWV3IG1pZ2h0IHJldHVybiBhIHByb21pc2UKCgkJCQkJCS8vIGNhbGxlciBvZiBkaXNwbGF5KCkgd2FudHMgYSBzcGVjaWZpYyBzY3JvbGwgc3RhdGU/CgkJCQkJCWlmIChleHBsaWNpdFNjcm9sbFN0YXRlICE9IG51bGwpIHsKCQkJCQkJCS8vIHdlIG1ha2UgYW4gYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgTk9UIHRoZSBpbml0aWFsIHJlbmRlciwKCQkJCQkJCS8vIGFuZCB0aHVzIGRvbid0IG5lZWQgZm9yY2VTY3JvbGwgKGlzIGluY29udmVuaWVudGx5IGFzeW5jaHJvbm91cykKCQkJCQkJCV90aGlzLnNldFNjcm9sbChleHBsaWNpdFNjcm9sbFN0YXRlKTsKCQkJCQkJfQoJCQkJCQllbHNlIHsKCQkJCQkJCV90aGlzLmZvcmNlU2Nyb2xsKF90aGlzLmNvbXB1dGVJbml0aWFsU2Nyb2xsKHByZXZTY3JvbGxTdGF0ZSkpOwoJCQkJCQl9CgoJCQkJCQlfdGhpcy5jYWxlbmRhci51bmZyZWV6ZUNvbnRlbnRIZWlnaHQoKTsKCQkJCQkJX3RoaXMudHJpZ2dlclJlbmRlcigpOwoJCQkJCX0pCgkJCSk7CgkJfSk7Cgl9LAoKCgkvLyBEb2VzIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGNsZWFyIHRoZSBjb250ZW50IG9mIHRoZSB2aWV3LgoJLy8gQ2xlYXJzIGRhdGVzIGFuZCBldmVudHMuIERvZXMgbm90IGNsZWFyIHRoZSBza2VsZXRvbi4KCS8vIElzIGFzeWNocm9ub3VzIGFuZCByZXR1cm5zIGEgcHJvbWlzZS4KCWNsZWFyOiBmdW5jdGlvbigpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoJCXZhciBkaXNwbGF5aW5nID0gdGhpcy5kaXNwbGF5aW5nOwoKCQlpZiAoZGlzcGxheWluZykgeyAvLyBwcmV2aW91c2x5IGRpc3BsYXllZCwgb3IgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGlzcGxheWVkPwoJCQlyZXR1cm4gc3luY1RoZW4oZGlzcGxheWluZywgZnVuY3Rpb24oKSB7IC8vIHdhaXQgZm9yIHRoZSBkaXNwbGF5IHRvIGZpbmlzaAoJCQkJX3RoaXMuZGlzcGxheWluZyA9IG51bGw7CgkJCQlfdGhpcy5jbGVhckV2ZW50cygpOwoJCQkJcmV0dXJuIF90aGlzLmNsZWFyVmlldygpOyAvLyBtaWdodCByZXR1cm4gYSBwcm9taXNlLiBjaGFpbiBpdAoJCQl9KTsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiAkLndoZW4oKTsgLy8gYW4gaW1tZWRpYXRlbHktcmVzb2x2ZWQgcHJvbWlzZQoJCX0KCX0sCgoKCS8vIERpc3BsYXlzIHRoZSB2aWV3J3Mgbm9uLWV2ZW50IGNvbnRlbnQsIHN1Y2ggYXMgZGF0ZS1yZWxhdGVkIGNvbnRlbnQgb3IgYW55dGhpbmcgcmVxdWlyZWQgYnkgZXZlbnRzLgoJLy8gUmVuZGVycyB0aGUgdmlldydzIG5vbi1jb250ZW50IHNrZWxldG9uIGlmIG5lY2Vzc2FyeS4KCS8vIENhbiBiZSBhc3luY2hyb25vdXMgYW5kIHJldHVybiBhIHByb21pc2UuCglkaXNwbGF5VmlldzogZnVuY3Rpb24oZGF0ZSkgewoJCWlmICghdGhpcy5pc1NrZWxldG9uUmVuZGVyZWQpIHsKCQkJdGhpcy5yZW5kZXJTa2VsZXRvbigpOwoJCQl0aGlzLmlzU2tlbGV0b25SZW5kZXJlZCA9IHRydWU7CgkJfQoJCWlmIChkYXRlKSB7CgkJCXRoaXMuc2V0RGF0ZShkYXRlKTsKCQl9CgkJaWYgKHRoaXMucmVuZGVyKSB7CgkJCXRoaXMucmVuZGVyKCk7IC8vIFRPRE86IGRlcHJlY2F0ZQoJCX0KCQl0aGlzLnJlbmRlckRhdGVzKCk7CgkJdGhpcy51cGRhdGVTaXplKCk7CgkJdGhpcy5yZW5kZXJCdXNpbmVzc0hvdXJzKCk7IC8vIG1pZ2h0IG5lZWQgY29vcmRpbmF0ZXMsIHNvIHNob3VsZCBnbyBhZnRlciB1cGRhdGVTaXplKCkKCQl0aGlzLnN0YXJ0Tm93SW5kaWNhdG9yKCk7Cgl9LAoKCgkvLyBVbnJlbmRlcnMgdGhlIHZpZXcgY29udGVudCB0aGF0IHdhcyByZW5kZXJlZCBpbiBkaXNwbGF5Vmlldy4KCS8vIENhbiBiZSBhc3luY2hyb25vdXMgYW5kIHJldHVybiBhIHByb21pc2UuCgljbGVhclZpZXc6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5zZWxlY3QoKTsKCQl0aGlzLnN0b3BOb3dJbmRpY2F0b3IoKTsKCQl0aGlzLnRyaWdnZXJVbnJlbmRlcigpOwoJCXRoaXMudW5yZW5kZXJCdXNpbmVzc0hvdXJzKCk7CgkJdGhpcy51bnJlbmRlckRhdGVzKCk7CgkJaWYgKHRoaXMuZGVzdHJveSkgewoJCQl0aGlzLmRlc3Ryb3koKTsgLy8gVE9ETzogZGVwcmVjYXRlCgkJfQoJfSwKCgoJLy8gUmVuZGVycyB0aGUgYmFzaWMgc3RydWN0dXJlIG9mIHRoZSB2aWV3IGJlZm9yZSBhbnkgY29udGVudCBpcyByZW5kZXJlZAoJcmVuZGVyU2tlbGV0b246IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudAoJfSwKCgoJLy8gVW5yZW5kZXJzIHRoZSBiYXNpYyBzdHJ1Y3R1cmUgb2YgdGhlIHZpZXcKCXVucmVuZGVyU2tlbGV0b246IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudAoJfSwKCgoJLy8gUmVuZGVycyB0aGUgdmlldydzIGRhdGUtcmVsYXRlZCBjb250ZW50LgoJLy8gQXNzdW1lcyBzZXRSYW5nZSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBhbmQgdGhlIHNrZWxldG9uIGhhcyBhbHJlYWR5IGJlZW4gcmVuZGVyZWQuCglyZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgdGhlIHZpZXcncyBkYXRlLXJlbGF0ZWQgY29udGVudAoJdW5yZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUKCX0sCgoKCS8vIFNpZ25hbHMgdGhhdCB0aGUgdmlldydzIGNvbnRlbnQgaGFzIGJlZW4gcmVuZGVyZWQKCXRyaWdnZXJSZW5kZXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMudHJpZ2dlcigndmlld1JlbmRlcicsIHRoaXMsIHRoaXMsIHRoaXMuZWwpOwoJfSwKCgoJLy8gU2lnbmFscyB0aGF0IHRoZSB2aWV3J3MgY29udGVudCBpcyBhYm91dCB0byBiZSB1bnJlbmRlcmVkCgl0cmlnZ2VyVW5yZW5kZXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMudHJpZ2dlcigndmlld0Rlc3Ryb3knLCB0aGlzLCB0aGlzLCB0aGlzLmVsKTsKCX0sCgoKCS8vIEJpbmRzIERPTSBoYW5kbGVycyB0byBlbGVtZW50cyB0aGF0IHJlc2lkZSBvdXRzaWRlIHRoZSB2aWV3IGNvbnRhaW5lciwgc3VjaCBhcyB0aGUgZG9jdW1lbnQKCWJpbmRHbG9iYWxIYW5kbGVyczogZnVuY3Rpb24oKSB7CgkJdGhpcy5saXN0ZW5UbygkKGRvY3VtZW50KSwgJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlRG9jdW1lbnRNb3VzZWRvd24pOwoJCXRoaXMubGlzdGVuVG8oJChkb2N1bWVudCksICd0b3VjaHN0YXJ0JywgdGhpcy5wcm9jZXNzVW5zZWxlY3QpOwoJfSwKCgoJLy8gVW5iaW5kcyBET00gaGFuZGxlcnMgZnJvbSBlbGVtZW50cyB0aGF0IHJlc2lkZSBvdXRzaWRlIHRoZSB2aWV3IGNvbnRhaW5lcgoJdW5iaW5kR2xvYmFsSGFuZGxlcnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc3RvcExpc3RlbmluZ1RvKCQoZG9jdW1lbnQpKTsKCX0sCgoKCS8vIEluaXRpYWxpemVzIGludGVybmFsIHZhcmlhYmxlcyByZWxhdGVkIHRvIHRoZW1pbmcKCWluaXRUaGVtaW5nUHJvcHM6IGZ1bmN0aW9uKCkgewoJCXZhciB0bSA9IHRoaXMub3B0KCd0aGVtZScpID8gJ3VpJyA6ICdmYyc7CgoJCXRoaXMud2lkZ2V0SGVhZGVyQ2xhc3MgPSB0bSArICctd2lkZ2V0LWhlYWRlcic7CgkJdGhpcy53aWRnZXRDb250ZW50Q2xhc3MgPSB0bSArICctd2lkZ2V0LWNvbnRlbnQnOwoJCXRoaXMuaGlnaGxpZ2h0U3RhdGVDbGFzcyA9IHRtICsgJy1zdGF0ZS1oaWdobGlnaHQnOwoJfSwKCgoJLyogQnVzaW5lc3MgSG91cnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlbmRlcnMgYnVzaW5lc3MtaG91cnMgb250byB0aGUgdmlldy4gQXNzdW1lcyB1cGRhdGVTaXplIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLgoJcmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgcHJldmlvdXNseS1yZW5kZXJlZCBidXNpbmVzcy1ob3VycwoJdW5yZW5kZXJCdXNpbmVzc0hvdXJzOiBmdW5jdGlvbigpIHsKCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQKCX0sCgoKCS8qIE5vdyBJbmRpY2F0b3IKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEltbWVkaWF0ZWx5IHJlbmRlciB0aGUgY3VycmVudCB0aW1lIGluZGljYXRvciBhbmQgYmVnaW5zIHJlLXJlbmRlcmluZyBpdCBhdCBhbiBpbnRlcnZhbCwKCS8vIHdoaWNoIGlzIGRlZmluZWQgYnkgdGhpcy5nZXROb3dJbmRpY2F0b3JVbml0KCkuCgkvLyBUT0RPOiBzb21laG93IGRvIHRoaXMgZm9yIHRoZSBjdXJyZW50IHdob2xlIGRheSdzIGJhY2tncm91bmQgdG9vCglzdGFydE5vd0luZGljYXRvcjogZnVuY3Rpb24oKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgdW5pdDsKCQl2YXIgdXBkYXRlOwoJCXZhciBkZWxheTsgLy8gbXMgd2FpdCB2YWx1ZQoKCQlpZiAodGhpcy5vcHQoJ25vd0luZGljYXRvcicpKSB7CgkJCXVuaXQgPSB0aGlzLmdldE5vd0luZGljYXRvclVuaXQoKTsKCQkJaWYgKHVuaXQpIHsKCQkJCXVwZGF0ZSA9IHByb3h5KHRoaXMsICd1cGRhdGVOb3dJbmRpY2F0b3InKTsgLy8gYmluZCB0byBgdGhpc2AKCgkJCQl0aGlzLmluaXRpYWxOb3dEYXRlID0gdGhpcy5jYWxlbmRhci5nZXROb3coKTsKCQkJCXRoaXMuaW5pdGlhbE5vd1F1ZXJpZWRNcyA9ICtuZXcgRGF0ZSgpOwoJCQkJdGhpcy5yZW5kZXJOb3dJbmRpY2F0b3IodGhpcy5pbml0aWFsTm93RGF0ZSk7CgkJCQl0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQgPSB0cnVlOwoKCQkJCS8vIHdhaXQgdW50aWwgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBpbnRlcnZhbAoJCQkJZGVsYXkgPSB0aGlzLmluaXRpYWxOb3dEYXRlLmNsb25lKCkuc3RhcnRPZih1bml0KS5hZGQoMSwgdW5pdCkgLSB0aGlzLmluaXRpYWxOb3dEYXRlOwoJCQkJdGhpcy5ub3dJbmRpY2F0b3JUaW1lb3V0SUQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJCV90aGlzLm5vd0luZGljYXRvclRpbWVvdXRJRCA9IG51bGw7CgkJCQkJdXBkYXRlKCk7CgkJCQkJZGVsYXkgPSArbW9tZW50LmR1cmF0aW9uKDEsIHVuaXQpOwoJCQkJCWRlbGF5ID0gTWF0aC5tYXgoMTAwLCBkZWxheSk7IC8vIHByZXZlbnQgdG9vIGZyZXF1ZW50CgkJCQkJX3RoaXMubm93SW5kaWNhdG9ySW50ZXJ2YWxJRCA9IHNldEludGVydmFsKHVwZGF0ZSwgZGVsYXkpOyAvLyB1cGRhdGUgZXZlcnkgaW50ZXJ2YWwKCQkJCX0sIGRlbGF5KTsKCQkJfQoJCX0KCX0sCgoKCS8vIHJlcmVuZGVycyB0aGUgbm93IGluZGljYXRvciwgY29tcHV0aW5nIHRoZSBuZXcgY3VycmVudCB0aW1lIGZyb20gdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgaGFzIHBhc3NlZAoJLy8gc2luY2UgdGhlIGluaXRpYWwgZ2V0Tm93IGNhbGwuCgl1cGRhdGVOb3dJbmRpY2F0b3I6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQpIHsKCQkJdGhpcy51bnJlbmRlck5vd0luZGljYXRvcigpOwoJCQl0aGlzLnJlbmRlck5vd0luZGljYXRvcigKCQkJCXRoaXMuaW5pdGlhbE5vd0RhdGUuY2xvbmUoKS5hZGQobmV3IERhdGUoKSAtIHRoaXMuaW5pdGlhbE5vd1F1ZXJpZWRNcykgLy8gYWRkIG1zCgkJCSk7CgkJfQoJfSwKCgoJLy8gSW1tZWRpYXRlbHkgdW5yZW5kZXJzIHRoZSB2aWV3J3MgY3VycmVudCB0aW1lIGluZGljYXRvciBhbmQgc3RvcHMgYW55IHJlLXJlbmRlcmluZyB0aW1lcnMuCgkvLyBXb24ndCBjYXVzZSBzaWRlIGVmZmVjdHMgaWYgaW5kaWNhdG9yIGlzbid0IHJlbmRlcmVkLgoJc3RvcE5vd0luZGljYXRvcjogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaXNOb3dJbmRpY2F0b3JSZW5kZXJlZCkgewoKCQkJaWYgKHRoaXMubm93SW5kaWNhdG9yVGltZW91dElEKSB7CgkJCQljbGVhclRpbWVvdXQodGhpcy5ub3dJbmRpY2F0b3JUaW1lb3V0SUQpOwoJCQkJdGhpcy5ub3dJbmRpY2F0b3JUaW1lb3V0SUQgPSBudWxsOwoJCQl9CgkJCWlmICh0aGlzLm5vd0luZGljYXRvckludGVydmFsSUQpIHsKCQkJCWNsZWFyVGltZW91dCh0aGlzLm5vd0luZGljYXRvckludGVydmFsSUQpOwoJCQkJdGhpcy5ub3dJbmRpY2F0b3JJbnRlcnZhbElEID0gbnVsbDsKCQkJfQoKCQkJdGhpcy51bnJlbmRlck5vd0luZGljYXRvcigpOwoJCQl0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQgPSBmYWxzZTsKCQl9Cgl9LAoKCgkvLyBSZXR1cm5zIGEgc3RyaW5nIHVuaXQsIGxpa2UgJ3NlY29uZCcgb3IgJ21pbnV0ZScgdGhhdCBkZWZpbmVkIGhvdyBvZnRlbiB0aGUgY3VycmVudCB0aW1lIGluZGljYXRvcgoJLy8gc2hvdWxkIGJlIHJlZnJlc2hlZC4gSWYgc29tZXRoaW5nIGZhbHN5IGlzIHJldHVybmVkLCBubyB0aW1lIGluZGljYXRvciBpcyByZW5kZXJlZCBhdCBhbGwuCglnZXROb3dJbmRpY2F0b3JVbml0OiBmdW5jdGlvbigpIHsKCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQKCX0sCgoKCS8vIFJlbmRlcnMgYSBjdXJyZW50IHRpbWUgaW5kaWNhdG9yIGF0IHRoZSBnaXZlbiBkYXRldGltZQoJcmVuZGVyTm93SW5kaWNhdG9yOiBmdW5jdGlvbihkYXRlKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbmRvZXMgdGhlIHJlbmRlcmluZyBhY3Rpb25zIGZyb20gcmVuZGVyTm93SW5kaWNhdG9yCgl1bnJlbmRlck5vd0luZGljYXRvcjogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvKiBEaW1lbnNpb25zCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBSZWZyZXNoZXMgYW55dGhpbmcgZGVwZW5kYW50IHVwb24gc2l6aW5nIG9mIHRoZSBjb250YWluZXIgZWxlbWVudCBvZiB0aGUgZ3JpZAoJdXBkYXRlU2l6ZTogZnVuY3Rpb24oaXNSZXNpemUpIHsKCQl2YXIgc2Nyb2xsU3RhdGU7CgoJCWlmIChpc1Jlc2l6ZSkgewoJCQlzY3JvbGxTdGF0ZSA9IHRoaXMucXVlcnlTY3JvbGwoKTsKCQl9CgoJCXRoaXMudXBkYXRlSGVpZ2h0KGlzUmVzaXplKTsKCQl0aGlzLnVwZGF0ZVdpZHRoKGlzUmVzaXplKTsKCQl0aGlzLnVwZGF0ZU5vd0luZGljYXRvcigpOwoKCQlpZiAoaXNSZXNpemUpIHsKCQkJdGhpcy5zZXRTY3JvbGwoc2Nyb2xsU3RhdGUpOwoJCX0KCX0sCgoKCS8vIFJlZnJlc2hlcyB0aGUgaG9yaXpvbnRhbCBkaW1lbnNpb25zIG9mIHRoZSBjYWxlbmRhcgoJdXBkYXRlV2lkdGg6IGZ1bmN0aW9uKGlzUmVzaXplKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBSZWZyZXNoZXMgdGhlIHZlcnRpY2FsIGRpbWVuc2lvbnMgb2YgdGhlIGNhbGVuZGFyCgl1cGRhdGVIZWlnaHQ6IGZ1bmN0aW9uKGlzUmVzaXplKSB7CgkJdmFyIGNhbGVuZGFyID0gdGhpcy5jYWxlbmRhcjsgLy8gd2UgcG9sbCB0aGUgY2FsZW5kYXIgZm9yIGhlaWdodCBpbmZvcm1hdGlvbgoKCQl0aGlzLnNldEhlaWdodCgKCQkJY2FsZW5kYXIuZ2V0U3VnZ2VzdGVkVmlld0hlaWdodCgpLAoJCQljYWxlbmRhci5pc0hlaWdodEF1dG8oKQoJCSk7Cgl9LAoKCgkvLyBVcGRhdGVzIHRoZSB2ZXJ0aWNhbCBkaW1lbnNpb25zIG9mIHRoZSBjYWxlbmRhciB0byB0aGUgc3BlY2lmaWVkIGhlaWdodC4KCS8vIGlmIGBpc0F1dG9gIGlzIHNldCB0byB0cnVlLCBoZWlnaHQgYmVjb21lcyBtZXJlbHkgYSBzdWdnZXN0aW9uIGFuZCB0aGUgdmlldyBzaG91bGQgdXNlIGl0cyAibmF0dXJhbCIgaGVpZ2h0LgoJc2V0SGVpZ2h0OiBmdW5jdGlvbihoZWlnaHQsIGlzQXV0bykgewoJCS8vIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudAoJfSwKCgoJLyogU2Nyb2xsZXIKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIENvbXB1dGVzIHRoZSBpbml0aWFsIHByZS1jb25maWd1cmVkIHNjcm9sbCBzdGF0ZSBwcmlvciB0byBhbGxvd2luZyB0aGUgdXNlciB0byBjaGFuZ2UgaXQuCgkvLyBHaXZlbiB0aGUgc2Nyb2xsIHN0YXRlIGZyb20gdGhlIHByZXZpb3VzIHJlbmRlcmluZy4gSWYgZmlyc3QgdGltZSByZW5kZXJpbmcsIGdpdmVuIG51bGwuCgljb21wdXRlSW5pdGlhbFNjcm9sbDogZnVuY3Rpb24ocHJldmlvdXNTY3JvbGxTdGF0ZSkgewoJCXJldHVybiAwOwoJfSwKCgoJLy8gUmV0cmlldmVzIHRoZSB2aWV3J3MgY3VycmVudCBuYXR1cmFsIHNjcm9sbCBzdGF0ZS4gQ2FuIHJldHVybiBhbiBhcmJpdHJhcnkgZm9ybWF0LgoJcXVlcnlTY3JvbGw6IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQKCX0sCgoKCS8vIFNldHMgdGhlIHZpZXcncyBzY3JvbGwgc3RhdGUuIFdpbGwgYWNjZXB0IHRoZSBzYW1lIGZvcm1hdCBjb21wdXRlSW5pdGlhbFNjcm9sbCBhbmQgcXVlcnlTY3JvbGwgcHJvZHVjZS4KCXNldFNjcm9sbDogZnVuY3Rpb24oc2Nyb2xsU3RhdGUpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvLyBTZXRzIHRoZSBzY3JvbGwgc3RhdGUsIG1ha2luZyBzdXJlIHRvIG92ZXJjb21lIGFueSBwcmVkZWZpbmVkIHNjcm9sbCB2YWx1ZSB0aGUgYnJvd3NlciBoYXMgaW4gbWluZAoJZm9yY2VTY3JvbGw6IGZ1bmN0aW9uKHNjcm9sbFN0YXRlKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCgkJdGhpcy5zZXRTY3JvbGwoc2Nyb2xsU3RhdGUpOwoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCV90aGlzLnNldFNjcm9sbChzY3JvbGxTdGF0ZSk7CgkJfSwgMCk7Cgl9LAoKCgkvKiBFdmVudCBFbGVtZW50cyAvIFNlZ21lbnRzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBEb2VzIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGRpc3BsYXkgdGhlIGdpdmVuIGV2ZW50cyBvbnRvIHRoZSBjdXJyZW50IHZpZXcKCWRpc3BsYXlFdmVudHM6IGZ1bmN0aW9uKGV2ZW50cykgewoJCXZhciBzY3JvbGxTdGF0ZSA9IHRoaXMucXVlcnlTY3JvbGwoKTsKCgkJdGhpcy5jbGVhckV2ZW50cygpOwoJCXRoaXMucmVuZGVyRXZlbnRzKGV2ZW50cyk7CgkJdGhpcy5pc0V2ZW50c1JlbmRlcmVkID0gdHJ1ZTsKCQl0aGlzLnNldFNjcm9sbChzY3JvbGxTdGF0ZSk7CgkJdGhpcy50cmlnZ2VyRXZlbnRSZW5kZXIoKTsKCX0sCgoKCS8vIERvZXMgZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gY2xlYXIgdGhlIHZpZXcncyBjdXJyZW50bHktcmVuZGVyZWQgZXZlbnRzCgljbGVhckV2ZW50czogZnVuY3Rpb24oKSB7CgkJdmFyIHNjcm9sbFN0YXRlOwoKCQlpZiAodGhpcy5pc0V2ZW50c1JlbmRlcmVkKSB7CgoJCQkvLyBUT0RPOiBvcHRpbWl6ZTogaWYgd2Uga25vdyB0aGlzIGlzIHBhcnQgb2YgYSBkaXNwbGF5RXZlbnRzIGNhbGwsIGRvbid0IHF1ZXJ5U2Nyb2xsL3NldFNjcm9sbAoJCQlzY3JvbGxTdGF0ZSA9IHRoaXMucXVlcnlTY3JvbGwoKTsKCgkJCXRoaXMudHJpZ2dlckV2ZW50VW5yZW5kZXIoKTsKCQkJaWYgKHRoaXMuZGVzdHJveUV2ZW50cykgewoJCQkJdGhpcy5kZXN0cm95RXZlbnRzKCk7IC8vIFRPRE86IGRlcHJlY2F0ZQoJCQl9CgkJCXRoaXMudW5yZW5kZXJFdmVudHMoKTsKCQkJdGhpcy5zZXRTY3JvbGwoc2Nyb2xsU3RhdGUpOwoJCQl0aGlzLmlzRXZlbnRzUmVuZGVyZWQgPSBmYWxzZTsKCQl9Cgl9LAoKCgkvLyBSZW5kZXJzIHRoZSBldmVudHMgb250byB0aGUgdmlldy4KCXJlbmRlckV2ZW50czogZnVuY3Rpb24oZXZlbnRzKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBSZW1vdmVzIGV2ZW50IGVsZW1lbnRzIGZyb20gdGhlIHZpZXcuCgl1bnJlbmRlckV2ZW50czogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBTaWduYWxzIHRoYXQgYWxsIGV2ZW50cyBoYXZlIGJlZW4gcmVuZGVyZWQKCXRyaWdnZXJFdmVudFJlbmRlcjogZnVuY3Rpb24oKSB7CgkJdGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbihzZWcpIHsKCQkJdGhpcy50cmlnZ2VyKCdldmVudEFmdGVyUmVuZGVyJywgc2VnLmV2ZW50LCBzZWcuZXZlbnQsIHNlZy5lbCk7CgkJfSk7CgkJdGhpcy50cmlnZ2VyKCdldmVudEFmdGVyQWxsUmVuZGVyJyk7Cgl9LAoKCgkvLyBTaWduYWxzIHRoYXQgYWxsIGV2ZW50IGVsZW1lbnRzIGFyZSBhYm91dCB0byBiZSByZW1vdmVkCgl0cmlnZ2VyRXZlbnRVbnJlbmRlcjogZnVuY3Rpb24oKSB7CgkJdGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbihzZWcpIHsKCQkJdGhpcy50cmlnZ2VyKCdldmVudERlc3Ryb3knLCBzZWcuZXZlbnQsIHNlZy5ldmVudCwgc2VnLmVsKTsKCQl9KTsKCX0sCgoKCS8vIEdpdmVuIGFuIGV2ZW50IGFuZCB0aGUgZGVmYXVsdCBlbGVtZW50IHVzZWQgZm9yIHJlbmRlcmluZywgcmV0dXJucyB0aGUgZWxlbWVudCB0aGF0IHNob3VsZCBhY3R1YWxseSBiZSB1c2VkLgoJLy8gQmFzaWNhbGx5IHJ1bnMgZXZlbnRzIGFuZCBlbGVtZW50cyB0aHJvdWdoIHRoZSBldmVudFJlbmRlciBob29rLgoJcmVzb2x2ZUV2ZW50RWw6IGZ1bmN0aW9uKGV2ZW50LCBlbCkgewoJCXZhciBjdXN0b20gPSB0aGlzLnRyaWdnZXIoJ2V2ZW50UmVuZGVyJywgZXZlbnQsIGV2ZW50LCBlbCk7CgoJCWlmIChjdXN0b20gPT09IGZhbHNlKSB7IC8vIG1lYW5zIGRvbid0IHJlbmRlciBhdCBhbGwKCQkJZWwgPSBudWxsOwoJCX0KCQllbHNlIGlmIChjdXN0b20gJiYgY3VzdG9tICE9PSB0cnVlKSB7CgkJCWVsID0gJChjdXN0b20pOwoJCX0KCgkJcmV0dXJuIGVsOwoJfSwKCgoJLy8gSGlkZXMgYWxsIHJlbmRlcmVkIGV2ZW50IHNlZ21lbnRzIGxpbmtlZCB0byB0aGUgZ2l2ZW4gZXZlbnQKCXNob3dFdmVudDogZnVuY3Rpb24oZXZlbnQpIHsKCQl0aGlzLnJlbmRlcmVkRXZlbnRTZWdFYWNoKGZ1bmN0aW9uKHNlZykgewoJCQlzZWcuZWwuY3NzKCd2aXNpYmlsaXR5JywgJycpOwoJCX0sIGV2ZW50KTsKCX0sCgoKCS8vIFNob3dzIGFsbCByZW5kZXJlZCBldmVudCBzZWdtZW50cyBsaW5rZWQgdG8gdGhlIGdpdmVuIGV2ZW50CgloaWRlRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbihzZWcpIHsKCQkJc2VnLmVsLmNzcygndmlzaWJpbGl0eScsICdoaWRkZW4nKTsKCQl9LCBldmVudCk7Cgl9LAoKCgkvLyBJdGVyYXRlcyB0aHJvdWdoIGV2ZW50IHNlZ21lbnRzIHRoYXQgaGF2ZSBiZWVuIHJlbmRlcmVkIChoYXZlIGFuIGVsKS4gR29lcyB0aHJvdWdoIGFsbCBieSBkZWZhdWx0LgoJLy8gSWYgdGhlIG9wdGlvbmFsIGBldmVudGAgYXJndW1lbnQgaXMgc3BlY2lmaWVkLCBvbmx5IGl0ZXJhdGVzIHRocm91Z2ggc2VnbWVudHMgbGlua2VkIHRvIHRoYXQgZXZlbnQuCgkvLyBUaGUgYHRoaXNgIHZhbHVlIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIHRoZSB2aWV3LgoJcmVuZGVyZWRFdmVudFNlZ0VhY2g6IGZ1bmN0aW9uKGZ1bmMsIGV2ZW50KSB7CgkJdmFyIHNlZ3MgPSB0aGlzLmdldEV2ZW50U2VncygpOwoJCXZhciBpOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQlpZiAoIWV2ZW50IHx8IHNlZ3NbaV0uZXZlbnQuX2lkID09PSBldmVudC5faWQpIHsKCQkJCWlmIChzZWdzW2ldLmVsKSB7CgkJCQkJZnVuYy5jYWxsKHRoaXMsIHNlZ3NbaV0pOwoJCQkJfQoJCQl9CgkJfQoJfSwKCgoJLy8gUmV0cmlldmVzIGFsbCB0aGUgcmVuZGVyZWQgc2VnbWVudCBvYmplY3RzIGZvciB0aGUgdmlldwoJZ2V0RXZlbnRTZWdzOiBmdW5jdGlvbigpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50CgkJcmV0dXJuIFtdOwoJfSwKCgoJLyogRXZlbnQgRHJhZy1uLURyb3AKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIENvbXB1dGVzIGlmIHRoZSBnaXZlbiBldmVudCBpcyBhbGxvd2VkIHRvIGJlIGRyYWdnZWQgYnkgdGhlIHVzZXIKCWlzRXZlbnREcmFnZ2FibGU6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIHRoaXMuaXNFdmVudFN0YXJ0RWRpdGFibGUoZXZlbnQpOwoJfSwKCgoJaXNFdmVudFN0YXJ0RWRpdGFibGU6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIGZpcnN0RGVmaW5lZCgKCQkJZXZlbnQuc3RhcnRFZGl0YWJsZSwKCQkJKGV2ZW50LnNvdXJjZSB8fCB7fSkuc3RhcnRFZGl0YWJsZSwKCQkJdGhpcy5vcHQoJ2V2ZW50U3RhcnRFZGl0YWJsZScpLAoJCQl0aGlzLmlzRXZlbnRHZW5lcmFsbHlFZGl0YWJsZShldmVudCkKCQkpOwoJfSwKCgoJaXNFdmVudEdlbmVyYWxseUVkaXRhYmxlOiBmdW5jdGlvbihldmVudCkgewoJCXJldHVybiBmaXJzdERlZmluZWQoCgkJCWV2ZW50LmVkaXRhYmxlLAoJCQkoZXZlbnQuc291cmNlIHx8IHt9KS5lZGl0YWJsZSwKCQkJdGhpcy5vcHQoJ2VkaXRhYmxlJykKCQkpOwoJfSwKCgoJLy8gTXVzdCBiZSBjYWxsZWQgd2hlbiBhbiBldmVudCBpbiB0aGUgdmlldyBpcyBkcm9wcGVkIG9udG8gbmV3IGxvY2F0aW9uLgoJLy8gYGRyb3BMb2NhdGlvbmAgaXMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIG5ldyB6b25lZCBzdGFydC9lbmQvYWxsRGF5IHZhbHVlcyBmb3IgdGhlIGV2ZW50LgoJcmVwb3J0RXZlbnREcm9wOiBmdW5jdGlvbihldmVudCwgZHJvcExvY2F0aW9uLCBsYXJnZVVuaXQsIGVsLCBldikgewoJCXZhciBjYWxlbmRhciA9IHRoaXMuY2FsZW5kYXI7CgkJdmFyIG11dGF0ZVJlc3VsdCA9IGNhbGVuZGFyLm11dGF0ZUV2ZW50KGV2ZW50LCBkcm9wTG9jYXRpb24sIGxhcmdlVW5pdCk7CgkJdmFyIHVuZG9GdW5jID0gZnVuY3Rpb24oKSB7CgkJCW11dGF0ZVJlc3VsdC51bmRvKCk7CgkJCWNhbGVuZGFyLnJlcG9ydEV2ZW50Q2hhbmdlKCk7CgkJfTsKCgkJdGhpcy50cmlnZ2VyRXZlbnREcm9wKGV2ZW50LCBtdXRhdGVSZXN1bHQuZGF0ZURlbHRhLCB1bmRvRnVuYywgZWwsIGV2KTsKCQljYWxlbmRhci5yZXBvcnRFdmVudENoYW5nZSgpOyAvLyB3aWxsIHJlcmVuZGVyIGV2ZW50cwoJfSwKCgoJLy8gVHJpZ2dlcnMgZXZlbnQtZHJvcCBoYW5kbGVycyB0aGF0IGhhdmUgc3Vic2NyaWJlZCB2aWEgdGhlIEFQSQoJdHJpZ2dlckV2ZW50RHJvcDogZnVuY3Rpb24oZXZlbnQsIGRhdGVEZWx0YSwgdW5kb0Z1bmMsIGVsLCBldikgewoJCXRoaXMudHJpZ2dlcignZXZlbnREcm9wJywgZWxbMF0sIGV2ZW50LCBkYXRlRGVsdGEsIHVuZG9GdW5jLCBldiwge30pOyAvLyB7fSA9IGpxdWkgZHVtbXkKCX0sCgoKCS8qIEV4dGVybmFsIEVsZW1lbnQgRHJhZy1uLURyb3AKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIE11c3QgYmUgY2FsbGVkIHdoZW4gYW4gZXh0ZXJuYWwgZWxlbWVudCwgdmlhIGpRdWVyeSBVSSwgaGFzIGJlZW4gZHJvcHBlZCBvbnRvIHRoZSBjYWxlbmRhci4KCS8vIGBtZXRhYCBpcyB0aGUgcGFyc2VkIGRhdGEgdGhhdCBoYXMgYmVlbiBlbWJlZGRlZCBpbnRvIHRoZSBkcmFnZ2luZyBldmVudC4KCS8vIGBkcm9wTG9jYXRpb25gIGlzIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBuZXcgem9uZWQgc3RhcnQvZW5kL2FsbERheSB2YWx1ZXMgZm9yIHRoZSBldmVudC4KCXJlcG9ydEV4dGVybmFsRHJvcDogZnVuY3Rpb24obWV0YSwgZHJvcExvY2F0aW9uLCBlbCwgZXYsIHVpKSB7CgkJdmFyIGV2ZW50UHJvcHMgPSBtZXRhLmV2ZW50UHJvcHM7CgkJdmFyIGV2ZW50SW5wdXQ7CgkJdmFyIGV2ZW50OwoKCQkvLyBUcnkgdG8gYnVpbGQgYW4gZXZlbnQgb2JqZWN0IGFuZCByZW5kZXIgaXQuIFRPRE86IGRlY291cGxlIHRoZSB0d28KCQlpZiAoZXZlbnRQcm9wcykgewoJCQlldmVudElucHV0ID0gJC5leHRlbmQoe30sIGV2ZW50UHJvcHMsIGRyb3BMb2NhdGlvbik7CgkJCWV2ZW50ID0gdGhpcy5jYWxlbmRhci5yZW5kZXJFdmVudChldmVudElucHV0LCBtZXRhLnN0aWNrKVswXTsgLy8gcmVuZGVyRXZlbnQgcmV0dXJucyBhbiBhcnJheQoJCX0KCgkJdGhpcy50cmlnZ2VyRXh0ZXJuYWxEcm9wKGV2ZW50LCBkcm9wTG9jYXRpb24sIGVsLCBldiwgdWkpOwoJfSwKCgoJLy8gVHJpZ2dlcnMgZXh0ZXJuYWwtZHJvcCBoYW5kbGVycyB0aGF0IGhhdmUgc3Vic2NyaWJlZCB2aWEgdGhlIEFQSQoJdHJpZ2dlckV4dGVybmFsRHJvcDogZnVuY3Rpb24oZXZlbnQsIGRyb3BMb2NhdGlvbiwgZWwsIGV2LCB1aSkgewoKCQkvLyB0cmlnZ2VyICdkcm9wJyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgZWxlbWVudCByZXByZXNlbnRzIGFuIGV2ZW50CgkJdGhpcy50cmlnZ2VyKCdkcm9wJywgZWxbMF0sIGRyb3BMb2NhdGlvbi5zdGFydCwgZXYsIHVpKTsKCgkJaWYgKGV2ZW50KSB7CgkJCXRoaXMudHJpZ2dlcignZXZlbnRSZWNlaXZlJywgbnVsbCwgZXZlbnQpOyAvLyBzaWduYWwgYW4gZXh0ZXJuYWwgZXZlbnQgbGFuZGVkCgkJfQoJfSwKCgoJLyogRHJhZy1uLURyb3AgUmVuZGVyaW5nIChmb3IgYm90aCBldmVudHMgYW5kIGV4dGVybmFsIGVsZW1lbnRzKQoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGEgZXZlbnQgb3IgZXh0ZXJuYWwtZWxlbWVudCBkcmFnIG92ZXIgdGhlIGdpdmVuIGRyb3Agem9uZS4KCS8vIElmIGFuIGV4dGVybmFsLWVsZW1lbnQsIHNlZyB3aWxsIGJlIGBudWxsYC4KCS8vIE11c3QgcmV0dXJuIGVsZW1lbnRzIHVzZWQgZm9yIGFueSBtb2NrIGV2ZW50cy4KCXJlbmRlckRyYWc6IGZ1bmN0aW9uKGRyb3BMb2NhdGlvbiwgc2VnKSB7CgkJLy8gc3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudAoJfSwKCgoJLy8gVW5yZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYW4gZXZlbnQgb3IgZXh0ZXJuYWwtZWxlbWVudCBiZWluZyBkcmFnZ2VkLgoJdW5yZW5kZXJEcmFnOiBmdW5jdGlvbigpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvKiBFdmVudCBSZXNpemluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQ29tcHV0ZXMgaWYgdGhlIGdpdmVuIGV2ZW50IGlzIGFsbG93ZWQgdG8gYmUgcmVzaXplZCBmcm9tIGl0cyBzdGFydGluZyBlZGdlCglpc0V2ZW50UmVzaXphYmxlRnJvbVN0YXJ0OiBmdW5jdGlvbihldmVudCkgewoJCXJldHVybiB0aGlzLm9wdCgnZXZlbnRSZXNpemFibGVGcm9tU3RhcnQnKSAmJiB0aGlzLmlzRXZlbnRSZXNpemFibGUoZXZlbnQpOwoJfSwKCgoJLy8gQ29tcHV0ZXMgaWYgdGhlIGdpdmVuIGV2ZW50IGlzIGFsbG93ZWQgdG8gYmUgcmVzaXplZCBmcm9tIGl0cyBlbmRpbmcgZWRnZQoJaXNFdmVudFJlc2l6YWJsZUZyb21FbmQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIHRoaXMuaXNFdmVudFJlc2l6YWJsZShldmVudCk7Cgl9LAoKCgkvLyBDb21wdXRlcyBpZiB0aGUgZ2l2ZW4gZXZlbnQgaXMgYWxsb3dlZCB0byBiZSByZXNpemVkIGJ5IHRoZSB1c2VyIGF0IGFsbAoJaXNFdmVudFJlc2l6YWJsZTogZnVuY3Rpb24oZXZlbnQpIHsKCQl2YXIgc291cmNlID0gZXZlbnQuc291cmNlIHx8IHt9OwoKCQlyZXR1cm4gZmlyc3REZWZpbmVkKAoJCQlldmVudC5kdXJhdGlvbkVkaXRhYmxlLAoJCQlzb3VyY2UuZHVyYXRpb25FZGl0YWJsZSwKCQkJdGhpcy5vcHQoJ2V2ZW50RHVyYXRpb25FZGl0YWJsZScpLAoJCQlldmVudC5lZGl0YWJsZSwKCQkJc291cmNlLmVkaXRhYmxlLAoJCQl0aGlzLm9wdCgnZWRpdGFibGUnKQoJCSk7Cgl9LAoKCgkvLyBNdXN0IGJlIGNhbGxlZCB3aGVuIGFuIGV2ZW50IGluIHRoZSB2aWV3IGhhcyBiZWVuIHJlc2l6ZWQgdG8gYSBuZXcgbGVuZ3RoCglyZXBvcnRFdmVudFJlc2l6ZTogZnVuY3Rpb24oZXZlbnQsIHJlc2l6ZUxvY2F0aW9uLCBsYXJnZVVuaXQsIGVsLCBldikgewoJCXZhciBjYWxlbmRhciA9IHRoaXMuY2FsZW5kYXI7CgkJdmFyIG11dGF0ZVJlc3VsdCA9IGNhbGVuZGFyLm11dGF0ZUV2ZW50KGV2ZW50LCByZXNpemVMb2NhdGlvbiwgbGFyZ2VVbml0KTsKCQl2YXIgdW5kb0Z1bmMgPSBmdW5jdGlvbigpIHsKCQkJbXV0YXRlUmVzdWx0LnVuZG8oKTsKCQkJY2FsZW5kYXIucmVwb3J0RXZlbnRDaGFuZ2UoKTsKCQl9OwoKCQl0aGlzLnRyaWdnZXJFdmVudFJlc2l6ZShldmVudCwgbXV0YXRlUmVzdWx0LmR1cmF0aW9uRGVsdGEsIHVuZG9GdW5jLCBlbCwgZXYpOwoJCWNhbGVuZGFyLnJlcG9ydEV2ZW50Q2hhbmdlKCk7IC8vIHdpbGwgcmVyZW5kZXIgZXZlbnRzCgl9LAoKCgkvLyBUcmlnZ2VycyBldmVudC1yZXNpemUgaGFuZGxlcnMgdGhhdCBoYXZlIHN1YnNjcmliZWQgdmlhIHRoZSBBUEkKCXRyaWdnZXJFdmVudFJlc2l6ZTogZnVuY3Rpb24oZXZlbnQsIGR1cmF0aW9uRGVsdGEsIHVuZG9GdW5jLCBlbCwgZXYpIHsKCQl0aGlzLnRyaWdnZXIoJ2V2ZW50UmVzaXplJywgZWxbMF0sIGV2ZW50LCBkdXJhdGlvbkRlbHRhLCB1bmRvRnVuYywgZXYsIHt9KTsgLy8ge30gPSBqcXVpIGR1bW15Cgl9LAoKCgkvKiBTZWxlY3Rpb24gKHRpbWUgcmFuZ2UpCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBTZWxlY3RzIGEgZGF0ZSBzcGFuIG9uIHRoZSB2aWV3LiBgc3RhcnRgIGFuZCBgZW5kYCBhcmUgYm90aCBNb21lbnRzLgoJLy8gYGV2YCBpcyB0aGUgbmF0aXZlIG1vdXNlIGV2ZW50IHRoYXQgYmVnaW4gdGhlIGludGVyYWN0aW9uLgoJc2VsZWN0OiBmdW5jdGlvbihzcGFuLCBldikgewoJCXRoaXMudW5zZWxlY3QoZXYpOwoJCXRoaXMucmVuZGVyU2VsZWN0aW9uKHNwYW4pOwoJCXRoaXMucmVwb3J0U2VsZWN0aW9uKHNwYW4sIGV2KTsKCX0sCgoKCS8vIFJlbmRlcnMgYSB2aXN1YWwgaW5kaWNhdGlvbiBvZiB0aGUgc2VsZWN0aW9uCglyZW5kZXJTZWxlY3Rpb246IGZ1bmN0aW9uKHNwYW4pIHsKCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQKCX0sCgoKCS8vIENhbGxlZCB3aGVuIGEgbmV3IHNlbGVjdGlvbiBpcyBtYWRlLiBVcGRhdGVzIGludGVybmFsIHN0YXRlIGFuZCB0cmlnZ2VycyBoYW5kbGVycy4KCXJlcG9ydFNlbGVjdGlvbjogZnVuY3Rpb24oc3BhbiwgZXYpIHsKCQl0aGlzLmlzU2VsZWN0ZWQgPSB0cnVlOwoJCXRoaXMudHJpZ2dlclNlbGVjdChzcGFuLCBldik7Cgl9LAoKCgkvLyBUcmlnZ2VycyBoYW5kbGVycyB0byAnc2VsZWN0JwoJdHJpZ2dlclNlbGVjdDogZnVuY3Rpb24oc3BhbiwgZXYpIHsKCQl0aGlzLnRyaWdnZXIoCgkJCSdzZWxlY3QnLAoJCQludWxsLAoJCQl0aGlzLmNhbGVuZGFyLmFwcGx5VGltZXpvbmUoc3Bhbi5zdGFydCksIC8vIGNvbnZlcnQgdG8gY2FsZW5kYXIncyB0eiBmb3IgZXh0ZXJuYWwgQVBJCgkJCXRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZShzcGFuLmVuZCksIC8vICIKCQkJZXYKCQkpOwoJfSwKCgoJLy8gVW5kb2VzIGEgc2VsZWN0aW9uLiB1cGRhdGVzIGluIHRoZSBpbnRlcm5hbCBzdGF0ZSBhbmQgdHJpZ2dlcnMgaGFuZGxlcnMuCgkvLyBgZXZgIGlzIHRoZSBuYXRpdmUgbW91c2UgZXZlbnQgdGhhdCBiZWdhbiB0aGUgaW50ZXJhY3Rpb24uCgl1bnNlbGVjdDogZnVuY3Rpb24oZXYpIHsKCQlpZiAodGhpcy5pc1NlbGVjdGVkKSB7CgkJCXRoaXMuaXNTZWxlY3RlZCA9IGZhbHNlOwoJCQlpZiAodGhpcy5kZXN0cm95U2VsZWN0aW9uKSB7CgkJCQl0aGlzLmRlc3Ryb3lTZWxlY3Rpb24oKTsgLy8gVE9ETzogZGVwcmVjYXRlCgkJCX0KCQkJdGhpcy51bnJlbmRlclNlbGVjdGlvbigpOwoJCQl0aGlzLnRyaWdnZXIoJ3Vuc2VsZWN0JywgbnVsbCwgZXYpOwoJCX0KCX0sCgoKCS8vIFVucmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIHNlbGVjdGlvbgoJdW5yZW5kZXJTZWxlY3Rpb246IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudAoJfSwKCgoJLyogRXZlbnQgU2VsZWN0aW9uCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglzZWxlY3RFdmVudDogZnVuY3Rpb24oZXZlbnQpIHsKCQlpZiAoIXRoaXMuc2VsZWN0ZWRFdmVudCB8fCB0aGlzLnNlbGVjdGVkRXZlbnQgIT09IGV2ZW50KSB7CgkJCXRoaXMudW5zZWxlY3RFdmVudCgpOwoJCQl0aGlzLnJlbmRlcmVkRXZlbnRTZWdFYWNoKGZ1bmN0aW9uKHNlZykgewoJCQkJc2VnLmVsLmFkZENsYXNzKCdmYy1zZWxlY3RlZCcpOwoJCQl9LCBldmVudCk7CgkJCXRoaXMuc2VsZWN0ZWRFdmVudCA9IGV2ZW50OwoJCX0KCX0sCgoKCXVuc2VsZWN0RXZlbnQ6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLnNlbGVjdGVkRXZlbnQpIHsKCQkJdGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbihzZWcpIHsKCQkJCXNlZy5lbC5yZW1vdmVDbGFzcygnZmMtc2VsZWN0ZWQnKTsKCQkJfSwgdGhpcy5zZWxlY3RlZEV2ZW50KTsKCQkJdGhpcy5zZWxlY3RlZEV2ZW50ID0gbnVsbDsKCQl9Cgl9LAoKCglpc0V2ZW50U2VsZWN0ZWQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJLy8gZXZlbnQgcmVmZXJlbmNlcyBtaWdodCBjaGFuZ2Ugb24gcmVmZXRjaEV2ZW50cygpLCB3aGlsZSBzZWxlY3RlZEV2ZW50IGRvZXNuJ3QsCgkJLy8gc28gY29tcGFyZSBJRHMKCQlyZXR1cm4gdGhpcy5zZWxlY3RlZEV2ZW50ICYmIHRoaXMuc2VsZWN0ZWRFdmVudC5faWQgPT09IGV2ZW50Ll9pZDsKCX0sCgoKCS8qIE1vdXNlIC8gVG91Y2ggVW5zZWxlY3RpbmcgKHRpbWUgcmFuZ2UgJiBldmVudCB1bnNlbGVjdGlvbikKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkvLyBUT0RPOiBtb3ZlIGNvbnNpc3RlbnRseSB0byBkb3duL3N0YXJ0IG9yIHVwL2VuZD8KCS8vIFRPRE86IGRvbid0IGtpbGwgcHJldmlvdXMgc2VsZWN0aW9uIGlmIHRvdWNoIHNjcm9sbGluZwoKCgloYW5kbGVEb2N1bWVudE1vdXNlZG93bjogZnVuY3Rpb24oZXYpIHsKCQlpZiAoaXNQcmltYXJ5TW91c2VCdXR0b24oZXYpKSB7CgkJCXRoaXMucHJvY2Vzc1Vuc2VsZWN0KGV2KTsKCQl9Cgl9LAoKCglwcm9jZXNzVW5zZWxlY3Q6IGZ1bmN0aW9uKGV2KSB7CgkJdGhpcy5wcm9jZXNzUmFuZ2VVbnNlbGVjdChldik7CgkJdGhpcy5wcm9jZXNzRXZlbnRVbnNlbGVjdChldik7Cgl9LAoKCglwcm9jZXNzUmFuZ2VVbnNlbGVjdDogZnVuY3Rpb24oZXYpIHsKCQl2YXIgaWdub3JlOwoKCQkvLyBpcyB0aGVyZSBhIHRpbWUtcmFuZ2Ugc2VsZWN0aW9uPwoJCWlmICh0aGlzLmlzU2VsZWN0ZWQgJiYgdGhpcy5vcHQoJ3Vuc2VsZWN0QXV0bycpKSB7CgkJCS8vIG9ubHkgdW5zZWxlY3QgaWYgdGhlIGNsaWNrZWQgZWxlbWVudCBpcyBub3QgaWRlbnRpY2FsIHRvIG9yIGluc2lkZSBvZiBhbiAndW5zZWxlY3RDYW5jZWwnIGVsZW1lbnQKCQkJaWdub3JlID0gdGhpcy5vcHQoJ3Vuc2VsZWN0Q2FuY2VsJyk7CgkJCWlmICghaWdub3JlIHx8ICEkKGV2LnRhcmdldCkuY2xvc2VzdChpZ25vcmUpLmxlbmd0aCkgewoJCQkJdGhpcy51bnNlbGVjdChldik7CgkJCX0KCQl9Cgl9LAoKCglwcm9jZXNzRXZlbnRVbnNlbGVjdDogZnVuY3Rpb24oZXYpIHsKCQlpZiAodGhpcy5zZWxlY3RlZEV2ZW50KSB7CgkJCWlmICghJChldi50YXJnZXQpLmNsb3Nlc3QoJy5mYy1zZWxlY3RlZCcpLmxlbmd0aCkgewoJCQkJdGhpcy51bnNlbGVjdEV2ZW50KCk7CgkJCX0KCQl9Cgl9LAoKCgkvKiBEYXkgQ2xpY2sKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFRyaWdnZXJzIGhhbmRsZXJzIHRvICdkYXlDbGljaycKCS8vIFNwYW4gaGFzIHN0YXJ0L2VuZCBvZiB0aGUgY2xpY2tlZCBhcmVhLiBPbmx5IHRoZSBzdGFydCBpcyB1c2VmdWwuCgl0cmlnZ2VyRGF5Q2xpY2s6IGZ1bmN0aW9uKHNwYW4sIGRheUVsLCBldikgewoJCXRoaXMudHJpZ2dlcigKCQkJJ2RheUNsaWNrJywKCQkJZGF5RWwsCgkJCXRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZShzcGFuLnN0YXJ0KSwgLy8gY29udmVydCB0byBjYWxlbmRhcidzIHRpbWV6b25lIGZvciBleHRlcm5hbCBBUEkKCQkJZXYKCQkpOwoJfSwKCgoJLyogRGF0ZSBVdGlscwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gSW5pdGlhbGl6ZXMgaW50ZXJuYWwgdmFyaWFibGVzIHJlbGF0ZWQgdG8gY2FsY3VsYXRpbmcgaGlkZGVuIGRheXMtb2Ytd2VlawoJaW5pdEhpZGRlbkRheXM6IGZ1bmN0aW9uKCkgewoJCXZhciBoaWRkZW5EYXlzID0gdGhpcy5vcHQoJ2hpZGRlbkRheXMnKSB8fCBbXTsgLy8gYXJyYXkgb2YgZGF5LW9mLXdlZWsgaW5kaWNlcyB0aGF0IGFyZSBoaWRkZW4KCQl2YXIgaXNIaWRkZW5EYXlIYXNoID0gW107IC8vIGlzIHRoZSBkYXktb2Ytd2VlayBoaWRkZW4/IChoYXNoIHdpdGggZGF5LW9mLXdlZWstaW5kZXggLT4gYm9vbCkKCQl2YXIgZGF5Q250ID0gMDsKCQl2YXIgaTsKCgkJaWYgKHRoaXMub3B0KCd3ZWVrZW5kcycpID09PSBmYWxzZSkgewoJCQloaWRkZW5EYXlzLnB1c2goMCwgNik7IC8vIDA9c3VuZGF5LCA2PXNhdHVyZGF5CgkJfQoKCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CgkJCWlmICgKCQkJCSEoaXNIaWRkZW5EYXlIYXNoW2ldID0gJC5pbkFycmF5KGksIGhpZGRlbkRheXMpICE9PSAtMSkKCQkJKSB7CgkJCQlkYXlDbnQrKzsKCQkJfQoJCX0KCgkJaWYgKCFkYXlDbnQpIHsKCQkJdGhyb3cgJ2ludmFsaWQgaGlkZGVuRGF5cyc7IC8vIGFsbCBkYXlzIHdlcmUgaGlkZGVuPyBiYWQuCgkJfQoKCQl0aGlzLmlzSGlkZGVuRGF5SGFzaCA9IGlzSGlkZGVuRGF5SGFzaDsKCX0sCgoKCS8vIElzIHRoZSBjdXJyZW50IGRheSBoaWRkZW4/CgkvLyBgZGF5YCBpcyBhIGRheS1vZi13ZWVrIGluZGV4ICgwLTYpLCBvciBhIE1vbWVudAoJaXNIaWRkZW5EYXk6IGZ1bmN0aW9uKGRheSkgewoJCWlmIChtb21lbnQuaXNNb21lbnQoZGF5KSkgewoJCQlkYXkgPSBkYXkuZGF5KCk7CgkJfQoJCXJldHVybiB0aGlzLmlzSGlkZGVuRGF5SGFzaFtkYXldOwoJfSwKCgoJLy8gSW5jcmVtZW50aW5nIHRoZSBjdXJyZW50IGRheSB1bnRpbCBpdCBpcyBubyBsb25nZXIgYSBoaWRkZW4gZGF5LCByZXR1cm5pbmcgYSBjb3B5LgoJLy8gSWYgdGhlIGluaXRpYWwgdmFsdWUgb2YgYGRhdGVgIGlzIG5vdCBhIGhpZGRlbiBkYXksIGRvbid0IGRvIGFueXRoaW5nLgoJLy8gUGFzcyBgaXNFeGNsdXNpdmVgIGFzIGB0cnVlYCBpZiB5b3UgYXJlIGRlYWxpbmcgd2l0aCBhbiBlbmQgZGF0ZS4KCS8vIGBpbmNgIGRlZmF1bHRzIHRvIGAxYCAoaW5jcmVtZW50IG9uZSBkYXkgZm9yd2FyZCBlYWNoIHRpbWUpCglza2lwSGlkZGVuRGF5czogZnVuY3Rpb24oZGF0ZSwgaW5jLCBpc0V4Y2x1c2l2ZSkgewoJCXZhciBvdXQgPSBkYXRlLmNsb25lKCk7CgkJaW5jID0gaW5jIHx8IDE7CgkJd2hpbGUgKAoJCQl0aGlzLmlzSGlkZGVuRGF5SGFzaFsob3V0LmRheSgpICsgKGlzRXhjbHVzaXZlID8gaW5jIDogMCkgKyA3KSAlIDddCgkJKSB7CgkJCW91dC5hZGQoaW5jLCAnZGF5cycpOwoJCX0KCQlyZXR1cm4gb3V0OwoJfSwKCgoJLy8gUmV0dXJucyB0aGUgZGF0ZSByYW5nZSBvZiB0aGUgZnVsbCBkYXlzIHRoZSBnaXZlbiByYW5nZSB2aXN1YWxseSBhcHBlYXJzIHRvIG9jY3VweS4KCS8vIFJldHVybnMgYSBuZXcgcmFuZ2Ugb2JqZWN0LgoJY29tcHV0ZURheVJhbmdlOiBmdW5jdGlvbihyYW5nZSkgewoJCXZhciBzdGFydERheSA9IHJhbmdlLnN0YXJ0LmNsb25lKCkuc3RyaXBUaW1lKCk7IC8vIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRheSB0aGUgcmFuZ2Ugc3RhcnRzCgkJdmFyIGVuZCA9IHJhbmdlLmVuZDsKCQl2YXIgZW5kRGF5ID0gbnVsbDsKCQl2YXIgZW5kVGltZU1TOwoKCQlpZiAoZW5kKSB7CgkJCWVuZERheSA9IGVuZC5jbG9uZSgpLnN0cmlwVGltZSgpOyAvLyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXkgdGhlIHJhbmdlIGV4Y2x1c2l2ZWx5IGVuZHMKCQkJZW5kVGltZU1TID0gK2VuZC50aW1lKCk7IC8vICMgb2YgbWlsbGlzZWNvbmRzIGludG8gYGVuZERheWAKCgkJCS8vIElmIHRoZSBlbmQgdGltZSBpcyBhY3R1YWxseSBpbmNsdXNpdmVseSBwYXJ0IG9mIHRoZSBuZXh0IGRheSBhbmQgaXMgZXF1YWwgdG8gb3IKCQkJLy8gYmV5b25kIHRoZSBuZXh0IGRheSB0aHJlc2hvbGQsIGFkanVzdCB0aGUgZW5kIHRvIGJlIHRoZSBleGNsdXNpdmUgZW5kIG9mIGBlbmREYXlgLgoJCQkvLyBPdGhlcndpc2UsIGxlYXZpbmcgaXQgYXMgaW5jbHVzaXZlIHdpbGwgY2F1c2UgaXQgdG8gZXhjbHVkZSBgZW5kRGF5YC4KCQkJaWYgKGVuZFRpbWVNUyAmJiBlbmRUaW1lTVMgPj0gdGhpcy5uZXh0RGF5VGhyZXNob2xkKSB7CgkJCQllbmREYXkuYWRkKDEsICdkYXlzJyk7CgkJCX0KCQl9CgoJCS8vIElmIG5vIGVuZCB3YXMgc3BlY2lmaWVkLCBvciBpZiBpdCBpcyB3aXRoaW4gYHN0YXJ0RGF5YCBidXQgbm90IHBhc3QgbmV4dERheVRocmVzaG9sZCwKCQkvLyBhc3NpZ24gdGhlIGRlZmF1bHQgZHVyYXRpb24gb2Ygb25lIGRheS4KCQlpZiAoIWVuZCB8fCBlbmREYXkgPD0gc3RhcnREYXkpIHsKCQkJZW5kRGF5ID0gc3RhcnREYXkuY2xvbmUoKS5hZGQoMSwgJ2RheXMnKTsKCQl9CgoJCXJldHVybiB7IHN0YXJ0OiBzdGFydERheSwgZW5kOiBlbmREYXkgfTsKCX0sCgoKCS8vIERvZXMgdGhlIGdpdmVuIGV2ZW50IHZpc3VhbGx5IGFwcGVhciB0byBvY2N1cHkgbW9yZSB0aGFuIG9uZSBkYXk/Cglpc011bHRpRGF5RXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIHJhbmdlID0gdGhpcy5jb21wdXRlRGF5UmFuZ2UoZXZlbnQpOyAvLyBldmVudCBpcyByYW5nZS1pc2gKCgkJcmV0dXJuIHJhbmdlLmVuZC5kaWZmKHJhbmdlLnN0YXJ0LCAnZGF5cycpID4gMTsKCX0KCn0pOwoKOzsKCi8qCkVtYm9kaWVzIGEgZGl2IHRoYXQgaGFzIHBvdGVudGlhbCBzY3JvbGxiYXJzCiovCnZhciBTY3JvbGxlciA9IEZDLlNjcm9sbGVyID0gQ2xhc3MuZXh0ZW5kKHsKCgllbDogbnVsbCwgLy8gdGhlIGd1YXJhbnRlZWQgb3V0ZXIgZWxlbWVudAoJc2Nyb2xsRWw6IG51bGwsIC8vIHRoZSBlbGVtZW50IHdpdGggdGhlIHNjcm9sbGJhcnMKCW92ZXJmbG93WDogbnVsbCwKCW92ZXJmbG93WTogbnVsbCwKCgoJY29uc3RydWN0b3I6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCQl0aGlzLm92ZXJmbG93WCA9IG9wdGlvbnMub3ZlcmZsb3dYIHx8IG9wdGlvbnMub3ZlcmZsb3cgfHwgJ2F1dG8nOwoJCXRoaXMub3ZlcmZsb3dZID0gb3B0aW9ucy5vdmVyZmxvd1kgfHwgb3B0aW9ucy5vdmVyZmxvdyB8fCAnYXV0byc7Cgl9LAoKCglyZW5kZXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWwgPSB0aGlzLnJlbmRlckVsKCk7CgkJdGhpcy5hcHBseU92ZXJmbG93KCk7Cgl9LAoKCglyZW5kZXJFbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICh0aGlzLnNjcm9sbEVsID0gJCgnPGRpdiBjbGFzcz0iZmMtc2Nyb2xsZXIiPjwvZGl2PicpKTsKCX0sCgoKCS8vIHNldHMgdG8gbmF0dXJhbCBoZWlnaHQsIHVubG9ja3Mgb3ZlcmZsb3cKCWNsZWFyOiBmdW5jdGlvbigpIHsKCQl0aGlzLnNldEhlaWdodCgnYXV0bycpOwoJCXRoaXMuYXBwbHlPdmVyZmxvdygpOwoJfSwKCgoJZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbC5yZW1vdmUoKTsKCX0sCgoKCS8vIE92ZXJmbG93CgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCglhcHBseU92ZXJmbG93OiBmdW5jdGlvbigpIHsKCQl0aGlzLnNjcm9sbEVsLmNzcyh7CgkJCSdvdmVyZmxvdy14JzogdGhpcy5vdmVyZmxvd1gsCgkJCSdvdmVyZmxvdy15JzogdGhpcy5vdmVyZmxvd1kKCQl9KTsKCX0sCgoKCS8vIENhdXNlcyBhbnkgJ2F1dG8nIG92ZXJmbG93IHZhbHVlcyB0byByZXNvbHZlcyB0byAnc2Nyb2xsJyBvciAnaGlkZGVuJy4KCS8vIFVzZWZ1bCBmb3IgcHJlc2VydmluZyBzY3JvbGxiYXIgd2lkdGhzIHJlZ2FyZGxlc3Mgb2YgZnV0dXJlIHJlc2l6ZXMuCgkvLyBDYW4gcGFzcyBpbiBzY3JvbGxiYXJXaWR0aHMgZm9yIG9wdGltaXphdGlvbi4KCWxvY2tPdmVyZmxvdzogZnVuY3Rpb24oc2Nyb2xsYmFyV2lkdGhzKSB7CgkJdmFyIG92ZXJmbG93WCA9IHRoaXMub3ZlcmZsb3dYOwoJCXZhciBvdmVyZmxvd1kgPSB0aGlzLm92ZXJmbG93WTsKCgkJc2Nyb2xsYmFyV2lkdGhzID0gc2Nyb2xsYmFyV2lkdGhzIHx8IHRoaXMuZ2V0U2Nyb2xsYmFyV2lkdGhzKCk7CgoJCWlmIChvdmVyZmxvd1ggPT09ICdhdXRvJykgewoJCQlvdmVyZmxvd1ggPSAoCgkJCQkJc2Nyb2xsYmFyV2lkdGhzLnRvcCB8fCBzY3JvbGxiYXJXaWR0aHMuYm90dG9tIHx8IC8vIGhvcml6b250YWwgc2Nyb2xsYmFycz8KCQkJCQkvLyBPUiBzY3JvbGxpbmcgcGFuZSB3aXRoIG1hc3NsZXNzIHNjcm9sbGJhcnM/CgkJCQkJdGhpcy5zY3JvbGxFbFswXS5zY3JvbGxXaWR0aCAtIDEgPiB0aGlzLnNjcm9sbEVsWzBdLmNsaWVudFdpZHRoCgkJCQkJCS8vIHN1YnRyYWN0IDEgYmVjYXVzZSBvZiBJRSBvZmYtYnktb25lIGlzc3VlCgkJCQkpID8gJ3Njcm9sbCcgOiAnaGlkZGVuJzsKCQl9CgoJCWlmIChvdmVyZmxvd1kgPT09ICdhdXRvJykgewoJCQlvdmVyZmxvd1kgPSAoCgkJCQkJc2Nyb2xsYmFyV2lkdGhzLmxlZnQgfHwgc2Nyb2xsYmFyV2lkdGhzLnJpZ2h0IHx8IC8vIHZlcnRpY2FsIHNjcm9sbGJhcnM/CgkJCQkJLy8gT1Igc2Nyb2xsaW5nIHBhbmUgd2l0aCBtYXNzbGVzcyBzY3JvbGxiYXJzPwoJCQkJCXRoaXMuc2Nyb2xsRWxbMF0uc2Nyb2xsSGVpZ2h0IC0gMSA+IHRoaXMuc2Nyb2xsRWxbMF0uY2xpZW50SGVpZ2h0CgkJCQkJCS8vIHN1YnRyYWN0IDEgYmVjYXVzZSBvZiBJRSBvZmYtYnktb25lIGlzc3VlCgkJCQkpID8gJ3Njcm9sbCcgOiAnaGlkZGVuJzsKCQl9CgoJCXRoaXMuc2Nyb2xsRWwuY3NzKHsgJ292ZXJmbG93LXgnOiBvdmVyZmxvd1gsICdvdmVyZmxvdy15Jzogb3ZlcmZsb3dZIH0pOwoJfSwKCgoJLy8gR2V0dGVycyAvIFNldHRlcnMKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCXNldEhlaWdodDogZnVuY3Rpb24oaGVpZ2h0KSB7CgkJdGhpcy5zY3JvbGxFbC5oZWlnaHQoaGVpZ2h0KTsKCX0sCgoKCWdldFNjcm9sbFRvcDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuc2Nyb2xsRWwuc2Nyb2xsVG9wKCk7Cgl9LAoKCglzZXRTY3JvbGxUb3A6IGZ1bmN0aW9uKHRvcCkgewoJCXRoaXMuc2Nyb2xsRWwuc2Nyb2xsVG9wKHRvcCk7Cgl9LAoKCglnZXRDbGllbnRXaWR0aDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuc2Nyb2xsRWxbMF0uY2xpZW50V2lkdGg7Cgl9LAoKCglnZXRDbGllbnRIZWlnaHQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnNjcm9sbEVsWzBdLmNsaWVudEhlaWdodDsKCX0sCgoKCWdldFNjcm9sbGJhcldpZHRoczogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGdldFNjcm9sbGJhcldpZHRocyh0aGlzLnNjcm9sbEVsKTsKCX0KCn0pOwoKOzsKCnZhciBDYWxlbmRhciA9IEZDLkNhbGVuZGFyID0gQ2xhc3MuZXh0ZW5kKHsKCglkaXJEZWZhdWx0czogbnVsbCwgLy8gb3B0aW9uIGRlZmF1bHRzIHJlbGF0ZWQgdG8gTFRSIG9yIFJUTAoJbG9jYWxlRGVmYXVsdHM6IG51bGwsIC8vIG9wdGlvbiBkZWZhdWx0cyByZWxhdGVkIHRvIGN1cnJlbnQgbG9jYWxlCglvdmVycmlkZXM6IG51bGwsIC8vIG9wdGlvbiBvdmVycmlkZXMgZ2l2ZW4gdG8gdGhlIGZ1bGxDYWxlbmRhciBjb25zdHJ1Y3RvcgoJZHluYW1pY092ZXJyaWRlczogbnVsbCwgLy8gb3B0aW9ucyBzZXQgd2l0aCBkeW5hbWljIHNldHRlciBtZXRob2QuIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gdmlldyBvdmVycmlkZXMuCglvcHRpb25zOiBudWxsLCAvLyBhbGwgZGVmYXVsdHMgY29tYmluZWQgd2l0aCBvdmVycmlkZXMKCXZpZXdTcGVjQ2FjaGU6IG51bGwsIC8vIGNhY2hlIG9mIHZpZXcgZGVmaW5pdGlvbnMKCXZpZXc6IG51bGwsIC8vIGN1cnJlbnQgVmlldyBvYmplY3QKCWhlYWRlcjogbnVsbCwKCWxvYWRpbmdMZXZlbDogMCwgLy8gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBsb2FkaW5nIHRhc2tzCgoKCS8vIGEgbG90IG9mIHRoaXMgY2xhc3MnIE9PUCBsb2dpYyBpcyBzY29wZWQgd2l0aGluIHRoaXMgY29uc3RydWN0b3IgZnVuY3Rpb24sCgkvLyBidXQgaW4gdGhlIGZ1dHVyZSwgd3JpdGUgaW5kaXZpZHVhbCBtZXRob2RzIG9uIHRoZSBwcm90b3R5cGUuCgljb25zdHJ1Y3RvcjogQ2FsZW5kYXJfY29uc3RydWN0b3IsCgoKCS8vIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgZm9yIGluaXRpYWxpemF0aW9uIGxvZ2ljIGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBoYXMgYmVlbiBjYWxsZWQKCWluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewoJfSwKCgoJLy8gQ29tcHV0ZXMgdGhlIGZsYXR0ZW5lZCBvcHRpb25zIGhhc2ggZm9yIHRoZSBjYWxlbmRhciBhbmQgYXNzaWducyB0byBgdGhpcy5vcHRpb25zYC4KCS8vIEFzc3VtZXMgdGhpcy5vdmVycmlkZXMgYW5kIHRoaXMuZHluYW1pY092ZXJyaWRlcyBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KCXBvcHVsYXRlT3B0aW9uc0hhc2g6IGZ1bmN0aW9uKCkgewoJCXZhciBsb2NhbGUsIGxvY2FsZURlZmF1bHRzOwoJCXZhciBpc1JUTCwgZGlyRGVmYXVsdHM7CgoJCWxvY2FsZSA9IGZpcnN0RGVmaW5lZCggLy8gZXhwbGljaXQgbG9jYWxlIG9wdGlvbiBnaXZlbj8KCQkJdGhpcy5keW5hbWljT3ZlcnJpZGVzLmxvY2FsZSwKCQkJdGhpcy5vdmVycmlkZXMubG9jYWxlCgkJKTsKCQlsb2NhbGVEZWZhdWx0cyA9IGxvY2FsZU9wdGlvbkhhc2hbbG9jYWxlXTsKCQlpZiAoIWxvY2FsZURlZmF1bHRzKSB7IC8vIGV4cGxpY2l0IGxvY2FsZSBvcHRpb24gbm90IGdpdmVuIG9yIGludmFsaWQ/CgkJCWxvY2FsZSA9IENhbGVuZGFyLmRlZmF1bHRzLmxvY2FsZTsKCQkJbG9jYWxlRGVmYXVsdHMgPSBsb2NhbGVPcHRpb25IYXNoW2xvY2FsZV0gfHwge307CgkJfQoKCQlpc1JUTCA9IGZpcnN0RGVmaW5lZCggLy8gYmFzZWQgb24gb3B0aW9ucyBjb21wdXRlZCBzbyBmYXIsIGlzIGRpcmVjdGlvbiBSVEw/CgkJCXRoaXMuZHluYW1pY092ZXJyaWRlcy5pc1JUTCwKCQkJdGhpcy5vdmVycmlkZXMuaXNSVEwsCgkJCWxvY2FsZURlZmF1bHRzLmlzUlRMLAoJCQlDYWxlbmRhci5kZWZhdWx0cy5pc1JUTAoJCSk7CgkJZGlyRGVmYXVsdHMgPSBpc1JUTCA/IENhbGVuZGFyLnJ0bERlZmF1bHRzIDoge307CgoJCXRoaXMuZGlyRGVmYXVsdHMgPSBkaXJEZWZhdWx0czsKCQl0aGlzLmxvY2FsZURlZmF1bHRzID0gbG9jYWxlRGVmYXVsdHM7CgkJdGhpcy5vcHRpb25zID0gbWVyZ2VPcHRpb25zKFsgLy8gbWVyZ2UgZGVmYXVsdHMgYW5kIG92ZXJyaWRlcy4gbG93ZXN0IHRvIGhpZ2hlc3QgcHJlY2VkZW5jZQoJCQlDYWxlbmRhci5kZWZhdWx0cywgLy8gZ2xvYmFsIGRlZmF1bHRzCgkJCWRpckRlZmF1bHRzLAoJCQlsb2NhbGVEZWZhdWx0cywKCQkJdGhpcy5vdmVycmlkZXMsCgkJCXRoaXMuZHluYW1pY092ZXJyaWRlcwoJCV0pOwoJCXBvcHVsYXRlSW5zdGFuY2VDb21wdXRhYmxlT3B0aW9ucyh0aGlzLm9wdGlvbnMpOyAvLyBmaWxsIGluIGdhcHMgd2l0aCBjb21wdXRlZCBvcHRpb25zCgl9LAoKCgkvLyBHZXRzIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBjcmVhdGUgYSB2aWV3LiBXaWxsIHVzZSBhIGNhY2hlLgoJZ2V0Vmlld1NwZWM6IGZ1bmN0aW9uKHZpZXdUeXBlKSB7CgkJdmFyIGNhY2hlID0gdGhpcy52aWV3U3BlY0NhY2hlOwoKCQlyZXR1cm4gY2FjaGVbdmlld1R5cGVdIHx8IChjYWNoZVt2aWV3VHlwZV0gPSB0aGlzLmJ1aWxkVmlld1NwZWModmlld1R5cGUpKTsKCX0sCgoKCS8vIEdpdmVuIGEgZHVyYXRpb24gc2luZ3VsYXIgdW5pdCwgbGlrZSAid2VlayIgb3IgImRheSIsIGZpbmRzIGEgbWF0Y2hpbmcgdmlldyBzcGVjLgoJLy8gUHJlZmVyZW5jZSBpcyBnaXZlbiB0byB2aWV3cyB0aGF0IGhhdmUgY29ycmVzcG9uZGluZyBidXR0b25zLgoJZ2V0VW5pdFZpZXdTcGVjOiBmdW5jdGlvbih1bml0KSB7CgkJdmFyIHZpZXdUeXBlczsKCQl2YXIgaTsKCQl2YXIgc3BlYzsKCgkJaWYgKCQuaW5BcnJheSh1bml0LCBpbnRlcnZhbFVuaXRzKSAhPSAtMSkgewoKCQkJLy8gcHV0IHZpZXdzIHRoYXQgaGF2ZSBidXR0b25zIGZpcnN0LiB0aGVyZSB3aWxsIGJlIGR1cGxpY2F0ZXMsIGJ1dCBvaCB3ZWxsCgkJCXZpZXdUeXBlcyA9IHRoaXMuaGVhZGVyLmdldFZpZXdzV2l0aEJ1dHRvbnMoKTsKCQkJJC5lYWNoKEZDLnZpZXdzLCBmdW5jdGlvbih2aWV3VHlwZSkgeyAvLyBhbGwgdmlld3MKCQkJCXZpZXdUeXBlcy5wdXNoKHZpZXdUeXBlKTsKCQkJfSk7CgoJCQlmb3IgKGkgPSAwOyBpIDwgdmlld1R5cGVzLmxlbmd0aDsgaSsrKSB7CgkJCQlzcGVjID0gdGhpcy5nZXRWaWV3U3BlYyh2aWV3VHlwZXNbaV0pOwoJCQkJaWYgKHNwZWMpIHsKCQkJCQlpZiAoc3BlYy5zaW5nbGVVbml0ID09IHVuaXQpIHsKCQkJCQkJcmV0dXJuIHNwZWM7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfSwKCgoJLy8gQnVpbGRzIGFuIG9iamVjdCB3aXRoIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjcmVhdGUgYSBnaXZlbiB2aWV3CglidWlsZFZpZXdTcGVjOiBmdW5jdGlvbihyZXF1ZXN0ZWRWaWV3VHlwZSkgewoJCXZhciB2aWV3T3ZlcnJpZGVzID0gdGhpcy5vdmVycmlkZXMudmlld3MgfHwge307CgkJdmFyIHNwZWNDaGFpbiA9IFtdOyAvLyBmb3IgdGhlIHZpZXcuIGxvd2VzdCB0byBoaWdoZXN0IHByaW9yaXR5CgkJdmFyIGRlZmF1bHRzQ2hhaW4gPSBbXTsgLy8gZm9yIHRoZSB2aWV3LiBsb3dlc3QgdG8gaGlnaGVzdCBwcmlvcml0eQoJCXZhciBvdmVycmlkZXNDaGFpbiA9IFtdOyAvLyBmb3IgdGhlIHZpZXcuIGxvd2VzdCB0byBoaWdoZXN0IHByaW9yaXR5CgkJdmFyIHZpZXdUeXBlID0gcmVxdWVzdGVkVmlld1R5cGU7CgkJdmFyIHNwZWM7IC8vIGZvciB0aGUgdmlldwoJCXZhciBvdmVycmlkZXM7IC8vIGZvciB0aGUgdmlldwoJCXZhciBkdXJhdGlvbjsKCQl2YXIgdW5pdDsKCgkJLy8gaXRlcmF0ZSBmcm9tIHRoZSBzcGVjaWZpYyB2aWV3IGRlZmluaXRpb24gdG8gYSBtb3JlIGdlbmVyYWwgb25lIHVudGlsIHdlIGhpdCBhbiBhY3R1YWwgVmlldyBjbGFzcwoJCXdoaWxlICh2aWV3VHlwZSkgewoJCQlzcGVjID0gZmNWaWV3c1t2aWV3VHlwZV07CgkJCW92ZXJyaWRlcyA9IHZpZXdPdmVycmlkZXNbdmlld1R5cGVdOwoJCQl2aWV3VHlwZSA9IG51bGw7IC8vIGNsZWFyLiBtaWdodCByZXBvcHVsYXRlIGZvciBhbm90aGVyIGl0ZXJhdGlvbgoKCQkJaWYgKHR5cGVvZiBzcGVjID09PSAnZnVuY3Rpb24nKSB7IC8vIFRPRE86IGRlcHJlY2F0ZQoJCQkJc3BlYyA9IHsgJ2NsYXNzJzogc3BlYyB9OwoJCQl9CgoJCQlpZiAoc3BlYykgewoJCQkJc3BlY0NoYWluLnVuc2hpZnQoc3BlYyk7CgkJCQlkZWZhdWx0c0NoYWluLnVuc2hpZnQoc3BlYy5kZWZhdWx0cyB8fCB7fSk7CgkJCQlkdXJhdGlvbiA9IGR1cmF0aW9uIHx8IHNwZWMuZHVyYXRpb247CgkJCQl2aWV3VHlwZSA9IHZpZXdUeXBlIHx8IHNwZWMudHlwZTsKCQkJfQoKCQkJaWYgKG92ZXJyaWRlcykgewoJCQkJb3ZlcnJpZGVzQ2hhaW4udW5zaGlmdChvdmVycmlkZXMpOyAvLyB2aWV3LXNwZWNpZmljIG9wdGlvbiBoYXNoZXMgaGF2ZSBvcHRpb25zIGF0IHplcm8tbGV2ZWwKCQkJCWR1cmF0aW9uID0gZHVyYXRpb24gfHwgb3ZlcnJpZGVzLmR1cmF0aW9uOwoJCQkJdmlld1R5cGUgPSB2aWV3VHlwZSB8fCBvdmVycmlkZXMudHlwZTsKCQkJfQoJCX0KCgkJc3BlYyA9IG1lcmdlUHJvcHMoc3BlY0NoYWluKTsKCQlzcGVjLnR5cGUgPSByZXF1ZXN0ZWRWaWV3VHlwZTsKCQlpZiAoIXNwZWNbJ2NsYXNzJ10pIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYgKGR1cmF0aW9uKSB7CgkJCWR1cmF0aW9uID0gbW9tZW50LmR1cmF0aW9uKGR1cmF0aW9uKTsKCQkJaWYgKGR1cmF0aW9uLnZhbHVlT2YoKSkgeyAvLyB2YWxpZD8KCQkJCXNwZWMuZHVyYXRpb24gPSBkdXJhdGlvbjsKCQkJCXVuaXQgPSBjb21wdXRlSW50ZXJ2YWxVbml0KGR1cmF0aW9uKTsKCgkJCQkvLyB2aWV3IGlzIGEgc2luZ2xlLXVuaXQgZHVyYXRpb24sIGxpa2UgIndlZWsiIG9yICJkYXkiCgkJCQkvLyBpbmNvcnBvcmF0ZSBvcHRpb25zIGZvciB0aGlzLiBsb3dlc3QgcHJpb3JpdHkKCQkJCWlmIChkdXJhdGlvbi5hcyh1bml0KSA9PT0gMSkgewoJCQkJCXNwZWMuc2luZ2xlVW5pdCA9IHVuaXQ7CgkJCQkJb3ZlcnJpZGVzQ2hhaW4udW5zaGlmdCh2aWV3T3ZlcnJpZGVzW3VuaXRdIHx8IHt9KTsKCQkJCX0KCQkJfQoJCX0KCgkJc3BlYy5kZWZhdWx0cyA9IG1lcmdlT3B0aW9ucyhkZWZhdWx0c0NoYWluKTsKCQlzcGVjLm92ZXJyaWRlcyA9IG1lcmdlT3B0aW9ucyhvdmVycmlkZXNDaGFpbik7CgoJCXRoaXMuYnVpbGRWaWV3U3BlY09wdGlvbnMoc3BlYyk7CgkJdGhpcy5idWlsZFZpZXdTcGVjQnV0dG9uVGV4dChzcGVjLCByZXF1ZXN0ZWRWaWV3VHlwZSk7CgoJCXJldHVybiBzcGVjOwoJfSwKCgoJLy8gQnVpbGRzIGFuZCBhc3NpZ25zIGEgdmlldyBzcGVjJ3Mgb3B0aW9ucyBvYmplY3QgZnJvbSBpdHMgYWxyZWFkeS1hc3NpZ25lZCBkZWZhdWx0cyBhbmQgb3ZlcnJpZGVzCglidWlsZFZpZXdTcGVjT3B0aW9uczogZnVuY3Rpb24oc3BlYykgewoJCXNwZWMub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhbIC8vIGxvd2VzdCB0byBoaWdoZXN0IHByaW9yaXR5CgkJCUNhbGVuZGFyLmRlZmF1bHRzLCAvLyBnbG9iYWwgZGVmYXVsdHMKCQkJc3BlYy5kZWZhdWx0cywgLy8gdmlldydzIGRlZmF1bHRzIChmcm9tIFZpZXdTdWJjbGFzcy5kZWZhdWx0cykKCQkJdGhpcy5kaXJEZWZhdWx0cywKCQkJdGhpcy5sb2NhbGVEZWZhdWx0cywgLy8gbG9jYWxlIGFuZCBkaXIgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdmlldydzIGRlZmF1bHRzIQoJCQl0aGlzLm92ZXJyaWRlcywgLy8gY2FsZW5kYXIncyBvdmVycmlkZXMgKG9wdGlvbnMgZ2l2ZW4gdG8gY29uc3RydWN0b3IpCgkJCXNwZWMub3ZlcnJpZGVzLCAvLyB2aWV3J3Mgb3ZlcnJpZGVzICh2aWV3LXNwZWNpZmljIG9wdGlvbnMpCgkJCXRoaXMuZHluYW1pY092ZXJyaWRlcyAvLyBkeW5hbWljYWxseSBzZXQgdmlhIHNldHRlci4gaGlnaGVzdCBwcmVjZWRlbmNlCgkJXSk7CgkJcG9wdWxhdGVJbnN0YW5jZUNvbXB1dGFibGVPcHRpb25zKHNwZWMub3B0aW9ucyk7Cgl9LAoKCgkvLyBDb21wdXRlcyBhbmQgYXNzaWducyBhIHZpZXcgc3BlYydzIGJ1dHRvblRleHQtcmVsYXRlZCBvcHRpb25zCglidWlsZFZpZXdTcGVjQnV0dG9uVGV4dDogZnVuY3Rpb24oc3BlYywgcmVxdWVzdGVkVmlld1R5cGUpIHsKCgkJLy8gZ2l2ZW4gYW4gb3B0aW9ucyBvYmplY3Qgd2l0aCBhIHBvc3NpYmxlIGBidXR0b25UZXh0YCBoYXNoLCBsb29rdXAgdGhlIGJ1dHRvblRleHQgZm9yIHRoZQoJCS8vIHJlcXVlc3RlZCB2aWV3LCBmYWxsaW5nIGJhY2sgdG8gYSBnZW5lcmljIHVuaXQgZW50cnkgbGlrZSAid2VlayIgb3IgImRheSIKCQlmdW5jdGlvbiBxdWVyeUJ1dHRvblRleHQob3B0aW9ucykgewoJCQl2YXIgYnV0dG9uVGV4dCA9IG9wdGlvbnMuYnV0dG9uVGV4dCB8fCB7fTsKCQkJcmV0dXJuIGJ1dHRvblRleHRbcmVxdWVzdGVkVmlld1R5cGVdIHx8CgkJCQkvLyB2aWV3IGNhbiBkZWNpZGUgdG8gbG9vayB1cCBhIGNlcnRhaW4ga2V5CgkJCQkoc3BlYy5idXR0b25UZXh0S2V5ID8gYnV0dG9uVGV4dFtzcGVjLmJ1dHRvblRleHRLZXldIDogbnVsbCkgfHwKCQkJCS8vIGEga2V5IGxpa2UgIm1vbnRoIgoJCQkJKHNwZWMuc2luZ2xlVW5pdCA/IGJ1dHRvblRleHRbc3BlYy5zaW5nbGVVbml0XSA6IG51bGwpOwoJCX0KCgkJLy8gaGlnaGVzdCB0byBsb3dlc3QgcHJpb3JpdHkKCQlzcGVjLmJ1dHRvblRleHRPdmVycmlkZSA9CgkJCXF1ZXJ5QnV0dG9uVGV4dCh0aGlzLmR5bmFtaWNPdmVycmlkZXMpIHx8CgkJCXF1ZXJ5QnV0dG9uVGV4dCh0aGlzLm92ZXJyaWRlcykgfHwgLy8gY29uc3RydWN0b3Itc3BlY2lmaWVkIGJ1dHRvblRleHQgbG9va3VwIGhhc2ggdGFrZXMgcHJlY2VkZW5jZQoJCQlzcGVjLm92ZXJyaWRlcy5idXR0b25UZXh0OyAvLyBgYnV0dG9uVGV4dGAgZm9yIHZpZXctc3BlY2lmaWMgb3B0aW9ucyBpcyBhIHN0cmluZwoKCQkvLyBoaWdoZXN0IHRvIGxvd2VzdCBwcmlvcml0eS4gbWlycm9ycyBidWlsZFZpZXdTcGVjT3B0aW9ucwoJCXNwZWMuYnV0dG9uVGV4dERlZmF1bHQgPQoJCQlxdWVyeUJ1dHRvblRleHQodGhpcy5sb2NhbGVEZWZhdWx0cykgfHwKCQkJcXVlcnlCdXR0b25UZXh0KHRoaXMuZGlyRGVmYXVsdHMpIHx8CgkJCXNwZWMuZGVmYXVsdHMuYnV0dG9uVGV4dCB8fCAvLyBhIHNpbmdsZSBzdHJpbmcuIGZyb20gVmlld1N1YmNsYXNzLmRlZmF1bHRzCgkJCXF1ZXJ5QnV0dG9uVGV4dChDYWxlbmRhci5kZWZhdWx0cykgfHwKCQkJKHNwZWMuZHVyYXRpb24gPyB0aGlzLmh1bWFuaXplRHVyYXRpb24oc3BlYy5kdXJhdGlvbikgOiBudWxsKSB8fCAvLyBsaWtlICIzIGRheXMiCgkJCXJlcXVlc3RlZFZpZXdUeXBlOyAvLyBmYWxsIGJhY2sgdG8gZ2l2ZW4gdmlldyBuYW1lCgl9LAoKCgkvLyBHaXZlbiBhIHZpZXcgbmFtZSBmb3IgYSBjdXN0b20gdmlldyBvciBhIHN0YW5kYXJkIHZpZXcsIGNyZWF0ZXMgYSByZWFkeS10by1nbyBWaWV3IG9iamVjdAoJaW5zdGFudGlhdGVWaWV3OiBmdW5jdGlvbih2aWV3VHlwZSkgewoJCXZhciBzcGVjID0gdGhpcy5nZXRWaWV3U3BlYyh2aWV3VHlwZSk7CgoJCXJldHVybiBuZXcgc3BlY1snY2xhc3MnXSh0aGlzLCB2aWV3VHlwZSwgc3BlYy5vcHRpb25zLCBzcGVjLmR1cmF0aW9uKTsKCX0sCgoKCS8vIFJldHVybnMgYSBib29sZWFuIGFib3V0IHdoZXRoZXIgdGhlIHZpZXcgaXMgb2theSB0byBpbnN0YW50aWF0ZSBhdCBzb21lIHBvaW50Cglpc1ZhbGlkVmlld1R5cGU6IGZ1bmN0aW9uKHZpZXdUeXBlKSB7CgkJcmV0dXJuIEJvb2xlYW4odGhpcy5nZXRWaWV3U3BlYyh2aWV3VHlwZSkpOwoJfSwKCgoJLy8gU2hvdWxkIGJlIGNhbGxlZCB3aGVuIGFueSB0eXBlIG9mIGFzeW5jIGRhdGEgZmV0Y2hpbmcgYmVnaW5zCglwdXNoTG9hZGluZzogZnVuY3Rpb24oKSB7CgkJaWYgKCEodGhpcy5sb2FkaW5nTGV2ZWwrKykpIHsKCQkJdGhpcy50cmlnZ2VyKCdsb2FkaW5nJywgbnVsbCwgdHJ1ZSwgdGhpcy52aWV3KTsKCQl9Cgl9LAoKCgkvLyBTaG91bGQgYmUgY2FsbGVkIHdoZW4gYW55IHR5cGUgb2YgYXN5bmMgZGF0YSBmZXRjaGluZyBjb21wbGV0ZXMKCXBvcExvYWRpbmc6IGZ1bmN0aW9uKCkgewoJCWlmICghKC0tdGhpcy5sb2FkaW5nTGV2ZWwpKSB7CgkJCXRoaXMudHJpZ2dlcignbG9hZGluZycsIG51bGwsIGZhbHNlLCB0aGlzLnZpZXcpOwoJCX0KCX0sCgoKCS8vIEdpdmVuIGFyZ3VtZW50cyB0byB0aGUgc2VsZWN0IG1ldGhvZCBpbiB0aGUgQVBJLCByZXR1cm5zIGEgc3BhbiAodW56b25lZCBzdGFydC9lbmQgYW5kIG90aGVyIGluZm8pCglidWlsZFNlbGVjdFNwYW46IGZ1bmN0aW9uKHpvbmVkU3RhcnRJbnB1dCwgem9uZWRFbmRJbnB1dCkgewoJCXZhciBzdGFydCA9IHRoaXMubW9tZW50KHpvbmVkU3RhcnRJbnB1dCkuc3RyaXBab25lKCk7CgkJdmFyIGVuZDsKCgkJaWYgKHpvbmVkRW5kSW5wdXQpIHsKCQkJZW5kID0gdGhpcy5tb21lbnQoem9uZWRFbmRJbnB1dCkuc3RyaXBab25lKCk7CgkJfQoJCWVsc2UgaWYgKHN0YXJ0Lmhhc1RpbWUoKSkgewoJCQllbmQgPSBzdGFydC5jbG9uZSgpLmFkZCh0aGlzLmRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb24pOwoJCX0KCQllbHNlIHsKCQkJZW5kID0gc3RhcnQuY2xvbmUoKS5hZGQodGhpcy5kZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbik7CgkJfQoKCQlyZXR1cm4geyBzdGFydDogc3RhcnQsIGVuZDogZW5kIH07Cgl9Cgp9KTsKCgpDYWxlbmRhci5taXhpbihFbWl0dGVyTWl4aW4pOwoKCmZ1bmN0aW9uIENhbGVuZGFyX2NvbnN0cnVjdG9yKGVsZW1lbnQsIG92ZXJyaWRlcykgewoJdmFyIHQgPSB0aGlzOwoKCgkvLyBFeHBvcnRzCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCXQucmVuZGVyID0gcmVuZGVyOwoJdC5kZXN0cm95ID0gZGVzdHJveTsKCXQucmVmZXRjaEV2ZW50cyA9IHJlZmV0Y2hFdmVudHM7Cgl0LnJlZmV0Y2hFdmVudFNvdXJjZXMgPSByZWZldGNoRXZlbnRTb3VyY2VzOwoJdC5yZXBvcnRFdmVudHMgPSByZXBvcnRFdmVudHM7Cgl0LnJlcG9ydEV2ZW50Q2hhbmdlID0gcmVwb3J0RXZlbnRDaGFuZ2U7Cgl0LnJlcmVuZGVyRXZlbnRzID0gcmVuZGVyRXZlbnRzOyAvLyBgcmVuZGVyRXZlbnRzYCBzZXJ2ZXMgYXMgYSByZXJlbmRlci4gYW4gQVBJIG1ldGhvZAoJdC5jaGFuZ2VWaWV3ID0gcmVuZGVyVmlldzsgLy8gYHJlbmRlclZpZXdgIHdpbGwgc3dpdGNoIHRvIGFub3RoZXIgdmlldwoJdC5zZWxlY3QgPSBzZWxlY3Q7Cgl0LnVuc2VsZWN0ID0gdW5zZWxlY3Q7Cgl0LnByZXYgPSBwcmV2OwoJdC5uZXh0ID0gbmV4dDsKCXQucHJldlllYXIgPSBwcmV2WWVhcjsKCXQubmV4dFllYXIgPSBuZXh0WWVhcjsKCXQudG9kYXkgPSB0b2RheTsKCXQuZ290b0RhdGUgPSBnb3RvRGF0ZTsKCXQuaW5jcmVtZW50RGF0ZSA9IGluY3JlbWVudERhdGU7Cgl0Lnpvb21UbyA9IHpvb21UbzsKCXQuZ2V0RGF0ZSA9IGdldERhdGU7Cgl0LmdldENhbGVuZGFyID0gZ2V0Q2FsZW5kYXI7Cgl0LmdldFZpZXcgPSBnZXRWaWV3OwoJdC5vcHRpb24gPSBvcHRpb247IC8vIGdldHRlci9zZXR0ZXIgbWV0aG9kCgl0LnRyaWdnZXIgPSB0cmlnZ2VyOwoKCgkvLyBPcHRpb25zCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCXQuZHluYW1pY092ZXJyaWRlcyA9IHt9OwoJdC52aWV3U3BlY0NhY2hlID0ge307Cgl0Lm9wdGlvbkhhbmRsZXJzID0ge307IC8vIGZvciBDYWxlbmRhci5vcHRpb25zLmpzCgl0Lm92ZXJyaWRlcyA9ICQuZXh0ZW5kKHt9LCBvdmVycmlkZXMpOyAvLyBtYWtlIGEgY29weQoKCXQucG9wdWxhdGVPcHRpb25zSGFzaCgpOyAvLyBzZXRzIHRoaXMub3B0aW9ucwoKCgoJLy8gTG9jYWxlLWRhdGEgSW50ZXJuYWxzCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gQXBwbHkgb3ZlcnJpZGVzIHRvIHRoZSBjdXJyZW50IGxvY2FsZSdzIGRhdGEKCgl2YXIgbG9jYWxlRGF0YTsKCgkvLyBDYWxsZWQgaW1tZWRpYXRlbHksIGFuZCB3aGVuIGFueSBvZiB0aGUgb3B0aW9ucyBjaGFuZ2UuCgkvLyBIYXBwZW5zIGJlZm9yZSBhbnkgaW50ZXJuYWwgb2JqZWN0cyByZWJ1aWxkIG9yIHJlcmVuZGVyLCBiZWNhdXNlIHRoaXMgaXMgdmVyeSBjb3JlLgoJdC5iaW5kT3B0aW9ucyhbCgkJJ2xvY2FsZScsICdtb250aE5hbWVzJywgJ21vbnRoTmFtZXNTaG9ydCcsICdkYXlOYW1lcycsICdkYXlOYW1lc1Nob3J0JywgJ2ZpcnN0RGF5JywgJ3dlZWtOdW1iZXJDYWxjdWxhdGlvbicKCV0sIGZ1bmN0aW9uKGxvY2FsZSwgbW9udGhOYW1lcywgbW9udGhOYW1lc1Nob3J0LCBkYXlOYW1lcywgZGF5TmFtZXNTaG9ydCwgZmlyc3REYXksIHdlZWtOdW1iZXJDYWxjdWxhdGlvbikgewoKCQkvLyBub3JtYWxpemUKCQlpZiAod2Vla051bWJlckNhbGN1bGF0aW9uID09PSAnaXNvJykgewoJCQl3ZWVrTnVtYmVyQ2FsY3VsYXRpb24gPSAnSVNPJzsgLy8gbm9ybWFsaXplCgkJfQoKCQlsb2NhbGVEYXRhID0gY3JlYXRlT2JqZWN0KCAvLyBtYWtlIGEgY2hlYXAgY29weQoJCQlnZXRNb21lbnRMb2NhbGVEYXRhKGxvY2FsZSkgLy8gd2lsbCBmYWxsIGJhY2sgdG8gZW4KCQkpOwoKCQlpZiAobW9udGhOYW1lcykgewoJCQlsb2NhbGVEYXRhLl9tb250aHMgPSBtb250aE5hbWVzOwoJCX0KCQlpZiAobW9udGhOYW1lc1Nob3J0KSB7CgkJCWxvY2FsZURhdGEuX21vbnRoc1Nob3J0ID0gbW9udGhOYW1lc1Nob3J0OwoJCX0KCQlpZiAoZGF5TmFtZXMpIHsKCQkJbG9jYWxlRGF0YS5fd2Vla2RheXMgPSBkYXlOYW1lczsKCQl9CgkJaWYgKGRheU5hbWVzU2hvcnQpIHsKCQkJbG9jYWxlRGF0YS5fd2Vla2RheXNTaG9ydCA9IGRheU5hbWVzU2hvcnQ7CgkJfQoKCQlpZiAoZmlyc3REYXkgPT0gbnVsbCAmJiB3ZWVrTnVtYmVyQ2FsY3VsYXRpb24gPT09ICdJU08nKSB7CgkJCWZpcnN0RGF5ID0gMTsKCQl9CgkJaWYgKGZpcnN0RGF5ICE9IG51bGwpIHsKCQkJdmFyIF93ZWVrID0gY3JlYXRlT2JqZWN0KGxvY2FsZURhdGEuX3dlZWspOyAvLyBfd2VlazogeyBkb3c6ICMgfQoJCQlfd2Vlay5kb3cgPSBmaXJzdERheTsKCQkJbG9jYWxlRGF0YS5fd2VlayA9IF93ZWVrOwoJCX0KCgkJaWYgKCAvLyB3aGl0ZWxpc3QgY2VydGFpbiBraW5kcyBvZiBpbnB1dAoJCQl3ZWVrTnVtYmVyQ2FsY3VsYXRpb24gPT09ICdJU08nIHx8CgkJCXdlZWtOdW1iZXJDYWxjdWxhdGlvbiA9PT0gJ2xvY2FsJyB8fAoJCQl0eXBlb2Ygd2Vla051bWJlckNhbGN1bGF0aW9uID09PSAnZnVuY3Rpb24nCgkJKSB7CgkJCWxvY2FsZURhdGEuX2Z1bGxDYWxlbmRhcl93ZWVrQ2FsYyA9IHdlZWtOdW1iZXJDYWxjdWxhdGlvbjsgLy8gbW9tZW50LWV4dCB3aWxsIGtub3cgd2hhdCB0byBkbyB3aXRoIGl0CgkJfQoKCQkvLyBJZiB0aGUgaW50ZXJuYWwgY3VycmVudCBkYXRlIG9iamVjdCBhbHJlYWR5IGV4aXN0cywgbW92ZSB0byBuZXcgbG9jYWxlLgoJCS8vIFdlIGRvIE5PVCBuZWVkIHRvIGRvIHRoaXMgdGVjaG5pcXVlIGZvciBldmVudCBkYXRlcywgYmVjYXVzZSB0aGlzIGhhcHBlbnMgd2hlbiBjb252ZXJ0aW5nIHRvICJzZWdtZW50cyIuCgkJaWYgKGRhdGUpIHsKCQkJbG9jYWxpemVNb21lbnQoZGF0ZSk7IC8vIHNldHMgdG8gbG9jYWxlRGF0YQoJCX0KCX0pOwoKCgkvLyBDYWxlbmRhci1zcGVjaWZpYyBEYXRlIFV0aWxpdGllcwoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgoJdC5kZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbiA9IG1vbWVudC5kdXJhdGlvbih0Lm9wdGlvbnMuZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb24pOwoJdC5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uID0gbW9tZW50LmR1cmF0aW9uKHQub3B0aW9ucy5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uKTsKCgoJLy8gQnVpbGRzIGEgbW9tZW50IHVzaW5nIHRoZSBzZXR0aW5ncyBvZiB0aGUgY3VycmVudCBjYWxlbmRhcjogdGltZXpvbmUgYW5kIGxvY2FsZS4KCS8vIEFjY2VwdHMgYW55dGhpbmcgdGhlIHZhbmlsbGEgbW9tZW50KCkgY29uc3RydWN0b3IgYWNjZXB0cy4KCXQubW9tZW50ID0gZnVuY3Rpb24oKSB7CgkJdmFyIG1vbTsKCgkJaWYgKHQub3B0aW9ucy50aW1lem9uZSA9PT0gJ2xvY2FsJykgewoJCQltb20gPSBGQy5tb21lbnQuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKCgkJCS8vIEZvcmNlIHRoZSBtb21lbnQgdG8gYmUgbG9jYWwsIGJlY2F1c2UgRkMubW9tZW50IGRvZXNuJ3QgZ3VhcmFudGVlIGl0LgoJCQlpZiAobW9tLmhhc1RpbWUoKSkgeyAvLyBkb24ndCBnaXZlIGFtYmlndW91c2x5LXRpbWVkIG1vbWVudHMgYSBsb2NhbCB6b25lCgkJCQltb20ubG9jYWwoKTsKCQkJfQoJCX0KCQllbHNlIGlmICh0Lm9wdGlvbnMudGltZXpvbmUgPT09ICdVVEMnKSB7CgkJCW1vbSA9IEZDLm1vbWVudC51dGMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgLy8gcHJvY2VzcyBhcyBVVEMKCQl9CgkJZWxzZSB7CgkJCW1vbSA9IEZDLm1vbWVudC5wYXJzZVpvbmUuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgLy8gbGV0IHRoZSBpbnB1dCBkZWNpZGUgdGhlIHpvbmUKCQl9CgoJCWxvY2FsaXplTW9tZW50KG1vbSk7CgoJCXJldHVybiBtb207Cgl9OwoKCgkvLyBVcGRhdGVzIHRoZSBnaXZlbiBtb21lbnQncyBsb2NhbGUgc2V0dGluZ3MgdG8gdGhlIGN1cnJlbnQgY2FsZW5kYXIgbG9jYWxlIHNldHRpbmdzLgoJZnVuY3Rpb24gbG9jYWxpemVNb21lbnQobW9tKSB7CgkJbW9tLl9sb2NhbGUgPSBsb2NhbGVEYXRhOwoJfQoJdC5sb2NhbGl6ZU1vbWVudCA9IGxvY2FsaXplTW9tZW50OwoKCgkvLyBSZXR1cm5zIGEgYm9vbGVhbiBhYm91dCB3aGV0aGVyIG9yIG5vdCB0aGUgY2FsZW5kYXIga25vd3MgaG93IHRvIGNhbGN1bGF0ZQoJLy8gdGhlIHRpbWV6b25lIG9mZnNldCBvZiBhcmJpdHJhcnkgZGF0ZXMgaW4gdGhlIGN1cnJlbnQgdGltZXpvbmUuCgl0LmdldElzQW1iaWdUaW1lem9uZSA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0Lm9wdGlvbnMudGltZXpvbmUgIT09ICdsb2NhbCcgJiYgdC5vcHRpb25zLnRpbWV6b25lICE9PSAnVVRDJzsKCX07CgoKCS8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBnaXZlbiBkYXRlIGluIHRoZSBjdXJyZW50IHRpbWV6b25lLiBIYXMgbm8gZWZmZWN0IG9uIGRhdGVzIHdpdGhvdXQgdGltZXMuCgl0LmFwcGx5VGltZXpvbmUgPSBmdW5jdGlvbihkYXRlKSB7CgkJaWYgKCFkYXRlLmhhc1RpbWUoKSkgewoJCQlyZXR1cm4gZGF0ZS5jbG9uZSgpOwoJCX0KCgkJdmFyIHpvbmVkRGF0ZSA9IHQubW9tZW50KGRhdGUudG9BcnJheSgpKTsKCQl2YXIgdGltZUFkanVzdCA9IGRhdGUudGltZSgpIC0gem9uZWREYXRlLnRpbWUoKTsKCQl2YXIgYWRqdXN0ZWRab25lZERhdGU7CgoJCS8vIFNhZmFyaSBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhpcyBjb2Vyc2lvbiB3aGVuIG5lYXIgRFNULiBBZGp1c3QgaWYgbmVjZXNzYXJ5LiAoYnVnICMyMzk2KQoJCWlmICh0aW1lQWRqdXN0KSB7IC8vIGlzIHRoZSB0aW1lIHJlc3VsdCBkaWZmZXJlbnQgdGhhbiBleHBlY3RlZD8KCQkJYWRqdXN0ZWRab25lZERhdGUgPSB6b25lZERhdGUuY2xvbmUoKS5hZGQodGltZUFkanVzdCk7IC8vIGFkZCBtaWxsaXNlY29uZHMKCQkJaWYgKGRhdGUudGltZSgpIC0gYWRqdXN0ZWRab25lZERhdGUudGltZSgpID09PSAwKSB7IC8vIGRvZXMgaXQgbWF0Y2ggcGVyZmVjdGx5IG5vdz8KCQkJCXpvbmVkRGF0ZSA9IGFkanVzdGVkWm9uZWREYXRlOwoJCQl9CgkJfQoKCQlyZXR1cm4gem9uZWREYXRlOwoJfTsKCgoJLy8gUmV0dXJucyBhIG1vbWVudCBmb3IgdGhlIGN1cnJlbnQgZGF0ZSwgYXMgZGVmaW5lZCBieSB0aGUgY2xpZW50J3MgY29tcHV0ZXIgb3IgZnJvbSB0aGUgYG5vd2Agb3B0aW9uLgoJLy8gV2lsbCByZXR1cm4gYW4gbW9tZW50IHdpdGggYW4gYW1iaWd1b3VzIHRpbWV6b25lLgoJdC5nZXROb3cgPSBmdW5jdGlvbigpIHsKCQl2YXIgbm93ID0gdC5vcHRpb25zLm5vdzsKCQlpZiAodHlwZW9mIG5vdyA9PT0gJ2Z1bmN0aW9uJykgewoJCQlub3cgPSBub3coKTsKCQl9CgkJcmV0dXJuIHQubW9tZW50KG5vdykuc3RyaXBab25lKCk7Cgl9OwoKCgkvLyBHZXQgYW4gZXZlbnQncyBub3JtYWxpemVkIGVuZCBkYXRlLiBJZiBub3QgcHJlc2VudCwgY2FsY3VsYXRlIGl0IGZyb20gdGhlIGRlZmF1bHRzLgoJdC5nZXRFdmVudEVuZCA9IGZ1bmN0aW9uKGV2ZW50KSB7CgkJaWYgKGV2ZW50LmVuZCkgewoJCQlyZXR1cm4gZXZlbnQuZW5kLmNsb25lKCk7CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gdC5nZXREZWZhdWx0RXZlbnRFbmQoZXZlbnQuYWxsRGF5LCBldmVudC5zdGFydCk7CgkJfQoJfTsKCgoJLy8gR2l2ZW4gYW4gZXZlbnQncyBhbGxEYXkgc3RhdHVzIGFuZCBzdGFydCBkYXRlLCByZXR1cm4gd2hhdCBpdHMgZmFsbGJhY2sgZW5kIGRhdGUgc2hvdWxkIGJlLgoJLy8gVE9ETzogcmVuYW1lIHRvIGNvbXB1dGVEZWZhdWx0RXZlbnRFbmQKCXQuZ2V0RGVmYXVsdEV2ZW50RW5kID0gZnVuY3Rpb24oYWxsRGF5LCB6b25lZFN0YXJ0KSB7CgkJdmFyIGVuZCA9IHpvbmVkU3RhcnQuY2xvbmUoKTsKCgkJaWYgKGFsbERheSkgewoJCQllbmQuc3RyaXBUaW1lKCkuYWRkKHQuZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb24pOwoJCX0KCQllbHNlIHsKCQkJZW5kLmFkZCh0LmRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb24pOwoJCX0KCgkJaWYgKHQuZ2V0SXNBbWJpZ1RpbWV6b25lKCkpIHsKCQkJZW5kLnN0cmlwWm9uZSgpOyAvLyB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHR6byBzaG91bGQgYmUKCQl9CgoJCXJldHVybiBlbmQ7Cgl9OwoKCgkvLyBQcm9kdWNlcyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmb3IgdGhlIGdpdmVuIGR1cmF0aW9uLgoJLy8gU2lkZS1lZmZlY3Q6IGNoYW5nZXMgdGhlIGxvY2FsZSBvZiB0aGUgZ2l2ZW4gZHVyYXRpb24uCgl0Lmh1bWFuaXplRHVyYXRpb24gPSBmdW5jdGlvbihkdXJhdGlvbikgewoJCXJldHVybiBkdXJhdGlvbi5sb2NhbGUodC5vcHRpb25zLmxvY2FsZSkuaHVtYW5pemUoKTsKCX07CgoKCQoJLy8gSW1wb3J0cwoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgoJRXZlbnRNYW5hZ2VyLmNhbGwodCk7Cgl2YXIgaXNGZXRjaE5lZWRlZCA9IHQuaXNGZXRjaE5lZWRlZDsKCXZhciBmZXRjaEV2ZW50cyA9IHQuZmV0Y2hFdmVudHM7Cgl2YXIgZmV0Y2hFdmVudFNvdXJjZXMgPSB0LmZldGNoRXZlbnRTb3VyY2VzOwoKCgoJLy8gTG9jYWxzCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgl2YXIgX2VsZW1lbnQgPSBlbGVtZW50WzBdOwoJdmFyIGhlYWRlcjsKCXZhciBjb250ZW50OwoJdmFyIHRtOyAvLyBmb3IgbWFraW5nIHRoZW1lIGNsYXNzZXMKCXZhciBjdXJyZW50VmlldzsgLy8gTk9URToga2VlcCB0aGlzIGluIHN5bmMgd2l0aCB0aGlzLnZpZXcKCXZhciB2aWV3c0J5VHlwZSA9IHt9OyAvLyBob2xkcyBhbGwgaW5zdGFudGlhdGVkIHZpZXcgaW5zdGFuY2VzLCBjdXJyZW50IG9yIG5vdAoJdmFyIHN1Z2dlc3RlZFZpZXdIZWlnaHQ7Cgl2YXIgd2luZG93UmVzaXplUHJveHk7IC8vIHdyYXBzIHRoZSB3aW5kb3dSZXNpemUgZnVuY3Rpb24KCXZhciBpZ25vcmVXaW5kb3dSZXNpemUgPSAwOwoJdmFyIGV2ZW50cyA9IFtdOwoJdmFyIGRhdGU7IC8vIHVuem9uZWQKCQoJCgkKCS8vIE1haW4gUmVuZGVyaW5nCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgkvLyBjb21wdXRlIHRoZSBpbml0aWFsIGFtYmlnLXRpbWV6b25lIGRhdGUKCWlmICh0Lm9wdGlvbnMuZGVmYXVsdERhdGUgIT0gbnVsbCkgewoJCWRhdGUgPSB0Lm1vbWVudCh0Lm9wdGlvbnMuZGVmYXVsdERhdGUpLnN0cmlwWm9uZSgpOwoJfQoJZWxzZSB7CgkJZGF0ZSA9IHQuZ2V0Tm93KCk7IC8vIGdldE5vdyBhbHJlYWR5IHJldHVybnMgdW56b25lZAoJfQoJCgkKCWZ1bmN0aW9uIHJlbmRlcigpIHsKCQlpZiAoIWNvbnRlbnQpIHsKCQkJaW5pdGlhbFJlbmRlcigpOwoJCX0KCQllbHNlIGlmIChlbGVtZW50VmlzaWJsZSgpKSB7CgkJCS8vIG1haW5seSBmb3IgdGhlIHB1YmxpYyBBUEkKCQkJY2FsY1NpemUoKTsKCQkJcmVuZGVyVmlldygpOwoJCX0KCX0KCQoJCglmdW5jdGlvbiBpbml0aWFsUmVuZGVyKCkgewoJCWVsZW1lbnQuYWRkQ2xhc3MoJ2ZjJyk7CgoJCS8vIGV2ZW50IGRlbGVnYXRpb24gZm9yIG5hdiBsaW5rcwoJCWVsZW1lbnQub24oJ2NsaWNrLmZjJywgJ2FbZGF0YS1nb3RvXScsIGZ1bmN0aW9uKGV2KSB7CgkJCXZhciBhbmNob3JFbCA9ICQodGhpcyk7CgkJCXZhciBnb3RvT3B0aW9ucyA9IGFuY2hvckVsLmRhdGEoJ2dvdG8nKTsgLy8gd2lsbCBhdXRvbWF0aWNhbGx5IHBhcnNlIEpTT04KCQkJdmFyIGRhdGUgPSB0Lm1vbWVudChnb3RvT3B0aW9ucy5kYXRlKTsKCQkJdmFyIHZpZXdUeXBlID0gZ290b09wdGlvbnMudHlwZTsKCgkJCS8vIHByb3BlcnR5IGxpa2UgIm5hdkxpbmtEYXlDbGljayIuIG1pZ2h0IGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24KCQkJdmFyIGN1c3RvbUFjdGlvbiA9IGN1cnJlbnRWaWV3Lm9wdCgnbmF2TGluaycgKyBjYXBpdGFsaXNlRmlyc3RMZXR0ZXIodmlld1R5cGUpICsgJ0NsaWNrJyk7CgoJCQlpZiAodHlwZW9mIGN1c3RvbUFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykgewoJCQkJY3VzdG9tQWN0aW9uKGRhdGUsIGV2KTsKCQkJfQoJCQllbHNlIHsKCQkJCWlmICh0eXBlb2YgY3VzdG9tQWN0aW9uID09PSAnc3RyaW5nJykgewoJCQkJCXZpZXdUeXBlID0gY3VzdG9tQWN0aW9uOwoJCQkJfQoJCQkJem9vbVRvKGRhdGUsIHZpZXdUeXBlKTsKCQkJfQoJCX0pOwoKCQkvLyBjYWxsZWQgaW1tZWRpYXRlbHksIGFuZCB1cG9uIG9wdGlvbiBjaGFuZ2UKCQl0LmJpbmRPcHRpb24oJ3RoZW1lJywgZnVuY3Rpb24odGhlbWUpIHsKCQkJdG0gPSB0aGVtZSA/ICd1aScgOiAnZmMnOyAvLyBhZmZlY3RzIGEgbGFyZ2VyIHNjb3BlCgkJCWVsZW1lbnQudG9nZ2xlQ2xhc3MoJ3VpLXdpZGdldCcsIHRoZW1lKTsKCQkJZWxlbWVudC50b2dnbGVDbGFzcygnZmMtdW50aGVtZWQnLCAhdGhlbWUpOwoJCX0pOwoKCQkvLyBjYWxsZWQgaW1tZWRpYXRlbHksIGFuZCB1cG9uIG9wdGlvbiBjaGFuZ2UuCgkJLy8gSEFDSzogbG9jYWxlIG9mdGVuIGFmZmVjdHMgaXNSVEwsIHNvIHdlIGV4cGxpY2l0bHkgbGlzdGVuIHRvIHRoYXQgdG9vLgoJCXQuYmluZE9wdGlvbnMoWyAnaXNSVEwnLCAnbG9jYWxlJyBdLCBmdW5jdGlvbihpc1JUTCkgewoJCQllbGVtZW50LnRvZ2dsZUNsYXNzKCdmYy1sdHInLCAhaXNSVEwpOwoJCQllbGVtZW50LnRvZ2dsZUNsYXNzKCdmYy1ydGwnLCBpc1JUTCk7CgkJfSk7CgoJCWNvbnRlbnQgPSAkKCI8ZGl2IGNsYXNzPSdmYy12aWV3LWNvbnRhaW5lcicvPiIpLnByZXBlbmRUbyhlbGVtZW50KTsKCgkJaGVhZGVyID0gdC5oZWFkZXIgPSBuZXcgSGVhZGVyKHQpOwoJCXJlbmRlckhlYWRlcigpOwoKCQlyZW5kZXJWaWV3KHQub3B0aW9ucy5kZWZhdWx0Vmlldyk7CgoJCWlmICh0Lm9wdGlvbnMuaGFuZGxlV2luZG93UmVzaXplKSB7CgkJCXdpbmRvd1Jlc2l6ZVByb3h5ID0gZGVib3VuY2Uod2luZG93UmVzaXplLCB0Lm9wdGlvbnMud2luZG93UmVzaXplRGVsYXkpOyAvLyBwcmV2ZW50cyByYXBpZCBjYWxscwoJCQkkKHdpbmRvdykucmVzaXplKHdpbmRvd1Jlc2l6ZVByb3h5KTsKCQl9Cgl9CgoKCS8vIGNhbiBiZSBjYWxsZWQgcmVwZWF0ZWRseSBhbmQgSGVhZGVyIHdpbGwgcmVyZW5kZXIKCWZ1bmN0aW9uIHJlbmRlckhlYWRlcigpIHsKCQloZWFkZXIucmVuZGVyKCk7CgkJaWYgKGhlYWRlci5lbCkgewoJCQllbGVtZW50LnByZXBlbmQoaGVhZGVyLmVsKTsKCQl9Cgl9CgkKCQoJZnVuY3Rpb24gZGVzdHJveSgpIHsKCgkJaWYgKGN1cnJlbnRWaWV3KSB7CgkJCWN1cnJlbnRWaWV3LnJlbW92ZUVsZW1lbnQoKTsKCgkJCS8vIE5PVEU6IGRvbid0IG51bGwtb3V0IGN1cnJlbnRWaWV3L3QudmlldyBpbiBjYXNlIEFQSSBtZXRob2RzIGFyZSBjYWxsZWQgYWZ0ZXIgZGVzdHJveS4KCQkJLy8gSXQgaXMgc3RpbGwgdGhlICJjdXJyZW50IiB2aWV3LCBqdXN0IG5vdCByZW5kZXJlZC4KCQl9CgoJCWhlYWRlci5yZW1vdmVFbGVtZW50KCk7CgkJY29udGVudC5yZW1vdmUoKTsKCQllbGVtZW50LnJlbW92ZUNsYXNzKCdmYyBmYy1sdHIgZmMtcnRsIGZjLXVudGhlbWVkIHVpLXdpZGdldCcpOwoKCQllbGVtZW50Lm9mZignLmZjJyk7IC8vIHVuYmluZCBuYXYgbGluayBoYW5kbGVycwoKCQlpZiAod2luZG93UmVzaXplUHJveHkpIHsKCQkJJCh3aW5kb3cpLnVuYmluZCgncmVzaXplJywgd2luZG93UmVzaXplUHJveHkpOwoJCX0KCX0KCQoJCglmdW5jdGlvbiBlbGVtZW50VmlzaWJsZSgpIHsKCQlyZXR1cm4gZWxlbWVudC5pcygnOnZpc2libGUnKTsKCX0KCQoJCgoJLy8gVmlldyBSZW5kZXJpbmcKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCS8vIFJlbmRlcnMgYSB2aWV3IGJlY2F1c2Ugb2YgYSBkYXRlIGNoYW5nZSwgdmlldy10eXBlIGNoYW5nZSwgb3IgZm9yIHRoZSBmaXJzdCB0aW1lLgoJLy8gSWYgbm90IGdpdmVuIGEgdmlld1R5cGUsIGtlZXAgdGhlIGN1cnJlbnQgdmlldyBidXQgcmVuZGVyIGRpZmZlcmVudCBkYXRlcy4KCS8vIEFjY2VwdHMgYW4gb3B0aW9uYWwgc2Nyb2xsIHN0YXRlIHRvIHJlc3RvcmUgdG8uCglmdW5jdGlvbiByZW5kZXJWaWV3KHZpZXdUeXBlLCBleHBsaWNpdFNjcm9sbFN0YXRlKSB7CgkJaWdub3JlV2luZG93UmVzaXplKys7CgoJCS8vIGlmIHZpZXdUeXBlIGlzIGNoYW5naW5nLCByZW1vdmUgdGhlIG9sZCB2aWV3J3MgcmVuZGVyaW5nCgkJaWYgKGN1cnJlbnRWaWV3ICYmIHZpZXdUeXBlICYmIGN1cnJlbnRWaWV3LnR5cGUgIT09IHZpZXdUeXBlKSB7CgkJCWZyZWV6ZUNvbnRlbnRIZWlnaHQoKTsgLy8gcHJldmVudCBhIHNjcm9sbCBqdW1wIHdoZW4gdmlldyBlbGVtZW50IGlzIHJlbW92ZWQKCQkJY2xlYXJWaWV3KCk7CgkJfQoKCQkvLyBpZiB2aWV3VHlwZSBjaGFuZ2VkLCBvciB0aGUgdmlldyB3YXMgbmV2ZXIgY3JlYXRlZCwgY3JlYXRlIGEgZnJlc2ggdmlldwoJCWlmICghY3VycmVudFZpZXcgJiYgdmlld1R5cGUpIHsKCQkJY3VycmVudFZpZXcgPSB0LnZpZXcgPQoJCQkJdmlld3NCeVR5cGVbdmlld1R5cGVdIHx8CgkJCQkodmlld3NCeVR5cGVbdmlld1R5cGVdID0gdC5pbnN0YW50aWF0ZVZpZXcodmlld1R5cGUpKTsKCgkJCWN1cnJlbnRWaWV3LnNldEVsZW1lbnQoCgkJCQkkKCI8ZGl2IGNsYXNzPSdmYy12aWV3IGZjLSIgKyB2aWV3VHlwZSArICItdmlldycgLz4iKS5hcHBlbmRUbyhjb250ZW50KQoJCQkpOwoJCQloZWFkZXIuYWN0aXZhdGVCdXR0b24odmlld1R5cGUpOwoJCX0KCgkJaWYgKGN1cnJlbnRWaWV3KSB7CgoJCQkvLyBpbiBjYXNlIHRoZSB2aWV3IHNob3VsZCByZW5kZXIgYSBwZXJpb2Qgb2YgdGltZSB0aGF0IGlzIGNvbXBsZXRlbHkgaGlkZGVuCgkJCWRhdGUgPSBjdXJyZW50Vmlldy5tYXNzYWdlQ3VycmVudERhdGUoZGF0ZSk7CgoJCQkvLyByZW5kZXIgb3IgcmVyZW5kZXIgdGhlIHZpZXcKCQkJaWYgKAoJCQkJIWN1cnJlbnRWaWV3LmRpc3BsYXlpbmcgfHwKCQkJCSEoIC8vIE5PVCB3aXRoaW4gaW50ZXJ2YWwgcmFuZ2Ugc2lnbmFscyBhbiBpbXBsaWNpdCBkYXRlIHdpbmRvdyBjaGFuZ2UKCQkJCQlkYXRlID49IGN1cnJlbnRWaWV3LmludGVydmFsU3RhcnQgJiYKCQkJCQlkYXRlIDwgY3VycmVudFZpZXcuaW50ZXJ2YWxFbmQKCQkJCSkKCQkJKSB7CgkJCQlpZiAoZWxlbWVudFZpc2libGUoKSkgewoKCQkJCQljdXJyZW50Vmlldy5kaXNwbGF5KGRhdGUsIGV4cGxpY2l0U2Nyb2xsU3RhdGUpOyAvLyB3aWxsIGNhbGwgZnJlZXplQ29udGVudEhlaWdodAoJCQkJCXVuZnJlZXplQ29udGVudEhlaWdodCgpOyAvLyBpbW1lZGlhdGVseSB1bmZyZWV6ZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgZGlzcGxheSBpcyBhc3luYwoKCQkJCQkvLyBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgVmlldzo6cmVuZGVyLCBzbyBkYXRlcyBhcmUgY2FsY3VsYXRlZAoJCQkJCXVwZGF0ZUhlYWRlclRpdGxlKCk7CgkJCQkJdXBkYXRlVG9kYXlCdXR0b24oKTsKCgkJCQkJZ2V0QW5kUmVuZGVyRXZlbnRzKCk7CgkJCQl9CgkJCX0KCQl9CgoJCXVuZnJlZXplQ29udGVudEhlaWdodCgpOyAvLyB1bmRvIGFueSBsb25lIGZyZWV6ZUNvbnRlbnRIZWlnaHQgY2FsbHMKCQlpZ25vcmVXaW5kb3dSZXNpemUtLTsKCX0KCgoJLy8gVW5yZW5kZXJzIHRoZSBjdXJyZW50IHZpZXcgYW5kIHJlZmxlY3RzIHRoaXMgY2hhbmdlIGluIHRoZSBIZWFkZXIuCgkvLyBVbnJlZ3NpdGVycyB0aGUgYGN1cnJlbnRWaWV3YCwgYnV0IGRvZXMgbm90IHJlbW92ZSBmcm9tIHZpZXdCeVR5cGUgaGFzaC4KCWZ1bmN0aW9uIGNsZWFyVmlldygpIHsKCQloZWFkZXIuZGVhY3RpdmF0ZUJ1dHRvbihjdXJyZW50Vmlldy50eXBlKTsKCQljdXJyZW50Vmlldy5yZW1vdmVFbGVtZW50KCk7CgkJY3VycmVudFZpZXcgPSB0LnZpZXcgPSBudWxsOwoJfQoKCgkvLyBEZXN0cm95cyB0aGUgdmlldywgaW5jbHVkaW5nIHRoZSB2aWV3IG9iamVjdC4gVGhlbiwgcmUtaW5zdGFudGlhdGVzIGl0IGFuZCByZW5kZXJzIGl0LgoJLy8gTWFpbnRhaW5zIHRoZSBzYW1lIHNjcm9sbCBzdGF0ZS4KCS8vIFRPRE86IG1haW50YWluIGFueSBvdGhlciB1c2VyLW1hbmlwdWxhdGVkIHN0YXRlLgoJZnVuY3Rpb24gcmVpbml0VmlldygpIHsKCQlpZ25vcmVXaW5kb3dSZXNpemUrKzsKCQlmcmVlemVDb250ZW50SGVpZ2h0KCk7CgoJCXZhciB2aWV3VHlwZSA9IGN1cnJlbnRWaWV3LnR5cGU7CgkJdmFyIHNjcm9sbFN0YXRlID0gY3VycmVudFZpZXcucXVlcnlTY3JvbGwoKTsKCQljbGVhclZpZXcoKTsKCQlyZW5kZXJWaWV3KHZpZXdUeXBlLCBzY3JvbGxTdGF0ZSk7CgoJCXVuZnJlZXplQ29udGVudEhlaWdodCgpOwoJCWlnbm9yZVdpbmRvd1Jlc2l6ZS0tOwoJfQoKCQoKCS8vIFJlc2l6aW5nCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgl0LmdldFN1Z2dlc3RlZFZpZXdIZWlnaHQgPSBmdW5jdGlvbigpIHsKCQlpZiAoc3VnZ2VzdGVkVmlld0hlaWdodCA9PT0gdW5kZWZpbmVkKSB7CgkJCWNhbGNTaXplKCk7CgkJfQoJCXJldHVybiBzdWdnZXN0ZWRWaWV3SGVpZ2h0OwoJfTsKCgoJdC5pc0hlaWdodEF1dG8gPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdC5vcHRpb25zLmNvbnRlbnRIZWlnaHQgPT09ICdhdXRvJyB8fCB0Lm9wdGlvbnMuaGVpZ2h0ID09PSAnYXV0byc7Cgl9OwoJCgkKCWZ1bmN0aW9uIHVwZGF0ZVNpemUoc2hvdWxkUmVjYWxjKSB7CgkJaWYgKGVsZW1lbnRWaXNpYmxlKCkpIHsKCgkJCWlmIChzaG91bGRSZWNhbGMpIHsKCQkJCV9jYWxjU2l6ZSgpOwoJCQl9CgoJCQlpZ25vcmVXaW5kb3dSZXNpemUrKzsKCQkJY3VycmVudFZpZXcudXBkYXRlU2l6ZSh0cnVlKTsgLy8gaXNSZXNpemU9dHJ1ZS4gd2lsbCBwb2xsIGdldFN1Z2dlc3RlZFZpZXdIZWlnaHQoKSBhbmQgaXNIZWlnaHRBdXRvKCkKCQkJaWdub3JlV2luZG93UmVzaXplLS07CgoJCQlyZXR1cm4gdHJ1ZTsgLy8gc2lnbmFsIHN1Y2Nlc3MKCQl9Cgl9CgoKCWZ1bmN0aW9uIGNhbGNTaXplKCkgewoJCWlmIChlbGVtZW50VmlzaWJsZSgpKSB7CgkJCV9jYWxjU2l6ZSgpOwoJCX0KCX0KCQoJCglmdW5jdGlvbiBfY2FsY1NpemUoKSB7IC8vIGFzc3VtZXMgZWxlbWVudFZpc2libGUKCQl2YXIgY29udGVudEhlaWdodElucHV0ID0gdC5vcHRpb25zLmNvbnRlbnRIZWlnaHQ7CgkJdmFyIGhlaWdodElucHV0ID0gdC5vcHRpb25zLmhlaWdodDsKCgkJaWYgKHR5cGVvZiBjb250ZW50SGVpZ2h0SW5wdXQgPT09ICdudW1iZXInKSB7IC8vIGV4aXN0cyBhbmQgbm90ICdhdXRvJwoJCQlzdWdnZXN0ZWRWaWV3SGVpZ2h0ID0gY29udGVudEhlaWdodElucHV0OwoJCX0KCQllbHNlIGlmICh0eXBlb2YgY29udGVudEhlaWdodElucHV0ID09PSAnZnVuY3Rpb24nKSB7IC8vIGV4aXN0cyBhbmQgaXMgYSBmdW5jdGlvbgoJCQlzdWdnZXN0ZWRWaWV3SGVpZ2h0ID0gY29udGVudEhlaWdodElucHV0KCk7CgkJfQoJCWVsc2UgaWYgKHR5cGVvZiBoZWlnaHRJbnB1dCA9PT0gJ251bWJlcicpIHsgLy8gZXhpc3RzIGFuZCBub3QgJ2F1dG8nCgkJCXN1Z2dlc3RlZFZpZXdIZWlnaHQgPSBoZWlnaHRJbnB1dCAtIHF1ZXJ5SGVhZGVySGVpZ2h0KCk7CgkJfQoJCWVsc2UgaWYgKHR5cGVvZiBoZWlnaHRJbnB1dCA9PT0gJ2Z1bmN0aW9uJykgeyAvLyBleGlzdHMgYW5kIGlzIGEgZnVuY3Rpb24KCQkJc3VnZ2VzdGVkVmlld0hlaWdodCA9IGhlaWdodElucHV0KCkgLSBxdWVyeUhlYWRlckhlaWdodCgpOwoJCX0KCQllbHNlIGlmIChoZWlnaHRJbnB1dCA9PT0gJ3BhcmVudCcpIHsgLy8gc2V0IHRvIGhlaWdodCBvZiBwYXJlbnQgZWxlbWVudAoJCQlzdWdnZXN0ZWRWaWV3SGVpZ2h0ID0gZWxlbWVudC5wYXJlbnQoKS5oZWlnaHQoKSAtIHF1ZXJ5SGVhZGVySGVpZ2h0KCk7CgkJfQoJCWVsc2UgewoJCQlzdWdnZXN0ZWRWaWV3SGVpZ2h0ID0gTWF0aC5yb3VuZChjb250ZW50LndpZHRoKCkgLyBNYXRoLm1heCh0Lm9wdGlvbnMuYXNwZWN0UmF0aW8sIC41KSk7CgkJfQoJfQoKCglmdW5jdGlvbiBxdWVyeUhlYWRlckhlaWdodCgpIHsKCQlyZXR1cm4gaGVhZGVyLmVsID8gaGVhZGVyLmVsLm91dGVySGVpZ2h0KHRydWUpIDogMDsgLy8gaW5jbHVkZXMgbWFyZ2luCgl9CgkKCQoJZnVuY3Rpb24gd2luZG93UmVzaXplKGV2KSB7CgkJaWYgKAoJCQkhaWdub3JlV2luZG93UmVzaXplICYmCgkJCWV2LnRhcmdldCA9PT0gd2luZG93ICYmIC8vIHNvIHdlIGRvbid0IHByb2Nlc3MganF1aSAicmVzaXplIiBldmVudHMgdGhhdCBoYXZlIGJ1YmJsZWQgdXAKCQkJY3VycmVudFZpZXcuc3RhcnQgLy8gdmlldyBoYXMgYWxyZWFkeSBiZWVuIHJlbmRlcmVkCgkJKSB7CgkJCWlmICh1cGRhdGVTaXplKHRydWUpKSB7CgkJCQljdXJyZW50Vmlldy50cmlnZ2VyKCd3aW5kb3dSZXNpemUnLCBfZWxlbWVudCk7CgkJCX0KCQl9Cgl9CgkKCQoJCgkvKiBFdmVudCBGZXRjaGluZy9SZW5kZXJpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCS8vIFRPRE86IGdvaW5nIGZvcndhcmQsIG1vc3Qgb2YgdGhpcyBzdHVmZiBzaG91bGQgYmUgZGlyZWN0bHkgaGFuZGxlZCBieSB0aGUgdmlldwoKCglmdW5jdGlvbiByZWZldGNoRXZlbnRzKCkgeyAvLyBjYW4gYmUgY2FsbGVkIGFzIGFuIEFQSSBtZXRob2QKCQlmZXRjaEFuZFJlbmRlckV2ZW50cygpOwoJfQoKCgkvLyBUT0RPOiBtb3ZlIHRoaXMgaW50byBFdmVudE1hbmFnZXI/CglmdW5jdGlvbiByZWZldGNoRXZlbnRTb3VyY2VzKG1hdGNoSW5wdXRzKSB7CgkJZmV0Y2hFdmVudFNvdXJjZXModC5nZXRFdmVudFNvdXJjZXNCeU1hdGNoQXJyYXkobWF0Y2hJbnB1dHMpKTsKCX0KCgoJZnVuY3Rpb24gcmVuZGVyRXZlbnRzKCkgeyAvLyBkZXN0cm95cyBvbGQgZXZlbnRzIGlmIHByZXZpb3VzbHkgcmVuZGVyZWQKCQlpZiAoZWxlbWVudFZpc2libGUoKSkgewoJCQlmcmVlemVDb250ZW50SGVpZ2h0KCk7CgkJCWN1cnJlbnRWaWV3LmRpc3BsYXlFdmVudHMoZXZlbnRzKTsKCQkJdW5mcmVlemVDb250ZW50SGVpZ2h0KCk7CgkJfQoJfQoJCgoJZnVuY3Rpb24gZ2V0QW5kUmVuZGVyRXZlbnRzKCkgewoJCWlmICghdC5vcHRpb25zLmxhenlGZXRjaGluZyB8fCBpc0ZldGNoTmVlZGVkKGN1cnJlbnRWaWV3LnN0YXJ0LCBjdXJyZW50Vmlldy5lbmQpKSB7CgkJCWZldGNoQW5kUmVuZGVyRXZlbnRzKCk7CgkJfQoJCWVsc2UgewoJCQlyZW5kZXJFdmVudHMoKTsKCQl9Cgl9CgoKCWZ1bmN0aW9uIGZldGNoQW5kUmVuZGVyRXZlbnRzKCkgewoJCWZldGNoRXZlbnRzKGN1cnJlbnRWaWV3LnN0YXJ0LCBjdXJyZW50Vmlldy5lbmQpOwoJCQkvLyAuLi4gd2lsbCBjYWxsIHJlcG9ydEV2ZW50cwoJCQkvLyAuLi4gd2hpY2ggd2lsbCBjYWxsIHJlbmRlckV2ZW50cwoJfQoKCQoJLy8gY2FsbGVkIHdoZW4gZXZlbnQgZGF0YSBhcnJpdmVzCglmdW5jdGlvbiByZXBvcnRFdmVudHMoX2V2ZW50cykgewoJCWV2ZW50cyA9IF9ldmVudHM7CgkJcmVuZGVyRXZlbnRzKCk7Cgl9CgoKCS8vIGNhbGxlZCB3aGVuIGEgc2luZ2xlIGV2ZW50J3MgZGF0YSBoYXMgYmVlbiBjaGFuZ2VkCglmdW5jdGlvbiByZXBvcnRFdmVudENoYW5nZSgpIHsKCQlyZW5kZXJFdmVudHMoKTsKCX0KCgoKCS8qIEhlYWRlciBVcGRhdGluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglmdW5jdGlvbiB1cGRhdGVIZWFkZXJUaXRsZSgpIHsKCQloZWFkZXIudXBkYXRlVGl0bGUoY3VycmVudFZpZXcudGl0bGUpOwoJfQoKCglmdW5jdGlvbiB1cGRhdGVUb2RheUJ1dHRvbigpIHsKCQl2YXIgbm93ID0gdC5nZXROb3coKTsKCgkJaWYgKG5vdyA+PSBjdXJyZW50Vmlldy5pbnRlcnZhbFN0YXJ0ICYmIG5vdyA8IGN1cnJlbnRWaWV3LmludGVydmFsRW5kKSB7CgkJCWhlYWRlci5kaXNhYmxlQnV0dG9uKCd0b2RheScpOwoJCX0KCQllbHNlIHsKCQkJaGVhZGVyLmVuYWJsZUJ1dHRvbigndG9kYXknKTsKCQl9Cgl9CgkKCgoJLyogU2VsZWN0aW9uCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkKCgkvLyB0aGlzIHB1YmxpYyBtZXRob2QgcmVjZWl2ZXMgc3RhcnQvZW5kIGRhdGVzIGluIGFueSBmb3JtYXQsIHdpdGggYW55IHRpbWV6b25lCglmdW5jdGlvbiBzZWxlY3Qoem9uZWRTdGFydElucHV0LCB6b25lZEVuZElucHV0KSB7CgkJY3VycmVudFZpZXcuc2VsZWN0KAoJCQl0LmJ1aWxkU2VsZWN0U3Bhbi5hcHBseSh0LCBhcmd1bWVudHMpCgkJKTsKCX0KCQoKCWZ1bmN0aW9uIHVuc2VsZWN0KCkgeyAvLyBzYWZlIHRvIGJlIGNhbGxlZCBiZWZvcmUgcmVuZGVyVmlldwoJCWlmIChjdXJyZW50VmlldykgewoJCQljdXJyZW50Vmlldy51bnNlbGVjdCgpOwoJCX0KCX0KCQoJCgkKCS8qIERhdGUKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCQoJCglmdW5jdGlvbiBwcmV2KCkgewoJCWRhdGUgPSBjdXJyZW50Vmlldy5jb21wdXRlUHJldkRhdGUoZGF0ZSk7CgkJcmVuZGVyVmlldygpOwoJfQoJCgkKCWZ1bmN0aW9uIG5leHQoKSB7CgkJZGF0ZSA9IGN1cnJlbnRWaWV3LmNvbXB1dGVOZXh0RGF0ZShkYXRlKTsKCQlyZW5kZXJWaWV3KCk7Cgl9CgkKCQoJZnVuY3Rpb24gcHJldlllYXIoKSB7CgkJZGF0ZS5hZGQoLTEsICd5ZWFycycpOwoJCXJlbmRlclZpZXcoKTsKCX0KCQoJCglmdW5jdGlvbiBuZXh0WWVhcigpIHsKCQlkYXRlLmFkZCgxLCAneWVhcnMnKTsKCQlyZW5kZXJWaWV3KCk7Cgl9CgkKCQoJZnVuY3Rpb24gdG9kYXkoKSB7CgkJZGF0ZSA9IHQuZ2V0Tm93KCk7CgkJcmVuZGVyVmlldygpOwoJfQoJCgkKCWZ1bmN0aW9uIGdvdG9EYXRlKHpvbmVkRGF0ZUlucHV0KSB7CgkJZGF0ZSA9IHQubW9tZW50KHpvbmVkRGF0ZUlucHV0KS5zdHJpcFpvbmUoKTsKCQlyZW5kZXJWaWV3KCk7Cgl9CgkKCQoJZnVuY3Rpb24gaW5jcmVtZW50RGF0ZShkZWx0YSkgewoJCWRhdGUuYWRkKG1vbWVudC5kdXJhdGlvbihkZWx0YSkpOwoJCXJlbmRlclZpZXcoKTsKCX0KCgoJLy8gRm9yY2VzIG5hdmlnYXRpb24gdG8gYSB2aWV3IGZvciB0aGUgZ2l2ZW4gZGF0ZS4KCS8vIGB2aWV3VHlwZWAgY2FuIGJlIGEgc3BlY2lmaWMgdmlldyBuYW1lIG9yIGEgZ2VuZXJpYyBvbmUgbGlrZSAid2VlayIgb3IgImRheSIuCglmdW5jdGlvbiB6b29tVG8obmV3RGF0ZSwgdmlld1R5cGUpIHsKCQl2YXIgc3BlYzsKCgkJdmlld1R5cGUgPSB2aWV3VHlwZSB8fCAnZGF5JzsgLy8gZGF5IGlzIGRlZmF1bHQgem9vbQoJCXNwZWMgPSB0LmdldFZpZXdTcGVjKHZpZXdUeXBlKSB8fCB0LmdldFVuaXRWaWV3U3BlYyh2aWV3VHlwZSk7CgoJCWRhdGUgPSBuZXdEYXRlLmNsb25lKCk7CgkJcmVuZGVyVmlldyhzcGVjID8gc3BlYy50eXBlIDogbnVsbCk7Cgl9CgkKCQoJLy8gZm9yIGV4dGVybmFsIEFQSQoJZnVuY3Rpb24gZ2V0RGF0ZSgpIHsKCQlyZXR1cm4gdC5hcHBseVRpbWV6b25lKGRhdGUpOyAvLyBpbmZ1c2UgdGhlIGNhbGVuZGFyJ3MgdGltZXpvbmUKCX0KCgoKCS8qIEhlaWdodCAiRnJlZXppbmciCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkvLyBUT0RPOiBtb3ZlIHRoaXMgaW50byB0aGUgdmlldwoKCXQuZnJlZXplQ29udGVudEhlaWdodCA9IGZyZWV6ZUNvbnRlbnRIZWlnaHQ7Cgl0LnVuZnJlZXplQ29udGVudEhlaWdodCA9IHVuZnJlZXplQ29udGVudEhlaWdodDsKCgoJZnVuY3Rpb24gZnJlZXplQ29udGVudEhlaWdodCgpIHsKCQljb250ZW50LmNzcyh7CgkJCXdpZHRoOiAnMTAwJScsCgkJCWhlaWdodDogY29udGVudC5oZWlnaHQoKSwKCQkJb3ZlcmZsb3c6ICdoaWRkZW4nCgkJfSk7Cgl9CgoKCWZ1bmN0aW9uIHVuZnJlZXplQ29udGVudEhlaWdodCgpIHsKCQljb250ZW50LmNzcyh7CgkJCXdpZHRoOiAnJywKCQkJaGVpZ2h0OiAnJywKCQkJb3ZlcmZsb3c6ICcnCgkJfSk7Cgl9CgkKCQoJCgkvKiBNaXNjCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkKCglmdW5jdGlvbiBnZXRDYWxlbmRhcigpIHsKCQlyZXR1cm4gdDsKCX0KCgkKCWZ1bmN0aW9uIGdldFZpZXcoKSB7CgkJcmV0dXJuIGN1cnJlbnRWaWV3OwoJfQoJCgkKCWZ1bmN0aW9uIG9wdGlvbihuYW1lLCB2YWx1ZSkgewoJCXZhciBuZXdPcHRpb25IYXNoOwoKCQlpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7CgkJCWlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IC8vIGdldHRlcgoJCQkJcmV0dXJuIHQub3B0aW9uc1tuYW1lXTsKCQkJfQoJCQllbHNlIHsgLy8gc2V0dGVyIGZvciBpbmRpdmlkdWFsIG9wdGlvbgoJCQkJbmV3T3B0aW9uSGFzaCA9IHt9OwoJCQkJbmV3T3B0aW9uSGFzaFtuYW1lXSA9IHZhbHVlOwoJCQkJc2V0T3B0aW9ucyhuZXdPcHRpb25IYXNoKTsKCQkJfQoJCX0KCQllbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHsgLy8gY29tcG91bmQgc2V0dGVyIHdpdGggb2JqZWN0IGlucHV0CgkJCXNldE9wdGlvbnMobmFtZSk7CgkJfQoJfQoKCglmdW5jdGlvbiBzZXRPcHRpb25zKG5ld09wdGlvbkhhc2gpIHsKCQl2YXIgb3B0aW9uQ250ID0gMDsKCQl2YXIgb3B0aW9uTmFtZTsKCgkJZm9yIChvcHRpb25OYW1lIGluIG5ld09wdGlvbkhhc2gpIHsKCQkJdC5keW5hbWljT3ZlcnJpZGVzW29wdGlvbk5hbWVdID0gbmV3T3B0aW9uSGFzaFtvcHRpb25OYW1lXTsKCQl9CgoJCXQudmlld1NwZWNDYWNoZSA9IHt9OyAvLyB0aGUgZHluYW1pYyBvdmVycmlkZSBpbnZhbGlkYXRlcyB0aGUgb3B0aW9ucyBpbiB0aGlzIGNhY2hlLCBzbyBqdXN0IGNsZWFyIGl0CgkJdC5wb3B1bGF0ZU9wdGlvbnNIYXNoKCk7IC8vIHRoaXMub3B0aW9ucyBuZWVkcyB0byBiZSByZWNvbXB1dGVkIGFmdGVyIHRoZSBkeW5hbWljIG92ZXJyaWRlCgoJCS8vIHRyaWdnZXIgaGFuZGxlcnMgYWZ0ZXIgdGhpcy5vcHRpb25zIGhhcyBiZWVuIHVwZGF0ZWQKCQlmb3IgKG9wdGlvbk5hbWUgaW4gbmV3T3B0aW9uSGFzaCkgewoJCQl0LnRyaWdnZXJPcHRpb25IYW5kbGVycyhvcHRpb25OYW1lKTsgLy8gcmVjYWxsIGJpbmRPcHRpb24vYmluZE9wdGlvbnMKCQkJb3B0aW9uQ250Kys7CgkJfQoKCQkvLyBzcGVjaWFsLWNhc2UgaGFuZGxpbmcgb2Ygc2luZ2xlIG9wdGlvbiBjaGFuZ2UuCgkJLy8gaWYgb25seSBvbmUgb3B0aW9uIGNoYW5nZSwgYG9wdGlvbk5hbWVgIHdpbGwgYmUgaXRzIG5hbWUuCgkJaWYgKG9wdGlvbkNudCA9PT0gMSkgewoJCQlpZiAob3B0aW9uTmFtZSA9PT0gJ2hlaWdodCcgfHwgb3B0aW9uTmFtZSA9PT0gJ2NvbnRlbnRIZWlnaHQnIHx8IG9wdGlvbk5hbWUgPT09ICdhc3BlY3RSYXRpbycpIHsKCQkJCXVwZGF0ZVNpemUodHJ1ZSk7IC8vIHRydWUgPSBhbGxvdyByZWNhbGN1bGF0aW9uIG9mIGhlaWdodAoJCQkJcmV0dXJuOwoJCQl9CgkJCWVsc2UgaWYgKG9wdGlvbk5hbWUgPT09ICdkZWZhdWx0RGF0ZScpIHsKCQkJCXJldHVybjsgLy8gY2FuJ3QgY2hhbmdlIGRhdGUgdGhpcyB3YXkuIHVzZSBnb3RvRGF0ZSBpbnN0ZWFkCgkJCX0KCQkJZWxzZSBpZiAob3B0aW9uTmFtZSA9PT0gJ2J1c2luZXNzSG91cnMnKSB7CgkJCQlpZiAoY3VycmVudFZpZXcpIHsKCQkJCQljdXJyZW50Vmlldy51bnJlbmRlckJ1c2luZXNzSG91cnMoKTsKCQkJCQljdXJyZW50Vmlldy5yZW5kZXJCdXNpbmVzc0hvdXJzKCk7CgkJCQl9CgkJCQlyZXR1cm47CgkJCX0KCQkJZWxzZSBpZiAob3B0aW9uTmFtZSA9PT0gJ3RpbWV6b25lJykgewoJCQkJdC5yZXpvbmVBcnJheUV2ZW50U291cmNlcygpOwoJCQkJcmVmZXRjaEV2ZW50cygpOwoJCQkJcmV0dXJuOwoJCQl9CgkJfQoKCQkvLyBjYXRjaC1hbGwuIHJlcmVuZGVyIHRoZSBoZWFkZXIgYW5kIHJlYnVpbGQvcmVyZW5kZXIgdGhlIGN1cnJlbnQgdmlldwoJCXJlbmRlckhlYWRlcigpOwoJCXZpZXdzQnlUeXBlID0ge307IC8vIGV2ZW4gbm9uLWN1cnJlbnQgdmlld3Mgd2lsbCBiZSBhZmZlY3RlZCBieSB0aGlzIG9wdGlvbiBjaGFuZ2UuIGRvIGJlZm9yZSByZXJlbmRlcgoJCXJlaW5pdFZpZXcoKTsKCX0KCQoJCglmdW5jdGlvbiB0cmlnZ2VyKG5hbWUsIHRoaXNPYmopIHsgLy8gb3ZlcnJpZGVzIHRoZSBFbWl0dGVyJ3MgdHJpZ2dlciBtZXRob2QgOigKCQl2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CgoJCXRoaXNPYmogPSB0aGlzT2JqIHx8IF9lbGVtZW50OwoJCXRoaXMudHJpZ2dlcldpdGgobmFtZSwgdGhpc09iaiwgYXJncyk7IC8vIEVtaXR0ZXIncyBtZXRob2QKCgkJaWYgKHQub3B0aW9uc1tuYW1lXSkgewoJCQlyZXR1cm4gdC5vcHRpb25zW25hbWVdLmFwcGx5KHRoaXNPYmosIGFyZ3MpOwoJCX0KCX0KCgl0LmluaXRpYWxpemUoKTsKfQoKOzsKLyoKT3B0aW9ucyBiaW5kaW5nL3RyaWdnZXJpbmcgc3lzdGVtLgoqLwpDYWxlbmRhci5taXhpbih7CgoJLy8gQSBtYXAgb2Ygb3B0aW9uIG5hbWVzIHRvIGFycmF5cyBvZiBoYW5kbGVyIG9iamVjdHMuIEluaXRpYWxpemVkIHRvIHt9IGluIENhbGVuZGFyLgoJLy8gRm9ybWF0IGZvciBhIGhhbmRsZXIgb2JqZWN0OgoJLy8gewoJLy8gICBmdW5jIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB1cG9uIGNoYW5nZQoJLy8gICBuYW1lcyAvLyBvcHRpb24gbmFtZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBnaXZlbiB0byBmdW5jCgkvLyB9CglvcHRpb25IYW5kbGVyczogbnVsbCwgCgoJLy8gQ2FsbHMgaGFuZGxlckZ1bmMgaW1tZWRpYXRlbHksIGFuZCB3aGVuIHRoZSBnaXZlbiBvcHRpb24gaGFzIGNoYW5nZWQuCgkvLyBoYW5kbGVyRnVuYyB3aWxsIGJlIGdpdmVuIHRoZSBvcHRpb24gdmFsdWUuCgliaW5kT3B0aW9uOiBmdW5jdGlvbihvcHRpb25OYW1lLCBoYW5kbGVyRnVuYykgewoJCXRoaXMuYmluZE9wdGlvbnMoWyBvcHRpb25OYW1lIF0sIGhhbmRsZXJGdW5jKTsKCX0sCgoJLy8gQ2FsbHMgaGFuZGxlckZ1bmMgaW1tZWRpYXRlbHksIGFuZCB3aGVuIGFueSBvZiB0aGUgZ2l2ZW4gb3B0aW9ucyBjaGFuZ2UuCgkvLyBoYW5kbGVyRnVuYyB3aWxsIGJlIGdpdmVuIGVhY2ggb3B0aW9uIHZhbHVlIGFzIG9yZGVyZWQgZnVuY3Rpb24gYXJndW1lbnRzLgoJYmluZE9wdGlvbnM6IGZ1bmN0aW9uKG9wdGlvbk5hbWVzLCBoYW5kbGVyRnVuYykgewoJCXZhciBoYW5kbGVyT2JqID0geyBmdW5jOiBoYW5kbGVyRnVuYywgbmFtZXM6IG9wdGlvbk5hbWVzIH07CgkJdmFyIGk7CgoJCWZvciAoaSA9IDA7IGkgPCBvcHRpb25OYW1lcy5sZW5ndGg7IGkrKykgewoJCQl0aGlzLnJlZ2lzdGVyT3B0aW9uSGFuZGxlck9iaihvcHRpb25OYW1lc1tpXSwgaGFuZGxlck9iaik7CgkJfQoKCQl0aGlzLnRyaWdnZXJPcHRpb25IYW5kbGVyT2JqKGhhbmRsZXJPYmopOwoJfSwKCgkvLyBQdXRzIHRoZSBnaXZlbiBoYW5kbGVyIG9iamVjdCBpbnRvIHRoZSBpbnRlcm5hbCBoYXNoCglyZWdpc3Rlck9wdGlvbkhhbmRsZXJPYmo6IGZ1bmN0aW9uKG9wdGlvbk5hbWUsIGhhbmRsZXJPYmopIHsKCQkodGhpcy5vcHRpb25IYW5kbGVyc1tvcHRpb25OYW1lXSB8fCAodGhpcy5vcHRpb25IYW5kbGVyc1tvcHRpb25OYW1lXSA9IFtdKSkKCQkJLnB1c2goaGFuZGxlck9iaik7Cgl9LAoKCS8vIFJlcG9ydHMgdGhhdCB0aGUgZ2l2ZW4gb3B0aW9uIGhhcyBjaGFuZ2VkLCBhbmQgY2FsbHMgYWxsIGFwcHJvcHJpYXRlIGhhbmRsZXJzLgoJdHJpZ2dlck9wdGlvbkhhbmRsZXJzOiBmdW5jdGlvbihvcHRpb25OYW1lKSB7CgkJdmFyIGhhbmRsZXJPYmpzID0gdGhpcy5vcHRpb25IYW5kbGVyc1tvcHRpb25OYW1lXSB8fCBbXTsKCQl2YXIgaTsKCgkJZm9yIChpID0gMDsgaSA8IGhhbmRsZXJPYmpzLmxlbmd0aDsgaSsrKSB7CgkJCXRoaXMudHJpZ2dlck9wdGlvbkhhbmRsZXJPYmooaGFuZGxlck9ianNbaV0pOwoJCX0KCX0sCgoJLy8gQ2FsbHMgdGhlIGNhbGxiYWNrIGZvciBhIHNwZWNpZmljIGhhbmRsZXIgb2JqZWN0LCBwYXNzaW5nIGluIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMuCgl0cmlnZ2VyT3B0aW9uSGFuZGxlck9iajogZnVuY3Rpb24oaGFuZGxlck9iaikgewoJCXZhciBvcHRpb25OYW1lcyA9IGhhbmRsZXJPYmoubmFtZXM7CgkJdmFyIG9wdGlvblZhbHVlcyA9IFtdOwoJCXZhciBpOwoKCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9uTmFtZXMubGVuZ3RoOyBpKyspIHsKCQkJb3B0aW9uVmFsdWVzLnB1c2godGhpcy5vcHRpb25zW29wdGlvbk5hbWVzW2ldXSk7CgkJfQoKCQloYW5kbGVyT2JqLmZ1bmMuYXBwbHkodGhpcywgb3B0aW9uVmFsdWVzKTsgLy8gbWFpbnRhaW4gdGhlIENhbGVuZGFyJ3MgYHRoaXNgIGNvbnRleHQKCX0KCn0pOwoKOzsKCkNhbGVuZGFyLmRlZmF1bHRzID0gewoKCXRpdGxlUmFuZ2VTZXBhcmF0b3I6ICcgXHUyMDEzICcsIC8vIGVuIGRhc2gKCW1vbnRoWWVhckZvcm1hdDogJ01NTU0gWVlZWScsIC8vIHJlcXVpcmVkIGZvciBlbi4gb3RoZXIgbG9jYWxlcyByZWx5IG9uIGRhdGVwaWNrZXIgY29tcHV0YWJsZSBvcHRpb24KCglkZWZhdWx0VGltZWRFdmVudER1cmF0aW9uOiAnMDI6MDA6MDAnLAoJZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb246IHsgZGF5czogMSB9LAoJZm9yY2VFdmVudER1cmF0aW9uOiBmYWxzZSwKCW5leHREYXlUaHJlc2hvbGQ6ICcwOTowMDowMCcsIC8vIDlhbQoKCS8vIGRpc3BsYXkKCWRlZmF1bHRWaWV3OiAnbW9udGgnLAoJYXNwZWN0UmF0aW86IDEuMzUsCgloZWFkZXI6IHsKCQlsZWZ0OiAndGl0bGUnLAoJCWNlbnRlcjogJycsCgkJcmlnaHQ6ICd0b2RheSBwcmV2LG5leHQnCgl9LAoJd2Vla2VuZHM6IHRydWUsCgl3ZWVrTnVtYmVyczogZmFsc2UsCgoJd2Vla051bWJlclRpdGxlOiAnVycsCgl3ZWVrTnVtYmVyQ2FsY3VsYXRpb246ICdsb2NhbCcsCgkKCS8vZWRpdGFibGU6IGZhbHNlLAoKCS8vbm93SW5kaWNhdG9yOiBmYWxzZSwKCglzY3JvbGxUaW1lOiAnMDY6MDA6MDAnLAoJCgkvLyBldmVudCBhamF4CglsYXp5RmV0Y2hpbmc6IHRydWUsCglzdGFydFBhcmFtOiAnc3RhcnQnLAoJZW5kUGFyYW06ICdlbmQnLAoJdGltZXpvbmVQYXJhbTogJ3RpbWV6b25lJywKCgl0aW1lem9uZTogZmFsc2UsCgoJLy9hbGxEYXlEZWZhdWx0OiB1bmRlZmluZWQsCgoJLy8gbG9jYWxlCglpc1JUTDogZmFsc2UsCglidXR0b25UZXh0OiB7CgkJcHJldjogInByZXYiLAoJCW5leHQ6ICJuZXh0IiwKCQlwcmV2WWVhcjogInByZXYgeWVhciIsCgkJbmV4dFllYXI6ICJuZXh0IHllYXIiLAoJCXllYXI6ICd5ZWFyJywgLy8gVE9ETzogbG9jYWxlIGZpbGVzIG5lZWQgdG8gc3BlY2lmeSB0aGlzCgkJdG9kYXk6ICd0b2RheScsCgkJbW9udGg6ICdtb250aCcsCgkJd2VlazogJ3dlZWsnLAoJCWRheTogJ2RheScKCX0sCgoJYnV0dG9uSWNvbnM6IHsKCQlwcmV2OiAnbGVmdC1zaW5nbGUtYXJyb3cnLAoJCW5leHQ6ICdyaWdodC1zaW5nbGUtYXJyb3cnLAoJCXByZXZZZWFyOiAnbGVmdC1kb3VibGUtYXJyb3cnLAoJCW5leHRZZWFyOiAncmlnaHQtZG91YmxlLWFycm93JwoJfSwKCglhbGxEYXlUZXh0OiAnYWxsLWRheScsCgkKCS8vIGpxdWVyeS11aSB0aGVtaW5nCgl0aGVtZTogZmFsc2UsCgl0aGVtZUJ1dHRvbkljb25zOiB7CgkJcHJldjogJ2NpcmNsZS10cmlhbmdsZS13JywKCQluZXh0OiAnY2lyY2xlLXRyaWFuZ2xlLWUnLAoJCXByZXZZZWFyOiAnc2Vlay1wcmV2JywKCQluZXh0WWVhcjogJ3NlZWstbmV4dCcKCX0sCgoJLy9ldmVudFJlc2l6YWJsZUZyb21TdGFydDogZmFsc2UsCglkcmFnT3BhY2l0eTogLjc1LAoJZHJhZ1JldmVydER1cmF0aW9uOiA1MDAsCglkcmFnU2Nyb2xsOiB0cnVlLAoJCgkvL3NlbGVjdGFibGU6IGZhbHNlLAoJdW5zZWxlY3RBdXRvOiB0cnVlLAoJCglkcm9wQWNjZXB0OiAnKicsCgoJZXZlbnRPcmRlcjogJ3RpdGxlJywKCglldmVudExpbWl0OiBmYWxzZSwKCWV2ZW50TGltaXRUZXh0OiAnbW9yZScsCglldmVudExpbWl0Q2xpY2s6ICdwb3BvdmVyJywKCWRheVBvcG92ZXJGb3JtYXQ6ICdMTCcsCgkKCWhhbmRsZVdpbmRvd1Jlc2l6ZTogdHJ1ZSwKCXdpbmRvd1Jlc2l6ZURlbGF5OiAxMDAsIC8vIG1pbGxpc2Vjb25kcyBiZWZvcmUgYW4gdXBkYXRlU2l6ZSBoYXBwZW5zCgoJbG9uZ1ByZXNzRGVsYXk6IDEwMDAKCQp9OwoKCkNhbGVuZGFyLmVuZ2xpc2hEZWZhdWx0cyA9IHsgLy8gdXNlZCBieSBsb2NhbGUuanMKCWRheVBvcG92ZXJGb3JtYXQ6ICdkZGRkLCBNTU1NIEQnCn07CgoKQ2FsZW5kYXIucnRsRGVmYXVsdHMgPSB7IC8vIHJpZ2h0LXRvLWxlZnQgZGVmYXVsdHMKCWhlYWRlcjogeyAvLyBUT0RPOiBzbWFydGVyIHNvbHV0aW9uIChmaXJzdC9jZW50ZXIvbGFzdCA/KQoJCWxlZnQ6ICduZXh0LHByZXYgdG9kYXknLAoJCWNlbnRlcjogJycsCgkJcmlnaHQ6ICd0aXRsZScKCX0sCglidXR0b25JY29uczogewoJCXByZXY6ICdyaWdodC1zaW5nbGUtYXJyb3cnLAoJCW5leHQ6ICdsZWZ0LXNpbmdsZS1hcnJvdycsCgkJcHJldlllYXI6ICdyaWdodC1kb3VibGUtYXJyb3cnLAoJCW5leHRZZWFyOiAnbGVmdC1kb3VibGUtYXJyb3cnCgl9LAoJdGhlbWVCdXR0b25JY29uczogewoJCXByZXY6ICdjaXJjbGUtdHJpYW5nbGUtZScsCgkJbmV4dDogJ2NpcmNsZS10cmlhbmdsZS13JywKCQluZXh0WWVhcjogJ3NlZWstcHJldicsCgkJcHJldlllYXI6ICdzZWVrLW5leHQnCgl9Cn07Cgo7OwoKdmFyIGxvY2FsZU9wdGlvbkhhc2ggPSBGQy5sb2NhbGVzID0ge307IC8vIGluaXRpYWxpemUgYW5kIGV4cG9zZQoKCi8vIFRPRE86IGRvY3VtZW50IHRoZSBzdHJ1Y3R1cmUgYW5kIG9yZGVyaW5nIG9mIGEgRnVsbENhbGVuZGFyIGxvY2FsZSBmaWxlCgoKLy8gSW5pdGlhbGl6ZSBqUXVlcnkgVUkgZGF0ZXBpY2tlciB0cmFuc2xhdGlvbnMgd2hpbGUgdXNpbmcgc29tZSBvZiB0aGUgdHJhbnNsYXRpb25zCi8vIFdpbGwgc2V0IHRoaXMgYXMgdGhlIGRlZmF1bHQgbG9jYWxlcyBmb3IgZGF0ZXBpY2tlci4KRkMuZGF0ZXBpY2tlckxvY2FsZSA9IGZ1bmN0aW9uKGxvY2FsZUNvZGUsIGRwTG9jYWxlQ29kZSwgZHBPcHRpb25zKSB7CgoJLy8gZ2V0IHRoZSBGdWxsQ2FsZW5kYXIgaW50ZXJuYWwgb3B0aW9uIGhhc2ggZm9yIHRoaXMgbG9jYWxlLiBjcmVhdGUgaWYgbmVjZXNzYXJ5Cgl2YXIgZmNPcHRpb25zID0gbG9jYWxlT3B0aW9uSGFzaFtsb2NhbGVDb2RlXSB8fCAobG9jYWxlT3B0aW9uSGFzaFtsb2NhbGVDb2RlXSA9IHt9KTsKCgkvLyB0cmFuc2ZlciBzb21lIHNpbXBsZSBvcHRpb25zIGZyb20gZGF0ZXBpY2tlciB0byBmYwoJZmNPcHRpb25zLmlzUlRMID0gZHBPcHRpb25zLmlzUlRMOwoJZmNPcHRpb25zLndlZWtOdW1iZXJUaXRsZSA9IGRwT3B0aW9ucy53ZWVrSGVhZGVyOwoKCS8vIGNvbXB1dGUgc29tZSBtb3JlIGNvbXBsZXggb3B0aW9ucyBmcm9tIGRhdGVwaWNrZXIKCSQuZWFjaChkcENvbXB1dGFibGVPcHRpb25zLCBmdW5jdGlvbihuYW1lLCBmdW5jKSB7CgkJZmNPcHRpb25zW25hbWVdID0gZnVuYyhkcE9wdGlvbnMpOwoJfSk7CgoJLy8gaXMgalF1ZXJ5IFVJIERhdGVwaWNrZXIgaXMgb24gdGhlIHBhZ2U/CglpZiAoJC5kYXRlcGlja2VyKSB7CgoJCS8vIFJlZ2lzdGVyIHRoZSBsb2NhbGUgZGF0YS4KCQkvLyBGdWxsQ2FsZW5kYXIgYW5kIE1vbWVudEpTIHVzZSBsb2NhbGUgY29kZXMgbGlrZSAicHQtYnIiIGJ1dCBEYXRlcGlja2VyCgkJLy8gZG9lcyBpdCBsaWtlICJwdC1CUiIgb3IgaWYgaXQgZG9lc24ndCBoYXZlIHRoZSBsb2NhbGUsIG1heWJlIGp1c3QgInB0Ii4KCQkvLyBNYWtlIGFuIGFsaWFzIHNvIHRoZSBsb2NhbGUgY2FuIGJlIHJlZmVyZW5jZWQgZWl0aGVyIHdheS4KCQkkLmRhdGVwaWNrZXIucmVnaW9uYWxbZHBMb2NhbGVDb2RlXSA9CgkJCSQuZGF0ZXBpY2tlci5yZWdpb25hbFtsb2NhbGVDb2RlXSA9IC8vIGFsaWFzCgkJCQlkcE9wdGlvbnM7CgoJCS8vIEFsaWFzICdlbicgdG8gdGhlIGRlZmF1bHQgbG9jYWxlIGRhdGEuIERvIHRoaXMgZXZlcnkgdGltZS4KCQkkLmRhdGVwaWNrZXIucmVnaW9uYWwuZW4gPSAkLmRhdGVwaWNrZXIucmVnaW9uYWxbJyddOwoKCQkvLyBTZXQgYXMgRGF0ZXBpY2tlcidzIGdsb2JhbCBkZWZhdWx0cy4KCQkkLmRhdGVwaWNrZXIuc2V0RGVmYXVsdHMoZHBPcHRpb25zKTsKCX0KfTsKCgovLyBTZXRzIEZ1bGxDYWxlbmRhci1zcGVjaWZpYyB0cmFuc2xhdGlvbnMuIFdpbGwgc2V0IHRoZSBsb2NhbGVzIGFzIHRoZSBnbG9iYWwgZGVmYXVsdC4KRkMubG9jYWxlID0gZnVuY3Rpb24obG9jYWxlQ29kZSwgbmV3RmNPcHRpb25zKSB7Cgl2YXIgZmNPcHRpb25zOwoJdmFyIG1vbU9wdGlvbnM7CgoJLy8gZ2V0IHRoZSBGdWxsQ2FsZW5kYXIgaW50ZXJuYWwgb3B0aW9uIGhhc2ggZm9yIHRoaXMgbG9jYWxlLiBjcmVhdGUgaWYgbmVjZXNzYXJ5CglmY09wdGlvbnMgPSBsb2NhbGVPcHRpb25IYXNoW2xvY2FsZUNvZGVdIHx8IChsb2NhbGVPcHRpb25IYXNoW2xvY2FsZUNvZGVdID0ge30pOwoKCS8vIHByb3ZpZGVkIG5ldyBvcHRpb25zIGZvciB0aGlzIGxvY2FsZXM/IG1lcmdlIHRoZW0gaW4KCWlmIChuZXdGY09wdGlvbnMpIHsKCQlmY09wdGlvbnMgPSBsb2NhbGVPcHRpb25IYXNoW2xvY2FsZUNvZGVdID0gbWVyZ2VPcHRpb25zKFsgZmNPcHRpb25zLCBuZXdGY09wdGlvbnMgXSk7Cgl9CgoJLy8gY29tcHV0ZSBsb2NhbGUgb3B0aW9ucyB0aGF0IHdlcmVuJ3QgZGVmaW5lZC4KCS8vIGFsd2F5cyBkbyB0aGlzLiBuZXdGY09wdGlvbnMgY2FuIGJlIHVuZGVmaW5lZCB3aGVuIGluaXRpYWxpemluZyBmcm9tIGkxOG4gZmlsZSwKCS8vIHNvIG5vIHdheSB0byB0ZWxsIGlmIHRoaXMgaXMgYW4gaW5pdGlhbGl6YXRpb24gb3IgYSBkZWZhdWx0LXNldHRpbmcuCgltb21PcHRpb25zID0gZ2V0TW9tZW50TG9jYWxlRGF0YShsb2NhbGVDb2RlKTsgLy8gd2lsbCBmYWxsIGJhY2sgdG8gZW4KCSQuZWFjaChtb21Db21wdXRhYmxlT3B0aW9ucywgZnVuY3Rpb24obmFtZSwgZnVuYykgewoJCWlmIChmY09wdGlvbnNbbmFtZV0gPT0gbnVsbCkgewoJCQlmY09wdGlvbnNbbmFtZV0gPSBmdW5jKG1vbU9wdGlvbnMsIGZjT3B0aW9ucyk7CgkJfQoJfSk7CgoJLy8gc2V0IGl0IGFzIHRoZSBkZWZhdWx0IGxvY2FsZSBmb3IgRnVsbENhbGVuZGFyCglDYWxlbmRhci5kZWZhdWx0cy5sb2NhbGUgPSBsb2NhbGVDb2RlOwp9OwoKCi8vIE5PVEU6IGNhbid0IGd1YXJhbnRlZSBhbnkgb2YgdGhlc2UgY29tcHV0YXRpb25zIHdpbGwgcnVuIGJlY2F1c2Ugbm90IGV2ZXJ5IGxvY2FsZSBoYXMgZGF0ZXBpY2tlcgovLyBjb25maWdzLCBzbyBtYWtlIHN1cmUgdGhlcmUgYXJlIEVuZ2xpc2ggZmFsbGJhY2tzIGZvciB0aGVzZSBpbiB0aGUgZGVmYXVsdHMgZmlsZS4KdmFyIGRwQ29tcHV0YWJsZU9wdGlvbnMgPSB7CgoJYnV0dG9uVGV4dDogZnVuY3Rpb24oZHBPcHRpb25zKSB7CgkJcmV0dXJuIHsKCQkJLy8gdGhlIHRyYW5zbGF0aW9ucyBzb21ldGltZXMgd3JvbmdseSBjb250YWluIEhUTUwgZW50aXRpZXMKCQkJcHJldjogc3RyaXBIdG1sRW50aXRpZXMoZHBPcHRpb25zLnByZXZUZXh0KSwKCQkJbmV4dDogc3RyaXBIdG1sRW50aXRpZXMoZHBPcHRpb25zLm5leHRUZXh0KSwKCQkJdG9kYXk6IHN0cmlwSHRtbEVudGl0aWVzKGRwT3B0aW9ucy5jdXJyZW50VGV4dCkKCQl9OwoJfSwKCgkvLyBQcm9kdWNlcyBmb3JtYXQgc3RyaW5ncyBsaWtlICJNTU1NIFlZWVkiIC0+ICJTZXB0ZW1iZXIgMjAxNCIKCW1vbnRoWWVhckZvcm1hdDogZnVuY3Rpb24oZHBPcHRpb25zKSB7CgkJcmV0dXJuIGRwT3B0aW9ucy5zaG93TW9udGhBZnRlclllYXIgPwoJCQknWVlZWVsnICsgZHBPcHRpb25zLnllYXJTdWZmaXggKyAnXSBNTU1NJyA6CgkJCSdNTU1NIFlZWVlbJyArIGRwT3B0aW9ucy55ZWFyU3VmZml4ICsgJ10nOwoJfQoKfTsKCnZhciBtb21Db21wdXRhYmxlT3B0aW9ucyA9IHsKCgkvLyBQcm9kdWNlcyBmb3JtYXQgc3RyaW5ncyBsaWtlICJkZGQgTS9EIiAtPiAiRnJpIDkvMTUiCglkYXlPZk1vbnRoRm9ybWF0OiBmdW5jdGlvbihtb21PcHRpb25zLCBmY09wdGlvbnMpIHsKCQl2YXIgZm9ybWF0ID0gbW9tT3B0aW9ucy5sb25nRGF0ZUZvcm1hdCgnbCcpOyAvLyBmb3IgdGhlIGZvcm1hdCBsaWtlICJNL0QvWVlZWSIKCgkJLy8gc3RyaXAgdGhlIHllYXIgb2ZmIHRoZSBlZGdlLCBhcyB3ZWxsIGFzIG90aGVyIG1pc2Mgbm9uLXdoaXRlc3BhY2UgY2hhcnMKCQlmb3JtYXQgPSBmb3JtYXQucmVwbGFjZSgvXlkrW15cd1xzXSp8W15cd1xzXSpZKyQvZywgJycpOwoKCQlpZiAoZmNPcHRpb25zLmlzUlRMKSB7CgkJCWZvcm1hdCArPSAnIGRkZCc7IC8vIGZvciBSVEwsIGFkZCBkYXktb2Ytd2VlayB0byBlbmQKCQl9CgkJZWxzZSB7CgkJCWZvcm1hdCA9ICdkZGQgJyArIGZvcm1hdDsgLy8gZm9yIExUUiwgYWRkIGRheS1vZi13ZWVrIHRvIGJlZ2lubmluZwoJCX0KCQlyZXR1cm4gZm9ybWF0OwoJfSwKCgkvLyBQcm9kdWNlcyBmb3JtYXQgc3RyaW5ncyBsaWtlICJoOm1tYSIgLT4gIjY6MDBwbSIKCW1lZGl1bVRpbWVGb3JtYXQ6IGZ1bmN0aW9uKG1vbU9wdGlvbnMpIHsgLy8gY2FuJ3QgYmUgY2FsbGVkIGB0aW1lRm9ybWF0YCBiZWNhdXNlIGNvbGxpZGVzIHdpdGggb3B0aW9uCgkJcmV0dXJuIG1vbU9wdGlvbnMubG9uZ0RhdGVGb3JtYXQoJ0xUJykKCQkJLnJlcGxhY2UoL1xzKmEkL2ksICdhJyk7IC8vIGNvbnZlcnQgQU0vUE0vYW0vcG0gdG8gbG93ZXJjYXNlLiByZW1vdmUgYW55IHNwYWNlcyBiZWZvcmVoYW5kCgl9LAoKCS8vIFByb2R1Y2VzIGZvcm1hdCBzdHJpbmdzIGxpa2UgImgoOm1tKWEiIC0+ICI2cG0iIC8gIjY6MzBwbSIKCXNtYWxsVGltZUZvcm1hdDogZnVuY3Rpb24obW9tT3B0aW9ucykgewoJCXJldHVybiBtb21PcHRpb25zLmxvbmdEYXRlRm9ybWF0KCdMVCcpCgkJCS5yZXBsYWNlKCc6bW0nLCAnKDptbSknKQoJCQkucmVwbGFjZSgvKFxXbW0pJC8sICcoJDEpJykgLy8gbGlrZSBhYm92ZSwgYnV0IGZvciBmb3JlaWduIGxvY2FsZXMKCQkJLnJlcGxhY2UoL1xzKmEkL2ksICdhJyk7IC8vIGNvbnZlcnQgQU0vUE0vYW0vcG0gdG8gbG93ZXJjYXNlLiByZW1vdmUgYW55IHNwYWNlcyBiZWZvcmVoYW5kCgl9LAoKCS8vIFByb2R1Y2VzIGZvcm1hdCBzdHJpbmdzIGxpa2UgImgoOm1tKXQiIC0+ICI2cCIgLyAiNjozMHAiCglleHRyYVNtYWxsVGltZUZvcm1hdDogZnVuY3Rpb24obW9tT3B0aW9ucykgewoJCXJldHVybiBtb21PcHRpb25zLmxvbmdEYXRlRm9ybWF0KCdMVCcpCgkJCS5yZXBsYWNlKCc6bW0nLCAnKDptbSknKQoJCQkucmVwbGFjZSgvKFxXbW0pJC8sICcoJDEpJykgLy8gbGlrZSBhYm92ZSwgYnV0IGZvciBmb3JlaWduIGxvY2FsZXMKCQkJLnJlcGxhY2UoL1xzKmEkL2ksICd0Jyk7IC8vIGNvbnZlcnQgdG8gQU0vUE0vYW0vcG0gdG8gbG93ZXJjYXNlIG9uZS1sZXR0ZXIuIHJlbW92ZSBhbnkgc3BhY2VzIGJlZm9yZWhhbmQKCX0sCgoJLy8gUHJvZHVjZXMgZm9ybWF0IHN0cmluZ3MgbGlrZSAiaGEiIC8gIkgiIC0+ICI2cG0iIC8gIjE4IgoJaG91ckZvcm1hdDogZnVuY3Rpb24obW9tT3B0aW9ucykgewoJCXJldHVybiBtb21PcHRpb25zLmxvbmdEYXRlRm9ybWF0KCdMVCcpCgkJCS5yZXBsYWNlKCc6bW0nLCAnJykKCQkJLnJlcGxhY2UoLyhcV21tKSQvLCAnJykgLy8gbGlrZSBhYm92ZSwgYnV0IGZvciBmb3JlaWduIGxvY2FsZXMKCQkJLnJlcGxhY2UoL1xzKmEkL2ksICdhJyk7IC8vIGNvbnZlcnQgQU0vUE0vYW0vcG0gdG8gbG93ZXJjYXNlLiByZW1vdmUgYW55IHNwYWNlcyBiZWZvcmVoYW5kCgl9LAoKCS8vIFByb2R1Y2VzIGZvcm1hdCBzdHJpbmdzIGxpa2UgImg6bW0iIC0+ICI2OjMwIiAod2l0aCBubyBBTS9QTSkKCW5vTWVyaWRpZW1UaW1lRm9ybWF0OiBmdW5jdGlvbihtb21PcHRpb25zKSB7CgkJcmV0dXJuIG1vbU9wdGlvbnMubG9uZ0RhdGVGb3JtYXQoJ0xUJykKCQkJLnJlcGxhY2UoL1xzKmEkL2ksICcnKTsgLy8gcmVtb3ZlIHRyYWlsaW5nIEFNL1BNCgl9Cgp9OwoKCi8vIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgY29tcHV0ZWQgb2ZmIGxpdmUgY2FsZW5kYXIgb3B0aW9ucyAoY29uc2lkZXJzIG92ZXJyaWRlIG9wdGlvbnMpCi8vIFRPRE86IGJlc3QgcGxhY2UgZm9yIHRoaXM/IHJlbGF0ZWQgdG8gbG9jYWxlPwovLyBUT0RPOiBmbGlwcGluZyB0ZXh0IGJhc2VkIG9uIGlzUlRMIGlzIGEgYmFkIGlkZWEgYmVjYXVzZSB0aGUgQ1NTIGBkaXJlY3Rpb25gIG1pZ2h0IHdhbnQgdG8gaGFuZGxlIGl0CnZhciBpbnN0YW5jZUNvbXB1dGFibGVPcHRpb25zID0gewoKCS8vIFByb2R1Y2VzIGZvcm1hdCBzdHJpbmdzIGZvciByZXN1bHRzIGxpa2UgIk1vIDE2IgoJc21hbGxEYXlEYXRlRm9ybWF0OiBmdW5jdGlvbihvcHRpb25zKSB7CgkJcmV0dXJuIG9wdGlvbnMuaXNSVEwgPwoJCQknRCBkZCcgOgoJCQknZGQgRCc7Cgl9LAoKCS8vIFByb2R1Y2VzIGZvcm1hdCBzdHJpbmdzIGZvciByZXN1bHRzIGxpa2UgIldrIDUiCgl3ZWVrRm9ybWF0OiBmdW5jdGlvbihvcHRpb25zKSB7CgkJcmV0dXJuIG9wdGlvbnMuaXNSVEwgPwoJCQknd1sgJyArIG9wdGlvbnMud2Vla051bWJlclRpdGxlICsgJ10nIDoKCQkJJ1snICsgb3B0aW9ucy53ZWVrTnVtYmVyVGl0bGUgKyAnIF13JzsKCX0sCgoJLy8gUHJvZHVjZXMgZm9ybWF0IHN0cmluZ3MgZm9yIHJlc3VsdHMgbGlrZSAiV2s1IgoJc21hbGxXZWVrRm9ybWF0OiBmdW5jdGlvbihvcHRpb25zKSB7CgkJcmV0dXJuIG9wdGlvbnMuaXNSVEwgPwoJCQknd1snICsgb3B0aW9ucy53ZWVrTnVtYmVyVGl0bGUgKyAnXScgOgoJCQknWycgKyBvcHRpb25zLndlZWtOdW1iZXJUaXRsZSArICdddyc7Cgl9Cgp9OwoKZnVuY3Rpb24gcG9wdWxhdGVJbnN0YW5jZUNvbXB1dGFibGVPcHRpb25zKG9wdGlvbnMpIHsKCSQuZWFjaChpbnN0YW5jZUNvbXB1dGFibGVPcHRpb25zLCBmdW5jdGlvbihuYW1lLCBmdW5jKSB7CgkJaWYgKG9wdGlvbnNbbmFtZV0gPT0gbnVsbCkgewoJCQlvcHRpb25zW25hbWVdID0gZnVuYyhvcHRpb25zKTsKCQl9Cgl9KTsKfQoKCi8vIFJldHVybnMgbW9tZW50J3MgaW50ZXJuYWwgbG9jYWxlIGRhdGEuIElmIGRvZXNuJ3QgZXhpc3QsIHJldHVybnMgRW5nbGlzaC4KZnVuY3Rpb24gZ2V0TW9tZW50TG9jYWxlRGF0YShsb2NhbGVDb2RlKSB7CglyZXR1cm4gbW9tZW50LmxvY2FsZURhdGEobG9jYWxlQ29kZSkgfHwgbW9tZW50LmxvY2FsZURhdGEoJ2VuJyk7Cn0KCgovLyBJbml0aWFsaXplIEVuZ2xpc2ggYnkgZm9yY2luZyBjb21wdXRhdGlvbiBvZiBtb21lbnQtZGVyaXZlZCBvcHRpb25zLgovLyBBbHNvLCBzZXRzIGl0IGFzIHRoZSBkZWZhdWx0LgpGQy5sb2NhbGUoJ2VuJywgQ2FsZW5kYXIuZW5nbGlzaERlZmF1bHRzKTsKCjs7CgovKiBUb3AgdG9vbGJhciBhcmVhIHdpdGggYnV0dG9ucyBhbmQgdGl0bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8vIFRPRE86IHJlbmFtZSBhbGwgaGVhZGVyLXJlbGF0ZWQgdGhpbmdzIHRvICJ0b29sYmFyIgoKZnVuY3Rpb24gSGVhZGVyKGNhbGVuZGFyKSB7Cgl2YXIgdCA9IHRoaXM7CgkKCS8vIGV4cG9ydHMKCXQucmVuZGVyID0gcmVuZGVyOwoJdC5yZW1vdmVFbGVtZW50ID0gcmVtb3ZlRWxlbWVudDsKCXQudXBkYXRlVGl0bGUgPSB1cGRhdGVUaXRsZTsKCXQuYWN0aXZhdGVCdXR0b24gPSBhY3RpdmF0ZUJ1dHRvbjsKCXQuZGVhY3RpdmF0ZUJ1dHRvbiA9IGRlYWN0aXZhdGVCdXR0b247Cgl0LmRpc2FibGVCdXR0b24gPSBkaXNhYmxlQnV0dG9uOwoJdC5lbmFibGVCdXR0b24gPSBlbmFibGVCdXR0b247Cgl0LmdldFZpZXdzV2l0aEJ1dHRvbnMgPSBnZXRWaWV3c1dpdGhCdXR0b25zOwoJdC5lbCA9IG51bGw7IC8vIG1pcnJvcnMgbG9jYWwgYGVsYAoJCgkvLyBsb2NhbHMKCXZhciBlbDsKCXZhciB2aWV3c1dpdGhCdXR0b25zID0gW107Cgl2YXIgdG07CgoKCS8vIGNhbiBiZSBjYWxsZWQgcmVwZWF0ZWRseSBhbmQgd2lsbCByZXJlbmRlcgoJZnVuY3Rpb24gcmVuZGVyKCkgewoJCXZhciBvcHRpb25zID0gY2FsZW5kYXIub3B0aW9uczsKCQl2YXIgc2VjdGlvbnMgPSBvcHRpb25zLmhlYWRlcjsKCgkJdG0gPSBvcHRpb25zLnRoZW1lID8gJ3VpJyA6ICdmYyc7CgoJCWlmIChzZWN0aW9ucykgewoJCQlpZiAoIWVsKSB7CgkJCQllbCA9IHRoaXMuZWwgPSAkKCI8ZGl2IGNsYXNzPSdmYy10b29sYmFyJy8+Iik7CgkJCX0KCQkJZWxzZSB7CgkJCQllbC5lbXB0eSgpOwoJCQl9CgkJCWVsLmFwcGVuZChyZW5kZXJTZWN0aW9uKCdsZWZ0JykpCgkJCQkuYXBwZW5kKHJlbmRlclNlY3Rpb24oJ3JpZ2h0JykpCgkJCQkuYXBwZW5kKHJlbmRlclNlY3Rpb24oJ2NlbnRlcicpKQoJCQkJLmFwcGVuZCgnPGRpdiBjbGFzcz0iZmMtY2xlYXIiLz4nKTsKCQl9CgkJZWxzZSB7CgkJCXJlbW92ZUVsZW1lbnQoKTsKCQl9Cgl9CgkKCQoJZnVuY3Rpb24gcmVtb3ZlRWxlbWVudCgpIHsKCQlpZiAoZWwpIHsKCQkJZWwucmVtb3ZlKCk7CgkJCWVsID0gdC5lbCA9IG51bGw7CgkJfQoJfQoJCgkKCWZ1bmN0aW9uIHJlbmRlclNlY3Rpb24ocG9zaXRpb24pIHsKCQl2YXIgc2VjdGlvbkVsID0gJCgnPGRpdiBjbGFzcz0iZmMtJyArIHBvc2l0aW9uICsgJyIvPicpOwoJCXZhciBvcHRpb25zID0gY2FsZW5kYXIub3B0aW9uczsKCQl2YXIgYnV0dG9uU3RyID0gb3B0aW9ucy5oZWFkZXJbcG9zaXRpb25dOwoKCQlpZiAoYnV0dG9uU3RyKSB7CgkJCSQuZWFjaChidXR0b25TdHIuc3BsaXQoJyAnKSwgZnVuY3Rpb24oaSkgewoJCQkJdmFyIGdyb3VwQ2hpbGRyZW4gPSAkKCk7CgkJCQl2YXIgaXNPbmx5QnV0dG9ucyA9IHRydWU7CgkJCQl2YXIgZ3JvdXBFbDsKCgkJCQkkLmVhY2godGhpcy5zcGxpdCgnLCcpLCBmdW5jdGlvbihqLCBidXR0b25OYW1lKSB7CgkJCQkJdmFyIGN1c3RvbUJ1dHRvblByb3BzOwoJCQkJCXZhciB2aWV3U3BlYzsKCQkJCQl2YXIgYnV0dG9uQ2xpY2s7CgkJCQkJdmFyIG92ZXJyaWRlVGV4dDsgLy8gdGV4dCBleHBsaWNpdGx5IHNldCBieSBjYWxlbmRhcidzIGNvbnN0cnVjdG9yIG9wdGlvbnMuIG92ZXJjb21lcyBpY29ucwoJCQkJCXZhciBkZWZhdWx0VGV4dDsKCQkJCQl2YXIgdGhlbWVJY29uOwoJCQkJCXZhciBub3JtYWxJY29uOwoJCQkJCXZhciBpbm5lckh0bWw7CgkJCQkJdmFyIGNsYXNzZXM7CgkJCQkJdmFyIGJ1dHRvbjsgLy8gdGhlIGVsZW1lbnQKCgkJCQkJaWYgKGJ1dHRvbk5hbWUgPT0gJ3RpdGxlJykgewoJCQkJCQlncm91cENoaWxkcmVuID0gZ3JvdXBDaGlsZHJlbi5hZGQoJCgnPGgyPiZuYnNwOzwvaDI+JykpOyAvLyB3ZSBhbHdheXMgd2FudCBpdCB0byB0YWtlIHVwIGhlaWdodAoJCQkJCQlpc09ubHlCdXR0b25zID0gZmFsc2U7CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQlpZiAoKGN1c3RvbUJ1dHRvblByb3BzID0gKG9wdGlvbnMuY3VzdG9tQnV0dG9ucyB8fCB7fSlbYnV0dG9uTmFtZV0pKSB7CgkJCQkJCQlidXR0b25DbGljayA9IGZ1bmN0aW9uKGV2KSB7CgkJCQkJCQkJaWYgKGN1c3RvbUJ1dHRvblByb3BzLmNsaWNrKSB7CgkJCQkJCQkJCWN1c3RvbUJ1dHRvblByb3BzLmNsaWNrLmNhbGwoYnV0dG9uWzBdLCBldik7CgkJCQkJCQkJfQoJCQkJCQkJfTsKCQkJCQkJCW92ZXJyaWRlVGV4dCA9ICcnOyAvLyBpY29ucyB3aWxsIG92ZXJyaWRlIHRleHQKCQkJCQkJCWRlZmF1bHRUZXh0ID0gY3VzdG9tQnV0dG9uUHJvcHMudGV4dDsKCQkJCQkJfQoJCQkJCQllbHNlIGlmICgodmlld1NwZWMgPSBjYWxlbmRhci5nZXRWaWV3U3BlYyhidXR0b25OYW1lKSkpIHsKCQkJCQkJCWJ1dHRvbkNsaWNrID0gZnVuY3Rpb24oKSB7CgkJCQkJCQkJY2FsZW5kYXIuY2hhbmdlVmlldyhidXR0b25OYW1lKTsKCQkJCQkJCX07CgkJCQkJCQl2aWV3c1dpdGhCdXR0b25zLnB1c2goYnV0dG9uTmFtZSk7CgkJCQkJCQlvdmVycmlkZVRleHQgPSB2aWV3U3BlYy5idXR0b25UZXh0T3ZlcnJpZGU7CgkJCQkJCQlkZWZhdWx0VGV4dCA9IHZpZXdTcGVjLmJ1dHRvblRleHREZWZhdWx0OwoJCQkJCQl9CgkJCQkJCWVsc2UgaWYgKGNhbGVuZGFyW2J1dHRvbk5hbWVdKSB7IC8vIGEgY2FsZW5kYXIgbWV0aG9kCgkJCQkJCQlidXR0b25DbGljayA9IGZ1bmN0aW9uKCkgewoJCQkJCQkJCWNhbGVuZGFyW2J1dHRvbk5hbWVdKCk7CgkJCQkJCQl9OwoJCQkJCQkJb3ZlcnJpZGVUZXh0ID0gKGNhbGVuZGFyLm92ZXJyaWRlcy5idXR0b25UZXh0IHx8IHt9KVtidXR0b25OYW1lXTsKCQkJCQkJCWRlZmF1bHRUZXh0ID0gb3B0aW9ucy5idXR0b25UZXh0W2J1dHRvbk5hbWVdOyAvLyBldmVyeXRoaW5nIGVsc2UgaXMgY29uc2lkZXJlZCBkZWZhdWx0CgkJCQkJCX0KCgkJCQkJCWlmIChidXR0b25DbGljaykgewoKCQkJCQkJCXRoZW1lSWNvbiA9CgkJCQkJCQkJY3VzdG9tQnV0dG9uUHJvcHMgPwoJCQkJCQkJCQljdXN0b21CdXR0b25Qcm9wcy50aGVtZUljb24gOgoJCQkJCQkJCQlvcHRpb25zLnRoZW1lQnV0dG9uSWNvbnNbYnV0dG9uTmFtZV07CgoJCQkJCQkJbm9ybWFsSWNvbiA9CgkJCQkJCQkJY3VzdG9tQnV0dG9uUHJvcHMgPwoJCQkJCQkJCQljdXN0b21CdXR0b25Qcm9wcy5pY29uIDoKCQkJCQkJCQkJb3B0aW9ucy5idXR0b25JY29uc1tidXR0b25OYW1lXTsKCgkJCQkJCQlpZiAob3ZlcnJpZGVUZXh0KSB7CgkJCQkJCQkJaW5uZXJIdG1sID0gaHRtbEVzY2FwZShvdmVycmlkZVRleHQpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZSBpZiAodGhlbWVJY29uICYmIG9wdGlvbnMudGhlbWUpIHsKCQkJCQkJCQlpbm5lckh0bWwgPSAiPHNwYW4gY2xhc3M9J3VpLWljb24gdWktaWNvbi0iICsgdGhlbWVJY29uICsgIic+PC9zcGFuPiI7CgkJCQkJCQl9CgkJCQkJCQllbHNlIGlmIChub3JtYWxJY29uICYmICFvcHRpb25zLnRoZW1lKSB7CgkJCQkJCQkJaW5uZXJIdG1sID0gIjxzcGFuIGNsYXNzPSdmYy1pY29uIGZjLWljb24tIiArIG5vcm1hbEljb24gKyAiJz48L3NwYW4+IjsKCQkJCQkJCX0KCQkJCQkJCWVsc2UgewoJCQkJCQkJCWlubmVySHRtbCA9IGh0bWxFc2NhcGUoZGVmYXVsdFRleHQpOwoJCQkJCQkJfQoKCQkJCQkJCWNsYXNzZXMgPSBbCgkJCQkJCQkJJ2ZjLScgKyBidXR0b25OYW1lICsgJy1idXR0b24nLAoJCQkJCQkJCXRtICsgJy1idXR0b24nLAoJCQkJCQkJCXRtICsgJy1zdGF0ZS1kZWZhdWx0JwoJCQkJCQkJXTsKCgkJCQkJCQlidXR0b24gPSAkKCAvLyB0eXBlPSJidXR0b24iIHNvIHRoYXQgaXQgZG9lc24ndCBzdWJtaXQgYSBmb3JtCgkJCQkJCQkJJzxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iJyArIGNsYXNzZXMuam9pbignICcpICsgJyI+JyArCgkJCQkJCQkJCWlubmVySHRtbCArCgkJCQkJCQkJJzwvYnV0dG9uPicKCQkJCQkJCQkpCgkJCQkJCQkJLmNsaWNrKGZ1bmN0aW9uKGV2KSB7CgkJCQkJCQkJCS8vIGRvbid0IHByb2Nlc3MgY2xpY2tzIGZvciBkaXNhYmxlZCBidXR0b25zCgkJCQkJCQkJCWlmICghYnV0dG9uLmhhc0NsYXNzKHRtICsgJy1zdGF0ZS1kaXNhYmxlZCcpKSB7CgoJCQkJCQkJCQkJYnV0dG9uQ2xpY2soZXYpOwoKCQkJCQkJCQkJCS8vIGFmdGVyIHRoZSBjbGljayBhY3Rpb24sIGlmIHRoZSBidXR0b24gYmVjb21lcyB0aGUgImFjdGl2ZSIgdGFiLCBvciBkaXNhYmxlZCwKCQkJCQkJCQkJCS8vIGl0IHNob3VsZCBuZXZlciBoYXZlIGEgaG92ZXIgY2xhc3MsIHNvIHJlbW92ZSBpdCBub3cuCgkJCQkJCQkJCQlpZiAoCgkJCQkJCQkJCQkJYnV0dG9uLmhhc0NsYXNzKHRtICsgJy1zdGF0ZS1hY3RpdmUnKSB8fAoJCQkJCQkJCQkJCWJ1dHRvbi5oYXNDbGFzcyh0bSArICctc3RhdGUtZGlzYWJsZWQnKQoJCQkJCQkJCQkJKSB7CgkJCQkJCQkJCQkJYnV0dG9uLnJlbW92ZUNsYXNzKHRtICsgJy1zdGF0ZS1ob3ZlcicpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfSkKCQkJCQkJCQkubW91c2Vkb3duKGZ1bmN0aW9uKCkgewoJCQkJCQkJCQkvLyB0aGUgKmRvd24qIGVmZmVjdCAobW91c2UgcHJlc3NlZCBpbikuCgkJCQkJCQkJCS8vIG9ubHkgb24gYnV0dG9ucyB0aGF0IGFyZSBub3QgdGhlICJhY3RpdmUiIHRhYiwgb3IgZGlzYWJsZWQKCQkJCQkJCQkJYnV0dG9uCgkJCQkJCQkJCQkubm90KCcuJyArIHRtICsgJy1zdGF0ZS1hY3RpdmUnKQoJCQkJCQkJCQkJLm5vdCgnLicgKyB0bSArICctc3RhdGUtZGlzYWJsZWQnKQoJCQkJCQkJCQkJLmFkZENsYXNzKHRtICsgJy1zdGF0ZS1kb3duJyk7CgkJCQkJCQkJfSkKCQkJCQkJCQkubW91c2V1cChmdW5jdGlvbigpIHsKCQkJCQkJCQkJLy8gdW5kbyB0aGUgKmRvd24qIGVmZmVjdAoJCQkJCQkJCQlidXR0b24ucmVtb3ZlQ2xhc3ModG0gKyAnLXN0YXRlLWRvd24nKTsKCQkJCQkJCQl9KQoJCQkJCQkJCS5ob3ZlcigKCQkJCQkJCQkJZnVuY3Rpb24oKSB7CgkJCQkJCQkJCQkvLyB0aGUgKmhvdmVyKiBlZmZlY3QuCgkJCQkJCQkJCQkvLyBvbmx5IG9uIGJ1dHRvbnMgdGhhdCBhcmUgbm90IHRoZSAiYWN0aXZlIiB0YWIsIG9yIGRpc2FibGVkCgkJCQkJCQkJCQlidXR0b24KCQkJCQkJCQkJCQkubm90KCcuJyArIHRtICsgJy1zdGF0ZS1hY3RpdmUnKQoJCQkJCQkJCQkJCS5ub3QoJy4nICsgdG0gKyAnLXN0YXRlLWRpc2FibGVkJykKCQkJCQkJCQkJCQkuYWRkQ2xhc3ModG0gKyAnLXN0YXRlLWhvdmVyJyk7CgkJCQkJCQkJCX0sCgkJCQkJCQkJCWZ1bmN0aW9uKCkgewoJCQkJCQkJCQkJLy8gdW5kbyB0aGUgKmhvdmVyKiBlZmZlY3QKCQkJCQkJCQkJCWJ1dHRvbgoJCQkJCQkJCQkJCS5yZW1vdmVDbGFzcyh0bSArICctc3RhdGUtaG92ZXInKQoJCQkJCQkJCQkJCS5yZW1vdmVDbGFzcyh0bSArICctc3RhdGUtZG93bicpOyAvLyBpZiBtb3VzZWxlYXZlIGhhcHBlbnMgYmVmb3JlIG1vdXNldXAKCQkJCQkJCQkJfQoJCQkJCQkJCSk7CgoJCQkJCQkJZ3JvdXBDaGlsZHJlbiA9IGdyb3VwQ2hpbGRyZW4uYWRkKGJ1dHRvbik7CgkJCQkJCX0KCQkJCQl9CgkJCQl9KTsKCgkJCQlpZiAoaXNPbmx5QnV0dG9ucykgewoJCQkJCWdyb3VwQ2hpbGRyZW4KCQkJCQkJLmZpcnN0KCkuYWRkQ2xhc3ModG0gKyAnLWNvcm5lci1sZWZ0JykuZW5kKCkKCQkJCQkJLmxhc3QoKS5hZGRDbGFzcyh0bSArICctY29ybmVyLXJpZ2h0JykuZW5kKCk7CgkJCQl9CgoJCQkJaWYgKGdyb3VwQ2hpbGRyZW4ubGVuZ3RoID4gMSkgewoJCQkJCWdyb3VwRWwgPSAkKCc8ZGl2Lz4nKTsKCQkJCQlpZiAoaXNPbmx5QnV0dG9ucykgewoJCQkJCQlncm91cEVsLmFkZENsYXNzKCdmYy1idXR0b24tZ3JvdXAnKTsKCQkJCQl9CgkJCQkJZ3JvdXBFbC5hcHBlbmQoZ3JvdXBDaGlsZHJlbik7CgkJCQkJc2VjdGlvbkVsLmFwcGVuZChncm91cEVsKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCXNlY3Rpb25FbC5hcHBlbmQoZ3JvdXBDaGlsZHJlbik7IC8vIDEgb3IgMCBjaGlsZHJlbgoJCQkJfQoJCQl9KTsKCQl9CgoJCXJldHVybiBzZWN0aW9uRWw7Cgl9CgkKCQoJZnVuY3Rpb24gdXBkYXRlVGl0bGUodGV4dCkgewoJCWlmIChlbCkgewoJCQllbC5maW5kKCdoMicpLnRleHQodGV4dCk7CgkJfQoJfQoJCgkKCWZ1bmN0aW9uIGFjdGl2YXRlQnV0dG9uKGJ1dHRvbk5hbWUpIHsKCQlpZiAoZWwpIHsKCQkJZWwuZmluZCgnLmZjLScgKyBidXR0b25OYW1lICsgJy1idXR0b24nKQoJCQkJLmFkZENsYXNzKHRtICsgJy1zdGF0ZS1hY3RpdmUnKTsKCQl9Cgl9CgkKCQoJZnVuY3Rpb24gZGVhY3RpdmF0ZUJ1dHRvbihidXR0b25OYW1lKSB7CgkJaWYgKGVsKSB7CgkJCWVsLmZpbmQoJy5mYy0nICsgYnV0dG9uTmFtZSArICctYnV0dG9uJykKCQkJCS5yZW1vdmVDbGFzcyh0bSArICctc3RhdGUtYWN0aXZlJyk7CgkJfQoJfQoJCgkKCWZ1bmN0aW9uIGRpc2FibGVCdXR0b24oYnV0dG9uTmFtZSkgewoJCWlmIChlbCkgewoJCQllbC5maW5kKCcuZmMtJyArIGJ1dHRvbk5hbWUgKyAnLWJ1dHRvbicpCgkJCQkucHJvcCgnZGlzYWJsZWQnLCB0cnVlKQoJCQkJLmFkZENsYXNzKHRtICsgJy1zdGF0ZS1kaXNhYmxlZCcpOwoJCX0KCX0KCQoJCglmdW5jdGlvbiBlbmFibGVCdXR0b24oYnV0dG9uTmFtZSkgewoJCWlmIChlbCkgewoJCQllbC5maW5kKCcuZmMtJyArIGJ1dHRvbk5hbWUgKyAnLWJ1dHRvbicpCgkJCQkucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKCQkJCS5yZW1vdmVDbGFzcyh0bSArICctc3RhdGUtZGlzYWJsZWQnKTsKCQl9Cgl9CgoKCWZ1bmN0aW9uIGdldFZpZXdzV2l0aEJ1dHRvbnMoKSB7CgkJcmV0dXJuIHZpZXdzV2l0aEJ1dHRvbnM7Cgl9Cgp9Cgo7OwoKRkMuc291cmNlTm9ybWFsaXplcnMgPSBbXTsKRkMuc291cmNlRmV0Y2hlcnMgPSBbXTsKCnZhciBhamF4RGVmYXVsdHMgPSB7CglkYXRhVHlwZTogJ2pzb24nLAoJY2FjaGU6IGZhbHNlCn07Cgp2YXIgZXZlbnRHVUlEID0gMTsKCgpmdW5jdGlvbiBFdmVudE1hbmFnZXIoKSB7IC8vIGFzc3VtZWQgdG8gYmUgYSBjYWxlbmRhcgoJdmFyIHQgPSB0aGlzOwoJCgkKCS8vIGV4cG9ydHMKCXQuaXNGZXRjaE5lZWRlZCA9IGlzRmV0Y2hOZWVkZWQ7Cgl0LmZldGNoRXZlbnRzID0gZmV0Y2hFdmVudHM7Cgl0LmZldGNoRXZlbnRTb3VyY2VzID0gZmV0Y2hFdmVudFNvdXJjZXM7Cgl0LmdldEV2ZW50U291cmNlcyA9IGdldEV2ZW50U291cmNlczsKCXQuZ2V0RXZlbnRTb3VyY2VCeUlkID0gZ2V0RXZlbnRTb3VyY2VCeUlkOwoJdC5nZXRFdmVudFNvdXJjZXNCeU1hdGNoQXJyYXkgPSBnZXRFdmVudFNvdXJjZXNCeU1hdGNoQXJyYXk7Cgl0LmdldEV2ZW50U291cmNlc0J5TWF0Y2ggPSBnZXRFdmVudFNvdXJjZXNCeU1hdGNoOwoJdC5hZGRFdmVudFNvdXJjZSA9IGFkZEV2ZW50U291cmNlOwoJdC5yZW1vdmVFdmVudFNvdXJjZSA9IHJlbW92ZUV2ZW50U291cmNlOwoJdC5yZW1vdmVFdmVudFNvdXJjZXMgPSByZW1vdmVFdmVudFNvdXJjZXM7Cgl0LnVwZGF0ZUV2ZW50ID0gdXBkYXRlRXZlbnQ7Cgl0LnJlbmRlckV2ZW50ID0gcmVuZGVyRXZlbnQ7Cgl0LnJlbW92ZUV2ZW50cyA9IHJlbW92ZUV2ZW50czsKCXQuY2xpZW50RXZlbnRzID0gY2xpZW50RXZlbnRzOwoJdC5tdXRhdGVFdmVudCA9IG11dGF0ZUV2ZW50OwoJdC5ub3JtYWxpemVFdmVudERhdGVzID0gbm9ybWFsaXplRXZlbnREYXRlczsKCXQubm9ybWFsaXplRXZlbnRUaW1lcyA9IG5vcm1hbGl6ZUV2ZW50VGltZXM7CgkKCQoJLy8gaW1wb3J0cwoJdmFyIHJlcG9ydEV2ZW50cyA9IHQucmVwb3J0RXZlbnRzOwoJCgkKCS8vIGxvY2FscwoJdmFyIHN0aWNreVNvdXJjZSA9IHsgZXZlbnRzOiBbXSB9OwoJdmFyIHNvdXJjZXMgPSBbIHN0aWNreVNvdXJjZSBdOwoJdmFyIHJhbmdlU3RhcnQsIHJhbmdlRW5kOwoJdmFyIHBlbmRpbmdTb3VyY2VDbnQgPSAwOyAvLyBvdXRzdGFuZGluZyBmZXRjaCByZXF1ZXN0cywgbWF4IG9uZSBwZXIgc291cmNlCgl2YXIgY2FjaGUgPSBbXTsgLy8gaG9sZHMgZXZlbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZXhwYW5kZWQKCgoJJC5lYWNoKAoJCSh0Lm9wdGlvbnMuZXZlbnRzID8gWyB0Lm9wdGlvbnMuZXZlbnRzIF0gOiBbXSkuY29uY2F0KHQub3B0aW9ucy5ldmVudFNvdXJjZXMgfHwgW10pLAoJCWZ1bmN0aW9uKGksIHNvdXJjZUlucHV0KSB7CgkJCXZhciBzb3VyY2UgPSBidWlsZEV2ZW50U291cmNlKHNvdXJjZUlucHV0KTsKCQkJaWYgKHNvdXJjZSkgewoJCQkJc291cmNlcy5wdXNoKHNvdXJjZSk7CgkJCX0KCQl9CgkpOwoJCgkKCQoJLyogRmV0Y2hpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gc3RhcnQgYW5kIGVuZCBhcmUgYXNzdW1lZCB0byBiZSB1bnpvbmVkCglmdW5jdGlvbiBpc0ZldGNoTmVlZGVkKHN0YXJ0LCBlbmQpIHsKCQlyZXR1cm4gIXJhbmdlU3RhcnQgfHwgLy8gbm90aGluZyBoYXMgYmVlbiBmZXRjaGVkIHlldD8KCQkJc3RhcnQgPCByYW5nZVN0YXJ0IHx8IGVuZCA+IHJhbmdlRW5kOyAvLyBpcyBwYXJ0IG9mIHRoZSBuZXcgcmFuZ2Ugb3V0c2lkZSBvZiB0aGUgb2xkIHJhbmdlPwoJfQoJCgkKCWZ1bmN0aW9uIGZldGNoRXZlbnRzKHN0YXJ0LCBlbmQpIHsKCQlyYW5nZVN0YXJ0ID0gc3RhcnQ7CgkJcmFuZ2VFbmQgPSBlbmQ7CgkJZmV0Y2hFdmVudFNvdXJjZXMoc291cmNlcywgJ3Jlc2V0Jyk7Cgl9CgoKCS8vIGV4cGVjdHMgYW4gYXJyYXkgb2YgZXZlbnQgc291cmNlIG9iamVjdHMgKHRoZSBvcmlnaW5hbHMsIG5vdCBjb3BpZXMpCgkvLyBgc3BlY2lhbEZldGNoVHlwZWAgaXMgYW4gb3B0aW1pemF0aW9uIHBhcmFtZXRlciB0aGF0IGFmZmVjdHMgcHVyZ2luZyBvZiB0aGUgZXZlbnQgY2FjaGUuCglmdW5jdGlvbiBmZXRjaEV2ZW50U291cmNlcyhzcGVjaWZpY1NvdXJjZXMsIHNwZWNpYWxGZXRjaFR5cGUpIHsKCQl2YXIgaSwgc291cmNlOwoKCQlpZiAoc3BlY2lhbEZldGNoVHlwZSA9PT0gJ3Jlc2V0JykgewoJCQljYWNoZSA9IFtdOwoJCX0KCQllbHNlIGlmIChzcGVjaWFsRmV0Y2hUeXBlICE9PSAnYWRkJykgewoJCQljYWNoZSA9IGV4Y2x1ZGVFdmVudHNCeVNvdXJjZXMoY2FjaGUsIHNwZWNpZmljU291cmNlcyk7CgkJfQoKCQlmb3IgKGkgPSAwOyBpIDwgc3BlY2lmaWNTb3VyY2VzLmxlbmd0aDsgaSsrKSB7CgkJCXNvdXJjZSA9IHNwZWNpZmljU291cmNlc1tpXTsKCgkJCS8vIGFscmVhZHktcGVuZGluZyBzb3VyY2VzIGhhdmUgYWxyZWFkeSBiZWVuIGFjY291bnRlZCBmb3IgaW4gcGVuZGluZ1NvdXJjZUNudAoJCQlpZiAoc291cmNlLl9zdGF0dXMgIT09ICdwZW5kaW5nJykgewoJCQkJcGVuZGluZ1NvdXJjZUNudCsrOwoJCQl9CgoJCQlzb3VyY2UuX2ZldGNoSWQgPSAoc291cmNlLl9mZXRjaElkIHx8IDApICsgMTsKCQkJc291cmNlLl9zdGF0dXMgPSAncGVuZGluZyc7CgkJfQoKCQlmb3IgKGkgPSAwOyBpIDwgc3BlY2lmaWNTb3VyY2VzLmxlbmd0aDsgaSsrKSB7CgkJCXNvdXJjZSA9IHNwZWNpZmljU291cmNlc1tpXTsKCgkJCXRyeUZldGNoRXZlbnRTb3VyY2Uoc291cmNlLCBzb3VyY2UuX2ZldGNoSWQpOwoJCX0KCX0KCgoJLy8gZmV0Y2hlcyBhbiBldmVudCBzb3VyY2UgYW5kIHByb2Nlc3NlcyBpdHMgcmVzdWx0IE9OTFkgaWYgaXQgaXMgc3RpbGwgdGhlIGN1cnJlbnQgZmV0Y2guCgkvLyBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGluY3JlbWVudGluZyBwZW5kaW5nU291cmNlQ250IGZpcnN0LgoJZnVuY3Rpb24gdHJ5RmV0Y2hFdmVudFNvdXJjZShzb3VyY2UsIGZldGNoSWQpIHsKCQlfZmV0Y2hFdmVudFNvdXJjZShzb3VyY2UsIGZ1bmN0aW9uKGV2ZW50SW5wdXRzKSB7CgkJCXZhciBpc0FycmF5U291cmNlID0gJC5pc0FycmF5KHNvdXJjZS5ldmVudHMpOwoJCQl2YXIgaSwgZXZlbnRJbnB1dDsKCQkJdmFyIGFic3RyYWN0RXZlbnQ7CgoJCQlpZiAoCgkJCQkvLyBpcyB0aGlzIHRoZSBzb3VyY2UncyBtb3N0IHJlY2VudCBmZXRjaD8KCQkJCS8vIGlmIG5vdCwgcmVseSBvbiBhbiB1cGNvbWluZyBmZXRjaCBvZiB0aGlzIHNvdXJjZSB0byBkZWNyZW1lbnQgcGVuZGluZ1NvdXJjZUNudAoJCQkJZmV0Y2hJZCA9PT0gc291cmNlLl9mZXRjaElkICYmCgkJCQkvLyBldmVudCBzb3VyY2Ugbm8gbG9uZ2VyIHZhbGlkPwoJCQkJc291cmNlLl9zdGF0dXMgIT09ICdyZWplY3RlZCcKCQkJKSB7CgkJCQlzb3VyY2UuX3N0YXR1cyA9ICdyZXNvbHZlZCc7CgoJCQkJaWYgKGV2ZW50SW5wdXRzKSB7CgkJCQkJZm9yIChpID0gMDsgaSA8IGV2ZW50SW5wdXRzLmxlbmd0aDsgaSsrKSB7CgkJCQkJCWV2ZW50SW5wdXQgPSBldmVudElucHV0c1tpXTsKCgkJCQkJCWlmIChpc0FycmF5U291cmNlKSB7IC8vIGFycmF5IHNvdXJjZXMgaGF2ZSBhbHJlYWR5IGJlZW4gY29udmVydCB0byBFdmVudCBPYmplY3RzCgkJCQkJCQlhYnN0cmFjdEV2ZW50ID0gZXZlbnRJbnB1dDsKCQkJCQkJfQoJCQkJCQllbHNlIHsKCQkJCQkJCWFic3RyYWN0RXZlbnQgPSBidWlsZEV2ZW50RnJvbUlucHV0KGV2ZW50SW5wdXQsIHNvdXJjZSk7CgkJCQkJCX0KCgkJCQkJCWlmIChhYnN0cmFjdEV2ZW50KSB7IC8vIG5vdCBmYWxzZSAoYW4gaW52YWxpZCBldmVudCkKCQkJCQkJCWNhY2hlLnB1c2guYXBwbHkoCgkJCQkJCQkJY2FjaGUsCgkJCQkJCQkJZXhwYW5kRXZlbnQoYWJzdHJhY3RFdmVudCkgLy8gYWRkIGluZGl2aWR1YWwgZXhwYW5kZWQgZXZlbnRzIHRvIHRoZSBjYWNoZQoJCQkJCQkJKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlkZWNyZW1lbnRQZW5kaW5nU291cmNlQ250KCk7CgkJCX0KCQl9KTsKCX0KCgoJZnVuY3Rpb24gcmVqZWN0RXZlbnRTb3VyY2Uoc291cmNlKSB7CgkJdmFyIHdhc1BlbmRpbmcgPSBzb3VyY2UuX3N0YXR1cyA9PT0gJ3BlbmRpbmcnOwoKCQlzb3VyY2UuX3N0YXR1cyA9ICdyZWplY3RlZCc7CgoJCWlmICh3YXNQZW5kaW5nKSB7CgkJCWRlY3JlbWVudFBlbmRpbmdTb3VyY2VDbnQoKTsKCQl9Cgl9CgoKCWZ1bmN0aW9uIGRlY3JlbWVudFBlbmRpbmdTb3VyY2VDbnQoKSB7CgkJcGVuZGluZ1NvdXJjZUNudC0tOwoJCWlmICghcGVuZGluZ1NvdXJjZUNudCkgewoJCQlyZXBvcnRFdmVudHMoY2FjaGUpOwoJCX0KCX0KCQoJCglmdW5jdGlvbiBfZmV0Y2hFdmVudFNvdXJjZShzb3VyY2UsIGNhbGxiYWNrKSB7CgkJdmFyIGk7CgkJdmFyIGZldGNoZXJzID0gRkMuc291cmNlRmV0Y2hlcnM7CgkJdmFyIHJlczsKCgkJZm9yIChpPTA7IGk8ZmV0Y2hlcnMubGVuZ3RoOyBpKyspIHsKCQkJcmVzID0gZmV0Y2hlcnNbaV0uY2FsbCgKCQkJCXQsIC8vIHRoaXMsIHRoZSBDYWxlbmRhciBvYmplY3QKCQkJCXNvdXJjZSwKCQkJCXJhbmdlU3RhcnQuY2xvbmUoKSwKCQkJCXJhbmdlRW5kLmNsb25lKCksCgkJCQl0Lm9wdGlvbnMudGltZXpvbmUsCgkJCQljYWxsYmFjawoJCQkpOwoKCQkJaWYgKHJlcyA9PT0gdHJ1ZSkgewoJCQkJLy8gdGhlIGZldGNoZXIgaXMgaW4gY2hhcmdlLiBtYWRlIGl0cyBvd24gYXN5bmMgcmVxdWVzdAoJCQkJcmV0dXJuOwoJCQl9CgkJCWVsc2UgaWYgKHR5cGVvZiByZXMgPT0gJ29iamVjdCcpIHsKCQkJCS8vIHRoZSBmZXRjaGVyIHJldHVybmVkIGEgbmV3IHNvdXJjZS4gcHJvY2VzcyBpdAoJCQkJX2ZldGNoRXZlbnRTb3VyY2UocmVzLCBjYWxsYmFjayk7CgkJCQlyZXR1cm47CgkJCX0KCQl9CgoJCXZhciBldmVudHMgPSBzb3VyY2UuZXZlbnRzOwoJCWlmIChldmVudHMpIHsKCQkJaWYgKCQuaXNGdW5jdGlvbihldmVudHMpKSB7CgkJCQl0LnB1c2hMb2FkaW5nKCk7CgkJCQlldmVudHMuY2FsbCgKCQkJCQl0LCAvLyB0aGlzLCB0aGUgQ2FsZW5kYXIgb2JqZWN0CgkJCQkJcmFuZ2VTdGFydC5jbG9uZSgpLAoJCQkJCXJhbmdlRW5kLmNsb25lKCksCgkJCQkJdC5vcHRpb25zLnRpbWV6b25lLAoJCQkJCWZ1bmN0aW9uKGV2ZW50cykgewoJCQkJCQljYWxsYmFjayhldmVudHMpOwoJCQkJCQl0LnBvcExvYWRpbmcoKTsKCQkJCQl9CgkJCQkpOwoJCQl9CgkJCWVsc2UgaWYgKCQuaXNBcnJheShldmVudHMpKSB7CgkJCQljYWxsYmFjayhldmVudHMpOwoJCQl9CgkJCWVsc2UgewoJCQkJY2FsbGJhY2soKTsKCQkJfQoJCX1lbHNlewoJCQl2YXIgdXJsID0gc291cmNlLnVybDsKCQkJaWYgKHVybCkgewoJCQkJdmFyIHN1Y2Nlc3MgPSBzb3VyY2Uuc3VjY2VzczsKCQkJCXZhciBlcnJvciA9IHNvdXJjZS5lcnJvcjsKCQkJCXZhciBjb21wbGV0ZSA9IHNvdXJjZS5jb21wbGV0ZTsKCgkJCQkvLyByZXRyaWV2ZSBhbnkgb3V0Ym91bmQgR0VUL1BPU1QgJC5hamF4IGRhdGEgZnJvbSB0aGUgb3B0aW9ucwoJCQkJdmFyIGN1c3RvbURhdGE7CgkJCQlpZiAoJC5pc0Z1bmN0aW9uKHNvdXJjZS5kYXRhKSkgewoJCQkJCS8vIHN1cHBsaWVkIGFzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEga2V5L3ZhbHVlIG9iamVjdAoJCQkJCWN1c3RvbURhdGEgPSBzb3VyY2UuZGF0YSgpOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJLy8gc3VwcGxpZWQgYXMgYSBzdHJhaWdodCBrZXkvdmFsdWUgb2JqZWN0CgkJCQkJY3VzdG9tRGF0YSA9IHNvdXJjZS5kYXRhOwoJCQkJfQoKCQkJCS8vIHVzZSBhIGNvcHkgb2YgdGhlIGN1c3RvbSBkYXRhIHNvIHdlIGNhbiBtb2RpZnkgdGhlIHBhcmFtZXRlcnMKCQkJCS8vIGFuZCBub3QgYWZmZWN0IHRoZSBwYXNzZWQtaW4gb2JqZWN0LgoJCQkJdmFyIGRhdGEgPSAkLmV4dGVuZCh7fSwgY3VzdG9tRGF0YSB8fCB7fSk7CgoJCQkJdmFyIHN0YXJ0UGFyYW0gPSBmaXJzdERlZmluZWQoc291cmNlLnN0YXJ0UGFyYW0sIHQub3B0aW9ucy5zdGFydFBhcmFtKTsKCQkJCXZhciBlbmRQYXJhbSA9IGZpcnN0RGVmaW5lZChzb3VyY2UuZW5kUGFyYW0sIHQub3B0aW9ucy5lbmRQYXJhbSk7CgkJCQl2YXIgdGltZXpvbmVQYXJhbSA9IGZpcnN0RGVmaW5lZChzb3VyY2UudGltZXpvbmVQYXJhbSwgdC5vcHRpb25zLnRpbWV6b25lUGFyYW0pOwoKCQkJCWlmIChzdGFydFBhcmFtKSB7CgkJCQkJZGF0YVtzdGFydFBhcmFtXSA9IHJhbmdlU3RhcnQuZm9ybWF0KCk7CgkJCQl9CgkJCQlpZiAoZW5kUGFyYW0pIHsKCQkJCQlkYXRhW2VuZFBhcmFtXSA9IHJhbmdlRW5kLmZvcm1hdCgpOwoJCQkJfQoJCQkJaWYgKHQub3B0aW9ucy50aW1lem9uZSAmJiB0Lm9wdGlvbnMudGltZXpvbmUgIT0gJ2xvY2FsJykgewoJCQkJCWRhdGFbdGltZXpvbmVQYXJhbV0gPSB0Lm9wdGlvbnMudGltZXpvbmU7CgkJCQl9CgoJCQkJdC5wdXNoTG9hZGluZygpOwoJCQkJJC5hamF4KCQuZXh0ZW5kKHt9LCBhamF4RGVmYXVsdHMsIHNvdXJjZSwgewoJCQkJCWRhdGE6IGRhdGEsCgkJCQkJc3VjY2VzczogZnVuY3Rpb24oZXZlbnRzKSB7CgkJCQkJCWV2ZW50cyA9IGV2ZW50cyB8fCBbXTsKCQkJCQkJdmFyIHJlcyA9IGFwcGx5QWxsKHN1Y2Nlc3MsIHRoaXMsIGFyZ3VtZW50cyk7CgkJCQkJCWlmICgkLmlzQXJyYXkocmVzKSkgewoJCQkJCQkJZXZlbnRzID0gcmVzOwoJCQkJCQl9CgkJCQkJCWNhbGxiYWNrKGV2ZW50cyk7CgkJCQkJfSwKCQkJCQllcnJvcjogZnVuY3Rpb24oKSB7CgkJCQkJCWFwcGx5QWxsKGVycm9yLCB0aGlzLCBhcmd1bWVudHMpOwoJCQkJCQljYWxsYmFjaygpOwoJCQkJCX0sCgkJCQkJY29tcGxldGU6IGZ1bmN0aW9uKCkgewoJCQkJCQlhcHBseUFsbChjb21wbGV0ZSwgdGhpcywgYXJndW1lbnRzKTsKCQkJCQkJdC5wb3BMb2FkaW5nKCk7CgkJCQkJfQoJCQkJfSkpOwoJCQl9ZWxzZXsKCQkJCWNhbGxiYWNrKCk7CgkJCX0KCQl9Cgl9CgkKCQoJCgkvKiBTb3VyY2VzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCWZ1bmN0aW9uIGFkZEV2ZW50U291cmNlKHNvdXJjZUlucHV0KSB7CgkJdmFyIHNvdXJjZSA9IGJ1aWxkRXZlbnRTb3VyY2Uoc291cmNlSW5wdXQpOwoJCWlmIChzb3VyY2UpIHsKCQkJc291cmNlcy5wdXNoKHNvdXJjZSk7CgkJCWZldGNoRXZlbnRTb3VyY2VzKFsgc291cmNlIF0sICdhZGQnKTsgLy8gd2lsbCBldmVudHVhbGx5IGNhbGwgcmVwb3J0RXZlbnRzCgkJfQoJfQoKCglmdW5jdGlvbiBidWlsZEV2ZW50U291cmNlKHNvdXJjZUlucHV0KSB7IC8vIHdpbGwgcmV0dXJuIHVuZGVmaW5lZCBpZiBpbnZhbGlkIHNvdXJjZQoJCXZhciBub3JtYWxpemVycyA9IEZDLnNvdXJjZU5vcm1hbGl6ZXJzOwoJCXZhciBzb3VyY2U7CgkJdmFyIGk7CgoJCWlmICgkLmlzRnVuY3Rpb24oc291cmNlSW5wdXQpIHx8ICQuaXNBcnJheShzb3VyY2VJbnB1dCkpIHsKCQkJc291cmNlID0geyBldmVudHM6IHNvdXJjZUlucHV0IH07CgkJfQoJCWVsc2UgaWYgKHR5cGVvZiBzb3VyY2VJbnB1dCA9PT0gJ3N0cmluZycpIHsKCQkJc291cmNlID0geyB1cmw6IHNvdXJjZUlucHV0IH07CgkJfQoJCWVsc2UgaWYgKHR5cGVvZiBzb3VyY2VJbnB1dCA9PT0gJ29iamVjdCcpIHsKCQkJc291cmNlID0gJC5leHRlbmQoe30sIHNvdXJjZUlucHV0KTsgLy8gc2hhbGxvdyBjb3B5CgkJfQoKCQlpZiAoc291cmNlKSB7CgoJCQkvLyBUT0RPOiByZXBlYXQgY29kZSwgc2FtZSBjb2RlIGZvciBldmVudCBjbGFzc05hbWVzCgkJCWlmIChzb3VyY2UuY2xhc3NOYW1lKSB7CgkJCQlpZiAodHlwZW9mIHNvdXJjZS5jbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7CgkJCQkJc291cmNlLmNsYXNzTmFtZSA9IHNvdXJjZS5jbGFzc05hbWUuc3BsaXQoL1xzKy8pOwoJCQkJfQoJCQkJLy8gb3RoZXJ3aXNlLCBhc3N1bWVkIHRvIGJlIGFuIGFycmF5CgkJCX0KCQkJZWxzZSB7CgkJCQlzb3VyY2UuY2xhc3NOYW1lID0gW107CgkJCX0KCgkJCS8vIGZvciBhcnJheSBzb3VyY2VzLCB3ZSBjb252ZXJ0IHRvIHN0YW5kYXJkIEV2ZW50IE9iamVjdHMgdXAgZnJvbnQKCQkJaWYgKCQuaXNBcnJheShzb3VyY2UuZXZlbnRzKSkgewoJCQkJc291cmNlLm9yaWdBcnJheSA9IHNvdXJjZS5ldmVudHM7IC8vIGZvciByZW1vdmVFdmVudFNvdXJjZQoJCQkJc291cmNlLmV2ZW50cyA9ICQubWFwKHNvdXJjZS5ldmVudHMsIGZ1bmN0aW9uKGV2ZW50SW5wdXQpIHsKCQkJCQlyZXR1cm4gYnVpbGRFdmVudEZyb21JbnB1dChldmVudElucHV0LCBzb3VyY2UpOwoJCQkJfSk7CgkJCX0KCgkJCWZvciAoaT0wOyBpPG5vcm1hbGl6ZXJzLmxlbmd0aDsgaSsrKSB7CgkJCQlub3JtYWxpemVyc1tpXS5jYWxsKHQsIHNvdXJjZSk7CgkJCX0KCgkJCXJldHVybiBzb3VyY2U7CgkJfQoJfQoKCglmdW5jdGlvbiByZW1vdmVFdmVudFNvdXJjZShtYXRjaElucHV0KSB7CgkJcmVtb3ZlU3BlY2lmaWNFdmVudFNvdXJjZXMoCgkJCWdldEV2ZW50U291cmNlc0J5TWF0Y2gobWF0Y2hJbnB1dCkKCQkpOwoJfQoKCgkvLyBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMsIHJlbW92ZXMgYWxsLgoJZnVuY3Rpb24gcmVtb3ZlRXZlbnRTb3VyY2VzKG1hdGNoSW5wdXRzKSB7CgkJaWYgKG1hdGNoSW5wdXRzID09IG51bGwpIHsKCQkJcmVtb3ZlU3BlY2lmaWNFdmVudFNvdXJjZXMoc291cmNlcywgdHJ1ZSk7IC8vIGlzQWxsPXRydWUKCQl9CgkJZWxzZSB7CgkJCXJlbW92ZVNwZWNpZmljRXZlbnRTb3VyY2VzKAoJCQkJZ2V0RXZlbnRTb3VyY2VzQnlNYXRjaEFycmF5KG1hdGNoSW5wdXRzKQoJCQkpOwoJCX0KCX0KCgoJZnVuY3Rpb24gcmVtb3ZlU3BlY2lmaWNFdmVudFNvdXJjZXModGFyZ2V0U291cmNlcywgaXNBbGwpIHsKCQl2YXIgaTsKCgkJLy8gY2FuY2VsIHBlbmRpbmcgcmVxdWVzdHMKCQlmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0U291cmNlcy5sZW5ndGg7IGkrKykgewoJCQlyZWplY3RFdmVudFNvdXJjZSh0YXJnZXRTb3VyY2VzW2ldKTsKCQl9CgoJCWlmIChpc0FsbCkgeyAvLyBhbiBvcHRpbWl6YXRpb24KCQkJc291cmNlcyA9IFtdOwoJCQljYWNoZSA9IFtdOwoJCX0KCQllbHNlIHsKCQkJLy8gcmVtb3ZlIGZyb20gcGVyc2lzdGVkIHNvdXJjZSBsaXN0CgkJCXNvdXJjZXMgPSAkLmdyZXAoc291cmNlcywgZnVuY3Rpb24oc291cmNlKSB7CgkJCQlmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0U291cmNlcy5sZW5ndGg7IGkrKykgewoJCQkJCWlmIChzb3VyY2UgPT09IHRhcmdldFNvdXJjZXNbaV0pIHsKCQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBleGNsdWRlCgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIHRydWU7IC8vIGluY2x1ZGUKCQkJfSk7CgoJCQljYWNoZSA9IGV4Y2x1ZGVFdmVudHNCeVNvdXJjZXMoY2FjaGUsIHRhcmdldFNvdXJjZXMpOwoJCX0KCgkJcmVwb3J0RXZlbnRzKGNhY2hlKTsKCX0KCgoJZnVuY3Rpb24gZ2V0RXZlbnRTb3VyY2VzKCkgewoJCXJldHVybiBzb3VyY2VzLnNsaWNlKDEpOyAvLyByZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHNvdXJjZXMgd2l0aCBzdGlja3lTb3VyY2UgcmVtb3ZlZAoJfQoKCglmdW5jdGlvbiBnZXRFdmVudFNvdXJjZUJ5SWQoaWQpIHsKCQlyZXR1cm4gJC5ncmVwKHNvdXJjZXMsIGZ1bmN0aW9uKHNvdXJjZSkgewoJCQlyZXR1cm4gc291cmNlLmlkICYmIHNvdXJjZS5pZCA9PT0gaWQ7CgkJfSlbMF07Cgl9CgoKCS8vIGxpa2UgZ2V0RXZlbnRTb3VyY2VzQnlNYXRjaCwgYnV0IGFjY2VwdHMgbXVsdHBsZSBtYXRjaCBjcml0ZXJpYSAobGlrZSBtdWx0aXBsZSBJRHMpCglmdW5jdGlvbiBnZXRFdmVudFNvdXJjZXNCeU1hdGNoQXJyYXkobWF0Y2hJbnB1dHMpIHsKCgkJLy8gY29lcmNlIGludG8gYW4gYXJyYXkKCQlpZiAoIW1hdGNoSW5wdXRzKSB7CgkJCW1hdGNoSW5wdXRzID0gW107CgkJfQoJCWVsc2UgaWYgKCEkLmlzQXJyYXkobWF0Y2hJbnB1dHMpKSB7CgkJCW1hdGNoSW5wdXRzID0gWyBtYXRjaElucHV0cyBdOwoJCX0KCgkJdmFyIG1hdGNoaW5nU291cmNlcyA9IFtdOwoJCXZhciBpOwoKCQkvLyByZXNvbHZlIHJhdyBpbnB1dHMgdG8gcmVhbCBldmVudCBzb3VyY2Ugb2JqZWN0cwoJCWZvciAoaSA9IDA7IGkgPCBtYXRjaElucHV0cy5sZW5ndGg7IGkrKykgewoJCQltYXRjaGluZ1NvdXJjZXMucHVzaC5hcHBseSggLy8gYXBwZW5kCgkJCQltYXRjaGluZ1NvdXJjZXMsCgkJCQlnZXRFdmVudFNvdXJjZXNCeU1hdGNoKG1hdGNoSW5wdXRzW2ldKQoJCQkpOwoJCX0KCgkJcmV0dXJuIG1hdGNoaW5nU291cmNlczsKCX0KCgoJLy8gbWF0Y2hJbnB1dCBjYW4gZWl0aGVyIGJ5IGEgcmVhbCBldmVudCBzb3VyY2Ugb2JqZWN0LCBhbiBJRCwgb3IgdGhlIGZ1bmN0aW9uL1VSTCBmb3IgdGhlIHNvdXJjZS4KCS8vIHJldHVybnMgYW4gYXJyYXkgb2YgbWF0Y2hpbmcgc291cmNlIG9iamVjdHMuCglmdW5jdGlvbiBnZXRFdmVudFNvdXJjZXNCeU1hdGNoKG1hdGNoSW5wdXQpIHsKCQl2YXIgaSwgc291cmNlOwoKCQkvLyBnaXZlbiBhbiBwcm9wZXIgZXZlbnQgc291cmNlIG9iamVjdAoJCWZvciAoaSA9IDA7IGkgPCBzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CgkJCXNvdXJjZSA9IHNvdXJjZXNbaV07CgkJCWlmIChzb3VyY2UgPT09IG1hdGNoSW5wdXQpIHsKCQkJCXJldHVybiBbIHNvdXJjZSBdOwoJCQl9CgkJfQoKCQkvLyBhbiBJRCBtYXRjaAoJCXNvdXJjZSA9IGdldEV2ZW50U291cmNlQnlJZChtYXRjaElucHV0KTsKCQlpZiAoc291cmNlKSB7CgkJCXJldHVybiBbIHNvdXJjZSBdOwoJCX0KCgkJcmV0dXJuICQuZ3JlcChzb3VyY2VzLCBmdW5jdGlvbihzb3VyY2UpIHsKCQkJcmV0dXJuIGlzU291cmNlc0VxdWl2YWxlbnQobWF0Y2hJbnB1dCwgc291cmNlKTsKCQl9KTsKCX0KCgoJZnVuY3Rpb24gaXNTb3VyY2VzRXF1aXZhbGVudChzb3VyY2UxLCBzb3VyY2UyKSB7CgkJcmV0dXJuIHNvdXJjZTEgJiYgc291cmNlMiAmJiBnZXRTb3VyY2VQcmltaXRpdmUoc291cmNlMSkgPT0gZ2V0U291cmNlUHJpbWl0aXZlKHNvdXJjZTIpOwoJfQoKCglmdW5jdGlvbiBnZXRTb3VyY2VQcmltaXRpdmUoc291cmNlKSB7CgkJcmV0dXJuICgKCQkJKHR5cGVvZiBzb3VyY2UgPT09ICdvYmplY3QnKSA/IC8vIGEgbm9ybWFsaXplZCBldmVudCBzb3VyY2U/CgkJCQkoc291cmNlLm9yaWdBcnJheSB8fCBzb3VyY2UuZ29vZ2xlQ2FsZW5kYXJJZCB8fCBzb3VyY2UudXJsIHx8IHNvdXJjZS5ldmVudHMpIDogLy8gZ2V0IHRoZSBwcmltaXRpdmUKCQkJCW51bGwKCQkpIHx8CgkJc291cmNlOyAvLyB0aGUgZ2l2ZW4gYXJndW1lbnQgKmlzKiB0aGUgcHJpbWl0aXZlCgl9CgoKCS8vIHV0aWwKCS8vIHJldHVybnMgYSBmaWx0ZXJlZCBhcnJheSB3aXRob3V0IGV2ZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGFueSBvZiB0aGUgZ2l2ZW4gc291cmNlcwoJZnVuY3Rpb24gZXhjbHVkZUV2ZW50c0J5U291cmNlcyhzcGVjaWZpY0V2ZW50cywgc3BlY2lmaWNTb3VyY2VzKSB7CgkJcmV0dXJuICQuZ3JlcChzcGVjaWZpY0V2ZW50cywgZnVuY3Rpb24oZXZlbnQpIHsKCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzcGVjaWZpY1NvdXJjZXMubGVuZ3RoOyBpKyspIHsKCQkJCWlmIChldmVudC5zb3VyY2UgPT09IHNwZWNpZmljU291cmNlc1tpXSkgewoJCQkJCXJldHVybiBmYWxzZTsgLy8gZXhjbHVkZQoJCQkJfQoJCQl9CgkJCXJldHVybiB0cnVlOyAvLyBrZWVwCgkJfSk7Cgl9CgkKCQoJCgkvKiBNYW5pcHVsYXRpb24KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gT25seSBldmVyIGNhbGxlZCBmcm9tIHRoZSBleHRlcm5hbGx5LWZhY2luZyBBUEkKCWZ1bmN0aW9uIHVwZGF0ZUV2ZW50KGV2ZW50KSB7CgoJCS8vIG1hc3NhZ2Ugc3RhcnQvZW5kIHZhbHVlcywgZXZlbiBpZiBkYXRlIHN0cmluZyB2YWx1ZXMKCQlldmVudC5zdGFydCA9IHQubW9tZW50KGV2ZW50LnN0YXJ0KTsKCQlpZiAoZXZlbnQuZW5kKSB7CgkJCWV2ZW50LmVuZCA9IHQubW9tZW50KGV2ZW50LmVuZCk7CgkJfQoJCWVsc2UgewoJCQlldmVudC5lbmQgPSBudWxsOwoJCX0KCgkJbXV0YXRlRXZlbnQoZXZlbnQsIGdldE1pc2NFdmVudFByb3BzKGV2ZW50KSk7IC8vIHdpbGwgaGFuZGxlIHN0YXJ0L2VuZC9hbGxEYXkgbm9ybWFsaXphdGlvbgoJCXJlcG9ydEV2ZW50cyhjYWNoZSk7IC8vIHJlcG9ydHMgZXZlbnQgbW9kaWZpY2F0aW9ucyAoc28gd2UgY2FuIHJlZHJhdykKCX0KCgoJLy8gUmV0dXJucyBhIGhhc2ggb2YgbWlzYyBldmVudCBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIGNvcGllZCBvdmVyIHRvIHJlbGF0ZWQgZXZlbnRzLgoJZnVuY3Rpb24gZ2V0TWlzY0V2ZW50UHJvcHMoZXZlbnQpIHsKCQl2YXIgcHJvcHMgPSB7fTsKCgkJJC5lYWNoKGV2ZW50LCBmdW5jdGlvbihuYW1lLCB2YWwpIHsKCQkJaWYgKGlzTWlzY0V2ZW50UHJvcE5hbWUobmFtZSkpIHsKCQkJCWlmICh2YWwgIT09IHVuZGVmaW5lZCAmJiBpc0F0b21pYyh2YWwpKSB7IC8vIGEgZGVmaW5lZCBub24tb2JqZWN0CgkJCQkJcHJvcHNbbmFtZV0gPSB2YWw7CgkJCQl9CgkJCX0KCQl9KTsKCgkJcmV0dXJuIHByb3BzOwoJfQoKCS8vIG5vbi1kYXRlLXJlbGF0ZWQsIG5vbi1pZC1yZWxhdGVkLCBub24tc2VjcmV0CglmdW5jdGlvbiBpc01pc2NFdmVudFByb3BOYW1lKG5hbWUpIHsKCQlyZXR1cm4gIS9eX3xeKGlkfGFsbERheXxzdGFydHxlbmQpJC8udGVzdChuYW1lKTsKCX0KCgkKCS8vIHJldHVybnMgdGhlIGV4cGFuZGVkIGV2ZW50cyB0aGF0IHdlcmUgY3JlYXRlZAoJZnVuY3Rpb24gcmVuZGVyRXZlbnQoZXZlbnRJbnB1dCwgc3RpY2spIHsKCQl2YXIgYWJzdHJhY3RFdmVudCA9IGJ1aWxkRXZlbnRGcm9tSW5wdXQoZXZlbnRJbnB1dCk7CgkJdmFyIGV2ZW50czsKCQl2YXIgaSwgZXZlbnQ7CgoJCWlmIChhYnN0cmFjdEV2ZW50KSB7IC8vIG5vdCBmYWxzZSAoYSB2YWxpZCBpbnB1dCkKCQkJZXZlbnRzID0gZXhwYW5kRXZlbnQoYWJzdHJhY3RFdmVudCk7CgoJCQlmb3IgKGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7CgkJCQlldmVudCA9IGV2ZW50c1tpXTsKCgkJCQlpZiAoIWV2ZW50LnNvdXJjZSkgewoJCQkJCWlmIChzdGljaykgewoJCQkJCQlzdGlja3lTb3VyY2UuZXZlbnRzLnB1c2goZXZlbnQpOwoJCQkJCQlldmVudC5zb3VyY2UgPSBzdGlja3lTb3VyY2U7CgkJCQkJfQoJCQkJCWNhY2hlLnB1c2goZXZlbnQpOwoJCQkJfQoJCQl9CgoJCQlyZXBvcnRFdmVudHMoY2FjaGUpOwoKCQkJcmV0dXJuIGV2ZW50czsKCQl9CgoJCXJldHVybiBbXTsKCX0KCQoJCglmdW5jdGlvbiByZW1vdmVFdmVudHMoZmlsdGVyKSB7CgkJdmFyIGV2ZW50SUQ7CgkJdmFyIGk7CgoJCWlmIChmaWx0ZXIgPT0gbnVsbCkgeyAvLyBudWxsIG9yIHVuZGVmaW5lZC4gcmVtb3ZlIGFsbCBldmVudHMKCQkJZmlsdGVyID0gZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9OyAvLyB3aWxsIGFsd2F5cyBtYXRjaAoJCX0KCQllbHNlIGlmICghJC5pc0Z1bmN0aW9uKGZpbHRlcikpIHsgLy8gYW4gZXZlbnQgSUQKCQkJZXZlbnRJRCA9IGZpbHRlciArICcnOwoJCQlmaWx0ZXIgPSBmdW5jdGlvbihldmVudCkgewoJCQkJcmV0dXJuIGV2ZW50Ll9pZCA9PSBldmVudElEOwoJCQl9OwoJCX0KCgkJLy8gUHVyZ2UgZXZlbnQocykgZnJvbSBvdXIgbG9jYWwgY2FjaGUKCQljYWNoZSA9ICQuZ3JlcChjYWNoZSwgZmlsdGVyLCB0cnVlKTsgLy8gaW52ZXJzZT10cnVlCgoJCS8vIFJlbW92ZSBldmVudHMgZnJvbSBhcnJheSBzb3VyY2VzLgoJCS8vIFRoaXMgd29ya3MgYmVjYXVzZSB0aGV5IGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8gb2ZmaWNpYWwgRXZlbnQgT2JqZWN0cyB1cCBmcm9udC4KCQkvLyAoYW5kIGFzIGEgcmVzdWx0LCBldmVudC5faWQgaGFzIGJlZW4gY2FsY3VsYXRlZCkuCgkJZm9yIChpPTA7IGk8c291cmNlcy5sZW5ndGg7IGkrKykgewoJCQlpZiAoJC5pc0FycmF5KHNvdXJjZXNbaV0uZXZlbnRzKSkgewoJCQkJc291cmNlc1tpXS5ldmVudHMgPSAkLmdyZXAoc291cmNlc1tpXS5ldmVudHMsIGZpbHRlciwgdHJ1ZSk7CgkJCX0KCQl9CgoJCXJlcG9ydEV2ZW50cyhjYWNoZSk7Cgl9CgoJCglmdW5jdGlvbiBjbGllbnRFdmVudHMoZmlsdGVyKSB7CgkJaWYgKCQuaXNGdW5jdGlvbihmaWx0ZXIpKSB7CgkJCXJldHVybiAkLmdyZXAoY2FjaGUsIGZpbHRlcik7CgkJfQoJCWVsc2UgaWYgKGZpbHRlciAhPSBudWxsKSB7IC8vIG5vdCBudWxsLCBub3QgdW5kZWZpbmVkLiBhbiBldmVudCBJRAoJCQlmaWx0ZXIgKz0gJyc7CgkJCXJldHVybiAkLmdyZXAoY2FjaGUsIGZ1bmN0aW9uKGUpIHsKCQkJCXJldHVybiBlLl9pZCA9PSBmaWx0ZXI7CgkJCX0pOwoJCX0KCQlyZXR1cm4gY2FjaGU7IC8vIGVsc2UsIHJldHVybiBhbGwKCX0KCgoJLy8gTWFrZXMgc3VyZSBhbGwgYXJyYXkgZXZlbnQgc291cmNlcyBoYXZlIHRoZWlyIGludGVybmFsIGV2ZW50IG9iamVjdHMKCS8vIGNvbnZlcnRlZCBvdmVyIHRvIHRoZSBDYWxlbmRhcidzIGN1cnJlbnQgdGltZXpvbmUuCgl0LnJlem9uZUFycmF5RXZlbnRTb3VyY2VzID0gZnVuY3Rpb24oKSB7CgkJdmFyIGk7CgkJdmFyIGV2ZW50czsKCQl2YXIgajsKCgkJZm9yIChpID0gMDsgaSA8IHNvdXJjZXMubGVuZ3RoOyBpKyspIHsKCQkJZXZlbnRzID0gc291cmNlc1tpXS5ldmVudHM7CgkJCWlmICgkLmlzQXJyYXkoZXZlbnRzKSkgewoKCQkJCWZvciAoaiA9IDA7IGogPCBldmVudHMubGVuZ3RoOyBqKyspIHsKCQkJCQlyZXpvbmVFdmVudERhdGVzKGV2ZW50c1tqXSk7CgkJCQl9CgkJCX0KCQl9Cgl9OwoKCWZ1bmN0aW9uIHJlem9uZUV2ZW50RGF0ZXMoZXZlbnQpIHsKCQlldmVudC5zdGFydCA9IHQubW9tZW50KGV2ZW50LnN0YXJ0KTsKCQlpZiAoZXZlbnQuZW5kKSB7CgkJCWV2ZW50LmVuZCA9IHQubW9tZW50KGV2ZW50LmVuZCk7CgkJfQoJCWJhY2t1cEV2ZW50RGF0ZXMoZXZlbnQpOwoJfQoJCgkKCS8qIEV2ZW50IE5vcm1hbGl6YXRpb24KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gR2l2ZW4gYSByYXcgb2JqZWN0IHdpdGgga2V5L3ZhbHVlIHByb3BlcnRpZXMsIHJldHVybnMgYW4gImFic3RyYWN0IiBFdmVudCBvYmplY3QuCgkvLyBBbiAiYWJzdHJhY3QiIGV2ZW50IGlzIGFuIGV2ZW50IHRoYXQsIGlmIHJlY3VycmluZywgd2lsbCBub3QgaGF2ZSBiZWVuIGV4cGFuZGVkIHlldC4KCS8vIFdpbGwgcmV0dXJuIGBmYWxzZWAgd2hlbiBpbnB1dCBpcyBpbnZhbGlkLgoJLy8gYHNvdXJjZWAgaXMgb3B0aW9uYWwKCWZ1bmN0aW9uIGJ1aWxkRXZlbnRGcm9tSW5wdXQoaW5wdXQsIHNvdXJjZSkgewoJCXZhciBvdXQgPSB7fTsKCQl2YXIgc3RhcnQsIGVuZDsKCQl2YXIgYWxsRGF5OwoKCQlpZiAodC5vcHRpb25zLmV2ZW50RGF0YVRyYW5zZm9ybSkgewoJCQlpbnB1dCA9IHQub3B0aW9ucy5ldmVudERhdGFUcmFuc2Zvcm0oaW5wdXQpOwoJCX0KCQlpZiAoc291cmNlICYmIHNvdXJjZS5ldmVudERhdGFUcmFuc2Zvcm0pIHsKCQkJaW5wdXQgPSBzb3VyY2UuZXZlbnREYXRhVHJhbnNmb3JtKGlucHV0KTsKCQl9CgoJCS8vIENvcHkgYWxsIHByb3BlcnRpZXMgb3ZlciB0byB0aGUgcmVzdWx0aW5nIG9iamVjdC4KCQkvLyBUaGUgc3BlY2lhbC1jYXNlIHByb3BlcnRpZXMgd2lsbCBiZSBjb3BpZWQgb3ZlciBhZnRlcndhcmRzLgoJCSQuZXh0ZW5kKG91dCwgaW5wdXQpOwoKCQlpZiAoc291cmNlKSB7CgkJCW91dC5zb3VyY2UgPSBzb3VyY2U7CgkJfQoKCQlvdXQuX2lkID0gaW5wdXQuX2lkIHx8IChpbnB1dC5pZCA9PT0gdW5kZWZpbmVkID8gJ19mYycgKyBldmVudEdVSUQrKyA6IGlucHV0LmlkICsgJycpOwoKCQlpZiAoaW5wdXQuY2xhc3NOYW1lKSB7CgkJCWlmICh0eXBlb2YgaW5wdXQuY2xhc3NOYW1lID09ICdzdHJpbmcnKSB7CgkJCQlvdXQuY2xhc3NOYW1lID0gaW5wdXQuY2xhc3NOYW1lLnNwbGl0KC9ccysvKTsKCQkJfQoJCQllbHNlIHsgLy8gYXNzdW1lZCB0byBiZSBhbiBhcnJheQoJCQkJb3V0LmNsYXNzTmFtZSA9IGlucHV0LmNsYXNzTmFtZTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJb3V0LmNsYXNzTmFtZSA9IFtdOwoJCX0KCgkJc3RhcnQgPSBpbnB1dC5zdGFydCB8fCBpbnB1dC5kYXRlOyAvLyAiZGF0ZSIgaXMgYW4gYWxpYXMgZm9yICJzdGFydCIKCQllbmQgPSBpbnB1dC5lbmQ7CgoJCS8vIHBhcnNlIGFzIGEgdGltZSAoRHVyYXRpb24pIGlmIGFwcGxpY2FibGUKCQlpZiAoaXNUaW1lU3RyaW5nKHN0YXJ0KSkgewoJCQlzdGFydCA9IG1vbWVudC5kdXJhdGlvbihzdGFydCk7CgkJfQoJCWlmIChpc1RpbWVTdHJpbmcoZW5kKSkgewoJCQllbmQgPSBtb21lbnQuZHVyYXRpb24oZW5kKTsKCQl9CgoJCWlmIChpbnB1dC5kb3cgfHwgbW9tZW50LmlzRHVyYXRpb24oc3RhcnQpIHx8IG1vbWVudC5pc0R1cmF0aW9uKGVuZCkpIHsKCgkJCS8vIHRoZSBldmVudCBpcyAiYWJzdHJhY3QiIChyZWN1cnJpbmcpIHNvIGRvbid0IGNhbGN1bGF0ZSBleGFjdCBzdGFydC9lbmQgZGF0ZXMganVzdCB5ZXQKCQkJb3V0LnN0YXJ0ID0gc3RhcnQgPyBtb21lbnQuZHVyYXRpb24oc3RhcnQpIDogbnVsbDsgLy8gd2lsbCBiZSBhIER1cmF0aW9uIG9yIG51bGwKCQkJb3V0LmVuZCA9IGVuZCA/IG1vbWVudC5kdXJhdGlvbihlbmQpIDogbnVsbDsgLy8gd2lsbCBiZSBhIER1cmF0aW9uIG9yIG51bGwKCQkJb3V0Ll9yZWN1cnJpbmcgPSB0cnVlOyAvLyBvdXIgaW50ZXJuYWwgbWFya2VyCgkJfQoJCWVsc2UgewoKCQkJaWYgKHN0YXJ0KSB7CgkJCQlzdGFydCA9IHQubW9tZW50KHN0YXJ0KTsKCQkJCWlmICghc3RhcnQuaXNWYWxpZCgpKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgoJCQlpZiAoZW5kKSB7CgkJCQllbmQgPSB0Lm1vbWVudChlbmQpOwoJCQkJaWYgKCFlbmQuaXNWYWxpZCgpKSB7CgkJCQkJZW5kID0gbnVsbDsgLy8gbGV0IGRlZmF1bHRzIHRha2Ugb3ZlcgoJCQkJfQoJCQl9CgoJCQlhbGxEYXkgPSBpbnB1dC5hbGxEYXk7CgkJCWlmIChhbGxEYXkgPT09IHVuZGVmaW5lZCkgeyAvLyBzdGlsbCB1bmRlZmluZWQ/IGZhbGxiYWNrIHRvIGRlZmF1bHQKCQkJCWFsbERheSA9IGZpcnN0RGVmaW5lZCgKCQkJCQlzb3VyY2UgPyBzb3VyY2UuYWxsRGF5RGVmYXVsdCA6IHVuZGVmaW5lZCwKCQkJCQl0Lm9wdGlvbnMuYWxsRGF5RGVmYXVsdAoJCQkJKTsKCQkJCS8vIHN0aWxsIHVuZGVmaW5lZD8gbm9ybWFsaXplRXZlbnREYXRlcyB3aWxsIGNhbGN1bGF0ZSBpdAoJCQl9CgoJCQlhc3NpZ25EYXRlc1RvRXZlbnQoc3RhcnQsIGVuZCwgYWxsRGF5LCBvdXQpOwoJCX0KCgkJdC5ub3JtYWxpemVFdmVudChvdXQpOyAvLyBob29rIGZvciBleHRlcm5hbCB1c2UuIGEgcHJvdG90eXBlIG1ldGhvZAoKCQlyZXR1cm4gb3V0OwoJfQoJdC5idWlsZEV2ZW50RnJvbUlucHV0ID0gYnVpbGRFdmVudEZyb21JbnB1dDsKCgoJLy8gTm9ybWFsaXplcyBhbmQgYXNzaWducyB0aGUgZ2l2ZW4gZGF0ZXMgdG8gdGhlIGdpdmVuIHBhcnRpYWxseS1mb3JtZWQgZXZlbnQgb2JqZWN0LgoJLy8gTk9URTogbXV0YXRlcyB0aGUgZ2l2ZW4gc3RhcnQvZW5kIG1vbWVudHMuIGRvZXMgbm90IG1ha2UgYSBjb3B5LgoJZnVuY3Rpb24gYXNzaWduRGF0ZXNUb0V2ZW50KHN0YXJ0LCBlbmQsIGFsbERheSwgZXZlbnQpIHsKCQlldmVudC5zdGFydCA9IHN0YXJ0OwoJCWV2ZW50LmVuZCA9IGVuZDsKCQlldmVudC5hbGxEYXkgPSBhbGxEYXk7CgkJbm9ybWFsaXplRXZlbnREYXRlcyhldmVudCk7CgkJYmFja3VwRXZlbnREYXRlcyhldmVudCk7Cgl9CgoKCS8vIEVuc3VyZXMgcHJvcGVyIHZhbHVlcyBmb3IgYWxsRGF5L3N0YXJ0L2VuZC4gQWNjZXB0cyBhbiBFdmVudCBvYmplY3QsIG9yIGEgcGxhaW4gb2JqZWN0IHdpdGggZXZlbnQtaXNoIHByb3BlcnRpZXMuCgkvLyBOT1RFOiBXaWxsIG1vZGlmeSB0aGUgZ2l2ZW4gb2JqZWN0LgoJZnVuY3Rpb24gbm9ybWFsaXplRXZlbnREYXRlcyhldmVudFByb3BzKSB7CgoJCW5vcm1hbGl6ZUV2ZW50VGltZXMoZXZlbnRQcm9wcyk7CgoJCWlmIChldmVudFByb3BzLmVuZCAmJiAhZXZlbnRQcm9wcy5lbmQuaXNBZnRlcihldmVudFByb3BzLnN0YXJ0KSkgewoJCQlldmVudFByb3BzLmVuZCA9IG51bGw7CgkJfQoKCQlpZiAoIWV2ZW50UHJvcHMuZW5kKSB7CgkJCWlmICh0Lm9wdGlvbnMuZm9yY2VFdmVudER1cmF0aW9uKSB7CgkJCQlldmVudFByb3BzLmVuZCA9IHQuZ2V0RGVmYXVsdEV2ZW50RW5kKGV2ZW50UHJvcHMuYWxsRGF5LCBldmVudFByb3BzLnN0YXJ0KTsKCQkJfQoJCQllbHNlIHsKCQkJCWV2ZW50UHJvcHMuZW5kID0gbnVsbDsKCQkJfQoJCX0KCX0KCgoJLy8gRW5zdXJlcyB0aGUgYWxsRGF5IHByb3BlcnR5IGV4aXN0cyBhbmQgdGhlIHRpbWVsaW5lc3Mgb2YgdGhlIHN0YXJ0L2VuZCBkYXRlcyBhcmUgY29uc2lzdGVudAoJZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRUaW1lcyhldmVudFByb3BzKSB7CgkJaWYgKGV2ZW50UHJvcHMuYWxsRGF5ID09IG51bGwpIHsKCQkJZXZlbnRQcm9wcy5hbGxEYXkgPSAhKGV2ZW50UHJvcHMuc3RhcnQuaGFzVGltZSgpIHx8IChldmVudFByb3BzLmVuZCAmJiBldmVudFByb3BzLmVuZC5oYXNUaW1lKCkpKTsKCQl9CgoJCWlmIChldmVudFByb3BzLmFsbERheSkgewoJCQlldmVudFByb3BzLnN0YXJ0LnN0cmlwVGltZSgpOwoJCQlpZiAoZXZlbnRQcm9wcy5lbmQpIHsKCQkJCS8vIFRPRE86IGNvbnNpZGVyIG5leHREYXlUaHJlc2hvbGQgaGVyZT8gSWYgc28sIHdpbGwgcmVxdWlyZSBhIGxvdCBvZiB0ZXN0aW5nIGFuZCBhZGp1c3RtZW50CgkJCQlldmVudFByb3BzLmVuZC5zdHJpcFRpbWUoKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJaWYgKCFldmVudFByb3BzLnN0YXJ0Lmhhc1RpbWUoKSkgewoJCQkJZXZlbnRQcm9wcy5zdGFydCA9IHQuYXBwbHlUaW1lem9uZShldmVudFByb3BzLnN0YXJ0LnRpbWUoMCkpOyAvLyB3aWxsIGFzc2lnbiBhIDAwOjAwIHRpbWUKCQkJfQoJCQlpZiAoZXZlbnRQcm9wcy5lbmQgJiYgIWV2ZW50UHJvcHMuZW5kLmhhc1RpbWUoKSkgewoJCQkJZXZlbnRQcm9wcy5lbmQgPSB0LmFwcGx5VGltZXpvbmUoZXZlbnRQcm9wcy5lbmQudGltZSgwKSk7IC8vIHdpbGwgYXNzaWduIGEgMDA6MDAgdGltZQoJCQl9CgkJfQoJfQoKCgkvLyBJZiB0aGUgZ2l2ZW4gZXZlbnQgaXMgYSByZWN1cnJpbmcgZXZlbnQsIGJyZWFrIGl0IGRvd24gaW50byBhbiBhcnJheSBvZiBpbmRpdmlkdWFsIGluc3RhbmNlcy4KCS8vIElmIG5vdCBhIHJlY3VycmluZyBldmVudCwgcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIHNpbmdsZSBvcmlnaW5hbCBldmVudC4KCS8vIElmIGdpdmVuIGEgZmFsc3kgaW5wdXQgKHByb2JhYmx5IGJlY2F1c2Ugb2YgYSBmYWlsZWQgYnVpbGRFdmVudEZyb21JbnB1dCBjYWxsKSwgcmV0dXJucyBhbiBlbXB0eSBhcnJheS4KCS8vIEhBQ0s6IGNhbiBvdmVycmlkZSB0aGUgcmVjdXJyaW5nIHdpbmRvdyBieSBwcm92aWRpbmcgY3VzdG9tIHJhbmdlU3RhcnQvcmFuZ2VFbmQgKGZvciBidXNpbmVzc0hvdXJzKS4KCWZ1bmN0aW9uIGV4cGFuZEV2ZW50KGFic3RyYWN0RXZlbnQsIF9yYW5nZVN0YXJ0LCBfcmFuZ2VFbmQpIHsKCQl2YXIgZXZlbnRzID0gW107CgkJdmFyIGRvd0hhc2g7CgkJdmFyIGRvdzsKCQl2YXIgaTsKCQl2YXIgZGF0ZTsKCQl2YXIgc3RhcnRUaW1lLCBlbmRUaW1lOwoJCXZhciBzdGFydCwgZW5kOwoJCXZhciBldmVudDsKCgkJX3JhbmdlU3RhcnQgPSBfcmFuZ2VTdGFydCB8fCByYW5nZVN0YXJ0OwoJCV9yYW5nZUVuZCA9IF9yYW5nZUVuZCB8fCByYW5nZUVuZDsKCgkJaWYgKGFic3RyYWN0RXZlbnQpIHsKCQkJaWYgKGFic3RyYWN0RXZlbnQuX3JlY3VycmluZykgewoKCQkJCS8vIG1ha2UgYSBib29sZWFuIGhhc2ggYXMgdG8gd2hldGhlciB0aGUgZXZlbnQgb2NjdXJzIG9uIGVhY2ggZGF5LW9mLXdlZWsKCQkJCWlmICgoZG93ID0gYWJzdHJhY3RFdmVudC5kb3cpKSB7CgkJCQkJZG93SGFzaCA9IHt9OwoJCQkJCWZvciAoaSA9IDA7IGkgPCBkb3cubGVuZ3RoOyBpKyspIHsKCQkJCQkJZG93SGFzaFtkb3dbaV1dID0gdHJ1ZTsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gaXRlcmF0ZSB0aHJvdWdoIGV2ZXJ5IGRheSBpbiB0aGUgY3VycmVudCByYW5nZQoJCQkJZGF0ZSA9IF9yYW5nZVN0YXJ0LmNsb25lKCkuc3RyaXBUaW1lKCk7IC8vIGhvbGRzIHRoZSBkYXRlIG9mIHRoZSBjdXJyZW50IGRheQoJCQkJd2hpbGUgKGRhdGUuaXNCZWZvcmUoX3JhbmdlRW5kKSkgewoKCQkJCQlpZiAoIWRvd0hhc2ggfHwgZG93SGFzaFtkYXRlLmRheSgpXSkgeyAvLyBpZiBldmVyeWRheSwgb3IgdGhpcyBwYXJ0aWN1bGFyIGRheS1vZi13ZWVrCgoJCQkJCQlzdGFydFRpbWUgPSBhYnN0cmFjdEV2ZW50LnN0YXJ0OyAvLyB0aGUgc3RvcmVkIHN0YXJ0IGFuZCBlbmQgcHJvcGVydGllcyBhcmUgdGltZXMgKER1cmF0aW9ucykKCQkJCQkJZW5kVGltZSA9IGFic3RyYWN0RXZlbnQuZW5kOyAvLyAiCgkJCQkJCXN0YXJ0ID0gZGF0ZS5jbG9uZSgpOwoJCQkJCQllbmQgPSBudWxsOwoKCQkJCQkJaWYgKHN0YXJ0VGltZSkgewoJCQkJCQkJc3RhcnQgPSBzdGFydC50aW1lKHN0YXJ0VGltZSk7CgkJCQkJCX0KCQkJCQkJaWYgKGVuZFRpbWUpIHsKCQkJCQkJCWVuZCA9IGRhdGUuY2xvbmUoKS50aW1lKGVuZFRpbWUpOwoJCQkJCQl9CgoJCQkJCQlldmVudCA9ICQuZXh0ZW5kKHt9LCBhYnN0cmFjdEV2ZW50KTsgLy8gbWFrZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsCgkJCQkJCWFzc2lnbkRhdGVzVG9FdmVudCgKCQkJCQkJCXN0YXJ0LCBlbmQsCgkJCQkJCQkhc3RhcnRUaW1lICYmICFlbmRUaW1lLCAvLyBhbGxEYXk/CgkJCQkJCQlldmVudAoJCQkJCQkpOwoJCQkJCQlldmVudHMucHVzaChldmVudCk7CgkJCQkJfQoKCQkJCQlkYXRlLmFkZCgxLCAnZGF5cycpOwoJCQkJfQoJCQl9CgkJCWVsc2UgewoJCQkJZXZlbnRzLnB1c2goYWJzdHJhY3RFdmVudCk7IC8vIHJldHVybiB0aGUgb3JpZ2luYWwgZXZlbnQuIHdpbGwgYmUgYSBvbmUtaXRlbSBhcnJheQoJCQl9CgkJfQoKCQlyZXR1cm4gZXZlbnRzOwoJfQoJdC5leHBhbmRFdmVudCA9IGV4cGFuZEV2ZW50OwoKCgoJLyogRXZlbnQgTW9kaWZpY2F0aW9uIE1hdGgKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gTW9kaWZpZXMgYW4gZXZlbnQgYW5kIGFsbCByZWxhdGVkIGV2ZW50cyBieSBhcHBseWluZyB0aGUgZ2l2ZW4gcHJvcGVydGllcy4KCS8vIFNwZWNpYWwgZGF0ZS1kaWZmaW5nIGxvZ2ljIGlzIHVzZWQgZm9yIG1hbmlwdWxhdGlvbiBvZiBkYXRlcy4KCS8vIElmIGBwcm9wc2AgZG9lcyBub3QgY29udGFpbiBzdGFydC9lbmQgZGF0ZXMsIHRoZSB1cGRhdGVkIHZhbHVlcyBhcmUgYXNzdW1lZCB0byBiZSB0aGUgZXZlbnQncyBjdXJyZW50IHN0YXJ0L2VuZC4KCS8vIEFsbCBkYXRlIGNvbXBhcmlzb25zIGFyZSBkb25lIGFnYWluc3QgdGhlIGV2ZW50J3MgcHJpc3RpbmUgX3N0YXJ0IGFuZCBfZW5kIGRhdGVzLgoJLy8gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBkZWx0YSBpbmZvcm1hdGlvbiBhbmQgYSBmdW5jdGlvbiB0byB1bmRvIGFsbCBvcGVyYXRpb25zLgoJLy8gRm9yIG1ha2luZyBjb21wdXRhdGlvbnMgaW4gYSBncmFudWxhcml0eSBncmVhdGVyIHRoYW4gZGF5L3RpbWUsIHNwZWNpZnkgbGFyZ2VVbml0LgoJLy8gTk9URTogVGhlIGdpdmVuIGBuZXdQcm9wc2AgbWlnaHQgYmUgbXV0YXRlZCBmb3Igbm9ybWFsaXphdGlvbiBwdXJwb3Nlcy4KCWZ1bmN0aW9uIG11dGF0ZUV2ZW50KGV2ZW50LCBuZXdQcm9wcywgbGFyZ2VVbml0KSB7CgkJdmFyIG1pc2NQcm9wcyA9IHt9OwoJCXZhciBvbGRQcm9wczsKCQl2YXIgY2xlYXJFbmQ7CgkJdmFyIHN0YXJ0RGVsdGE7CgkJdmFyIGVuZERlbHRhOwoJCXZhciBkdXJhdGlvbkRlbHRhOwoJCXZhciB1bmRvRnVuYzsKCgkJLy8gZGlmZnMgdGhlIGRhdGVzIGluIHRoZSBhcHByb3ByaWF0ZSB3YXksIHJldHVybmluZyBhIGR1cmF0aW9uCgkJZnVuY3Rpb24gZGlmZkRhdGVzKGRhdGUxLCBkYXRlMCkgeyAvLyBkYXRlMSAtIGRhdGUwCgkJCWlmIChsYXJnZVVuaXQpIHsKCQkJCXJldHVybiBkaWZmQnlVbml0KGRhdGUxLCBkYXRlMCwgbGFyZ2VVbml0KTsKCQkJfQoJCQllbHNlIGlmIChuZXdQcm9wcy5hbGxEYXkpIHsKCQkJCXJldHVybiBkaWZmRGF5KGRhdGUxLCBkYXRlMCk7CgkJCX0KCQkJZWxzZSB7CgkJCQlyZXR1cm4gZGlmZkRheVRpbWUoZGF0ZTEsIGRhdGUwKTsKCQkJfQoJCX0KCgkJbmV3UHJvcHMgPSBuZXdQcm9wcyB8fCB7fTsKCgkJLy8gbm9ybWFsaXplIG5ldyBkYXRlLXJlbGF0ZWQgcHJvcGVydGllcwoJCWlmICghbmV3UHJvcHMuc3RhcnQpIHsKCQkJbmV3UHJvcHMuc3RhcnQgPSBldmVudC5zdGFydC5jbG9uZSgpOwoJCX0KCQlpZiAobmV3UHJvcHMuZW5kID09PSB1bmRlZmluZWQpIHsKCQkJbmV3UHJvcHMuZW5kID0gZXZlbnQuZW5kID8gZXZlbnQuZW5kLmNsb25lKCkgOiBudWxsOwoJCX0KCQlpZiAobmV3UHJvcHMuYWxsRGF5ID09IG51bGwpIHsgLy8gaXMgbnVsbCBvciB1bmRlZmluZWQ/CgkJCW5ld1Byb3BzLmFsbERheSA9IGV2ZW50LmFsbERheTsKCQl9CgkJbm9ybWFsaXplRXZlbnREYXRlcyhuZXdQcm9wcyk7CgoJCS8vIGNyZWF0ZSBub3JtYWxpemVkIHZlcnNpb25zIG9mIHRoZSBvcmlnaW5hbCBwcm9wcyB0byBjb21wYXJlIGFnYWluc3QKCQkvLyBuZWVkIGEgcmVhbCBlbmQgdmFsdWUsIGZvciBkaWZmaW5nCgkJb2xkUHJvcHMgPSB7CgkJCXN0YXJ0OiBldmVudC5fc3RhcnQuY2xvbmUoKSwKCQkJZW5kOiBldmVudC5fZW5kID8gZXZlbnQuX2VuZC5jbG9uZSgpIDogdC5nZXREZWZhdWx0RXZlbnRFbmQoZXZlbnQuX2FsbERheSwgZXZlbnQuX3N0YXJ0KSwKCQkJYWxsRGF5OiBuZXdQcm9wcy5hbGxEYXkgLy8gbm9ybWFsaXplIHRoZSBkYXRlcyBpbiB0aGUgc2FtZSByZWdhcmQgYXMgdGhlIG5ldyBwcm9wZXJ0aWVzCgkJfTsKCQlub3JtYWxpemVFdmVudERhdGVzKG9sZFByb3BzKTsKCgkJLy8gbmVlZCB0byBjbGVhciB0aGUgZW5kIGRhdGUgaWYgZXhwbGljaXRseSBjaGFuZ2VkIHRvIG51bGwKCQljbGVhckVuZCA9IGV2ZW50Ll9lbmQgIT09IG51bGwgJiYgbmV3UHJvcHMuZW5kID09PSBudWxsOwoKCQkvLyBjb21wdXRlIHRoZSBkZWx0YSBmb3IgbW92aW5nIHRoZSBzdGFydCBkYXRlCgkJc3RhcnREZWx0YSA9IGRpZmZEYXRlcyhuZXdQcm9wcy5zdGFydCwgb2xkUHJvcHMuc3RhcnQpOwoKCQkvLyBjb21wdXRlIHRoZSBkZWx0YSBmb3IgbW92aW5nIHRoZSBlbmQgZGF0ZQoJCWlmIChuZXdQcm9wcy5lbmQpIHsKCQkJZW5kRGVsdGEgPSBkaWZmRGF0ZXMobmV3UHJvcHMuZW5kLCBvbGRQcm9wcy5lbmQpOwoJCQlkdXJhdGlvbkRlbHRhID0gZW5kRGVsdGEuc3VidHJhY3Qoc3RhcnREZWx0YSk7CgkJfQoJCWVsc2UgewoJCQlkdXJhdGlvbkRlbHRhID0gbnVsbDsKCQl9CgoJCS8vIGdhdGhlciBhbGwgbm9uLWRhdGUtcmVsYXRlZCBwcm9wZXJ0aWVzCgkJJC5lYWNoKG5ld1Byb3BzLCBmdW5jdGlvbihuYW1lLCB2YWwpIHsKCQkJaWYgKGlzTWlzY0V2ZW50UHJvcE5hbWUobmFtZSkpIHsKCQkJCWlmICh2YWwgIT09IHVuZGVmaW5lZCkgewoJCQkJCW1pc2NQcm9wc1tuYW1lXSA9IHZhbDsKCQkJCX0KCQkJfQoJCX0pOwoKCQkvLyBhcHBseSB0aGUgb3BlcmF0aW9ucyB0byB0aGUgZXZlbnQgYW5kIGFsbCByZWxhdGVkIGV2ZW50cwoJCXVuZG9GdW5jID0gbXV0YXRlRXZlbnRzKAoJCQljbGllbnRFdmVudHMoZXZlbnQuX2lkKSwgLy8gZ2V0IGV2ZW50cyB3aXRoIHRoaXMgSUQKCQkJY2xlYXJFbmQsCgkJCW5ld1Byb3BzLmFsbERheSwKCQkJc3RhcnREZWx0YSwKCQkJZHVyYXRpb25EZWx0YSwKCQkJbWlzY1Byb3BzCgkJKTsKCgkJcmV0dXJuIHsKCQkJZGF0ZURlbHRhOiBzdGFydERlbHRhLAoJCQlkdXJhdGlvbkRlbHRhOiBkdXJhdGlvbkRlbHRhLAoJCQl1bmRvOiB1bmRvRnVuYwoJCX07Cgl9CgoKCS8vIE1vZGlmaWVzIGFuIGFycmF5IG9mIGV2ZW50cyBpbiB0aGUgZm9sbG93aW5nIHdheXMgKG9wZXJhdGlvbnMgYXJlIGluIG9yZGVyKToKCS8vIC0gY2xlYXIgdGhlIGV2ZW50J3MgYGVuZGAKCS8vIC0gY29udmVydCB0aGUgZXZlbnQgdG8gYWxsRGF5CgkvLyAtIGFkZCBgZGF0ZURlbHRhYCB0byB0aGUgc3RhcnQgYW5kIGVuZAoJLy8gLSBhZGQgYGR1cmF0aW9uRGVsdGFgIHRvIHRoZSBldmVudCdzIGR1cmF0aW9uCgkvLyAtIGFzc2lnbiBgbWlzY1Byb3BzYCB0byB0aGUgZXZlbnQKCS8vCgkvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIHRvIHVuZG8gYWxsIHRoZSBvcGVyYXRpb25zLgoJLy8KCS8vIFRPRE86IGRvbid0IHVzZSBzbyBtYW55IGNsb3N1cmVzLiBwb3NzaWJsZSBtZW1vcnkgaXNzdWVzIHdoZW4gbG90cyBvZiBldmVudHMgd2l0aCBzYW1lIElELgoJLy8KCWZ1bmN0aW9uIG11dGF0ZUV2ZW50cyhldmVudHMsIGNsZWFyRW5kLCBhbGxEYXksIGRhdGVEZWx0YSwgZHVyYXRpb25EZWx0YSwgbWlzY1Byb3BzKSB7CgkJdmFyIGlzQW1iaWdUaW1lem9uZSA9IHQuZ2V0SXNBbWJpZ1RpbWV6b25lKCk7CgkJdmFyIHVuZG9GdW5jdGlvbnMgPSBbXTsKCgkJLy8gbm9ybWFsaXplIHplcm8tbGVuZ3RoIGRlbHRhcyB0byBiZSBudWxsCgkJaWYgKGRhdGVEZWx0YSAmJiAhZGF0ZURlbHRhLnZhbHVlT2YoKSkgeyBkYXRlRGVsdGEgPSBudWxsOyB9CgkJaWYgKGR1cmF0aW9uRGVsdGEgJiYgIWR1cmF0aW9uRGVsdGEudmFsdWVPZigpKSB7IGR1cmF0aW9uRGVsdGEgPSBudWxsOyB9CgoJCSQuZWFjaChldmVudHMsIGZ1bmN0aW9uKGksIGV2ZW50KSB7CgkJCXZhciBvbGRQcm9wczsKCQkJdmFyIG5ld1Byb3BzOwoKCQkJLy8gYnVpbGQgYW4gb2JqZWN0IGhvbGRpbmcgYWxsIHRoZSBvbGQgdmFsdWVzLCBib3RoIGRhdGUtcmVsYXRlZCBhbmQgbWlzYy4KCQkJLy8gZm9yIHRoZSB1bmRvIGZ1bmN0aW9uLgoJCQlvbGRQcm9wcyA9IHsKCQkJCXN0YXJ0OiBldmVudC5zdGFydC5jbG9uZSgpLAoJCQkJZW5kOiBldmVudC5lbmQgPyBldmVudC5lbmQuY2xvbmUoKSA6IG51bGwsCgkJCQlhbGxEYXk6IGV2ZW50LmFsbERheQoJCQl9OwoJCQkkLmVhY2gobWlzY1Byb3BzLCBmdW5jdGlvbihuYW1lKSB7CgkJCQlvbGRQcm9wc1tuYW1lXSA9IGV2ZW50W25hbWVdOwoJCQl9KTsKCgkJCS8vIG5ldyBkYXRlLXJlbGF0ZWQgcHJvcGVydGllcy4gd29yayBvZmYgdGhlIG9yaWdpbmFsIGRhdGUgc25hcHNob3QuCgkJCS8vIG9rIHRvIHVzZSByZWZlcmVuY2VzIGJlY2F1c2UgdGhleSB3aWxsIGJlIHRocm93biBhd2F5IHdoZW4gYmFja3VwRXZlbnREYXRlcyBpcyBjYWxsZWQuCgkJCW5ld1Byb3BzID0gewoJCQkJc3RhcnQ6IGV2ZW50Ll9zdGFydCwKCQkJCWVuZDogZXZlbnQuX2VuZCwKCQkJCWFsbERheTogYWxsRGF5IC8vIG5vcm1hbGl6ZSB0aGUgZGF0ZXMgaW4gdGhlIHNhbWUgcmVnYXJkIGFzIHRoZSBuZXcgcHJvcGVydGllcwoJCQl9OwoJCQlub3JtYWxpemVFdmVudERhdGVzKG5ld1Byb3BzKTsgLy8gbWFzc2FnZXMgc3RhcnQvZW5kL2FsbERheQoKCQkJLy8gc3RyaXAgb3IgZW5zdXJlIHRoZSBlbmQgZGF0ZQoJCQlpZiAoY2xlYXJFbmQpIHsKCQkJCW5ld1Byb3BzLmVuZCA9IG51bGw7CgkJCX0KCQkJZWxzZSBpZiAoZHVyYXRpb25EZWx0YSAmJiAhbmV3UHJvcHMuZW5kKSB7IC8vIHRoZSBkdXJhdGlvbiB0cmFuc2xhdGlvbiByZXF1aXJlcyBhbiBlbmQgZGF0ZQoJCQkJbmV3UHJvcHMuZW5kID0gdC5nZXREZWZhdWx0RXZlbnRFbmQobmV3UHJvcHMuYWxsRGF5LCBuZXdQcm9wcy5zdGFydCk7CgkJCX0KCgkJCWlmIChkYXRlRGVsdGEpIHsKCQkJCW5ld1Byb3BzLnN0YXJ0LmFkZChkYXRlRGVsdGEpOwoJCQkJaWYgKG5ld1Byb3BzLmVuZCkgewoJCQkJCW5ld1Byb3BzLmVuZC5hZGQoZGF0ZURlbHRhKTsKCQkJCX0KCQkJfQoKCQkJaWYgKGR1cmF0aW9uRGVsdGEpIHsKCQkJCW5ld1Byb3BzLmVuZC5hZGQoZHVyYXRpb25EZWx0YSk7IC8vIGVuZCBhbHJlYWR5IGVuc3VyZWQgYWJvdmUKCQkJfQoKCQkJLy8gaWYgdGhlIGRhdGVzIGhhdmUgY2hhbmdlZCwgYW5kIHdlIGtub3cgaXQgaXMgaW1wb3NzaWJsZSB0byByZWNvbXB1dGUgdGhlCgkJCS8vIHRpbWV6b25lIG9mZnNldHMsIHN0cmlwIHRoZSB6b25lLgoJCQlpZiAoCgkJCQlpc0FtYmlnVGltZXpvbmUgJiYKCQkJCSFuZXdQcm9wcy5hbGxEYXkgJiYKCQkJCShkYXRlRGVsdGEgfHwgZHVyYXRpb25EZWx0YSkKCQkJKSB7CgkJCQluZXdQcm9wcy5zdGFydC5zdHJpcFpvbmUoKTsKCQkJCWlmIChuZXdQcm9wcy5lbmQpIHsKCQkJCQluZXdQcm9wcy5lbmQuc3RyaXBab25lKCk7CgkJCQl9CgkJCX0KCgkJCSQuZXh0ZW5kKGV2ZW50LCBtaXNjUHJvcHMsIG5ld1Byb3BzKTsgLy8gY29weSBvdmVyIG1pc2MgcHJvcHMsIHRoZW4gZGF0ZS1yZWxhdGVkIHByb3BzCgkJCWJhY2t1cEV2ZW50RGF0ZXMoZXZlbnQpOyAvLyByZWdlbmVyYXRlIGludGVybmFsIF9zdGFydC9fZW5kL19hbGxEYXkKCgkJCXVuZG9GdW5jdGlvbnMucHVzaChmdW5jdGlvbigpIHsKCQkJCSQuZXh0ZW5kKGV2ZW50LCBvbGRQcm9wcyk7CgkJCQliYWNrdXBFdmVudERhdGVzKGV2ZW50KTsgLy8gcmVnZW5lcmF0ZSBpbnRlcm5hbCBfc3RhcnQvX2VuZC9fYWxsRGF5CgkJCX0pOwoJCX0pOwoKCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgdW5kb0Z1bmN0aW9ucy5sZW5ndGg7IGkrKykgewoJCQkJdW5kb0Z1bmN0aW9uc1tpXSgpOwoJCQl9CgkJfTsKCX0KCgoJdC5nZXRFdmVudENhY2hlID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGNhY2hlOwoJfTsKCn0KCgovLyBob29rIGZvciBleHRlcm5hbCBsaWJzIHRvIG1hbmlwdWxhdGUgZXZlbnQgcHJvcGVydGllcyB1cG9uIGNyZWF0aW9uLgovLyBzaG91bGQgbWFuaXB1bGF0ZSB0aGUgZXZlbnQgaW4tcGxhY2UuCkNhbGVuZGFyLnByb3RvdHlwZS5ub3JtYWxpemVFdmVudCA9IGZ1bmN0aW9uKGV2ZW50KSB7Cn07CgoKLy8gRG9lcyB0aGUgZ2l2ZW4gc3BhbiAoc3RhcnQsIGVuZCwgYW5kIG90aGVyIGxvY2F0aW9uIGluZm9ybWF0aW9uKQovLyBmdWxseSBjb250YWluIHRoZSBvdGhlcj8KQ2FsZW5kYXIucHJvdG90eXBlLnNwYW5Db250YWluc1NwYW4gPSBmdW5jdGlvbihvdXRlclNwYW4sIGlubmVyU3BhbikgewoJdmFyIGV2ZW50U3RhcnQgPSBvdXRlclNwYW4uc3RhcnQuY2xvbmUoKS5zdHJpcFpvbmUoKTsKCXZhciBldmVudEVuZCA9IHRoaXMuZ2V0RXZlbnRFbmQob3V0ZXJTcGFuKS5zdHJpcFpvbmUoKTsKCglyZXR1cm4gaW5uZXJTcGFuLnN0YXJ0ID49IGV2ZW50U3RhcnQgJiYgaW5uZXJTcGFuLmVuZCA8PSBldmVudEVuZDsKfTsKCgovLyBSZXR1cm5zIGEgbGlzdCBvZiBldmVudHMgdGhhdCB0aGUgZ2l2ZW4gZXZlbnQgc2hvdWxkIGJlIGNvbXBhcmVkIGFnYWluc3Qgd2hlbiBiZWluZyBjb25zaWRlcmVkIGZvciBhIG1vdmUgdG8KLy8gdGhlIHNwZWNpZmllZCBzcGFuLiBBdHRhY2hlZCB0byB0aGUgQ2FsZW5kYXIncyBwcm90b3R5cGUgYmVjYXVzZSBFdmVudE1hbmFnZXIgaXMgYSBtaXhpbiBmb3IgYSBDYWxlbmRhci4KQ2FsZW5kYXIucHJvdG90eXBlLmdldFBlZXJFdmVudHMgPSBmdW5jdGlvbihzcGFuLCBldmVudCkgewoJdmFyIGNhY2hlID0gdGhpcy5nZXRFdmVudENhY2hlKCk7Cgl2YXIgcGVlckV2ZW50cyA9IFtdOwoJdmFyIGksIG90aGVyRXZlbnQ7CgoJZm9yIChpID0gMDsgaSA8IGNhY2hlLmxlbmd0aDsgaSsrKSB7CgkJb3RoZXJFdmVudCA9IGNhY2hlW2ldOwoJCWlmICgKCQkJIWV2ZW50IHx8CgkJCWV2ZW50Ll9pZCAhPT0gb3RoZXJFdmVudC5faWQgLy8gZG9uJ3QgY29tcGFyZSB0aGUgZXZlbnQgdG8gaXRzZWxmIG9yIG90aGVyIHJlbGF0ZWQgW3JlcGVhdGluZ10gZXZlbnRzCgkJKSB7CgkJCXBlZXJFdmVudHMucHVzaChvdGhlckV2ZW50KTsKCQl9Cgl9CgoJcmV0dXJuIHBlZXJFdmVudHM7Cn07CgoKLy8gdXBkYXRlcyB0aGUgImJhY2t1cCIgcHJvcGVydGllcywgd2hpY2ggYXJlIHByZXNlcnZlZCBpbiBvcmRlciB0byBjb21wdXRlIGRpZmZzIGxhdGVyIG9uLgpmdW5jdGlvbiBiYWNrdXBFdmVudERhdGVzKGV2ZW50KSB7CglldmVudC5fYWxsRGF5ID0gZXZlbnQuYWxsRGF5OwoJZXZlbnQuX3N0YXJ0ID0gZXZlbnQuc3RhcnQuY2xvbmUoKTsKCWV2ZW50Ll9lbmQgPSBldmVudC5lbmQgPyBldmVudC5lbmQuY2xvbmUoKSA6IG51bGw7Cn0KCgovKiBPdmVybGFwcGluZyAvIENvbnN0cmFpbmluZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKLy8gRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gZXZlbnQgY2FuIGJlIHJlbG9jYXRlZCB0byB0aGUgZ2l2ZW4gc3BhbiAodW56b25lZCBzdGFydC9lbmQgd2l0aCBvdGhlciBtaXNjIGRhdGEpCkNhbGVuZGFyLnByb3RvdHlwZS5pc0V2ZW50U3BhbkFsbG93ZWQgPSBmdW5jdGlvbihzcGFuLCBldmVudCkgewoJdmFyIHNvdXJjZSA9IGV2ZW50LnNvdXJjZSB8fCB7fTsKCgl2YXIgY29uc3RyYWludCA9IGZpcnN0RGVmaW5lZCgKCQlldmVudC5jb25zdHJhaW50LAoJCXNvdXJjZS5jb25zdHJhaW50LAoJCXRoaXMub3B0aW9ucy5ldmVudENvbnN0cmFpbnQKCSk7CgoJdmFyIG92ZXJsYXAgPSBmaXJzdERlZmluZWQoCgkJZXZlbnQub3ZlcmxhcCwKCQlzb3VyY2Uub3ZlcmxhcCwKCQl0aGlzLm9wdGlvbnMuZXZlbnRPdmVybGFwCgkpOwoKCXJldHVybiB0aGlzLmlzU3BhbkFsbG93ZWQoc3BhbiwgY29uc3RyYWludCwgb3ZlcmxhcCwgZXZlbnQpICYmCgkJKCF0aGlzLm9wdGlvbnMuZXZlbnRBbGxvdyB8fCB0aGlzLm9wdGlvbnMuZXZlbnRBbGxvdyhzcGFuLCBldmVudCkgIT09IGZhbHNlKTsKfTsKCgovLyBEZXRlcm1pbmVzIGlmIGFuIGV4dGVybmFsIGV2ZW50IGNhbiBiZSByZWxvY2F0ZWQgdG8gdGhlIGdpdmVuIHNwYW4gKHVuem9uZWQgc3RhcnQvZW5kIHdpdGggb3RoZXIgbWlzYyBkYXRhKQpDYWxlbmRhci5wcm90b3R5cGUuaXNFeHRlcm5hbFNwYW5BbGxvd2VkID0gZnVuY3Rpb24oZXZlbnRTcGFuLCBldmVudExvY2F0aW9uLCBldmVudFByb3BzKSB7Cgl2YXIgZXZlbnRJbnB1dDsKCXZhciBldmVudDsKCgkvLyBub3RlOiB2ZXJ5IHNpbWlsYXIgbG9naWMgaXMgaW4gVmlldydzIHJlcG9ydEV4dGVybmFsRHJvcAoJaWYgKGV2ZW50UHJvcHMpIHsKCQlldmVudElucHV0ID0gJC5leHRlbmQoe30sIGV2ZW50UHJvcHMsIGV2ZW50TG9jYXRpb24pOwoJCWV2ZW50ID0gdGhpcy5leHBhbmRFdmVudCgKCQkJdGhpcy5idWlsZEV2ZW50RnJvbUlucHV0KGV2ZW50SW5wdXQpCgkJKVswXTsKCX0KCglpZiAoZXZlbnQpIHsKCQlyZXR1cm4gdGhpcy5pc0V2ZW50U3BhbkFsbG93ZWQoZXZlbnRTcGFuLCBldmVudCk7Cgl9CgllbHNlIHsgLy8gdHJlYXQgaXQgYXMgYSBzZWxlY3Rpb24KCgkJcmV0dXJuIHRoaXMuaXNTZWxlY3Rpb25TcGFuQWxsb3dlZChldmVudFNwYW4pOwoJfQp9OwoKCi8vIERldGVybWluZXMgdGhlIGdpdmVuIHNwYW4gKHVuem9uZWQgc3RhcnQvZW5kIHdpdGggb3RoZXIgbWlzYyBkYXRhKSBjYW4gYmUgc2VsZWN0ZWQuCkNhbGVuZGFyLnByb3RvdHlwZS5pc1NlbGVjdGlvblNwYW5BbGxvd2VkID0gZnVuY3Rpb24oc3BhbikgewoJcmV0dXJuIHRoaXMuaXNTcGFuQWxsb3dlZChzcGFuLCB0aGlzLm9wdGlvbnMuc2VsZWN0Q29uc3RyYWludCwgdGhpcy5vcHRpb25zLnNlbGVjdE92ZXJsYXApICYmCgkJKCF0aGlzLm9wdGlvbnMuc2VsZWN0QWxsb3cgfHwgdGhpcy5vcHRpb25zLnNlbGVjdEFsbG93KHNwYW4pICE9PSBmYWxzZSk7Cn07CgoKLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzcGFuIChjYXVzZWQgYnkgYW4gZXZlbnQgZHJvcC9yZXNpemUgb3IgYSBzZWxlY3Rpb24pIGlzIGFsbG93ZWQgdG8gZXhpc3QKLy8gYWNjb3JkaW5nIHRvIHRoZSBjb25zdHJhaW50L292ZXJsYXAgc2V0dGluZ3MuCi8vIGBldmVudGAgaXMgbm90IHJlcXVpcmVkIGlmIGNoZWNraW5nIGEgc2VsZWN0aW9uLgpDYWxlbmRhci5wcm90b3R5cGUuaXNTcGFuQWxsb3dlZCA9IGZ1bmN0aW9uKHNwYW4sIGNvbnN0cmFpbnQsIG92ZXJsYXAsIGV2ZW50KSB7Cgl2YXIgY29uc3RyYWludEV2ZW50czsKCXZhciBhbnlDb250YWlubWVudDsKCXZhciBwZWVyRXZlbnRzOwoJdmFyIGksIHBlZXJFdmVudDsKCXZhciBwZWVyT3ZlcmxhcDsKCgkvLyB0aGUgcmFuZ2UgbXVzdCBiZSBmdWxseSBjb250YWluZWQgYnkgYXQgbGVhc3Qgb25lIG9mIHByb2R1Y2VkIGNvbnN0cmFpbnQgZXZlbnRzCglpZiAoY29uc3RyYWludCAhPSBudWxsKSB7CgoJCS8vIG5vdCB0cmVhdGVkIGFzIGFuIGV2ZW50ISBpbnRlcm1lZGlhdGUgZGF0YSBzdHJ1Y3R1cmUKCQkvLyBUT0RPOiB1c2UgcmFuZ2VzIGluIHRoZSBmdXR1cmUKCQljb25zdHJhaW50RXZlbnRzID0gdGhpcy5jb25zdHJhaW50VG9FdmVudHMoY29uc3RyYWludCk7CgkJaWYgKGNvbnN0cmFpbnRFdmVudHMpIHsgLy8gbm90IGludmFsaWQKCgkJCWFueUNvbnRhaW5tZW50ID0gZmFsc2U7CgkJCWZvciAoaSA9IDA7IGkgPCBjb25zdHJhaW50RXZlbnRzLmxlbmd0aDsgaSsrKSB7CgkJCQlpZiAodGhpcy5zcGFuQ29udGFpbnNTcGFuKGNvbnN0cmFpbnRFdmVudHNbaV0sIHNwYW4pKSB7CgkJCQkJYW55Q29udGFpbm1lbnQgPSB0cnVlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgoJCQlpZiAoIWFueUNvbnRhaW5tZW50KSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9Cgl9CgoJcGVlckV2ZW50cyA9IHRoaXMuZ2V0UGVlckV2ZW50cyhzcGFuLCBldmVudCk7CgoJZm9yIChpID0gMDsgaSA8IHBlZXJFdmVudHMubGVuZ3RoOyBpKyspICB7CgkJcGVlckV2ZW50ID0gcGVlckV2ZW50c1tpXTsKCgkJLy8gdGhlcmUgbmVlZHMgdG8gYmUgYW4gYWN0dWFsIGludGVyc2VjdGlvbiBiZWZvcmUgZGlzYWxsb3dpbmcgYW55dGhpbmcKCQlpZiAodGhpcy5ldmVudEludGVyc2VjdHNSYW5nZShwZWVyRXZlbnQsIHNwYW4pKSB7CgoJCQkvLyBldmFsdWF0ZSBvdmVybGFwIGZvciB0aGUgZ2l2ZW4gcmFuZ2UgYW5kIHNob3J0LWNpcmN1aXQgaWYgbmVjZXNzYXJ5CgkJCWlmIChvdmVybGFwID09PSBmYWxzZSkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCS8vIGlmIHRoZSBldmVudCdzIG92ZXJsYXAgaXMgYSB0ZXN0IGZ1bmN0aW9uLCBwYXNzIHRoZSBwZWVyIGV2ZW50IGluIHF1ZXN0aW9uIGFzIHRoZSBmaXJzdCBwYXJhbQoJCQllbHNlIGlmICh0eXBlb2Ygb3ZlcmxhcCA9PT0gJ2Z1bmN0aW9uJyAmJiAhb3ZlcmxhcChwZWVyRXZlbnQsIGV2ZW50KSkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQkvLyBpZiB3ZSBhcmUgY29tcHV0aW5nIGlmIHRoZSBnaXZlbiByYW5nZSBpcyBhbGxvd2FibGUgZm9yIGFuIGV2ZW50LCBjb25zaWRlciB0aGUgb3RoZXIgZXZlbnQncwoJCQkvLyBFdmVudE9iamVjdC1zcGVjaWZpYyBvciBTb3VyY2Utc3BlY2lmaWMgYG92ZXJsYXBgIHByb3BlcnR5CgkJCWlmIChldmVudCkgewoJCQkJcGVlck92ZXJsYXAgPSBmaXJzdERlZmluZWQoCgkJCQkJcGVlckV2ZW50Lm92ZXJsYXAsCgkJCQkJKHBlZXJFdmVudC5zb3VyY2UgfHwge30pLm92ZXJsYXAKCQkJCQkvLyB3ZSBhbHJlYWR5IGNvbnNpZGVyZWQgdGhlIGdsb2JhbCBgZXZlbnRPdmVybGFwYAoJCQkJKTsKCQkJCWlmIChwZWVyT3ZlcmxhcCA9PT0gZmFsc2UpIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQkvLyBpZiB0aGUgcGVlciBldmVudCdzIG92ZXJsYXAgaXMgYSB0ZXN0IGZ1bmN0aW9uLCBwYXNzIHRoZSBzdWJqZWN0IGV2ZW50IGFzIHRoZSBmaXJzdCBwYXJhbQoJCQkJaWYgKHR5cGVvZiBwZWVyT3ZlcmxhcCA9PT0gJ2Z1bmN0aW9uJyAmJiAhcGVlck92ZXJsYXAoZXZlbnQsIHBlZXJFdmVudCkpIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIHRydWU7Cn07CgoKLy8gR2l2ZW4gYW4gZXZlbnQgaW5wdXQgZnJvbSB0aGUgQVBJLCBwcm9kdWNlcyBhbiBhcnJheSBvZiBldmVudCBvYmplY3RzLiBQb3NzaWJsZSBldmVudCBpbnB1dHM6Ci8vICdidXNpbmVzc0hvdXJzJwovLyBBbiBldmVudCBJRCAobnVtYmVyIG9yIHN0cmluZykKLy8gQW4gb2JqZWN0IHdpdGggc3BlY2lmaWMgc3RhcnQvZW5kIGRhdGVzIG9yIGEgcmVjdXJyaW5nIGV2ZW50IChsaWtlIHdoYXQgYnVzaW5lc3NIb3VycyBhY2NlcHRzKQpDYWxlbmRhci5wcm90b3R5cGUuY29uc3RyYWludFRvRXZlbnRzID0gZnVuY3Rpb24oY29uc3RyYWludElucHV0KSB7CgoJaWYgKGNvbnN0cmFpbnRJbnB1dCA9PT0gJ2J1c2luZXNzSG91cnMnKSB7CgkJcmV0dXJuIHRoaXMuZ2V0Q3VycmVudEJ1c2luZXNzSG91ckV2ZW50cygpOwoJfQoKCWlmICh0eXBlb2YgY29uc3RyYWludElucHV0ID09PSAnb2JqZWN0JykgewoJCWlmIChjb25zdHJhaW50SW5wdXQuc3RhcnQgIT0gbnVsbCkgeyAvLyBuZWVkcyB0byBiZSBldmVudC1saWtlIGlucHV0CgkJCXJldHVybiB0aGlzLmV4cGFuZEV2ZW50KHRoaXMuYnVpbGRFdmVudEZyb21JbnB1dChjb25zdHJhaW50SW5wdXQpKTsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkCgkJfQoJfQoKCXJldHVybiB0aGlzLmNsaWVudEV2ZW50cyhjb25zdHJhaW50SW5wdXQpOyAvLyBwcm9iYWJseSBhbiBJRAp9OwoKCi8vIERvZXMgdGhlIGV2ZW50J3MgZGF0ZSByYW5nZSBpbnRlcnNlY3Qgd2l0aCB0aGUgZ2l2ZW4gcmFuZ2U/Ci8vIHN0YXJ0L2VuZCBhbHJlYWR5IGFzc3VtZWQgdG8gaGF2ZSBzdHJpcHBlZCB6b25lcyA6KApDYWxlbmRhci5wcm90b3R5cGUuZXZlbnRJbnRlcnNlY3RzUmFuZ2UgPSBmdW5jdGlvbihldmVudCwgcmFuZ2UpIHsKCXZhciBldmVudFN0YXJ0ID0gZXZlbnQuc3RhcnQuY2xvbmUoKS5zdHJpcFpvbmUoKTsKCXZhciBldmVudEVuZCA9IHRoaXMuZ2V0RXZlbnRFbmQoZXZlbnQpLnN0cmlwWm9uZSgpOwoKCXJldHVybiByYW5nZS5zdGFydCA8IGV2ZW50RW5kICYmIHJhbmdlLmVuZCA+IGV2ZW50U3RhcnQ7Cn07CgoKLyogQnVzaW5lc3MgSG91cnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKdmFyIEJVU0lORVNTX0hPVVJfRVZFTlRfREVGQVVMVFMgPSB7CglpZDogJ19mY0J1c2luZXNzSG91cnMnLCAvLyB3aWxsIHJlbGF0ZSBldmVudHMgZnJvbSBkaWZmZXJlbnQgY2FsbHMgdG8gZXhwYW5kRXZlbnQKCXN0YXJ0OiAnMDk6MDAnLAoJZW5kOiAnMTc6MDAnLAoJZG93OiBbIDEsIDIsIDMsIDQsIDUgXSwgLy8gbW9uZGF5IC0gZnJpZGF5CglyZW5kZXJpbmc6ICdpbnZlcnNlLWJhY2tncm91bmQnCgkvLyBjbGFzc05hbWVzIGFyZSBkZWZpbmVkIGluIGJ1c2luZXNzSG91cnNTZWdDbGFzc2VzCn07CgovLyBSZXR1cm4gZXZlbnRzIG9iamVjdHMgZm9yIGJ1c2luZXNzIGhvdXJzIHdpdGhpbiB0aGUgY3VycmVudCB2aWV3LgovLyBBYnVzZSBvZiBvdXIgZXZlbnQgc3lzdGVtIDooCkNhbGVuZGFyLnByb3RvdHlwZS5nZXRDdXJyZW50QnVzaW5lc3NIb3VyRXZlbnRzID0gZnVuY3Rpb24od2hvbGVEYXkpIHsKCXJldHVybiB0aGlzLmNvbXB1dGVCdXNpbmVzc0hvdXJFdmVudHMod2hvbGVEYXksIHRoaXMub3B0aW9ucy5idXNpbmVzc0hvdXJzKTsKfTsKCi8vIEdpdmVuIGEgcmF3IGlucHV0IHZhbHVlIGZyb20gb3B0aW9ucywgcmV0dXJuIGV2ZW50cyBvYmplY3RzIGZvciBidXNpbmVzcyBob3VycyB3aXRoaW4gdGhlIGN1cnJlbnQgdmlldy4KQ2FsZW5kYXIucHJvdG90eXBlLmNvbXB1dGVCdXNpbmVzc0hvdXJFdmVudHMgPSBmdW5jdGlvbih3aG9sZURheSwgaW5wdXQpIHsKCWlmIChpbnB1dCA9PT0gdHJ1ZSkgewoJCXJldHVybiB0aGlzLmV4cGFuZEJ1c2luZXNzSG91ckV2ZW50cyh3aG9sZURheSwgWyB7fSBdKTsKCX0KCWVsc2UgaWYgKCQuaXNQbGFpbk9iamVjdChpbnB1dCkpIHsKCQlyZXR1cm4gdGhpcy5leHBhbmRCdXNpbmVzc0hvdXJFdmVudHMod2hvbGVEYXksIFsgaW5wdXQgXSk7Cgl9CgllbHNlIGlmICgkLmlzQXJyYXkoaW5wdXQpKSB7CgkJcmV0dXJuIHRoaXMuZXhwYW5kQnVzaW5lc3NIb3VyRXZlbnRzKHdob2xlRGF5LCBpbnB1dCwgdHJ1ZSk7Cgl9CgllbHNlIHsKCQlyZXR1cm4gW107Cgl9Cn07CgovLyBpbnB1dHMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cy4KLy8gaWYgaWdub3JlTm9Eb3cgaXMgdHJ1ZSwgd2lsbCBpZ25vcmUgZW50cmllcyB0aGF0IGRvbid0IHNwZWNpZnkgYSBkYXktb2Ytd2VlayAoZG93KSBrZXkuCkNhbGVuZGFyLnByb3RvdHlwZS5leHBhbmRCdXNpbmVzc0hvdXJFdmVudHMgPSBmdW5jdGlvbih3aG9sZURheSwgaW5wdXRzLCBpZ25vcmVOb0RvdykgewoJdmFyIHZpZXcgPSB0aGlzLmdldFZpZXcoKTsKCXZhciBldmVudHMgPSBbXTsKCXZhciBpLCBpbnB1dDsKCglmb3IgKGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7CgkJaW5wdXQgPSBpbnB1dHNbaV07CgoJCWlmIChpZ25vcmVOb0RvdyAmJiAhaW5wdXQuZG93KSB7CgkJCWNvbnRpbnVlOwoJCX0KCgkJLy8gZ2l2ZSBkZWZhdWx0cy4gd2lsbCBtYWtlIGEgY29weQoJCWlucHV0ID0gJC5leHRlbmQoe30sIEJVU0lORVNTX0hPVVJfRVZFTlRfREVGQVVMVFMsIGlucHV0KTsKCgkJLy8gaWYgYSB3aG9sZS1kYXkgc2VyaWVzIGlzIHJlcXVlc3RlZCwgY2xlYXIgdGhlIHN0YXJ0L2VuZCB0aW1lcwoJCWlmICh3aG9sZURheSkgewoJCQlpbnB1dC5zdGFydCA9IG51bGw7CgkJCWlucHV0LmVuZCA9IG51bGw7CgkJfQoKCQlldmVudHMucHVzaC5hcHBseShldmVudHMsIC8vIGFwcGVuZAoJCQl0aGlzLmV4cGFuZEV2ZW50KAoJCQkJdGhpcy5idWlsZEV2ZW50RnJvbUlucHV0KGlucHV0KSwKCQkJCXZpZXcuc3RhcnQsCgkJCQl2aWV3LmVuZAoJCQkpCgkJKTsKCX0KCglyZXR1cm4gZXZlbnRzOwp9OwoKOzsKCi8qIEFuIGFic3RyYWN0IGNsYXNzIGZvciB0aGUgImJhc2ljIiB2aWV3cywgYXMgd2VsbCBhcyBtb250aCB2aWV3LiBSZW5kZXJzIG9uZSBvciBtb3JlIHJvd3Mgb2YgZGF5IGNlbGxzLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLy8gSXQgaXMgYSBtYW5hZ2VyIGZvciBhIERheUdyaWQgc3ViY29tcG9uZW50LCB3aGljaCBkb2VzIG1vc3Qgb2YgdGhlIGhlYXZ5IGxpZnRpbmcuCi8vIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB3aWR0aC9oZWlnaHQuCgp2YXIgQmFzaWNWaWV3ID0gRkMuQmFzaWNWaWV3ID0gVmlldy5leHRlbmQoewoKCXNjcm9sbGVyOiBudWxsLAoKCWRheUdyaWRDbGFzczogRGF5R3JpZCwgLy8gY2xhc3MgdGhlIGRheUdyaWQgd2lsbCBiZSBpbnN0YW50aWF0ZWQgZnJvbSAob3ZlcnJpZGFibGUgYnkgc3ViY2xhc3NlcykKCWRheUdyaWQ6IG51bGwsIC8vIHRoZSBtYWluIHN1YmNvbXBvbmVudCB0aGF0IGRvZXMgbW9zdCBvZiB0aGUgaGVhdnkgbGlmdGluZwoKCWRheU51bWJlcnNWaXNpYmxlOiBmYWxzZSwgLy8gZGlzcGxheSBkYXkgbnVtYmVycyBvbiBlYWNoIGRheSBjZWxsPwoJY29sV2Vla051bWJlcnNWaXNpYmxlOiBmYWxzZSwgLy8gZGlzcGxheSB3ZWVrIG51bWJlcnMgYWxvbmcgdGhlIHNpZGU/CgljZWxsV2Vla051bWJlcnNWaXNpYmxlOiBmYWxzZSwgLy8gZGlzcGxheSB3ZWVrIG51bWJlcnMgaW4gZGF5IGNlbGw/CgoJd2Vla051bWJlcldpZHRoOiBudWxsLCAvLyB3aWR0aCBvZiBhbGwgdGhlIHdlZWstbnVtYmVyIGNlbGxzIHJ1bm5pbmcgZG93biB0aGUgc2lkZQoKCWhlYWRDb250YWluZXJFbDogbnVsbCwgLy8gZGl2IHRoYXQgaG9sZCdzIHRoZSBkYXlHcmlkJ3MgcmVuZGVyZWQgZGF0ZSBoZWFkZXIKCWhlYWRSb3dFbDogbnVsbCwgLy8gdGhlIGZha2Ugcm93IGVsZW1lbnQgb2YgdGhlIGRheS1vZi13ZWVrIGhlYWRlcgoKCglpbml0aWFsaXplOiBmdW5jdGlvbigpIHsKCQl0aGlzLmRheUdyaWQgPSB0aGlzLmluc3RhbnRpYXRlRGF5R3JpZCgpOwoKCQl0aGlzLnNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKHsKCQkJb3ZlcmZsb3dYOiAnaGlkZGVuJywKCQkJb3ZlcmZsb3dZOiAnYXV0bycKCQl9KTsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgRGF5R3JpZCBvYmplY3QgdGhpcyB2aWV3IG5lZWRzLiBEcmF3cyBmcm9tIHRoaXMuZGF5R3JpZENsYXNzCglpbnN0YW50aWF0ZURheUdyaWQ6IGZ1bmN0aW9uKCkgewoJCS8vIGdlbmVyYXRlIGEgc3ViY2xhc3Mgb24gdGhlIGZseSB3aXRoIEJhc2ljVmlldy1zcGVjaWZpYyBiZWhhdmlvcgoJCS8vIFRPRE86IGNhY2hlIHRoaXMgc3ViY2xhc3MKCQl2YXIgc3ViY2xhc3MgPSB0aGlzLmRheUdyaWRDbGFzcy5leHRlbmQoYmFzaWNEYXlHcmlkTWV0aG9kcyk7CgoJCXJldHVybiBuZXcgc3ViY2xhc3ModGhpcyk7Cgl9LAoKCgkvLyBTZXRzIHRoZSBkaXNwbGF5IHJhbmdlIGFuZCBjb21wdXRlcyBhbGwgbmVjZXNzYXJ5IGRhdGVzCglzZXRSYW5nZTogZnVuY3Rpb24ocmFuZ2UpIHsKCQlWaWV3LnByb3RvdHlwZS5zZXRSYW5nZS5jYWxsKHRoaXMsIHJhbmdlKTsgLy8gY2FsbCB0aGUgc3VwZXItbWV0aG9kCgoJCXRoaXMuZGF5R3JpZC5icmVha09uV2Vla3MgPSAveWVhcnxtb250aHx3ZWVrLy50ZXN0KHRoaXMuaW50ZXJ2YWxVbml0KTsgLy8gZG8gYmVmb3JlIHNldFJhbmdlCgkJdGhpcy5kYXlHcmlkLnNldFJhbmdlKHJhbmdlKTsKCX0sCgoKCS8vIENvbXB1dGUgdGhlIHZhbHVlIHRvIGZlZWQgaW50byBzZXRSYW5nZS4gT3ZlcnJpZGVzIHN1cGVyY2xhc3MuCgljb21wdXRlUmFuZ2U6IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgcmFuZ2UgPSBWaWV3LnByb3RvdHlwZS5jb21wdXRlUmFuZ2UuY2FsbCh0aGlzLCBkYXRlKTsgLy8gZ2V0IHZhbHVlIGZyb20gdGhlIHN1cGVyLW1ldGhvZAoKCQkvLyB5ZWFyIGFuZCBtb250aCB2aWV3cyBzaG91bGQgYmUgYWxpZ25lZCB3aXRoIHdlZWtzLiB0aGlzIGlzIGFscmVhZHkgZG9uZSBmb3Igd2VlawoJCWlmICgveWVhcnxtb250aC8udGVzdChyYW5nZS5pbnRlcnZhbFVuaXQpKSB7CgkJCXJhbmdlLnN0YXJ0LnN0YXJ0T2YoJ3dlZWsnKTsKCQkJcmFuZ2Uuc3RhcnQgPSB0aGlzLnNraXBIaWRkZW5EYXlzKHJhbmdlLnN0YXJ0KTsKCgkJCS8vIG1ha2UgZW5kLW9mLXdlZWsgaWYgbm90IGFscmVhZHkKCQkJaWYgKHJhbmdlLmVuZC53ZWVrZGF5KCkpIHsKCQkJCXJhbmdlLmVuZC5hZGQoMSwgJ3dlZWsnKS5zdGFydE9mKCd3ZWVrJyk7CgkJCQlyYW5nZS5lbmQgPSB0aGlzLnNraXBIaWRkZW5EYXlzKHJhbmdlLmVuZCwgLTEsIHRydWUpOyAvLyBleGNsdXNpdmVseSBtb3ZlIGJhY2t3YXJkcwoJCQl9CgkJfQoKCQlyZXR1cm4gcmFuZ2U7Cgl9LAoKCgkvLyBSZW5kZXJzIHRoZSB2aWV3IGludG8gYHRoaXMuZWxgLCB3aGljaCBzaG91bGQgYWxyZWFkeSBiZSBhc3NpZ25lZAoJcmVuZGVyRGF0ZXM6IGZ1bmN0aW9uKCkgewoKCQl0aGlzLmRheU51bWJlcnNWaXNpYmxlID0gdGhpcy5kYXlHcmlkLnJvd0NudCA+IDE7IC8vIFRPRE86IG1ha2UgZ3JpZCByZXNwb25zaWJsZQoJCWlmICh0aGlzLm9wdCgnd2Vla051bWJlcnMnKSkgewoJCQlpZiAodGhpcy5vcHQoJ3dlZWtOdW1iZXJzV2l0aGluRGF5cycpKSB7CgkJCQl0aGlzLmNlbGxXZWVrTnVtYmVyc1Zpc2libGUgPSB0cnVlOwoJCQkJdGhpcy5jb2xXZWVrTnVtYmVyc1Zpc2libGUgPSBmYWxzZTsKCQkJfQoJCQllbHNlIHsKCQkJCXRoaXMuY2VsbFdlZWtOdW1iZXJzVmlzaWJsZSA9IGZhbHNlOwoJCQkJdGhpcy5jb2xXZWVrTnVtYmVyc1Zpc2libGUgPSB0cnVlOwoJCQl9OwoJCX0KCQl0aGlzLmRheUdyaWQubnVtYmVyc1Zpc2libGUgPSB0aGlzLmRheU51bWJlcnNWaXNpYmxlIHx8CgkJCXRoaXMuY2VsbFdlZWtOdW1iZXJzVmlzaWJsZSB8fCB0aGlzLmNvbFdlZWtOdW1iZXJzVmlzaWJsZTsKCgkJdGhpcy5lbC5hZGRDbGFzcygnZmMtYmFzaWMtdmlldycpLmh0bWwodGhpcy5yZW5kZXJTa2VsZXRvbkh0bWwoKSk7CgkJdGhpcy5yZW5kZXJIZWFkKCk7CgoJCXRoaXMuc2Nyb2xsZXIucmVuZGVyKCk7CgkJdmFyIGRheUdyaWRDb250YWluZXJFbCA9IHRoaXMuc2Nyb2xsZXIuZWwuYWRkQ2xhc3MoJ2ZjLWRheS1ncmlkLWNvbnRhaW5lcicpOwoJCXZhciBkYXlHcmlkRWwgPSAkKCc8ZGl2IGNsYXNzPSJmYy1kYXktZ3JpZCIgLz4nKS5hcHBlbmRUbyhkYXlHcmlkQ29udGFpbmVyRWwpOwoJCXRoaXMuZWwuZmluZCgnLmZjLWJvZHkgPiB0ciA+IHRkJykuYXBwZW5kKGRheUdyaWRDb250YWluZXJFbCk7CgoJCXRoaXMuZGF5R3JpZC5zZXRFbGVtZW50KGRheUdyaWRFbCk7CgkJdGhpcy5kYXlHcmlkLnJlbmRlckRhdGVzKHRoaXMuaGFzUmlnaWRSb3dzKCkpOwoJfSwKCgoJLy8gcmVuZGVyIHRoZSBkYXktb2Ytd2VlayBoZWFkZXJzCglyZW5kZXJIZWFkOiBmdW5jdGlvbigpIHsKCQl0aGlzLmhlYWRDb250YWluZXJFbCA9CgkJCXRoaXMuZWwuZmluZCgnLmZjLWhlYWQtY29udGFpbmVyJykKCQkJCS5odG1sKHRoaXMuZGF5R3JpZC5yZW5kZXJIZWFkSHRtbCgpKTsKCQl0aGlzLmhlYWRSb3dFbCA9IHRoaXMuaGVhZENvbnRhaW5lckVsLmZpbmQoJy5mYy1yb3cnKTsKCX0sCgoKCS8vIFVucmVuZGVycyB0aGUgY29udGVudCBvZiB0aGUgdmlldy4gU2luY2Ugd2UgaGF2ZW4ndCBzZXBhcmF0ZWQgc2tlbGV0b24gcmVuZGVyaW5nIGZyb20gZGF0ZSByZW5kZXJpbmcsCgkvLyBhbHdheXMgY29tcGxldGVseSBraWxsIHRoZSBkYXlHcmlkJ3MgcmVuZGVyaW5nLgoJdW5yZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJdGhpcy5kYXlHcmlkLnVucmVuZGVyRGF0ZXMoKTsKCQl0aGlzLmRheUdyaWQucmVtb3ZlRWxlbWVudCgpOwoJCXRoaXMuc2Nyb2xsZXIuZGVzdHJveSgpOwoJfSwKCgoJcmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJdGhpcy5kYXlHcmlkLnJlbmRlckJ1c2luZXNzSG91cnMoKTsKCX0sCgoKCXVucmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJdGhpcy5kYXlHcmlkLnVucmVuZGVyQnVzaW5lc3NIb3VycygpOwoJfSwKCgoJLy8gQnVpbGRzIHRoZSBIVE1MIHNrZWxldG9uIGZvciB0aGUgdmlldy4KCS8vIFRoZSBkYXktZ3JpZCBjb21wb25lbnQgd2lsbCByZW5kZXIgaW5zaWRlIG9mIGEgY29udGFpbmVyIGRlZmluZWQgYnkgdGhpcyBIVE1MLgoJcmVuZGVyU2tlbGV0b25IdG1sOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gJycgKwoJCQknPHRhYmxlPicgKwoJCQkJJzx0aGVhZCBjbGFzcz0iZmMtaGVhZCI+JyArCgkJCQkJJzx0cj4nICsKCQkJCQkJJzx0ZCBjbGFzcz0iZmMtaGVhZC1jb250YWluZXIgJyArIHRoaXMud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIj48L3RkPicgKwoJCQkJCSc8L3RyPicgKwoJCQkJJzwvdGhlYWQ+JyArCgkJCQknPHRib2R5IGNsYXNzPSJmYy1ib2R5Ij4nICsKCQkJCQknPHRyPicgKwoJCQkJCQknPHRkIGNsYXNzPSInICsgdGhpcy53aWRnZXRDb250ZW50Q2xhc3MgKyAnIj48L3RkPicgKwoJCQkJCSc8L3RyPicgKwoJCQkJJzwvdGJvZHk+JyArCgkJCSc8L3RhYmxlPic7Cgl9LAoKCgkvLyBHZW5lcmF0ZXMgYW4gSFRNTCBhdHRyaWJ1dGUgc3RyaW5nIGZvciBzZXR0aW5nIHRoZSB3aWR0aCBvZiB0aGUgd2VlayBudW1iZXIgY29sdW1uLCBpZiBpdCBpcyBrbm93bgoJd2Vla051bWJlclN0eWxlQXR0cjogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMud2Vla051bWJlcldpZHRoICE9PSBudWxsKSB7CgkJCXJldHVybiAnc3R5bGU9IndpZHRoOicgKyB0aGlzLndlZWtOdW1iZXJXaWR0aCArICdweCInOwoJCX0KCQlyZXR1cm4gJyc7Cgl9LAoKCgkvLyBEZXRlcm1pbmVzIHdoZXRoZXIgZWFjaCByb3cgc2hvdWxkIGhhdmUgYSBjb25zdGFudCBoZWlnaHQKCWhhc1JpZ2lkUm93czogZnVuY3Rpb24oKSB7CgkJdmFyIGV2ZW50TGltaXQgPSB0aGlzLm9wdCgnZXZlbnRMaW1pdCcpOwoJCXJldHVybiBldmVudExpbWl0ICYmIHR5cGVvZiBldmVudExpbWl0ICE9PSAnbnVtYmVyJzsKCX0sCgoKCS8qIERpbWVuc2lvbnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlZnJlc2hlcyB0aGUgaG9yaXpvbnRhbCBkaW1lbnNpb25zIG9mIHRoZSB2aWV3Cgl1cGRhdGVXaWR0aDogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuY29sV2Vla051bWJlcnNWaXNpYmxlKSB7CgkJCS8vIE1ha2Ugc3VyZSBhbGwgd2VlayBudW1iZXIgY2VsbHMgcnVubmluZyBkb3duIHRoZSBzaWRlIGhhdmUgdGhlIHNhbWUgd2lkdGguCgkJCS8vIFJlY29yZCB0aGUgd2lkdGggZm9yIGNlbGxzIGNyZWF0ZWQgbGF0ZXIuCgkJCXRoaXMud2Vla051bWJlcldpZHRoID0gbWF0Y2hDZWxsV2lkdGhzKAoJCQkJdGhpcy5lbC5maW5kKCcuZmMtd2Vlay1udW1iZXInKQoJCQkpOwoJCX0KCX0sCgoKCS8vIEFkanVzdHMgdGhlIHZlcnRpY2FsIGRpbWVuc2lvbnMgb2YgdGhlIHZpZXcgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZXMKCXNldEhlaWdodDogZnVuY3Rpb24odG90YWxIZWlnaHQsIGlzQXV0bykgewoJCXZhciBldmVudExpbWl0ID0gdGhpcy5vcHQoJ2V2ZW50TGltaXQnKTsKCQl2YXIgc2Nyb2xsZXJIZWlnaHQ7CgkJdmFyIHNjcm9sbGJhcldpZHRoczsKCgkJLy8gcmVzZXQgYWxsIGhlaWdodHMgdG8gYmUgbmF0dXJhbAoJCXRoaXMuc2Nyb2xsZXIuY2xlYXIoKTsKCQl1bmNvbXBlbnNhdGVTY3JvbGwodGhpcy5oZWFkUm93RWwpOwoKCQl0aGlzLmRheUdyaWQucmVtb3ZlU2VnUG9wb3ZlcigpOyAvLyBraWxsIHRoZSAibW9yZSIgcG9wb3ZlciBpZiBkaXNwbGF5ZWQKCgkJLy8gaXMgdGhlIGV2ZW50IGxpbWl0IGEgY29uc3RhbnQgbGV2ZWwgbnVtYmVyPwoJCWlmIChldmVudExpbWl0ICYmIHR5cGVvZiBldmVudExpbWl0ID09PSAnbnVtYmVyJykgewoJCQl0aGlzLmRheUdyaWQubGltaXRSb3dzKGV2ZW50TGltaXQpOyAvLyBsaW1pdCB0aGUgbGV2ZWxzIGZpcnN0IHNvIHRoZSBoZWlnaHQgY2FuIHJlZGlzdHJpYnV0ZSBhZnRlcgoJCX0KCgkJLy8gZGlzdHJpYnV0ZSB0aGUgaGVpZ2h0IHRvIHRoZSByb3dzCgkJLy8gKHRvdGFsSGVpZ2h0IGlzIGEgInJlY29tbWVuZGVkIiB2YWx1ZSBpZiBpc0F1dG8pCgkJc2Nyb2xsZXJIZWlnaHQgPSB0aGlzLmNvbXB1dGVTY3JvbGxlckhlaWdodCh0b3RhbEhlaWdodCk7CgkJdGhpcy5zZXRHcmlkSGVpZ2h0KHNjcm9sbGVySGVpZ2h0LCBpc0F1dG8pOwoKCQkvLyBpcyB0aGUgZXZlbnQgbGltaXQgZHluYW1pY2FsbHkgY2FsY3VsYXRlZD8KCQlpZiAoZXZlbnRMaW1pdCAmJiB0eXBlb2YgZXZlbnRMaW1pdCAhPT0gJ251bWJlcicpIHsKCQkJdGhpcy5kYXlHcmlkLmxpbWl0Um93cyhldmVudExpbWl0KTsgLy8gbGltaXQgdGhlIGxldmVscyBhZnRlciB0aGUgZ3JpZCdzIHJvdyBoZWlnaHRzIGhhdmUgYmVlbiBzZXQKCQl9CgoJCWlmICghaXNBdXRvKSB7IC8vIHNob3VsZCB3ZSBmb3JjZSBkaW1lbnNpb25zIG9mIHRoZSBzY3JvbGwgY29udGFpbmVyPwoKCQkJdGhpcy5zY3JvbGxlci5zZXRIZWlnaHQoc2Nyb2xsZXJIZWlnaHQpOwoJCQlzY3JvbGxiYXJXaWR0aHMgPSB0aGlzLnNjcm9sbGVyLmdldFNjcm9sbGJhcldpZHRocygpOwoKCQkJaWYgKHNjcm9sbGJhcldpZHRocy5sZWZ0IHx8IHNjcm9sbGJhcldpZHRocy5yaWdodCkgeyAvLyB1c2luZyBzY3JvbGxiYXJzPwoKCQkJCWNvbXBlbnNhdGVTY3JvbGwodGhpcy5oZWFkUm93RWwsIHNjcm9sbGJhcldpZHRocyk7CgoJCQkJLy8gZG9pbmcgdGhlIHNjcm9sbGJhciBjb21wZW5zYXRpb24gbWlnaHQgaGF2ZSBjcmVhdGVkIHRleHQgb3ZlcmZsb3cgd2hpY2ggY3JlYXRlZCBtb3JlIGhlaWdodC4gcmVkbwoJCQkJc2Nyb2xsZXJIZWlnaHQgPSB0aGlzLmNvbXB1dGVTY3JvbGxlckhlaWdodCh0b3RhbEhlaWdodCk7CgkJCQl0aGlzLnNjcm9sbGVyLnNldEhlaWdodChzY3JvbGxlckhlaWdodCk7CgkJCX0KCgkJCS8vIGd1YXJhbnRlZXMgdGhlIHNhbWUgc2Nyb2xsYmFyIHdpZHRocwoJCQl0aGlzLnNjcm9sbGVyLmxvY2tPdmVyZmxvdyhzY3JvbGxiYXJXaWR0aHMpOwoJCX0KCX0sCgoKCS8vIGdpdmVuIGEgZGVzaXJlZCB0b3RhbCBoZWlnaHQgb2YgdGhlIHZpZXcsIHJldHVybnMgd2hhdCB0aGUgaGVpZ2h0IG9mIHRoZSBzY3JvbGxlciBzaG91bGQgYmUKCWNvbXB1dGVTY3JvbGxlckhlaWdodDogZnVuY3Rpb24odG90YWxIZWlnaHQpIHsKCQlyZXR1cm4gdG90YWxIZWlnaHQgLQoJCQlzdWJ0cmFjdElubmVyRWxIZWlnaHQodGhpcy5lbCwgdGhpcy5zY3JvbGxlci5lbCk7IC8vIGV2ZXJ5dGhpbmcgdGhhdCdzIE5PVCB0aGUgc2Nyb2xsZXIKCX0sCgoKCS8vIFNldHMgdGhlIGhlaWdodCBvZiBqdXN0IHRoZSBEYXlHcmlkIGNvbXBvbmVudCBpbiB0aGlzIHZpZXcKCXNldEdyaWRIZWlnaHQ6IGZ1bmN0aW9uKGhlaWdodCwgaXNBdXRvKSB7CgkJaWYgKGlzQXV0bykgewoJCQl1bmRpc3RyaWJ1dGVIZWlnaHQodGhpcy5kYXlHcmlkLnJvd0Vscyk7IC8vIGxldCB0aGUgcm93cyBiZSB0aGVpciBuYXR1cmFsIGhlaWdodCB3aXRoIG5vIGV4cGFuZGluZwoJCX0KCQllbHNlIHsKCQkJZGlzdHJpYnV0ZUhlaWdodCh0aGlzLmRheUdyaWQucm93RWxzLCBoZWlnaHQsIHRydWUpOyAvLyB0cnVlID0gY29tcGVuc2F0ZSBmb3IgaGVpZ2h0LWhvZ2dpbmcgcm93cwoJCX0KCX0sCgoKCS8qIFNjcm9sbAoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcXVlcnlTY3JvbGw6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnNjcm9sbGVyLmdldFNjcm9sbFRvcCgpOwoJfSwKCgoJc2V0U2Nyb2xsOiBmdW5jdGlvbih0b3ApIHsKCQl0aGlzLnNjcm9sbGVyLnNldFNjcm9sbFRvcCh0b3ApOwoJfSwKCgoJLyogSGl0IEFyZWFzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJLy8gZm9yd2FyZCBhbGwgaGl0LXJlbGF0ZWQgbWV0aG9kIGNhbGxzIHRvIGRheUdyaWQKCgoJcHJlcGFyZUhpdHM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZGF5R3JpZC5wcmVwYXJlSGl0cygpOwoJfSwKCgoJcmVsZWFzZUhpdHM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZGF5R3JpZC5yZWxlYXNlSGl0cygpOwoJfSwKCgoJcXVlcnlIaXQ6IGZ1bmN0aW9uKGxlZnQsIHRvcCkgewoJCXJldHVybiB0aGlzLmRheUdyaWQucXVlcnlIaXQobGVmdCwgdG9wKTsKCX0sCgoKCWdldEhpdFNwYW46IGZ1bmN0aW9uKGhpdCkgewoJCXJldHVybiB0aGlzLmRheUdyaWQuZ2V0SGl0U3BhbihoaXQpOwoJfSwKCgoJZ2V0SGl0RWw6IGZ1bmN0aW9uKGhpdCkgewoJCXJldHVybiB0aGlzLmRheUdyaWQuZ2V0SGl0RWwoaGl0KTsKCX0sCgoKCS8qIEV2ZW50cwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyB0aGUgZ2l2ZW4gZXZlbnRzIG9udG8gdGhlIHZpZXcgYW5kIHBvcHVsYXRlcyB0aGUgc2VnbWVudHMgYXJyYXkKCXJlbmRlckV2ZW50czogZnVuY3Rpb24oZXZlbnRzKSB7CgkJdGhpcy5kYXlHcmlkLnJlbmRlckV2ZW50cyhldmVudHMpOwoKCQl0aGlzLnVwZGF0ZUhlaWdodCgpOyAvLyBtdXN0IGNvbXBlbnNhdGUgZm9yIGV2ZW50cyB0aGF0IG92ZXJmbG93IHRoZSByb3cKCX0sCgoKCS8vIFJldHJpZXZlcyBhbGwgc2VnbWVudCBvYmplY3RzIHRoYXQgYXJlIHJlbmRlcmVkIGluIHRoZSB2aWV3CglnZXRFdmVudFNlZ3M6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRheUdyaWQuZ2V0RXZlbnRTZWdzKCk7Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYWxsIGV2ZW50IGVsZW1lbnRzIGFuZCBjbGVhcnMgaW50ZXJuYWwgc2VnbWVudCBkYXRhCgl1bnJlbmRlckV2ZW50czogZnVuY3Rpb24oKSB7CgkJdGhpcy5kYXlHcmlkLnVucmVuZGVyRXZlbnRzKCk7CgoJCS8vIHdlIERPTidUIG5lZWQgdG8gY2FsbCB1cGRhdGVIZWlnaHQoKSBiZWNhdXNlCgkJLy8gYSByZW5kZXJFdmVudHMoKSBjYWxsIGFsd2F5cyBoYXBwZW5zIGFmdGVyIHRoaXMsIHdoaWNoIHdpbGwgZXZlbnR1YWxseSBjYWxsIHVwZGF0ZUhlaWdodCgpCgl9LAoKCgkvKiBEcmFnZ2luZyAoZm9yIGJvdGggZXZlbnRzIGFuZCBleHRlcm5hbCBlbGVtZW50cykKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEEgcmV0dXJuZWQgdmFsdWUgb2YgYHRydWVgIHNpZ25hbHMgdGhhdCBhIG1vY2sgImhlbHBlciIgZXZlbnQgaGFzIGJlZW4gcmVuZGVyZWQuCglyZW5kZXJEcmFnOiBmdW5jdGlvbihkcm9wTG9jYXRpb24sIHNlZykgewoJCXJldHVybiB0aGlzLmRheUdyaWQucmVuZGVyRHJhZyhkcm9wTG9jYXRpb24sIHNlZyk7Cgl9LAoKCgl1bnJlbmRlckRyYWc6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZGF5R3JpZC51bnJlbmRlckRyYWcoKTsKCX0sCgoKCS8qIFNlbGVjdGlvbgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGEgc2VsZWN0aW9uCglyZW5kZXJTZWxlY3Rpb246IGZ1bmN0aW9uKHNwYW4pIHsKCQl0aGlzLmRheUdyaWQucmVuZGVyU2VsZWN0aW9uKHNwYW4pOwoJfSwKCgoJLy8gVW5yZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb25zIG9mIGEgc2VsZWN0aW9uCgl1bnJlbmRlclNlbGVjdGlvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy5kYXlHcmlkLnVucmVuZGVyU2VsZWN0aW9uKCk7Cgl9Cgp9KTsKCgovLyBNZXRob2RzIHRoYXQgd2lsbCBjdXN0b21pemUgdGhlIHJlbmRlcmluZyBiZWhhdmlvciBvZiB0aGUgQmFzaWNWaWV3J3MgZGF5R3JpZAp2YXIgYmFzaWNEYXlHcmlkTWV0aG9kcyA9IHsKCgoJLy8gR2VuZXJhdGVzIHRoZSBIVE1MIHRoYXQgd2lsbCBnbyBiZWZvcmUgdGhlIGRheS1vZiB3ZWVrIGhlYWRlciBjZWxscwoJcmVuZGVySGVhZEludHJvSHRtbDogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgoJCWlmICh2aWV3LmNvbFdlZWtOdW1iZXJzVmlzaWJsZSkgewoJCQlyZXR1cm4gJycgKwoJCQkJJzx0aCBjbGFzcz0iZmMtd2Vlay1udW1iZXIgJyArIHZpZXcud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIiAnICsgdmlldy53ZWVrTnVtYmVyU3R5bGVBdHRyKCkgKyAnPicgKwoJCQkJCSc8c3Bhbj4nICsgLy8gbmVlZGVkIGZvciBtYXRjaENlbGxXaWR0aHMKCQkJCQkJaHRtbEVzY2FwZSh2aWV3Lm9wdCgnd2Vla051bWJlclRpdGxlJykpICsKCQkJCQknPC9zcGFuPicgKwoJCQkJJzwvdGg+JzsKCQl9CgoJCXJldHVybiAnJzsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IHdpbGwgZ28gYmVmb3JlIGNvbnRlbnQtc2tlbGV0b24gY2VsbHMgdGhhdCBkaXNwbGF5IHRoZSBkYXkvd2VlayBudW1iZXJzCglyZW5kZXJOdW1iZXJJbnRyb0h0bWw6IGZ1bmN0aW9uKHJvdykgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciB3ZWVrU3RhcnQgPSB0aGlzLmdldENlbGxEYXRlKHJvdywgMCk7CgoJCWlmICh2aWV3LmNvbFdlZWtOdW1iZXJzVmlzaWJsZSkgewoJCQlyZXR1cm4gJycgKwoJCQkJJzx0ZCBjbGFzcz0iZmMtd2Vlay1udW1iZXIiICcgKyB2aWV3LndlZWtOdW1iZXJTdHlsZUF0dHIoKSArICc+JyArCgkJCQkJdmlldy5idWlsZEdvdG9BbmNob3JIdG1sKCAvLyBhc2lkZSBmcm9tIGxpbmssIGltcG9ydGFudCBmb3IgbWF0Y2hDZWxsV2lkdGhzCgkJCQkJCXsgZGF0ZTogd2Vla1N0YXJ0LCB0eXBlOiAnd2VlaycsIGZvcmNlT2ZmOiB0aGlzLmNvbENudCA9PT0gMSB9LAoJCQkJCQl3ZWVrU3RhcnQuZm9ybWF0KCd3JykgLy8gaW5uZXIgSFRNTAoJCQkJCSkgKwoJCQkJJzwvdGQ+JzsKCQl9CgoJCXJldHVybiAnJzsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IGdvZXMgYmVmb3JlIHRoZSBkYXkgYmcgY2VsbHMgZm9yIGVhY2ggZGF5LXJvdwoJcmVuZGVyQmdJbnRyb0h0bWw6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoKCQlpZiAodmlldy5jb2xXZWVrTnVtYmVyc1Zpc2libGUpIHsKCQkJcmV0dXJuICc8dGQgY2xhc3M9ImZjLXdlZWstbnVtYmVyICcgKyB2aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciICcgKwoJCQkJdmlldy53ZWVrTnVtYmVyU3R5bGVBdHRyKCkgKyAnPjwvdGQ+JzsKCQl9CgoJCXJldHVybiAnJzsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IGdvZXMgYmVmb3JlIGV2ZXJ5IG90aGVyIHR5cGUgb2Ygcm93IGdlbmVyYXRlZCBieSBEYXlHcmlkLgoJLy8gQWZmZWN0cyBoZWxwZXItc2tlbGV0b24gYW5kIGhpZ2hsaWdodC1za2VsZXRvbiByb3dzLgoJcmVuZGVySW50cm9IdG1sOiBmdW5jdGlvbigpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCgkJaWYgKHZpZXcuY29sV2Vla051bWJlcnNWaXNpYmxlKSB7CgkJCXJldHVybiAnPHRkIGNsYXNzPSJmYy13ZWVrLW51bWJlciIgJyArIHZpZXcud2Vla051bWJlclN0eWxlQXR0cigpICsgJz48L3RkPic7CgkJfQoKCQlyZXR1cm4gJyc7Cgl9Cgp9OwoKOzsKCi8qIEEgbW9udGggdmlldyB3aXRoIGRheSBjZWxscyBydW5uaW5nIGluIHJvd3MgKG9uZS1wZXItd2VlaykgYW5kIGNvbHVtbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2YXIgTW9udGhWaWV3ID0gRkMuTW9udGhWaWV3ID0gQmFzaWNWaWV3LmV4dGVuZCh7CgoJLy8gUHJvZHVjZXMgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCByYW5nZSB0byBkaXNwbGF5Cgljb21wdXRlUmFuZ2U6IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgcmFuZ2UgPSBCYXNpY1ZpZXcucHJvdG90eXBlLmNvbXB1dGVSYW5nZS5jYWxsKHRoaXMsIGRhdGUpOyAvLyBnZXQgdmFsdWUgZnJvbSBzdXBlci1tZXRob2QKCQl2YXIgcm93Q250OwoKCQkvLyBlbnN1cmUgNiB3ZWVrcwoJCWlmICh0aGlzLmlzRml4ZWRXZWVrcygpKSB7CgkJCXJvd0NudCA9IE1hdGguY2VpbChyYW5nZS5lbmQuZGlmZihyYW5nZS5zdGFydCwgJ3dlZWtzJywgdHJ1ZSkpOyAvLyBjb3VsZCBiZSBwYXJ0aWFsIHdlZWtzIGR1ZSB0byBoaWRkZW5EYXlzCgkJCXJhbmdlLmVuZC5hZGQoNiAtIHJvd0NudCwgJ3dlZWtzJyk7CgkJfQoKCQlyZXR1cm4gcmFuZ2U7Cgl9LAoKCgkvLyBPdmVycmlkZXMgdGhlIGRlZmF1bHQgQmFzaWNWaWV3IGJlaGF2aW9yIHRvIGhhdmUgc3BlY2lhbCBtdWx0aS13ZWVrIGF1dG8taGVpZ2h0IGxvZ2ljCglzZXRHcmlkSGVpZ2h0OiBmdW5jdGlvbihoZWlnaHQsIGlzQXV0bykgewoKCQkvLyBpZiBhdXRvLCBtYWtlIHRoZSBoZWlnaHQgb2YgZWFjaCByb3cgdGhlIGhlaWdodCB0aGF0IGl0IHdvdWxkIGJlIGlmIHRoZXJlIHdlcmUgNiB3ZWVrcwoJCWlmIChpc0F1dG8pIHsKCQkJaGVpZ2h0ICo9IHRoaXMucm93Q250IC8gNjsKCQl9CgoJCWRpc3RyaWJ1dGVIZWlnaHQodGhpcy5kYXlHcmlkLnJvd0VscywgaGVpZ2h0LCAhaXNBdXRvKTsgLy8gaWYgYXV0bywgZG9uJ3QgY29tcGVuc2F0ZSBmb3IgaGVpZ2h0LWhvZ2dpbmcgcm93cwoJfSwKCgoJaXNGaXhlZFdlZWtzOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5vcHQoJ2ZpeGVkV2Vla0NvdW50Jyk7Cgl9Cgp9KTsKCjs7CgpmY1ZpZXdzLmJhc2ljID0gewoJJ2NsYXNzJzogQmFzaWNWaWV3Cn07CgpmY1ZpZXdzLmJhc2ljRGF5ID0gewoJdHlwZTogJ2Jhc2ljJywKCWR1cmF0aW9uOiB7IGRheXM6IDEgfQp9OwoKZmNWaWV3cy5iYXNpY1dlZWsgPSB7Cgl0eXBlOiAnYmFzaWMnLAoJZHVyYXRpb246IHsgd2Vla3M6IDEgfQp9OwoKZmNWaWV3cy5tb250aCA9IHsKCSdjbGFzcyc6IE1vbnRoVmlldywKCWR1cmF0aW9uOiB7IG1vbnRoczogMSB9LCAvLyBpbXBvcnRhbnQgZm9yIHByZXYvbmV4dAoJZGVmYXVsdHM6IHsKCQlmaXhlZFdlZWtDb3VudDogdHJ1ZQoJfQp9Owo7OwoKLyogQW4gYWJzdHJhY3QgY2xhc3MgZm9yIGFsbCBhZ2VuZGEtcmVsYXRlZCB2aWV3cy4gRGlzcGxheXMgb25lIG1vcmUgY29sdW1ucyB3aXRoIHRpbWUgc2xvdHMgcnVubmluZyB2ZXJ0aWNhbGx5LgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLy8gSXMgYSBtYW5hZ2VyIGZvciB0aGUgVGltZUdyaWQgc3ViY29tcG9uZW50IGFuZCBwb3NzaWJseSB0aGUgRGF5R3JpZCBzdWJjb21wb25lbnQgKGlmIGFsbERheVNsb3QgaXMgb24pLgovLyBSZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgd2lkdGgvaGVpZ2h0LgoKdmFyIEFnZW5kYVZpZXcgPSBGQy5BZ2VuZGFWaWV3ID0gVmlldy5leHRlbmQoewoKCXNjcm9sbGVyOiBudWxsLAoKCXRpbWVHcmlkQ2xhc3M6IFRpbWVHcmlkLCAvLyBjbGFzcyB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSB0aW1lR3JpZC4gc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKCXRpbWVHcmlkOiBudWxsLCAvLyB0aGUgbWFpbiB0aW1lLWdyaWQgc3ViY29tcG9uZW50IG9mIHRoaXMgdmlldwoKCWRheUdyaWRDbGFzczogRGF5R3JpZCwgLy8gY2xhc3MgdXNlZCB0byBpbnN0YW50aWF0ZSB0aGUgZGF5R3JpZC4gc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKCWRheUdyaWQ6IG51bGwsIC8vIHRoZSAiYWxsLWRheSIgc3ViY29tcG9uZW50LiBpZiBhbGwtZGF5IGlzIHR1cm5lZCBvZmYsIHRoaXMgd2lsbCBiZSBudWxsCgoJYXhpc1dpZHRoOiBudWxsLCAvLyB0aGUgd2lkdGggb2YgdGhlIHRpbWUgYXhpcyBydW5uaW5nIGRvd24gdGhlIHNpZGUKCgloZWFkQ29udGFpbmVyRWw6IG51bGwsIC8vIGRpdiB0aGF0IGhvbGQncyB0aGUgdGltZUdyaWQncyByZW5kZXJlZCBkYXRlIGhlYWRlcgoJbm9TY3JvbGxSb3dFbHM6IG51bGwsIC8vIHNldCBvZiBmYWtlIHJvdyBlbGVtZW50cyB0aGF0IG11c3QgY29tcGVuc2F0ZSB3aGVuIHNjcm9sbGVyIGhhcyBzY3JvbGxiYXJzCgoJLy8gd2hlbiB0aGUgdGltZS1ncmlkIGlzbid0IHRhbGwgZW5vdWdoIHRvIG9jY3VweSB0aGUgZ2l2ZW4gaGVpZ2h0LCB3ZSByZW5kZXIgYW4gPGhyPiB1bmRlcm5lYXRoCglib3R0b21SdWxlRWw6IG51bGwsCgoKCWluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewoJCXRoaXMudGltZUdyaWQgPSB0aGlzLmluc3RhbnRpYXRlVGltZUdyaWQoKTsKCgkJaWYgKHRoaXMub3B0KCdhbGxEYXlTbG90JykpIHsgLy8gc2hvdWxkIHdlIGRpc3BsYXkgdGhlICJhbGwtZGF5IiBhcmVhPwoJCQl0aGlzLmRheUdyaWQgPSB0aGlzLmluc3RhbnRpYXRlRGF5R3JpZCgpOyAvLyB0aGUgYWxsLWRheSBzdWJjb21wb25lbnQgb2YgdGhpcyB2aWV3CgkJfQoKCQl0aGlzLnNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKHsKCQkJb3ZlcmZsb3dYOiAnaGlkZGVuJywKCQkJb3ZlcmZsb3dZOiAnYXV0bycKCQl9KTsKCX0sCgoKCS8vIEluc3RhbnRpYXRlcyB0aGUgVGltZUdyaWQgb2JqZWN0IHRoaXMgdmlldyBuZWVkcy4gRHJhd3MgZnJvbSB0aGlzLnRpbWVHcmlkQ2xhc3MKCWluc3RhbnRpYXRlVGltZUdyaWQ6IGZ1bmN0aW9uKCkgewoJCXZhciBzdWJjbGFzcyA9IHRoaXMudGltZUdyaWRDbGFzcy5leHRlbmQoYWdlbmRhVGltZUdyaWRNZXRob2RzKTsKCgkJcmV0dXJuIG5ldyBzdWJjbGFzcyh0aGlzKTsKCX0sCgoKCS8vIEluc3RhbnRpYXRlcyB0aGUgRGF5R3JpZCBvYmplY3QgdGhpcyB2aWV3IG1pZ2h0IG5lZWQuIERyYXdzIGZyb20gdGhpcy5kYXlHcmlkQ2xhc3MKCWluc3RhbnRpYXRlRGF5R3JpZDogZnVuY3Rpb24oKSB7CgkJdmFyIHN1YmNsYXNzID0gdGhpcy5kYXlHcmlkQ2xhc3MuZXh0ZW5kKGFnZW5kYURheUdyaWRNZXRob2RzKTsKCgkJcmV0dXJuIG5ldyBzdWJjbGFzcyh0aGlzKTsKCX0sCgoKCS8qIFJlbmRlcmluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gU2V0cyB0aGUgZGlzcGxheSByYW5nZSBhbmQgY29tcHV0ZXMgYWxsIG5lY2Vzc2FyeSBkYXRlcwoJc2V0UmFuZ2U6IGZ1bmN0aW9uKHJhbmdlKSB7CgkJVmlldy5wcm90b3R5cGUuc2V0UmFuZ2UuY2FsbCh0aGlzLCByYW5nZSk7IC8vIGNhbGwgdGhlIHN1cGVyLW1ldGhvZAoKCQl0aGlzLnRpbWVHcmlkLnNldFJhbmdlKHJhbmdlKTsKCQlpZiAodGhpcy5kYXlHcmlkKSB7CgkJCXRoaXMuZGF5R3JpZC5zZXRSYW5nZShyYW5nZSk7CgkJfQoJfSwKCgoJLy8gUmVuZGVycyB0aGUgdmlldyBpbnRvIGB0aGlzLmVsYCwgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZAoJcmVuZGVyRGF0ZXM6IGZ1bmN0aW9uKCkgewoKCQl0aGlzLmVsLmFkZENsYXNzKCdmYy1hZ2VuZGEtdmlldycpLmh0bWwodGhpcy5yZW5kZXJTa2VsZXRvbkh0bWwoKSk7CgkJdGhpcy5yZW5kZXJIZWFkKCk7CgoJCXRoaXMuc2Nyb2xsZXIucmVuZGVyKCk7CgkJdmFyIHRpbWVHcmlkV3JhcEVsID0gdGhpcy5zY3JvbGxlci5lbC5hZGRDbGFzcygnZmMtdGltZS1ncmlkLWNvbnRhaW5lcicpOwoJCXZhciB0aW1lR3JpZEVsID0gJCgnPGRpdiBjbGFzcz0iZmMtdGltZS1ncmlkIiAvPicpLmFwcGVuZFRvKHRpbWVHcmlkV3JhcEVsKTsKCQl0aGlzLmVsLmZpbmQoJy5mYy1ib2R5ID4gdHIgPiB0ZCcpLmFwcGVuZCh0aW1lR3JpZFdyYXBFbCk7CgoJCXRoaXMudGltZUdyaWQuc2V0RWxlbWVudCh0aW1lR3JpZEVsKTsKCQl0aGlzLnRpbWVHcmlkLnJlbmRlckRhdGVzKCk7CgoJCS8vIHRoZSA8aHI+IHRoYXQgc29tZXRpbWVzIGRpc3BsYXlzIHVuZGVyIHRoZSB0aW1lLWdyaWQKCQl0aGlzLmJvdHRvbVJ1bGVFbCA9ICQoJzxociBjbGFzcz0iZmMtZGl2aWRlciAnICsgdGhpcy53aWRnZXRIZWFkZXJDbGFzcyArICciLz4nKQoJCQkuYXBwZW5kVG8odGhpcy50aW1lR3JpZC5lbCk7IC8vIGluamVjdCBpdCBpbnRvIHRoZSB0aW1lLWdyaWQKCgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQuc2V0RWxlbWVudCh0aGlzLmVsLmZpbmQoJy5mYy1kYXktZ3JpZCcpKTsKCQkJdGhpcy5kYXlHcmlkLnJlbmRlckRhdGVzKCk7CgoJCQkvLyBoYXZlIHRoZSBkYXktZ3JpZCBleHRlbmQgaXQncyBjb29yZGluYXRlIGFyZWEgb3ZlciB0aGUgPGhyPiBkaXZpZGluZyB0aGUgdHdvIGdyaWRzCgkJCXRoaXMuZGF5R3JpZC5ib3R0b21Db29yZFBhZGRpbmcgPSB0aGlzLmRheUdyaWQuZWwubmV4dCgnaHInKS5vdXRlckhlaWdodCgpOwoJCX0KCgkJdGhpcy5ub1Njcm9sbFJvd0VscyA9IHRoaXMuZWwuZmluZCgnLmZjLXJvdzpub3QoLmZjLXNjcm9sbGVyICopJyk7IC8vIGZha2Ugcm93cyBub3Qgd2l0aGluIHRoZSBzY3JvbGxlcgoJfSwKCgoJLy8gcmVuZGVyIHRoZSBkYXktb2Ytd2VlayBoZWFkZXJzCglyZW5kZXJIZWFkOiBmdW5jdGlvbigpIHsKCQl0aGlzLmhlYWRDb250YWluZXJFbCA9CgkJCXRoaXMuZWwuZmluZCgnLmZjLWhlYWQtY29udGFpbmVyJykKCQkJCS5odG1sKHRoaXMudGltZUdyaWQucmVuZGVySGVhZEh0bWwoKSk7Cgl9LAoKCgkvLyBVbnJlbmRlcnMgdGhlIGNvbnRlbnQgb2YgdGhlIHZpZXcuIFNpbmNlIHdlIGhhdmVuJ3Qgc2VwYXJhdGVkIHNrZWxldG9uIHJlbmRlcmluZyBmcm9tIGRhdGUgcmVuZGVyaW5nLAoJLy8gYWx3YXlzIGNvbXBsZXRlbHkga2lsbCBlYWNoIGdyaWQncyByZW5kZXJpbmcuCgl1bnJlbmRlckRhdGVzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnRpbWVHcmlkLnVucmVuZGVyRGF0ZXMoKTsKCQl0aGlzLnRpbWVHcmlkLnJlbW92ZUVsZW1lbnQoKTsKCgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQudW5yZW5kZXJEYXRlcygpOwoJCQl0aGlzLmRheUdyaWQucmVtb3ZlRWxlbWVudCgpOwoJCX0KCgkJdGhpcy5zY3JvbGxlci5kZXN0cm95KCk7Cgl9LAoKCgkvLyBCdWlsZHMgdGhlIEhUTUwgc2tlbGV0b24gZm9yIHRoZSB2aWV3LgoJLy8gVGhlIGRheS1ncmlkIGFuZCB0aW1lLWdyaWQgY29tcG9uZW50cyB3aWxsIHJlbmRlciBpbnNpZGUgY29udGFpbmVycyBkZWZpbmVkIGJ5IHRoaXMgSFRNTC4KCXJlbmRlclNrZWxldG9uSHRtbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICcnICsKCQkJJzx0YWJsZT4nICsKCQkJCSc8dGhlYWQgY2xhc3M9ImZjLWhlYWQiPicgKwoJCQkJCSc8dHI+JyArCgkJCQkJCSc8dGQgY2xhc3M9ImZjLWhlYWQtY29udGFpbmVyICcgKyB0aGlzLndpZGdldEhlYWRlckNsYXNzICsgJyI+PC90ZD4nICsKCQkJCQknPC90cj4nICsKCQkJCSc8L3RoZWFkPicgKwoJCQkJJzx0Ym9keSBjbGFzcz0iZmMtYm9keSI+JyArCgkJCQkJJzx0cj4nICsKCQkJCQkJJzx0ZCBjbGFzcz0iJyArIHRoaXMud2lkZ2V0Q29udGVudENsYXNzICsgJyI+JyArCgkJCQkJCQkodGhpcy5kYXlHcmlkID8KCQkJCQkJCQknPGRpdiBjbGFzcz0iZmMtZGF5LWdyaWQiLz4nICsKCQkJCQkJCQknPGhyIGNsYXNzPSJmYy1kaXZpZGVyICcgKyB0aGlzLndpZGdldEhlYWRlckNsYXNzICsgJyIvPicgOgoJCQkJCQkJCScnCgkJCQkJCQkJKSArCgkJCQkJCSc8L3RkPicgKwoJCQkJCSc8L3RyPicgKwoJCQkJJzwvdGJvZHk+JyArCgkJCSc8L3RhYmxlPic7Cgl9LAoKCgkvLyBHZW5lcmF0ZXMgYW4gSFRNTCBhdHRyaWJ1dGUgc3RyaW5nIGZvciBzZXR0aW5nIHRoZSB3aWR0aCBvZiB0aGUgYXhpcywgaWYgaXQgaXMga25vd24KCWF4aXNTdHlsZUF0dHI6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmF4aXNXaWR0aCAhPT0gbnVsbCkgewoJCQkgcmV0dXJuICdzdHlsZT0id2lkdGg6JyArIHRoaXMuYXhpc1dpZHRoICsgJ3B4Iic7CgkJfQoJCXJldHVybiAnJzsKCX0sCgoKCS8qIEJ1c2luZXNzIEhvdXJzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglyZW5kZXJCdXNpbmVzc0hvdXJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnRpbWVHcmlkLnJlbmRlckJ1c2luZXNzSG91cnMoKTsKCgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQucmVuZGVyQnVzaW5lc3NIb3VycygpOwoJCX0KCX0sCgoKCXVucmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJdGhpcy50aW1lR3JpZC51bnJlbmRlckJ1c2luZXNzSG91cnMoKTsKCgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQudW5yZW5kZXJCdXNpbmVzc0hvdXJzKCk7CgkJfQoJfSwKCgoJLyogTm93IEluZGljYXRvcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJZ2V0Tm93SW5kaWNhdG9yVW5pdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0Tm93SW5kaWNhdG9yVW5pdCgpOwoJfSwKCgoJcmVuZGVyTm93SW5kaWNhdG9yOiBmdW5jdGlvbihkYXRlKSB7CgkJdGhpcy50aW1lR3JpZC5yZW5kZXJOb3dJbmRpY2F0b3IoZGF0ZSk7Cgl9LAoKCgl1bnJlbmRlck5vd0luZGljYXRvcjogZnVuY3Rpb24oKSB7CgkJdGhpcy50aW1lR3JpZC51bnJlbmRlck5vd0luZGljYXRvcigpOwoJfSwKCgoJLyogRGltZW5zaW9ucwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJdXBkYXRlU2l6ZTogZnVuY3Rpb24oaXNSZXNpemUpIHsKCQl0aGlzLnRpbWVHcmlkLnVwZGF0ZVNpemUoaXNSZXNpemUpOwoKCQlWaWV3LnByb3RvdHlwZS51cGRhdGVTaXplLmNhbGwodGhpcywgaXNSZXNpemUpOyAvLyBjYWxsIHRoZSBzdXBlci1tZXRob2QKCX0sCgoKCS8vIFJlZnJlc2hlcyB0aGUgaG9yaXpvbnRhbCBkaW1lbnNpb25zIG9mIHRoZSB2aWV3Cgl1cGRhdGVXaWR0aDogZnVuY3Rpb24oKSB7CgkJLy8gbWFrZSBhbGwgYXhpcyBjZWxscyBsaW5lIHVwLCBhbmQgcmVjb3JkIHRoZSB3aWR0aCBzbyBuZXdseSBjcmVhdGVkIGF4aXMgY2VsbHMgd2lsbCBoYXZlIGl0CgkJdGhpcy5heGlzV2lkdGggPSBtYXRjaENlbGxXaWR0aHModGhpcy5lbC5maW5kKCcuZmMtYXhpcycpKTsKCX0sCgoKCS8vIEFkanVzdHMgdGhlIHZlcnRpY2FsIGRpbWVuc2lvbnMgb2YgdGhlIHZpZXcgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZXMKCXNldEhlaWdodDogZnVuY3Rpb24odG90YWxIZWlnaHQsIGlzQXV0bykgewoJCXZhciBldmVudExpbWl0OwoJCXZhciBzY3JvbGxlckhlaWdodDsKCQl2YXIgc2Nyb2xsYmFyV2lkdGhzOwoKCQkvLyByZXNldCBhbGwgZGltZW5zaW9ucyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzdGF0ZQoJCXRoaXMuYm90dG9tUnVsZUVsLmhpZGUoKTsgLy8gLnNob3coKSB3aWxsIGJlIGNhbGxlZCBsYXRlciBpZiB0aGlzIDxocj4gaXMgbmVjZXNzYXJ5CgkJdGhpcy5zY3JvbGxlci5jbGVhcigpOyAvLyBzZXRzIGhlaWdodCB0byAnYXV0bycgYW5kIGNsZWFycyBvdmVyZmxvdwoJCXVuY29tcGVuc2F0ZVNjcm9sbCh0aGlzLm5vU2Nyb2xsUm93RWxzKTsKCgkJLy8gbGltaXQgbnVtYmVyIG9mIGV2ZW50cyBpbiB0aGUgYWxsLWRheSBhcmVhCgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQucmVtb3ZlU2VnUG9wb3ZlcigpOyAvLyBraWxsIHRoZSAibW9yZSIgcG9wb3ZlciBpZiBkaXNwbGF5ZWQKCgkJCWV2ZW50TGltaXQgPSB0aGlzLm9wdCgnZXZlbnRMaW1pdCcpOwoJCQlpZiAoZXZlbnRMaW1pdCAmJiB0eXBlb2YgZXZlbnRMaW1pdCAhPT0gJ251bWJlcicpIHsKCQkJCWV2ZW50TGltaXQgPSBBR0VOREFfQUxMX0RBWV9FVkVOVF9MSU1JVDsgLy8gbWFrZSBzdXJlICJhdXRvIiBnb2VzIHRvIGEgcmVhbCBudW1iZXIKCQkJfQoJCQlpZiAoZXZlbnRMaW1pdCkgewoJCQkJdGhpcy5kYXlHcmlkLmxpbWl0Um93cyhldmVudExpbWl0KTsKCQkJfQoJCX0KCgkJaWYgKCFpc0F1dG8pIHsgLy8gc2hvdWxkIHdlIGZvcmNlIGRpbWVuc2lvbnMgb2YgdGhlIHNjcm9sbCBjb250YWluZXI/CgoJCQlzY3JvbGxlckhlaWdodCA9IHRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHRvdGFsSGVpZ2h0KTsKCQkJdGhpcy5zY3JvbGxlci5zZXRIZWlnaHQoc2Nyb2xsZXJIZWlnaHQpOwoJCQlzY3JvbGxiYXJXaWR0aHMgPSB0aGlzLnNjcm9sbGVyLmdldFNjcm9sbGJhcldpZHRocygpOwoKCQkJaWYgKHNjcm9sbGJhcldpZHRocy5sZWZ0IHx8IHNjcm9sbGJhcldpZHRocy5yaWdodCkgeyAvLyB1c2luZyBzY3JvbGxiYXJzPwoKCQkJCS8vIG1ha2UgdGhlIGFsbC1kYXkgYW5kIGhlYWRlciByb3dzIGxpbmVzIHVwCgkJCQljb21wZW5zYXRlU2Nyb2xsKHRoaXMubm9TY3JvbGxSb3dFbHMsIHNjcm9sbGJhcldpZHRocyk7CgoJCQkJLy8gdGhlIHNjcm9sbGJhciBjb21wZW5zYXRpb24gbWlnaHQgaGF2ZSBjaGFuZ2VkIHRleHQgZmxvdywgd2hpY2ggbWlnaHQgYWZmZWN0IGhlaWdodCwgc28gcmVjYWxjdWxhdGUKCQkJCS8vIGFuZCByZWFwcGx5IHRoZSBkZXNpcmVkIGhlaWdodCB0byB0aGUgc2Nyb2xsZXIuCgkJCQlzY3JvbGxlckhlaWdodCA9IHRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHRvdGFsSGVpZ2h0KTsKCQkJCXRoaXMuc2Nyb2xsZXIuc2V0SGVpZ2h0KHNjcm9sbGVySGVpZ2h0KTsKCQkJfQoKCQkJLy8gZ3VhcmFudGVlcyB0aGUgc2FtZSBzY3JvbGxiYXIgd2lkdGhzCgkJCXRoaXMuc2Nyb2xsZXIubG9ja092ZXJmbG93KHNjcm9sbGJhcldpZHRocyk7CgoJCQkvLyBpZiB0aGVyZSdzIGFueSBzcGFjZSBiZWxvdyB0aGUgc2xhdHMsIHNob3cgdGhlIGhvcml6b250YWwgcnVsZS4KCQkJLy8gdGhpcyB3b24ndCBjYXVzZSBhbnkgbmV3IG92ZXJmbG93LCBiZWNhdXNlIGxvY2tPdmVyZmxvdyBhbHJlYWR5IGNhbGxlZC4KCQkJaWYgKHRoaXMudGltZUdyaWQuZ2V0VG90YWxTbGF0SGVpZ2h0KCkgPCBzY3JvbGxlckhlaWdodCkgewoJCQkJdGhpcy5ib3R0b21SdWxlRWwuc2hvdygpOwoJCQl9CgkJfQoJfSwKCgoJLy8gZ2l2ZW4gYSBkZXNpcmVkIHRvdGFsIGhlaWdodCBvZiB0aGUgdmlldywgcmV0dXJucyB3aGF0IHRoZSBoZWlnaHQgb2YgdGhlIHNjcm9sbGVyIHNob3VsZCBiZQoJY29tcHV0ZVNjcm9sbGVySGVpZ2h0OiBmdW5jdGlvbih0b3RhbEhlaWdodCkgewoJCXJldHVybiB0b3RhbEhlaWdodCAtCgkJCXN1YnRyYWN0SW5uZXJFbEhlaWdodCh0aGlzLmVsLCB0aGlzLnNjcm9sbGVyLmVsKTsgLy8gZXZlcnl0aGluZyB0aGF0J3MgTk9UIHRoZSBzY3JvbGxlcgoJfSwKCgoJLyogU2Nyb2xsCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBDb21wdXRlcyB0aGUgaW5pdGlhbCBwcmUtY29uZmlndXJlZCBzY3JvbGwgc3RhdGUgcHJpb3IgdG8gYWxsb3dpbmcgdGhlIHVzZXIgdG8gY2hhbmdlIGl0Cgljb21wdXRlSW5pdGlhbFNjcm9sbDogZnVuY3Rpb24oKSB7CgkJdmFyIHNjcm9sbFRpbWUgPSBtb21lbnQuZHVyYXRpb24odGhpcy5vcHQoJ3Njcm9sbFRpbWUnKSk7CgkJdmFyIHRvcCA9IHRoaXMudGltZUdyaWQuY29tcHV0ZVRpbWVUb3Aoc2Nyb2xsVGltZSk7CgoJCS8vIHpvb20gY2FuIGdpdmUgd2VpcmQgZmxvYXRpbmctcG9pbnQgdmFsdWVzLiByYXRoZXIgc2Nyb2xsIGEgbGl0dGxlIGJpdCBmdXJ0aGVyCgkJdG9wID0gTWF0aC5jZWlsKHRvcCk7CgoJCWlmICh0b3ApIHsKCQkJdG9wKys7IC8vIHRvIG92ZXJjb21lIHRvcCBib3JkZXIgdGhhdCBzbG90cyBiZXlvbmQgdGhlIGZpcnN0IGhhdmUuIGxvb2tzIGJldHRlcgoJCX0KCgkJcmV0dXJuIHRvcDsKCX0sCgoKCXF1ZXJ5U2Nyb2xsOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5zY3JvbGxlci5nZXRTY3JvbGxUb3AoKTsKCX0sCgoKCXNldFNjcm9sbDogZnVuY3Rpb24odG9wKSB7CgkJdGhpcy5zY3JvbGxlci5zZXRTY3JvbGxUb3AodG9wKTsKCX0sCgoKCS8qIEhpdCBBcmVhcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCS8vIGZvcndhcmQgYWxsIGhpdC1yZWxhdGVkIG1ldGhvZCBjYWxscyB0byB0aGUgZ3JpZHMgKGRheUdyaWQgbWlnaHQgbm90IGJlIGRlZmluZWQpCgoKCXByZXBhcmVIaXRzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnRpbWVHcmlkLnByZXBhcmVIaXRzKCk7CgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQucHJlcGFyZUhpdHMoKTsKCQl9Cgl9LAoKCglyZWxlYXNlSGl0czogZnVuY3Rpb24oKSB7CgkJdGhpcy50aW1lR3JpZC5yZWxlYXNlSGl0cygpOwoJCWlmICh0aGlzLmRheUdyaWQpIHsKCQkJdGhpcy5kYXlHcmlkLnJlbGVhc2VIaXRzKCk7CgkJfQoJfSwKCgoJcXVlcnlIaXQ6IGZ1bmN0aW9uKGxlZnQsIHRvcCkgewoJCXZhciBoaXQgPSB0aGlzLnRpbWVHcmlkLnF1ZXJ5SGl0KGxlZnQsIHRvcCk7CgoJCWlmICghaGl0ICYmIHRoaXMuZGF5R3JpZCkgewoJCQloaXQgPSB0aGlzLmRheUdyaWQucXVlcnlIaXQobGVmdCwgdG9wKTsKCQl9CgoJCXJldHVybiBoaXQ7Cgl9LAoKCglnZXRIaXRTcGFuOiBmdW5jdGlvbihoaXQpIHsKCQkvLyBUT0RPOiBoaXQuY29tcG9uZW50IGlzIHNldCBhcyBhIGhhY2sgdG8gaWRlbnRpZnkgd2hlcmUgdGhlIGhpdCBjYW1lIGZyb20KCQlyZXR1cm4gaGl0LmNvbXBvbmVudC5nZXRIaXRTcGFuKGhpdCk7Cgl9LAoKCglnZXRIaXRFbDogZnVuY3Rpb24oaGl0KSB7CgkJLy8gVE9ETzogaGl0LmNvbXBvbmVudCBpcyBzZXQgYXMgYSBoYWNrIHRvIGlkZW50aWZ5IHdoZXJlIHRoZSBoaXQgY2FtZSBmcm9tCgkJcmV0dXJuIGhpdC5jb21wb25lbnQuZ2V0SGl0RWwoaGl0KTsKCX0sCgoKCS8qIEV2ZW50cwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBldmVudHMgb250byB0aGUgdmlldyBhbmQgcG9wdWxhdGVzIHRoZSBWaWV3J3Mgc2VnbWVudCBhcnJheQoJcmVuZGVyRXZlbnRzOiBmdW5jdGlvbihldmVudHMpIHsKCQl2YXIgZGF5RXZlbnRzID0gW107CgkJdmFyIHRpbWVkRXZlbnRzID0gW107CgkJdmFyIGRheVNlZ3MgPSBbXTsKCQl2YXIgdGltZWRTZWdzOwoJCXZhciBpOwoKCQkvLyBzZXBhcmF0ZSB0aGUgZXZlbnRzIGludG8gYWxsLWRheSBhbmQgdGltZWQKCQlmb3IgKGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7CgkJCWlmIChldmVudHNbaV0uYWxsRGF5KSB7CgkJCQlkYXlFdmVudHMucHVzaChldmVudHNbaV0pOwoJCQl9CgkJCWVsc2UgewoJCQkJdGltZWRFdmVudHMucHVzaChldmVudHNbaV0pOwoJCQl9CgkJfQoKCQkvLyByZW5kZXIgdGhlIGV2ZW50cyBpbiB0aGUgc3ViY29tcG9uZW50cwoJCXRpbWVkU2VncyA9IHRoaXMudGltZUdyaWQucmVuZGVyRXZlbnRzKHRpbWVkRXZlbnRzKTsKCQlpZiAodGhpcy5kYXlHcmlkKSB7CgkJCWRheVNlZ3MgPSB0aGlzLmRheUdyaWQucmVuZGVyRXZlbnRzKGRheUV2ZW50cyk7CgkJfQoKCQkvLyB0aGUgYWxsLWRheSBhcmVhIGlzIGZsZXhpYmxlIGFuZCBtaWdodCBoYXZlIGEgbG90IG9mIGV2ZW50cywgc28gc2hpZnQgdGhlIGhlaWdodAoJCXRoaXMudXBkYXRlSGVpZ2h0KCk7Cgl9LAoKCgkvLyBSZXRyaWV2ZXMgYWxsIHNlZ21lbnQgb2JqZWN0cyB0aGF0IGFyZSByZW5kZXJlZCBpbiB0aGUgdmlldwoJZ2V0RXZlbnRTZWdzOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy50aW1lR3JpZC5nZXRFdmVudFNlZ3MoKS5jb25jYXQoCgkJCXRoaXMuZGF5R3JpZCA/IHRoaXMuZGF5R3JpZC5nZXRFdmVudFNlZ3MoKSA6IFtdCgkJKTsKCX0sCgoKCS8vIFVucmVuZGVycyBhbGwgZXZlbnQgZWxlbWVudHMgYW5kIGNsZWFycyBpbnRlcm5hbCBzZWdtZW50IGRhdGEKCXVucmVuZGVyRXZlbnRzOiBmdW5jdGlvbigpIHsKCgkJLy8gdW5yZW5kZXIgdGhlIGV2ZW50cyBpbiB0aGUgc3ViY29tcG9uZW50cwoJCXRoaXMudGltZUdyaWQudW5yZW5kZXJFdmVudHMoKTsKCQlpZiAodGhpcy5kYXlHcmlkKSB7CgkJCXRoaXMuZGF5R3JpZC51bnJlbmRlckV2ZW50cygpOwoJCX0KCgkJLy8gd2UgRE9OJ1QgbmVlZCB0byBjYWxsIHVwZGF0ZUhlaWdodCgpIGJlY2F1c2UKCQkvLyBhIHJlbmRlckV2ZW50cygpIGNhbGwgYWx3YXlzIGhhcHBlbnMgYWZ0ZXIgdGhpcywgd2hpY2ggd2lsbCBldmVudHVhbGx5IGNhbGwgdXBkYXRlSGVpZ2h0KCkKCX0sCgoKCS8qIERyYWdnaW5nIChmb3IgZXZlbnRzIGFuZCBleHRlcm5hbCBlbGVtZW50cykKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEEgcmV0dXJuZWQgdmFsdWUgb2YgYHRydWVgIHNpZ25hbHMgdGhhdCBhIG1vY2sgImhlbHBlciIgZXZlbnQgaGFzIGJlZW4gcmVuZGVyZWQuCglyZW5kZXJEcmFnOiBmdW5jdGlvbihkcm9wTG9jYXRpb24sIHNlZykgewoJCWlmIChkcm9wTG9jYXRpb24uc3RhcnQuaGFzVGltZSgpKSB7CgkJCXJldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlckRyYWcoZHJvcExvY2F0aW9uLCBzZWcpOwoJCX0KCQllbHNlIGlmICh0aGlzLmRheUdyaWQpIHsKCQkJcmV0dXJuIHRoaXMuZGF5R3JpZC5yZW5kZXJEcmFnKGRyb3BMb2NhdGlvbiwgc2VnKTsKCQl9Cgl9LAoKCgl1bnJlbmRlckRyYWc6IGZ1bmN0aW9uKCkgewoJCXRoaXMudGltZUdyaWQudW5yZW5kZXJEcmFnKCk7CgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQudW5yZW5kZXJEcmFnKCk7CgkJfQoJfSwKCgoJLyogU2VsZWN0aW9uCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBSZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYSBzZWxlY3Rpb24KCXJlbmRlclNlbGVjdGlvbjogZnVuY3Rpb24oc3BhbikgewoJCWlmIChzcGFuLnN0YXJ0Lmhhc1RpbWUoKSB8fCBzcGFuLmVuZC5oYXNUaW1lKCkpIHsKCQkJdGhpcy50aW1lR3JpZC5yZW5kZXJTZWxlY3Rpb24oc3Bhbik7CgkJfQoJCWVsc2UgaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQucmVuZGVyU2VsZWN0aW9uKHNwYW4pOwoJCX0KCX0sCgoKCS8vIFVucmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9ucyBvZiBhIHNlbGVjdGlvbgoJdW5yZW5kZXJTZWxlY3Rpb246IGZ1bmN0aW9uKCkgewoJCXRoaXMudGltZUdyaWQudW5yZW5kZXJTZWxlY3Rpb24oKTsKCQlpZiAodGhpcy5kYXlHcmlkKSB7CgkJCXRoaXMuZGF5R3JpZC51bnJlbmRlclNlbGVjdGlvbigpOwoJCX0KCX0KCn0pOwoKCi8vIE1ldGhvZHMgdGhhdCB3aWxsIGN1c3RvbWl6ZSB0aGUgcmVuZGVyaW5nIGJlaGF2aW9yIG9mIHRoZSBBZ2VuZGFWaWV3J3MgdGltZUdyaWQKLy8gVE9ETzogbW92ZSBpbnRvIFRpbWVHcmlkCnZhciBhZ2VuZGFUaW1lR3JpZE1ldGhvZHMgPSB7CgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IHdpbGwgZ28gYmVmb3JlIHRoZSBkYXktb2Ygd2VlayBoZWFkZXIgY2VsbHMKCXJlbmRlckhlYWRJbnRyb0h0bWw6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciB3ZWVrVGV4dDsKCgkJaWYgKHZpZXcub3B0KCd3ZWVrTnVtYmVycycpKSB7CgkJCXdlZWtUZXh0ID0gdGhpcy5zdGFydC5mb3JtYXQodmlldy5vcHQoJ3NtYWxsV2Vla0Zvcm1hdCcpKTsKCgkJCXJldHVybiAnJyArCgkJCQknPHRoIGNsYXNzPSJmYy1heGlzIGZjLXdlZWstbnVtYmVyICcgKyB2aWV3LndpZGdldEhlYWRlckNsYXNzICsgJyIgJyArIHZpZXcuYXhpc1N0eWxlQXR0cigpICsgJz4nICsKCQkJCQl2aWV3LmJ1aWxkR290b0FuY2hvckh0bWwoIC8vIGFzaWRlIGZyb20gbGluaywgaW1wb3J0YW50IGZvciBtYXRjaENlbGxXaWR0aHMKCQkJCQkJeyBkYXRlOiB0aGlzLnN0YXJ0LCB0eXBlOiAnd2VlaycsIGZvcmNlT2ZmOiB0aGlzLmNvbENudCA+IDEgfSwKCQkJCQkJaHRtbEVzY2FwZSh3ZWVrVGV4dCkgLy8gaW5uZXIgSFRNTAoJCQkJCSkgKwoJCQkJJzwvdGg+JzsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiAnPHRoIGNsYXNzPSJmYy1heGlzICcgKyB2aWV3LndpZGdldEhlYWRlckNsYXNzICsgJyIgJyArIHZpZXcuYXhpc1N0eWxlQXR0cigpICsgJz48L3RoPic7CgkJfQoJfSwKCgoJLy8gR2VuZXJhdGVzIHRoZSBIVE1MIHRoYXQgZ29lcyBiZWZvcmUgdGhlIGJnIG9mIHRoZSBUaW1lR3JpZCBzbG90IGFyZWEuIExvbmcgdmVydGljYWwgY29sdW1uLgoJcmVuZGVyQmdJbnRyb0h0bWw6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoKCQlyZXR1cm4gJzx0ZCBjbGFzcz0iZmMtYXhpcyAnICsgdmlldy53aWRnZXRDb250ZW50Q2xhc3MgKyAnIiAnICsgdmlldy5heGlzU3R5bGVBdHRyKCkgKyAnPjwvdGQ+JzsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IGdvZXMgYmVmb3JlIGFsbCBvdGhlciB0eXBlcyBvZiBjZWxscy4KCS8vIEFmZmVjdHMgY29udGVudC1za2VsZXRvbiwgaGVscGVyLXNrZWxldG9uLCBoaWdobGlnaHQtc2tlbGV0b24gZm9yIGJvdGggdGhlIHRpbWUtZ3JpZCBhbmQgZGF5LWdyaWQuCglyZW5kZXJJbnRyb0h0bWw6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoKCQlyZXR1cm4gJzx0ZCBjbGFzcz0iZmMtYXhpcyIgJyArIHZpZXcuYXhpc1N0eWxlQXR0cigpICsgJz48L3RkPic7Cgl9Cgp9OwoKCi8vIE1ldGhvZHMgdGhhdCB3aWxsIGN1c3RvbWl6ZSB0aGUgcmVuZGVyaW5nIGJlaGF2aW9yIG9mIHRoZSBBZ2VuZGFWaWV3J3MgZGF5R3JpZAp2YXIgYWdlbmRhRGF5R3JpZE1ldGhvZHMgPSB7CgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IGdvZXMgYmVmb3JlIHRoZSBhbGwtZGF5IGNlbGxzCglyZW5kZXJCZ0ludHJvSHRtbDogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgoJCXJldHVybiAnJyArCgkJCSc8dGQgY2xhc3M9ImZjLWF4aXMgJyArIHZpZXcud2lkZ2V0Q29udGVudENsYXNzICsgJyIgJyArIHZpZXcuYXhpc1N0eWxlQXR0cigpICsgJz4nICsKCQkJCSc8c3Bhbj4nICsgLy8gbmVlZGVkIGZvciBtYXRjaENlbGxXaWR0aHMKCQkJCQl2aWV3LmdldEFsbERheUh0bWwoKSArCgkJCQknPC9zcGFuPicgKwoJCQknPC90ZD4nOwoJfSwKCgoJLy8gR2VuZXJhdGVzIHRoZSBIVE1MIHRoYXQgZ29lcyBiZWZvcmUgYWxsIG90aGVyIHR5cGVzIG9mIGNlbGxzLgoJLy8gQWZmZWN0cyBjb250ZW50LXNrZWxldG9uLCBoZWxwZXItc2tlbGV0b24sIGhpZ2hsaWdodC1za2VsZXRvbiBmb3IgYm90aCB0aGUgdGltZS1ncmlkIGFuZCBkYXktZ3JpZC4KCXJlbmRlckludHJvSHRtbDogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgoJCXJldHVybiAnPHRkIGNsYXNzPSJmYy1heGlzIiAnICsgdmlldy5heGlzU3R5bGVBdHRyKCkgKyAnPjwvdGQ+JzsKCX0KCn07Cgo7OwoKdmFyIEFHRU5EQV9BTExfREFZX0VWRU5UX0xJTUlUID0gNTsKCi8vIHBvdGVudGlhbCBuaWNlIHZhbHVlcyBmb3IgdGhlIHNsb3QtZHVyYXRpb24gYW5kIGludGVydmFsLWR1cmF0aW9uCi8vIGZyb20gbGFyZ2VzdCB0byBzbWFsbGVzdAp2YXIgQUdFTkRBX1NUT0NLX1NVQl9EVVJBVElPTlMgPSBbCgl7IGhvdXJzOiAxIH0sCgl7IG1pbnV0ZXM6IDMwIH0sCgl7IG1pbnV0ZXM6IDE1IH0sCgl7IHNlY29uZHM6IDMwIH0sCgl7IHNlY29uZHM6IDE1IH0KXTsKCmZjVmlld3MuYWdlbmRhID0gewoJJ2NsYXNzJzogQWdlbmRhVmlldywKCWRlZmF1bHRzOiB7CgkJYWxsRGF5U2xvdDogdHJ1ZSwKCQlzbG90RHVyYXRpb246ICcwMDozMDowMCcsCgkJbWluVGltZTogJzAwOjAwOjAwJywKCQltYXhUaW1lOiAnMjQ6MDA6MDAnLAoJCXNsb3RFdmVudE92ZXJsYXA6IHRydWUgLy8gYSBiYWQgbmFtZS4gY29uZnVzZWQgd2l0aCBvdmVybGFwL2NvbnN0cmFpbnQgc3lzdGVtCgl9Cn07CgpmY1ZpZXdzLmFnZW5kYURheSA9IHsKCXR5cGU6ICdhZ2VuZGEnLAoJZHVyYXRpb246IHsgZGF5czogMSB9Cn07CgpmY1ZpZXdzLmFnZW5kYVdlZWsgPSB7Cgl0eXBlOiAnYWdlbmRhJywKCWR1cmF0aW9uOiB7IHdlZWtzOiAxIH0KfTsKOzsKCi8qClJlc3BvbnNpYmxlIGZvciB0aGUgc2Nyb2xsZXIsIGFuZCBmb3J3YXJkaW5nIGV2ZW50LXJlbGF0ZWQgYWN0aW9ucyBpbnRvIHRoZSAiZ3JpZCIKKi8KdmFyIExpc3RWaWV3ID0gVmlldy5leHRlbmQoewoKCWdyaWQ6IG51bGwsCglzY3JvbGxlcjogbnVsbCwKCglpbml0aWFsaXplOiBmdW5jdGlvbigpIHsKCQl0aGlzLmdyaWQgPSBuZXcgTGlzdFZpZXdHcmlkKHRoaXMpOwoJCXRoaXMuc2Nyb2xsZXIgPSBuZXcgU2Nyb2xsZXIoewoJCQlvdmVyZmxvd1g6ICdoaWRkZW4nLAoJCQlvdmVyZmxvd1k6ICdhdXRvJwoJCX0pOwoJfSwKCglzZXRSYW5nZTogZnVuY3Rpb24ocmFuZ2UpIHsKCQlWaWV3LnByb3RvdHlwZS5zZXRSYW5nZS5jYWxsKHRoaXMsIHJhbmdlKTsgLy8gc3VwZXIKCgkJdGhpcy5ncmlkLnNldFJhbmdlKHJhbmdlKTsgLy8gbmVlZHMgdG8gcHJvY2VzcyByYW5nZS1yZWxhdGVkIG9wdGlvbnMKCX0sCgoJcmVuZGVyU2tlbGV0b246IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWwuYWRkQ2xhc3MoCgkJCSdmYy1saXN0LXZpZXcgJyArCgkJCXRoaXMud2lkZ2V0Q29udGVudENsYXNzCgkJKTsKCgkJdGhpcy5zY3JvbGxlci5yZW5kZXIoKTsKCQl0aGlzLnNjcm9sbGVyLmVsLmFwcGVuZFRvKHRoaXMuZWwpOwoKCQl0aGlzLmdyaWQuc2V0RWxlbWVudCh0aGlzLnNjcm9sbGVyLnNjcm9sbEVsKTsKCX0sCgoJdW5yZW5kZXJTa2VsZXRvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy5zY3JvbGxlci5kZXN0cm95KCk7IC8vIHdpbGwgcmVtb3ZlIHRoZSBHcmlkIHRvbwoJfSwKCglzZXRIZWlnaHQ6IGZ1bmN0aW9uKHRvdGFsSGVpZ2h0LCBpc0F1dG8pIHsKCQl0aGlzLnNjcm9sbGVyLnNldEhlaWdodCh0aGlzLmNvbXB1dGVTY3JvbGxlckhlaWdodCh0b3RhbEhlaWdodCkpOwoJfSwKCgljb21wdXRlU2Nyb2xsZXJIZWlnaHQ6IGZ1bmN0aW9uKHRvdGFsSGVpZ2h0KSB7CgkJcmV0dXJuIHRvdGFsSGVpZ2h0IC0KCQkJc3VidHJhY3RJbm5lckVsSGVpZ2h0KHRoaXMuZWwsIHRoaXMuc2Nyb2xsZXIuZWwpOyAvLyBldmVyeXRoaW5nIHRoYXQncyBOT1QgdGhlIHNjcm9sbGVyCgl9LAoKCXJlbmRlckV2ZW50czogZnVuY3Rpb24oZXZlbnRzKSB7CgkJdGhpcy5ncmlkLnJlbmRlckV2ZW50cyhldmVudHMpOwoJfSwKCgl1bnJlbmRlckV2ZW50czogZnVuY3Rpb24oKSB7CgkJdGhpcy5ncmlkLnVucmVuZGVyRXZlbnRzKCk7Cgl9LAoKCWlzRXZlbnRSZXNpemFibGU6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIGZhbHNlOwoJfSwKCglpc0V2ZW50RHJhZ2dhYmxlOiBmdW5jdGlvbihldmVudCkgewoJCXJldHVybiBmYWxzZTsKCX0KCn0pOwoKLyoKUmVzcG9uc2libGUgZm9yIGV2ZW50IHJlbmRlcmluZyBhbmQgdXNlci1pbnRlcmFjdGlvbi4KSXRzICJlbCIgaXMgdGhlIGlubmVyLWNvbnRlbnQgb2YgdGhlIGFib3ZlIHZpZXcncyBzY3JvbGxlci4KKi8KdmFyIExpc3RWaWV3R3JpZCA9IEdyaWQuZXh0ZW5kKHsKCglzZWdTZWxlY3RvcjogJy5mYy1saXN0LWl0ZW0nLCAvLyB3aGljaCBlbGVtZW50cyBhY2NlcHQgZXZlbnQgYWN0aW9ucwoJaGFzRGF5SW50ZXJhY3Rpb25zOiBmYWxzZSwgLy8gbm8gZGF5IHNlbGVjdGlvbiBvciBkYXkgY2xpY2tpbmcKCgkvLyBzbGljZXMgYnkgZGF5CglzcGFuVG9TZWdzOiBmdW5jdGlvbihzcGFuKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGRheVN0YXJ0ID0gdmlldy5zdGFydC5jbG9uZSgpLnRpbWUoMCk7IC8vIHRpbWVkLCBzbyBzZWdzIGdldCB0aW1lcyEKCQl2YXIgZGF5SW5kZXggPSAwOwoJCXZhciBzZWc7CgkJdmFyIHNlZ3MgPSBbXTsKCgkJd2hpbGUgKGRheVN0YXJ0IDwgdmlldy5lbmQpIHsKCgkJCXNlZyA9IGludGVyc2VjdFJhbmdlcyhzcGFuLCB7CgkJCQlzdGFydDogZGF5U3RhcnQsCgkJCQllbmQ6IGRheVN0YXJ0LmNsb25lKCkuYWRkKDEsICdkYXknKQoJCQl9KTsKCgkJCWlmIChzZWcpIHsKCQkJCXNlZy5kYXlJbmRleCA9IGRheUluZGV4OwoJCQkJc2Vncy5wdXNoKHNlZyk7CgkJCX0KCgkJCWRheVN0YXJ0LmFkZCgxLCAnZGF5Jyk7CgkJCWRheUluZGV4Kys7CgoJCQkvLyBkZXRlY3Qgd2hlbiBzcGFuIHdvbid0IGdvIGZ1bGx5IGludG8gdGhlIG5leHQgZGF5LAoJCQkvLyBhbmQgbXV0YXRlIHRoZSBsYXRlc3Qgc2VnIHRvIHRoZSBiZSB0aGUgZW5kLgoJCQlpZiAoCgkJCQlzZWcgJiYgIXNlZy5pc0VuZCAmJiBzcGFuLmVuZC5oYXNUaW1lKCkgJiYKCQkJCXNwYW4uZW5kIDwgZGF5U3RhcnQuY2xvbmUoKS5hZGQodGhpcy52aWV3Lm5leHREYXlUaHJlc2hvbGQpCgkJCSkgewoJCQkJc2VnLmVuZCA9IHNwYW4uZW5kLmNsb25lKCk7CgkJCQlzZWcuaXNFbmQgPSB0cnVlOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCXJldHVybiBzZWdzOwoJfSwKCgkvLyBsaWtlICI0OjAwYW0iCgljb21wdXRlRXZlbnRUaW1lRm9ybWF0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy52aWV3Lm9wdCgnbWVkaXVtVGltZUZvcm1hdCcpOwoJfSwKCgkvLyBmb3IgZXZlbnRzIHdpdGggYSB1cmwsIHRoZSB3aG9sZSA8dHI+IHNob3VsZCBiZSBjbGlja2FibGUsCgkvLyBidXQgaXQncyBpbXBvc3NpYmxlIHRvIHdyYXAgd2l0aCBhbiA8YT4gdGFnLiBzaW11bGF0ZSB0aGlzLgoJaGFuZGxlU2VnQ2xpY2s6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQl2YXIgdXJsOwoKCQlHcmlkLnByb3RvdHlwZS5oYW5kbGVTZWdDbGljay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBzdXBlci4gbWlnaHQgcHJldmVudCB0aGUgZGVmYXVsdCBhY3Rpb24KCgkJLy8gbm90IGNsaWNraW5nIG9uIG9yIHdpdGhpbiBhbiA8YT4gd2l0aCBhbiBocmVmCgkJaWYgKCEkKGV2LnRhcmdldCkuY2xvc2VzdCgnYVtocmVmXScpLmxlbmd0aCkgewoJCQl1cmwgPSBzZWcuZXZlbnQudXJsOwoJCQlpZiAodXJsICYmICFldi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgeyAvLyBqc0V2ZW50IG5vdCBjYW5jZWxsZWQgaW4gaGFuZGxlcgoJCQkJd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7IC8vIHNpbXVsYXRlIGxpbmsgY2xpY2sKCQkJfQoJCX0KCX0sCgoJLy8gcmV0dXJucyBsaXN0IG9mIGZvcmVncm91bmQgc2VncyB0aGF0IHdlcmUgYWN0dWFsbHkgcmVuZGVyZWQKCXJlbmRlckZnU2VnczogZnVuY3Rpb24oc2VncykgewoJCXNlZ3MgPSB0aGlzLnJlbmRlckZnU2VnRWxzKHNlZ3MpOyAvLyBtaWdodCBmaWx0ZXIgYXdheSBoaWRkZW4gZXZlbnRzCgoJCWlmICghc2Vncy5sZW5ndGgpIHsKCQkJdGhpcy5yZW5kZXJFbXB0eU1lc3NhZ2UoKTsKCQl9CgkJZWxzZSB7CgkJCXRoaXMucmVuZGVyU2VnTGlzdChzZWdzKTsKCQl9CgoJCXJldHVybiBzZWdzOwoJfSwKCglyZW5kZXJFbXB0eU1lc3NhZ2U6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWwuaHRtbCgKCQkJJzxkaXYgY2xhc3M9ImZjLWxpc3QtZW1wdHktd3JhcDIiPicgKyAvLyBUT0RPOiB0cnkgbGVzcyB3cmFwcwoJCQknPGRpdiBjbGFzcz0iZmMtbGlzdC1lbXB0eS13cmFwMSI+JyArCgkJCSc8ZGl2IGNsYXNzPSJmYy1saXN0LWVtcHR5Ij4nICsKCQkJCWh0bWxFc2NhcGUodGhpcy52aWV3Lm9wdCgnbm9FdmVudHNNZXNzYWdlJykpICsKCQkJJzwvZGl2PicgKwoJCQknPC9kaXY+JyArCgkJCSc8L2Rpdj4nCgkJKTsKCX0sCgoJLy8gcmVuZGVyIHRoZSBldmVudCBzZWdtZW50cyBpbiB0aGUgdmlldwoJcmVuZGVyU2VnTGlzdDogZnVuY3Rpb24oYWxsU2VncykgewoJCXZhciBzZWdzQnlEYXkgPSB0aGlzLmdyb3VwU2Vnc0J5RGF5KGFsbFNlZ3MpOyAvLyBzcGFyc2UgYXJyYXkKCQl2YXIgZGF5SW5kZXg7CgkJdmFyIGRheVNlZ3M7CgkJdmFyIGk7CgkJdmFyIHRhYmxlRWwgPSAkKCc8dGFibGUgY2xhc3M9ImZjLWxpc3QtdGFibGUiPjx0Ym9keS8+PC90YWJsZT4nKTsKCQl2YXIgdGJvZHlFbCA9IHRhYmxlRWwuZmluZCgndGJvZHknKTsKCgkJZm9yIChkYXlJbmRleCA9IDA7IGRheUluZGV4IDwgc2Vnc0J5RGF5Lmxlbmd0aDsgZGF5SW5kZXgrKykgewoJCQlkYXlTZWdzID0gc2Vnc0J5RGF5W2RheUluZGV4XTsKCQkJaWYgKGRheVNlZ3MpIHsgLy8gc3BhcnNlIGFycmF5LCBzbyBtaWdodCBiZSB1bmRlZmluZWQKCgkJCQkvLyBhcHBlbmQgYSBkYXkgaGVhZGVyCgkJCQl0Ym9keUVsLmFwcGVuZCh0aGlzLmRheUhlYWRlckh0bWwoCgkJCQkJdGhpcy52aWV3LnN0YXJ0LmNsb25lKCkuYWRkKGRheUluZGV4LCAnZGF5cycpCgkJCQkpKTsKCgkJCQl0aGlzLnNvcnRFdmVudFNlZ3MoZGF5U2Vncyk7CgoJCQkJZm9yIChpID0gMDsgaSA8IGRheVNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJCQl0Ym9keUVsLmFwcGVuZChkYXlTZWdzW2ldLmVsKTsgLy8gYXBwZW5kIGV2ZW50IHJvdwoJCQkJfQoJCQl9CgkJfQoKCQl0aGlzLmVsLmVtcHR5KCkuYXBwZW5kKHRhYmxlRWwpOwoJfSwKCgkvLyBSZXR1cm5zIGEgc3BhcnNlIGFycmF5IG9mIGFycmF5cywgc2VncyBncm91cGVkIGJ5IHRoZWlyIGRheUluZGV4Cglncm91cFNlZ3NCeURheTogZnVuY3Rpb24oc2VncykgewoJCXZhciBzZWdzQnlEYXkgPSBbXTsgLy8gc3BhcnNlIGFycmF5CgkJdmFyIGksIHNlZzsKCgkJZm9yIChpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJc2VnID0gc2Vnc1tpXTsKCQkJKHNlZ3NCeURheVtzZWcuZGF5SW5kZXhdIHx8IChzZWdzQnlEYXlbc2VnLmRheUluZGV4XSA9IFtdKSkKCQkJCS5wdXNoKHNlZyk7CgkJfQoKCQlyZXR1cm4gc2Vnc0J5RGF5OwoJfSwKCgkvLyBnZW5lcmF0ZXMgdGhlIEhUTUwgZm9yIHRoZSBkYXkgaGVhZGVycyB0aGF0IGxpdmUgYW1vbmdzdCB0aGUgZXZlbnQgcm93cwoJZGF5SGVhZGVySHRtbDogZnVuY3Rpb24oZGF5RGF0ZSkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBtYWluRm9ybWF0ID0gdmlldy5vcHQoJ2xpc3REYXlGb3JtYXQnKTsKCQl2YXIgYWx0Rm9ybWF0ID0gdmlldy5vcHQoJ2xpc3REYXlBbHRGb3JtYXQnKTsKCgkJcmV0dXJuICc8dHIgY2xhc3M9ImZjLWxpc3QtaGVhZGluZyIgZGF0YS1kYXRlPSInICsgZGF5RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSArICciPicgKwoJCQknPHRkIGNsYXNzPSInICsgdmlldy53aWRnZXRIZWFkZXJDbGFzcyArICciIGNvbHNwYW49IjMiPicgKwoJCQkJKG1haW5Gb3JtYXQgPwoJCQkJCXZpZXcuYnVpbGRHb3RvQW5jaG9ySHRtbCgKCQkJCQkJZGF5RGF0ZSwKCQkJCQkJeyAnY2xhc3MnOiAnZmMtbGlzdC1oZWFkaW5nLW1haW4nIH0sCgkJCQkJCWh0bWxFc2NhcGUoZGF5RGF0ZS5mb3JtYXQobWFpbkZvcm1hdCkpIC8vIGlubmVyIEhUTUwKCQkJCQkpIDoKCQkJCQknJykgKwoJCQkJKGFsdEZvcm1hdCA/CgkJCQkJdmlldy5idWlsZEdvdG9BbmNob3JIdG1sKAoJCQkJCQlkYXlEYXRlLAoJCQkJCQl7ICdjbGFzcyc6ICdmYy1saXN0LWhlYWRpbmctYWx0JyB9LAoJCQkJCQlodG1sRXNjYXBlKGRheURhdGUuZm9ybWF0KGFsdEZvcm1hdCkpIC8vIGlubmVyIEhUTUwKCQkJCQkpIDoKCQkJCQknJykgKwoJCQknPC90ZD4nICsKCQknPC90cj4nOwoJfSwKCgkvLyBnZW5lcmF0ZXMgdGhlIEhUTUwgZm9yIGEgc2luZ2xlIGV2ZW50IHJvdwoJZmdTZWdIdG1sOiBmdW5jdGlvbihzZWcpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgY2xhc3NlcyA9IFsgJ2ZjLWxpc3QtaXRlbScgXS5jb25jYXQodGhpcy5nZXRTZWdDdXN0b21DbGFzc2VzKHNlZykpOwoJCXZhciBiZ0NvbG9yID0gdGhpcy5nZXRTZWdCYWNrZ3JvdW5kQ29sb3Ioc2VnKTsKCQl2YXIgZXZlbnQgPSBzZWcuZXZlbnQ7CgkJdmFyIHVybCA9IGV2ZW50LnVybDsKCQl2YXIgdGltZUh0bWw7CgoJCWlmIChldmVudC5hbGxEYXkpIHsKCQkJdGltZUh0bWwgPSB2aWV3LmdldEFsbERheUh0bWwoKTsKCQl9CgkJZWxzZSBpZiAodmlldy5pc011bHRpRGF5RXZlbnQoZXZlbnQpKSB7IC8vIGlmIHRoZSBldmVudCBhcHBlYXJzIHRvIHNwYW4gbW9yZSB0aGFuIG9uZSBkYXkKCQkJaWYgKHNlZy5pc1N0YXJ0IHx8IHNlZy5pc0VuZCkgeyAvLyBvdXRlciBzZWdtZW50IHRoYXQgcHJvYmFibHkgbGFzdHMgcGFydCBvZiB0aGUgZGF5CgkJCQl0aW1lSHRtbCA9IGh0bWxFc2NhcGUodGhpcy5nZXRFdmVudFRpbWVUZXh0KHNlZykpOwoJCQl9CgkJCWVsc2UgeyAvLyBpbm5lciBzZWdtZW50IHRoYXQgbGFzdHMgdGhlIHdob2xlIGRheQoJCQkJdGltZUh0bWwgPSB2aWV3LmdldEFsbERheUh0bWwoKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJLy8gRGlzcGxheSB0aGUgbm9ybWFsIHRpbWUgdGV4dCBmb3IgdGhlICpldmVudCdzKiB0aW1lcwoJCQl0aW1lSHRtbCA9IGh0bWxFc2NhcGUodGhpcy5nZXRFdmVudFRpbWVUZXh0KGV2ZW50KSk7CgkJfQoKCQlpZiAodXJsKSB7CgkJCWNsYXNzZXMucHVzaCgnZmMtaGFzLXVybCcpOwoJCX0KCgkJcmV0dXJuICc8dHIgY2xhc3M9IicgKyBjbGFzc2VzLmpvaW4oJyAnKSArICciPicgKwoJCQkodGhpcy5kaXNwbGF5RXZlbnRUaW1lID8KCQkJCSc8dGQgY2xhc3M9ImZjLWxpc3QtaXRlbS10aW1lICcgKyB2aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciPicgKwoJCQkJCSh0aW1lSHRtbCB8fCAnJykgKwoJCQkJJzwvdGQ+JyA6CgkJCQknJykgKwoJCQknPHRkIGNsYXNzPSJmYy1saXN0LWl0ZW0tbWFya2VyICcgKyB2aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciPicgKwoJCQkJJzxzcGFuIGNsYXNzPSJmYy1ldmVudC1kb3QiJyArCgkJCQkoYmdDb2xvciA/CgkJCQkJJyBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjonICsgYmdDb2xvciArICciJyA6CgkJCQkJJycpICsKCQkJCSc+PC9zcGFuPicgKwoJCQknPC90ZD4nICsKCQkJJzx0ZCBjbGFzcz0iZmMtbGlzdC1pdGVtLXRpdGxlICcgKyB2aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciPicgKwoJCQkJJzxhJyArICh1cmwgPyAnIGhyZWY9IicgKyBodG1sRXNjYXBlKHVybCkgKyAnIicgOiAnJykgKyAnPicgKwoJCQkJCWh0bWxFc2NhcGUoc2VnLmV2ZW50LnRpdGxlIHx8ICcnKSArCgkJCQknPC9hPicgKwoJCQknPC90ZD4nICsKCQknPC90cj4nOwoJfQoKfSk7Cgo7OwoKZmNWaWV3cy5saXN0ID0gewoJJ2NsYXNzJzogTGlzdFZpZXcsCglidXR0b25UZXh0S2V5OiAnbGlzdCcsIC8vIHdoYXQgdG8gbG9va3VwIGluIGxvY2FsZSBmaWxlcwoJZGVmYXVsdHM6IHsKCQlidXR0b25UZXh0OiAnbGlzdCcsIC8vIHRleHQgdG8gZGlzcGxheSBmb3IgRW5nbGlzaAoJCWxpc3REYXlGb3JtYXQ6ICdMTCcsIC8vIGxpa2UgIkphbnVhcnkgMSwgMjAxNiIKCQlub0V2ZW50c01lc3NhZ2U6ICdObyBldmVudHMgdG8gZGlzcGxheScKCX0KfTsKCmZjVmlld3MubGlzdERheSA9IHsKCXR5cGU6ICdsaXN0JywKCWR1cmF0aW9uOiB7IGRheXM6IDEgfSwKCWRlZmF1bHRzOiB7CgkJbGlzdERheUZvcm1hdDogJ2RkZGQnIC8vIGRheS1vZi13ZWVrIGlzIGFsbCB3ZSBuZWVkLiBmdWxsIGRhdGUgaXMgcHJvYmFibHkgaW4gaGVhZGVyCgl9Cn07CgpmY1ZpZXdzLmxpc3RXZWVrID0gewoJdHlwZTogJ2xpc3QnLAoJZHVyYXRpb246IHsgd2Vla3M6IDEgfSwKCWRlZmF1bHRzOiB7CgkJbGlzdERheUZvcm1hdDogJ2RkZGQnLCAvLyBkYXktb2Ytd2VlayBpcyBtb3JlIGltcG9ydGFudAoJCWxpc3REYXlBbHRGb3JtYXQ6ICdMTCcKCX0KfTsKCmZjVmlld3MubGlzdE1vbnRoID0gewoJdHlwZTogJ2xpc3QnLAoJZHVyYXRpb246IHsgbW9udGg6IDEgfSwKCWRlZmF1bHRzOiB7CgkJbGlzdERheUFsdEZvcm1hdDogJ2RkZGQnIC8vIGRheS1vZi13ZWVrIGlzIG5pY2UtdG8taGF2ZQoJfQp9OwoKZmNWaWV3cy5saXN0WWVhciA9IHsKCXR5cGU6ICdsaXN0JywKCWR1cmF0aW9uOiB7IHllYXI6IDEgfSwKCWRlZmF1bHRzOiB7CgkJbGlzdERheUFsdEZvcm1hdDogJ2RkZGQnIC8vIGRheS1vZi13ZWVrIGlzIG5pY2UtdG8taGF2ZQoJfQp9OwoKOzsKDQpyZXR1cm4gRkM7IC8vIGV4cG9ydCBmb3IgTm9kZS9Db21tb25KUw0KfSk7
LyohCiAqIEZ1bGxDYWxlbmRhciB2My4wLjEKICogRG9jcyAmIExpY2Vuc2U6IGh0dHA6Ly9mdWxsY2FsZW5kYXIuaW8vCiAqIChjKSAyMDE2IEFkYW0gU2hhdwogKi8KIWZ1bmN0aW9uKHQpeyJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsianF1ZXJ5IiwibW9tZW50Il0sdCk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPXQocmVxdWlyZSgianF1ZXJ5IikscmVxdWlyZSgibW9tZW50IikpOnQoalF1ZXJ5LG1vbWVudCl9KGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gcSh0LHF0KX1mdW5jdGlvbiBpKHQsZSl7ZS5sZWZ0JiZ0LmNzcyh7ImJvcmRlci1sZWZ0LXdpZHRoIjoxLCJtYXJnaW4tbGVmdCI6ZS5sZWZ0LTF9KSxlLnJpZ2h0JiZ0LmNzcyh7ImJvcmRlci1yaWdodC13aWR0aCI6MSwibWFyZ2luLXJpZ2h0IjplLnJpZ2h0LTF9KX1mdW5jdGlvbiByKHQpe3QuY3NzKHsibWFyZ2luLWxlZnQiOiIiLCJtYXJnaW4tcmlnaHQiOiIiLCJib3JkZXItbGVmdC13aWR0aCI6IiIsImJvcmRlci1yaWdodC13aWR0aCI6IiJ9KX1mdW5jdGlvbiBzKCl7dCgiYm9keSIpLmFkZENsYXNzKCJmYy1ub3QtYWxsb3dlZCIpfWZ1bmN0aW9uIG8oKXt0KCJib2R5IikucmVtb3ZlQ2xhc3MoImZjLW5vdC1hbGxvd2VkIil9ZnVuY3Rpb24gbChlLG4saSl7dmFyIHI9TWF0aC5mbG9vcihuL2UubGVuZ3RoKSxzPU1hdGguZmxvb3Iobi1yKihlLmxlbmd0aC0xKSksbz1bXSxsPVtdLHU9W10sZD0wO2EoZSksZS5lYWNoKGZ1bmN0aW9uKG4saSl7dmFyIGE9bj09PWUubGVuZ3RoLTE/czpyLGM9dChpKS5vdXRlckhlaWdodCghMCk7YzxhPyhvLnB1c2goaSksbC5wdXNoKGMpLHUucHVzaCh0KGkpLmhlaWdodCgpKSk6ZCs9Y30pLGkmJihuLT1kLHI9TWF0aC5mbG9vcihuL28ubGVuZ3RoKSxzPU1hdGguZmxvb3Iobi1yKihvLmxlbmd0aC0xKSkpLHQobykuZWFjaChmdW5jdGlvbihlLG4pe3ZhciBpPWU9PT1vLmxlbmd0aC0xP3M6cixhPWxbZV0sZD11W2VdLGM9aS0oYS1kKTthPGkmJnQobikuaGVpZ2h0KGMpfSl9ZnVuY3Rpb24gYSh0KXt0LmhlaWdodCgiIil9ZnVuY3Rpb24gdShlKXt2YXIgbj0wO3JldHVybiBlLmZpbmQoIj4gKiIpLmVhY2goZnVuY3Rpb24oZSxpKXt2YXIgcj10KGkpLm91dGVyV2lkdGgoKTtyPm4mJihuPXIpfSksbisrLGUud2lkdGgobiksbn1mdW5jdGlvbiBkKHQsZSl7dmFyIG4saT10LmFkZChlKTtyZXR1cm4gaS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsbGVmdDotMX0pLG49dC5vdXRlckhlaWdodCgpLWUub3V0ZXJIZWlnaHQoKSxpLmNzcyh7cG9zaXRpb246IiIsbGVmdDoiIn0pLG59ZnVuY3Rpb24gYyhlKXt2YXIgbj1lLmNzcygicG9zaXRpb24iKSxpPWUucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXQodGhpcyk7cmV0dXJuLyhhdXRvfHNjcm9sbCkvLnRlc3QoZS5jc3MoIm92ZXJmbG93IikrZS5jc3MoIm92ZXJmbG93LXkiKStlLmNzcygib3ZlcmZsb3cteCIpKX0pLmVxKDApO3JldHVybiJmaXhlZCIhPT1uJiZpLmxlbmd0aD9pOnQoZVswXS5vd25lckRvY3VtZW50fHxkb2N1bWVudCl9ZnVuY3Rpb24gaCh0LGUpe3ZhciBuPXQub2Zmc2V0KCksaT1uLmxlZnQtKGU/ZS5sZWZ0OjApLHI9bi50b3AtKGU/ZS50b3A6MCk7cmV0dXJue2xlZnQ6aSxyaWdodDppK3Qub3V0ZXJXaWR0aCgpLHRvcDpyLGJvdHRvbTpyK3Qub3V0ZXJIZWlnaHQoKX19ZnVuY3Rpb24gZih0LGUpe3ZhciBuPXQub2Zmc2V0KCksaT1wKHQpLHI9bi5sZWZ0K3kodCwiYm9yZGVyLWxlZnQtd2lkdGgiKStpLmxlZnQtKGU/ZS5sZWZ0OjApLHM9bi50b3AreSh0LCJib3JkZXItdG9wLXdpZHRoIikraS50b3AtKGU/ZS50b3A6MCk7cmV0dXJue2xlZnQ6cixyaWdodDpyK3RbMF0uY2xpZW50V2lkdGgsdG9wOnMsYm90dG9tOnMrdFswXS5jbGllbnRIZWlnaHR9fWZ1bmN0aW9uIGcodCxlKXt2YXIgbj10Lm9mZnNldCgpLGk9bi5sZWZ0K3kodCwiYm9yZGVyLWxlZnQtd2lkdGgiKSt5KHQsInBhZGRpbmctbGVmdCIpLShlP2UubGVmdDowKSxyPW4udG9wK3kodCwiYm9yZGVyLXRvcC13aWR0aCIpK3kodCwicGFkZGluZy10b3AiKS0oZT9lLnRvcDowKTtyZXR1cm57bGVmdDppLHJpZ2h0OmkrdC53aWR0aCgpLHRvcDpyLGJvdHRvbTpyK3QuaGVpZ2h0KCl9fWZ1bmN0aW9uIHAodCl7dmFyIGU9dC5pbm5lcldpZHRoKCktdFswXS5jbGllbnRXaWR0aCxuPXtsZWZ0OjAscmlnaHQ6MCx0b3A6MCxib3R0b206dC5pbm5lckhlaWdodCgpLXRbMF0uY2xpZW50SGVpZ2h0fTtyZXR1cm4gdigpJiYicnRsIj09dC5jc3MoImRpcmVjdGlvbiIpP24ubGVmdD1lOm4ucmlnaHQ9ZSxufWZ1bmN0aW9uIHYoKXtyZXR1cm4gbnVsbD09PVp0JiYoWnQ9bSgpKSxadH1mdW5jdGlvbiBtKCl7dmFyIGU9dCgiPGRpdj48ZGl2Lz48L2Rpdj4iKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOi0xZTMsbGVmdDowLGJvcmRlcjowLHBhZGRpbmc6MCxvdmVyZmxvdzoic2Nyb2xsIixkaXJlY3Rpb246InJ0bCJ9KS5hcHBlbmRUbygiYm9keSIpLG49ZS5jaGlsZHJlbigpLGk9bi5vZmZzZXQoKS5sZWZ0PmUub2Zmc2V0KCkubGVmdDtyZXR1cm4gZS5yZW1vdmUoKSxpfWZ1bmN0aW9uIHkodCxlKXtyZXR1cm4gcGFyc2VGbG9hdCh0LmNzcyhlKSl8fDB9ZnVuY3Rpb24gUyh0KXtyZXR1cm4gMT09dC53aGljaCYmIXQuY3RybEtleX1mdW5jdGlvbiB3KHQpe2lmKHZvaWQgMCE9PXQucGFnZVgpcmV0dXJuIHQucGFnZVg7dmFyIGU9dC5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7cmV0dXJuIGU/ZVswXS5wYWdlWDp2b2lkIDB9ZnVuY3Rpb24gRSh0KXtpZih2b2lkIDAhPT10LnBhZ2VZKXJldHVybiB0LnBhZ2VZO3ZhciBlPXQub3JpZ2luYWxFdmVudC50b3VjaGVzO3JldHVybiBlP2VbMF0ucGFnZVk6dm9pZCAwfWZ1bmN0aW9uIEQodCl7cmV0dXJuL150b3VjaC8udGVzdCh0LnR5cGUpfWZ1bmN0aW9uIGIodCl7dC5hZGRDbGFzcygiZmMtdW5zZWxlY3RhYmxlIikub24oInNlbGVjdHN0YXJ0IixDKX1mdW5jdGlvbiBDKHQpe3QucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBIKHQpe3JldHVybiEhd2luZG93LmFkZEV2ZW50TGlzdGVuZXImJih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0LCEwKSwhMCl9ZnVuY3Rpb24gVCh0KXtyZXR1cm4hIXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyJiYod2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdCwhMCksITApfWZ1bmN0aW9uIHgodCxlKXt2YXIgbj17bGVmdDpNYXRoLm1heCh0LmxlZnQsZS5sZWZ0KSxyaWdodDpNYXRoLm1pbih0LnJpZ2h0LGUucmlnaHQpLHRvcDpNYXRoLm1heCh0LnRvcCxlLnRvcCksYm90dG9tOk1hdGgubWluKHQuYm90dG9tLGUuYm90dG9tKX07cmV0dXJuIG4ubGVmdDxuLnJpZ2h0JiZuLnRvcDxuLmJvdHRvbSYmbn1mdW5jdGlvbiBSKHQsZSl7cmV0dXJue2xlZnQ6TWF0aC5taW4oTWF0aC5tYXgodC5sZWZ0LGUubGVmdCksZS5yaWdodCksdG9wOk1hdGgubWluKE1hdGgubWF4KHQudG9wLGUudG9wKSxlLmJvdHRvbSl9fWZ1bmN0aW9uIEkodCl7cmV0dXJue2xlZnQ6KHQubGVmdCt0LnJpZ2h0KS8yLHRvcDoodC50b3ArdC5ib3R0b20pLzJ9fWZ1bmN0aW9uIGsodCxlKXtyZXR1cm57bGVmdDp0LmxlZnQtZS5sZWZ0LHRvcDp0LnRvcC1lLnRvcH19ZnVuY3Rpb24gTShlKXt2YXIgbixpLHI9W10scz1bXTtmb3IoInN0cmluZyI9PXR5cGVvZiBlP3M9ZS5zcGxpdCgvXHMqLFxzKi8pOiJmdW5jdGlvbiI9PXR5cGVvZiBlP3M9W2VdOnQuaXNBcnJheShlKSYmKHM9ZSksbj0wO248cy5sZW5ndGg7bisrKWk9c1tuXSwic3RyaW5nIj09dHlwZW9mIGk/ci5wdXNoKCItIj09aS5jaGFyQXQoMCk/e2ZpZWxkOmkuc3Vic3RyaW5nKDEpLG9yZGVyOi0xfTp7ZmllbGQ6aSxvcmRlcjoxfSk6ImZ1bmN0aW9uIj09dHlwZW9mIGkmJnIucHVzaCh7ZnVuYzppfSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTCh0LGUsbil7dmFyIGkscjtmb3IoaT0wO2k8bi5sZW5ndGg7aSsrKWlmKHI9Qih0LGUsbltpXSkpcmV0dXJuIHI7cmV0dXJuIDB9ZnVuY3Rpb24gQih0LGUsbil7cmV0dXJuIG4uZnVuYz9uLmZ1bmModCxlKTp6KHRbbi5maWVsZF0sZVtuLmZpZWxkXSkqKG4ub3JkZXJ8fDEpfWZ1bmN0aW9uIHooZSxuKXtyZXR1cm4gZXx8bj9udWxsPT1uPy0xOm51bGw9PWU/MToic3RyaW5nIj09PXQudHlwZShlKXx8InN0cmluZyI9PT10LnR5cGUobik/U3RyaW5nKGUpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKG4pKTplLW46MH1mdW5jdGlvbiBGKHQsZSl7dmFyIG4saSxyLHMsbz10LnN0YXJ0LGw9dC5lbmQsYT1lLnN0YXJ0LHU9ZS5lbmQ7aWYobD5hJiZvPHUpcmV0dXJuIG8+PWE/KG49by5jbG9uZSgpLHI9ITApOihuPWEuY2xvbmUoKSxyPSExKSxsPD11PyhpPWwuY2xvbmUoKSxzPSEwKTooaT11LmNsb25lKCkscz0hMSkse3N0YXJ0Om4sZW5kOmksaXNTdGFydDpyLGlzRW5kOnN9fWZ1bmN0aW9uIE4odCxuKXtyZXR1cm4gZS5kdXJhdGlvbih7ZGF5czp0LmNsb25lKCkuc3RyaXBUaW1lKCkuZGlmZihuLmNsb25lKCkuc3RyaXBUaW1lKCksImRheXMiKSxtczp0LnRpbWUoKS1uLnRpbWUoKX0pfWZ1bmN0aW9uIEcodCxuKXtyZXR1cm4gZS5kdXJhdGlvbih7ZGF5czp0LmNsb25lKCkuc3RyaXBUaW1lKCkuZGlmZihuLmNsb25lKCkuc3RyaXBUaW1lKCksImRheXMiKX0pfWZ1bmN0aW9uIEEodCxuLGkpe3JldHVybiBlLmR1cmF0aW9uKE1hdGgucm91bmQodC5kaWZmKG4saSwhMCkpLGkpfWZ1bmN0aW9uIE8odCxlKXt2YXIgbixpLHI7Zm9yKG49MDtuPFh0Lmxlbmd0aCYmKGk9WHRbbl0scj1WKGksdCxlKSwhKHI+PTEmJm90KHIpKSk7bisrKTtyZXR1cm4gaX1mdW5jdGlvbiBWKHQsbixpKXtyZXR1cm4gbnVsbCE9aT9pLmRpZmYobix0LCEwKTplLmlzRHVyYXRpb24obik/bi5hcyh0KTpuLmVuZC5kaWZmKG4uc3RhcnQsdCwhMCl9ZnVuY3Rpb24gUCh0LGUsbil7dmFyIGk7cmV0dXJuIFcobik/KGUtdCkvbjooaT1uLmFzTW9udGhzKCksTWF0aC5hYnMoaSk+PTEmJm90KGkpP2UuZGlmZih0LCJtb250aHMiLCEwKS9pOmUuZGlmZih0LCJkYXlzIiwhMCkvbi5hc0RheXMoKSl9ZnVuY3Rpb24gXyh0LGUpe3ZhciBuLGk7cmV0dXJuIFcodCl8fFcoZSk/dC9lOihuPXQuYXNNb250aHMoKSxpPWUuYXNNb250aHMoKSxNYXRoLmFicyhuKT49MSYmb3QobikmJk1hdGguYWJzKGkpPj0xJiZvdChpKT9uL2k6dC5hc0RheXMoKS9lLmFzRGF5cygpKX1mdW5jdGlvbiBZKHQsbil7dmFyIGk7cmV0dXJuIFcodCk/ZS5kdXJhdGlvbih0Km4pOihpPXQuYXNNb250aHMoKSxNYXRoLmFicyhpKT49MSYmb3QoaSk/ZS5kdXJhdGlvbih7bW9udGhzOmkqbn0pOmUuZHVyYXRpb24oe2RheXM6dC5hc0RheXMoKSpufSkpfWZ1bmN0aW9uIFcodCl7cmV0dXJuIEJvb2xlYW4odC5ob3VycygpfHx0Lm1pbnV0ZXMoKXx8dC5zZWNvbmRzKCl8fHQubWlsbGlzZWNvbmRzKCkpfWZ1bmN0aW9uIGoodCl7cmV0dXJuIltvYmplY3QgRGF0ZV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfHx0IGluc3RhbmNlb2YgRGF0ZX1mdW5jdGlvbiBVKHQpe3JldHVybi9eXGQrXDpcZCsoPzpcOlxkK1wuPyg/OlxkezN9KT8pPyQvLnRlc3QodCl9ZnVuY3Rpb24gcSh0LGUpe3ZhciBuLGkscixzLG8sbCxhPXt9O2lmKGUpZm9yKG49MDtuPGUubGVuZ3RoO24rKyl7Zm9yKGk9ZVtuXSxyPVtdLHM9dC5sZW5ndGgtMTtzPj0wO3MtLSlpZihvPXRbc11baV0sIm9iamVjdCI9PXR5cGVvZiBvKXIudW5zaGlmdChvKTtlbHNlIGlmKHZvaWQgMCE9PW8pe2FbaV09bzticmVha31yLmxlbmd0aCYmKGFbaV09cShyKSl9Zm9yKG49dC5sZW5ndGgtMTtuPj0wO24tLSl7bD10W25dO2ZvcihpIGluIGwpaSBpbiBhfHwoYVtpXT1sW2ldKX1yZXR1cm4gYX1mdW5jdGlvbiBaKHQpe3ZhciBlPWZ1bmN0aW9uKCl7fTtyZXR1cm4gZS5wcm90b3R5cGU9dCxuZXcgZX1mdW5jdGlvbiAkKHQsZSl7Zm9yKHZhciBuIGluIHQpWCh0LG4pJiYoZVtuXT10W25dKX1mdW5jdGlvbiBYKHQsZSl7cmV0dXJuIEt0LmNhbGwodCxlKX1mdW5jdGlvbiBLKGUpe3JldHVybi91bmRlZmluZWR8bnVsbHxib29sZWFufG51bWJlcnxzdHJpbmcvLnRlc3QodC50eXBlKGUpKX1mdW5jdGlvbiBRKGUsbixpKXtpZih0LmlzRnVuY3Rpb24oZSkmJihlPVtlXSksZSl7dmFyIHIscztmb3Iocj0wO3I8ZS5sZW5ndGg7cisrKXM9ZVtyXS5hcHBseShuLGkpfHxzO3JldHVybiBzfX1mdW5jdGlvbiBKKCl7Zm9yKHZhciB0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylpZih2b2lkIDAhPT1hcmd1bWVudHNbdF0pcmV0dXJuIGFyZ3VtZW50c1t0XX1mdW5jdGlvbiB0dCh0KXtyZXR1cm4odCsiIikucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLycvZywiJiMwMzk7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC9cbi9nLCI8YnIgLz4iKX1mdW5jdGlvbiBldCh0KXtyZXR1cm4gdC5yZXBsYWNlKC8mLio/Oy9nLCIiKX1mdW5jdGlvbiBudChlKXt2YXIgbj1bXTtyZXR1cm4gdC5lYWNoKGUsZnVuY3Rpb24odCxlKXtudWxsIT1lJiZuLnB1c2godCsiOiIrZSl9KSxuLmpvaW4oIjsiKX1mdW5jdGlvbiBpdChlKXt2YXIgbj1bXTtyZXR1cm4gdC5lYWNoKGUsZnVuY3Rpb24odCxlKXtudWxsIT1lJiZuLnB1c2godCsnPSInK3R0KGUpKyciJyl9KSxuLmpvaW4oIiAiKX1mdW5jdGlvbiBydCh0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfWZ1bmN0aW9uIHN0KHQsZSl7cmV0dXJuIHQtZX1mdW5jdGlvbiBvdCh0KXtyZXR1cm4gdCUxPT09MH1mdW5jdGlvbiBsdCh0LGUpe3ZhciBuPXRbZV07cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG4uYXBwbHkodCxhcmd1bWVudHMpfX1mdW5jdGlvbiBhdCh0LGUsbil7dmFyIGkscixzLG8sbCxhPWZ1bmN0aW9uKCl7dmFyIHU9K25ldyBEYXRlLW87dTxlP2k9c2V0VGltZW91dChhLGUtdSk6KGk9bnVsbCxufHwobD10LmFwcGx5KHMscikscz1yPW51bGwpKX07cmV0dXJuIGZ1bmN0aW9uKCl7cz10aGlzLHI9YXJndW1lbnRzLG89K25ldyBEYXRlO3ZhciB1PW4mJiFpO3JldHVybiBpfHwoaT1zZXRUaW1lb3V0KGEsZSkpLHUmJihsPXQuYXBwbHkocyxyKSxzPXI9bnVsbCksbH19ZnVuY3Rpb24gdXQoZSxuKXtyZXR1cm4gZSYmZS50aGVuJiYicmVzb2x2ZWQiIT09ZS5zdGF0ZSgpP24/ZS50aGVuKG4pOnZvaWQgMDp0LndoZW4obigpKX1mdW5jdGlvbiBkdChuLGkscil7dmFyIHMsbyxsLGEsdT1uWzBdLGQ9MT09bi5sZW5ndGgmJiJzdHJpbmciPT10eXBlb2YgdTtyZXR1cm4gZS5pc01vbWVudCh1KXx8aih1KXx8dm9pZCAwPT09dT9hPWUuYXBwbHkobnVsbCxuKToocz0hMSxvPSExLGQ/UXQudGVzdCh1KT8odSs9Ii0wMSIsbj1bdV0scz0hMCxvPSEwKToobD1KdC5leGVjKHUpKSYmKHM9IWxbNV0sbz0hMCk6dC5pc0FycmF5KHUpJiYobz0hMCksYT1pfHxzP2UudXRjLmFwcGx5KGUsbik6ZS5hcHBseShudWxsLG4pLHM/KGEuX2FtYmlnVGltZT0hMCxhLl9hbWJpZ1pvbmU9ITApOnImJihvP2EuX2FtYmlnWm9uZT0hMDpkJiZhLnV0Y09mZnNldCh1KSkpLGEuX2Z1bGxDYWxlbmRhcj0hMCxhfWZ1bmN0aW9uIGN0KHQsZSl7cmV0dXJuIGVlLmZvcm1hdC5jYWxsKHQsZSl9ZnVuY3Rpb24gaHQodCxlKXtyZXR1cm4gZnQodCx5dChlKSl9ZnVuY3Rpb24gZnQodCxlKXt2YXIgbixpPSIiO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspaSs9Z3QodCxlW25dKTtyZXR1cm4gaX1mdW5jdGlvbiBndCh0LGUpe3ZhciBuLGk7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP2U6KG49ZS50b2tlbik/aWVbbl0/aWVbbl0odCk6Y3QodCxuKTplLm1heWJlJiYoaT1mdCh0LGUubWF5YmUpLGkubWF0Y2goL1sxLTldLykpP2k6IiJ9ZnVuY3Rpb24gcHQodCxlLG4saSxyKXt2YXIgcztyZXR1cm4gdD1qdC5tb21lbnQucGFyc2Vab25lKHQpLGU9anQubW9tZW50LnBhcnNlWm9uZShlKSxzPXQubG9jYWxlRGF0YSgpLG49cy5sb25nRGF0ZUZvcm1hdChuKXx8bixpPWl8fCIgLSAiLHZ0KHQsZSx5dChuKSxpLHIpfWZ1bmN0aW9uIHZ0KHQsZSxuLGkscil7dmFyIHMsbyxsLGEsdT10LmNsb25lKCkuc3RyaXBab25lKCksZD1lLmNsb25lKCkuc3RyaXBab25lKCksYz0iIixoPSIiLGY9IiIsZz0iIixwPSIiO2ZvcihvPTA7bzxuLmxlbmd0aCYmKHM9bXQodCxlLHUsZCxuW29dKSxzIT09ITEpO28rKyljKz1zO2ZvcihsPW4ubGVuZ3RoLTE7bD5vJiYocz1tdCh0LGUsdSxkLG5bbF0pLHMhPT0hMSk7bC0tKWg9cytoO2ZvcihhPW87YTw9bDthKyspZis9Z3QodCxuW2FdKSxnKz1ndChlLG5bYV0pO3JldHVybihmfHxnKSYmKHA9cj9nK2krZjpmK2krZyksYytwK2h9ZnVuY3Rpb24gbXQodCxlLG4saSxyKXt2YXIgcyxvO3JldHVybiJzdHJpbmciPT10eXBlb2Ygcj9yOiEhKChzPXIudG9rZW4pJiYobz1yZVtzLmNoYXJBdCgwKV0sbyYmbi5pc1NhbWUoaSxvKSkpJiZjdCh0LHMpfWZ1bmN0aW9uIHl0KHQpe3JldHVybiB0IGluIHNlP3NlW3RdOnNlW3RdPVN0KHQpfWZ1bmN0aW9uIFN0KHQpe2Zvcih2YXIgZSxuPVtdLGk9L1xbKFteXF1dKilcXXxcKChbXlwpXSopXCl8KExUU3xMVHwoXHcpXDQqbz8pfChbXlx3XFtcKF0rKS9nO2U9aS5leGVjKHQpOyllWzFdP24ucHVzaChlWzFdKTplWzJdP24ucHVzaCh7bWF5YmU6U3QoZVsyXSl9KTplWzNdP24ucHVzaCh7dG9rZW46ZVszXX0pOmVbNV0mJm4ucHVzaChlWzVdKTtyZXR1cm4gbn1mdW5jdGlvbiB3dCgpe31mdW5jdGlvbiBFdCh0LGUpe3ZhciBuO3JldHVybiBYKGUsImNvbnN0cnVjdG9yIikmJihuPWUuY29uc3RydWN0b3IpLCJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1lLmNvbnN0cnVjdG9yPWZ1bmN0aW9uKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSxuLnByb3RvdHlwZT1aKHQucHJvdG90eXBlKSwkKGUsbi5wcm90b3R5cGUpLCQodCxuKSxufWZ1bmN0aW9uIER0KHQsZSl7JChlLHQucHJvdG90eXBlKX1mdW5jdGlvbiBidCh0LGUpe3JldHVybiF0JiYhZXx8ISghdHx8IWUpJiYodC5jb21wb25lbnQ9PT1lLmNvbXBvbmVudCYmQ3QodCxlKSYmQ3QoZSx0KSl9ZnVuY3Rpb24gQ3QodCxlKXtmb3IodmFyIG4gaW4gdClpZighL14oY29tcG9uZW50fGxlZnR8cmlnaHR8dG9wfGJvdHRvbSkkLy50ZXN0KG4pJiZ0W25dIT09ZVtuXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBIdCh0KXtyZXR1cm57c3RhcnQ6dC5zdGFydC5jbG9uZSgpLGVuZDp0LmVuZD90LmVuZC5jbG9uZSgpOm51bGwsYWxsRGF5OnQuYWxsRGF5fX1mdW5jdGlvbiBUdCh0KXt2YXIgZT1SdCh0KTtyZXR1cm4iYmFja2dyb3VuZCI9PT1lfHwiaW52ZXJzZS1iYWNrZ3JvdW5kIj09PWV9ZnVuY3Rpb24geHQodCl7cmV0dXJuImludmVyc2UtYmFja2dyb3VuZCI9PT1SdCh0KX1mdW5jdGlvbiBSdCh0KXtyZXR1cm4gSigodC5zb3VyY2V8fHt9KS5yZW5kZXJpbmcsdC5yZW5kZXJpbmcpfWZ1bmN0aW9uIEl0KHQpe3ZhciBlLG4saT17fTtmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKW49dFtlXSwoaVtuLl9pZF18fChpW24uX2lkXT1bXSkpLnB1c2gobik7cmV0dXJuIGl9ZnVuY3Rpb24ga3QodCxlKXtyZXR1cm4gdC5zdGFydC1lLnN0YXJ0fWZ1bmN0aW9uIE10KG4pe3ZhciBpLHIscyxvLGw9anQuZGF0YUF0dHJQcmVmaXg7cmV0dXJuIGwmJihsKz0iLSIpLGk9bi5kYXRhKGwrImV2ZW50Iil8fG51bGwsaSYmKGk9Im9iamVjdCI9PXR5cGVvZiBpP3QuZXh0ZW5kKHt9LGkpOnt9LHI9aS5zdGFydCxudWxsPT1yJiYocj1pLnRpbWUpLHM9aS5kdXJhdGlvbixvPWkuc3RpY2ssZGVsZXRlIGkuc3RhcnQsZGVsZXRlIGkudGltZSxkZWxldGUgaS5kdXJhdGlvbixkZWxldGUgaS5zdGljayksbnVsbD09ciYmKHI9bi5kYXRhKGwrInN0YXJ0IikpLG51bGw9PXImJihyPW4uZGF0YShsKyJ0aW1lIikpLG51bGw9PXMmJihzPW4uZGF0YShsKyJkdXJhdGlvbiIpKSxudWxsPT1vJiYobz1uLmRhdGEobCsic3RpY2siKSkscj1udWxsIT1yP2UuZHVyYXRpb24ocik6bnVsbCxzPW51bGwhPXM/ZS5kdXJhdGlvbihzKTpudWxsLG89Qm9vbGVhbihvKSx7ZXZlbnRQcm9wczppLHN0YXJ0VGltZTpyLGR1cmF0aW9uOnMsc3RpY2s6b319ZnVuY3Rpb24gTHQodCxlKXt2YXIgbixpO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspaWYoaT1lW25dLGkubGVmdENvbDw9dC5yaWdodENvbCYmaS5yaWdodENvbD49dC5sZWZ0Q29sKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIEJ0KHQsZSl7cmV0dXJuIHQubGVmdENvbC1lLmxlZnRDb2x9ZnVuY3Rpb24genQodCl7dmFyIGUsbixpLHI9W107Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl7Zm9yKG49dFtlXSxpPTA7aTxyLmxlbmd0aCYmR3QobixyW2ldKS5sZW5ndGg7aSsrKTtuLmxldmVsPWksKHJbaV18fChyW2ldPVtdKSkucHVzaChuKX1yZXR1cm4gcn1mdW5jdGlvbiBGdCh0KXt2YXIgZSxuLGkscixzO2ZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspZm9yKG49dFtlXSxpPTA7aTxuLmxlbmd0aDtpKyspZm9yKHI9bltpXSxyLmZvcndhcmRTZWdzPVtdLHM9ZSsxO3M8dC5sZW5ndGg7cysrKUd0KHIsdFtzXSxyLmZvcndhcmRTZWdzKX1mdW5jdGlvbiBOdCh0KXt2YXIgZSxuLGk9dC5mb3J3YXJkU2VncyxyPTA7aWYodm9pZCAwPT09dC5mb3J3YXJkUHJlc3N1cmUpe2ZvcihlPTA7ZTxpLmxlbmd0aDtlKyspbj1pW2VdLE50KG4pLHI9TWF0aC5tYXgociwxK24uZm9yd2FyZFByZXNzdXJlKTt0LmZvcndhcmRQcmVzc3VyZT1yfX1mdW5jdGlvbiBHdCh0LGUsbil7bj1ufHxbXTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKylBdCh0LGVbaV0pJiZuLnB1c2goZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gQXQodCxlKXtyZXR1cm4gdC5ib3R0b20+ZS50b3AmJnQudG9wPGUuYm90dG9tfWZ1bmN0aW9uIE90KG4saSl7ZnVuY3Rpb24gcih0KXt0Ll9sb2NhbGU9VX1mdW5jdGlvbiBzKCl7JD91KCkmJihnKCksZCgpKTpvKCl9ZnVuY3Rpb24gbygpe24uYWRkQ2xhc3MoImZjIiksbi5vbigiY2xpY2suZmMiLCJhW2RhdGEtZ290b10iLGZ1bmN0aW9uKGUpe3ZhciBuPXQodGhpcyksaT1uLmRhdGEoImdvdG8iKSxyPWoubW9tZW50KGkuZGF0ZSkscz1pLnR5cGUsbz1LLm9wdCgibmF2TGluayIrcnQocykrIkNsaWNrIik7ImZ1bmN0aW9uIj09dHlwZW9mIG8/byhyLGUpOigic3RyaW5nIj09dHlwZW9mIG8mJihzPW8pLE4ocixzKSl9KSxqLmJpbmRPcHRpb24oInRoZW1lIixmdW5jdGlvbih0KXtYPXQ/InVpIjoiZmMiLG4udG9nZ2xlQ2xhc3MoInVpLXdpZGdldCIsdCksbi50b2dnbGVDbGFzcygiZmMtdW50aGVtZWQiLCF0KX0pLGouYmluZE9wdGlvbnMoWyJpc1JUTCIsImxvY2FsZSJdLGZ1bmN0aW9uKHQpe24udG9nZ2xlQ2xhc3MoImZjLWx0ciIsIXQpLG4udG9nZ2xlQ2xhc3MoImZjLXJ0bCIsdCl9KSwkPXQoIjxkaXYgY2xhc3M9J2ZjLXZpZXctY29udGFpbmVyJy8+IikucHJlcGVuZFRvKG4pLHE9ai5oZWFkZXI9bmV3IF90KGopLGwoKSxkKGoub3B0aW9ucy5kZWZhdWx0Vmlldyksai5vcHRpb25zLmhhbmRsZVdpbmRvd1Jlc2l6ZSYmKEo9YXQobSxqLm9wdGlvbnMud2luZG93UmVzaXplRGVsYXkpLHQod2luZG93KS5yZXNpemUoSikpfWZ1bmN0aW9uIGwoKXtxLnJlbmRlcigpLHEuZWwmJm4ucHJlcGVuZChxLmVsKX1mdW5jdGlvbiBhKCl7SyYmSy5yZW1vdmVFbGVtZW50KCkscS5yZW1vdmVFbGVtZW50KCksJC5yZW1vdmUoKSxuLnJlbW92ZUNsYXNzKCJmYyBmYy1sdHIgZmMtcnRsIGZjLXVudGhlbWVkIHVpLXdpZGdldCIpLG4ub2ZmKCIuZmMiKSxKJiZ0KHdpbmRvdykudW5iaW5kKCJyZXNpemUiLEopfWZ1bmN0aW9uIHUoKXtyZXR1cm4gbi5pcygiOnZpc2libGUiKX1mdW5jdGlvbiBkKGUsbil7bHQrKyxLJiZlJiZLLnR5cGUhPT1lJiYoQSgpLGMoKSksIUsmJmUmJihLPWoudmlldz1vdFtlXXx8KG90W2VdPWouaW5zdGFudGlhdGVWaWV3KGUpKSxLLnNldEVsZW1lbnQodCgiPGRpdiBjbGFzcz0nZmMtdmlldyBmYy0iK2UrIi12aWV3JyAvPiIpLmFwcGVuZFRvKCQpKSxxLmFjdGl2YXRlQnV0dG9uKGUpKSxLJiYodHQ9Sy5tYXNzYWdlQ3VycmVudERhdGUodHQpLEsuZGlzcGxheWluZyYmdHQ+PUsuaW50ZXJ2YWxTdGFydCYmdHQ8Sy5pbnRlcnZhbEVuZHx8dSgpJiYoSy5kaXNwbGF5KHR0LG4pLE8oKSxIKCksVCgpLEUoKSkpLE8oKSxsdC0tfWZ1bmN0aW9uIGMoKXtxLmRlYWN0aXZhdGVCdXR0b24oSy50eXBlKSxLLnJlbW92ZUVsZW1lbnQoKSxLPWoudmlldz1udWxsfWZ1bmN0aW9uIGgoKXtsdCsrLEEoKTt2YXIgdD1LLnR5cGUsZT1LLnF1ZXJ5U2Nyb2xsKCk7YygpLGQodCxlKSxPKCksbHQtLX1mdW5jdGlvbiBmKHQpe2lmKHUoKSlyZXR1cm4gdCYmcCgpLGx0KyssSy51cGRhdGVTaXplKCEwKSxsdC0tLCEwfWZ1bmN0aW9uIGcoKXt1KCkmJnAoKX1mdW5jdGlvbiBwKCl7dmFyIHQ9ai5vcHRpb25zLmNvbnRlbnRIZWlnaHQsZT1qLm9wdGlvbnMuaGVpZ2h0O1E9Im51bWJlciI9PXR5cGVvZiB0P3Q6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCgpOiJudW1iZXIiPT10eXBlb2YgZT9lLXYoKToiZnVuY3Rpb24iPT10eXBlb2YgZT9lKCktdigpOiJwYXJlbnQiPT09ZT9uLnBhcmVudCgpLmhlaWdodCgpLXYoKTpNYXRoLnJvdW5kKCQud2lkdGgoKS9NYXRoLm1heChqLm9wdGlvbnMuYXNwZWN0UmF0aW8sLjUpKX1mdW5jdGlvbiB2KCl7cmV0dXJuIHEuZWw/cS5lbC5vdXRlckhlaWdodCghMCk6MH1mdW5jdGlvbiBtKHQpeyFsdCYmdC50YXJnZXQ9PT13aW5kb3cmJksuc3RhcnQmJmYoITApJiZLLnRyaWdnZXIoIndpbmRvd1Jlc2l6ZSIsc3QpfWZ1bmN0aW9uIHkoKXtEKCl9ZnVuY3Rpb24gUyh0KXtpdChqLmdldEV2ZW50U291cmNlc0J5TWF0Y2hBcnJheSh0KSl9ZnVuY3Rpb24gdygpe3UoKSYmKEEoKSxLLmRpc3BsYXlFdmVudHModXQpLE8oKSl9ZnVuY3Rpb24gRSgpeyFqLm9wdGlvbnMubGF6eUZldGNoaW5nfHxldChLLnN0YXJ0LEsuZW5kKT9EKCk6dygpfWZ1bmN0aW9uIEQoKXtudChLLnN0YXJ0LEsuZW5kKX1mdW5jdGlvbiBiKHQpe3V0PXQsdygpfWZ1bmN0aW9uIEMoKXt3KCl9ZnVuY3Rpb24gSCgpe3EudXBkYXRlVGl0bGUoSy50aXRsZSl9ZnVuY3Rpb24gVCgpe3ZhciB0PWouZ2V0Tm93KCk7dD49Sy5pbnRlcnZhbFN0YXJ0JiZ0PEsuaW50ZXJ2YWxFbmQ/cS5kaXNhYmxlQnV0dG9uKCJ0b2RheSIpOnEuZW5hYmxlQnV0dG9uKCJ0b2RheSIpfWZ1bmN0aW9uIHgodCxlKXtLLnNlbGVjdChqLmJ1aWxkU2VsZWN0U3Bhbi5hcHBseShqLGFyZ3VtZW50cykpfWZ1bmN0aW9uIFIoKXtLJiZLLnVuc2VsZWN0KCl9ZnVuY3Rpb24gSSgpe3R0PUsuY29tcHV0ZVByZXZEYXRlKHR0KSxkKCl9ZnVuY3Rpb24gaygpe3R0PUsuY29tcHV0ZU5leHREYXRlKHR0KSxkKCl9ZnVuY3Rpb24gTSgpe3R0LmFkZCgtMSwieWVhcnMiKSxkKCl9ZnVuY3Rpb24gTCgpe3R0LmFkZCgxLCJ5ZWFycyIpLGQoKX1mdW5jdGlvbiBCKCl7dHQ9ai5nZXROb3coKSxkKCl9ZnVuY3Rpb24geih0KXt0dD1qLm1vbWVudCh0KS5zdHJpcFpvbmUoKSxkKCl9ZnVuY3Rpb24gRih0KXt0dC5hZGQoZS5kdXJhdGlvbih0KSksZCgpfWZ1bmN0aW9uIE4odCxlKXt2YXIgbjtlPWV8fCJkYXkiLG49ai5nZXRWaWV3U3BlYyhlKXx8ai5nZXRVbml0Vmlld1NwZWMoZSksdHQ9dC5jbG9uZSgpLGQobj9uLnR5cGU6bnVsbCl9ZnVuY3Rpb24gRygpe3JldHVybiBqLmFwcGx5VGltZXpvbmUodHQpfWZ1bmN0aW9uIEEoKXskLmNzcyh7d2lkdGg6IjEwMCUiLGhlaWdodDokLmhlaWdodCgpLG92ZXJmbG93OiJoaWRkZW4ifSl9ZnVuY3Rpb24gTygpeyQuY3NzKHt3aWR0aDoiIixoZWlnaHQ6IiIsb3ZlcmZsb3c6IiJ9KX1mdW5jdGlvbiBWKCl7cmV0dXJuIGp9ZnVuY3Rpb24gUCgpe3JldHVybiBLfWZ1bmN0aW9uIF8odCxlKXt2YXIgbjtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKHZvaWQgMD09PWUpcmV0dXJuIGoub3B0aW9uc1t0XTtuPXt9LG5bdF09ZSxZKG4pfWVsc2Uib2JqZWN0Ij09dHlwZW9mIHQmJlkodCl9ZnVuY3Rpb24gWSh0KXt2YXIgZSxuPTA7Zm9yKGUgaW4gdClqLmR5bmFtaWNPdmVycmlkZXNbZV09dFtlXTtqLnZpZXdTcGVjQ2FjaGU9e30sai5wb3B1bGF0ZU9wdGlvbnNIYXNoKCk7Zm9yKGUgaW4gdClqLnRyaWdnZXJPcHRpb25IYW5kbGVycyhlKSxuKys7aWYoMT09PW4pe2lmKCJoZWlnaHQiPT09ZXx8ImNvbnRlbnRIZWlnaHQiPT09ZXx8ImFzcGVjdFJhdGlvIj09PWUpcmV0dXJuIHZvaWQgZighMCk7aWYoImRlZmF1bHREYXRlIj09PWUpcmV0dXJuO2lmKCJidXNpbmVzc0hvdXJzIj09PWUpcmV0dXJuIHZvaWQoSyYmKEsudW5yZW5kZXJCdXNpbmVzc0hvdXJzKCksSy5yZW5kZXJCdXNpbmVzc0hvdXJzKCkpKTtpZigidGltZXpvbmUiPT09ZSlyZXR1cm4gai5yZXpvbmVBcnJheUV2ZW50U291cmNlcygpLHZvaWQgeSgpfWwoKSxvdD17fSxoKCl9ZnVuY3Rpb24gVyh0LGUpe3ZhciBuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKTtpZihlPWV8fHN0LHRoaXMudHJpZ2dlcldpdGgodCxlLG4pLGoub3B0aW9uc1t0XSlyZXR1cm4gai5vcHRpb25zW3RdLmFwcGx5KGUsbil9dmFyIGo9dGhpcztqLnJlbmRlcj1zLGouZGVzdHJveT1hLGoucmVmZXRjaEV2ZW50cz15LGoucmVmZXRjaEV2ZW50U291cmNlcz1TLGoucmVwb3J0RXZlbnRzPWIsai5yZXBvcnRFdmVudENoYW5nZT1DLGoucmVyZW5kZXJFdmVudHM9dyxqLmNoYW5nZVZpZXc9ZCxqLnNlbGVjdD14LGoudW5zZWxlY3Q9UixqLnByZXY9SSxqLm5leHQ9ayxqLnByZXZZZWFyPU0sai5uZXh0WWVhcj1MLGoudG9kYXk9QixqLmdvdG9EYXRlPXosai5pbmNyZW1lbnREYXRlPUYsai56b29tVG89TixqLmdldERhdGU9RyxqLmdldENhbGVuZGFyPVYsai5nZXRWaWV3PVAsai5vcHRpb249XyxqLnRyaWdnZXI9VyxqLmR5bmFtaWNPdmVycmlkZXM9e30sai52aWV3U3BlY0NhY2hlPXt9LGoub3B0aW9uSGFuZGxlcnM9e30sai5vdmVycmlkZXM9dC5leHRlbmQoe30saSksai5wb3B1bGF0ZU9wdGlvbnNIYXNoKCk7dmFyIFU7ai5iaW5kT3B0aW9ucyhbImxvY2FsZSIsIm1vbnRoTmFtZXMiLCJtb250aE5hbWVzU2hvcnQiLCJkYXlOYW1lcyIsImRheU5hbWVzU2hvcnQiLCJmaXJzdERheSIsIndlZWtOdW1iZXJDYWxjdWxhdGlvbiJdLGZ1bmN0aW9uKHQsZSxuLGkscyxvLGwpe2lmKCJpc28iPT09bCYmKGw9IklTTyIpLFU9WihQdCh0KSksZSYmKFUuX21vbnRocz1lKSxuJiYoVS5fbW9udGhzU2hvcnQ9biksaSYmKFUuX3dlZWtkYXlzPWkpLHMmJihVLl93ZWVrZGF5c1Nob3J0PXMpLG51bGw9PW8mJiJJU08iPT09bCYmKG89MSksbnVsbCE9byl7dmFyIGE9WihVLl93ZWVrKTthLmRvdz1vLFUuX3dlZWs9YX0iSVNPIiE9PWwmJiJsb2NhbCIhPT1sJiYiZnVuY3Rpb24iIT10eXBlb2YgbHx8KFUuX2Z1bGxDYWxlbmRhcl93ZWVrQ2FsYz1sKSx0dCYmcih0dCl9KSxqLmRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uPWUuZHVyYXRpb24oai5vcHRpb25zLmRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uKSxqLmRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb249ZS5kdXJhdGlvbihqLm9wdGlvbnMuZGVmYXVsdFRpbWVkRXZlbnREdXJhdGlvbiksai5tb21lbnQ9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4ibG9jYWwiPT09ai5vcHRpb25zLnRpbWV6b25lPyh0PWp0Lm1vbWVudC5hcHBseShudWxsLGFyZ3VtZW50cyksdC5oYXNUaW1lKCkmJnQubG9jYWwoKSk6dD0iVVRDIj09PWoub3B0aW9ucy50aW1lem9uZT9qdC5tb21lbnQudXRjLmFwcGx5KG51bGwsYXJndW1lbnRzKTpqdC5tb21lbnQucGFyc2Vab25lLmFwcGx5KG51bGwsYXJndW1lbnRzKSxyKHQpLHR9LGoubG9jYWxpemVNb21lbnQ9cixqLmdldElzQW1iaWdUaW1lem9uZT1mdW5jdGlvbigpe3JldHVybiJsb2NhbCIhPT1qLm9wdGlvbnMudGltZXpvbmUmJiJVVEMiIT09ai5vcHRpb25zLnRpbWV6b25lfSxqLmFwcGx5VGltZXpvbmU9ZnVuY3Rpb24odCl7aWYoIXQuaGFzVGltZSgpKXJldHVybiB0LmNsb25lKCk7dmFyIGUsbj1qLm1vbWVudCh0LnRvQXJyYXkoKSksaT10LnRpbWUoKS1uLnRpbWUoKTtyZXR1cm4gaSYmKGU9bi5jbG9uZSgpLmFkZChpKSx0LnRpbWUoKS1lLnRpbWUoKT09PTAmJihuPWUpKSxufSxqLmdldE5vdz1mdW5jdGlvbigpe3ZhciB0PWoub3B0aW9ucy5ub3c7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQoKSksai5tb21lbnQodCkuc3RyaXBab25lKCl9LGouZ2V0RXZlbnRFbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZW5kP3QuZW5kLmNsb25lKCk6ai5nZXREZWZhdWx0RXZlbnRFbmQodC5hbGxEYXksdC5zdGFydCl9LGouZ2V0RGVmYXVsdEV2ZW50RW5kPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5jbG9uZSgpO3JldHVybiB0P24uc3RyaXBUaW1lKCkuYWRkKGouZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb24pOm4uYWRkKGouZGVmYXVsdFRpbWVkRXZlbnREdXJhdGlvbiksai5nZXRJc0FtYmlnVGltZXpvbmUoKSYmbi5zdHJpcFpvbmUoKSxufSxqLmh1bWFuaXplRHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHQubG9jYWxlKGoub3B0aW9ucy5sb2NhbGUpLmh1bWFuaXplKCl9LFl0LmNhbGwoaik7dmFyIHEsJCxYLEssUSxKLHR0LGV0PWouaXNGZXRjaE5lZWRlZCxudD1qLmZldGNoRXZlbnRzLGl0PWouZmV0Y2hFdmVudFNvdXJjZXMsc3Q9blswXSxvdD17fSxsdD0wLHV0PVtdO3R0PW51bGwhPWoub3B0aW9ucy5kZWZhdWx0RGF0ZT9qLm1vbWVudChqLm9wdGlvbnMuZGVmYXVsdERhdGUpLnN0cmlwWm9uZSgpOmouZ2V0Tm93KCksai5nZXRTdWdnZXN0ZWRWaWV3SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PVEmJmcoKSxRfSxqLmlzSGVpZ2h0QXV0bz1mdW5jdGlvbigpe3JldHVybiJhdXRvIj09PWoub3B0aW9ucy5jb250ZW50SGVpZ2h0fHwiYXV0byI9PT1qLm9wdGlvbnMuaGVpZ2h0fSxqLmZyZWV6ZUNvbnRlbnRIZWlnaHQ9QSxqLnVuZnJlZXplQ29udGVudEhlaWdodD1PLGouaW5pdGlhbGl6ZSgpfWZ1bmN0aW9uIFZ0KGUpe3QuZWFjaChIZSxmdW5jdGlvbih0LG4pe251bGw9PWVbdF0mJihlW3RdPW4oZSkpfSl9ZnVuY3Rpb24gUHQodCl7cmV0dXJuIGUubG9jYWxlRGF0YSh0KXx8ZS5sb2NhbGVEYXRhKCJlbiIpfWZ1bmN0aW9uIF90KGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj1lLm9wdGlvbnMscz1uLmhlYWRlcjtmPW4udGhlbWU/InVpIjoiZmMiLHM/KGg/aC5lbXB0eSgpOmg9dGhpcy5lbD10KCI8ZGl2IGNsYXNzPSdmYy10b29sYmFyJy8+IiksaC5hcHBlbmQocigibGVmdCIpKS5hcHBlbmQocigicmlnaHQiKSkuYXBwZW5kKHIoImNlbnRlciIpKS5hcHBlbmQoJzxkaXYgY2xhc3M9ImZjLWNsZWFyIi8+JykpOmkoKX1mdW5jdGlvbiBpKCl7aCYmKGgucmVtb3ZlKCksaD1jLmVsPW51bGwpfWZ1bmN0aW9uIHIobil7dmFyIGk9dCgnPGRpdiBjbGFzcz0iZmMtJytuKyciLz4nKSxyPWUub3B0aW9ucyxzPXIuaGVhZGVyW25dO3JldHVybiBzJiZ0LmVhY2gocy5zcGxpdCgiICIpLGZ1bmN0aW9uKG4pe3ZhciBzLG89dCgpLGw9ITA7dC5lYWNoKHRoaXMuc3BsaXQoIiwiKSxmdW5jdGlvbihuLGkpe3ZhciBzLGEsdSxkLGMsaCxwLHYsbSx5OyJ0aXRsZSI9PWk/KG89by5hZGQodCgiPGgyPiZuYnNwOzwvaDI+IikpLGw9ITEpOigocz0oci5jdXN0b21CdXR0b25zfHx7fSlbaV0pPyh1PWZ1bmN0aW9uKHQpe3MuY2xpY2smJnMuY2xpY2suY2FsbCh5WzBdLHQpfSxkPSIiLGM9cy50ZXh0KTooYT1lLmdldFZpZXdTcGVjKGkpKT8odT1mdW5jdGlvbigpe2UuY2hhbmdlVmlldyhpKX0sZy5wdXNoKGkpLGQ9YS5idXR0b25UZXh0T3ZlcnJpZGUsYz1hLmJ1dHRvblRleHREZWZhdWx0KTplW2ldJiYodT1mdW5jdGlvbigpe2VbaV0oKX0sZD0oZS5vdmVycmlkZXMuYnV0dG9uVGV4dHx8e30pW2ldLGM9ci5idXR0b25UZXh0W2ldKSx1JiYoaD1zP3MudGhlbWVJY29uOnIudGhlbWVCdXR0b25JY29uc1tpXSxwPXM/cy5pY29uOnIuYnV0dG9uSWNvbnNbaV0sdj1kP3R0KGQpOmgmJnIudGhlbWU/IjxzcGFuIGNsYXNzPSd1aS1pY29uIHVpLWljb24tIitoKyInPjwvc3Bhbj4iOnAmJiFyLnRoZW1lPyI8c3BhbiBjbGFzcz0nZmMtaWNvbiBmYy1pY29uLSIrcCsiJz48L3NwYW4+Ijp0dChjKSxtPVsiZmMtIitpKyItYnV0dG9uIixmKyItYnV0dG9uIixmKyItc3RhdGUtZGVmYXVsdCJdLHk9dCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSInK20uam9pbigiICIpKyciPicrdisiPC9idXR0b24+IikuY2xpY2soZnVuY3Rpb24odCl7eS5oYXNDbGFzcyhmKyItc3RhdGUtZGlzYWJsZWQiKXx8KHUodCksKHkuaGFzQ2xhc3MoZisiLXN0YXRlLWFjdGl2ZSIpfHx5Lmhhc0NsYXNzKGYrIi1zdGF0ZS1kaXNhYmxlZCIpKSYmeS5yZW1vdmVDbGFzcyhmKyItc3RhdGUtaG92ZXIiKSl9KS5tb3VzZWRvd24oZnVuY3Rpb24oKXt5Lm5vdCgiLiIrZisiLXN0YXRlLWFjdGl2ZSIpLm5vdCgiLiIrZisiLXN0YXRlLWRpc2FibGVkIikuYWRkQ2xhc3MoZisiLXN0YXRlLWRvd24iKX0pLm1vdXNldXAoZnVuY3Rpb24oKXt5LnJlbW92ZUNsYXNzKGYrIi1zdGF0ZS1kb3duIil9KS5ob3ZlcihmdW5jdGlvbigpe3kubm90KCIuIitmKyItc3RhdGUtYWN0aXZlIikubm90KCIuIitmKyItc3RhdGUtZGlzYWJsZWQiKS5hZGRDbGFzcyhmKyItc3RhdGUtaG92ZXIiKX0sZnVuY3Rpb24oKXt5LnJlbW92ZUNsYXNzKGYrIi1zdGF0ZS1ob3ZlciIpLnJlbW92ZUNsYXNzKGYrIi1zdGF0ZS1kb3duIil9KSxvPW8uYWRkKHkpKSl9KSxsJiZvLmZpcnN0KCkuYWRkQ2xhc3MoZisiLWNvcm5lci1sZWZ0IikuZW5kKCkubGFzdCgpLmFkZENsYXNzKGYrIi1jb3JuZXItcmlnaHQiKS5lbmQoKSxvLmxlbmd0aD4xPyhzPXQoIjxkaXYvPiIpLGwmJnMuYWRkQ2xhc3MoImZjLWJ1dHRvbi1ncm91cCIpLHMuYXBwZW5kKG8pLGkuYXBwZW5kKHMpKTppLmFwcGVuZChvKX0pLGl9ZnVuY3Rpb24gcyh0KXtoJiZoLmZpbmQoImgyIikudGV4dCh0KX1mdW5jdGlvbiBvKHQpe2gmJmguZmluZCgiLmZjLSIrdCsiLWJ1dHRvbiIpLmFkZENsYXNzKGYrIi1zdGF0ZS1hY3RpdmUiKX1mdW5jdGlvbiBsKHQpe2gmJmguZmluZCgiLmZjLSIrdCsiLWJ1dHRvbiIpLnJlbW92ZUNsYXNzKGYrIi1zdGF0ZS1hY3RpdmUiKX1mdW5jdGlvbiBhKHQpe2gmJmguZmluZCgiLmZjLSIrdCsiLWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwhMCkuYWRkQ2xhc3MoZisiLXN0YXRlLWRpc2FibGVkIil9ZnVuY3Rpb24gdSh0KXtoJiZoLmZpbmQoIi5mYy0iK3QrIi1idXR0b24iKS5wcm9wKCJkaXNhYmxlZCIsITEpLnJlbW92ZUNsYXNzKGYrIi1zdGF0ZS1kaXNhYmxlZCIpfWZ1bmN0aW9uIGQoKXtyZXR1cm4gZ312YXIgYz10aGlzO2MucmVuZGVyPW4sYy5yZW1vdmVFbGVtZW50PWksYy51cGRhdGVUaXRsZT1zLGMuYWN0aXZhdGVCdXR0b249byxjLmRlYWN0aXZhdGVCdXR0b249bCxjLmRpc2FibGVCdXR0b249YSxjLmVuYWJsZUJ1dHRvbj11LGMuZ2V0Vmlld3NXaXRoQnV0dG9ucz1kLGMuZWw9bnVsbDt2YXIgaCxmLGc9W119ZnVuY3Rpb24gWXQoKXtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIU98fHQ8T3x8ZT5WfWZ1bmN0aW9uIGkodCxlKXtPPXQsVj1lLHIoWSwicmVzZXQiKX1mdW5jdGlvbiByKHQsZSl7dmFyIG4saTtmb3IoInJlc2V0Ij09PWU/aj1bXToiYWRkIiE9PWUmJihqPXcoaix0KSksbj0wO248dC5sZW5ndGg7bisrKWk9dFtuXSwicGVuZGluZyIhPT1pLl9zdGF0dXMmJlcrKyxpLl9mZXRjaElkPShpLl9mZXRjaElkfHwwKSsxLGkuX3N0YXR1cz0icGVuZGluZyI7Zm9yKG49MDtuPHQubGVuZ3RoO24rKylpPXRbbl0scyhpLGkuX2ZldGNoSWQpfWZ1bmN0aW9uIHMoZSxuKXthKGUsZnVuY3Rpb24oaSl7dmFyIHIscyxvLGE9dC5pc0FycmF5KGUuZXZlbnRzKTtpZihuPT09ZS5fZmV0Y2hJZCYmInJlamVjdGVkIiE9PWUuX3N0YXR1cyl7aWYoZS5fc3RhdHVzPSJyZXNvbHZlZCIsaSlmb3Iocj0wO3I8aS5sZW5ndGg7cisrKXM9aVtyXSxvPWE/czpSKHMsZSksbyYmai5wdXNoLmFwcGx5KGosTChvKSk7bCgpfX0pfWZ1bmN0aW9uIG8odCl7dmFyIGU9InBlbmRpbmciPT09dC5fc3RhdHVzO3QuX3N0YXR1cz0icmVqZWN0ZWQiLGUmJmwoKX1mdW5jdGlvbiBsKCl7Vy0tLFd8fFAoail9ZnVuY3Rpb24gYShlLG4pe3ZhciBpLHIscz1qdC5zb3VyY2VGZXRjaGVycztmb3IoaT0wO2k8cy5sZW5ndGg7aSsrKXtpZihyPXNbaV0uY2FsbChGLGUsTy5jbG9uZSgpLFYuY2xvbmUoKSxGLm9wdGlvbnMudGltZXpvbmUsbikscj09PSEwKXJldHVybjtpZigib2JqZWN0Ij09dHlwZW9mIHIpcmV0dXJuIHZvaWQgYShyLG4pfXZhciBvPWUuZXZlbnRzO2lmKG8pdC5pc0Z1bmN0aW9uKG8pPyhGLnB1c2hMb2FkaW5nKCksby5jYWxsKEYsTy5jbG9uZSgpLFYuY2xvbmUoKSxGLm9wdGlvbnMudGltZXpvbmUsZnVuY3Rpb24odCl7bih0KSxGLnBvcExvYWRpbmcoKX0pKTp0LmlzQXJyYXkobyk/bihvKTpuKCk7ZWxzZXt2YXIgbD1lLnVybDtpZihsKXt2YXIgdSxkPWUuc3VjY2VzcyxjPWUuZXJyb3IsaD1lLmNvbXBsZXRlO3U9dC5pc0Z1bmN0aW9uKGUuZGF0YSk/ZS5kYXRhKCk6ZS5kYXRhO3ZhciBmPXQuZXh0ZW5kKHt9LHV8fHt9KSxnPUooZS5zdGFydFBhcmFtLEYub3B0aW9ucy5zdGFydFBhcmFtKSxwPUooZS5lbmRQYXJhbSxGLm9wdGlvbnMuZW5kUGFyYW0pLHY9SihlLnRpbWV6b25lUGFyYW0sRi5vcHRpb25zLnRpbWV6b25lUGFyYW0pO2cmJihmW2ddPU8uZm9ybWF0KCkpLHAmJihmW3BdPVYuZm9ybWF0KCkpLEYub3B0aW9ucy50aW1lem9uZSYmImxvY2FsIiE9Ri5vcHRpb25zLnRpbWV6b25lJiYoZlt2XT1GLm9wdGlvbnMudGltZXpvbmUpLEYucHVzaExvYWRpbmcoKSx0LmFqYXgodC5leHRlbmQoe30sVGUsZSx7ZGF0YTpmLHN1Y2Nlc3M6ZnVuY3Rpb24oZSl7ZT1lfHxbXTt2YXIgaT1RKGQsdGhpcyxhcmd1bWVudHMpO3QuaXNBcnJheShpKSYmKGU9aSksbihlKX0sZXJyb3I6ZnVuY3Rpb24oKXtRKGMsdGhpcyxhcmd1bWVudHMpLG4oKX0sY29tcGxldGU6ZnVuY3Rpb24oKXtRKGgsdGhpcyxhcmd1bWVudHMpLEYucG9wTG9hZGluZygpfX0pKX1lbHNlIG4oKX19ZnVuY3Rpb24gdSh0KXt2YXIgZT1kKHQpO2UmJihZLnB1c2goZSkscihbZV0sImFkZCIpKX1mdW5jdGlvbiBkKGUpe3ZhciBuLGkscj1qdC5zb3VyY2VOb3JtYWxpemVycztpZih0LmlzRnVuY3Rpb24oZSl8fHQuaXNBcnJheShlKT9uPXtldmVudHM6ZX06InN0cmluZyI9PXR5cGVvZiBlP249e3VybDplfToib2JqZWN0Ij09dHlwZW9mIGUmJihuPXQuZXh0ZW5kKHt9LGUpKSxuKXtmb3Iobi5jbGFzc05hbWU/InN0cmluZyI9PXR5cGVvZiBuLmNsYXNzTmFtZSYmKG4uY2xhc3NOYW1lPW4uY2xhc3NOYW1lLnNwbGl0KC9ccysvKSk6bi5jbGFzc05hbWU9W10sdC5pc0FycmF5KG4uZXZlbnRzKSYmKG4ub3JpZ0FycmF5PW4uZXZlbnRzLG4uZXZlbnRzPXQubWFwKG4uZXZlbnRzLGZ1bmN0aW9uKHQpe3JldHVybiBSKHQsbil9KSksaT0wO2k8ci5sZW5ndGg7aSsrKXJbaV0uY2FsbChGLG4pO3JldHVybiBufX1mdW5jdGlvbiBjKHQpe2YobSh0KSl9ZnVuY3Rpb24gaCh0KXtudWxsPT10P2YoWSwhMCk6Zih2KHQpKX1mdW5jdGlvbiBmKGUsbil7dmFyIGk7Zm9yKGk9MDtpPGUubGVuZ3RoO2krKylvKGVbaV0pO24/KFk9W10saj1bXSk6KFk9dC5ncmVwKFksZnVuY3Rpb24odCl7Zm9yKGk9MDtpPGUubGVuZ3RoO2krKylpZih0PT09ZVtpXSlyZXR1cm4hMTtyZXR1cm4hMH0pLGo9dyhqLGUpKSxQKGopfWZ1bmN0aW9uIGcoKXtyZXR1cm4gWS5zbGljZSgxKX1mdW5jdGlvbiBwKGUpe3JldHVybiB0LmdyZXAoWSxmdW5jdGlvbih0KXtyZXR1cm4gdC5pZCYmdC5pZD09PWV9KVswXX1mdW5jdGlvbiB2KGUpe2U/dC5pc0FycmF5KGUpfHwoZT1bZV0pOmU9W107dmFyIG4saT1bXTtmb3Iobj0wO248ZS5sZW5ndGg7bisrKWkucHVzaC5hcHBseShpLG0oZVtuXSkpO3JldHVybiBpfWZ1bmN0aW9uIG0oZSl7dmFyIG4saTtmb3Iobj0wO248WS5sZW5ndGg7bisrKWlmKGk9WVtuXSxpPT09ZSlyZXR1cm5baV07cmV0dXJuIGk9cChlKSxpP1tpXTp0LmdyZXAoWSxmdW5jdGlvbih0KXtyZXR1cm4geShlLHQpfSl9ZnVuY3Rpb24geSh0LGUpe3JldHVybiB0JiZlJiZTKHQpPT1TKGUpfWZ1bmN0aW9uIFModCl7cmV0dXJuKCJvYmplY3QiPT10eXBlb2YgdD90Lm9yaWdBcnJheXx8dC5nb29nbGVDYWxlbmRhcklkfHx0LnVybHx8dC5ldmVudHM6bnVsbCl8fHR9ZnVuY3Rpb24gdyhlLG4pe3JldHVybiB0LmdyZXAoZSxmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPG4ubGVuZ3RoO2UrKylpZih0LnNvdXJjZT09PW5bZV0pcmV0dXJuITE7cmV0dXJuITB9KX1mdW5jdGlvbiBFKHQpe3Quc3RhcnQ9Ri5tb21lbnQodC5zdGFydCksdC5lbmQ/dC5lbmQ9Ri5tb21lbnQodC5lbmQpOnQuZW5kPW51bGwsQih0LEQodCkpLFAoail9ZnVuY3Rpb24gRChlKXt2YXIgbj17fTtyZXR1cm4gdC5lYWNoKGUsZnVuY3Rpb24odCxlKXtiKHQpJiZ2b2lkIDAhPT1lJiZLKGUpJiYoblt0XT1lKX0pLG59ZnVuY3Rpb24gYih0KXtyZXR1cm4hL15ffF4oaWR8YWxsRGF5fHN0YXJ0fGVuZCkkLy50ZXN0KHQpfWZ1bmN0aW9uIEModCxlKXt2YXIgbixpLHIscz1SKHQpO2lmKHMpe2ZvcihuPUwocyksaT0wO2k8bi5sZW5ndGg7aSsrKXI9bltpXSxyLnNvdXJjZXx8KGUmJihfLmV2ZW50cy5wdXNoKHIpLHIuc291cmNlPV8pLGoucHVzaChyKSk7cmV0dXJuIFAoaiksbn1yZXR1cm5bXX1mdW5jdGlvbiBIKGUpe3ZhciBuLGk7Zm9yKG51bGw9PWU/ZT1mdW5jdGlvbigpe3JldHVybiEwfTp0LmlzRnVuY3Rpb24oZSl8fChuPWUrIiIsZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5faWQ9PW59KSxqPXQuZ3JlcChqLGUsITApLGk9MDtpPFkubGVuZ3RoO2krKyl0LmlzQXJyYXkoWVtpXS5ldmVudHMpJiYoWVtpXS5ldmVudHM9dC5ncmVwKFlbaV0uZXZlbnRzLGUsITApKTtQKGopfWZ1bmN0aW9uIFQoZSl7cmV0dXJuIHQuaXNGdW5jdGlvbihlKT90LmdyZXAoaixlKTpudWxsIT1lPyhlKz0iIix0LmdyZXAoaixmdW5jdGlvbih0KXtyZXR1cm4gdC5faWQ9PWV9KSk6an1mdW5jdGlvbiB4KHQpe3Quc3RhcnQ9Ri5tb21lbnQodC5zdGFydCksdC5lbmQmJih0LmVuZD1GLm1vbWVudCh0LmVuZCkpLFd0KHQpfWZ1bmN0aW9uIFIobixpKXt2YXIgcixzLG8sbD17fTtpZihGLm9wdGlvbnMuZXZlbnREYXRhVHJhbnNmb3JtJiYobj1GLm9wdGlvbnMuZXZlbnREYXRhVHJhbnNmb3JtKG4pKSxpJiZpLmV2ZW50RGF0YVRyYW5zZm9ybSYmKG49aS5ldmVudERhdGFUcmFuc2Zvcm0obikpLHQuZXh0ZW5kKGwsbiksaSYmKGwuc291cmNlPWkpLGwuX2lkPW4uX2lkfHwodm9pZCAwPT09bi5pZD8iX2ZjIit4ZSsrOm4uaWQrIiIpLG4uY2xhc3NOYW1lPyJzdHJpbmciPT10eXBlb2Ygbi5jbGFzc05hbWU/bC5jbGFzc05hbWU9bi5jbGFzc05hbWUuc3BsaXQoL1xzKy8pOmwuY2xhc3NOYW1lPW4uY2xhc3NOYW1lOmwuY2xhc3NOYW1lPVtdLHI9bi5zdGFydHx8bi5kYXRlLHM9bi5lbmQsVShyKSYmKHI9ZS5kdXJhdGlvbihyKSksVShzKSYmKHM9ZS5kdXJhdGlvbihzKSksbi5kb3d8fGUuaXNEdXJhdGlvbihyKXx8ZS5pc0R1cmF0aW9uKHMpKWwuc3RhcnQ9cj9lLmR1cmF0aW9uKHIpOm51bGwsbC5lbmQ9cz9lLmR1cmF0aW9uKHMpOm51bGwsbC5fcmVjdXJyaW5nPSEwO2Vsc2V7aWYociYmKHI9Ri5tb21lbnQociksIXIuaXNWYWxpZCgpKSlyZXR1cm4hMTtzJiYocz1GLm1vbWVudChzKSxzLmlzVmFsaWQoKXx8KHM9bnVsbCkpLG89bi5hbGxEYXksdm9pZCAwPT09byYmKG89SihpP2kuYWxsRGF5RGVmYXVsdDp2b2lkIDAsRi5vcHRpb25zLmFsbERheURlZmF1bHQpKSxJKHIscyxvLGwpfXJldHVybiBGLm5vcm1hbGl6ZUV2ZW50KGwpLGx9ZnVuY3Rpb24gSSh0LGUsbixpKXtpLnN0YXJ0PXQsaS5lbmQ9ZSxpLmFsbERheT1uLGsoaSksV3QoaSl9ZnVuY3Rpb24gayh0KXtNKHQpLHQuZW5kJiYhdC5lbmQuaXNBZnRlcih0LnN0YXJ0KSYmKHQuZW5kPW51bGwpLHQuZW5kfHwoRi5vcHRpb25zLmZvcmNlRXZlbnREdXJhdGlvbj90LmVuZD1GLmdldERlZmF1bHRFdmVudEVuZCh0LmFsbERheSx0LnN0YXJ0KTp0LmVuZD1udWxsKX1mdW5jdGlvbiBNKHQpe251bGw9PXQuYWxsRGF5JiYodC5hbGxEYXk9ISh0LnN0YXJ0Lmhhc1RpbWUoKXx8dC5lbmQmJnQuZW5kLmhhc1RpbWUoKSkpLHQuYWxsRGF5Pyh0LnN0YXJ0LnN0cmlwVGltZSgpLHQuZW5kJiZ0LmVuZC5zdHJpcFRpbWUoKSk6KHQuc3RhcnQuaGFzVGltZSgpfHwodC5zdGFydD1GLmFwcGx5VGltZXpvbmUodC5zdGFydC50aW1lKDApKSksdC5lbmQmJiF0LmVuZC5oYXNUaW1lKCkmJih0LmVuZD1GLmFwcGx5VGltZXpvbmUodC5lbmQudGltZSgwKSkpKX1mdW5jdGlvbiBMKGUsbixpKXt2YXIgcixzLG8sbCxhLHUsZCxjLGgsZj1bXTtpZihuPW58fE8saT1pfHxWLGUpaWYoZS5fcmVjdXJyaW5nKXtpZihzPWUuZG93KWZvcihyPXt9LG89MDtvPHMubGVuZ3RoO28rKylyW3Nbb11dPSEwO2ZvcihsPW4uY2xvbmUoKS5zdHJpcFRpbWUoKTtsLmlzQmVmb3JlKGkpOylyJiYhcltsLmRheSgpXXx8KGE9ZS5zdGFydCx1PWUuZW5kLGQ9bC5jbG9uZSgpLGM9bnVsbCxhJiYoZD1kLnRpbWUoYSkpLHUmJihjPWwuY2xvbmUoKS50aW1lKHUpKSxoPXQuZXh0ZW5kKHt9LGUpLEkoZCxjLCFhJiYhdSxoKSxmLnB1c2goaCkpLGwuYWRkKDEsImRheXMiKX1lbHNlIGYucHVzaChlKTtyZXR1cm4gZn1mdW5jdGlvbiBCKGUsbixpKXtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIGk/QSh0LGUsaSk6bi5hbGxEYXk/Ryh0LGUpOk4odCxlKX12YXIgcyxvLGwsYSx1LGQsYz17fTtyZXR1cm4gbj1ufHx7fSxuLnN0YXJ0fHwobi5zdGFydD1lLnN0YXJ0LmNsb25lKCkpLHZvaWQgMD09PW4uZW5kJiYobi5lbmQ9ZS5lbmQ/ZS5lbmQuY2xvbmUoKTpudWxsKSxudWxsPT1uLmFsbERheSYmKG4uYWxsRGF5PWUuYWxsRGF5KSxrKG4pLHM9e3N0YXJ0OmUuX3N0YXJ0LmNsb25lKCksZW5kOmUuX2VuZD9lLl9lbmQuY2xvbmUoKTpGLmdldERlZmF1bHRFdmVudEVuZChlLl9hbGxEYXksZS5fc3RhcnQpLGFsbERheTpuLmFsbERheX0sayhzKSxvPW51bGwhPT1lLl9lbmQmJm51bGw9PT1uLmVuZCxsPXIobi5zdGFydCxzLnN0YXJ0KSxuLmVuZD8oYT1yKG4uZW5kLHMuZW5kKSx1PWEuc3VidHJhY3QobCkpOnU9bnVsbCx0LmVhY2gobixmdW5jdGlvbih0LGUpe2IodCkmJnZvaWQgMCE9PWUmJihjW3RdPWUpfSksZD16KFQoZS5faWQpLG8sbi5hbGxEYXksbCx1LGMpLHtkYXRlRGVsdGE6bCxkdXJhdGlvbkRlbHRhOnUsdW5kbzpkfX1mdW5jdGlvbiB6KGUsbixpLHIscyxvKXt2YXIgbD1GLmdldElzQW1iaWdUaW1lem9uZSgpLGE9W107cmV0dXJuIHImJiFyLnZhbHVlT2YoKSYmKHI9bnVsbCkscyYmIXMudmFsdWVPZigpJiYocz1udWxsKSx0LmVhY2goZSxmdW5jdGlvbihlLHUpe3ZhciBkLGM7ZD17c3RhcnQ6dS5zdGFydC5jbG9uZSgpLGVuZDp1LmVuZD91LmVuZC5jbG9uZSgpOm51bGwsYWxsRGF5OnUuYWxsRGF5fSx0LmVhY2gobyxmdW5jdGlvbih0KXtkW3RdPXVbdF19KSxjPXtzdGFydDp1Ll9zdGFydCxlbmQ6dS5fZW5kLGFsbERheTppfSxrKGMpLG4/Yy5lbmQ9bnVsbDpzJiYhYy5lbmQmJihjLmVuZD1GLmdldERlZmF1bHRFdmVudEVuZChjLmFsbERheSxjLnN0YXJ0KSksciYmKGMuc3RhcnQuYWRkKHIpLGMuZW5kJiZjLmVuZC5hZGQocikpLHMmJmMuZW5kLmFkZChzKSxsJiYhYy5hbGxEYXkmJihyfHxzKSYmKGMuc3RhcnQuc3RyaXBab25lKCksYy5lbmQmJmMuZW5kLnN0cmlwWm9uZSgpKSx0LmV4dGVuZCh1LG8sYyksV3QodSksYS5wdXNoKGZ1bmN0aW9uKCl7dC5leHRlbmQodSxkKSxXdCh1KX0pfSksZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PGEubGVuZ3RoO3QrKylhW3RdKCl9fXZhciBGPXRoaXM7Ri5pc0ZldGNoTmVlZGVkPW4sRi5mZXRjaEV2ZW50cz1pLEYuZmV0Y2hFdmVudFNvdXJjZXM9cixGLmdldEV2ZW50U291cmNlcz1nLEYuZ2V0RXZlbnRTb3VyY2VCeUlkPXAsRi5nZXRFdmVudFNvdXJjZXNCeU1hdGNoQXJyYXk9dixGLmdldEV2ZW50U291cmNlc0J5TWF0Y2g9bSxGLmFkZEV2ZW50U291cmNlPXUsRi5yZW1vdmVFdmVudFNvdXJjZT1jLEYucmVtb3ZlRXZlbnRTb3VyY2VzPWgsRi51cGRhdGVFdmVudD1FLEYucmVuZGVyRXZlbnQ9QyxGLnJlbW92ZUV2ZW50cz1ILEYuY2xpZW50RXZlbnRzPVQsRi5tdXRhdGVFdmVudD1CLEYubm9ybWFsaXplRXZlbnREYXRlcz1rLEYubm9ybWFsaXplRXZlbnRUaW1lcz1NO3ZhciBPLFYsUD1GLnJlcG9ydEV2ZW50cyxfPXtldmVudHM6W119LFk9W19dLFc9MCxqPVtdO3QuZWFjaCgoRi5vcHRpb25zLmV2ZW50cz9bRi5vcHRpb25zLmV2ZW50c106W10pLmNvbmNhdChGLm9wdGlvbnMuZXZlbnRTb3VyY2VzfHxbXSksZnVuY3Rpb24odCxlKXt2YXIgbj1kKGUpO24mJlkucHVzaChuKX0pLEYucmV6b25lQXJyYXlFdmVudFNvdXJjZXM9ZnVuY3Rpb24oKXt2YXIgZSxuLGk7Zm9yKGU9MDtlPFkubGVuZ3RoO2UrKylpZihuPVlbZV0uZXZlbnRzLHQuaXNBcnJheShuKSlmb3IoaT0wO2k8bi5sZW5ndGg7aSsrKXgobltpXSl9LEYuYnVpbGRFdmVudEZyb21JbnB1dD1SLEYuZXhwYW5kRXZlbnQ9TCxGLmdldEV2ZW50Q2FjaGU9ZnVuY3Rpb24oKXtyZXR1cm4gan19ZnVuY3Rpb24gV3QodCl7dC5fYWxsRGF5PXQuYWxsRGF5LHQuX3N0YXJ0PXQuc3RhcnQuY2xvbmUoKSx0Ll9lbmQ9dC5lbmQ/dC5lbmQuY2xvbmUoKTpudWxsfXZhciBqdD10LmZ1bGxDYWxlbmRhcj17dmVyc2lvbjoiMy4wLjEiLGludGVybmFsQXBpVmVyc2lvbjo2fSxVdD1qdC52aWV3cz17fTt0LmZuLmZ1bGxDYWxlbmRhcj1mdW5jdGlvbihlKXt2YXIgbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksaT10aGlzO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24ocixzKXt2YXIgbyxsPXQocyksYT1sLmRhdGEoImZ1bGxDYWxlbmRhciIpOyJzdHJpbmciPT10eXBlb2YgZT9hJiZ0LmlzRnVuY3Rpb24oYVtlXSkmJihvPWFbZV0uYXBwbHkoYSxuKSxyfHwoaT1vKSwiZGVzdHJveSI9PT1lJiZsLnJlbW92ZURhdGEoImZ1bGxDYWxlbmRhciIpKTphfHwoYT1uZXcgRWUobCxlKSxsLmRhdGEoImZ1bGxDYWxlbmRhciIsYSksYS5yZW5kZXIoKSl9KSxpfTt2YXIgcXQ9WyJoZWFkZXIiLCJidXR0b25UZXh0IiwiYnV0dG9uSWNvbnMiLCJ0aGVtZUJ1dHRvbkljb25zIl07anQuaW50ZXJzZWN0UmFuZ2VzPUYsanQuYXBwbHlBbGw9USxqdC5kZWJvdW5jZT1hdCxqdC5pc0ludD1vdCxqdC5odG1sRXNjYXBlPXR0LGp0LmNzc1RvU3RyPW50LGp0LnByb3h5PWx0LGp0LmNhcGl0YWxpc2VGaXJzdExldHRlcj1ydCxqdC5nZXRPdXRlclJlY3Q9aCxqdC5nZXRDbGllbnRSZWN0PWYsanQuZ2V0Q29udGVudFJlY3Q9ZyxqdC5nZXRTY3JvbGxiYXJXaWR0aHM9cDt2YXIgWnQ9bnVsbDtqdC5wcmV2ZW50RGVmYXVsdD1DLGp0LmludGVyc2VjdFJlY3RzPXgsanQucGFyc2VGaWVsZFNwZWNzPU0sanQuY29tcGFyZUJ5RmllbGRTcGVjcz1MLGp0LmNvbXBhcmVCeUZpZWxkU3BlYz1CLGp0LmZsZXhpYmxlQ29tcGFyZT16LGp0LmNvbXB1dGVJbnRlcnZhbFVuaXQ9TyxqdC5kaXZpZGVSYW5nZUJ5RHVyYXRpb249UCxqdC5kaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb249XyxqdC5tdWx0aXBseUR1cmF0aW9uPVksanQuZHVyYXRpb25IYXNUaW1lPVc7dmFyICR0PVsic3VuIiwibW9uIiwidHVlIiwid2VkIiwidGh1IiwiZnJpIiwic2F0Il0sWHQ9WyJ5ZWFyIiwibW9udGgiLCJ3ZWVrIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl07anQubG9nPWZ1bmN0aW9uKCl7dmFyIHQ9d2luZG93LmNvbnNvbGU7aWYodCYmdC5sb2cpcmV0dXJuIHQubG9nLmFwcGx5KHQsYXJndW1lbnRzKX0sanQud2Fybj1mdW5jdGlvbigpe3ZhciB0PXdpbmRvdy5jb25zb2xlO3JldHVybiB0JiZ0Lndhcm4/dC53YXJuLmFwcGx5KHQsYXJndW1lbnRzKTpqdC5sb2cuYXBwbHkoanQsYXJndW1lbnRzKX07dmFyIEt0PXt9Lmhhc093blByb3BlcnR5LFF0PS9eXHMqXGR7NH0tXGRcZCQvLEp0PS9eXHMqXGR7NH0tKD86KFxkXGQtXGRcZCl8KFdcZFxkJCl8KFdcZFxkLVxkKXwoXGRcZFxkKSkoKFR8ICkoXGRcZCg6XGRcZCg6XGRcZChcLlxkKyk/KT8pPyk/KT8kLyx0ZT1lLmZuLGVlPXQuZXh0ZW5kKHt9LHRlKSxuZT1lLm1vbWVudFByb3BlcnRpZXM7bmUucHVzaCgiX2Z1bGxDYWxlbmRhciIpLG5lLnB1c2goIl9hbWJpZ1RpbWUiKSxuZS5wdXNoKCJfYW1iaWdab25lIiksanQubW9tZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGR0KGFyZ3VtZW50cyl9LGp0Lm1vbWVudC51dGM9ZnVuY3Rpb24oKXt2YXIgdD1kdChhcmd1bWVudHMsITApO3JldHVybiB0Lmhhc1RpbWUoKSYmdC51dGMoKSx0fSxqdC5tb21lbnQucGFyc2Vab25lPWZ1bmN0aW9uKCl7cmV0dXJuIGR0KGFyZ3VtZW50cywhMCwhMCl9LHRlLndlZWs9dGUud2Vla3M9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbG9jYWxlLl9mdWxsQ2FsZW5kYXJfd2Vla0NhbGM7cmV0dXJuIG51bGw9PXQmJiJmdW5jdGlvbiI9PXR5cGVvZiBlP2UodGhpcyk6IklTTyI9PT1lP2VlLmlzb1dlZWsuYXBwbHkodGhpcyxhcmd1bWVudHMpOmVlLndlZWsuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0ZS50aW1lPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLl9mdWxsQ2FsZW5kYXIpcmV0dXJuIGVlLnRpbWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKG51bGw9PXQpcmV0dXJuIGUuZHVyYXRpb24oe2hvdXJzOnRoaXMuaG91cnMoKSxtaW51dGVzOnRoaXMubWludXRlcygpLHNlY29uZHM6dGhpcy5zZWNvbmRzKCksbWlsbGlzZWNvbmRzOnRoaXMubWlsbGlzZWNvbmRzKCl9KTt0aGlzLl9hbWJpZ1RpbWU9ITEsZS5pc0R1cmF0aW9uKHQpfHxlLmlzTW9tZW50KHQpfHwodD1lLmR1cmF0aW9uKHQpKTt2YXIgbj0wO3JldHVybiBlLmlzRHVyYXRpb24odCkmJihuPTI0Kk1hdGguZmxvb3IodC5hc0RheXMoKSkpLHRoaXMuaG91cnMobit0LmhvdXJzKCkpLm1pbnV0ZXModC5taW51dGVzKCkpLnNlY29uZHModC5zZWNvbmRzKCkpLm1pbGxpc2Vjb25kcyh0Lm1pbGxpc2Vjb25kcygpKX0sdGUuc3RyaXBUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FtYmlnVGltZXx8KHRoaXMudXRjKCEwKSx0aGlzLnNldCh7aG91cnM6MCxtaW51dGVzOjAsc2Vjb25kczowLG1zOjB9KSx0aGlzLl9hbWJpZ1RpbWU9ITAsdGhpcy5fYW1iaWdab25lPSEwKSx0aGlzfSx0ZS5oYXNUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2FtYmlnVGltZX0sdGUuc3RyaXBab25lPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMuX2FtYmlnWm9uZXx8KHQ9dGhpcy5fYW1iaWdUaW1lLHRoaXMudXRjKCEwKSx0aGlzLl9hbWJpZ1RpbWU9dHx8ITEsdGhpcy5fYW1iaWdab25lPSEwKSx0aGlzfSx0ZS5oYXNab25lPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2FtYmlnWm9uZX0sdGUubG9jYWw9ZnVuY3Rpb24odCl7cmV0dXJuIGVlLmxvY2FsLmNhbGwodGhpcyx0aGlzLl9hbWJpZ1pvbmV8fHQpLHRoaXMuX2FtYmlnVGltZT0hMSx0aGlzLl9hbWJpZ1pvbmU9ITEsdGhpc30sdGUudXRjPWZ1bmN0aW9uKHQpe3JldHVybiBlZS51dGMuY2FsbCh0aGlzLHQpLHRoaXMuX2FtYmlnVGltZT0hMSx0aGlzLl9hbWJpZ1pvbmU9ITEsdGhpc30sdGUudXRjT2Zmc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYodGhpcy5fYW1iaWdUaW1lPSExLHRoaXMuX2FtYmlnWm9uZT0hMSksZWUudXRjT2Zmc2V0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdGUuZm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Z1bGxDYWxlbmRhciYmYXJndW1lbnRzWzBdP2h0KHRoaXMsYXJndW1lbnRzWzBdKTp0aGlzLl9hbWJpZ1RpbWU/Y3QodGhpcywiWVlZWS1NTS1ERCIpOnRoaXMuX2FtYmlnWm9uZT9jdCh0aGlzLCJZWVlZLU1NLUREW1RdSEg6bW06c3MiKTplZS5mb3JtYXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0ZS50b0lTT1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbWJpZ1RpbWU/Y3QodGhpcywiWVlZWS1NTS1ERCIpOnRoaXMuX2FtYmlnWm9uZT9jdCh0aGlzLCJZWVlZLU1NLUREW1RdSEg6bW06c3MiKTplZS50b0lTT1N0cmluZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3ZhciBpZT17dDpmdW5jdGlvbih0KXtyZXR1cm4gY3QodCwiYSIpLmNoYXJBdCgwKX0sVDpmdW5jdGlvbih0KXtyZXR1cm4gY3QodCwiQSIpLmNoYXJBdCgwKX19O2p0LmZvcm1hdFJhbmdlPXB0O3ZhciByZT17WToieWVhciIsTToibW9udGgiLEQ6ImRheSIsZDoiZGF5IixBOiJzZWNvbmQiLGE6InNlY29uZCIsVDoic2Vjb25kIix0OiJzZWNvbmQiLEg6InNlY29uZCIsaDoic2Vjb25kIixtOiJzZWNvbmQiLHM6InNlY29uZCJ9LHNlPXt9LG9lPXtZOnt2YWx1ZToxLHVuaXQ6InllYXIifSxNOnt2YWx1ZToyLHVuaXQ6Im1vbnRoIn0sVzp7dmFsdWU6Myx1bml0OiJ3ZWVrIn0sdzp7dmFsdWU6Myx1bml0OiJ3ZWVrIn0sRDp7dmFsdWU6NCx1bml0OiJkYXkifSxkOnt2YWx1ZTo0LHVuaXQ6ImRheSJ9fTtqdC5xdWVyeU1vc3RHcmFudWxhckZvcm1hdFVuaXQ9ZnVuY3Rpb24odCl7dmFyIGUsbixpLHIscz15dCh0KTtmb3IoZT0wO2U8cy5sZW5ndGg7ZSsrKW49c1tlXSxuLnRva2VuJiYoaT1vZVtuLnRva2VuLmNoYXJBdCgwKV0saSYmKCFyfHxpLnZhbHVlPnIudmFsdWUpJiYocj1pKSk7cmV0dXJuIHI/ci51bml0Om51bGx9LGp0LkNsYXNzPXd0LHd0LmV4dGVuZD1mdW5jdGlvbigpe3ZhciB0LGUsbj1hcmd1bWVudHMubGVuZ3RoO2Zvcih0PTA7dDxuO3QrKyllPWFyZ3VtZW50c1t0XSx0PG4tMSYmRHQodGhpcyxlKTtyZXR1cm4gRXQodGhpcyxlfHx7fSl9LHd0Lm1peGluPWZ1bmN0aW9uKHQpe0R0KHRoaXMsdCl9O3ZhciBsZT1qdC5FbWl0dGVyTWl4aW49e29uOmZ1bmN0aW9uKGUsbil7dmFyIGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5hcHBseShlLmNvbnRleHR8fHRoaXMsZS5hcmdzfHxbXSl9O3JldHVybiBuLmd1aWR8fChuLmd1aWQ9dC5ndWlkKyspLGkuZ3VpZD1uLmd1aWQsdCh0aGlzKS5vbihlLGkpLHRoaXN9LG9mZjpmdW5jdGlvbihlLG4pe3JldHVybiB0KHRoaXMpLm9mZihlLG4pLHRoaXN9LHRyaWdnZXI6ZnVuY3Rpb24oZSl7dmFyIG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB0KHRoaXMpLnRyaWdnZXJIYW5kbGVyKGUse2FyZ3M6bn0pLHRoaXN9LHRyaWdnZXJXaXRoOmZ1bmN0aW9uKGUsbixpKXtyZXR1cm4gdCh0aGlzKS50cmlnZ2VySGFuZGxlcihlLHtjb250ZXh0Om4sYXJnczppfSksdGhpc319LGFlPWp0Lkxpc3RlbmVyTWl4aW49ZnVuY3Rpb24oKXt2YXIgZT0wLG49e2xpc3RlbmVySWQ6bnVsbCxsaXN0ZW5UbzpmdW5jdGlvbihlLG4saSl7aWYoIm9iamVjdCI9PXR5cGVvZiBuKWZvcih2YXIgciBpbiBuKW4uaGFzT3duUHJvcGVydHkocikmJnRoaXMubGlzdGVuVG8oZSxyLG5bcl0pO2Vsc2Uic3RyaW5nIj09dHlwZW9mIG4mJmUub24obisiLiIrdGhpcy5nZXRMaXN0ZW5lck5hbWVzcGFjZSgpLHQucHJveHkoaSx0aGlzKSl9LHN0b3BMaXN0ZW5pbmdUbzpmdW5jdGlvbih0LGUpe3Qub2ZmKChlfHwiIikrIi4iK3RoaXMuZ2V0TGlzdGVuZXJOYW1lc3BhY2UoKSl9LGdldExpc3RlbmVyTmFtZXNwYWNlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXRoaXMubGlzdGVuZXJJZCYmKHRoaXMubGlzdGVuZXJJZD1lKyspLCJfbGlzdGVuZXIiK3RoaXMubGlzdGVuZXJJZH19O3JldHVybiBufSgpLHVlPXtpc0lnbm9yaW5nTW91c2U6ITEsZGVsYXlVbmlnbm9yZU1vdXNlOm51bGwsaW5pdE1vdXNlSWdub3Jpbmc6ZnVuY3Rpb24odCl7dGhpcy5kZWxheVVuaWdub3JlTW91c2U9YXQobHQodGhpcywidW5pZ25vcmVNb3VzZSIpLHR8fDFlMyl9LHRlbXBJZ25vcmVNb3VzZTpmdW5jdGlvbigpe3RoaXMuaXNJZ25vcmluZ01vdXNlPSEwLHRoaXMuZGVsYXlVbmlnbm9yZU1vdXNlKCl9LHVuaWdub3JlTW91c2U6ZnVuY3Rpb24oKXt0aGlzLmlzSWdub3JpbmdNb3VzZT0hMX19LGRlPXd0LmV4dGVuZChhZSx7aXNIaWRkZW46ITAsb3B0aW9uczpudWxsLGVsOm51bGwsbWFyZ2luOjEwLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10fHx7fX0sc2hvdzpmdW5jdGlvbigpewp0aGlzLmlzSGlkZGVuJiYodGhpcy5lbHx8dGhpcy5yZW5kZXIoKSx0aGlzLmVsLnNob3coKSx0aGlzLnBvc2l0aW9uKCksdGhpcy5pc0hpZGRlbj0hMSx0aGlzLnRyaWdnZXIoInNob3ciKSl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLmlzSGlkZGVufHwodGhpcy5lbC5oaWRlKCksdGhpcy5pc0hpZGRlbj0hMCx0aGlzLnRyaWdnZXIoImhpZGUiKSl9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsbj10aGlzLm9wdGlvbnM7dGhpcy5lbD10KCc8ZGl2IGNsYXNzPSJmYy1wb3BvdmVyIi8+JykuYWRkQ2xhc3Mobi5jbGFzc05hbWV8fCIiKS5jc3Moe3RvcDowLGxlZnQ6MH0pLmFwcGVuZChuLmNvbnRlbnQpLmFwcGVuZFRvKG4ucGFyZW50RWwpLHRoaXMuZWwub24oImNsaWNrIiwiLmZjLWNsb3NlIixmdW5jdGlvbigpe2UuaGlkZSgpfSksbi5hdXRvSGlkZSYmdGhpcy5saXN0ZW5Ubyh0KGRvY3VtZW50KSwibW91c2Vkb3duIix0aGlzLmRvY3VtZW50TW91c2Vkb3duKX0sZG9jdW1lbnRNb3VzZWRvd246ZnVuY3Rpb24oZSl7dGhpcy5lbCYmIXQoZS50YXJnZXQpLmNsb3Nlc3QodGhpcy5lbCkubGVuZ3RoJiZ0aGlzLmhpZGUoKX0scmVtb3ZlRWxlbWVudDpmdW5jdGlvbigpe3RoaXMuaGlkZSgpLHRoaXMuZWwmJih0aGlzLmVsLnJlbW92ZSgpLHRoaXMuZWw9bnVsbCksdGhpcy5zdG9wTGlzdGVuaW5nVG8odChkb2N1bWVudCksIm1vdXNlZG93biIpfSxwb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBlLG4saSxyLHMsbz10aGlzLm9wdGlvbnMsbD10aGlzLmVsLm9mZnNldFBhcmVudCgpLm9mZnNldCgpLGE9dGhpcy5lbC5vdXRlcldpZHRoKCksdT10aGlzLmVsLm91dGVySGVpZ2h0KCksZD10KHdpbmRvdyksaD1jKHRoaXMuZWwpO3I9by50b3B8fDAscz12b2lkIDAhPT1vLmxlZnQ/by5sZWZ0OnZvaWQgMCE9PW8ucmlnaHQ/by5yaWdodC1hOjAsaC5pcyh3aW5kb3cpfHxoLmlzKGRvY3VtZW50KT8oaD1kLGU9MCxuPTApOihpPWgub2Zmc2V0KCksZT1pLnRvcCxuPWkubGVmdCksZSs9ZC5zY3JvbGxUb3AoKSxuKz1kLnNjcm9sbExlZnQoKSxvLnZpZXdwb3J0Q29uc3RyYWluIT09ITEmJihyPU1hdGgubWluKHIsZStoLm91dGVySGVpZ2h0KCktdS10aGlzLm1hcmdpbikscj1NYXRoLm1heChyLGUrdGhpcy5tYXJnaW4pLHM9TWF0aC5taW4ocyxuK2gub3V0ZXJXaWR0aCgpLWEtdGhpcy5tYXJnaW4pLHM9TWF0aC5tYXgocyxuK3RoaXMubWFyZ2luKSksdGhpcy5lbC5jc3Moe3RvcDpyLWwudG9wLGxlZnQ6cy1sLmxlZnR9KX0sdHJpZ2dlcjpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnNbdF0mJnRoaXMub3B0aW9uc1t0XS5hcHBseSh0aGlzLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSl9fSksY2U9anQuQ29vcmRDYWNoZT13dC5leHRlbmQoe2VsczpudWxsLGZvcmNlZE9mZnNldFBhcmVudEVsOm51bGwsb3JpZ2luOm51bGwsYm91bmRpbmdSZWN0Om51bGwsaXNIb3Jpem9udGFsOiExLGlzVmVydGljYWw6ITEsbGVmdHM6bnVsbCxyaWdodHM6bnVsbCx0b3BzOm51bGwsYm90dG9tczpudWxsLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3RoaXMuZWxzPXQoZS5lbHMpLHRoaXMuaXNIb3Jpem9udGFsPWUuaXNIb3Jpem9udGFsLHRoaXMuaXNWZXJ0aWNhbD1lLmlzVmVydGljYWwsdGhpcy5mb3JjZWRPZmZzZXRQYXJlbnRFbD1lLm9mZnNldFBhcmVudD90KGUub2Zmc2V0UGFyZW50KTpudWxsfSxidWlsZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZm9yY2VkT2Zmc2V0UGFyZW50RWx8fHRoaXMuZWxzLmVxKDApLm9mZnNldFBhcmVudCgpO3RoaXMub3JpZ2luPXQub2Zmc2V0KCksdGhpcy5ib3VuZGluZ1JlY3Q9dGhpcy5xdWVyeUJvdW5kaW5nUmVjdCgpLHRoaXMuaXNIb3Jpem9udGFsJiZ0aGlzLmJ1aWxkRWxIb3Jpem9udGFscygpLHRoaXMuaXNWZXJ0aWNhbCYmdGhpcy5idWlsZEVsVmVydGljYWxzKCl9LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5vcmlnaW49bnVsbCx0aGlzLmJvdW5kaW5nUmVjdD1udWxsLHRoaXMubGVmdHM9bnVsbCx0aGlzLnJpZ2h0cz1udWxsLHRoaXMudG9wcz1udWxsLHRoaXMuYm90dG9tcz1udWxsfSxlbnN1cmVCdWlsdDpmdW5jdGlvbigpe3RoaXMub3JpZ2lufHx0aGlzLmJ1aWxkKCl9LGJ1aWxkRWxIb3Jpem9udGFsczpmdW5jdGlvbigpe3ZhciBlPVtdLG49W107dGhpcy5lbHMuZWFjaChmdW5jdGlvbihpLHIpe3ZhciBzPXQociksbz1zLm9mZnNldCgpLmxlZnQsbD1zLm91dGVyV2lkdGgoKTtlLnB1c2gobyksbi5wdXNoKG8rbCl9KSx0aGlzLmxlZnRzPWUsdGhpcy5yaWdodHM9bn0sYnVpbGRFbFZlcnRpY2FsczpmdW5jdGlvbigpe3ZhciBlPVtdLG49W107dGhpcy5lbHMuZWFjaChmdW5jdGlvbihpLHIpe3ZhciBzPXQociksbz1zLm9mZnNldCgpLnRvcCxsPXMub3V0ZXJIZWlnaHQoKTtlLnB1c2gobyksbi5wdXNoKG8rbCl9KSx0aGlzLnRvcHM9ZSx0aGlzLmJvdHRvbXM9bn0sZ2V0SG9yaXpvbnRhbEluZGV4OmZ1bmN0aW9uKHQpe3RoaXMuZW5zdXJlQnVpbHQoKTt2YXIgZSxuPXRoaXMubGVmdHMsaT10aGlzLnJpZ2h0cyxyPW4ubGVuZ3RoO2ZvcihlPTA7ZTxyO2UrKylpZih0Pj1uW2VdJiZ0PGlbZV0pcmV0dXJuIGV9LGdldFZlcnRpY2FsSW5kZXg6ZnVuY3Rpb24odCl7dGhpcy5lbnN1cmVCdWlsdCgpO3ZhciBlLG49dGhpcy50b3BzLGk9dGhpcy5ib3R0b21zLHI9bi5sZW5ndGg7Zm9yKGU9MDtlPHI7ZSsrKWlmKHQ+PW5bZV0mJnQ8aVtlXSlyZXR1cm4gZX0sZ2V0TGVmdE9mZnNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbnN1cmVCdWlsdCgpLHRoaXMubGVmdHNbdF19LGdldExlZnRQb3NpdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbnN1cmVCdWlsdCgpLHRoaXMubGVmdHNbdF0tdGhpcy5vcmlnaW4ubGVmdH0sZ2V0UmlnaHRPZmZzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZW5zdXJlQnVpbHQoKSx0aGlzLnJpZ2h0c1t0XX0sZ2V0UmlnaHRQb3NpdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbnN1cmVCdWlsdCgpLHRoaXMucmlnaHRzW3RdLXRoaXMub3JpZ2luLmxlZnR9LGdldFdpZHRoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVuc3VyZUJ1aWx0KCksdGhpcy5yaWdodHNbdF0tdGhpcy5sZWZ0c1t0XX0sZ2V0VG9wT2Zmc2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVuc3VyZUJ1aWx0KCksdGhpcy50b3BzW3RdfSxnZXRUb3BQb3NpdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbnN1cmVCdWlsdCgpLHRoaXMudG9wc1t0XS10aGlzLm9yaWdpbi50b3B9LGdldEJvdHRvbU9mZnNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbnN1cmVCdWlsdCgpLHRoaXMuYm90dG9tc1t0XX0sZ2V0Qm90dG9tUG9zaXRpb246ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZW5zdXJlQnVpbHQoKSx0aGlzLmJvdHRvbXNbdF0tdGhpcy5vcmlnaW4udG9wfSxnZXRIZWlnaHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZW5zdXJlQnVpbHQoKSx0aGlzLmJvdHRvbXNbdF0tdGhpcy50b3BzW3RdfSxxdWVyeUJvdW5kaW5nUmVjdDpmdW5jdGlvbigpe3ZhciB0PWModGhpcy5lbHMuZXEoMCkpO2lmKCF0LmlzKGRvY3VtZW50KSlyZXR1cm4gZih0KX0saXNQb2ludEluQm91bmRzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuaXNMZWZ0SW5Cb3VuZHModCkmJnRoaXMuaXNUb3BJbkJvdW5kcyhlKX0saXNMZWZ0SW5Cb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIXRoaXMuYm91bmRpbmdSZWN0fHx0Pj10aGlzLmJvdW5kaW5nUmVjdC5sZWZ0JiZ0PHRoaXMuYm91bmRpbmdSZWN0LnJpZ2h0fSxpc1RvcEluQm91bmRzOmZ1bmN0aW9uKHQpe3JldHVybiF0aGlzLmJvdW5kaW5nUmVjdHx8dD49dGhpcy5ib3VuZGluZ1JlY3QudG9wJiZ0PHRoaXMuYm91bmRpbmdSZWN0LmJvdHRvbX19KSxoZT1qdC5EcmFnTGlzdGVuZXI9d3QuZXh0ZW5kKGFlLHVlLHtvcHRpb25zOm51bGwsc3ViamVjdEVsOm51bGwsb3JpZ2luWDpudWxsLG9yaWdpblk6bnVsbCxzY3JvbGxFbDpudWxsLGlzSW50ZXJhY3Rpbmc6ITEsaXNEaXN0YW5jZVN1cnBhc3NlZDohMSxpc0RlbGF5RW5kZWQ6ITEsaXNEcmFnZ2luZzohMSxpc1RvdWNoOiExLGRlbGF5Om51bGwsZGVsYXlUaW1lb3V0SWQ6bnVsbCxtaW5EaXN0YW5jZTpudWxsLGhhbmRsZVRvdWNoU2Nyb2xsUHJveHk6bnVsbCxjb25zdHJ1Y3RvcjpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dHx8e30sdGhpcy5oYW5kbGVUb3VjaFNjcm9sbFByb3h5PWx0KHRoaXMsImhhbmRsZVRvdWNoU2Nyb2xsIiksdGhpcy5pbml0TW91c2VJZ25vcmluZyg1MDApfSxzdGFydEludGVyYWN0aW9uOmZ1bmN0aW9uKGUsbil7dmFyIGk9RChlKTtpZigibW91c2Vkb3duIj09PWUudHlwZSl7aWYodGhpcy5pc0lnbm9yaW5nTW91c2UpcmV0dXJuO2lmKCFTKGUpKXJldHVybjtlLnByZXZlbnREZWZhdWx0KCl9dGhpcy5pc0ludGVyYWN0aW5nfHwobj1ufHx7fSx0aGlzLmRlbGF5PUoobi5kZWxheSx0aGlzLm9wdGlvbnMuZGVsYXksMCksdGhpcy5taW5EaXN0YW5jZT1KKG4uZGlzdGFuY2UsdGhpcy5vcHRpb25zLmRpc3RhbmNlLDApLHRoaXMuc3ViamVjdEVsPXRoaXMub3B0aW9ucy5zdWJqZWN0RWwsdGhpcy5pc0ludGVyYWN0aW5nPSEwLHRoaXMuaXNUb3VjaD1pLHRoaXMuaXNEZWxheUVuZGVkPSExLHRoaXMuaXNEaXN0YW5jZVN1cnBhc3NlZD0hMSx0aGlzLm9yaWdpblg9dyhlKSx0aGlzLm9yaWdpblk9RShlKSx0aGlzLnNjcm9sbEVsPWModChlLnRhcmdldCkpLHRoaXMuYmluZEhhbmRsZXJzKCksdGhpcy5pbml0QXV0b1Njcm9sbCgpLHRoaXMuaGFuZGxlSW50ZXJhY3Rpb25TdGFydChlKSx0aGlzLnN0YXJ0RGVsYXkoZSksdGhpcy5taW5EaXN0YW5jZXx8dGhpcy5oYW5kbGVEaXN0YW5jZVN1cnBhc3NlZChlKSl9LGhhbmRsZUludGVyYWN0aW9uU3RhcnQ6ZnVuY3Rpb24odCl7dGhpcy50cmlnZ2VyKCJpbnRlcmFjdGlvblN0YXJ0Iix0KX0sZW5kSW50ZXJhY3Rpb246ZnVuY3Rpb24odCxlKXt0aGlzLmlzSW50ZXJhY3RpbmcmJih0aGlzLmVuZERyYWcodCksdGhpcy5kZWxheVRpbWVvdXRJZCYmKGNsZWFyVGltZW91dCh0aGlzLmRlbGF5VGltZW91dElkKSx0aGlzLmRlbGF5VGltZW91dElkPW51bGwpLHRoaXMuZGVzdHJveUF1dG9TY3JvbGwoKSx0aGlzLnVuYmluZEhhbmRsZXJzKCksdGhpcy5pc0ludGVyYWN0aW5nPSExLHRoaXMuaGFuZGxlSW50ZXJhY3Rpb25FbmQodCxlKSx0aGlzLmlzVG91Y2gmJnRoaXMudGVtcElnbm9yZU1vdXNlKCkpfSxoYW5kbGVJbnRlcmFjdGlvbkVuZDpmdW5jdGlvbih0LGUpe3RoaXMudHJpZ2dlcigiaW50ZXJhY3Rpb25FbmQiLHQsZXx8ITEpfSxiaW5kSGFuZGxlcnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49MTt0aGlzLmlzVG91Y2g/KHRoaXMubGlzdGVuVG8odChkb2N1bWVudCkse3RvdWNobW92ZTp0aGlzLmhhbmRsZVRvdWNoTW92ZSx0b3VjaGVuZDp0aGlzLmVuZEludGVyYWN0aW9uLHRvdWNoY2FuY2VsOnRoaXMuZW5kSW50ZXJhY3Rpb24sdG91Y2hzdGFydDpmdW5jdGlvbih0KXtuP24tLTplLmVuZEludGVyYWN0aW9uKHQsITApfX0pLCFIKHRoaXMuaGFuZGxlVG91Y2hTY3JvbGxQcm94eSkmJnRoaXMuc2Nyb2xsRWwmJnRoaXMubGlzdGVuVG8odGhpcy5zY3JvbGxFbCwic2Nyb2xsIix0aGlzLmhhbmRsZVRvdWNoU2Nyb2xsKSk6dGhpcy5saXN0ZW5Ubyh0KGRvY3VtZW50KSx7bW91c2Vtb3ZlOnRoaXMuaGFuZGxlTW91c2VNb3ZlLG1vdXNldXA6dGhpcy5lbmRJbnRlcmFjdGlvbn0pLHRoaXMubGlzdGVuVG8odChkb2N1bWVudCkse3NlbGVjdHN0YXJ0OkMsY29udGV4dG1lbnU6Q30pfSx1bmJpbmRIYW5kbGVyczpmdW5jdGlvbigpe3RoaXMuc3RvcExpc3RlbmluZ1RvKHQoZG9jdW1lbnQpKSxUKHRoaXMuaGFuZGxlVG91Y2hTY3JvbGxQcm94eSksdGhpcy5zY3JvbGxFbCYmdGhpcy5zdG9wTGlzdGVuaW5nVG8odGhpcy5zY3JvbGxFbCwic2Nyb2xsIil9LHN0YXJ0RHJhZzpmdW5jdGlvbih0LGUpe3RoaXMuc3RhcnRJbnRlcmFjdGlvbih0LGUpLHRoaXMuaXNEcmFnZ2luZ3x8KHRoaXMuaXNEcmFnZ2luZz0hMCx0aGlzLmhhbmRsZURyYWdTdGFydCh0KSl9LGhhbmRsZURyYWdTdGFydDpmdW5jdGlvbih0KXt0aGlzLnRyaWdnZXIoImRyYWdTdGFydCIsdCl9LGhhbmRsZU1vdmU6ZnVuY3Rpb24odCl7dmFyIGUsbj13KHQpLXRoaXMub3JpZ2luWCxpPUUodCktdGhpcy5vcmlnaW5ZLHI9dGhpcy5taW5EaXN0YW5jZTt0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWR8fChlPW4qbitpKmksZT49cipyJiZ0aGlzLmhhbmRsZURpc3RhbmNlU3VycGFzc2VkKHQpKSx0aGlzLmlzRHJhZ2dpbmcmJnRoaXMuaGFuZGxlRHJhZyhuLGksdCl9LGhhbmRsZURyYWc6ZnVuY3Rpb24odCxlLG4pe3RoaXMudHJpZ2dlcigiZHJhZyIsdCxlLG4pLHRoaXMudXBkYXRlQXV0b1Njcm9sbChuKX0sZW5kRHJhZzpmdW5jdGlvbih0KXt0aGlzLmlzRHJhZ2dpbmcmJih0aGlzLmlzRHJhZ2dpbmc9ITEsdGhpcy5oYW5kbGVEcmFnRW5kKHQpKX0saGFuZGxlRHJhZ0VuZDpmdW5jdGlvbih0KXt0aGlzLnRyaWdnZXIoImRyYWdFbmQiLHQpfSxzdGFydERlbGF5OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5kZWxheT90aGlzLmRlbGF5VGltZW91dElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmhhbmRsZURlbGF5RW5kKHQpfSx0aGlzLmRlbGF5KTp0aGlzLmhhbmRsZURlbGF5RW5kKHQpfSxoYW5kbGVEZWxheUVuZDpmdW5jdGlvbih0KXt0aGlzLmlzRGVsYXlFbmRlZD0hMCx0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQmJnRoaXMuc3RhcnREcmFnKHQpfSxoYW5kbGVEaXN0YW5jZVN1cnBhc3NlZDpmdW5jdGlvbih0KXt0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQ9ITAsdGhpcy5pc0RlbGF5RW5kZWQmJnRoaXMuc3RhcnREcmFnKHQpfSxoYW5kbGVUb3VjaE1vdmU6ZnVuY3Rpb24odCl7dGhpcy5pc0RyYWdnaW5nJiZ0LnByZXZlbnREZWZhdWx0KCksdGhpcy5oYW5kbGVNb3ZlKHQpfSxoYW5kbGVNb3VzZU1vdmU6ZnVuY3Rpb24odCl7dGhpcy5oYW5kbGVNb3ZlKHQpfSxoYW5kbGVUb3VjaFNjcm9sbDpmdW5jdGlvbih0KXt0aGlzLmlzRHJhZ2dpbmd8fHRoaXMuZW5kSW50ZXJhY3Rpb24odCwhMCl9LHRyaWdnZXI6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zW3RdJiZ0aGlzLm9wdGlvbnNbdF0uYXBwbHkodGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpLHRoaXNbIl8iK3RdJiZ0aGlzWyJfIit0XS5hcHBseSh0aGlzLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSl9fSk7aGUubWl4aW4oe2lzQXV0b1Njcm9sbDohMSxzY3JvbGxCb3VuZHM6bnVsbCxzY3JvbGxUb3BWZWw6bnVsbCxzY3JvbGxMZWZ0VmVsOm51bGwsc2Nyb2xsSW50ZXJ2YWxJZDpudWxsLHNjcm9sbFNlbnNpdGl2aXR5OjMwLHNjcm9sbFNwZWVkOjIwMCxzY3JvbGxJbnRlcnZhbE1zOjUwLGluaXRBdXRvU2Nyb2xsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zY3JvbGxFbDt0aGlzLmlzQXV0b1Njcm9sbD10aGlzLm9wdGlvbnMuc2Nyb2xsJiZ0JiYhdC5pcyh3aW5kb3cpJiYhdC5pcyhkb2N1bWVudCksdGhpcy5pc0F1dG9TY3JvbGwmJnRoaXMubGlzdGVuVG8odCwic2Nyb2xsIixhdCh0aGlzLmhhbmRsZURlYm91bmNlZFNjcm9sbCwxMDApKX0sZGVzdHJveUF1dG9TY3JvbGw6ZnVuY3Rpb24oKXt0aGlzLmVuZEF1dG9TY3JvbGwoKSx0aGlzLmlzQXV0b1Njcm9sbCYmdGhpcy5zdG9wTGlzdGVuaW5nVG8odGhpcy5zY3JvbGxFbCwic2Nyb2xsIil9LGNvbXB1dGVTY3JvbGxCb3VuZHM6ZnVuY3Rpb24oKXt0aGlzLmlzQXV0b1Njcm9sbCYmKHRoaXMuc2Nyb2xsQm91bmRzPWgodGhpcy5zY3JvbGxFbCkpfSx1cGRhdGVBdXRvU2Nyb2xsOmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyLHM9dGhpcy5zY3JvbGxTZW5zaXRpdml0eSxvPXRoaXMuc2Nyb2xsQm91bmRzLGw9MCxhPTA7byYmKGU9KHMtKEUodCktby50b3ApKS9zLG49KHMtKG8uYm90dG9tLUUodCkpKS9zLGk9KHMtKHcodCktby5sZWZ0KSkvcyxyPShzLShvLnJpZ2h0LXcodCkpKS9zLGU+PTAmJmU8PTE/bD1lKnRoaXMuc2Nyb2xsU3BlZWQqLTE6bj49MCYmbjw9MSYmKGw9bip0aGlzLnNjcm9sbFNwZWVkKSxpPj0wJiZpPD0xP2E9aSp0aGlzLnNjcm9sbFNwZWVkKi0xOnI+PTAmJnI8PTEmJihhPXIqdGhpcy5zY3JvbGxTcGVlZCkpLHRoaXMuc2V0U2Nyb2xsVmVsKGwsYSl9LHNldFNjcm9sbFZlbDpmdW5jdGlvbih0LGUpe3RoaXMuc2Nyb2xsVG9wVmVsPXQsdGhpcy5zY3JvbGxMZWZ0VmVsPWUsdGhpcy5jb25zdHJhaW5TY3JvbGxWZWwoKSwhdGhpcy5zY3JvbGxUb3BWZWwmJiF0aGlzLnNjcm9sbExlZnRWZWx8fHRoaXMuc2Nyb2xsSW50ZXJ2YWxJZHx8KHRoaXMuc2Nyb2xsSW50ZXJ2YWxJZD1zZXRJbnRlcnZhbChsdCh0aGlzLCJzY3JvbGxJbnRlcnZhbEZ1bmMiKSx0aGlzLnNjcm9sbEludGVydmFsTXMpKX0sY29uc3RyYWluU2Nyb2xsVmVsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zY3JvbGxFbDt0aGlzLnNjcm9sbFRvcFZlbDwwP3Quc2Nyb2xsVG9wKCk8PTAmJih0aGlzLnNjcm9sbFRvcFZlbD0wKTp0aGlzLnNjcm9sbFRvcFZlbD4wJiZ0LnNjcm9sbFRvcCgpK3RbMF0uY2xpZW50SGVpZ2h0Pj10WzBdLnNjcm9sbEhlaWdodCYmKHRoaXMuc2Nyb2xsVG9wVmVsPTApLHRoaXMuc2Nyb2xsTGVmdFZlbDwwP3Quc2Nyb2xsTGVmdCgpPD0wJiYodGhpcy5zY3JvbGxMZWZ0VmVsPTApOnRoaXMuc2Nyb2xsTGVmdFZlbD4wJiZ0LnNjcm9sbExlZnQoKSt0WzBdLmNsaWVudFdpZHRoPj10WzBdLnNjcm9sbFdpZHRoJiYodGhpcy5zY3JvbGxMZWZ0VmVsPTApfSxzY3JvbGxJbnRlcnZhbEZ1bmM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnNjcm9sbEVsLGU9dGhpcy5zY3JvbGxJbnRlcnZhbE1zLzFlMzt0aGlzLnNjcm9sbFRvcFZlbCYmdC5zY3JvbGxUb3AodC5zY3JvbGxUb3AoKSt0aGlzLnNjcm9sbFRvcFZlbCplKSx0aGlzLnNjcm9sbExlZnRWZWwmJnQuc2Nyb2xsTGVmdCh0LnNjcm9sbExlZnQoKSt0aGlzLnNjcm9sbExlZnRWZWwqZSksdGhpcy5jb25zdHJhaW5TY3JvbGxWZWwoKSx0aGlzLnNjcm9sbFRvcFZlbHx8dGhpcy5zY3JvbGxMZWZ0VmVsfHx0aGlzLmVuZEF1dG9TY3JvbGwoKX0sZW5kQXV0b1Njcm9sbDpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsSW50ZXJ2YWxJZCYmKGNsZWFySW50ZXJ2YWwodGhpcy5zY3JvbGxJbnRlcnZhbElkKSx0aGlzLnNjcm9sbEludGVydmFsSWQ9bnVsbCx0aGlzLmhhbmRsZVNjcm9sbEVuZCgpKX0saGFuZGxlRGVib3VuY2VkU2Nyb2xsOmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxJbnRlcnZhbElkfHx0aGlzLmhhbmRsZVNjcm9sbEVuZCgpfSxoYW5kbGVTY3JvbGxFbmQ6ZnVuY3Rpb24oKXt9fSk7dmFyIGZlPWhlLmV4dGVuZCh7Y29tcG9uZW50Om51bGwsb3JpZ0hpdDpudWxsLGhpdDpudWxsLGNvb3JkQWRqdXN0Om51bGwsY29uc3RydWN0b3I6ZnVuY3Rpb24odCxlKXtoZS5jYWxsKHRoaXMsZSksdGhpcy5jb21wb25lbnQ9dH0saGFuZGxlSW50ZXJhY3Rpb25TdGFydDpmdW5jdGlvbih0KXt2YXIgZSxuLGkscj10aGlzLnN1YmplY3RFbDt0aGlzLmNvbXB1dGVDb29yZHMoKSx0PyhuPXtsZWZ0OncodCksdG9wOkUodCl9LGk9bixyJiYoZT1oKHIpLGk9UihpLGUpKSx0aGlzLm9yaWdIaXQ9dGhpcy5xdWVyeUhpdChpLmxlZnQsaS50b3ApLHImJnRoaXMub3B0aW9ucy5zdWJqZWN0Q2VudGVyJiYodGhpcy5vcmlnSGl0JiYoZT14KHRoaXMub3JpZ0hpdCxlKXx8ZSksaT1JKGUpKSx0aGlzLmNvb3JkQWRqdXN0PWsoaSxuKSk6KHRoaXMub3JpZ0hpdD1udWxsLHRoaXMuY29vcmRBZGp1c3Q9bnVsbCksaGUucHJvdG90eXBlLmhhbmRsZUludGVyYWN0aW9uU3RhcnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxjb21wdXRlQ29vcmRzOmZ1bmN0aW9uKCl7dGhpcy5jb21wb25lbnQucHJlcGFyZUhpdHMoKSx0aGlzLmNvbXB1dGVTY3JvbGxCb3VuZHMoKX0saGFuZGxlRHJhZ1N0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBlO2hlLnByb3RvdHlwZS5oYW5kbGVEcmFnU3RhcnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dGhpcy5xdWVyeUhpdCh3KHQpLEUodCkpLGUmJnRoaXMuaGFuZGxlSGl0T3ZlcihlKX0saGFuZGxlRHJhZzpmdW5jdGlvbih0LGUsbil7dmFyIGk7aGUucHJvdG90eXBlLmhhbmRsZURyYWcuYXBwbHkodGhpcyxhcmd1bWVudHMpLGk9dGhpcy5xdWVyeUhpdCh3KG4pLEUobikpLGJ0KGksdGhpcy5oaXQpfHwodGhpcy5oaXQmJnRoaXMuaGFuZGxlSGl0T3V0KCksaSYmdGhpcy5oYW5kbGVIaXRPdmVyKGkpKX0saGFuZGxlRHJhZ0VuZDpmdW5jdGlvbigpe3RoaXMuaGFuZGxlSGl0RG9uZSgpLGhlLnByb3RvdHlwZS5oYW5kbGVEcmFnRW5kLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0saGFuZGxlSGl0T3ZlcjpmdW5jdGlvbih0KXt2YXIgZT1idCh0LHRoaXMub3JpZ0hpdCk7dGhpcy5oaXQ9dCx0aGlzLnRyaWdnZXIoImhpdE92ZXIiLHRoaXMuaGl0LGUsdGhpcy5vcmlnSGl0KX0saGFuZGxlSGl0T3V0OmZ1bmN0aW9uKCl7dGhpcy5oaXQmJih0aGlzLnRyaWdnZXIoImhpdE91dCIsdGhpcy5oaXQpLHRoaXMuaGFuZGxlSGl0RG9uZSgpLHRoaXMuaGl0PW51bGwpfSxoYW5kbGVIaXREb25lOmZ1bmN0aW9uKCl7dGhpcy5oaXQmJnRoaXMudHJpZ2dlcigiaGl0RG9uZSIsdGhpcy5oaXQpfSxoYW5kbGVJbnRlcmFjdGlvbkVuZDpmdW5jdGlvbigpe2hlLnByb3RvdHlwZS5oYW5kbGVJbnRlcmFjdGlvbkVuZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5vcmlnSGl0PW51bGwsdGhpcy5oaXQ9bnVsbCx0aGlzLmNvbXBvbmVudC5yZWxlYXNlSGl0cygpfSxoYW5kbGVTY3JvbGxFbmQ6ZnVuY3Rpb24oKXtoZS5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsRW5kLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmNvbXB1dGVDb29yZHMoKX0scXVlcnlIaXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jb29yZEFkanVzdCYmKHQrPXRoaXMuY29vcmRBZGp1c3QubGVmdCxlKz10aGlzLmNvb3JkQWRqdXN0LnRvcCksdGhpcy5jb21wb25lbnQucXVlcnlIaXQodCxlKX19KSxnZT13dC5leHRlbmQoYWUse29wdGlvbnM6bnVsbCxzb3VyY2VFbDpudWxsLGVsOm51bGwscGFyZW50RWw6bnVsbCx0b3AwOm51bGwsbGVmdDA6bnVsbCx5MDpudWxsLHgwOm51bGwsdG9wRGVsdGE6bnVsbCxsZWZ0RGVsdGE6bnVsbCxpc0ZvbGxvd2luZzohMSxpc0hpZGRlbjohMSxpc0FuaW1hdGluZzohMSxjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLG4pe3RoaXMub3B0aW9ucz1uPW58fHt9LHRoaXMuc291cmNlRWw9ZSx0aGlzLnBhcmVudEVsPW4ucGFyZW50RWw/dChuLnBhcmVudEVsKTplLnBhcmVudCgpfSxzdGFydDpmdW5jdGlvbihlKXt0aGlzLmlzRm9sbG93aW5nfHwodGhpcy5pc0ZvbGxvd2luZz0hMCx0aGlzLnkwPUUoZSksdGhpcy54MD13KGUpLHRoaXMudG9wRGVsdGE9MCx0aGlzLmxlZnREZWx0YT0wLHRoaXMuaXNIaWRkZW58fHRoaXMudXBkYXRlUG9zaXRpb24oKSxEKGUpP3RoaXMubGlzdGVuVG8odChkb2N1bWVudCksInRvdWNobW92ZSIsdGhpcy5oYW5kbGVNb3ZlKTp0aGlzLmxpc3RlblRvKHQoZG9jdW1lbnQpLCJtb3VzZW1vdmUiLHRoaXMuaGFuZGxlTW92ZSkpfSxzdG9wOmZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gaSgpe3IuaXNBbmltYXRpbmc9ITEsci5yZW1vdmVFbGVtZW50KCksci50b3AwPXIubGVmdDA9bnVsbCxuJiZuKCl9dmFyIHI9dGhpcyxzPXRoaXMub3B0aW9ucy5yZXZlcnREdXJhdGlvbjt0aGlzLmlzRm9sbG93aW5nJiYhdGhpcy5pc0FuaW1hdGluZyYmKHRoaXMuaXNGb2xsb3dpbmc9ITEsdGhpcy5zdG9wTGlzdGVuaW5nVG8odChkb2N1bWVudCkpLGUmJnMmJiF0aGlzLmlzSGlkZGVuPyh0aGlzLmlzQW5pbWF0aW5nPSEwLHRoaXMuZWwuYW5pbWF0ZSh7dG9wOnRoaXMudG9wMCxsZWZ0OnRoaXMubGVmdDB9LHtkdXJhdGlvbjpzLGNvbXBsZXRlOml9KSk6aSgpKX0sZ2V0RWw6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsO3JldHVybiB0fHwodD10aGlzLmVsPXRoaXMuc291cmNlRWwuY2xvbmUoKS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuYWRkaXRpb25hbENsYXNzfHwiIikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6IiIsZGlzcGxheTp0aGlzLmlzSGlkZGVuPyJub25lIjoiIixtYXJnaW46MCxyaWdodDoiYXV0byIsYm90dG9tOiJhdXRvIix3aWR0aDp0aGlzLnNvdXJjZUVsLndpZHRoKCksaGVpZ2h0OnRoaXMuc291cmNlRWwuaGVpZ2h0KCksb3BhY2l0eTp0aGlzLm9wdGlvbnMub3BhY2l0eXx8IiIsekluZGV4OnRoaXMub3B0aW9ucy56SW5kZXh9KSx0LmFkZENsYXNzKCJmYy11bnNlbGVjdGFibGUiKSx0LmFwcGVuZFRvKHRoaXMucGFyZW50RWwpKSx0fSxyZW1vdmVFbGVtZW50OmZ1bmN0aW9uKCl7dGhpcy5lbCYmKHRoaXMuZWwucmVtb3ZlKCksdGhpcy5lbD1udWxsKX0sdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgdCxlO3RoaXMuZ2V0RWwoKSxudWxsPT09dGhpcy50b3AwJiYodD10aGlzLnNvdXJjZUVsLm9mZnNldCgpLGU9dGhpcy5lbC5vZmZzZXRQYXJlbnQoKS5vZmZzZXQoKSx0aGlzLnRvcDA9dC50b3AtZS50b3AsdGhpcy5sZWZ0MD10LmxlZnQtZS5sZWZ0KSx0aGlzLmVsLmNzcyh7dG9wOnRoaXMudG9wMCt0aGlzLnRvcERlbHRhLGxlZnQ6dGhpcy5sZWZ0MCt0aGlzLmxlZnREZWx0YX0pfSxoYW5kbGVNb3ZlOmZ1bmN0aW9uKHQpe3RoaXMudG9wRGVsdGE9RSh0KS10aGlzLnkwLHRoaXMubGVmdERlbHRhPXcodCktdGhpcy54MCx0aGlzLmlzSGlkZGVufHx0aGlzLnVwZGF0ZVBvc2l0aW9uKCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLmlzSGlkZGVufHwodGhpcy5pc0hpZGRlbj0hMCx0aGlzLmVsJiZ0aGlzLmVsLmhpZGUoKSl9LHNob3c6ZnVuY3Rpb24oKXt0aGlzLmlzSGlkZGVuJiYodGhpcy5pc0hpZGRlbj0hMSx0aGlzLnVwZGF0ZVBvc2l0aW9uKCksdGhpcy5nZXRFbCgpLnNob3coKSl9fSkscGU9anQuR3JpZD13dC5leHRlbmQoYWUsdWUse2hhc0RheUludGVyYWN0aW9uczohMCx2aWV3Om51bGwsaXNSVEw6bnVsbCxzdGFydDpudWxsLGVuZDpudWxsLGVsOm51bGwsZWxzQnlGaWxsOm51bGwsZXZlbnRUaW1lRm9ybWF0Om51bGwsZGlzcGxheUV2ZW50VGltZTpudWxsLGRpc3BsYXlFdmVudEVuZDpudWxsLG1pblJlc2l6ZUR1cmF0aW9uOm51bGwsbGFyZ2VVbml0Om51bGwsZGF5RHJhZ0xpc3RlbmVyOm51bGwsc2VnRHJhZ0xpc3RlbmVyOm51bGwsc2VnUmVzaXplTGlzdGVuZXI6bnVsbCxleHRlcm5hbERyYWdMaXN0ZW5lcjpudWxsLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKHQpe3RoaXMudmlldz10LHRoaXMuaXNSVEw9dC5vcHQoImlzUlRMIiksdGhpcy5lbHNCeUZpbGw9e30sdGhpcy5kYXlEcmFnTGlzdGVuZXI9dGhpcy5idWlsZERheURyYWdMaXN0ZW5lcigpLHRoaXMuaW5pdE1vdXNlSWdub3JpbmcoKX0sY29tcHV0ZUV2ZW50VGltZUZvcm1hdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXcub3B0KCJzbWFsbFRpbWVGb3JtYXQiKX0sY29tcHV0ZURpc3BsYXlFdmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sY29tcHV0ZURpc3BsYXlFdmVudEVuZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZXRSYW5nZTpmdW5jdGlvbih0KXt0aGlzLnN0YXJ0PXQuc3RhcnQuY2xvbmUoKSx0aGlzLmVuZD10LmVuZC5jbG9uZSgpLHRoaXMucmFuZ2VVcGRhdGVkKCksdGhpcy5wcm9jZXNzUmFuZ2VPcHRpb25zKCl9LHJhbmdlVXBkYXRlZDpmdW5jdGlvbigpe30scHJvY2Vzc1JhbmdlT3B0aW9uczpmdW5jdGlvbigpe3ZhciB0LGUsbj10aGlzLnZpZXc7dGhpcy5ldmVudFRpbWVGb3JtYXQ9bi5vcHQoImV2ZW50VGltZUZvcm1hdCIpfHxuLm9wdCgidGltZUZvcm1hdCIpfHx0aGlzLmNvbXB1dGVFdmVudFRpbWVGb3JtYXQoKSx0PW4ub3B0KCJkaXNwbGF5RXZlbnRUaW1lIiksbnVsbD09dCYmKHQ9dGhpcy5jb21wdXRlRGlzcGxheUV2ZW50VGltZSgpKSxlPW4ub3B0KCJkaXNwbGF5RXZlbnRFbmQiKSxudWxsPT1lJiYoZT10aGlzLmNvbXB1dGVEaXNwbGF5RXZlbnRFbmQoKSksdGhpcy5kaXNwbGF5RXZlbnRUaW1lPXQsdGhpcy5kaXNwbGF5RXZlbnRFbmQ9ZX0sc3BhblRvU2VnczpmdW5jdGlvbih0KXt9LGRpZmZEYXRlczpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmxhcmdlVW5pdD9BKHQsZSx0aGlzLmxhcmdlVW5pdCk6Tih0LGUpfSxwcmVwYXJlSGl0czpmdW5jdGlvbigpe30scmVsZWFzZUhpdHM6ZnVuY3Rpb24oKXt9LHF1ZXJ5SGl0OmZ1bmN0aW9uKHQsZSl7fSxnZXRIaXRTcGFuOmZ1bmN0aW9uKHQpe30sZ2V0SGl0RWw6ZnVuY3Rpb24odCl7fSxzZXRFbGVtZW50OmZ1bmN0aW9uKHQpe3RoaXMuZWw9dCx0aGlzLmhhc0RheUludGVyYWN0aW9ucyYmKGIodCksdGhpcy5iaW5kRGF5SGFuZGxlcigidG91Y2hzdGFydCIsdGhpcy5kYXlUb3VjaFN0YXJ0KSx0aGlzLmJpbmREYXlIYW5kbGVyKCJtb3VzZWRvd24iLHRoaXMuZGF5TW91c2Vkb3duKSksdGhpcy5iaW5kU2VnSGFuZGxlcnMoKSx0aGlzLmJpbmRHbG9iYWxIYW5kbGVycygpfSxiaW5kRGF5SGFuZGxlcjpmdW5jdGlvbihlLG4pe3ZhciBpPXRoaXM7dGhpcy5lbC5vbihlLGZ1bmN0aW9uKGUpe2lmKCF0KGUudGFyZ2V0KS5pcyhpLnNlZ1NlbGVjdG9yKyIsIitpLnNlZ1NlbGVjdG9yKyIgKiwuZmMtbW9yZSxhW2RhdGEtZ290b10iKSlyZXR1cm4gbi5jYWxsKGksZSl9KX0scmVtb3ZlRWxlbWVudDpmdW5jdGlvbigpe3RoaXMudW5iaW5kR2xvYmFsSGFuZGxlcnMoKSx0aGlzLmNsZWFyRHJhZ0xpc3RlbmVycygpLHRoaXMuZWwucmVtb3ZlKCl9LHJlbmRlclNrZWxldG9uOmZ1bmN0aW9uKCl7fSxyZW5kZXJEYXRlczpmdW5jdGlvbigpe30sdW5yZW5kZXJEYXRlczpmdW5jdGlvbigpe30sYmluZEdsb2JhbEhhbmRsZXJzOmZ1bmN0aW9uKCl7dGhpcy5saXN0ZW5Ubyh0KGRvY3VtZW50KSx7ZHJhZ3N0YXJ0OnRoaXMuZXh0ZXJuYWxEcmFnU3RhcnQsc29ydHN0YXJ0OnRoaXMuZXh0ZXJuYWxEcmFnU3RhcnR9KX0sdW5iaW5kR2xvYmFsSGFuZGxlcnM6ZnVuY3Rpb24oKXt0aGlzLnN0b3BMaXN0ZW5pbmdUbyh0KGRvY3VtZW50KSl9LGRheU1vdXNlZG93bjpmdW5jdGlvbih0KXt0aGlzLmlzSWdub3JpbmdNb3VzZXx8dGhpcy5kYXlEcmFnTGlzdGVuZXIuc3RhcnRJbnRlcmFjdGlvbih0LHt9KX0sZGF5VG91Y2hTdGFydDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnZpZXc7KGUuaXNTZWxlY3RlZHx8ZS5zZWxlY3RlZEV2ZW50KSYmdGhpcy50ZW1wSWdub3JlTW91c2UoKSx0aGlzLmRheURyYWdMaXN0ZW5lci5zdGFydEludGVyYWN0aW9uKHQse2RlbGF5OnRoaXMudmlldy5vcHQoImxvbmdQcmVzc0RlbGF5Iil9KX0sYnVpbGREYXlEcmFnTGlzdGVuZXI6ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcyxpPXRoaXMudmlldyxyPWkub3B0KCJzZWxlY3RhYmxlIiksbD1uZXcgZmUodGhpcyx7c2Nyb2xsOmkub3B0KCJkcmFnU2Nyb2xsIiksaW50ZXJhY3Rpb25TdGFydDpmdW5jdGlvbigpe3Q9bC5vcmlnSGl0LGU9bnVsbH0sZHJhZ1N0YXJ0OmZ1bmN0aW9uKCl7aS51bnNlbGVjdCgpfSxoaXRPdmVyOmZ1bmN0aW9uKGksbyxsKXtsJiYob3x8KHQ9bnVsbCksciYmKGU9bi5jb21wdXRlU2VsZWN0aW9uKG4uZ2V0SGl0U3BhbihsKSxuLmdldEhpdFNwYW4oaSkpLGU/bi5yZW5kZXJTZWxlY3Rpb24oZSk6ZT09PSExJiZzKCkpKX0saGl0T3V0OmZ1bmN0aW9uKCl7dD1udWxsLGU9bnVsbCxuLnVucmVuZGVyU2VsZWN0aW9uKCl9LGhpdERvbmU6ZnVuY3Rpb24oKXtvKCl9LGludGVyYWN0aW9uRW5kOmZ1bmN0aW9uKHIscyl7c3x8KHQmJiFuLmlzSWdub3JpbmdNb3VzZSYmaS50cmlnZ2VyRGF5Q2xpY2sobi5nZXRIaXRTcGFuKHQpLG4uZ2V0SGl0RWwodCksciksZSYmaS5yZXBvcnRTZWxlY3Rpb24oZSxyKSl9fSk7cmV0dXJuIGx9LGNsZWFyRHJhZ0xpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuZGF5RHJhZ0xpc3RlbmVyLmVuZEludGVyYWN0aW9uKCksdGhpcy5zZWdEcmFnTGlzdGVuZXImJnRoaXMuc2VnRHJhZ0xpc3RlbmVyLmVuZEludGVyYWN0aW9uKCksdGhpcy5zZWdSZXNpemVMaXN0ZW5lciYmdGhpcy5zZWdSZXNpemVMaXN0ZW5lci5lbmRJbnRlcmFjdGlvbigpLHRoaXMuZXh0ZXJuYWxEcmFnTGlzdGVuZXImJnRoaXMuZXh0ZXJuYWxEcmFnTGlzdGVuZXIuZW5kSW50ZXJhY3Rpb24oKX0scmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcjpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZmFicmljYXRlSGVscGVyRXZlbnQodCxlKTtyZXR1cm4gdGhpcy5yZW5kZXJIZWxwZXIobixlKX0sZmFicmljYXRlSGVscGVyRXZlbnQ6ZnVuY3Rpb24odCxlKXt2YXIgbj1lP1ooZS5ldmVudCk6e307cmV0dXJuIG4uc3RhcnQ9dC5zdGFydC5jbG9uZSgpLG4uZW5kPXQuZW5kP3QuZW5kLmNsb25lKCk6bnVsbCxuLmFsbERheT1udWxsLHRoaXMudmlldy5jYWxlbmRhci5ub3JtYWxpemVFdmVudERhdGVzKG4pLG4uY2xhc3NOYW1lPShuLmNsYXNzTmFtZXx8W10pLmNvbmNhdCgiZmMtaGVscGVyIiksZXx8KG4uZWRpdGFibGU9ITEpLG59LHJlbmRlckhlbHBlcjpmdW5jdGlvbih0LGUpe30sdW5yZW5kZXJIZWxwZXI6ZnVuY3Rpb24oKXt9LHJlbmRlclNlbGVjdGlvbjpmdW5jdGlvbih0KXt0aGlzLnJlbmRlckhpZ2hsaWdodCh0KX0sdW5yZW5kZXJTZWxlY3Rpb246ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVySGlnaGxpZ2h0KCl9LGNvbXB1dGVTZWxlY3Rpb246ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNvbXB1dGVTZWxlY3Rpb25TcGFuKHQsZSk7cmV0dXJuIShuJiYhdGhpcy52aWV3LmNhbGVuZGFyLmlzU2VsZWN0aW9uU3BhbkFsbG93ZWQobikpJiZufSxjb21wdXRlU2VsZWN0aW9uU3BhbjpmdW5jdGlvbih0LGUpe3ZhciBuPVt0LnN0YXJ0LHQuZW5kLGUuc3RhcnQsZS5lbmRdO3JldHVybiBuLnNvcnQoc3QpLHtzdGFydDpuWzBdLmNsb25lKCksZW5kOm5bM10uY2xvbmUoKX19LHJlbmRlckhpZ2hsaWdodDpmdW5jdGlvbih0KXt0aGlzLnJlbmRlckZpbGwoImhpZ2hsaWdodCIsdGhpcy5zcGFuVG9TZWdzKHQpKX0sdW5yZW5kZXJIaWdobGlnaHQ6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVyRmlsbCgiaGlnaGxpZ2h0Iil9LGhpZ2hsaWdodFNlZ0NsYXNzZXM6ZnVuY3Rpb24oKXtyZXR1cm5bImZjLWhpZ2hsaWdodCJdfSxyZW5kZXJCdXNpbmVzc0hvdXJzOmZ1bmN0aW9uKCl7fSx1bnJlbmRlckJ1c2luZXNzSG91cnM6ZnVuY3Rpb24oKXt9LGdldE5vd0luZGljYXRvclVuaXQ6ZnVuY3Rpb24oKXt9LHJlbmRlck5vd0luZGljYXRvcjpmdW5jdGlvbih0KXt9LHVucmVuZGVyTm93SW5kaWNhdG9yOmZ1bmN0aW9uKCl7fSxyZW5kZXJGaWxsOmZ1bmN0aW9uKHQsZSl7fSx1bnJlbmRlckZpbGw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5lbHNCeUZpbGxbdF07ZSYmKGUucmVtb3ZlKCksZGVsZXRlIHRoaXMuZWxzQnlGaWxsW3RdKX0scmVuZGVyRmlsbFNlZ0VsczpmdW5jdGlvbihlLG4pe3ZhciBpLHI9dGhpcyxzPXRoaXNbZSsiU2VnRWwiXSxvPSIiLGw9W107aWYobi5sZW5ndGgpe2ZvcihpPTA7aTxuLmxlbmd0aDtpKyspbys9dGhpcy5maWxsU2VnSHRtbChlLG5baV0pO3QobykuZWFjaChmdW5jdGlvbihlLGkpe3ZhciBvPW5bZV0sYT10KGkpO3MmJihhPXMuY2FsbChyLG8sYSkpLGEmJihhPXQoYSksYS5pcyhyLmZpbGxTZWdUYWcpJiYoby5lbD1hLGwucHVzaChvKSkpfSl9cmV0dXJuIGx9LGZpbGxTZWdUYWc6ImRpdiIsZmlsbFNlZ0h0bWw6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzW3QrIlNlZ0NsYXNzZXMiXSxpPXRoaXNbdCsiU2VnQ3NzIl0scj1uP24uY2FsbCh0aGlzLGUpOltdLHM9bnQoaT9pLmNhbGwodGhpcyxlKTp7fSk7cmV0dXJuIjwiK3RoaXMuZmlsbFNlZ1RhZysoci5sZW5ndGg/JyBjbGFzcz0iJytyLmpvaW4oIiAiKSsnIic6IiIpKyhzPycgc3R5bGU9IicrcysnIic6IiIpKyIgLz4ifSxnZXREYXlDbGFzc2VzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmlldyxuPWUuY2FsZW5kYXIuZ2V0Tm93KCksaT1bImZjLSIrJHRbdC5kYXkoKV1dO3JldHVybiAxPT1lLmludGVydmFsRHVyYXRpb24uYXMoIm1vbnRocyIpJiZ0Lm1vbnRoKCkhPWUuaW50ZXJ2YWxTdGFydC5tb250aCgpJiZpLnB1c2goImZjLW90aGVyLW1vbnRoIiksdC5pc1NhbWUobiwiZGF5Iik/aS5wdXNoKCJmYy10b2RheSIsZS5oaWdobGlnaHRTdGF0ZUNsYXNzKTp0PG4/aS5wdXNoKCJmYy1wYXN0Iik6aS5wdXNoKCJmYy1mdXR1cmUiKSxpfX0pO3BlLm1peGluKHtzZWdTZWxlY3RvcjoiLmZjLWV2ZW50LWNvbnRhaW5lciA+ICoiLG1vdXNlZE92ZXJTZWc6bnVsbCxpc0RyYWdnaW5nU2VnOiExLGlzUmVzaXppbmdTZWc6ITEsaXNEcmFnZ2luZ0V4dGVybmFsOiExLHNlZ3M6bnVsbCxyZW5kZXJFdmVudHM6ZnVuY3Rpb24odCl7dmFyIGUsbj1bXSxpPVtdO2ZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspKFR0KHRbZV0pP246aSkucHVzaCh0W2VdKTt0aGlzLnNlZ3M9W10uY29uY2F0KHRoaXMucmVuZGVyQmdFdmVudHMobiksdGhpcy5yZW5kZXJGZ0V2ZW50cyhpKSl9LHJlbmRlckJnRXZlbnRzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZXZlbnRzVG9TZWdzKHQpO3JldHVybiB0aGlzLnJlbmRlckJnU2VncyhlKXx8ZX0scmVuZGVyRmdFdmVudHM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ldmVudHNUb1NlZ3ModCk7cmV0dXJuIHRoaXMucmVuZGVyRmdTZWdzKGUpfHxlfSx1bnJlbmRlckV2ZW50czpmdW5jdGlvbigpe3RoaXMuaGFuZGxlU2VnTW91c2VvdXQoKSx0aGlzLmNsZWFyRHJhZ0xpc3RlbmVycygpLHRoaXMudW5yZW5kZXJGZ1NlZ3MoKSx0aGlzLnVucmVuZGVyQmdTZWdzKCksdGhpcy5zZWdzPW51bGx9LGdldEV2ZW50U2VnczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlZ3N8fFtdfSxyZW5kZXJGZ1NlZ3M6ZnVuY3Rpb24odCl7fSx1bnJlbmRlckZnU2VnczpmdW5jdGlvbigpe30scmVuZGVyRmdTZWdFbHM6ZnVuY3Rpb24oZSxuKXt2YXIgaSxyPXRoaXMudmlldyxzPSIiLG89W107aWYoZS5sZW5ndGgpe2ZvcihpPTA7aTxlLmxlbmd0aDtpKyspcys9dGhpcy5mZ1NlZ0h0bWwoZVtpXSxuKTt0KHMpLmVhY2goZnVuY3Rpb24obixpKXt2YXIgcz1lW25dLGw9ci5yZXNvbHZlRXZlbnRFbChzLmV2ZW50LHQoaSkpO2wmJihsLmRhdGEoImZjLXNlZyIscykscy5lbD1sLG8ucHVzaChzKSl9KX1yZXR1cm4gb30sZmdTZWdIdG1sOmZ1bmN0aW9uKHQsZSl7fSxyZW5kZXJCZ1NlZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVuZGVyRmlsbCgiYmdFdmVudCIsdCl9LHVucmVuZGVyQmdTZWdzOmZ1bmN0aW9uKCl7dGhpcy51bnJlbmRlckZpbGwoImJnRXZlbnQiKX0sYmdFdmVudFNlZ0VsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudmlldy5yZXNvbHZlRXZlbnRFbCh0LmV2ZW50LGUpfSxiZ0V2ZW50U2VnQ2xhc3NlczpmdW5jdGlvbih0KXt2YXIgZT10LmV2ZW50LG49ZS5zb3VyY2V8fHt9O3JldHVyblsiZmMtYmdldmVudCJdLmNvbmNhdChlLmNsYXNzTmFtZSxuLmNsYXNzTmFtZXx8W10pfSxiZ0V2ZW50U2VnQ3NzOmZ1bmN0aW9uKHQpe3JldHVybnsiYmFja2dyb3VuZC1jb2xvciI6dGhpcy5nZXRTZWdTa2luQ3NzKHQpWyJiYWNrZ3JvdW5kLWNvbG9yIl19fSxidXNpbmVzc0hvdXJzU2VnQ2xhc3NlczpmdW5jdGlvbih0KXtyZXR1cm5bImZjLW5vbmJ1c2luZXNzIiwiZmMtYmdldmVudCJdfSxidWlsZEJ1c2luZXNzSG91clNlZ3M6ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy52aWV3LmNhbGVuZGFyLmdldEN1cnJlbnRCdXNpbmVzc0hvdXJFdmVudHMoZSk7cmV0dXJuIW4ubGVuZ3RoJiZ0aGlzLnZpZXcuY2FsZW5kYXIub3B0aW9ucy5idXNpbmVzc0hvdXJzJiYobj1bdC5leHRlbmQoe30sUmUse3N0YXJ0OnRoaXMudmlldy5lbmQsZW5kOnRoaXMudmlldy5lbmQsZG93Om51bGx9KV0pLHRoaXMuZXZlbnRzVG9TZWdzKG4pfSxiaW5kU2VnSGFuZGxlcnM6ZnVuY3Rpb24oKXt0aGlzLmJpbmRTZWdIYW5kbGVyc1RvRWwodGhpcy5lbCl9LGJpbmRTZWdIYW5kbGVyc1RvRWw6ZnVuY3Rpb24odCl7dGhpcy5iaW5kU2VnSGFuZGxlclRvRWwodCwidG91Y2hzdGFydCIsdGhpcy5oYW5kbGVTZWdUb3VjaFN0YXJ0KSx0aGlzLmJpbmRTZWdIYW5kbGVyVG9FbCh0LCJ0b3VjaGVuZCIsdGhpcy5oYW5kbGVTZWdUb3VjaEVuZCksdGhpcy5iaW5kU2VnSGFuZGxlclRvRWwodCwibW91c2VlbnRlciIsdGhpcy5oYW5kbGVTZWdNb3VzZW92ZXIpLHRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKHQsIm1vdXNlbGVhdmUiLHRoaXMuaGFuZGxlU2VnTW91c2VvdXQpLHRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKHQsIm1vdXNlZG93biIsdGhpcy5oYW5kbGVTZWdNb3VzZWRvd24pLHRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKHQsImNsaWNrIix0aGlzLmhhbmRsZVNlZ0NsaWNrKX0sYmluZFNlZ0hhbmRsZXJUb0VsOmZ1bmN0aW9uKGUsbixpKXt2YXIgcj10aGlzO2Uub24obix0aGlzLnNlZ1NlbGVjdG9yLGZ1bmN0aW9uKGUpe3ZhciBuPXQodGhpcykuZGF0YSgiZmMtc2VnIik7aWYobiYmIXIuaXNEcmFnZ2luZ1NlZyYmIXIuaXNSZXNpemluZ1NlZylyZXR1cm4gaS5jYWxsKHIsbixlKX0pfSxoYW5kbGVTZWdDbGljazpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMudmlldy50cmlnZ2VyKCJldmVudENsaWNrIix0LmVsWzBdLHQuZXZlbnQsZSk7bj09PSExJiZlLnByZXZlbnREZWZhdWx0KCl9LGhhbmRsZVNlZ01vdXNlb3ZlcjpmdW5jdGlvbih0LGUpe3RoaXMuaXNJZ25vcmluZ01vdXNlfHx0aGlzLm1vdXNlZE92ZXJTZWd8fCh0aGlzLm1vdXNlZE92ZXJTZWc9dCx0aGlzLnZpZXcuaXNFdmVudFJlc2l6YWJsZSh0LmV2ZW50KSYmdC5lbC5hZGRDbGFzcygiZmMtYWxsb3ctbW91c2UtcmVzaXplIiksdGhpcy52aWV3LnRyaWdnZXIoImV2ZW50TW91c2VvdmVyIix0LmVsWzBdLHQuZXZlbnQsZSkpfSxoYW5kbGVTZWdNb3VzZW91dDpmdW5jdGlvbih0LGUpe2U9ZXx8e30sdGhpcy5tb3VzZWRPdmVyU2VnJiYodD10fHx0aGlzLm1vdXNlZE92ZXJTZWcsdGhpcy5tb3VzZWRPdmVyU2VnPW51bGwsdGhpcy52aWV3LmlzRXZlbnRSZXNpemFibGUodC5ldmVudCkmJnQuZWwucmVtb3ZlQ2xhc3MoImZjLWFsbG93LW1vdXNlLXJlc2l6ZSIpLHRoaXMudmlldy50cmlnZ2VyKCJldmVudE1vdXNlb3V0Iix0LmVsWzBdLHQuZXZlbnQsZSkpfSxoYW5kbGVTZWdNb3VzZWRvd246ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnN0YXJ0U2VnUmVzaXplKHQsZSx7ZGlzdGFuY2U6NX0pOyFuJiZ0aGlzLnZpZXcuaXNFdmVudERyYWdnYWJsZSh0LmV2ZW50KSYmdGhpcy5idWlsZFNlZ0RyYWdMaXN0ZW5lcih0KS5zdGFydEludGVyYWN0aW9uKGUse2Rpc3RhbmNlOjV9KX0saGFuZGxlU2VnVG91Y2hTdGFydDpmdW5jdGlvbih0LGUpe3ZhciBuLGk9dGhpcy52aWV3LHI9dC5ldmVudCxzPWkuaXNFdmVudFNlbGVjdGVkKHIpLG89aS5pc0V2ZW50RHJhZ2dhYmxlKHIpLGw9aS5pc0V2ZW50UmVzaXphYmxlKHIpLGE9ITE7cyYmbCYmKGE9dGhpcy5zdGFydFNlZ1Jlc2l6ZSh0LGUpKSxhfHwhbyYmIWx8fChuPW8/dGhpcy5idWlsZFNlZ0RyYWdMaXN0ZW5lcih0KTp0aGlzLmJ1aWxkU2VnU2VsZWN0TGlzdGVuZXIodCksbi5zdGFydEludGVyYWN0aW9uKGUse2RlbGF5OnM/MDp0aGlzLnZpZXcub3B0KCJsb25nUHJlc3NEZWxheSIpfSkpLHRoaXMudGVtcElnbm9yZU1vdXNlKCl9LGhhbmRsZVNlZ1RvdWNoRW5kOmZ1bmN0aW9uKHQsZSl7dGhpcy50ZW1wSWdub3JlTW91c2UoKX0sc3RhcnRTZWdSZXNpemU6ZnVuY3Rpb24oZSxuLGkpe3JldHVybiEhdChuLnRhcmdldCkuaXMoIi5mYy1yZXNpemVyIikmJih0aGlzLmJ1aWxkU2VnUmVzaXplTGlzdGVuZXIoZSx0KG4udGFyZ2V0KS5pcygiLmZjLXN0YXJ0LXJlc2l6ZXIiKSkuc3RhcnRJbnRlcmFjdGlvbihuLGkpLCEwKX0sYnVpbGRTZWdEcmFnTGlzdGVuZXI6ZnVuY3Rpb24odCl7dmFyIGUsbixpLHI9dGhpcyxsPXRoaXMudmlldyxhPWwuY2FsZW5kYXIsdT10LmVsLGQ9dC5ldmVudDtpZih0aGlzLnNlZ0RyYWdMaXN0ZW5lcilyZXR1cm4gdGhpcy5zZWdEcmFnTGlzdGVuZXI7dmFyIGM9dGhpcy5zZWdEcmFnTGlzdGVuZXI9bmV3IGZlKGwse3Njcm9sbDpsLm9wdCgiZHJhZ1Njcm9sbCIpLHN1YmplY3RFbDp1LHN1YmplY3RDZW50ZXI6ITAsaW50ZXJhY3Rpb25TdGFydDpmdW5jdGlvbihpKXt0LmNvbXBvbmVudD1yLGU9ITEsbj1uZXcgZ2UodC5lbCx7YWRkaXRpb25hbENsYXNzOiJmYy1kcmFnZ2luZyIscGFyZW50RWw6bC5lbCxvcGFjaXR5OmMuaXNUb3VjaD9udWxsOmwub3B0KCJkcmFnT3BhY2l0eSIpLHJldmVydER1cmF0aW9uOmwub3B0KCJkcmFnUmV2ZXJ0RHVyYXRpb24iKSx6SW5kZXg6Mn0pLG4uaGlkZSgpLG4uc3RhcnQoaSl9LGRyYWdTdGFydDpmdW5jdGlvbihuKXtjLmlzVG91Y2gmJiFsLmlzRXZlbnRTZWxlY3RlZChkKSYmbC5zZWxlY3RFdmVudChkKSxlPSEwLHIuaGFuZGxlU2VnTW91c2VvdXQodCxuKSxyLnNlZ0RyYWdTdGFydCh0LG4pLGwuaGlkZUV2ZW50KGQpfSxoaXRPdmVyOmZ1bmN0aW9uKGUsbyx1KXt2YXIgaDt0LmhpdCYmKHU9dC5oaXQpLGk9ci5jb21wdXRlRXZlbnREcm9wKHUuY29tcG9uZW50LmdldEhpdFNwYW4odSksZS5jb21wb25lbnQuZ2V0SGl0U3BhbihlKSxkKSxpJiYhYS5pc0V2ZW50U3BhbkFsbG93ZWQoci5ldmVudFRvU3BhbihpKSxkKSYmKHMoKSxpPW51bGwpLGkmJihoPWwucmVuZGVyRHJhZyhpLHQpKT8oaC5hZGRDbGFzcygiZmMtZHJhZ2dpbmciKSxjLmlzVG91Y2h8fHIuYXBwbHlEcmFnT3BhY2l0eShoKSxuLmhpZGUoKSk6bi5zaG93KCksbyYmKGk9bnVsbCl9LGhpdE91dDpmdW5jdGlvbigpe2wudW5yZW5kZXJEcmFnKCksbi5zaG93KCksaT1udWxsfSxoaXREb25lOmZ1bmN0aW9uKCl7bygpfSxpbnRlcmFjdGlvbkVuZDpmdW5jdGlvbihzKXtkZWxldGUgdC5jb21wb25lbnQsbi5zdG9wKCFpLGZ1bmN0aW9uKCl7ZSYmKGwudW5yZW5kZXJEcmFnKCksbC5zaG93RXZlbnQoZCksci5zZWdEcmFnU3RvcCh0LHMpKSxpJiZsLnJlcG9ydEV2ZW50RHJvcChkLGksdGhpcy5sYXJnZVVuaXQsdSxzKX0pLHIuc2VnRHJhZ0xpc3RlbmVyPW51bGx9fSk7cmV0dXJuIGN9LGJ1aWxkU2VnU2VsZWN0TGlzdGVuZXI6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMudmlldyxpPXQuZXZlbnQ7aWYodGhpcy5zZWdEcmFnTGlzdGVuZXIpcmV0dXJuIHRoaXMuc2VnRHJhZ0xpc3RlbmVyO3ZhciByPXRoaXMuc2VnRHJhZ0xpc3RlbmVyPW5ldyBoZSh7ZHJhZ1N0YXJ0OmZ1bmN0aW9uKHQpe3IuaXNUb3VjaCYmIW4uaXNFdmVudFNlbGVjdGVkKGkpJiZuLnNlbGVjdEV2ZW50KGkpfSxpbnRlcmFjdGlvbkVuZDpmdW5jdGlvbih0KXtlLnNlZ0RyYWdMaXN0ZW5lcj1udWxsfX0pO3JldHVybiByfSxzZWdEcmFnU3RhcnQ6ZnVuY3Rpb24odCxlKXt0aGlzLmlzRHJhZ2dpbmdTZWc9ITAsdGhpcy52aWV3LnRyaWdnZXIoImV2ZW50RHJhZ1N0YXJ0Iix0LmVsWzBdLHQuZXZlbnQsZSx7fSl9LHNlZ0RyYWdTdG9wOmZ1bmN0aW9uKHQsZSl7dGhpcy5pc0RyYWdnaW5nU2VnPSExLHRoaXMudmlldy50cmlnZ2VyKCJldmVudERyYWdTdG9wIix0LmVsWzBdLHQuZXZlbnQsZSx7fSl9LGNvbXB1dGVFdmVudERyb3A6ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIscz10aGlzLnZpZXcuY2FsZW5kYXIsbz10LnN0YXJ0LGw9ZS5zdGFydDtyZXR1cm4gby5oYXNUaW1lKCk9PT1sLmhhc1RpbWUoKT8oaT10aGlzLmRpZmZEYXRlcyhsLG8pLG4uYWxsRGF5JiZXKGkpPyhyPXtzdGFydDpuLnN0YXJ0LmNsb25lKCksZW5kOnMuZ2V0RXZlbnRFbmQobiksYWxsRGF5OiExfSxzLm5vcm1hbGl6ZUV2ZW50VGltZXMocikpOnI9SHQobiksci5zdGFydC5hZGQoaSksci5lbmQmJnIuZW5kLmFkZChpKSk6cj17c3RhcnQ6bC5jbG9uZSgpLGVuZDpudWxsLGFsbERheTohbC5oYXNUaW1lKCl9LHJ9LGFwcGx5RHJhZ09wYWNpdHk6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52aWV3Lm9wdCgiZHJhZ09wYWNpdHkiKTtudWxsIT1lJiZ0LmNzcygib3BhY2l0eSIsZSl9LGV4dGVybmFsRHJhZ1N0YXJ0OmZ1bmN0aW9uKGUsbil7dmFyIGkscixzPXRoaXMudmlldztzLm9wdCgiZHJvcHBhYmxlIikmJihpPXQoKG4/bi5pdGVtOm51bGwpfHxlLnRhcmdldCkscj1zLm9wdCgiZHJvcEFjY2VwdCIpLCh0LmlzRnVuY3Rpb24ocik/ci5jYWxsKGlbMF0saSk6aS5pcyhyKSkmJih0aGlzLmlzRHJhZ2dpbmdFeHRlcm5hbHx8dGhpcy5saXN0ZW5Ub0V4dGVybmFsRHJhZyhpLGUsbikpKX0sbGlzdGVuVG9FeHRlcm5hbERyYWc6ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHI9dGhpcyxsPXRoaXMudmlldy5jYWxlbmRhcixhPU10KHQpLHU9ci5leHRlcm5hbERyYWdMaXN0ZW5lcj1uZXcgZmUodGhpcyx7aW50ZXJhY3Rpb25TdGFydDpmdW5jdGlvbigpe3IuaXNEcmFnZ2luZ0V4dGVybmFsPSEwfSxoaXRPdmVyOmZ1bmN0aW9uKHQpe2k9ci5jb21wdXRlRXh0ZXJuYWxEcm9wKHQuY29tcG9uZW50LmdldEhpdFNwYW4odCksYSksaSYmIWwuaXNFeHRlcm5hbFNwYW5BbGxvd2VkKHIuZXZlbnRUb1NwYW4oaSksaSxhLmV2ZW50UHJvcHMpJiYocygpLGk9bnVsbCksaSYmci5yZW5kZXJEcmFnKGkpfSxoaXRPdXQ6ZnVuY3Rpb24oKXtpPW51bGx9LGhpdERvbmU6ZnVuY3Rpb24oKXtvKCksci51bnJlbmRlckRyYWcoKX0saW50ZXJhY3Rpb25FbmQ6ZnVuY3Rpb24oZSl7aSYmci52aWV3LnJlcG9ydEV4dGVybmFsRHJvcChhLGksdCxlLG4pLHIuaXNEcmFnZ2luZ0V4dGVybmFsPSExLHIuZXh0ZXJuYWxEcmFnTGlzdGVuZXI9bnVsbH19KTt1LnN0YXJ0RHJhZyhlKX0sY29tcHV0ZUV4dGVybmFsRHJvcDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMudmlldy5jYWxlbmRhcixpPXtzdGFydDpuLmFwcGx5VGltZXpvbmUodC5zdGFydCksZW5kOm51bGx9O3JldHVybiBlLnN0YXJ0VGltZSYmIWkuc3RhcnQuaGFzVGltZSgpJiZpLnN0YXJ0LnRpbWUoZS5zdGFydFRpbWUpLGUuZHVyYXRpb24mJihpLmVuZD1pLnN0YXJ0LmNsb25lKCkuYWRkKGUuZHVyYXRpb24pKSxpfSxyZW5kZXJEcmFnOmZ1bmN0aW9uKHQsZSl7fSx1bnJlbmRlckRyYWc6ZnVuY3Rpb24oKXt9LGJ1aWxkU2VnUmVzaXplTGlzdGVuZXI6ZnVuY3Rpb24odCxlKXt2YXIgbixpLHI9dGhpcyxsPXRoaXMudmlldyxhPWwuY2FsZW5kYXIsdT10LmVsLGQ9dC5ldmVudCxjPWEuZ2V0RXZlbnRFbmQoZCksaD10aGlzLnNlZ1Jlc2l6ZUxpc3RlbmVyPW5ldyBmZSh0aGlzLHtzY3JvbGw6bC5vcHQoImRyYWdTY3JvbGwiKSxzdWJqZWN0RWw6dSxpbnRlcmFjdGlvblN0YXJ0OmZ1bmN0aW9uKCl7bj0hMX0sZHJhZ1N0YXJ0OmZ1bmN0aW9uKGUpe249ITAsci5oYW5kbGVTZWdNb3VzZW91dCh0LGUpLHIuc2VnUmVzaXplU3RhcnQodCxlKX0saGl0T3ZlcjpmdW5jdGlvbihuLG8sdSl7dmFyIGg9ci5nZXRIaXRTcGFuKHUpLGY9ci5nZXRIaXRTcGFuKG4pO2k9ZT9yLmNvbXB1dGVFdmVudFN0YXJ0UmVzaXplKGgsZixkKTpyLmNvbXB1dGVFdmVudEVuZFJlc2l6ZShoLGYsZCksaSYmKGEuaXNFdmVudFNwYW5BbGxvd2VkKHIuZXZlbnRUb1NwYW4oaSksZCk/aS5zdGFydC5pc1NhbWUoZC5zdGFydC5jbG9uZSgpLnN0cmlwWm9uZSgpKSYmaS5lbmQuaXNTYW1lKGMuY2xvbmUoKS5zdHJpcFpvbmUoKSkmJihpPW51bGwpOihzKCksaT1udWxsKSksaSYmKGwuaGlkZUV2ZW50KGQpLHIucmVuZGVyRXZlbnRSZXNpemUoaSx0KSl9LGhpdE91dDpmdW5jdGlvbigpe2k9bnVsbH0saGl0RG9uZTpmdW5jdGlvbigpe3IudW5yZW5kZXJFdmVudFJlc2l6ZSgpLGwuc2hvd0V2ZW50KGQpLG8oKX0saW50ZXJhY3Rpb25FbmQ6ZnVuY3Rpb24oZSl7biYmci5zZWdSZXNpemVTdG9wKHQsZSksaSYmbC5yZXBvcnRFdmVudFJlc2l6ZShkLGksdGhpcy5sYXJnZVVuaXQsdSxlKSxyLnNlZ1Jlc2l6ZUxpc3RlbmVyPW51bGx9fSk7cmV0dXJuIGh9LHNlZ1Jlc2l6ZVN0YXJ0OmZ1bmN0aW9uKHQsZSl7dGhpcy5pc1Jlc2l6aW5nU2VnPSEwLHRoaXMudmlldy50cmlnZ2VyKCJldmVudFJlc2l6ZVN0YXJ0Iix0LmVsWzBdLHQuZXZlbnQsZSx7fSl9LHNlZ1Jlc2l6ZVN0b3A6ZnVuY3Rpb24odCxlKXt0aGlzLmlzUmVzaXppbmdTZWc9ITEsdGhpcy52aWV3LnRyaWdnZXIoImV2ZW50UmVzaXplU3RvcCIsdC5lbFswXSx0LmV2ZW50LGUse30pfSxjb21wdXRlRXZlbnRTdGFydFJlc2l6ZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuY29tcHV0ZUV2ZW50UmVzaXplKCJzdGFydCIsdCxlLG4pfSxjb21wdXRlRXZlbnRFbmRSZXNpemU6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLmNvbXB1dGVFdmVudFJlc2l6ZSgiZW5kIix0LGUsbil9LGNvbXB1dGVFdmVudFJlc2l6ZTpmdW5jdGlvbih0LGUsbixpKXt2YXIgcixzLG89dGhpcy52aWV3LmNhbGVuZGFyLGw9dGhpcy5kaWZmRGF0ZXMoblt0XSxlW3RdKTtyZXR1cm4gcj17c3RhcnQ6aS5zdGFydC5jbG9uZSgpLGVuZDpvLmdldEV2ZW50RW5kKGkpLGFsbERheTppLmFsbERheX0sci5hbGxEYXkmJlcobCkmJihyLmFsbERheT0hMSxvLm5vcm1hbGl6ZUV2ZW50VGltZXMocikpLHJbdF0uYWRkKGwpLHIuc3RhcnQuaXNCZWZvcmUoci5lbmQpfHwocz10aGlzLm1pblJlc2l6ZUR1cmF0aW9ufHwoaS5hbGxEYXk/by5kZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbjpvLmRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb24pLCJzdGFydCI9PXQ/ci5zdGFydD1yLmVuZC5jbG9uZSgpLnN1YnRyYWN0KHMpOnIuZW5kPXIuc3RhcnQuY2xvbmUoKS5hZGQocykpLHJ9LHJlbmRlckV2ZW50UmVzaXplOmZ1bmN0aW9uKHQsZSl7fSx1bnJlbmRlckV2ZW50UmVzaXplOmZ1bmN0aW9uKCl7fSxnZXRFdmVudFRpbWVUZXh0OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09ZSYmKGU9dGhpcy5ldmVudFRpbWVGb3JtYXQpLG51bGw9PW4mJihuPXRoaXMuZGlzcGxheUV2ZW50RW5kKSx0aGlzLmRpc3BsYXlFdmVudFRpbWUmJnQuc3RhcnQuaGFzVGltZSgpP24mJnQuZW5kP3RoaXMudmlldy5mb3JtYXRSYW5nZSh0LGUpOnQuc3RhcnQuZm9ybWF0KGUpOiIifSxnZXRTZWdDbGFzc2VzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLnZpZXcscj1bImZjLWV2ZW50Iix0LmlzU3RhcnQ/ImZjLXN0YXJ0IjoiZmMtbm90LXN0YXJ0Iix0LmlzRW5kPyJmYy1lbmQiOiJmYy1ub3QtZW5kIl0uY29uY2F0KHRoaXMuZ2V0U2VnQ3VzdG9tQ2xhc3Nlcyh0KSk7cmV0dXJuIGUmJnIucHVzaCgiZmMtZHJhZ2dhYmxlIiksbiYmci5wdXNoKCJmYy1yZXNpemFibGUiKSxpLmlzRXZlbnRTZWxlY3RlZCh0LmV2ZW50KSYmci5wdXNoKCJmYy1zZWxlY3RlZCIpLHJ9LGdldFNlZ0N1c3RvbUNsYXNzZXM6ZnVuY3Rpb24odCl7dmFyIGU9dC5ldmVudDtyZXR1cm5bXS5jb25jYXQoZS5jbGFzc05hbWUsZS5zb3VyY2U/ZS5zb3VyY2UuY2xhc3NOYW1lOltdKX0sZ2V0U2VnU2tpbkNzczpmdW5jdGlvbih0KXtyZXR1cm57ImJhY2tncm91bmQtY29sb3IiOnRoaXMuZ2V0U2VnQmFja2dyb3VuZENvbG9yKHQpLCJib3JkZXItY29sb3IiOnRoaXMuZ2V0U2VnQm9yZGVyQ29sb3IodCksY29sb3I6dGhpcy5nZXRTZWdUZXh0Q29sb3IodCl9fSxnZXRTZWdCYWNrZ3JvdW5kQ29sb3I6ZnVuY3Rpb24odCl7cmV0dXJuIHQuZXZlbnQuYmFja2dyb3VuZENvbG9yfHx0LmV2ZW50LmNvbG9yfHx0aGlzLmdldFNlZ0RlZmF1bHRCYWNrZ3JvdW5kQ29sb3IodCl9LGdldFNlZ0RlZmF1bHRCYWNrZ3JvdW5kQ29sb3I6ZnVuY3Rpb24odCl7dmFyIGU9dC5ldmVudC5zb3VyY2V8fHt9O3JldHVybiBlLmJhY2tncm91bmRDb2xvcnx8ZS5jb2xvcnx8dGhpcy52aWV3Lm9wdCgiZXZlbnRCYWNrZ3JvdW5kQ29sb3IiKXx8dGhpcy52aWV3Lm9wdCgiZXZlbnRDb2xvciIpfSxnZXRTZWdCb3JkZXJDb2xvcjpmdW5jdGlvbih0KXtyZXR1cm4gdC5ldmVudC5ib3JkZXJDb2xvcnx8dC5ldmVudC5jb2xvcnx8dGhpcy5nZXRTZWdEZWZhdWx0Qm9yZGVyQ29sb3IodCl9LGdldFNlZ0RlZmF1bHRCb3JkZXJDb2xvcjpmdW5jdGlvbih0KXt2YXIgZT10LmV2ZW50LnNvdXJjZXx8e307cmV0dXJuIGUuYm9yZGVyQ29sb3J8fGUuY29sb3J8fHRoaXMudmlldy5vcHQoImV2ZW50Qm9yZGVyQ29sb3IiKXx8dGhpcy52aWV3Lm9wdCgiZXZlbnRDb2xvciIpfSxnZXRTZWdUZXh0Q29sb3I6ZnVuY3Rpb24odCl7cmV0dXJuIHQuZXZlbnQudGV4dENvbG9yfHx0aGlzLmdldFNlZ0RlZmF1bHRUZXh0Q29sb3IodCl9LGdldFNlZ0RlZmF1bHRUZXh0Q29sb3I6ZnVuY3Rpb24odCl7dmFyIGU9dC5ldmVudC5zb3VyY2V8fHt9O3JldHVybiBlLnRleHRDb2xvcnx8dGhpcy52aWV3Lm9wdCgiZXZlbnRUZXh0Q29sb3IiKX0sZXZlbnRUb1NlZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZXZlbnRzVG9TZWdzKFt0XSl9LGV2ZW50VG9TcGFuOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmV2ZW50VG9TcGFucyh0KVswXX0sZXZlbnRUb1NwYW5zOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZXZlbnRUb1JhbmdlKHQpO3JldHVybiB0aGlzLmV2ZW50UmFuZ2VUb1NwYW5zKGUsdCl9LGV2ZW50c1RvU2VnczpmdW5jdGlvbihlLG4pe3ZhciBpPXRoaXMscj1JdChlKSxzPVtdO3JldHVybiB0LmVhY2gocixmdW5jdGlvbih0LGUpe3ZhciByLG89W107Zm9yKHI9MDtyPGUubGVuZ3RoO3IrKylvLnB1c2goaS5ldmVudFRvUmFuZ2UoZVtyXSkpO2lmKHh0KGVbMF0pKWZvcihvPWkuaW52ZXJ0UmFuZ2VzKG8pLHI9MDtyPG8ubGVuZ3RoO3IrKylzLnB1c2guYXBwbHkocyxpLmV2ZW50UmFuZ2VUb1NlZ3Mob1tyXSxlWzBdLG4pKTtlbHNlIGZvcihyPTA7cjxvLmxlbmd0aDtyKyspcy5wdXNoLmFwcGx5KHMsaS5ldmVudFJhbmdlVG9TZWdzKG9bcl0sZVtyXSxuKSl9KSxzfSxldmVudFRvUmFuZ2U6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52aWV3LmNhbGVuZGFyLG49dC5zdGFydC5jbG9uZSgpLnN0cmlwWm9uZSgpLGk9KHQuZW5kP3QuZW5kLmNsb25lKCk6ZS5nZXREZWZhdWx0RXZlbnRFbmQobnVsbCE9dC5hbGxEYXk/dC5hbGxEYXk6IXQuc3RhcnQuaGFzVGltZSgpLHQuc3RhcnQpKS5zdHJpcFpvbmUoKTtyZXR1cm4gZS5sb2NhbGl6ZU1vbWVudChuKSxlLmxvY2FsaXplTW9tZW50KGkpLHtzdGFydDpuLGVuZDppfX0sZXZlbnRSYW5nZVRvU2VnczpmdW5jdGlvbih0LGUsbil7dmFyIGkscj10aGlzLmV2ZW50UmFuZ2VUb1NwYW5zKHQsZSkscz1bXTtmb3IoaT0wO2k8ci5sZW5ndGg7aSsrKXMucHVzaC5hcHBseShzLHRoaXMuZXZlbnRTcGFuVG9TZWdzKHJbaV0sZSxuKSk7cmV0dXJuIHN9LGV2ZW50UmFuZ2VUb1NwYW5zOmZ1bmN0aW9uKGUsbil7cmV0dXJuW3QuZXh0ZW5kKHt9LGUpXX0sZXZlbnRTcGFuVG9TZWdzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyLHM9bj9uKHQpOnRoaXMuc3BhblRvU2Vncyh0KTtmb3IoaT0wO2k8cy5sZW5ndGg7aSsrKXI9c1tpXSxyLmV2ZW50PWUsci5ldmVudFN0YXJ0TVM9K3Quc3RhcnQsci5ldmVudER1cmF0aW9uTVM9dC5lbmQtdC5zdGFydDtyZXR1cm4gc30saW52ZXJ0UmFuZ2VzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLnZpZXcscj1pLnN0YXJ0LmNsb25lKCkscz1pLmVuZC5jbG9uZSgpLG89W10sbD1yO2Zvcih0LnNvcnQoa3QpLGU9MDtlPHQubGVuZ3RoO2UrKyluPXRbZV0sbi5zdGFydD5sJiZvLnB1c2goe3N0YXJ0OmwsZW5kOm4uc3RhcnR9KSxsPW4uZW5kO3JldHVybiBsPHMmJm8ucHVzaCh7c3RhcnQ6bCxlbmQ6c30pLG99LHNvcnRFdmVudFNlZ3M6ZnVuY3Rpb24odCl7dC5zb3J0KGx0KHRoaXMsImNvbXBhcmVFdmVudFNlZ3MiKSl9LGNvbXBhcmVFdmVudFNlZ3M6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5ldmVudFN0YXJ0TVMtZS5ldmVudFN0YXJ0TVN8fGUuZXZlbnREdXJhdGlvbk1TLXQuZXZlbnREdXJhdGlvbk1TfHxlLmV2ZW50LmFsbERheS10LmV2ZW50LmFsbERheXx8TCh0LmV2ZW50LGUuZXZlbnQsdGhpcy52aWV3LmV2ZW50T3JkZXJTcGVjcyl9fSksanQucGx1Y2tFdmVudERhdGVQcm9wcz1IdCxqdC5pc0JnRXZlbnQ9VHQsanQuZGF0YUF0dHJQcmVmaXg9IiI7dmFyIHZlPWp0LkRheVRhYmxlTWl4aW49e2JyZWFrT25XZWVrczohMSxkYXlEYXRlczpudWxsLGRheUluZGljZXM6bnVsbCxkYXlzUGVyUm93Om51bGwscm93Q250Om51bGwsY29sQ250Om51bGwsY29sSGVhZEZvcm1hdDpudWxsLHVwZGF0ZURheVRhYmxlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0LGUsbixpPXRoaXMudmlldyxyPXRoaXMuc3RhcnQuY2xvbmUoKSxzPS0xLG89W10sbD1bXTtyLmlzQmVmb3JlKHRoaXMuZW5kKTspaS5pc0hpZGRlbkRheShyKT9vLnB1c2gocysuNSk6KHMrKyxvLnB1c2gocyksbC5wdXNoKHIuY2xvbmUoKSkpLHIuYWRkKDEsImRheXMiKTtpZih0aGlzLmJyZWFrT25XZWVrcyl7Zm9yKGU9bFswXS5kYXkoKSx0PTE7dDxsLmxlbmd0aCYmbFt0XS5kYXkoKSE9ZTt0KyspO249TWF0aC5jZWlsKGwubGVuZ3RoL3QpfWVsc2Ugbj0xLHQ9bC5sZW5ndGg7dGhpcy5kYXlEYXRlcz1sLHRoaXMuZGF5SW5kaWNlcz1vLHRoaXMuZGF5c1BlclJvdz10LHRoaXMucm93Q250PW4sdGhpcy51cGRhdGVEYXlUYWJsZUNvbHMoKX0sdXBkYXRlRGF5VGFibGVDb2xzOmZ1bmN0aW9uKCl7dGhpcy5jb2xDbnQ9dGhpcy5jb21wdXRlQ29sQ250KCksdGhpcy5jb2xIZWFkRm9ybWF0PXRoaXMudmlldy5vcHQoImNvbHVtbkZvcm1hdCIpfHx0aGlzLmNvbXB1dGVDb2xIZWFkRm9ybWF0KCl9LGNvbXB1dGVDb2xDbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXlzUGVyUm93fSxnZXRDZWxsRGF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmRheURhdGVzW3RoaXMuZ2V0Q2VsbERheUluZGV4KHQsZSldLmNsb25lKCl9LGdldENlbGxSYW5nZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0Q2VsbERhdGUodCxlKSxpPW4uY2xvbmUoKS5hZGQoMSwiZGF5cyIpO3JldHVybntzdGFydDpuLGVuZDppfX0sZ2V0Q2VsbERheUluZGV4OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQqdGhpcy5kYXlzUGVyUm93K3RoaXMuZ2V0Q29sRGF5SW5kZXgoZSl9LGdldENvbERheUluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzUlRMP3RoaXMuY29sQ250LTEtdDp0fSxnZXREYXRlRGF5SW5kZXg6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kYXlJbmRpY2VzLG49dC5kaWZmKHRoaXMuc3RhcnQsImRheXMiKTtyZXR1cm4gbjwwP2VbMF0tMTpuPj1lLmxlbmd0aD9lW2UubGVuZ3RoLTFdKzE6ZVtuXX0sY29tcHV0ZUNvbEhlYWRGb3JtYXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb3dDbnQ+MXx8dGhpcy5jb2xDbnQ+MTA/ImRkZCI6dGhpcy5jb2xDbnQ+MT90aGlzLnZpZXcub3B0KCJkYXlPZk1vbnRoRm9ybWF0Iik6ImRkZGQifSxzbGljZVJhbmdlQnlSb3c6ZnVuY3Rpb24odCl7dmFyIGUsbixpLHIscyxvPXRoaXMuZGF5c1BlclJvdyxsPXRoaXMudmlldy5jb21wdXRlRGF5UmFuZ2UodCksYT10aGlzLmdldERhdGVEYXlJbmRleChsLnN0YXJ0KSx1PXRoaXMuZ2V0RGF0ZURheUluZGV4KGwuZW5kLmNsb25lKCkuc3VidHJhY3QoMSwiZGF5cyIpKSxkPVtdO2ZvcihlPTA7ZTx0aGlzLnJvd0NudDtlKyspbj1lKm8saT1uK28tMSxyPU1hdGgubWF4KGEsbikscz1NYXRoLm1pbih1LGkpLHI9TWF0aC5jZWlsKHIpLHM9TWF0aC5mbG9vcihzKSxyPD1zJiZkLnB1c2goe3JvdzplLGZpcnN0Um93RGF5SW5kZXg6ci1uLGxhc3RSb3dEYXlJbmRleDpzLW4saXNTdGFydDpyPT09YSxpc0VuZDpzPT09dX0pO3JldHVybiBkfSxzbGljZVJhbmdlQnlEYXk6ZnVuY3Rpb24odCl7dmFyIGUsbixpLHIscyxvLGw9dGhpcy5kYXlzUGVyUm93LGE9dGhpcy52aWV3LmNvbXB1dGVEYXlSYW5nZSh0KSx1PXRoaXMuZ2V0RGF0ZURheUluZGV4KGEuc3RhcnQpLGQ9dGhpcy5nZXREYXRlRGF5SW5kZXgoYS5lbmQuY2xvbmUoKS5zdWJ0cmFjdCgxLCJkYXlzIikpLGM9W107Zm9yKGU9MDtlPHRoaXMucm93Q250O2UrKylmb3Iobj1lKmwsaT1uK2wtMSxyPW47cjw9aTtyKyspcz1NYXRoLm1heCh1LHIpLG89TWF0aC5taW4oZCxyKSxzPU1hdGguY2VpbChzKSxvPU1hdGguZmxvb3Iobyksczw9byYmYy5wdXNoKHtyb3c6ZSxmaXJzdFJvd0RheUluZGV4OnMtbixsYXN0Um93RGF5SW5kZXg6by1uLGlzU3RhcnQ6cz09PXUsaXNFbmQ6bz09PWR9KTtyZXR1cm4gYzsKfSxyZW5kZXJIZWFkSHRtbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMudmlldztyZXR1cm4nPGRpdiBjbGFzcz0iZmMtcm93ICcrdC53aWRnZXRIZWFkZXJDbGFzcysnIj48dGFibGU+PHRoZWFkPicrdGhpcy5yZW5kZXJIZWFkVHJIdG1sKCkrIjwvdGhlYWQ+PC90YWJsZT48L2Rpdj4ifSxyZW5kZXJIZWFkSW50cm9IdG1sOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVySW50cm9IdG1sKCl9LHJlbmRlckhlYWRUckh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4iPHRyPiIrKHRoaXMuaXNSVEw/IiI6dGhpcy5yZW5kZXJIZWFkSW50cm9IdG1sKCkpK3RoaXMucmVuZGVySGVhZERhdGVDZWxsc0h0bWwoKSsodGhpcy5pc1JUTD90aGlzLnJlbmRlckhlYWRJbnRyb0h0bWwoKToiIikrIjwvdHI+In0scmVuZGVySGVhZERhdGVDZWxsc0h0bWw6ZnVuY3Rpb24oKXt2YXIgdCxlLG49W107Zm9yKHQ9MDt0PHRoaXMuY29sQ250O3QrKyllPXRoaXMuZ2V0Q2VsbERhdGUoMCx0KSxuLnB1c2godGhpcy5yZW5kZXJIZWFkRGF0ZUNlbGxIdG1sKGUpKTtyZXR1cm4gbi5qb2luKCIiKX0scmVuZGVySGVhZERhdGVDZWxsSHRtbDpmdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy52aWV3O3JldHVybic8dGggY2xhc3M9ImZjLWRheS1oZWFkZXIgJytpLndpZGdldEhlYWRlckNsYXNzKyIgZmMtIiskdFt0LmRheSgpXSsnIicrKDE9PT10aGlzLnJvd0NudD8nIGRhdGEtZGF0ZT0iJyt0LmZvcm1hdCgiWVlZWS1NTS1ERCIpKyciJzoiIikrKGU+MT8nIGNvbHNwYW49IicrZSsnIic6IiIpKyhuPyIgIituOiIiKSsiPiIraS5idWlsZEdvdG9BbmNob3JIdG1sKHtkYXRlOnQsZm9yY2VPZmY6dGhpcy5yb3dDbnQ+MXx8MT09PXRoaXMuY29sQ250fSx0dCh0LmZvcm1hdCh0aGlzLmNvbEhlYWRGb3JtYXQpKSkrIjwvdGg+In0scmVuZGVyQmdUckh0bWw6ZnVuY3Rpb24odCl7cmV0dXJuIjx0cj4iKyh0aGlzLmlzUlRMPyIiOnRoaXMucmVuZGVyQmdJbnRyb0h0bWwodCkpK3RoaXMucmVuZGVyQmdDZWxsc0h0bWwodCkrKHRoaXMuaXNSVEw/dGhpcy5yZW5kZXJCZ0ludHJvSHRtbCh0KToiIikrIjwvdHI+In0scmVuZGVyQmdJbnRyb0h0bWw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVuZGVySW50cm9IdG1sKCl9LHJlbmRlckJnQ2VsbHNIdG1sOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT1bXTtmb3IoZT0wO2U8dGhpcy5jb2xDbnQ7ZSsrKW49dGhpcy5nZXRDZWxsRGF0ZSh0LGUpLGkucHVzaCh0aGlzLnJlbmRlckJnQ2VsbEh0bWwobikpO3JldHVybiBpLmpvaW4oIiIpfSxyZW5kZXJCZ0NlbGxIdG1sOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy52aWV3LGk9dGhpcy5nZXREYXlDbGFzc2VzKHQpO3JldHVybiBpLnVuc2hpZnQoImZjLWRheSIsbi53aWRnZXRDb250ZW50Q2xhc3MpLCc8dGQgY2xhc3M9IicraS5qb2luKCIgIikrJyIgZGF0YS1kYXRlPSInK3QuZm9ybWF0KCJZWVlZLU1NLUREIikrJyInKyhlPyIgIitlOiIiKSsiPjwvdGQ+In0scmVuZGVySW50cm9IdG1sOmZ1bmN0aW9uKCl7fSxib29rZW5kQ2VsbHM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yZW5kZXJJbnRyb0h0bWwoKTtlJiYodGhpcy5pc1JUTD90LmFwcGVuZChlKTp0LnByZXBlbmQoZSkpfX0sbWU9anQuRGF5R3JpZD1wZS5leHRlbmQodmUse251bWJlcnNWaXNpYmxlOiExLGJvdHRvbUNvb3JkUGFkZGluZzowLHJvd0VsczpudWxsLGNlbGxFbHM6bnVsbCxoZWxwZXJFbHM6bnVsbCxyb3dDb29yZENhY2hlOm51bGwsY29sQ29vcmRDYWNoZTpudWxsLHJlbmRlckRhdGVzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLnZpZXcscj10aGlzLnJvd0NudCxzPXRoaXMuY29sQ250LG89IiI7Zm9yKGU9MDtlPHI7ZSsrKW8rPXRoaXMucmVuZGVyRGF5Um93SHRtbChlLHQpO2Zvcih0aGlzLmVsLmh0bWwobyksdGhpcy5yb3dFbHM9dGhpcy5lbC5maW5kKCIuZmMtcm93IiksdGhpcy5jZWxsRWxzPXRoaXMuZWwuZmluZCgiLmZjLWRheSIpLHRoaXMucm93Q29vcmRDYWNoZT1uZXcgY2Uoe2Vsczp0aGlzLnJvd0Vscyxpc1ZlcnRpY2FsOiEwfSksdGhpcy5jb2xDb29yZENhY2hlPW5ldyBjZSh7ZWxzOnRoaXMuY2VsbEVscy5zbGljZSgwLHRoaXMuY29sQ250KSxpc0hvcml6b250YWw6ITB9KSxlPTA7ZTxyO2UrKylmb3Iobj0wO248cztuKyspaS50cmlnZ2VyKCJkYXlSZW5kZXIiLG51bGwsdGhpcy5nZXRDZWxsRGF0ZShlLG4pLHRoaXMuZ2V0Q2VsbEVsKGUsbikpfSx1bnJlbmRlckRhdGVzOmZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVTZWdQb3BvdmVyKCl9LHJlbmRlckJ1c2luZXNzSG91cnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1aWxkQnVzaW5lc3NIb3VyU2VncyghMCk7dGhpcy5yZW5kZXJGaWxsKCJidXNpbmVzc0hvdXJzIix0LCJiZ2V2ZW50Iil9LHVucmVuZGVyQnVzaW5lc3NIb3VyczpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJGaWxsKCJidXNpbmVzc0hvdXJzIil9LHJlbmRlckRheVJvd0h0bWw6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnZpZXcsaT1bImZjLXJvdyIsImZjLXdlZWsiLG4ud2lkZ2V0Q29udGVudENsYXNzXTtyZXR1cm4gZSYmaS5wdXNoKCJmYy1yaWdpZCIpLCc8ZGl2IGNsYXNzPSInK2kuam9pbigiICIpKyciPjxkaXYgY2xhc3M9ImZjLWJnIj48dGFibGU+Jyt0aGlzLnJlbmRlckJnVHJIdG1sKHQpKyc8L3RhYmxlPjwvZGl2PjxkaXYgY2xhc3M9ImZjLWNvbnRlbnQtc2tlbGV0b24iPjx0YWJsZT4nKyh0aGlzLm51bWJlcnNWaXNpYmxlPyI8dGhlYWQ+Iit0aGlzLnJlbmRlck51bWJlclRySHRtbCh0KSsiPC90aGVhZD4iOiIiKSsiPC90YWJsZT48L2Rpdj48L2Rpdj4ifSxyZW5kZXJOdW1iZXJUckh0bWw6ZnVuY3Rpb24odCl7cmV0dXJuIjx0cj4iKyh0aGlzLmlzUlRMPyIiOnRoaXMucmVuZGVyTnVtYmVySW50cm9IdG1sKHQpKSt0aGlzLnJlbmRlck51bWJlckNlbGxzSHRtbCh0KSsodGhpcy5pc1JUTD90aGlzLnJlbmRlck51bWJlckludHJvSHRtbCh0KToiIikrIjwvdHI+In0scmVuZGVyTnVtYmVySW50cm9IdG1sOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlbmRlckludHJvSHRtbCgpfSxyZW5kZXJOdW1iZXJDZWxsc0h0bWw6ZnVuY3Rpb24odCl7dmFyIGUsbixpPVtdO2ZvcihlPTA7ZTx0aGlzLmNvbENudDtlKyspbj10aGlzLmdldENlbGxEYXRlKHQsZSksaS5wdXNoKHRoaXMucmVuZGVyTnVtYmVyQ2VsbEh0bWwobikpO3JldHVybiBpLmpvaW4oIiIpfSxyZW5kZXJOdW1iZXJDZWxsSHRtbDpmdW5jdGlvbih0KXt2YXIgZSxuLGk9IiI7cmV0dXJuIHRoaXMudmlldy5kYXlOdW1iZXJzVmlzaWJsZXx8dGhpcy52aWV3LmNlbGxXZWVrTnVtYmVyc1Zpc2libGU/KGU9dGhpcy5nZXREYXlDbGFzc2VzKHQpLGUudW5zaGlmdCgiZmMtZGF5LXRvcCIpLHRoaXMudmlldy5jZWxsV2Vla051bWJlcnNWaXNpYmxlJiYobj0iSVNPIj09PXQuX2xvY2FsZS5fZnVsbENhbGVuZGFyX3dlZWtDYWxjPzE6dC5fbG9jYWxlLmZpcnN0RGF5T2ZXZWVrKCkpLGkrPSc8dGQgY2xhc3M9IicrZS5qb2luKCIgIikrJyIgZGF0YS1kYXRlPSInK3QuZm9ybWF0KCkrJyI+Jyx0aGlzLnZpZXcuY2VsbFdlZWtOdW1iZXJzVmlzaWJsZSYmdC5kYXkoKT09biYmKGkrPXRoaXMudmlldy5idWlsZEdvdG9BbmNob3JIdG1sKHtkYXRlOnQsdHlwZToid2VlayJ9LHtjbGFzczoiZmMtd2Vlay1udW1iZXIifSx0LmZvcm1hdCgidyIpKSksdGhpcy52aWV3LmRheU51bWJlcnNWaXNpYmxlJiYoaSs9dGhpcy52aWV3LmJ1aWxkR290b0FuY2hvckh0bWwodCx7Y2xhc3M6ImZjLWRheS1udW1iZXIifSx0LmRhdGUoKSkpLGkrPSI8L3RkPiIpOiI8dGQvPiJ9LGNvbXB1dGVFdmVudFRpbWVGb3JtYXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWV3Lm9wdCgiZXh0cmFTbWFsbFRpbWVGb3JtYXQiKX0sY29tcHV0ZURpc3BsYXlFdmVudEVuZDpmdW5jdGlvbigpe3JldHVybiAxPT10aGlzLmNvbENudH0scmFuZ2VVcGRhdGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVEYXlUYWJsZSgpfSxzcGFuVG9TZWdzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLnNsaWNlUmFuZ2VCeVJvdyh0KTtmb3IoZT0wO2U8aS5sZW5ndGg7ZSsrKW49aVtlXSx0aGlzLmlzUlRMPyhuLmxlZnRDb2w9dGhpcy5kYXlzUGVyUm93LTEtbi5sYXN0Um93RGF5SW5kZXgsbi5yaWdodENvbD10aGlzLmRheXNQZXJSb3ctMS1uLmZpcnN0Um93RGF5SW5kZXgpOihuLmxlZnRDb2w9bi5maXJzdFJvd0RheUluZGV4LG4ucmlnaHRDb2w9bi5sYXN0Um93RGF5SW5kZXgpO3JldHVybiBpfSxwcmVwYXJlSGl0czpmdW5jdGlvbigpe3RoaXMuY29sQ29vcmRDYWNoZS5idWlsZCgpLHRoaXMucm93Q29vcmRDYWNoZS5idWlsZCgpLHRoaXMucm93Q29vcmRDYWNoZS5ib3R0b21zW3RoaXMucm93Q250LTFdKz10aGlzLmJvdHRvbUNvb3JkUGFkZGluZ30scmVsZWFzZUhpdHM6ZnVuY3Rpb24oKXt0aGlzLmNvbENvb3JkQ2FjaGUuY2xlYXIoKSx0aGlzLnJvd0Nvb3JkQ2FjaGUuY2xlYXIoKX0scXVlcnlIaXQ6ZnVuY3Rpb24odCxlKXtpZih0aGlzLmNvbENvb3JkQ2FjaGUuaXNMZWZ0SW5Cb3VuZHModCkmJnRoaXMucm93Q29vcmRDYWNoZS5pc1RvcEluQm91bmRzKGUpKXt2YXIgbj10aGlzLmNvbENvb3JkQ2FjaGUuZ2V0SG9yaXpvbnRhbEluZGV4KHQpLGk9dGhpcy5yb3dDb29yZENhY2hlLmdldFZlcnRpY2FsSW5kZXgoZSk7aWYobnVsbCE9aSYmbnVsbCE9bilyZXR1cm4gdGhpcy5nZXRDZWxsSGl0KGksbil9fSxnZXRIaXRTcGFuOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldENlbGxSYW5nZSh0LnJvdyx0LmNvbCl9LGdldEhpdEVsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldENlbGxFbCh0LnJvdyx0LmNvbCl9LGdldENlbGxIaXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm57cm93OnQsY29sOmUsY29tcG9uZW50OnRoaXMsbGVmdDp0aGlzLmNvbENvb3JkQ2FjaGUuZ2V0TGVmdE9mZnNldChlKSxyaWdodDp0aGlzLmNvbENvb3JkQ2FjaGUuZ2V0UmlnaHRPZmZzZXQoZSksdG9wOnRoaXMucm93Q29vcmRDYWNoZS5nZXRUb3BPZmZzZXQodCksYm90dG9tOnRoaXMucm93Q29vcmRDYWNoZS5nZXRCb3R0b21PZmZzZXQodCl9fSxnZXRDZWxsRWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jZWxsRWxzLmVxKHQqdGhpcy5jb2xDbnQrZSl9LHJlbmRlckRyYWc6ZnVuY3Rpb24odCxlKXtpZih0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKHQpKSxlJiZlLmNvbXBvbmVudCE9PXRoaXMpcmV0dXJuIHRoaXMucmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcih0LGUpfSx1bnJlbmRlckRyYWc6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVySGlnaGxpZ2h0KCksdGhpcy51bnJlbmRlckhlbHBlcigpfSxyZW5kZXJFdmVudFJlc2l6ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKHQpKSx0aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIodCxlKX0sdW5yZW5kZXJFdmVudFJlc2l6ZTpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJIaWdobGlnaHQoKSx0aGlzLnVucmVuZGVySGVscGVyKCl9LHJlbmRlckhlbHBlcjpmdW5jdGlvbihlLG4pe3ZhciBpLHI9W10scz10aGlzLmV2ZW50VG9TZWdzKGUpO3JldHVybiBzPXRoaXMucmVuZGVyRmdTZWdFbHMocyksaT10aGlzLnJlbmRlclNlZ1Jvd3MocyksdGhpcy5yb3dFbHMuZWFjaChmdW5jdGlvbihlLHMpe3ZhciBvLGw9dChzKSxhPXQoJzxkaXYgY2xhc3M9ImZjLWhlbHBlci1za2VsZXRvbiI+PHRhYmxlLz48L2Rpdj4nKTtvPW4mJm4ucm93PT09ZT9uLmVsLnBvc2l0aW9uKCkudG9wOmwuZmluZCgiLmZjLWNvbnRlbnQtc2tlbGV0b24gdGJvZHkiKS5wb3NpdGlvbigpLnRvcCxhLmNzcygidG9wIixvKS5maW5kKCJ0YWJsZSIpLmFwcGVuZChpW2VdLnRib2R5RWwpLGwuYXBwZW5kKGEpLHIucHVzaChhWzBdKX0pLHRoaXMuaGVscGVyRWxzPXQocil9LHVucmVuZGVySGVscGVyOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXJFbHMmJih0aGlzLmhlbHBlckVscy5yZW1vdmUoKSx0aGlzLmhlbHBlckVscz1udWxsKX0sZmlsbFNlZ1RhZzoidGQiLHJlbmRlckZpbGw6ZnVuY3Rpb24oZSxuLGkpe3ZhciByLHMsbyxsPVtdO2ZvcihuPXRoaXMucmVuZGVyRmlsbFNlZ0VscyhlLG4pLHI9MDtyPG4ubGVuZ3RoO3IrKylzPW5bcl0sbz10aGlzLnJlbmRlckZpbGxSb3coZSxzLGkpLHRoaXMucm93RWxzLmVxKHMucm93KS5hcHBlbmQobyksbC5wdXNoKG9bMF0pO3JldHVybiB0aGlzLmVsc0J5RmlsbFtlXT10KGwpLG59LHJlbmRlckZpbGxSb3c6ZnVuY3Rpb24oZSxuLGkpe3ZhciByLHMsbz10aGlzLmNvbENudCxsPW4ubGVmdENvbCxhPW4ucmlnaHRDb2wrMTtyZXR1cm4gaT1pfHxlLnRvTG93ZXJDYXNlKCkscj10KCc8ZGl2IGNsYXNzPSJmYy0nK2krJy1za2VsZXRvbiI+PHRhYmxlPjx0ci8+PC90YWJsZT48L2Rpdj4nKSxzPXIuZmluZCgidHIiKSxsPjAmJnMuYXBwZW5kKCc8dGQgY29sc3Bhbj0iJytsKyciLz4nKSxzLmFwcGVuZChuLmVsLmF0dHIoImNvbHNwYW4iLGEtbCkpLGE8byYmcy5hcHBlbmQoJzx0ZCBjb2xzcGFuPSInKyhvLWEpKyciLz4nKSx0aGlzLmJvb2tlbmRDZWxscyhzKSxyfX0pO21lLm1peGluKHtyb3dTdHJ1Y3RzOm51bGwsdW5yZW5kZXJFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZVNlZ1BvcG92ZXIoKSxwZS5wcm90b3R5cGUudW5yZW5kZXJFdmVudHMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxnZXRFdmVudFNlZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gcGUucHJvdG90eXBlLmdldEV2ZW50U2Vncy5jYWxsKHRoaXMpLmNvbmNhdCh0aGlzLnBvcG92ZXJTZWdzfHxbXSl9LHJlbmRlckJnU2VnczpmdW5jdGlvbihlKXt2YXIgbj10LmdyZXAoZSxmdW5jdGlvbih0KXtyZXR1cm4gdC5ldmVudC5hbGxEYXl9KTtyZXR1cm4gcGUucHJvdG90eXBlLnJlbmRlckJnU2Vncy5jYWxsKHRoaXMsbil9LHJlbmRlckZnU2VnczpmdW5jdGlvbihlKXt2YXIgbjtyZXR1cm4gZT10aGlzLnJlbmRlckZnU2VnRWxzKGUpLG49dGhpcy5yb3dTdHJ1Y3RzPXRoaXMucmVuZGVyU2VnUm93cyhlKSx0aGlzLnJvd0Vscy5lYWNoKGZ1bmN0aW9uKGUsaSl7dChpKS5maW5kKCIuZmMtY29udGVudC1za2VsZXRvbiA+IHRhYmxlIikuYXBwZW5kKG5bZV0udGJvZHlFbCl9KSxlfSx1bnJlbmRlckZnU2VnczpmdW5jdGlvbigpe2Zvcih2YXIgdCxlPXRoaXMucm93U3RydWN0c3x8W107dD1lLnBvcCgpOyl0LnRib2R5RWwucmVtb3ZlKCk7dGhpcy5yb3dTdHJ1Y3RzPW51bGx9LHJlbmRlclNlZ1Jvd3M6ZnVuY3Rpb24odCl7dmFyIGUsbixpPVtdO2ZvcihlPXRoaXMuZ3JvdXBTZWdSb3dzKHQpLG49MDtuPGUubGVuZ3RoO24rKylpLnB1c2godGhpcy5yZW5kZXJTZWdSb3cobixlW25dKSk7cmV0dXJuIGl9LGZnU2VnSHRtbDpmdW5jdGlvbih0LGUpe3ZhciBuLGkscj10aGlzLnZpZXcscz10LmV2ZW50LG89ci5pc0V2ZW50RHJhZ2dhYmxlKHMpLGw9IWUmJnMuYWxsRGF5JiZ0LmlzU3RhcnQmJnIuaXNFdmVudFJlc2l6YWJsZUZyb21TdGFydChzKSxhPSFlJiZzLmFsbERheSYmdC5pc0VuZCYmci5pc0V2ZW50UmVzaXphYmxlRnJvbUVuZChzKSx1PXRoaXMuZ2V0U2VnQ2xhc3Nlcyh0LG8sbHx8YSksZD1udCh0aGlzLmdldFNlZ1NraW5Dc3ModCkpLGM9IiI7cmV0dXJuIHUudW5zaGlmdCgiZmMtZGF5LWdyaWQtZXZlbnQiLCJmYy1oLWV2ZW50IiksdC5pc1N0YXJ0JiYobj10aGlzLmdldEV2ZW50VGltZVRleHQocyksbiYmKGM9JzxzcGFuIGNsYXNzPSJmYy10aW1lIj4nK3R0KG4pKyI8L3NwYW4+IikpLGk9JzxzcGFuIGNsYXNzPSJmYy10aXRsZSI+JysodHQocy50aXRsZXx8IiIpfHwiJm5ic3A7IikrIjwvc3Bhbj4iLCc8YSBjbGFzcz0iJyt1LmpvaW4oIiAiKSsnIicrKHMudXJsPycgaHJlZj0iJyt0dChzLnVybCkrJyInOiIiKSsoZD8nIHN0eWxlPSInK2QrJyInOiIiKSsnPjxkaXYgY2xhc3M9ImZjLWNvbnRlbnQiPicrKHRoaXMuaXNSVEw/aSsiICIrYzpjKyIgIitpKSsiPC9kaXY+IisobD8nPGRpdiBjbGFzcz0iZmMtcmVzaXplciBmYy1zdGFydC1yZXNpemVyIiAvPic6IiIpKyhhPyc8ZGl2IGNsYXNzPSJmYy1yZXNpemVyIGZjLWVuZC1yZXNpemVyIiAvPic6IiIpKyI8L2E+In0scmVuZGVyU2VnUm93OmZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gaShlKXtmb3IoO288ZTspZD0obVtyLTFdfHxbXSlbb10sZD9kLmF0dHIoInJvd3NwYW4iLHBhcnNlSW50KGQuYXR0cigicm93c3BhbiIpfHwxLDEwKSsxKTooZD10KCI8dGQvPiIpLGwuYXBwZW5kKGQpKSx2W3JdW29dPWQsbVtyXVtvXT1kLG8rK312YXIgcixzLG8sbCxhLHUsZCxjPXRoaXMuY29sQ250LGg9dGhpcy5idWlsZFNlZ0xldmVscyhuKSxmPU1hdGgubWF4KDEsaC5sZW5ndGgpLGc9dCgiPHRib2R5Lz4iKSxwPVtdLHY9W10sbT1bXTtmb3Iocj0wO3I8ZjtyKyspe2lmKHM9aFtyXSxvPTAsbD10KCI8dHIvPiIpLHAucHVzaChbXSksdi5wdXNoKFtdKSxtLnB1c2goW10pLHMpZm9yKGE9MDthPHMubGVuZ3RoO2ErKyl7Zm9yKHU9c1thXSxpKHUubGVmdENvbCksZD10KCc8dGQgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciIvPicpLmFwcGVuZCh1LmVsKSx1LmxlZnRDb2whPXUucmlnaHRDb2w/ZC5hdHRyKCJjb2xzcGFuIix1LnJpZ2h0Q29sLXUubGVmdENvbCsxKTptW3JdW29dPWQ7bzw9dS5yaWdodENvbDspdltyXVtvXT1kLHBbcl1bb109dSxvKys7bC5hcHBlbmQoZCl9aShjKSx0aGlzLmJvb2tlbmRDZWxscyhsKSxnLmFwcGVuZChsKX1yZXR1cm57cm93OmUsdGJvZHlFbDpnLGNlbGxNYXRyaXg6dixzZWdNYXRyaXg6cCxzZWdMZXZlbHM6aCxzZWdzOm59fSxidWlsZFNlZ0xldmVsczpmdW5jdGlvbih0KXt2YXIgZSxuLGkscj1bXTtmb3IodGhpcy5zb3J0RXZlbnRTZWdzKHQpLGU9MDtlPHQubGVuZ3RoO2UrKyl7Zm9yKG49dFtlXSxpPTA7aTxyLmxlbmd0aCYmTHQobixyW2ldKTtpKyspO24ubGV2ZWw9aSwocltpXXx8KHJbaV09W10pKS5wdXNoKG4pfWZvcihpPTA7aTxyLmxlbmd0aDtpKyspcltpXS5zb3J0KEJ0KTtyZXR1cm4gcn0sZ3JvdXBTZWdSb3dzOmZ1bmN0aW9uKHQpe3ZhciBlLG49W107Zm9yKGU9MDtlPHRoaXMucm93Q250O2UrKyluLnB1c2goW10pO2ZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspblt0W2VdLnJvd10ucHVzaCh0W2VdKTtyZXR1cm4gbn19KSxtZS5taXhpbih7c2VnUG9wb3ZlcjpudWxsLHBvcG92ZXJTZWdzOm51bGwscmVtb3ZlU2VnUG9wb3ZlcjpmdW5jdGlvbigpe3RoaXMuc2VnUG9wb3ZlciYmdGhpcy5zZWdQb3BvdmVyLmhpZGUoKX0sbGltaXRSb3dzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLnJvd1N0cnVjdHN8fFtdO2ZvcihlPTA7ZTxpLmxlbmd0aDtlKyspdGhpcy51bmxpbWl0Um93KGUpLG49ISF0JiYoIm51bWJlciI9PXR5cGVvZiB0P3Q6dGhpcy5jb21wdXRlUm93TGV2ZWxMaW1pdChlKSksbiE9PSExJiZ0aGlzLmxpbWl0Um93KGUsbil9LGNvbXB1dGVSb3dMZXZlbExpbWl0OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oZSxuKXtzPU1hdGgubWF4KHMsdChuKS5vdXRlckhlaWdodCgpKX12YXIgaSxyLHMsbz10aGlzLnJvd0Vscy5lcShlKSxsPW8uaGVpZ2h0KCksYT10aGlzLnJvd1N0cnVjdHNbZV0udGJvZHlFbC5jaGlsZHJlbigpO2ZvcihpPTA7aTxhLmxlbmd0aDtpKyspaWYocj1hLmVxKGkpLnJlbW92ZUNsYXNzKCJmYy1saW1pdGVkIikscz0wLHIuZmluZCgiPiB0ZCA+IDpmaXJzdC1jaGlsZCIpLmVhY2gobiksci5wb3NpdGlvbigpLnRvcCtzPmwpcmV0dXJuIGk7cmV0dXJuITF9LGxpbWl0Um93OmZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gaShpKXtmb3IoO0Q8aTspdT1TLmdldENlbGxTZWdzKGUsRCxuKSx1Lmxlbmd0aCYmKGg9c1tuLTFdW0RdLHk9Uy5yZW5kZXJNb3JlTGluayhlLEQsdSksbT10KCI8ZGl2Lz4iKS5hcHBlbmQoeSksaC5hcHBlbmQobSksRS5wdXNoKG1bMF0pKSxEKyt9dmFyIHIscyxvLGwsYSx1LGQsYyxoLGYsZyxwLHYsbSx5LFM9dGhpcyx3PXRoaXMucm93U3RydWN0c1tlXSxFPVtdLEQ9MDtpZihuJiZuPHcuc2VnTGV2ZWxzLmxlbmd0aCl7Zm9yKHI9dy5zZWdMZXZlbHNbbi0xXSxzPXcuY2VsbE1hdHJpeCxvPXcudGJvZHlFbC5jaGlsZHJlbigpLnNsaWNlKG4pLmFkZENsYXNzKCJmYy1saW1pdGVkIikuZ2V0KCksbD0wO2w8ci5sZW5ndGg7bCsrKXtmb3IoYT1yW2xdLGkoYS5sZWZ0Q29sKSxjPVtdLGQ9MDtEPD1hLnJpZ2h0Q29sOyl1PXRoaXMuZ2V0Q2VsbFNlZ3MoZSxELG4pLGMucHVzaCh1KSxkKz11Lmxlbmd0aCxEKys7aWYoZCl7Zm9yKGg9c1tuLTFdW2EubGVmdENvbF0sZj1oLmF0dHIoInJvd3NwYW4iKXx8MSxnPVtdLHA9MDtwPGMubGVuZ3RoO3ArKyl2PXQoJzx0ZCBjbGFzcz0iZmMtbW9yZS1jZWxsIi8+JykuYXR0cigicm93c3BhbiIsZiksdT1jW3BdLHk9dGhpcy5yZW5kZXJNb3JlTGluayhlLGEubGVmdENvbCtwLFthXS5jb25jYXQodSkpLG09dCgiPGRpdi8+IikuYXBwZW5kKHkpLHYuYXBwZW5kKG0pLGcucHVzaCh2WzBdKSxFLnB1c2godlswXSk7aC5hZGRDbGFzcygiZmMtbGltaXRlZCIpLmFmdGVyKHQoZykpLG8ucHVzaChoWzBdKX19aSh0aGlzLmNvbENudCksdy5tb3JlRWxzPXQoRSksdy5saW1pdGVkRWxzPXQobyl9fSx1bmxpbWl0Um93OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucm93U3RydWN0c1t0XTtlLm1vcmVFbHMmJihlLm1vcmVFbHMucmVtb3ZlKCksZS5tb3JlRWxzPW51bGwpLGUubGltaXRlZEVscyYmKGUubGltaXRlZEVscy5yZW1vdmVDbGFzcygiZmMtbGltaXRlZCIpLGUubGltaXRlZEVscz1udWxsKX0scmVuZGVyTW9yZUxpbms6ZnVuY3Rpb24oZSxuLGkpe3ZhciByPXRoaXMscz10aGlzLnZpZXc7cmV0dXJuIHQoJzxhIGNsYXNzPSJmYy1tb3JlIi8+JykudGV4dCh0aGlzLmdldE1vcmVMaW5rVGV4dChpLmxlbmd0aCkpLm9uKCJjbGljayIsZnVuY3Rpb24obyl7dmFyIGw9cy5vcHQoImV2ZW50TGltaXRDbGljayIpLGE9ci5nZXRDZWxsRGF0ZShlLG4pLHU9dCh0aGlzKSxkPXIuZ2V0Q2VsbEVsKGUsbiksYz1yLmdldENlbGxTZWdzKGUsbiksaD1yLnJlc2xpY2VEYXlTZWdzKGMsYSksZj1yLnJlc2xpY2VEYXlTZWdzKGksYSk7ImZ1bmN0aW9uIj09dHlwZW9mIGwmJihsPXMudHJpZ2dlcigiZXZlbnRMaW1pdENsaWNrIixudWxsLHtkYXRlOmEsZGF5RWw6ZCxtb3JlRWw6dSxzZWdzOmgsaGlkZGVuU2VnczpmfSxvKSksInBvcG92ZXIiPT09bD9yLnNob3dTZWdQb3BvdmVyKGUsbix1LGgpOiJzdHJpbmciPT10eXBlb2YgbCYmcy5jYWxlbmRhci56b29tVG8oYSxsKX0pfSxzaG93U2VnUG9wb3ZlcjpmdW5jdGlvbih0LGUsbixpKXt2YXIgcixzLG89dGhpcyxsPXRoaXMudmlldyxhPW4ucGFyZW50KCk7cj0xPT10aGlzLnJvd0NudD9sLmVsOnRoaXMucm93RWxzLmVxKHQpLHM9e2NsYXNzTmFtZToiZmMtbW9yZS1wb3BvdmVyIixjb250ZW50OnRoaXMucmVuZGVyU2VnUG9wb3ZlckNvbnRlbnQodCxlLGkpLHBhcmVudEVsOnRoaXMudmlldy5lbCx0b3A6ci5vZmZzZXQoKS50b3AsYXV0b0hpZGU6ITAsdmlld3BvcnRDb25zdHJhaW46bC5vcHQoInBvcG92ZXJWaWV3cG9ydENvbnN0cmFpbiIpLGhpZGU6ZnVuY3Rpb24oKXtvLnNlZ1BvcG92ZXIucmVtb3ZlRWxlbWVudCgpLG8uc2VnUG9wb3Zlcj1udWxsLG8ucG9wb3ZlclNlZ3M9bnVsbH19LHRoaXMuaXNSVEw/cy5yaWdodD1hLm9mZnNldCgpLmxlZnQrYS5vdXRlcldpZHRoKCkrMTpzLmxlZnQ9YS5vZmZzZXQoKS5sZWZ0LTEsdGhpcy5zZWdQb3BvdmVyPW5ldyBkZShzKSx0aGlzLnNlZ1BvcG92ZXIuc2hvdygpLHRoaXMuYmluZFNlZ0hhbmRsZXJzVG9FbCh0aGlzLnNlZ1BvcG92ZXIuZWwpfSxyZW5kZXJTZWdQb3BvdmVyQ29udGVudDpmdW5jdGlvbihlLG4saSl7dmFyIHIscz10aGlzLnZpZXcsbz1zLm9wdCgidGhlbWUiKSxsPXRoaXMuZ2V0Q2VsbERhdGUoZSxuKS5mb3JtYXQocy5vcHQoImRheVBvcG92ZXJGb3JtYXQiKSksYT10KCc8ZGl2IGNsYXNzPSJmYy1oZWFkZXIgJytzLndpZGdldEhlYWRlckNsYXNzKyciPjxzcGFuIGNsYXNzPSJmYy1jbG9zZSAnKyhvPyJ1aS1pY29uIHVpLWljb24tY2xvc2V0aGljayI6ImZjLWljb24gZmMtaWNvbi14IikrJyI+PC9zcGFuPjxzcGFuIGNsYXNzPSJmYy10aXRsZSI+Jyt0dChsKSsnPC9zcGFuPjxkaXYgY2xhc3M9ImZjLWNsZWFyIi8+PC9kaXY+PGRpdiBjbGFzcz0iZmMtYm9keSAnK3Mud2lkZ2V0Q29udGVudENsYXNzKyciPjxkaXYgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciI+PC9kaXY+PC9kaXY+JyksdT1hLmZpbmQoIi5mYy1ldmVudC1jb250YWluZXIiKTtmb3IoaT10aGlzLnJlbmRlckZnU2VnRWxzKGksITApLHRoaXMucG9wb3ZlclNlZ3M9aSxyPTA7cjxpLmxlbmd0aDtyKyspdGhpcy5wcmVwYXJlSGl0cygpLGlbcl0uaGl0PXRoaXMuZ2V0Q2VsbEhpdChlLG4pLHRoaXMucmVsZWFzZUhpdHMoKSx1LmFwcGVuZChpW3JdLmVsKTtyZXR1cm4gYX0scmVzbGljZURheVNlZ3M6ZnVuY3Rpb24oZSxuKXt2YXIgaT10Lm1hcChlLGZ1bmN0aW9uKHQpe3JldHVybiB0LmV2ZW50fSkscj1uLmNsb25lKCkscz1yLmNsb25lKCkuYWRkKDEsImRheXMiKSxvPXtzdGFydDpyLGVuZDpzfTtyZXR1cm4gZT10aGlzLmV2ZW50c1RvU2VncyhpLGZ1bmN0aW9uKHQpe3ZhciBlPUYodCxvKTtyZXR1cm4gZT9bZV06W119KSx0aGlzLnNvcnRFdmVudFNlZ3MoZSksZX0sZ2V0TW9yZUxpbmtUZXh0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmlldy5vcHQoImV2ZW50TGltaXRUZXh0Iik7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/ZSh0KToiKyIrdCsiICIrZX0sZ2V0Q2VsbFNlZ3M6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaSxyPXRoaXMucm93U3RydWN0c1t0XS5zZWdNYXRyaXgscz1ufHwwLG89W107czxyLmxlbmd0aDspaT1yW3NdW2VdLGkmJm8ucHVzaChpKSxzKys7cmV0dXJuIG99fSk7dmFyIHllPWp0LlRpbWVHcmlkPXBlLmV4dGVuZCh2ZSx7c2xvdER1cmF0aW9uOm51bGwsc25hcER1cmF0aW9uOm51bGwsc25hcHNQZXJTbG90Om51bGwsbWluVGltZTpudWxsLG1heFRpbWU6bnVsbCxsYWJlbEZvcm1hdDpudWxsLGxhYmVsSW50ZXJ2YWw6bnVsbCxjb2xFbHM6bnVsbCxzbGF0Q29udGFpbmVyRWw6bnVsbCxzbGF0RWxzOm51bGwsbm93SW5kaWNhdG9yRWxzOm51bGwsY29sQ29vcmRDYWNoZTpudWxsLHNsYXRDb29yZENhY2hlOm51bGwsY29uc3RydWN0b3I6ZnVuY3Rpb24oKXtwZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5wcm9jZXNzT3B0aW9ucygpfSxyZW5kZXJEYXRlczpmdW5jdGlvbigpe3RoaXMuZWwuaHRtbCh0aGlzLnJlbmRlckh0bWwoKSksdGhpcy5jb2xFbHM9dGhpcy5lbC5maW5kKCIuZmMtZGF5IiksdGhpcy5zbGF0Q29udGFpbmVyRWw9dGhpcy5lbC5maW5kKCIuZmMtc2xhdHMiKSx0aGlzLnNsYXRFbHM9dGhpcy5zbGF0Q29udGFpbmVyRWwuZmluZCgidHIiKSx0aGlzLmNvbENvb3JkQ2FjaGU9bmV3IGNlKHtlbHM6dGhpcy5jb2xFbHMsaXNIb3Jpem9udGFsOiEwfSksdGhpcy5zbGF0Q29vcmRDYWNoZT1uZXcgY2Uoe2Vsczp0aGlzLnNsYXRFbHMsaXNWZXJ0aWNhbDohMH0pLHRoaXMucmVuZGVyQ29udGVudFNrZWxldG9uKCl9LHJlbmRlckh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4nPGRpdiBjbGFzcz0iZmMtYmciPjx0YWJsZT4nK3RoaXMucmVuZGVyQmdUckh0bWwoMCkrJzwvdGFibGU+PC9kaXY+PGRpdiBjbGFzcz0iZmMtc2xhdHMiPjx0YWJsZT4nK3RoaXMucmVuZGVyU2xhdFJvd0h0bWwoKSsiPC90YWJsZT48L2Rpdj4ifSxyZW5kZXJTbGF0Um93SHRtbDpmdW5jdGlvbigpe2Zvcih2YXIgdCxuLGkscj10aGlzLnZpZXcscz10aGlzLmlzUlRMLG89IiIsbD1lLmR1cmF0aW9uKCt0aGlzLm1pblRpbWUpO2w8dGhpcy5tYXhUaW1lOyl0PXRoaXMuc3RhcnQuY2xvbmUoKS50aW1lKGwpLG49b3QoXyhsLHRoaXMubGFiZWxJbnRlcnZhbCkpLGk9Jzx0ZCBjbGFzcz0iZmMtYXhpcyBmYy10aW1lICcrci53aWRnZXRDb250ZW50Q2xhc3MrJyIgJytyLmF4aXNTdHlsZUF0dHIoKSsiPiIrKG4/IjxzcGFuPiIrdHQodC5mb3JtYXQodGhpcy5sYWJlbEZvcm1hdCkpKyI8L3NwYW4+IjoiIikrIjwvdGQ+IixvKz0nPHRyIGRhdGEtdGltZT0iJyt0LmZvcm1hdCgiSEg6bW06c3MiKSsnIicrKG4/IiI6JyBjbGFzcz0iZmMtbWlub3IiJykrIj4iKyhzPyIiOmkpKyc8dGQgY2xhc3M9Iicrci53aWRnZXRDb250ZW50Q2xhc3MrJyIvPicrKHM/aToiIikrIjwvdHI+IixsLmFkZCh0aGlzLnNsb3REdXJhdGlvbik7cmV0dXJuIG99LHByb2Nlc3NPcHRpb25zOmZ1bmN0aW9uKCl7dmFyIG4saT10aGlzLnZpZXcscj1pLm9wdCgic2xvdER1cmF0aW9uIikscz1pLm9wdCgic25hcER1cmF0aW9uIik7cj1lLmR1cmF0aW9uKHIpLHM9cz9lLmR1cmF0aW9uKHMpOnIsdGhpcy5zbG90RHVyYXRpb249cix0aGlzLnNuYXBEdXJhdGlvbj1zLHRoaXMuc25hcHNQZXJTbG90PXIvcyx0aGlzLm1pblJlc2l6ZUR1cmF0aW9uPXMsdGhpcy5taW5UaW1lPWUuZHVyYXRpb24oaS5vcHQoIm1pblRpbWUiKSksdGhpcy5tYXhUaW1lPWUuZHVyYXRpb24oaS5vcHQoIm1heFRpbWUiKSksbj1pLm9wdCgic2xvdExhYmVsRm9ybWF0IiksdC5pc0FycmF5KG4pJiYobj1uW24ubGVuZ3RoLTFdKSx0aGlzLmxhYmVsRm9ybWF0PW58fGkub3B0KCJzbWFsbFRpbWVGb3JtYXQiKSxuPWkub3B0KCJzbG90TGFiZWxJbnRlcnZhbCIpLHRoaXMubGFiZWxJbnRlcnZhbD1uP2UuZHVyYXRpb24obik6dGhpcy5jb21wdXRlTGFiZWxJbnRlcnZhbChyKX0sY29tcHV0ZUxhYmVsSW50ZXJ2YWw6ZnVuY3Rpb24odCl7dmFyIG4saSxyO2ZvcihuPU5lLmxlbmd0aC0xO24+PTA7bi0tKWlmKGk9ZS5kdXJhdGlvbihOZVtuXSkscj1fKGksdCksb3QocikmJnI+MSlyZXR1cm4gaTtyZXR1cm4gZS5kdXJhdGlvbih0KX0sY29tcHV0ZUV2ZW50VGltZUZvcm1hdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXcub3B0KCJub01lcmlkaWVtVGltZUZvcm1hdCIpfSxjb21wdXRlRGlzcGxheUV2ZW50RW5kOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHByZXBhcmVIaXRzOmZ1bmN0aW9uKCl7dGhpcy5jb2xDb29yZENhY2hlLmJ1aWxkKCksdGhpcy5zbGF0Q29vcmRDYWNoZS5idWlsZCgpfSxyZWxlYXNlSGl0czpmdW5jdGlvbigpe3RoaXMuY29sQ29vcmRDYWNoZS5jbGVhcigpfSxxdWVyeUhpdDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuc25hcHNQZXJTbG90LGk9dGhpcy5jb2xDb29yZENhY2hlLHI9dGhpcy5zbGF0Q29vcmRDYWNoZTtpZihpLmlzTGVmdEluQm91bmRzKHQpJiZyLmlzVG9wSW5Cb3VuZHMoZSkpe3ZhciBzPWkuZ2V0SG9yaXpvbnRhbEluZGV4KHQpLG89ci5nZXRWZXJ0aWNhbEluZGV4KGUpO2lmKG51bGwhPXMmJm51bGwhPW8pe3ZhciBsPXIuZ2V0VG9wT2Zmc2V0KG8pLGE9ci5nZXRIZWlnaHQobyksdT0oZS1sKS9hLGQ9TWF0aC5mbG9vcih1Km4pLGM9bypuK2QsaD1sK2QvbiphLGY9bCsoZCsxKS9uKmE7cmV0dXJue2NvbDpzLHNuYXA6Yyxjb21wb25lbnQ6dGhpcyxsZWZ0OmkuZ2V0TGVmdE9mZnNldChzKSxyaWdodDppLmdldFJpZ2h0T2Zmc2V0KHMpLHRvcDpoLGJvdHRvbTpmfX19fSxnZXRIaXRTcGFuOmZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5nZXRDZWxsRGF0ZSgwLHQuY29sKSxpPXRoaXMuY29tcHV0ZVNuYXBUaW1lKHQuc25hcCk7cmV0dXJuIG4udGltZShpKSxlPW4uY2xvbmUoKS5hZGQodGhpcy5zbmFwRHVyYXRpb24pLHtzdGFydDpuLGVuZDplfX0sZ2V0SGl0RWw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29sRWxzLmVxKHQuY29sKX0scmFuZ2VVcGRhdGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVEYXlUYWJsZSgpfSxjb21wdXRlU25hcFRpbWU6ZnVuY3Rpb24odCl7cmV0dXJuIGUuZHVyYXRpb24odGhpcy5taW5UaW1lK3RoaXMuc25hcER1cmF0aW9uKnQpfSxzcGFuVG9TZWdzOmZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5zbGljZVJhbmdlQnlUaW1lcyh0KTtmb3IoZT0wO2U8bi5sZW5ndGg7ZSsrKXRoaXMuaXNSVEw/bltlXS5jb2w9dGhpcy5kYXlzUGVyUm93LTEtbltlXS5kYXlJbmRleDpuW2VdLmNvbD1uW2VdLmRheUluZGV4O3JldHVybiBufSxzbGljZVJhbmdlQnlUaW1lczpmdW5jdGlvbih0KXt2YXIgZSxuLGkscixzPVtdO2ZvcihuPTA7bjx0aGlzLmRheXNQZXJSb3c7bisrKWk9dGhpcy5kYXlEYXRlc1tuXS5jbG9uZSgpLHI9e3N0YXJ0OmkuY2xvbmUoKS50aW1lKHRoaXMubWluVGltZSksZW5kOmkuY2xvbmUoKS50aW1lKHRoaXMubWF4VGltZSl9LGU9Rih0LHIpLGUmJihlLmRheUluZGV4PW4scy5wdXNoKGUpKTtyZXR1cm4gc30sdXBkYXRlU2l6ZTpmdW5jdGlvbih0KXt0aGlzLnNsYXRDb29yZENhY2hlLmJ1aWxkKCksdCYmdGhpcy51cGRhdGVTZWdWZXJ0aWNhbHMoW10uY29uY2F0KHRoaXMuZmdTZWdzfHxbXSx0aGlzLmJnU2Vnc3x8W10sdGhpcy5idXNpbmVzc1NlZ3N8fFtdKSl9LGdldFRvdGFsU2xhdEhlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNsYXRDb250YWluZXJFbC5vdXRlckhlaWdodCgpfSxjb21wdXRlRGF0ZVRvcDpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLmNvbXB1dGVUaW1lVG9wKGUuZHVyYXRpb24odC1uLmNsb25lKCkuc3RyaXBUaW1lKCkpKX0sY29tcHV0ZVRpbWVUb3A6ZnVuY3Rpb24odCl7dmFyIGUsbixpPXRoaXMuc2xhdEVscy5sZW5ndGgscj0odC10aGlzLm1pblRpbWUpL3RoaXMuc2xvdER1cmF0aW9uO3JldHVybiByPU1hdGgubWF4KDAscikscj1NYXRoLm1pbihpLHIpLGU9TWF0aC5mbG9vcihyKSxlPU1hdGgubWluKGUsaS0xKSxuPXItZSx0aGlzLnNsYXRDb29yZENhY2hlLmdldFRvcFBvc2l0aW9uKGUpK3RoaXMuc2xhdENvb3JkQ2FjaGUuZ2V0SGVpZ2h0KGUpKm59LHJlbmRlckRyYWc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT90aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIodCxlKTp2b2lkIHRoaXMucmVuZGVySGlnaGxpZ2h0KHRoaXMuZXZlbnRUb1NwYW4odCkpfSx1bnJlbmRlckRyYWc6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVySGVscGVyKCksdGhpcy51bnJlbmRlckhpZ2hsaWdodCgpfSxyZW5kZXJFdmVudFJlc2l6ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIodCxlKX0sdW5yZW5kZXJFdmVudFJlc2l6ZTpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJIZWxwZXIoKX0scmVuZGVySGVscGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVuZGVySGVscGVyU2Vncyh0aGlzLmV2ZW50VG9TZWdzKHQpLGUpfSx1bnJlbmRlckhlbHBlcjpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJIZWxwZXJTZWdzKCl9LHJlbmRlckJ1c2luZXNzSG91cnM6ZnVuY3Rpb24oKXt0aGlzLnJlbmRlckJ1c2luZXNzU2Vncyh0aGlzLmJ1aWxkQnVzaW5lc3NIb3VyU2VncygpKX0sdW5yZW5kZXJCdXNpbmVzc0hvdXJzOmZ1bmN0aW9uKCl7dGhpcy51bnJlbmRlckJ1c2luZXNzU2VncygpfSxnZXROb3dJbmRpY2F0b3JVbml0OmZ1bmN0aW9uKCl7cmV0dXJuIm1pbnV0ZSJ9LHJlbmRlck5vd0luZGljYXRvcjpmdW5jdGlvbihlKXt2YXIgbixpPXRoaXMuc3BhblRvU2Vncyh7c3RhcnQ6ZSxlbmQ6ZX0pLHI9dGhpcy5jb21wdXRlRGF0ZVRvcChlLGUpLHM9W107Zm9yKG49MDtuPGkubGVuZ3RoO24rKylzLnB1c2godCgnPGRpdiBjbGFzcz0iZmMtbm93LWluZGljYXRvciBmYy1ub3ctaW5kaWNhdG9yLWxpbmUiPjwvZGl2PicpLmNzcygidG9wIixyKS5hcHBlbmRUbyh0aGlzLmNvbENvbnRhaW5lckVscy5lcShpW25dLmNvbCkpWzBdKTtpLmxlbmd0aD4wJiZzLnB1c2godCgnPGRpdiBjbGFzcz0iZmMtbm93LWluZGljYXRvciBmYy1ub3ctaW5kaWNhdG9yLWFycm93Ij48L2Rpdj4nKS5jc3MoInRvcCIscikuYXBwZW5kVG8odGhpcy5lbC5maW5kKCIuZmMtY29udGVudC1za2VsZXRvbiIpKVswXSksdGhpcy5ub3dJbmRpY2F0b3JFbHM9dChzKX0sdW5yZW5kZXJOb3dJbmRpY2F0b3I6ZnVuY3Rpb24oKXt0aGlzLm5vd0luZGljYXRvckVscyYmKHRoaXMubm93SW5kaWNhdG9yRWxzLnJlbW92ZSgpLHRoaXMubm93SW5kaWNhdG9yRWxzPW51bGwpfSxyZW5kZXJTZWxlY3Rpb246ZnVuY3Rpb24odCl7dGhpcy52aWV3Lm9wdCgic2VsZWN0SGVscGVyIik/dGhpcy5yZW5kZXJFdmVudExvY2F0aW9uSGVscGVyKHQpOnRoaXMucmVuZGVySGlnaGxpZ2h0KHQpfSx1bnJlbmRlclNlbGVjdGlvbjpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJIZWxwZXIoKSx0aGlzLnVucmVuZGVySGlnaGxpZ2h0KCl9LHJlbmRlckhpZ2hsaWdodDpmdW5jdGlvbih0KXt0aGlzLnJlbmRlckhpZ2hsaWdodFNlZ3ModGhpcy5zcGFuVG9TZWdzKHQpKX0sdW5yZW5kZXJIaWdobGlnaHQ6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVySGlnaGxpZ2h0U2VncygpfX0pO3llLm1peGluKHtjb2xDb250YWluZXJFbHM6bnVsbCxmZ0NvbnRhaW5lckVsczpudWxsLGJnQ29udGFpbmVyRWxzOm51bGwsaGVscGVyQ29udGFpbmVyRWxzOm51bGwsaGlnaGxpZ2h0Q29udGFpbmVyRWxzOm51bGwsYnVzaW5lc3NDb250YWluZXJFbHM6bnVsbCxmZ1NlZ3M6bnVsbCxiZ1NlZ3M6bnVsbCxoZWxwZXJTZWdzOm51bGwsaGlnaGxpZ2h0U2VnczpudWxsLGJ1c2luZXNzU2VnczpudWxsLHJlbmRlckNvbnRlbnRTa2VsZXRvbjpmdW5jdGlvbigpe3ZhciBlLG4saT0iIjtmb3IoZT0wO2U8dGhpcy5jb2xDbnQ7ZSsrKWkrPSc8dGQ+PGRpdiBjbGFzcz0iZmMtY29udGVudC1jb2wiPjxkaXYgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciBmYy1oZWxwZXItY29udGFpbmVyIj48L2Rpdj48ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIiPjwvZGl2PjxkaXYgY2xhc3M9ImZjLWhpZ2hsaWdodC1jb250YWluZXIiPjwvZGl2PjxkaXYgY2xhc3M9ImZjLWJnZXZlbnQtY29udGFpbmVyIj48L2Rpdj48ZGl2IGNsYXNzPSJmYy1idXNpbmVzcy1jb250YWluZXIiPjwvZGl2PjwvZGl2PjwvdGQ+JztuPXQoJzxkaXYgY2xhc3M9ImZjLWNvbnRlbnQtc2tlbGV0b24iPjx0YWJsZT48dHI+JytpKyI8L3RyPjwvdGFibGU+PC9kaXY+IiksdGhpcy5jb2xDb250YWluZXJFbHM9bi5maW5kKCIuZmMtY29udGVudC1jb2wiKSx0aGlzLmhlbHBlckNvbnRhaW5lckVscz1uLmZpbmQoIi5mYy1oZWxwZXItY29udGFpbmVyIiksdGhpcy5mZ0NvbnRhaW5lckVscz1uLmZpbmQoIi5mYy1ldmVudC1jb250YWluZXI6bm90KC5mYy1oZWxwZXItY29udGFpbmVyKSIpLHRoaXMuYmdDb250YWluZXJFbHM9bi5maW5kKCIuZmMtYmdldmVudC1jb250YWluZXIiKSx0aGlzLmhpZ2hsaWdodENvbnRhaW5lckVscz1uLmZpbmQoIi5mYy1oaWdobGlnaHQtY29udGFpbmVyIiksdGhpcy5idXNpbmVzc0NvbnRhaW5lckVscz1uLmZpbmQoIi5mYy1idXNpbmVzcy1jb250YWluZXIiKSx0aGlzLmJvb2tlbmRDZWxscyhuLmZpbmQoInRyIikpLHRoaXMuZWwuYXBwZW5kKG4pfSxyZW5kZXJGZ1NlZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dGhpcy5yZW5kZXJGZ1NlZ3NJbnRvQ29udGFpbmVycyh0LHRoaXMuZmdDb250YWluZXJFbHMpLHRoaXMuZmdTZWdzPXQsdH0sdW5yZW5kZXJGZ1NlZ3M6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVyTmFtZWRTZWdzKCJmZ1NlZ3MiKX0scmVuZGVySGVscGVyU2VnczpmdW5jdGlvbihlLG4pe3ZhciBpLHIscyxvPVtdO2ZvcihlPXRoaXMucmVuZGVyRmdTZWdzSW50b0NvbnRhaW5lcnMoZSx0aGlzLmhlbHBlckNvbnRhaW5lckVscyksaT0wO2k8ZS5sZW5ndGg7aSsrKXI9ZVtpXSxuJiZuLmNvbD09PXIuY29sJiYocz1uLmVsLHIuZWwuY3NzKHtsZWZ0OnMuY3NzKCJsZWZ0IikscmlnaHQ6cy5jc3MoInJpZ2h0IiksIm1hcmdpbi1sZWZ0IjpzLmNzcygibWFyZ2luLWxlZnQiKSwibWFyZ2luLXJpZ2h0IjpzLmNzcygibWFyZ2luLXJpZ2h0Iil9KSksby5wdXNoKHIuZWxbMF0pO3JldHVybiB0aGlzLmhlbHBlclNlZ3M9ZSx0KG8pfSx1bnJlbmRlckhlbHBlclNlZ3M6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVyTmFtZWRTZWdzKCJoZWxwZXJTZWdzIil9LHJlbmRlckJnU2VnczpmdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLnJlbmRlckZpbGxTZWdFbHMoImJnRXZlbnQiLHQpLHRoaXMudXBkYXRlU2VnVmVydGljYWxzKHQpLHRoaXMuYXR0YWNoU2Vnc0J5Q29sKHRoaXMuZ3JvdXBTZWdzQnlDb2wodCksdGhpcy5iZ0NvbnRhaW5lckVscyksdGhpcy5iZ1NlZ3M9dCx0fSx1bnJlbmRlckJnU2VnczpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJOYW1lZFNlZ3MoImJnU2VncyIpfSxyZW5kZXJIaWdobGlnaHRTZWdzOmZ1bmN0aW9uKHQpe3Q9dGhpcy5yZW5kZXJGaWxsU2VnRWxzKCJoaWdobGlnaHQiLHQpLHRoaXMudXBkYXRlU2VnVmVydGljYWxzKHQpLHRoaXMuYXR0YWNoU2Vnc0J5Q29sKHRoaXMuZ3JvdXBTZWdzQnlDb2wodCksdGhpcy5oaWdobGlnaHRDb250YWluZXJFbHMpLHRoaXMuaGlnaGxpZ2h0U2Vncz10fSx1bnJlbmRlckhpZ2hsaWdodFNlZ3M6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVyTmFtZWRTZWdzKCJoaWdobGlnaHRTZWdzIil9LHJlbmRlckJ1c2luZXNzU2VnczpmdW5jdGlvbih0KXt0PXRoaXMucmVuZGVyRmlsbFNlZ0VscygiYnVzaW5lc3NIb3VycyIsdCksdGhpcy51cGRhdGVTZWdWZXJ0aWNhbHModCksdGhpcy5hdHRhY2hTZWdzQnlDb2wodGhpcy5ncm91cFNlZ3NCeUNvbCh0KSx0aGlzLmJ1c2luZXNzQ29udGFpbmVyRWxzKSx0aGlzLmJ1c2luZXNzU2Vncz10fSx1bnJlbmRlckJ1c2luZXNzU2VnczpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJOYW1lZFNlZ3MoImJ1c2luZXNzU2VncyIpfSxncm91cFNlZ3NCeUNvbDpmdW5jdGlvbih0KXt2YXIgZSxuPVtdO2ZvcihlPTA7ZTx0aGlzLmNvbENudDtlKyspbi5wdXNoKFtdKTtmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKW5bdFtlXS5jb2xdLnB1c2godFtlXSk7cmV0dXJuIG59LGF0dGFjaFNlZ3NCeUNvbDpmdW5jdGlvbih0LGUpe3ZhciBuLGkscjtmb3Iobj0wO248dGhpcy5jb2xDbnQ7bisrKWZvcihpPXRbbl0scj0wO3I8aS5sZW5ndGg7cisrKWUuZXEobikuYXBwZW5kKGlbcl0uZWwpfSx1bnJlbmRlck5hbWVkU2VnczpmdW5jdGlvbih0KXt2YXIgZSxuPXRoaXNbdF07aWYobil7Zm9yKGU9MDtlPG4ubGVuZ3RoO2UrKyluW2VdLmVsLnJlbW92ZSgpO3RoaXNbdF09bnVsbH19LHJlbmRlckZnU2Vnc0ludG9Db250YWluZXJzOmZ1bmN0aW9uKHQsZSl7dmFyIG4saTtmb3IodD10aGlzLnJlbmRlckZnU2VnRWxzKHQpLG49dGhpcy5ncm91cFNlZ3NCeUNvbCh0KSxpPTA7aTx0aGlzLmNvbENudDtpKyspdGhpcy51cGRhdGVGZ1NlZ0Nvb3JkcyhuW2ldKTtyZXR1cm4gdGhpcy5hdHRhY2hTZWdzQnlDb2wobixlKSx0fSxmZ1NlZ0h0bWw6ZnVuY3Rpb24odCxlKXt2YXIgbixpLHIscz10aGlzLnZpZXcsbz10LmV2ZW50LGw9cy5pc0V2ZW50RHJhZ2dhYmxlKG8pLGE9IWUmJnQuaXNTdGFydCYmcy5pc0V2ZW50UmVzaXphYmxlRnJvbVN0YXJ0KG8pLHU9IWUmJnQuaXNFbmQmJnMuaXNFdmVudFJlc2l6YWJsZUZyb21FbmQobyksZD10aGlzLmdldFNlZ0NsYXNzZXModCxsLGF8fHUpLGM9bnQodGhpcy5nZXRTZWdTa2luQ3NzKHQpKTtyZXR1cm4gZC51bnNoaWZ0KCJmYy10aW1lLWdyaWQtZXZlbnQiLCJmYy12LWV2ZW50Iikscy5pc011bHRpRGF5RXZlbnQobyk/KHQuaXNTdGFydHx8dC5pc0VuZCkmJihuPXRoaXMuZ2V0RXZlbnRUaW1lVGV4dCh0KSxpPXRoaXMuZ2V0RXZlbnRUaW1lVGV4dCh0LCJMVCIpLHI9dGhpcy5nZXRFdmVudFRpbWVUZXh0KHQsbnVsbCwhMSkpOihuPXRoaXMuZ2V0RXZlbnRUaW1lVGV4dChvKSxpPXRoaXMuZ2V0RXZlbnRUaW1lVGV4dChvLCJMVCIpLHI9dGhpcy5nZXRFdmVudFRpbWVUZXh0KG8sbnVsbCwhMSkpLCc8YSBjbGFzcz0iJytkLmpvaW4oIiAiKSsnIicrKG8udXJsPycgaHJlZj0iJyt0dChvLnVybCkrJyInOiIiKSsoYz8nIHN0eWxlPSInK2MrJyInOiIiKSsnPjxkaXYgY2xhc3M9ImZjLWNvbnRlbnQiPicrKG4/JzxkaXYgY2xhc3M9ImZjLXRpbWUiIGRhdGEtc3RhcnQ9IicrdHQocikrJyIgZGF0YS1mdWxsPSInK3R0KGkpKyciPjxzcGFuPicrdHQobikrIjwvc3Bhbj48L2Rpdj4iOiIiKSsoby50aXRsZT8nPGRpdiBjbGFzcz0iZmMtdGl0bGUiPicrdHQoby50aXRsZSkrIjwvZGl2PiI6IiIpKyc8L2Rpdj48ZGl2IGNsYXNzPSJmYy1iZyIvPicrKHU/JzxkaXYgY2xhc3M9ImZjLXJlc2l6ZXIgZmMtZW5kLXJlc2l6ZXIiIC8+JzoiIikrIjwvYT4ifSx1cGRhdGVTZWdWZXJ0aWNhbHM6ZnVuY3Rpb24odCl7dGhpcy5jb21wdXRlU2VnVmVydGljYWxzKHQpLHRoaXMuYXNzaWduU2VnVmVydGljYWxzKHQpfSxjb21wdXRlU2VnVmVydGljYWxzOmZ1bmN0aW9uKHQpe3ZhciBlLG47Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyluPXRbZV0sbi50b3A9dGhpcy5jb21wdXRlRGF0ZVRvcChuLnN0YXJ0LG4uc3RhcnQpLG4uYm90dG9tPXRoaXMuY29tcHV0ZURhdGVUb3Aobi5lbmQsbi5zdGFydCl9LGFzc2lnblNlZ1ZlcnRpY2FsczpmdW5jdGlvbih0KXt2YXIgZSxuO2ZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspbj10W2VdLG4uZWwuY3NzKHRoaXMuZ2VuZXJhdGVTZWdWZXJ0aWNhbENzcyhuKSl9LGdlbmVyYXRlU2VnVmVydGljYWxDc3M6ZnVuY3Rpb24odCl7cmV0dXJue3RvcDp0LnRvcCxib3R0b206LXQuYm90dG9tfX0sdXBkYXRlRmdTZWdDb29yZHM6ZnVuY3Rpb24odCl7dGhpcy5jb21wdXRlU2VnVmVydGljYWxzKHQpLHRoaXMuY29tcHV0ZUZnU2VnSG9yaXpvbnRhbHModCksdGhpcy5hc3NpZ25TZWdWZXJ0aWNhbHModCksdGhpcy5hc3NpZ25GZ1NlZ0hvcml6b250YWxzKHQpfSxjb21wdXRlRmdTZWdIb3Jpem9udGFsczpmdW5jdGlvbih0KXt2YXIgZSxuLGk7aWYodGhpcy5zb3J0RXZlbnRTZWdzKHQpLGU9enQodCksRnQoZSksbj1lWzBdKXtmb3IoaT0wO2k8bi5sZW5ndGg7aSsrKU50KG5baV0pO2ZvcihpPTA7aTxuLmxlbmd0aDtpKyspdGhpcy5jb21wdXRlRmdTZWdGb3J3YXJkQmFjayhuW2ldLDAsMCl9fSxjb21wdXRlRmdTZWdGb3J3YXJkQmFjazpmdW5jdGlvbih0LGUsbil7dmFyIGkscj10LmZvcndhcmRTZWdzO2lmKHZvaWQgMD09PXQuZm9yd2FyZENvb3JkKWZvcihyLmxlbmd0aD8odGhpcy5zb3J0Rm9yd2FyZFNlZ3MociksdGhpcy5jb21wdXRlRmdTZWdGb3J3YXJkQmFjayhyWzBdLGUrMSxuKSx0LmZvcndhcmRDb29yZD1yWzBdLmJhY2t3YXJkQ29vcmQpOnQuZm9yd2FyZENvb3JkPTEsdC5iYWNrd2FyZENvb3JkPXQuZm9yd2FyZENvb3JkLSh0LmZvcndhcmRDb29yZC1uKS8oZSsxKSxpPTA7aTxyLmxlbmd0aDtpKyspdGhpcy5jb21wdXRlRmdTZWdGb3J3YXJkQmFjayhyW2ldLDAsdC5mb3J3YXJkQ29vcmQpfSxzb3J0Rm9yd2FyZFNlZ3M6ZnVuY3Rpb24odCl7dC5zb3J0KGx0KHRoaXMsImNvbXBhcmVGb3J3YXJkU2VncyIpKX0sY29tcGFyZUZvcndhcmRTZWdzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZm9yd2FyZFByZXNzdXJlLXQuZm9yd2FyZFByZXNzdXJlfHwodC5iYWNrd2FyZENvb3JkfHwwKS0oZS5iYWNrd2FyZENvb3JkfHwwKXx8dGhpcy5jb21wYXJlRXZlbnRTZWdzKHQsZSl9LGFzc2lnbkZnU2VnSG9yaXpvbnRhbHM6ZnVuY3Rpb24odCl7dmFyIGUsbjtmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKW49dFtlXSxuLmVsLmNzcyh0aGlzLmdlbmVyYXRlRmdTZWdIb3Jpem9udGFsQ3NzKG4pKSxuLmJvdHRvbS1uLnRvcDwzMCYmbi5lbC5hZGRDbGFzcygiZmMtc2hvcnQiKX0sZ2VuZXJhdGVGZ1NlZ0hvcml6b250YWxDc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixpPXRoaXMudmlldy5vcHQoInNsb3RFdmVudE92ZXJsYXAiKSxyPXQuYmFja3dhcmRDb29yZCxzPXQuZm9yd2FyZENvb3JkLG89dGhpcy5nZW5lcmF0ZVNlZ1ZlcnRpY2FsQ3NzKHQpO3JldHVybiBpJiYocz1NYXRoLm1pbigxLHIrMioocy1yKSkpLHRoaXMuaXNSVEw/KGU9MS1zLG49cik6KGU9cixuPTEtcyksby56SW5kZXg9dC5sZXZlbCsxLG8ubGVmdD0xMDAqZSsiJSIsby5yaWdodD0xMDAqbisiJSIsaSYmdC5mb3J3YXJkUHJlc3N1cmUmJihvW3RoaXMuaXNSVEw/Im1hcmdpbkxlZnQiOiJtYXJnaW5SaWdodCJdPTIwKSxvfX0pO3ZhciBTZT1qdC5WaWV3PXd0LmV4dGVuZChsZSxhZSx7dHlwZTpudWxsLG5hbWU6bnVsbCx0aXRsZTpudWxsLGNhbGVuZGFyOm51bGwsb3B0aW9uczpudWxsLGVsOm51bGwsZGlzcGxheWluZzpudWxsLGlzU2tlbGV0b25SZW5kZXJlZDohMSxpc0V2ZW50c1JlbmRlcmVkOiExLHN0YXJ0Om51bGwsZW5kOm51bGwsaW50ZXJ2YWxTdGFydDpudWxsLGludGVydmFsRW5kOm51bGwsaW50ZXJ2YWxEdXJhdGlvbjpudWxsLGludGVydmFsVW5pdDpudWxsLGlzUlRMOiExLGlzU2VsZWN0ZWQ6ITEsc2VsZWN0ZWRFdmVudDpudWxsLGV2ZW50T3JkZXJTcGVjczpudWxsLHdpZGdldEhlYWRlckNsYXNzOm51bGwsd2lkZ2V0Q29udGVudENsYXNzOm51bGwsaGlnaGxpZ2h0U3RhdGVDbGFzczpudWxsLG5leHREYXlUaHJlc2hvbGQ6bnVsbCxpc0hpZGRlbkRheUhhc2g6bnVsbCxpc05vd0luZGljYXRvclJlbmRlcmVkOm51bGwsaW5pdGlhbE5vd0RhdGU6bnVsbCxpbml0aWFsTm93UXVlcmllZE1zOm51bGwsbm93SW5kaWNhdG9yVGltZW91dElEOm51bGwsbm93SW5kaWNhdG9ySW50ZXJ2YWxJRDpudWxsLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKHQsbixpLHIpe3RoaXMuY2FsZW5kYXI9dCx0aGlzLnR5cGU9dGhpcy5uYW1lPW4sdGhpcy5vcHRpb25zPWksdGhpcy5pbnRlcnZhbER1cmF0aW9uPXJ8fGUuZHVyYXRpb24oMSwiZGF5IiksdGhpcy5uZXh0RGF5VGhyZXNob2xkPWUuZHVyYXRpb24odGhpcy5vcHQoIm5leHREYXlUaHJlc2hvbGQiKSksdGhpcy5pbml0VGhlbWluZ1Byb3BzKCksdGhpcy5pbml0SGlkZGVuRGF5cygpLHRoaXMuaXNSVEw9dGhpcy5vcHQoImlzUlRMIiksdGhpcy5ldmVudE9yZGVyU3BlY3M9TSh0aGlzLm9wdCgiZXZlbnRPcmRlciIpKSx0aGlzLmluaXRpYWxpemUoKX0saW5pdGlhbGl6ZTpmdW5jdGlvbigpe30sb3B0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnNbdF19LHRyaWdnZXI6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNhbGVuZGFyO3JldHVybiBuLnRyaWdnZXIuYXBwbHkobixbdCxlfHx0aGlzXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpLFt0aGlzXSkpfSxzZXREYXRlOmZ1bmN0aW9uKHQpe3RoaXMuc2V0UmFuZ2UodGhpcy5jb21wdXRlUmFuZ2UodCkpfSxzZXRSYW5nZTpmdW5jdGlvbihlKXt0LmV4dGVuZCh0aGlzLGUpLHRoaXMudXBkYXRlVGl0bGUoKX0sY29tcHV0ZVJhbmdlOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT1PKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbikscj10LmNsb25lKCkuc3RhcnRPZihpKSxzPXIuY2xvbmUoKS5hZGQodGhpcy5pbnRlcnZhbER1cmF0aW9uKTtyZXR1cm4veWVhcnxtb250aHx3ZWVrfGRheS8udGVzdChpKT8oci5zdHJpcFRpbWUoKSxzLnN0cmlwVGltZSgpKTooci5oYXNUaW1lKCl8fChyPXRoaXMuY2FsZW5kYXIudGltZSgwKSkscy5oYXNUaW1lKCl8fChzPXRoaXMuY2FsZW5kYXIudGltZSgwKSkpLGU9ci5jbG9uZSgpLGU9dGhpcy5za2lwSGlkZGVuRGF5cyhlKSxuPXMuY2xvbmUoKSxuPXRoaXMuc2tpcEhpZGRlbkRheXMobiwtMSwhMCkse2ludGVydmFsVW5pdDppLGludGVydmFsU3RhcnQ6cixpbnRlcnZhbEVuZDpzLHN0YXJ0OmUsZW5kOm59fSxjb21wdXRlUHJldkRhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWFzc2FnZUN1cnJlbnREYXRlKHQuY2xvbmUoKS5zdGFydE9mKHRoaXMuaW50ZXJ2YWxVbml0KS5zdWJ0cmFjdCh0aGlzLmludGVydmFsRHVyYXRpb24pLC0xKX0sY29tcHV0ZU5leHREYXRlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1hc3NhZ2VDdXJyZW50RGF0ZSh0LmNsb25lKCkuc3RhcnRPZih0aGlzLmludGVydmFsVW5pdCkuYWRkKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbikpfSxtYXNzYWdlQ3VycmVudERhdGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pbnRlcnZhbER1cmF0aW9uLmFzKCJkYXlzIik8PTEmJnRoaXMuaXNIaWRkZW5EYXkodCkmJih0PXRoaXMuc2tpcEhpZGRlbkRheXModCxlKSx0LnN0YXJ0T2YoImRheSIpKSx0fSx1cGRhdGVUaXRsZTpmdW5jdGlvbigpe3RoaXMudGl0bGU9dGhpcy5jb21wdXRlVGl0bGUoKX0sY29tcHV0ZVRpdGxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZm9ybWF0UmFuZ2Uoe3N0YXJ0OnRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZSh0aGlzLmludGVydmFsU3RhcnQpLGVuZDp0aGlzLmNhbGVuZGFyLmFwcGx5VGltZXpvbmUodGhpcy5pbnRlcnZhbEVuZCl9LHRoaXMub3B0KCJ0aXRsZUZvcm1hdCIpfHx0aGlzLmNvbXB1dGVUaXRsZUZvcm1hdCgpLHRoaXMub3B0KCJ0aXRsZVJhbmdlU2VwYXJhdG9yIikpfSxjb21wdXRlVGl0bGVGb3JtYXQ6ZnVuY3Rpb24oKXtyZXR1cm4ieWVhciI9PXRoaXMuaW50ZXJ2YWxVbml0PyJZWVlZIjoibW9udGgiPT10aGlzLmludGVydmFsVW5pdD90aGlzLm9wdCgibW9udGhZZWFyRm9ybWF0Iik6dGhpcy5pbnRlcnZhbER1cmF0aW9uLmFzKCJkYXlzIik+MT8ibGwiOiJMTCJ9LGZvcm1hdFJhbmdlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10LmVuZDtyZXR1cm4gaS5oYXNUaW1lKCl8fChpPWkuY2xvbmUoKS5zdWJ0cmFjdCgxKSkscHQodC5zdGFydCxpLGUsbix0aGlzLm9wdCgiaXNSVEwiKSl9LGdldEFsbERheUh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHQoImFsbERheUh0bWwiKXx8dHQodGhpcy5vcHQoImFsbERheVRleHQiKSl9LGJ1aWxkR290b0FuY2hvckh0bWw6ZnVuY3Rpb24oZSxuLGkpe3ZhciByLHMsbyxsO3JldHVybiB0LmlzUGxhaW5PYmplY3QoZSk/KHI9ZS5kYXRlLHM9ZS50eXBlLG89ZS5mb3JjZU9mZik6cj1lLHI9anQubW9tZW50KHIpLGw9e2RhdGU6ci5mb3JtYXQoIllZWVktTU0tREQiKSx0eXBlOnN8fCJkYXkifSwic3RyaW5nIj09dHlwZW9mIG4mJihpPW4sbj1udWxsKSxuPW4/IiAiK2l0KG4pOiIiLGk9aXx8IiIsIW8mJnRoaXMub3B0KCJuYXZMaW5rcyIpPyI8YSIrbisnIGRhdGEtZ290bz0iJyt0dChKU09OLnN0cmluZ2lmeShsKSkrJyI+JytpKyI8L2E+IjoiPHNwYW4iK24rIj4iK2krIjwvc3Bhbj4ifSxzZXRFbGVtZW50OmZ1bmN0aW9uKHQpe3RoaXMuZWw9dCx0aGlzLmJpbmRHbG9iYWxIYW5kbGVycygpfSxyZW1vdmVFbGVtZW50OmZ1bmN0aW9uKCl7dGhpcy5jbGVhcigpLHRoaXMuaXNTa2VsZXRvblJlbmRlcmVkJiYodGhpcy51bnJlbmRlclNrZWxldG9uKCksdGhpcy5pc1NrZWxldG9uUmVuZGVyZWQ9ITEpLHRoaXMudW5iaW5kR2xvYmFsSGFuZGxlcnMoKSx0aGlzLmVsLnJlbW92ZSgpfSxkaXNwbGF5OmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxpPW51bGw7cmV0dXJuIG51bGwhPWUmJnRoaXMuZGlzcGxheWluZyYmKGk9dGhpcy5xdWVyeVNjcm9sbCgpKSx0aGlzLmNhbGVuZGFyLmZyZWV6ZUNvbnRlbnRIZWlnaHQoKSx1dCh0aGlzLmNsZWFyKCksZnVuY3Rpb24oKXtyZXR1cm4gbi5kaXNwbGF5aW5nPXV0KG4uZGlzcGxheVZpZXcodCksZnVuY3Rpb24oKXtudWxsIT1lP24uc2V0U2Nyb2xsKGUpOm4uZm9yY2VTY3JvbGwobi5jb21wdXRlSW5pdGlhbFNjcm9sbChpKSksbi5jYWxlbmRhci51bmZyZWV6ZUNvbnRlbnRIZWlnaHQoKSxuLnRyaWdnZXJSZW5kZXIoKX0pfSl9LGNsZWFyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXRoaXMuZGlzcGxheWluZztyZXR1cm4gbj91dChuLGZ1bmN0aW9uKCl7cmV0dXJuIGUuZGlzcGxheWluZz1udWxsLGUuY2xlYXJFdmVudHMoKSxlLmNsZWFyVmlldygpfSk6dC53aGVuKCl9LGRpc3BsYXlWaWV3OmZ1bmN0aW9uKHQpe3RoaXMuaXNTa2VsZXRvblJlbmRlcmVkfHwodGhpcy5yZW5kZXJTa2VsZXRvbigpLHRoaXMuaXNTa2VsZXRvblJlbmRlcmVkPSEwKSx0JiZ0aGlzLnNldERhdGUodCksdGhpcy5yZW5kZXImJnRoaXMucmVuZGVyKCksdGhpcy5yZW5kZXJEYXRlcygpLHRoaXMudXBkYXRlU2l6ZSgpLHRoaXMucmVuZGVyQnVzaW5lc3NIb3VycygpLHRoaXMuc3RhcnROb3dJbmRpY2F0b3IoKX0sY2xlYXJWaWV3OmZ1bmN0aW9uKCl7dGhpcy51bnNlbGVjdCgpLHRoaXMuc3RvcE5vd0luZGljYXRvcigpLHRoaXMudHJpZ2dlclVucmVuZGVyKCksdGhpcy51bnJlbmRlckJ1c2luZXNzSG91cnMoKSx0aGlzLnVucmVuZGVyRGF0ZXMoKSx0aGlzLmRlc3Ryb3kmJnRoaXMuZGVzdHJveSgpfSxyZW5kZXJTa2VsZXRvbjpmdW5jdGlvbigpe30sdW5yZW5kZXJTa2VsZXRvbjpmdW5jdGlvbigpe30scmVuZGVyRGF0ZXM6ZnVuY3Rpb24oKXt9LHVucmVuZGVyRGF0ZXM6ZnVuY3Rpb24oKXt9LHRyaWdnZXJSZW5kZXI6ZnVuY3Rpb24oKXt0aGlzLnRyaWdnZXIoInZpZXdSZW5kZXIiLHRoaXMsdGhpcyx0aGlzLmVsKX0sdHJpZ2dlclVucmVuZGVyOmZ1bmN0aW9uKCl7dGhpcy50cmlnZ2VyKCJ2aWV3RGVzdHJveSIsdGhpcyx0aGlzLHRoaXMuZWwpfSxiaW5kR2xvYmFsSGFuZGxlcnM6ZnVuY3Rpb24oKXt0aGlzLmxpc3RlblRvKHQoZG9jdW1lbnQpLCJtb3VzZWRvd24iLHRoaXMuaGFuZGxlRG9jdW1lbnRNb3VzZWRvd24pLHRoaXMubGlzdGVuVG8odChkb2N1bWVudCksInRvdWNoc3RhcnQiLHRoaXMucHJvY2Vzc1Vuc2VsZWN0KX0sdW5iaW5kR2xvYmFsSGFuZGxlcnM6ZnVuY3Rpb24oKXt0aGlzLnN0b3BMaXN0ZW5pbmdUbyh0KGRvY3VtZW50KSl9LGluaXRUaGVtaW5nUHJvcHM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdCgidGhlbWUiKT8idWkiOiJmYyI7dGhpcy53aWRnZXRIZWFkZXJDbGFzcz10KyItd2lkZ2V0LWhlYWRlciIsdGhpcy53aWRnZXRDb250ZW50Q2xhc3M9dCsiLXdpZGdldC1jb250ZW50Iix0aGlzLmhpZ2hsaWdodFN0YXRlQ2xhc3M9dCsiLXN0YXRlLWhpZ2hsaWdodCJ9LHJlbmRlckJ1c2luZXNzSG91cnM6ZnVuY3Rpb24oKXt9LHVucmVuZGVyQnVzaW5lc3NIb3VyczpmdW5jdGlvbigpe30sc3RhcnROb3dJbmRpY2F0b3I6ZnVuY3Rpb24oKXt2YXIgdCxuLGkscj10aGlzO3RoaXMub3B0KCJub3dJbmRpY2F0b3IiKSYmKHQ9dGhpcy5nZXROb3dJbmRpY2F0b3JVbml0KCksdCYmKG49bHQodGhpcywidXBkYXRlTm93SW5kaWNhdG9yIiksdGhpcy5pbml0aWFsTm93RGF0ZT10aGlzLmNhbGVuZGFyLmdldE5vdygpLHRoaXMuaW5pdGlhbE5vd1F1ZXJpZWRNcz0rbmV3IERhdGUsdGhpcy5yZW5kZXJOb3dJbmRpY2F0b3IodGhpcy5pbml0aWFsTm93RGF0ZSksdGhpcy5pc05vd0luZGljYXRvclJlbmRlcmVkPSEwLGk9dGhpcy5pbml0aWFsTm93RGF0ZS5jbG9uZSgpLnN0YXJ0T2YodCkuYWRkKDEsdCktdGhpcy5pbml0aWFsTm93RGF0ZSx0aGlzLm5vd0luZGljYXRvclRpbWVvdXRJRD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5ub3dJbmRpY2F0b3JUaW1lb3V0SUQ9bnVsbCxuKCksaT0rZS5kdXJhdGlvbigxLHQpLGk9TWF0aC5tYXgoMTAwLGkpLHIubm93SW5kaWNhdG9ySW50ZXJ2YWxJRD1zZXRJbnRlcnZhbChuLGkpfSxpKSkpfSx1cGRhdGVOb3dJbmRpY2F0b3I6ZnVuY3Rpb24oKXt0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQmJih0aGlzLnVucmVuZGVyTm93SW5kaWNhdG9yKCksdGhpcy5yZW5kZXJOb3dJbmRpY2F0b3IodGhpcy5pbml0aWFsTm93RGF0ZS5jbG9uZSgpLmFkZChuZXcgRGF0ZS10aGlzLmluaXRpYWxOb3dRdWVyaWVkTXMpKSl9LHN0b3BOb3dJbmRpY2F0b3I6ZnVuY3Rpb24oKXt0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQmJih0aGlzLm5vd0luZGljYXRvclRpbWVvdXRJRCYmKGNsZWFyVGltZW91dCh0aGlzLm5vd0luZGljYXRvclRpbWVvdXRJRCksdGhpcy5ub3dJbmRpY2F0b3JUaW1lb3V0SUQ9bnVsbCksdGhpcy5ub3dJbmRpY2F0b3JJbnRlcnZhbElEJiYoY2xlYXJUaW1lb3V0KHRoaXMubm93SW5kaWNhdG9ySW50ZXJ2YWxJRCksdGhpcy5ub3dJbmRpY2F0b3JJbnRlcnZhbElEPW51bGwpLHRoaXMudW5yZW5kZXJOb3dJbmRpY2F0b3IoKSx0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQ9ITEpfSxnZXROb3dJbmRpY2F0b3JVbml0OmZ1bmN0aW9uKCl7fSxyZW5kZXJOb3dJbmRpY2F0b3I6ZnVuY3Rpb24odCl7fSx1bnJlbmRlck5vd0luZGljYXRvcjpmdW5jdGlvbigpe30sdXBkYXRlU2l6ZTpmdW5jdGlvbih0KXt2YXIgZTt0JiYoZT10aGlzLnF1ZXJ5U2Nyb2xsKCkpLHRoaXMudXBkYXRlSGVpZ2h0KHQpLHRoaXMudXBkYXRlV2lkdGgodCksdGhpcy51cGRhdGVOb3dJbmRpY2F0b3IoKSx0JiZ0aGlzLnNldFNjcm9sbChlKX0sdXBkYXRlV2lkdGg6ZnVuY3Rpb24odCl7fSx1cGRhdGVIZWlnaHQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jYWxlbmRhcjt0aGlzLnNldEhlaWdodChlLmdldFN1Z2dlc3RlZFZpZXdIZWlnaHQoKSxlLmlzSGVpZ2h0QXV0bygpKX0sc2V0SGVpZ2h0OmZ1bmN0aW9uKHQsZSl7fSxjb21wdXRlSW5pdGlhbFNjcm9sbDpmdW5jdGlvbih0KXtyZXR1cm4gMH0scXVlcnlTY3JvbGw6ZnVuY3Rpb24oKXt9LHNldFNjcm9sbDpmdW5jdGlvbih0KXt9LGZvcmNlU2Nyb2xsOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5zZXRTY3JvbGwodCksc2V0VGltZW91dChmdW5jdGlvbigpe2Uuc2V0U2Nyb2xsKHQpfSwwKX0sZGlzcGxheUV2ZW50czpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnF1ZXJ5U2Nyb2xsKCk7dGhpcy5jbGVhckV2ZW50cygpLHRoaXMucmVuZGVyRXZlbnRzKHQpLHRoaXMuaXNFdmVudHNSZW5kZXJlZD0hMCx0aGlzLnNldFNjcm9sbChlKSx0aGlzLnRyaWdnZXJFdmVudFJlbmRlcigpfSxjbGVhckV2ZW50czpmdW5jdGlvbigpe3ZhciB0O3RoaXMuaXNFdmVudHNSZW5kZXJlZCYmKHQ9dGhpcy5xdWVyeVNjcm9sbCgpLHRoaXMudHJpZ2dlckV2ZW50VW5yZW5kZXIoKSx0aGlzLmRlc3Ryb3lFdmVudHMmJnRoaXMuZGVzdHJveUV2ZW50cygpLHRoaXMudW5yZW5kZXJFdmVudHMoKSx0aGlzLnNldFNjcm9sbCh0KSx0aGlzLmlzRXZlbnRzUmVuZGVyZWQ9ITEpfSxyZW5kZXJFdmVudHM6ZnVuY3Rpb24odCl7fSx1bnJlbmRlckV2ZW50czpmdW5jdGlvbigpe30sdHJpZ2dlckV2ZW50UmVuZGVyOmZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbih0KXt0aGlzLnRyaWdnZXIoImV2ZW50QWZ0ZXJSZW5kZXIiLHQuZXZlbnQsdC5ldmVudCx0LmVsKX0pLHRoaXMudHJpZ2dlcigiZXZlbnRBZnRlckFsbFJlbmRlciIpfSx0cmlnZ2VyRXZlbnRVbnJlbmRlcjpmdW5jdGlvbigpe3RoaXMucmVuZGVyZWRFdmVudFNlZ0VhY2goZnVuY3Rpb24odCl7dGhpcy50cmlnZ2VyKCJldmVudERlc3Ryb3kiLHQuZXZlbnQsdC5ldmVudCx0LmVsKX0pfSxyZXNvbHZlRXZlbnRFbDpmdW5jdGlvbihlLG4pe3ZhciBpPXRoaXMudHJpZ2dlcigiZXZlbnRSZW5kZXIiLGUsZSxuKTtyZXR1cm4gaT09PSExP249bnVsbDppJiZpIT09ITAmJihuPXQoaSkpLG59LHNob3dFdmVudDpmdW5jdGlvbih0KXt0aGlzLnJlbmRlcmVkRXZlbnRTZWdFYWNoKGZ1bmN0aW9uKHQpe3QuZWwuY3NzKCJ2aXNpYmlsaXR5IiwiIil9LHQpfSxoaWRlRXZlbnQ6ZnVuY3Rpb24odCl7dGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbih0KXt0LmVsLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpfSx0KX0scmVuZGVyZWRFdmVudFNlZ0VhY2g6ZnVuY3Rpb24odCxlKXt2YXIgbixpPXRoaXMuZ2V0RXZlbnRTZWdzKCk7Zm9yKG49MDtuPGkubGVuZ3RoO24rKyllJiZpW25dLmV2ZW50Ll9pZCE9PWUuX2lkfHxpW25dLmVsJiZ0LmNhbGwodGhpcyxpW25dKX0sZ2V0RXZlbnRTZWdzOmZ1bmN0aW9uKCl7cmV0dXJuW119LGlzRXZlbnREcmFnZ2FibGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNFdmVudFN0YXJ0RWRpdGFibGUodCl9LGlzRXZlbnRTdGFydEVkaXRhYmxlOmZ1bmN0aW9uKHQpe3JldHVybiBKKHQuc3RhcnRFZGl0YWJsZSwodC5zb3VyY2V8fHt9KS5zdGFydEVkaXRhYmxlLHRoaXMub3B0KCJldmVudFN0YXJ0RWRpdGFibGUiKSx0aGlzLmlzRXZlbnRHZW5lcmFsbHlFZGl0YWJsZSh0KSl9LGlzRXZlbnRHZW5lcmFsbHlFZGl0YWJsZTpmdW5jdGlvbih0KXtyZXR1cm4gSih0LmVkaXRhYmxlLCh0LnNvdXJjZXx8e30pLmVkaXRhYmxlLHRoaXMub3B0KCJlZGl0YWJsZSIpKX0scmVwb3J0RXZlbnREcm9wOmZ1bmN0aW9uKHQsZSxuLGkscil7CnZhciBzPXRoaXMuY2FsZW5kYXIsbz1zLm11dGF0ZUV2ZW50KHQsZSxuKSxsPWZ1bmN0aW9uKCl7by51bmRvKCkscy5yZXBvcnRFdmVudENoYW5nZSgpfTt0aGlzLnRyaWdnZXJFdmVudERyb3AodCxvLmRhdGVEZWx0YSxsLGkscikscy5yZXBvcnRFdmVudENoYW5nZSgpfSx0cmlnZ2VyRXZlbnREcm9wOmZ1bmN0aW9uKHQsZSxuLGkscil7dGhpcy50cmlnZ2VyKCJldmVudERyb3AiLGlbMF0sdCxlLG4scix7fSl9LHJlcG9ydEV4dGVybmFsRHJvcDpmdW5jdGlvbihlLG4saSxyLHMpe3ZhciBvLGwsYT1lLmV2ZW50UHJvcHM7YSYmKG89dC5leHRlbmQoe30sYSxuKSxsPXRoaXMuY2FsZW5kYXIucmVuZGVyRXZlbnQobyxlLnN0aWNrKVswXSksdGhpcy50cmlnZ2VyRXh0ZXJuYWxEcm9wKGwsbixpLHIscyl9LHRyaWdnZXJFeHRlcm5hbERyb3A6ZnVuY3Rpb24odCxlLG4saSxyKXt0aGlzLnRyaWdnZXIoImRyb3AiLG5bMF0sZS5zdGFydCxpLHIpLHQmJnRoaXMudHJpZ2dlcigiZXZlbnRSZWNlaXZlIixudWxsLHQpfSxyZW5kZXJEcmFnOmZ1bmN0aW9uKHQsZSl7fSx1bnJlbmRlckRyYWc6ZnVuY3Rpb24oKXt9LGlzRXZlbnRSZXNpemFibGVGcm9tU3RhcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0KCJldmVudFJlc2l6YWJsZUZyb21TdGFydCIpJiZ0aGlzLmlzRXZlbnRSZXNpemFibGUodCl9LGlzRXZlbnRSZXNpemFibGVGcm9tRW5kOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzRXZlbnRSZXNpemFibGUodCl9LGlzRXZlbnRSZXNpemFibGU6ZnVuY3Rpb24odCl7dmFyIGU9dC5zb3VyY2V8fHt9O3JldHVybiBKKHQuZHVyYXRpb25FZGl0YWJsZSxlLmR1cmF0aW9uRWRpdGFibGUsdGhpcy5vcHQoImV2ZW50RHVyYXRpb25FZGl0YWJsZSIpLHQuZWRpdGFibGUsZS5lZGl0YWJsZSx0aGlzLm9wdCgiZWRpdGFibGUiKSl9LHJlcG9ydEV2ZW50UmVzaXplOmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIHM9dGhpcy5jYWxlbmRhcixvPXMubXV0YXRlRXZlbnQodCxlLG4pLGw9ZnVuY3Rpb24oKXtvLnVuZG8oKSxzLnJlcG9ydEV2ZW50Q2hhbmdlKCl9O3RoaXMudHJpZ2dlckV2ZW50UmVzaXplKHQsby5kdXJhdGlvbkRlbHRhLGwsaSxyKSxzLnJlcG9ydEV2ZW50Q2hhbmdlKCl9LHRyaWdnZXJFdmVudFJlc2l6ZTpmdW5jdGlvbih0LGUsbixpLHIpe3RoaXMudHJpZ2dlcigiZXZlbnRSZXNpemUiLGlbMF0sdCxlLG4scix7fSl9LHNlbGVjdDpmdW5jdGlvbih0LGUpe3RoaXMudW5zZWxlY3QoZSksdGhpcy5yZW5kZXJTZWxlY3Rpb24odCksdGhpcy5yZXBvcnRTZWxlY3Rpb24odCxlKX0scmVuZGVyU2VsZWN0aW9uOmZ1bmN0aW9uKHQpe30scmVwb3J0U2VsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7dGhpcy5pc1NlbGVjdGVkPSEwLHRoaXMudHJpZ2dlclNlbGVjdCh0LGUpfSx0cmlnZ2VyU2VsZWN0OmZ1bmN0aW9uKHQsZSl7dGhpcy50cmlnZ2VyKCJzZWxlY3QiLG51bGwsdGhpcy5jYWxlbmRhci5hcHBseVRpbWV6b25lKHQuc3RhcnQpLHRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZSh0LmVuZCksZSl9LHVuc2VsZWN0OmZ1bmN0aW9uKHQpe3RoaXMuaXNTZWxlY3RlZCYmKHRoaXMuaXNTZWxlY3RlZD0hMSx0aGlzLmRlc3Ryb3lTZWxlY3Rpb24mJnRoaXMuZGVzdHJveVNlbGVjdGlvbigpLHRoaXMudW5yZW5kZXJTZWxlY3Rpb24oKSx0aGlzLnRyaWdnZXIoInVuc2VsZWN0IixudWxsLHQpKX0sdW5yZW5kZXJTZWxlY3Rpb246ZnVuY3Rpb24oKXt9LHNlbGVjdEV2ZW50OmZ1bmN0aW9uKHQpe3RoaXMuc2VsZWN0ZWRFdmVudCYmdGhpcy5zZWxlY3RlZEV2ZW50PT09dHx8KHRoaXMudW5zZWxlY3RFdmVudCgpLHRoaXMucmVuZGVyZWRFdmVudFNlZ0VhY2goZnVuY3Rpb24odCl7dC5lbC5hZGRDbGFzcygiZmMtc2VsZWN0ZWQiKX0sdCksdGhpcy5zZWxlY3RlZEV2ZW50PXQpfSx1bnNlbGVjdEV2ZW50OmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZEV2ZW50JiYodGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbih0KXt0LmVsLnJlbW92ZUNsYXNzKCJmYy1zZWxlY3RlZCIpfSx0aGlzLnNlbGVjdGVkRXZlbnQpLHRoaXMuc2VsZWN0ZWRFdmVudD1udWxsKX0saXNFdmVudFNlbGVjdGVkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNlbGVjdGVkRXZlbnQmJnRoaXMuc2VsZWN0ZWRFdmVudC5faWQ9PT10Ll9pZH0saGFuZGxlRG9jdW1lbnRNb3VzZWRvd246ZnVuY3Rpb24odCl7Uyh0KSYmdGhpcy5wcm9jZXNzVW5zZWxlY3QodCl9LHByb2Nlc3NVbnNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLnByb2Nlc3NSYW5nZVVuc2VsZWN0KHQpLHRoaXMucHJvY2Vzc0V2ZW50VW5zZWxlY3QodCl9LHByb2Nlc3NSYW5nZVVuc2VsZWN0OmZ1bmN0aW9uKGUpe3ZhciBuO3RoaXMuaXNTZWxlY3RlZCYmdGhpcy5vcHQoInVuc2VsZWN0QXV0byIpJiYobj10aGlzLm9wdCgidW5zZWxlY3RDYW5jZWwiKSxuJiZ0KGUudGFyZ2V0KS5jbG9zZXN0KG4pLmxlbmd0aHx8dGhpcy51bnNlbGVjdChlKSl9LHByb2Nlc3NFdmVudFVuc2VsZWN0OmZ1bmN0aW9uKGUpe3RoaXMuc2VsZWN0ZWRFdmVudCYmKHQoZS50YXJnZXQpLmNsb3Nlc3QoIi5mYy1zZWxlY3RlZCIpLmxlbmd0aHx8dGhpcy51bnNlbGVjdEV2ZW50KCkpfSx0cmlnZ2VyRGF5Q2xpY2s6ZnVuY3Rpb24odCxlLG4pe3RoaXMudHJpZ2dlcigiZGF5Q2xpY2siLGUsdGhpcy5jYWxlbmRhci5hcHBseVRpbWV6b25lKHQuc3RhcnQpLG4pfSxpbml0SGlkZGVuRGF5czpmdW5jdGlvbigpe3ZhciBlLG49dGhpcy5vcHQoImhpZGRlbkRheXMiKXx8W10saT1bXSxyPTA7Zm9yKHRoaXMub3B0KCJ3ZWVrZW5kcyIpPT09ITEmJm4ucHVzaCgwLDYpLGU9MDtlPDc7ZSsrKShpW2VdPXQuaW5BcnJheShlLG4pIT09LTEpfHxyKys7aWYoIXIpdGhyb3ciaW52YWxpZCBoaWRkZW5EYXlzIjt0aGlzLmlzSGlkZGVuRGF5SGFzaD1pfSxpc0hpZGRlbkRheTpmdW5jdGlvbih0KXtyZXR1cm4gZS5pc01vbWVudCh0KSYmKHQ9dC5kYXkoKSksdGhpcy5pc0hpZGRlbkRheUhhc2hbdF19LHNraXBIaWRkZW5EYXlzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10LmNsb25lKCk7Zm9yKGU9ZXx8MTt0aGlzLmlzSGlkZGVuRGF5SGFzaFsoaS5kYXkoKSsobj9lOjApKzcpJTddOylpLmFkZChlLCJkYXlzIik7cmV0dXJuIGl9LGNvbXB1dGVEYXlSYW5nZTpmdW5jdGlvbih0KXt2YXIgZSxuPXQuc3RhcnQuY2xvbmUoKS5zdHJpcFRpbWUoKSxpPXQuZW5kLHI9bnVsbDtyZXR1cm4gaSYmKHI9aS5jbG9uZSgpLnN0cmlwVGltZSgpLGU9K2kudGltZSgpLGUmJmU+PXRoaXMubmV4dERheVRocmVzaG9sZCYmci5hZGQoMSwiZGF5cyIpKSwoIWl8fHI8PW4pJiYocj1uLmNsb25lKCkuYWRkKDEsImRheXMiKSkse3N0YXJ0Om4sZW5kOnJ9fSxpc011bHRpRGF5RXZlbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb21wdXRlRGF5UmFuZ2UodCk7cmV0dXJuIGUuZW5kLmRpZmYoZS5zdGFydCwiZGF5cyIpPjF9fSksd2U9anQuU2Nyb2xsZXI9d3QuZXh0ZW5kKHtlbDpudWxsLHNjcm9sbEVsOm51bGwsb3ZlcmZsb3dYOm51bGwsb3ZlcmZsb3dZOm51bGwsY29uc3RydWN0b3I6ZnVuY3Rpb24odCl7dD10fHx7fSx0aGlzLm92ZXJmbG93WD10Lm92ZXJmbG93WHx8dC5vdmVyZmxvd3x8ImF1dG8iLHRoaXMub3ZlcmZsb3dZPXQub3ZlcmZsb3dZfHx0Lm92ZXJmbG93fHwiYXV0byJ9LHJlbmRlcjpmdW5jdGlvbigpe3RoaXMuZWw9dGhpcy5yZW5kZXJFbCgpLHRoaXMuYXBwbHlPdmVyZmxvdygpfSxyZW5kZXJFbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbEVsPXQoJzxkaXYgY2xhc3M9ImZjLXNjcm9sbGVyIj48L2Rpdj4nKX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLnNldEhlaWdodCgiYXV0byIpLHRoaXMuYXBwbHlPdmVyZmxvdygpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbC5yZW1vdmUoKX0sYXBwbHlPdmVyZmxvdzpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsRWwuY3NzKHsib3ZlcmZsb3cteCI6dGhpcy5vdmVyZmxvd1gsIm92ZXJmbG93LXkiOnRoaXMub3ZlcmZsb3dZfSl9LGxvY2tPdmVyZmxvdzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm92ZXJmbG93WCxuPXRoaXMub3ZlcmZsb3dZO3Q9dHx8dGhpcy5nZXRTY3JvbGxiYXJXaWR0aHMoKSwiYXV0byI9PT1lJiYoZT10LnRvcHx8dC5ib3R0b218fHRoaXMuc2Nyb2xsRWxbMF0uc2Nyb2xsV2lkdGgtMT50aGlzLnNjcm9sbEVsWzBdLmNsaWVudFdpZHRoPyJzY3JvbGwiOiJoaWRkZW4iKSwiYXV0byI9PT1uJiYobj10LmxlZnR8fHQucmlnaHR8fHRoaXMuc2Nyb2xsRWxbMF0uc2Nyb2xsSGVpZ2h0LTE+dGhpcy5zY3JvbGxFbFswXS5jbGllbnRIZWlnaHQ/InNjcm9sbCI6ImhpZGRlbiIpLHRoaXMuc2Nyb2xsRWwuY3NzKHsib3ZlcmZsb3cteCI6ZSwib3ZlcmZsb3cteSI6bn0pfSxzZXRIZWlnaHQ6ZnVuY3Rpb24odCl7dGhpcy5zY3JvbGxFbC5oZWlnaHQodCl9LGdldFNjcm9sbFRvcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbEVsLnNjcm9sbFRvcCgpfSxzZXRTY3JvbGxUb3A6ZnVuY3Rpb24odCl7dGhpcy5zY3JvbGxFbC5zY3JvbGxUb3AodCl9LGdldENsaWVudFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Nyb2xsRWxbMF0uY2xpZW50V2lkdGh9LGdldENsaWVudEhlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbEVsWzBdLmNsaWVudEhlaWdodH0sZ2V0U2Nyb2xsYmFyV2lkdGhzOmZ1bmN0aW9uKCl7cmV0dXJuIHAodGhpcy5zY3JvbGxFbCl9fSksRWU9anQuQ2FsZW5kYXI9d3QuZXh0ZW5kKHtkaXJEZWZhdWx0czpudWxsLGxvY2FsZURlZmF1bHRzOm51bGwsb3ZlcnJpZGVzOm51bGwsZHluYW1pY092ZXJyaWRlczpudWxsLG9wdGlvbnM6bnVsbCx2aWV3U3BlY0NhY2hlOm51bGwsdmlldzpudWxsLGhlYWRlcjpudWxsLGxvYWRpbmdMZXZlbDowLGNvbnN0cnVjdG9yOk90LGluaXRpYWxpemU6ZnVuY3Rpb24oKXt9LHBvcHVsYXRlT3B0aW9uc0hhc2g6ZnVuY3Rpb24oKXt2YXIgdCxlLGkscjt0PUoodGhpcy5keW5hbWljT3ZlcnJpZGVzLmxvY2FsZSx0aGlzLm92ZXJyaWRlcy5sb2NhbGUpLGU9RGVbdF0sZXx8KHQ9RWUuZGVmYXVsdHMubG9jYWxlLGU9RGVbdF18fHt9KSxpPUoodGhpcy5keW5hbWljT3ZlcnJpZGVzLmlzUlRMLHRoaXMub3ZlcnJpZGVzLmlzUlRMLGUuaXNSVEwsRWUuZGVmYXVsdHMuaXNSVEwpLHI9aT9FZS5ydGxEZWZhdWx0czp7fSx0aGlzLmRpckRlZmF1bHRzPXIsdGhpcy5sb2NhbGVEZWZhdWx0cz1lLHRoaXMub3B0aW9ucz1uKFtFZS5kZWZhdWx0cyxyLGUsdGhpcy5vdmVycmlkZXMsdGhpcy5keW5hbWljT3ZlcnJpZGVzXSksVnQodGhpcy5vcHRpb25zKX0sZ2V0Vmlld1NwZWM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52aWV3U3BlY0NhY2hlO3JldHVybiBlW3RdfHwoZVt0XT10aGlzLmJ1aWxkVmlld1NwZWModCkpfSxnZXRVbml0Vmlld1NwZWM6ZnVuY3Rpb24oZSl7dmFyIG4saSxyO2lmKHQuaW5BcnJheShlLFh0KSE9LTEpZm9yKG49dGhpcy5oZWFkZXIuZ2V0Vmlld3NXaXRoQnV0dG9ucygpLHQuZWFjaChqdC52aWV3cyxmdW5jdGlvbih0KXtuLnB1c2godCl9KSxpPTA7aTxuLmxlbmd0aDtpKyspaWYocj10aGlzLmdldFZpZXdTcGVjKG5baV0pLHImJnIuc2luZ2xlVW5pdD09ZSlyZXR1cm4gcn0sYnVpbGRWaWV3U3BlYzpmdW5jdGlvbih0KXtmb3IodmFyIGkscixzLG8sbD10aGlzLm92ZXJyaWRlcy52aWV3c3x8e30sYT1bXSx1PVtdLGQ9W10sYz10O2M7KWk9VXRbY10scj1sW2NdLGM9bnVsbCwiZnVuY3Rpb24iPT10eXBlb2YgaSYmKGk9e2NsYXNzOml9KSxpJiYoYS51bnNoaWZ0KGkpLHUudW5zaGlmdChpLmRlZmF1bHRzfHx7fSkscz1zfHxpLmR1cmF0aW9uLGM9Y3x8aS50eXBlKSxyJiYoZC51bnNoaWZ0KHIpLHM9c3x8ci5kdXJhdGlvbixjPWN8fHIudHlwZSk7cmV0dXJuIGk9cShhKSxpLnR5cGU9dCwhIWkuY2xhc3MmJihzJiYocz1lLmR1cmF0aW9uKHMpLHMudmFsdWVPZigpJiYoaS5kdXJhdGlvbj1zLG89TyhzKSwxPT09cy5hcyhvKSYmKGkuc2luZ2xlVW5pdD1vLGQudW5zaGlmdChsW29dfHx7fSkpKSksaS5kZWZhdWx0cz1uKHUpLGkub3ZlcnJpZGVzPW4oZCksdGhpcy5idWlsZFZpZXdTcGVjT3B0aW9ucyhpKSx0aGlzLmJ1aWxkVmlld1NwZWNCdXR0b25UZXh0KGksdCksaSl9LGJ1aWxkVmlld1NwZWNPcHRpb25zOmZ1bmN0aW9uKHQpe3Qub3B0aW9ucz1uKFtFZS5kZWZhdWx0cyx0LmRlZmF1bHRzLHRoaXMuZGlyRGVmYXVsdHMsdGhpcy5sb2NhbGVEZWZhdWx0cyx0aGlzLm92ZXJyaWRlcyx0Lm92ZXJyaWRlcyx0aGlzLmR5bmFtaWNPdmVycmlkZXNdKSxWdCh0Lm9wdGlvbnMpfSxidWlsZFZpZXdTcGVjQnV0dG9uVGV4dDpmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4obil7dmFyIGk9bi5idXR0b25UZXh0fHx7fTtyZXR1cm4gaVtlXXx8KHQuYnV0dG9uVGV4dEtleT9pW3QuYnV0dG9uVGV4dEtleV06bnVsbCl8fCh0LnNpbmdsZVVuaXQ/aVt0LnNpbmdsZVVuaXRdOm51bGwpfXQuYnV0dG9uVGV4dE92ZXJyaWRlPW4odGhpcy5keW5hbWljT3ZlcnJpZGVzKXx8bih0aGlzLm92ZXJyaWRlcyl8fHQub3ZlcnJpZGVzLmJ1dHRvblRleHQsdC5idXR0b25UZXh0RGVmYXVsdD1uKHRoaXMubG9jYWxlRGVmYXVsdHMpfHxuKHRoaXMuZGlyRGVmYXVsdHMpfHx0LmRlZmF1bHRzLmJ1dHRvblRleHR8fG4oRWUuZGVmYXVsdHMpfHwodC5kdXJhdGlvbj90aGlzLmh1bWFuaXplRHVyYXRpb24odC5kdXJhdGlvbik6bnVsbCl8fGV9LGluc3RhbnRpYXRlVmlldzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFZpZXdTcGVjKHQpO3JldHVybiBuZXcgZS5jbGFzcyh0aGlzLHQsZS5vcHRpb25zLGUuZHVyYXRpb24pfSxpc1ZhbGlkVmlld1R5cGU6ZnVuY3Rpb24odCl7cmV0dXJuIEJvb2xlYW4odGhpcy5nZXRWaWV3U3BlYyh0KSl9LHB1c2hMb2FkaW5nOmZ1bmN0aW9uKCl7dGhpcy5sb2FkaW5nTGV2ZWwrK3x8dGhpcy50cmlnZ2VyKCJsb2FkaW5nIixudWxsLCEwLHRoaXMudmlldyl9LHBvcExvYWRpbmc6ZnVuY3Rpb24oKXstLXRoaXMubG9hZGluZ0xldmVsfHx0aGlzLnRyaWdnZXIoImxvYWRpbmciLG51bGwsITEsdGhpcy52aWV3KX0sYnVpbGRTZWxlY3RTcGFuOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLm1vbWVudCh0KS5zdHJpcFpvbmUoKTtyZXR1cm4gbj1lP3RoaXMubW9tZW50KGUpLnN0cmlwWm9uZSgpOmkuaGFzVGltZSgpP2kuY2xvbmUoKS5hZGQodGhpcy5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uKTppLmNsb25lKCkuYWRkKHRoaXMuZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb24pLHtzdGFydDppLGVuZDpufX19KTtFZS5taXhpbihsZSksRWUubWl4aW4oe29wdGlvbkhhbmRsZXJzOm51bGwsYmluZE9wdGlvbjpmdW5jdGlvbih0LGUpe3RoaXMuYmluZE9wdGlvbnMoW3RdLGUpfSxiaW5kT3B0aW9uczpmdW5jdGlvbih0LGUpe3ZhciBuLGk9e2Z1bmM6ZSxuYW1lczp0fTtmb3Iobj0wO248dC5sZW5ndGg7bisrKXRoaXMucmVnaXN0ZXJPcHRpb25IYW5kbGVyT2JqKHRbbl0saSk7dGhpcy50cmlnZ2VyT3B0aW9uSGFuZGxlck9iaihpKX0scmVnaXN0ZXJPcHRpb25IYW5kbGVyT2JqOmZ1bmN0aW9uKHQsZSl7KHRoaXMub3B0aW9uSGFuZGxlcnNbdF18fCh0aGlzLm9wdGlvbkhhbmRsZXJzW3RdPVtdKSkucHVzaChlKX0sdHJpZ2dlck9wdGlvbkhhbmRsZXJzOmZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5vcHRpb25IYW5kbGVyc1t0XXx8W107Zm9yKGU9MDtlPG4ubGVuZ3RoO2UrKyl0aGlzLnRyaWdnZXJPcHRpb25IYW5kbGVyT2JqKG5bZV0pfSx0cmlnZ2VyT3B0aW9uSGFuZGxlck9iajpmdW5jdGlvbih0KXt2YXIgZSxuPXQubmFtZXMsaT1bXTtmb3IoZT0wO2U8bi5sZW5ndGg7ZSsrKWkucHVzaCh0aGlzLm9wdGlvbnNbbltlXV0pO3QuZnVuYy5hcHBseSh0aGlzLGkpfX0pLEVlLmRlZmF1bHRzPXt0aXRsZVJhbmdlU2VwYXJhdG9yOiIg4oCTICIsbW9udGhZZWFyRm9ybWF0OiJNTU1NIFlZWVkiLGRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb246IjAyOjAwOjAwIixkZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbjp7ZGF5czoxfSxmb3JjZUV2ZW50RHVyYXRpb246ITEsbmV4dERheVRocmVzaG9sZDoiMDk6MDA6MDAiLGRlZmF1bHRWaWV3OiJtb250aCIsYXNwZWN0UmF0aW86MS4zNSxoZWFkZXI6e2xlZnQ6InRpdGxlIixjZW50ZXI6IiIscmlnaHQ6InRvZGF5IHByZXYsbmV4dCJ9LHdlZWtlbmRzOiEwLHdlZWtOdW1iZXJzOiExLHdlZWtOdW1iZXJUaXRsZToiVyIsd2Vla051bWJlckNhbGN1bGF0aW9uOiJsb2NhbCIsc2Nyb2xsVGltZToiMDY6MDA6MDAiLGxhenlGZXRjaGluZzohMCxzdGFydFBhcmFtOiJzdGFydCIsZW5kUGFyYW06ImVuZCIsdGltZXpvbmVQYXJhbToidGltZXpvbmUiLHRpbWV6b25lOiExLGlzUlRMOiExLGJ1dHRvblRleHQ6e3ByZXY6InByZXYiLG5leHQ6Im5leHQiLHByZXZZZWFyOiJwcmV2IHllYXIiLG5leHRZZWFyOiJuZXh0IHllYXIiLHllYXI6InllYXIiLHRvZGF5OiJ0b2RheSIsbW9udGg6Im1vbnRoIix3ZWVrOiJ3ZWVrIixkYXk6ImRheSJ9LGJ1dHRvbkljb25zOntwcmV2OiJsZWZ0LXNpbmdsZS1hcnJvdyIsbmV4dDoicmlnaHQtc2luZ2xlLWFycm93IixwcmV2WWVhcjoibGVmdC1kb3VibGUtYXJyb3ciLG5leHRZZWFyOiJyaWdodC1kb3VibGUtYXJyb3cifSxhbGxEYXlUZXh0OiJhbGwtZGF5Iix0aGVtZTohMSx0aGVtZUJ1dHRvbkljb25zOntwcmV2OiJjaXJjbGUtdHJpYW5nbGUtdyIsbmV4dDoiY2lyY2xlLXRyaWFuZ2xlLWUiLHByZXZZZWFyOiJzZWVrLXByZXYiLG5leHRZZWFyOiJzZWVrLW5leHQifSxkcmFnT3BhY2l0eTouNzUsZHJhZ1JldmVydER1cmF0aW9uOjUwMCxkcmFnU2Nyb2xsOiEwLHVuc2VsZWN0QXV0bzohMCxkcm9wQWNjZXB0OiIqIixldmVudE9yZGVyOiJ0aXRsZSIsZXZlbnRMaW1pdDohMSxldmVudExpbWl0VGV4dDoibW9yZSIsZXZlbnRMaW1pdENsaWNrOiJwb3BvdmVyIixkYXlQb3BvdmVyRm9ybWF0OiJMTCIsaGFuZGxlV2luZG93UmVzaXplOiEwLHdpbmRvd1Jlc2l6ZURlbGF5OjEwMCxsb25nUHJlc3NEZWxheToxZTN9LEVlLmVuZ2xpc2hEZWZhdWx0cz17ZGF5UG9wb3ZlckZvcm1hdDoiZGRkZCwgTU1NTSBEIn0sRWUucnRsRGVmYXVsdHM9e2hlYWRlcjp7bGVmdDoibmV4dCxwcmV2IHRvZGF5IixjZW50ZXI6IiIscmlnaHQ6InRpdGxlIn0sYnV0dG9uSWNvbnM6e3ByZXY6InJpZ2h0LXNpbmdsZS1hcnJvdyIsbmV4dDoibGVmdC1zaW5nbGUtYXJyb3ciLHByZXZZZWFyOiJyaWdodC1kb3VibGUtYXJyb3ciLG5leHRZZWFyOiJsZWZ0LWRvdWJsZS1hcnJvdyJ9LHRoZW1lQnV0dG9uSWNvbnM6e3ByZXY6ImNpcmNsZS10cmlhbmdsZS1lIixuZXh0OiJjaXJjbGUtdHJpYW5nbGUtdyIsbmV4dFllYXI6InNlZWstcHJldiIscHJldlllYXI6InNlZWstbmV4dCJ9fTt2YXIgRGU9anQubG9jYWxlcz17fTtqdC5kYXRlcGlja2VyTG9jYWxlPWZ1bmN0aW9uKGUsbixpKXt2YXIgcj1EZVtlXXx8KERlW2VdPXt9KTtyLmlzUlRMPWkuaXNSVEwsci53ZWVrTnVtYmVyVGl0bGU9aS53ZWVrSGVhZGVyLHQuZWFjaChiZSxmdW5jdGlvbih0LGUpe3JbdF09ZShpKX0pLHQuZGF0ZXBpY2tlciYmKHQuZGF0ZXBpY2tlci5yZWdpb25hbFtuXT10LmRhdGVwaWNrZXIucmVnaW9uYWxbZV09aSx0LmRhdGVwaWNrZXIucmVnaW9uYWwuZW49dC5kYXRlcGlja2VyLnJlZ2lvbmFsWyIiXSx0LmRhdGVwaWNrZXIuc2V0RGVmYXVsdHMoaSkpfSxqdC5sb2NhbGU9ZnVuY3Rpb24oZSxpKXt2YXIgcixzO3I9RGVbZV18fChEZVtlXT17fSksaSYmKHI9RGVbZV09bihbcixpXSkpLHM9UHQoZSksdC5lYWNoKENlLGZ1bmN0aW9uKHQsZSl7bnVsbD09clt0XSYmKHJbdF09ZShzLHIpKX0pLEVlLmRlZmF1bHRzLmxvY2FsZT1lfTt2YXIgYmU9e2J1dHRvblRleHQ6ZnVuY3Rpb24odCl7cmV0dXJue3ByZXY6ZXQodC5wcmV2VGV4dCksbmV4dDpldCh0Lm5leHRUZXh0KSx0b2RheTpldCh0LmN1cnJlbnRUZXh0KX19LG1vbnRoWWVhckZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5zaG93TW9udGhBZnRlclllYXI/IllZWVlbIit0LnllYXJTdWZmaXgrIl0gTU1NTSI6Ik1NTU0gWVlZWVsiK3QueWVhclN1ZmZpeCsiXSJ9fSxDZT17ZGF5T2ZNb250aEZvcm1hdDpmdW5jdGlvbih0LGUpe3ZhciBuPXQubG9uZ0RhdGVGb3JtYXQoImwiKTtyZXR1cm4gbj1uLnJlcGxhY2UoL15ZK1teXHdcc10qfFteXHdcc10qWSskL2csIiIpLGUuaXNSVEw/bis9IiBkZGQiOm49ImRkZCAiK24sbn0sbWVkaXVtVGltZUZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5sb25nRGF0ZUZvcm1hdCgiTFQiKS5yZXBsYWNlKC9ccyphJC9pLCJhIil9LHNtYWxsVGltZUZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5sb25nRGF0ZUZvcm1hdCgiTFQiKS5yZXBsYWNlKCI6bW0iLCIoOm1tKSIpLnJlcGxhY2UoLyhcV21tKSQvLCIoJDEpIikucmVwbGFjZSgvXHMqYSQvaSwiYSIpfSxleHRyYVNtYWxsVGltZUZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5sb25nRGF0ZUZvcm1hdCgiTFQiKS5yZXBsYWNlKCI6bW0iLCIoOm1tKSIpLnJlcGxhY2UoLyhcV21tKSQvLCIoJDEpIikucmVwbGFjZSgvXHMqYSQvaSwidCIpfSxob3VyRm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmxvbmdEYXRlRm9ybWF0KCJMVCIpLnJlcGxhY2UoIjptbSIsIiIpLnJlcGxhY2UoLyhcV21tKSQvLCIiKS5yZXBsYWNlKC9ccyphJC9pLCJhIil9LG5vTWVyaWRpZW1UaW1lRm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmxvbmdEYXRlRm9ybWF0KCJMVCIpLnJlcGxhY2UoL1xzKmEkL2ksIiIpfX0sSGU9e3NtYWxsRGF5RGF0ZUZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pc1JUTD8iRCBkZCI6ImRkIEQifSx3ZWVrRm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmlzUlRMPyJ3WyAiK3Qud2Vla051bWJlclRpdGxlKyJdIjoiWyIrdC53ZWVrTnVtYmVyVGl0bGUrIiBddyJ9LHNtYWxsV2Vla0Zvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pc1JUTD8id1siK3Qud2Vla051bWJlclRpdGxlKyJdIjoiWyIrdC53ZWVrTnVtYmVyVGl0bGUrIl13In19O2p0LmxvY2FsZSgiZW4iLEVlLmVuZ2xpc2hEZWZhdWx0cyksanQuc291cmNlTm9ybWFsaXplcnM9W10sanQuc291cmNlRmV0Y2hlcnM9W107dmFyIFRlPXtkYXRhVHlwZToianNvbiIsY2FjaGU6ITF9LHhlPTE7RWUucHJvdG90eXBlLm5vcm1hbGl6ZUV2ZW50PWZ1bmN0aW9uKHQpe30sRWUucHJvdG90eXBlLnNwYW5Db250YWluc1NwYW49ZnVuY3Rpb24odCxlKXt2YXIgbj10LnN0YXJ0LmNsb25lKCkuc3RyaXBab25lKCksaT10aGlzLmdldEV2ZW50RW5kKHQpLnN0cmlwWm9uZSgpO3JldHVybiBlLnN0YXJ0Pj1uJiZlLmVuZDw9aX0sRWUucHJvdG90eXBlLmdldFBlZXJFdmVudHM9ZnVuY3Rpb24odCxlKXt2YXIgbixpLHI9dGhpcy5nZXRFdmVudENhY2hlKCkscz1bXTtmb3Iobj0wO248ci5sZW5ndGg7bisrKWk9cltuXSxlJiZlLl9pZD09PWkuX2lkfHxzLnB1c2goaSk7cmV0dXJuIHN9LEVlLnByb3RvdHlwZS5pc0V2ZW50U3BhbkFsbG93ZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnNvdXJjZXx8e30saT1KKGUuY29uc3RyYWludCxuLmNvbnN0cmFpbnQsdGhpcy5vcHRpb25zLmV2ZW50Q29uc3RyYWludCkscj1KKGUub3ZlcmxhcCxuLm92ZXJsYXAsdGhpcy5vcHRpb25zLmV2ZW50T3ZlcmxhcCk7cmV0dXJuIHRoaXMuaXNTcGFuQWxsb3dlZCh0LGkscixlKSYmKCF0aGlzLm9wdGlvbnMuZXZlbnRBbGxvd3x8dGhpcy5vcHRpb25zLmV2ZW50QWxsb3codCxlKSE9PSExKX0sRWUucHJvdG90eXBlLmlzRXh0ZXJuYWxTcGFuQWxsb3dlZD1mdW5jdGlvbihlLG4saSl7dmFyIHIscztyZXR1cm4gaSYmKHI9dC5leHRlbmQoe30saSxuKSxzPXRoaXMuZXhwYW5kRXZlbnQodGhpcy5idWlsZEV2ZW50RnJvbUlucHV0KHIpKVswXSkscz90aGlzLmlzRXZlbnRTcGFuQWxsb3dlZChlLHMpOnRoaXMuaXNTZWxlY3Rpb25TcGFuQWxsb3dlZChlKX0sRWUucHJvdG90eXBlLmlzU2VsZWN0aW9uU3BhbkFsbG93ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNTcGFuQWxsb3dlZCh0LHRoaXMub3B0aW9ucy5zZWxlY3RDb25zdHJhaW50LHRoaXMub3B0aW9ucy5zZWxlY3RPdmVybGFwKSYmKCF0aGlzLm9wdGlvbnMuc2VsZWN0QWxsb3d8fHRoaXMub3B0aW9ucy5zZWxlY3RBbGxvdyh0KSE9PSExKX0sRWUucHJvdG90eXBlLmlzU3BhbkFsbG93ZWQ9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHIscyxvLGwsYSx1O2lmKG51bGwhPWUmJihyPXRoaXMuY29uc3RyYWludFRvRXZlbnRzKGUpKSl7Zm9yKHM9ITEsbD0wO2w8ci5sZW5ndGg7bCsrKWlmKHRoaXMuc3BhbkNvbnRhaW5zU3BhbihyW2xdLHQpKXtzPSEwO2JyZWFrfWlmKCFzKXJldHVybiExfWZvcihvPXRoaXMuZ2V0UGVlckV2ZW50cyh0LGkpLGw9MDtsPG8ubGVuZ3RoO2wrKylpZihhPW9bbF0sdGhpcy5ldmVudEludGVyc2VjdHNSYW5nZShhLHQpKXtpZihuPT09ITEpcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4mJiFuKGEsaSkpcmV0dXJuITE7aWYoaSl7aWYodT1KKGEub3ZlcmxhcCwoYS5zb3VyY2V8fHt9KS5vdmVybGFwKSx1PT09ITEpcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHUmJiF1KGksYSkpcmV0dXJuITF9fXJldHVybiEwfSxFZS5wcm90b3R5cGUuY29uc3RyYWludFRvRXZlbnRzPWZ1bmN0aW9uKHQpe3JldHVybiJidXNpbmVzc0hvdXJzIj09PXQ/dGhpcy5nZXRDdXJyZW50QnVzaW5lc3NIb3VyRXZlbnRzKCk6Im9iamVjdCI9PXR5cGVvZiB0P251bGwhPXQuc3RhcnQ/dGhpcy5leHBhbmRFdmVudCh0aGlzLmJ1aWxkRXZlbnRGcm9tSW5wdXQodCkpOm51bGw6dGhpcy5jbGllbnRFdmVudHModCl9LEVlLnByb3RvdHlwZS5ldmVudEludGVyc2VjdHNSYW5nZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQuc3RhcnQuY2xvbmUoKS5zdHJpcFpvbmUoKSxpPXRoaXMuZ2V0RXZlbnRFbmQodCkuc3RyaXBab25lKCk7cmV0dXJuIGUuc3RhcnQ8aSYmZS5lbmQ+bn07dmFyIFJlPXtpZDoiX2ZjQnVzaW5lc3NIb3VycyIsc3RhcnQ6IjA5OjAwIixlbmQ6IjE3OjAwIixkb3c6WzEsMiwzLDQsNV0scmVuZGVyaW5nOiJpbnZlcnNlLWJhY2tncm91bmQifTtFZS5wcm90b3R5cGUuZ2V0Q3VycmVudEJ1c2luZXNzSG91ckV2ZW50cz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb21wdXRlQnVzaW5lc3NIb3VyRXZlbnRzKHQsdGhpcy5vcHRpb25zLmJ1c2luZXNzSG91cnMpfSxFZS5wcm90b3R5cGUuY29tcHV0ZUJ1c2luZXNzSG91ckV2ZW50cz1mdW5jdGlvbihlLG4pe3JldHVybiBuPT09ITA/dGhpcy5leHBhbmRCdXNpbmVzc0hvdXJFdmVudHMoZSxbe31dKTp0LmlzUGxhaW5PYmplY3Qobik/dGhpcy5leHBhbmRCdXNpbmVzc0hvdXJFdmVudHMoZSxbbl0pOnQuaXNBcnJheShuKT90aGlzLmV4cGFuZEJ1c2luZXNzSG91ckV2ZW50cyhlLG4sITApOltdfSxFZS5wcm90b3R5cGUuZXhwYW5kQnVzaW5lc3NIb3VyRXZlbnRzPWZ1bmN0aW9uKGUsbixpKXt2YXIgcixzLG89dGhpcy5nZXRWaWV3KCksbD1bXTtmb3Iocj0wO3I8bi5sZW5ndGg7cisrKXM9bltyXSxpJiYhcy5kb3d8fChzPXQuZXh0ZW5kKHt9LFJlLHMpLGUmJihzLnN0YXJ0PW51bGwscy5lbmQ9bnVsbCksbC5wdXNoLmFwcGx5KGwsdGhpcy5leHBhbmRFdmVudCh0aGlzLmJ1aWxkRXZlbnRGcm9tSW5wdXQocyksby5zdGFydCxvLmVuZCkpKTtyZXR1cm4gbH07dmFyIEllPWp0LkJhc2ljVmlldz1TZS5leHRlbmQoe3Njcm9sbGVyOm51bGwsZGF5R3JpZENsYXNzOm1lLGRheUdyaWQ6bnVsbCxkYXlOdW1iZXJzVmlzaWJsZTohMSxjb2xXZWVrTnVtYmVyc1Zpc2libGU6ITEsY2VsbFdlZWtOdW1iZXJzVmlzaWJsZTohMSx3ZWVrTnVtYmVyV2lkdGg6bnVsbCxoZWFkQ29udGFpbmVyRWw6bnVsbCxoZWFkUm93RWw6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkPXRoaXMuaW5zdGFudGlhdGVEYXlHcmlkKCksdGhpcy5zY3JvbGxlcj1uZXcgd2Uoe292ZXJmbG93WDoiaGlkZGVuIixvdmVyZmxvd1k6ImF1dG8ifSl9LGluc3RhbnRpYXRlRGF5R3JpZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZGF5R3JpZENsYXNzLmV4dGVuZChrZSk7cmV0dXJuIG5ldyB0KHRoaXMpfSxzZXRSYW5nZTpmdW5jdGlvbih0KXtTZS5wcm90b3R5cGUuc2V0UmFuZ2UuY2FsbCh0aGlzLHQpLHRoaXMuZGF5R3JpZC5icmVha09uV2Vla3M9L3llYXJ8bW9udGh8d2Vlay8udGVzdCh0aGlzLmludGVydmFsVW5pdCksdGhpcy5kYXlHcmlkLnNldFJhbmdlKHQpfSxjb21wdXRlUmFuZ2U6ZnVuY3Rpb24odCl7dmFyIGU9U2UucHJvdG90eXBlLmNvbXB1dGVSYW5nZS5jYWxsKHRoaXMsdCk7cmV0dXJuL3llYXJ8bW9udGgvLnRlc3QoZS5pbnRlcnZhbFVuaXQpJiYoZS5zdGFydC5zdGFydE9mKCJ3ZWVrIiksZS5zdGFydD10aGlzLnNraXBIaWRkZW5EYXlzKGUuc3RhcnQpLGUuZW5kLndlZWtkYXkoKSYmKGUuZW5kLmFkZCgxLCJ3ZWVrIikuc3RhcnRPZigid2VlayIpLGUuZW5kPXRoaXMuc2tpcEhpZGRlbkRheXMoZS5lbmQsLTEsITApKSksZX0scmVuZGVyRGF0ZXM6ZnVuY3Rpb24oKXt0aGlzLmRheU51bWJlcnNWaXNpYmxlPXRoaXMuZGF5R3JpZC5yb3dDbnQ+MSx0aGlzLm9wdCgid2Vla051bWJlcnMiKSYmKHRoaXMub3B0KCJ3ZWVrTnVtYmVyc1dpdGhpbkRheXMiKT8odGhpcy5jZWxsV2Vla051bWJlcnNWaXNpYmxlPSEwLHRoaXMuY29sV2Vla051bWJlcnNWaXNpYmxlPSExKToodGhpcy5jZWxsV2Vla051bWJlcnNWaXNpYmxlPSExLHRoaXMuY29sV2Vla051bWJlcnNWaXNpYmxlPSEwKSksdGhpcy5kYXlHcmlkLm51bWJlcnNWaXNpYmxlPXRoaXMuZGF5TnVtYmVyc1Zpc2libGV8fHRoaXMuY2VsbFdlZWtOdW1iZXJzVmlzaWJsZXx8dGhpcy5jb2xXZWVrTnVtYmVyc1Zpc2libGUsdGhpcy5lbC5hZGRDbGFzcygiZmMtYmFzaWMtdmlldyIpLmh0bWwodGhpcy5yZW5kZXJTa2VsZXRvbkh0bWwoKSksdGhpcy5yZW5kZXJIZWFkKCksdGhpcy5zY3JvbGxlci5yZW5kZXIoKTt2YXIgZT10aGlzLnNjcm9sbGVyLmVsLmFkZENsYXNzKCJmYy1kYXktZ3JpZC1jb250YWluZXIiKSxuPXQoJzxkaXYgY2xhc3M9ImZjLWRheS1ncmlkIiAvPicpLmFwcGVuZFRvKGUpO3RoaXMuZWwuZmluZCgiLmZjLWJvZHkgPiB0ciA+IHRkIikuYXBwZW5kKGUpLHRoaXMuZGF5R3JpZC5zZXRFbGVtZW50KG4pLHRoaXMuZGF5R3JpZC5yZW5kZXJEYXRlcyh0aGlzLmhhc1JpZ2lkUm93cygpKX0scmVuZGVySGVhZDpmdW5jdGlvbigpe3RoaXMuaGVhZENvbnRhaW5lckVsPXRoaXMuZWwuZmluZCgiLmZjLWhlYWQtY29udGFpbmVyIikuaHRtbCh0aGlzLmRheUdyaWQucmVuZGVySGVhZEh0bWwoKSksdGhpcy5oZWFkUm93RWw9dGhpcy5oZWFkQ29udGFpbmVyRWwuZmluZCgiLmZjLXJvdyIpfSx1bnJlbmRlckRhdGVzOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkLnVucmVuZGVyRGF0ZXMoKSx0aGlzLmRheUdyaWQucmVtb3ZlRWxlbWVudCgpLHRoaXMuc2Nyb2xsZXIuZGVzdHJveSgpfSxyZW5kZXJCdXNpbmVzc0hvdXJzOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkLnJlbmRlckJ1c2luZXNzSG91cnMoKX0sdW5yZW5kZXJCdXNpbmVzc0hvdXJzOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkLnVucmVuZGVyQnVzaW5lc3NIb3VycygpfSxyZW5kZXJTa2VsZXRvbkh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4nPHRhYmxlPjx0aGVhZCBjbGFzcz0iZmMtaGVhZCI+PHRyPjx0ZCBjbGFzcz0iZmMtaGVhZC1jb250YWluZXIgJyt0aGlzLndpZGdldEhlYWRlckNsYXNzKyciPjwvdGQ+PC90cj48L3RoZWFkPjx0Ym9keSBjbGFzcz0iZmMtYm9keSI+PHRyPjx0ZCBjbGFzcz0iJyt0aGlzLndpZGdldENvbnRlbnRDbGFzcysnIj48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPid9LHdlZWtOdW1iZXJTdHlsZUF0dHI6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMud2Vla051bWJlcldpZHRoPydzdHlsZT0id2lkdGg6Jyt0aGlzLndlZWtOdW1iZXJXaWR0aCsncHgiJzoiIn0saGFzUmlnaWRSb3dzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHQoImV2ZW50TGltaXQiKTtyZXR1cm4gdCYmIm51bWJlciIhPXR5cGVvZiB0fSx1cGRhdGVXaWR0aDpmdW5jdGlvbigpe3RoaXMuY29sV2Vla051bWJlcnNWaXNpYmxlJiYodGhpcy53ZWVrTnVtYmVyV2lkdGg9dSh0aGlzLmVsLmZpbmQoIi5mYy13ZWVrLW51bWJlciIpKSl9LHNldEhlaWdodDpmdW5jdGlvbih0LGUpe3ZhciBuLHMsbz10aGlzLm9wdCgiZXZlbnRMaW1pdCIpO3RoaXMuc2Nyb2xsZXIuY2xlYXIoKSxyKHRoaXMuaGVhZFJvd0VsKSx0aGlzLmRheUdyaWQucmVtb3ZlU2VnUG9wb3ZlcigpLG8mJiJudW1iZXIiPT10eXBlb2YgbyYmdGhpcy5kYXlHcmlkLmxpbWl0Um93cyhvKSxuPXRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHQpLHRoaXMuc2V0R3JpZEhlaWdodChuLGUpLG8mJiJudW1iZXIiIT10eXBlb2YgbyYmdGhpcy5kYXlHcmlkLmxpbWl0Um93cyhvKSxlfHwodGhpcy5zY3JvbGxlci5zZXRIZWlnaHQobikscz10aGlzLnNjcm9sbGVyLmdldFNjcm9sbGJhcldpZHRocygpLChzLmxlZnR8fHMucmlnaHQpJiYoaSh0aGlzLmhlYWRSb3dFbCxzKSxuPXRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHQpLHRoaXMuc2Nyb2xsZXIuc2V0SGVpZ2h0KG4pKSx0aGlzLnNjcm9sbGVyLmxvY2tPdmVyZmxvdyhzKSl9LGNvbXB1dGVTY3JvbGxlckhlaWdodDpmdW5jdGlvbih0KXtyZXR1cm4gdC1kKHRoaXMuZWwsdGhpcy5zY3JvbGxlci5lbCl9LHNldEdyaWRIZWlnaHQ6ZnVuY3Rpb24odCxlKXtlP2EodGhpcy5kYXlHcmlkLnJvd0Vscyk6bCh0aGlzLmRheUdyaWQucm93RWxzLHQsITApfSxxdWVyeVNjcm9sbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbGVyLmdldFNjcm9sbFRvcCgpfSxzZXRTY3JvbGw6ZnVuY3Rpb24odCl7dGhpcy5zY3JvbGxlci5zZXRTY3JvbGxUb3AodCl9LHByZXBhcmVIaXRzOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkLnByZXBhcmVIaXRzKCl9LHJlbGVhc2VIaXRzOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkLnJlbGVhc2VIaXRzKCl9LHF1ZXJ5SGl0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZGF5R3JpZC5xdWVyeUhpdCh0LGUpfSxnZXRIaXRTcGFuOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRheUdyaWQuZ2V0SGl0U3Bhbih0KX0sZ2V0SGl0RWw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF5R3JpZC5nZXRIaXRFbCh0KX0scmVuZGVyRXZlbnRzOmZ1bmN0aW9uKHQpe3RoaXMuZGF5R3JpZC5yZW5kZXJFdmVudHModCksdGhpcy51cGRhdGVIZWlnaHQoKX0sZ2V0RXZlbnRTZWdzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF5R3JpZC5nZXRFdmVudFNlZ3MoKX0sdW5yZW5kZXJFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLmRheUdyaWQudW5yZW5kZXJFdmVudHMoKX0scmVuZGVyRHJhZzpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmRheUdyaWQucmVuZGVyRHJhZyh0LGUpfSx1bnJlbmRlckRyYWc6ZnVuY3Rpb24oKXt0aGlzLmRheUdyaWQudW5yZW5kZXJEcmFnKCl9LHJlbmRlclNlbGVjdGlvbjpmdW5jdGlvbih0KXt0aGlzLmRheUdyaWQucmVuZGVyU2VsZWN0aW9uKHQpfSx1bnJlbmRlclNlbGVjdGlvbjpmdW5jdGlvbigpe3RoaXMuZGF5R3JpZC51bnJlbmRlclNlbGVjdGlvbigpfX0pLGtlPXtyZW5kZXJIZWFkSW50cm9IdG1sOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52aWV3O3JldHVybiB0LmNvbFdlZWtOdW1iZXJzVmlzaWJsZT8nPHRoIGNsYXNzPSJmYy13ZWVrLW51bWJlciAnK3Qud2lkZ2V0SGVhZGVyQ2xhc3MrJyIgJyt0LndlZWtOdW1iZXJTdHlsZUF0dHIoKSsiPjxzcGFuPiIrdHQodC5vcHQoIndlZWtOdW1iZXJUaXRsZSIpKSsiPC9zcGFuPjwvdGg+IjoiIn0scmVuZGVyTnVtYmVySW50cm9IdG1sOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmlldyxuPXRoaXMuZ2V0Q2VsbERhdGUodCwwKTtyZXR1cm4gZS5jb2xXZWVrTnVtYmVyc1Zpc2libGU/Jzx0ZCBjbGFzcz0iZmMtd2Vlay1udW1iZXIiICcrZS53ZWVrTnVtYmVyU3R5bGVBdHRyKCkrIj4iK2UuYnVpbGRHb3RvQW5jaG9ySHRtbCh7ZGF0ZTpuLHR5cGU6IndlZWsiLGZvcmNlT2ZmOjE9PT10aGlzLmNvbENudH0sbi5mb3JtYXQoInciKSkrIjwvdGQ+IjoiIn0scmVuZGVyQmdJbnRyb0h0bWw6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZpZXc7cmV0dXJuIHQuY29sV2Vla051bWJlcnNWaXNpYmxlPyc8dGQgY2xhc3M9ImZjLXdlZWstbnVtYmVyICcrdC53aWRnZXRDb250ZW50Q2xhc3MrJyIgJyt0LndlZWtOdW1iZXJTdHlsZUF0dHIoKSsiPjwvdGQ+IjoiIn0scmVuZGVySW50cm9IdG1sOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52aWV3O3JldHVybiB0LmNvbFdlZWtOdW1iZXJzVmlzaWJsZT8nPHRkIGNsYXNzPSJmYy13ZWVrLW51bWJlciIgJyt0LndlZWtOdW1iZXJTdHlsZUF0dHIoKSsiPjwvdGQ+IjoiIn19LE1lPWp0Lk1vbnRoVmlldz1JZS5leHRlbmQoe2NvbXB1dGVSYW5nZTpmdW5jdGlvbih0KXt2YXIgZSxuPUllLnByb3RvdHlwZS5jb21wdXRlUmFuZ2UuY2FsbCh0aGlzLHQpO3JldHVybiB0aGlzLmlzRml4ZWRXZWVrcygpJiYoZT1NYXRoLmNlaWwobi5lbmQuZGlmZihuLnN0YXJ0LCJ3ZWVrcyIsITApKSxuLmVuZC5hZGQoNi1lLCJ3ZWVrcyIpKSxufSxzZXRHcmlkSGVpZ2h0OmZ1bmN0aW9uKHQsZSl7ZSYmKHQqPXRoaXMucm93Q250LzYpLGwodGhpcy5kYXlHcmlkLnJvd0Vscyx0LCFlKX0saXNGaXhlZFdlZWtzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0KCJmaXhlZFdlZWtDb3VudCIpfX0pO1V0LmJhc2ljPXtjbGFzczpJZX0sVXQuYmFzaWNEYXk9e3R5cGU6ImJhc2ljIixkdXJhdGlvbjp7ZGF5czoxfX0sVXQuYmFzaWNXZWVrPXt0eXBlOiJiYXNpYyIsZHVyYXRpb246e3dlZWtzOjF9fSxVdC5tb250aD17Y2xhc3M6TWUsZHVyYXRpb246e21vbnRoczoxfSxkZWZhdWx0czp7Zml4ZWRXZWVrQ291bnQ6ITB9fTt2YXIgTGU9anQuQWdlbmRhVmlldz1TZS5leHRlbmQoe3Njcm9sbGVyOm51bGwsdGltZUdyaWRDbGFzczp5ZSx0aW1lR3JpZDpudWxsLGRheUdyaWRDbGFzczptZSxkYXlHcmlkOm51bGwsYXhpc1dpZHRoOm51bGwsaGVhZENvbnRhaW5lckVsOm51bGwsbm9TY3JvbGxSb3dFbHM6bnVsbCxib3R0b21SdWxlRWw6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZD10aGlzLmluc3RhbnRpYXRlVGltZUdyaWQoKSx0aGlzLm9wdCgiYWxsRGF5U2xvdCIpJiYodGhpcy5kYXlHcmlkPXRoaXMuaW5zdGFudGlhdGVEYXlHcmlkKCkpLHRoaXMuc2Nyb2xsZXI9bmV3IHdlKHtvdmVyZmxvd1g6ImhpZGRlbiIsb3ZlcmZsb3dZOiJhdXRvIn0pfSxpbnN0YW50aWF0ZVRpbWVHcmlkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50aW1lR3JpZENsYXNzLmV4dGVuZChCZSk7cmV0dXJuIG5ldyB0KHRoaXMpfSxpbnN0YW50aWF0ZURheUdyaWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRheUdyaWRDbGFzcy5leHRlbmQoemUpO3JldHVybiBuZXcgdCh0aGlzKX0sc2V0UmFuZ2U6ZnVuY3Rpb24odCl7U2UucHJvdG90eXBlLnNldFJhbmdlLmNhbGwodGhpcyx0KSx0aGlzLnRpbWVHcmlkLnNldFJhbmdlKHQpLHRoaXMuZGF5R3JpZCYmdGhpcy5kYXlHcmlkLnNldFJhbmdlKHQpfSxyZW5kZXJEYXRlczpmdW5jdGlvbigpe3RoaXMuZWwuYWRkQ2xhc3MoImZjLWFnZW5kYS12aWV3IikuaHRtbCh0aGlzLnJlbmRlclNrZWxldG9uSHRtbCgpKSx0aGlzLnJlbmRlckhlYWQoKSx0aGlzLnNjcm9sbGVyLnJlbmRlcigpO3ZhciBlPXRoaXMuc2Nyb2xsZXIuZWwuYWRkQ2xhc3MoImZjLXRpbWUtZ3JpZC1jb250YWluZXIiKSxuPXQoJzxkaXYgY2xhc3M9ImZjLXRpbWUtZ3JpZCIgLz4nKS5hcHBlbmRUbyhlKTt0aGlzLmVsLmZpbmQoIi5mYy1ib2R5ID4gdHIgPiB0ZCIpLmFwcGVuZChlKSx0aGlzLnRpbWVHcmlkLnNldEVsZW1lbnQobiksdGhpcy50aW1lR3JpZC5yZW5kZXJEYXRlcygpLHRoaXMuYm90dG9tUnVsZUVsPXQoJzxociBjbGFzcz0iZmMtZGl2aWRlciAnK3RoaXMud2lkZ2V0SGVhZGVyQ2xhc3MrJyIvPicpLmFwcGVuZFRvKHRoaXMudGltZUdyaWQuZWwpLHRoaXMuZGF5R3JpZCYmKHRoaXMuZGF5R3JpZC5zZXRFbGVtZW50KHRoaXMuZWwuZmluZCgiLmZjLWRheS1ncmlkIikpLHRoaXMuZGF5R3JpZC5yZW5kZXJEYXRlcygpLHRoaXMuZGF5R3JpZC5ib3R0b21Db29yZFBhZGRpbmc9dGhpcy5kYXlHcmlkLmVsLm5leHQoImhyIikub3V0ZXJIZWlnaHQoKSksdGhpcy5ub1Njcm9sbFJvd0Vscz10aGlzLmVsLmZpbmQoIi5mYy1yb3c6bm90KC5mYy1zY3JvbGxlciAqKSIpfSxyZW5kZXJIZWFkOmZ1bmN0aW9uKCl7dGhpcy5oZWFkQ29udGFpbmVyRWw9dGhpcy5lbC5maW5kKCIuZmMtaGVhZC1jb250YWluZXIiKS5odG1sKHRoaXMudGltZUdyaWQucmVuZGVySGVhZEh0bWwoKSl9LHVucmVuZGVyRGF0ZXM6ZnVuY3Rpb24oKXt0aGlzLnRpbWVHcmlkLnVucmVuZGVyRGF0ZXMoKSx0aGlzLnRpbWVHcmlkLnJlbW92ZUVsZW1lbnQoKSx0aGlzLmRheUdyaWQmJih0aGlzLmRheUdyaWQudW5yZW5kZXJEYXRlcygpLHRoaXMuZGF5R3JpZC5yZW1vdmVFbGVtZW50KCkpLHRoaXMuc2Nyb2xsZXIuZGVzdHJveSgpfSxyZW5kZXJTa2VsZXRvbkh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4nPHRhYmxlPjx0aGVhZCBjbGFzcz0iZmMtaGVhZCI+PHRyPjx0ZCBjbGFzcz0iZmMtaGVhZC1jb250YWluZXIgJyt0aGlzLndpZGdldEhlYWRlckNsYXNzKyciPjwvdGQ+PC90cj48L3RoZWFkPjx0Ym9keSBjbGFzcz0iZmMtYm9keSI+PHRyPjx0ZCBjbGFzcz0iJyt0aGlzLndpZGdldENvbnRlbnRDbGFzcysnIj4nKyh0aGlzLmRheUdyaWQ/JzxkaXYgY2xhc3M9ImZjLWRheS1ncmlkIi8+PGhyIGNsYXNzPSJmYy1kaXZpZGVyICcrdGhpcy53aWRnZXRIZWFkZXJDbGFzcysnIi8+JzoiIikrIjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+In0sYXhpc1N0eWxlQXR0cjpmdW5jdGlvbigpe3JldHVybiBudWxsIT09dGhpcy5heGlzV2lkdGg/J3N0eWxlPSJ3aWR0aDonK3RoaXMuYXhpc1dpZHRoKydweCInOiIifSxyZW5kZXJCdXNpbmVzc0hvdXJzOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZC5yZW5kZXJCdXNpbmVzc0hvdXJzKCksdGhpcy5kYXlHcmlkJiZ0aGlzLmRheUdyaWQucmVuZGVyQnVzaW5lc3NIb3VycygpfSx1bnJlbmRlckJ1c2luZXNzSG91cnM6ZnVuY3Rpb24oKXt0aGlzLnRpbWVHcmlkLnVucmVuZGVyQnVzaW5lc3NIb3VycygpLHRoaXMuZGF5R3JpZCYmdGhpcy5kYXlHcmlkLnVucmVuZGVyQnVzaW5lc3NIb3VycygpfSxnZXROb3dJbmRpY2F0b3JVbml0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0Tm93SW5kaWNhdG9yVW5pdCgpfSxyZW5kZXJOb3dJbmRpY2F0b3I6ZnVuY3Rpb24odCl7dGhpcy50aW1lR3JpZC5yZW5kZXJOb3dJbmRpY2F0b3IodCl9LHVucmVuZGVyTm93SW5kaWNhdG9yOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZC51bnJlbmRlck5vd0luZGljYXRvcigpfSx1cGRhdGVTaXplOmZ1bmN0aW9uKHQpe3RoaXMudGltZUdyaWQudXBkYXRlU2l6ZSh0KSxTZS5wcm90b3R5cGUudXBkYXRlU2l6ZS5jYWxsKHRoaXMsdCl9LHVwZGF0ZVdpZHRoOmZ1bmN0aW9uKCl7dGhpcy5heGlzV2lkdGg9dSh0aGlzLmVsLmZpbmQoIi5mYy1heGlzIikpfSxzZXRIZWlnaHQ6ZnVuY3Rpb24odCxlKXt2YXIgbixzLG87dGhpcy5ib3R0b21SdWxlRWwuaGlkZSgpLHRoaXMuc2Nyb2xsZXIuY2xlYXIoKSxyKHRoaXMubm9TY3JvbGxSb3dFbHMpLHRoaXMuZGF5R3JpZCYmKHRoaXMuZGF5R3JpZC5yZW1vdmVTZWdQb3BvdmVyKCksbj10aGlzLm9wdCgiZXZlbnRMaW1pdCIpLG4mJiJudW1iZXIiIT10eXBlb2YgbiYmKG49RmUpLG4mJnRoaXMuZGF5R3JpZC5saW1pdFJvd3MobikpLGV8fChzPXRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHQpLHRoaXMuc2Nyb2xsZXIuc2V0SGVpZ2h0KHMpLG89dGhpcy5zY3JvbGxlci5nZXRTY3JvbGxiYXJXaWR0aHMoKSwoby5sZWZ0fHxvLnJpZ2h0KSYmKGkodGhpcy5ub1Njcm9sbFJvd0VscyxvKSxzPXRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHQpLHRoaXMuc2Nyb2xsZXIuc2V0SGVpZ2h0KHMpKSx0aGlzLnNjcm9sbGVyLmxvY2tPdmVyZmxvdyhvKSx0aGlzLnRpbWVHcmlkLmdldFRvdGFsU2xhdEhlaWdodCgpPHMmJnRoaXMuYm90dG9tUnVsZUVsLnNob3coKSl9LGNvbXB1dGVTY3JvbGxlckhlaWdodDpmdW5jdGlvbih0KXtyZXR1cm4gdC1kKHRoaXMuZWwsdGhpcy5zY3JvbGxlci5lbCl9LGNvbXB1dGVJbml0aWFsU2Nyb2xsOmZ1bmN0aW9uKCl7dmFyIHQ9ZS5kdXJhdGlvbih0aGlzLm9wdCgic2Nyb2xsVGltZSIpKSxuPXRoaXMudGltZUdyaWQuY29tcHV0ZVRpbWVUb3AodCk7cmV0dXJuIG49TWF0aC5jZWlsKG4pLG4mJm4rKyxufSxxdWVyeVNjcm9sbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbGVyLmdldFNjcm9sbFRvcCgpfSxzZXRTY3JvbGw6ZnVuY3Rpb24odCl7dGhpcy5zY3JvbGxlci5zZXRTY3JvbGxUb3AodCl9LHByZXBhcmVIaXRzOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZC5wcmVwYXJlSGl0cygpLHRoaXMuZGF5R3JpZCYmdGhpcy5kYXlHcmlkLnByZXBhcmVIaXRzKCl9LHJlbGVhc2VIaXRzOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZC5yZWxlYXNlSGl0cygpLHRoaXMuZGF5R3JpZCYmdGhpcy5kYXlHcmlkLnJlbGVhc2VIaXRzKCl9LHF1ZXJ5SGl0OmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy50aW1lR3JpZC5xdWVyeUhpdCh0LGUpO3JldHVybiFuJiZ0aGlzLmRheUdyaWQmJihuPXRoaXMuZGF5R3JpZC5xdWVyeUhpdCh0LGUpKSxufSxnZXRIaXRTcGFuOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvbXBvbmVudC5nZXRIaXRTcGFuKHQpfSxnZXRIaXRFbDpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb21wb25lbnQuZ2V0SGl0RWwodCl9LHJlbmRlckV2ZW50czpmdW5jdGlvbih0KXt2YXIgZSxuLGk9W10scj1bXSxzPVtdO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXS5hbGxEYXk/aS5wdXNoKHRbbl0pOnIucHVzaCh0W25dKTtlPXRoaXMudGltZUdyaWQucmVuZGVyRXZlbnRzKHIpLHRoaXMuZGF5R3JpZCYmKHM9dGhpcy5kYXlHcmlkLnJlbmRlckV2ZW50cyhpKSksdGhpcy51cGRhdGVIZWlnaHQoKX0sZ2V0RXZlbnRTZWdzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0RXZlbnRTZWdzKCkuY29uY2F0KHRoaXMuZGF5R3JpZD90aGlzLmRheUdyaWQuZ2V0RXZlbnRTZWdzKCk6W10pfSx1bnJlbmRlckV2ZW50czpmdW5jdGlvbigpe3RoaXMudGltZUdyaWQudW5yZW5kZXJFdmVudHMoKSx0aGlzLmRheUdyaWQmJnRoaXMuZGF5R3JpZC51bnJlbmRlckV2ZW50cygpfSxyZW5kZXJEcmFnOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc3RhcnQuaGFzVGltZSgpP3RoaXMudGltZUdyaWQucmVuZGVyRHJhZyh0LGUpOnRoaXMuZGF5R3JpZD90aGlzLmRheUdyaWQucmVuZGVyRHJhZyh0LGUpOnZvaWQgMH0sdW5yZW5kZXJEcmFnOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZC51bnJlbmRlckRyYWcoKSx0aGlzLmRheUdyaWQmJnRoaXMuZGF5R3JpZC51bnJlbmRlckRyYWcoKX0scmVuZGVyU2VsZWN0aW9uOmZ1bmN0aW9uKHQpe3Quc3RhcnQuaGFzVGltZSgpfHx0LmVuZC5oYXNUaW1lKCk/dGhpcy50aW1lR3JpZC5yZW5kZXJTZWxlY3Rpb24odCk6dGhpcy5kYXlHcmlkJiZ0aGlzLmRheUdyaWQucmVuZGVyU2VsZWN0aW9uKHQpfSx1bnJlbmRlclNlbGVjdGlvbjpmdW5jdGlvbigpe3RoaXMudGltZUdyaWQudW5yZW5kZXJTZWxlY3Rpb24oKSx0aGlzLmRheUdyaWQmJnRoaXMuZGF5R3JpZC51bnJlbmRlclNlbGVjdGlvbigpfX0pLEJlPXtyZW5kZXJIZWFkSW50cm9IdG1sOmZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLnZpZXc7cmV0dXJuIGUub3B0KCJ3ZWVrTnVtYmVycyIpPyh0PXRoaXMuc3RhcnQuZm9ybWF0KGUub3B0KCJzbWFsbFdlZWtGb3JtYXQiKSksJzx0aCBjbGFzcz0iZmMtYXhpcyBmYy13ZWVrLW51bWJlciAnK2Uud2lkZ2V0SGVhZGVyQ2xhc3MrJyIgJytlLmF4aXNTdHlsZUF0dHIoKSsiPiIrZS5idWlsZEdvdG9BbmNob3JIdG1sKHtkYXRlOnRoaXMuc3RhcnQsdHlwZToid2VlayIsZm9yY2VPZmY6dGhpcy5jb2xDbnQ+MX0sdHQodCkpKyI8L3RoPiIpOic8dGggY2xhc3M9ImZjLWF4aXMgJytlLndpZGdldEhlYWRlckNsYXNzKyciICcrZS5heGlzU3R5bGVBdHRyKCkrIj48L3RoPiJ9LHJlbmRlckJnSW50cm9IdG1sOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52aWV3O3JldHVybic8dGQgY2xhc3M9ImZjLWF4aXMgJyt0LndpZGdldENvbnRlbnRDbGFzcysnIiAnK3QuYXhpc1N0eWxlQXR0cigpKyI+PC90ZD4ifSxyZW5kZXJJbnRyb0h0bWw6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZpZXc7cmV0dXJuJzx0ZCBjbGFzcz0iZmMtYXhpcyIgJyt0LmF4aXNTdHlsZUF0dHIoKSsiPjwvdGQ+In19LHplPXtyZW5kZXJCZ0ludHJvSHRtbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMudmlldztyZXR1cm4nPHRkIGNsYXNzPSJmYy1heGlzICcrdC53aWRnZXRDb250ZW50Q2xhc3MrJyIgJyt0LmF4aXNTdHlsZUF0dHIoKSsiPjxzcGFuPiIrdC5nZXRBbGxEYXlIdG1sKCkrIjwvc3Bhbj48L3RkPiJ9LHJlbmRlckludHJvSHRtbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMudmlldztyZXR1cm4nPHRkIGNsYXNzPSJmYy1heGlzIiAnK3QuYXhpc1N0eWxlQXR0cigpKyI+PC90ZD4ifX0sRmU9NSxOZT1be2hvdXJzOjF9LHttaW51dGVzOjMwfSx7bWludXRlczoxNX0se3NlY29uZHM6MzB9LHtzZWNvbmRzOjE1fV07VXQuYWdlbmRhPXtjbGFzczpMZSxkZWZhdWx0czp7YWxsRGF5U2xvdDohMCxzbG90RHVyYXRpb246IjAwOjMwOjAwIixtaW5UaW1lOiIwMDowMDowMCIsbWF4VGltZToiMjQ6MDA6MDAiLHNsb3RFdmVudE92ZXJsYXA6ITB9fSxVdC5hZ2VuZGFEYXk9e3R5cGU6ImFnZW5kYSIsZHVyYXRpb246e2RheXM6MX19LFV0LmFnZW5kYVdlZWs9e3R5cGU6ImFnZW5kYSIsZHVyYXRpb246e3dlZWtzOjF9fTt2YXIgR2U9U2UuZXh0ZW5kKHtncmlkOm51bGwsc2Nyb2xsZXI6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5ncmlkPW5ldyBBZSh0aGlzKSx0aGlzLnNjcm9sbGVyPW5ldyB3ZSh7b3ZlcmZsb3dYOiJoaWRkZW4iLG92ZXJmbG93WToiYXV0byJ9KX0sc2V0UmFuZ2U6ZnVuY3Rpb24odCl7U2UucHJvdG90eXBlLnNldFJhbmdlLmNhbGwodGhpcyx0KSx0aGlzLmdyaWQuc2V0UmFuZ2UodCl9LHJlbmRlclNrZWxldG9uOmZ1bmN0aW9uKCl7dGhpcy5lbC5hZGRDbGFzcygiZmMtbGlzdC12aWV3ICIrdGhpcy53aWRnZXRDb250ZW50Q2xhc3MpLHRoaXMuc2Nyb2xsZXIucmVuZGVyKCksdGhpcy5zY3JvbGxlci5lbC5hcHBlbmRUbyh0aGlzLmVsKSx0aGlzLmdyaWQuc2V0RWxlbWVudCh0aGlzLnNjcm9sbGVyLnNjcm9sbEVsKX0sdW5yZW5kZXJTa2VsZXRvbjpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsZXIuZGVzdHJveSgpfSxzZXRIZWlnaHQ6ZnVuY3Rpb24odCxlKXt0aGlzLnNjcm9sbGVyLnNldEhlaWdodCh0aGlzLmNvbXB1dGVTY3JvbGxlckhlaWdodCh0KSl9LGNvbXB1dGVTY3JvbGxlckhlaWdodDpmdW5jdGlvbih0KXtyZXR1cm4gdC1kKHRoaXMuZWwsdGhpcy5zY3JvbGxlci5lbCl9LHJlbmRlckV2ZW50czpmdW5jdGlvbih0KXt0aGlzLmdyaWQucmVuZGVyRXZlbnRzKHQpfSx1bnJlbmRlckV2ZW50czpmdW5jdGlvbigpe3RoaXMuZ3JpZC51bnJlbmRlckV2ZW50cygpfSxpc0V2ZW50UmVzaXphYmxlOmZ1bmN0aW9uKHQpe3JldHVybiExfSxpc0V2ZW50RHJhZ2dhYmxlOmZ1bmN0aW9uKHQpe3JldHVybiExfX0pLEFlPXBlLmV4dGVuZCh7c2VnU2VsZWN0b3I6Ii5mYy1saXN0LWl0ZW0iLGhhc0RheUludGVyYWN0aW9uczohMSxzcGFuVG9TZWdzOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPXRoaXMudmlldyxpPW4uc3RhcnQuY2xvbmUoKS50aW1lKDApLHI9MCxzPVtdO2k8bi5lbmQ7KWlmKGU9Rih0LHtzdGFydDppLGVuZDppLmNsb25lKCkuYWRkKDEsImRheSIpfSksZSYmKGUuZGF5SW5kZXg9cixzLnB1c2goZSkpLGkuYWRkKDEsImRheSIpLHIrKyxlJiYhZS5pc0VuZCYmdC5lbmQuaGFzVGltZSgpJiZ0LmVuZDxpLmNsb25lKCkuYWRkKHRoaXMudmlldy5uZXh0RGF5VGhyZXNob2xkKSl7ZS5lbmQ9dC5lbmQuY2xvbmUoKSxlLmlzRW5kPSEwO2JyZWFrfXJldHVybiBzfSxjb21wdXRlRXZlbnRUaW1lRm9ybWF0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlldy5vcHQoIm1lZGl1bVRpbWVGb3JtYXQiKX0saGFuZGxlU2VnQ2xpY2s6ZnVuY3Rpb24oZSxuKXt2YXIgaTtwZS5wcm90b3R5cGUuaGFuZGxlU2VnQ2xpY2suYXBwbHkodGhpcyxhcmd1bWVudHMpLHQobi50YXJnZXQpLmNsb3Nlc3QoImFbaHJlZl0iKS5sZW5ndGh8fChpPWUuZXZlbnQudXJsLGkmJiFuLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYod2luZG93LmxvY2F0aW9uLmhyZWY9aSkpfSxyZW5kZXJGZ1NlZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dGhpcy5yZW5kZXJGZ1NlZ0Vscyh0KSx0Lmxlbmd0aD90aGlzLnJlbmRlclNlZ0xpc3QodCk6dGhpcy5yZW5kZXJFbXB0eU1lc3NhZ2UoKSx0fSxyZW5kZXJFbXB0eU1lc3NhZ2U6ZnVuY3Rpb24oKXt0aGlzLmVsLmh0bWwoJzxkaXYgY2xhc3M9ImZjLWxpc3QtZW1wdHktd3JhcDIiPjxkaXYgY2xhc3M9ImZjLWxpc3QtZW1wdHktd3JhcDEiPjxkaXYgY2xhc3M9ImZjLWxpc3QtZW1wdHkiPicrdHQodGhpcy52aWV3Lm9wdCgibm9FdmVudHNNZXNzYWdlIikpKyI8L2Rpdj48L2Rpdj48L2Rpdj4iKX0scmVuZGVyU2VnTGlzdDpmdW5jdGlvbihlKXt2YXIgbixpLHIscz10aGlzLmdyb3VwU2Vnc0J5RGF5KGUpLG89dCgnPHRhYmxlIGNsYXNzPSJmYy1saXN0LXRhYmxlIj48dGJvZHkvPjwvdGFibGU+JyksbD1vLmZpbmQoInRib2R5Iik7Zm9yKG49MDtuPHMubGVuZ3RoO24rKylpZihpPXNbbl0pZm9yKGwuYXBwZW5kKHRoaXMuZGF5SGVhZGVySHRtbCh0aGlzLnZpZXcuc3RhcnQuY2xvbmUoKS5hZGQobiwiZGF5cyIpKSksdGhpcy5zb3J0RXZlbnRTZWdzKGkpLHI9MDtyPGkubGVuZ3RoO3IrKylsLmFwcGVuZChpW3JdLmVsKTt0aGlzLmVsLmVtcHR5KCkuYXBwZW5kKG8pfSxncm91cFNlZ3NCeURheTpmdW5jdGlvbih0KXt2YXIgZSxuLGk9W107Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyluPXRbZV0sKGlbbi5kYXlJbmRleF18fChpW24uZGF5SW5kZXhdPVtdKSkucHVzaChuKTtyZXR1cm4gaX0sZGF5SGVhZGVySHRtbDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnZpZXcsbj1lLm9wdCgibGlzdERheUZvcm1hdCIpLGk9ZS5vcHQoImxpc3REYXlBbHRGb3JtYXQiKTtyZXR1cm4nPHRyIGNsYXNzPSJmYy1saXN0LWhlYWRpbmciIGRhdGEtZGF0ZT0iJyt0LmZvcm1hdCgiWVlZWS1NTS1ERCIpKyciPjx0ZCBjbGFzcz0iJytlLndpZGdldEhlYWRlckNsYXNzKyciIGNvbHNwYW49IjMiPicrKG4/ZS5idWlsZEdvdG9BbmNob3JIdG1sKHQse2NsYXNzOiJmYy1saXN0LWhlYWRpbmctbWFpbiJ9LHR0KHQuZm9ybWF0KG4pKSk6IiIpKyhpP2UuYnVpbGRHb3RvQW5jaG9ySHRtbCh0LHtjbGFzczoiZmMtbGlzdC1oZWFkaW5nLWFsdCJ9LHR0KHQuZm9ybWF0KGkpKSk6IiIpKyI8L3RkPjwvdHI+In0sZmdTZWdIdG1sOmZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy52aWV3LGk9WyJmYy1saXN0LWl0ZW0iXS5jb25jYXQodGhpcy5nZXRTZWdDdXN0b21DbGFzc2VzKHQpKSxyPXRoaXMuZ2V0U2VnQmFja2dyb3VuZENvbG9yKHQpLHM9dC5ldmVudCxvPXMudXJsO3JldHVybiBlPXMuYWxsRGF5P24uZ2V0QWxsRGF5SHRtbCgpOm4uaXNNdWx0aURheUV2ZW50KHMpP3QuaXNTdGFydHx8dC5pc0VuZD90dCh0aGlzLmdldEV2ZW50VGltZVRleHQodCkpOm4uZ2V0QWxsRGF5SHRtbCgpOnR0KHRoaXMuZ2V0RXZlbnRUaW1lVGV4dChzKSksbyYmaS5wdXNoKCJmYy1oYXMtdXJsIiksJzx0ciBjbGFzcz0iJytpLmpvaW4oIiAiKSsnIj4nKyh0aGlzLmRpc3BsYXlFdmVudFRpbWU/Jzx0ZCBjbGFzcz0iZmMtbGlzdC1pdGVtLXRpbWUgJytuLndpZGdldENvbnRlbnRDbGFzcysnIj4nKyhlfHwiIikrIjwvdGQ+IjoiIikrJzx0ZCBjbGFzcz0iZmMtbGlzdC1pdGVtLW1hcmtlciAnK24ud2lkZ2V0Q29udGVudENsYXNzKyciPjxzcGFuIGNsYXNzPSJmYy1ldmVudC1kb3QiJysocj8nIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOicrcisnIic6IiIpKyc+PC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJmYy1saXN0LWl0ZW0tdGl0bGUgJytuLndpZGdldENvbnRlbnRDbGFzcysnIj48YScrKG8/JyBocmVmPSInK3R0KG8pKyciJzoiIikrIj4iK3R0KHQuZXZlbnQudGl0bGV8fCIiKSsiPC9hPjwvdGQ+PC90cj4ifX0pO3JldHVybiBVdC5saXN0PXtjbGFzczpHZSxidXR0b25UZXh0S2V5OiJsaXN0IixkZWZhdWx0czp7YnV0dG9uVGV4dDoibGlzdCIsbGlzdERheUZvcm1hdDoiTEwiLG5vRXZlbnRzTWVzc2FnZToiTm8gZXZlbnRzIHRvIGRpc3BsYXkifX0sVXQubGlzdERheT17dHlwZToibGlzdCIsZHVyYXRpb246e2RheXM6MX0sZGVmYXVsdHM6e2xpc3REYXlGb3JtYXQ6ImRkZGQifX0sVXQubGlzdFdlZWs9e3R5cGU6Imxpc3QiLGR1cmF0aW9uOnt3ZWVrczoxfSxkZWZhdWx0czp7bGlzdERheUZvcm1hdDoiZGRkZCIsbGlzdERheUFsdEZvcm1hdDoiTEwifX0sVXQubGlzdE1vbnRoPXt0eXBlOiJsaXN0IixkdXJhdGlvbjp7bW9udGg6MX0sZGVmYXVsdHM6e2xpc3REYXlBbHRGb3JtYXQ6ImRkZGQifX0sVXQubGlzdFllYXI9e3R5cGU6Imxpc3QiLGR1cmF0aW9uOnt5ZWFyOjF9LGRlZmF1bHRzOntsaXN0RGF5QWx0Rm9ybWF0OiJkZGRkIn19LGp0fSk7
Ci8qIQpGdWxsQ2FsZW5kYXIgU2NoZWR1bGVyIHYxLjQuMApEb2NzICYgTGljZW5zZTogaHR0cDovL2Z1bGxjYWxlbmRhci5pby9zY2hlZHVsZXIvCihjKSAyMDE2IEFkYW0gU2hhdwogKi8KKGZ1bmN0aW9uKGZhY3RvcnkpIHsKCWlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKCQlkZWZpbmUoWyAnanF1ZXJ5JywgJ21vbWVudCcsICdmdWxsY2FsZW5kYXInIF0sIGZhY3RvcnkpOwoJfQoJZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7IC8vIE5vZGUvQ29tbW9uSlMKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoCgkJCXJlcXVpcmUoJ2pxdWVyeScpLAoJCQlyZXF1aXJlKCdtb21lbnQnKSwKCQkJcmVxdWlyZSgnZnVsbGNhbGVuZGFyJykKCQkpOwoJfQoJZWxzZSB7CgkJZmFjdG9yeShqUXVlcnksIG1vbWVudCk7Cgl9Cn0pKGZ1bmN0aW9uKCQsIG1vbWVudCkgezsKdmFyIENPTF9NSU5fV0lEVEgsIENhbGVuZGFyLCBDYWxlbmRhckV4dGVuc2lvbiwgQ2xhc3MsIENsaXBwZWRTY3JvbGxlciwgQ29vcmRDYWNoZSwgREVGQVVMVF9HUklEX0RVUkFUSU9OLCBEcmFnTGlzdGVuZXIsIEVtaXR0ZXJNaXhpbiwgRW5oYW5jZWRTY3JvbGxlciwgRXZlbnRSb3csIEZDLCBHcmlkLCBIUm93R3JvdXAsIExJQ0VOU0VfSU5GT19VUkwsIExpc3RlbmVyTWl4aW4sIE1BWF9BVVRPX0NFTExTLCBNQVhfQVVUT19TTE9UU19QRVJfTEFCRUwsIE1BWF9DRUxMUywgTUlOX0FVVE9fTEFCRUxTLCBQUkVTRVRfTElDRU5TRV9LRVlTLCBSRUxFQVNFX0RBVEUsIFJlc291cmNlQWdlbmRhVmlldywgUmVzb3VyY2VCYXNpY1ZpZXcsIFJlc291cmNlRGF5R3JpZCwgUmVzb3VyY2VEYXlUYWJsZU1peGluLCBSZXNvdXJjZUdyaWRNaXhpbiwgUmVzb3VyY2VNYW5hZ2VyLCBSZXNvdXJjZU1vbnRoVmlldywgUmVzb3VyY2VSb3csIFJlc291cmNlVGltZUdyaWQsIFJlc291cmNlVGltZWxpbmVHcmlkLCBSZXNvdXJjZVRpbWVsaW5lVmlldywgUmVzb3VyY2VWaWV3TWl4aW4sIFJvd0dyb3VwLCBSb3dQYXJlbnQsIFNUT0NLX1NVQl9EVVJBVElPTlMsIFNjcm9sbEZvbGxvd2VyLCBTY3JvbGxGb2xsb3dlclNwcml0ZSwgU2Nyb2xsSm9pbmVyLCBTY3JvbGxlckNhbnZhcywgU3ByZWFkc2hlZXQsIFRpbWVsaW5lR3JpZCwgVGltZWxpbmVWaWV3LCBVUEdSQURFX1dJTkRPVywgVlJvd0dyb3VwLCBWaWV3LCBhcHBseUFsbCwgY2FwaXRhbGlzZUZpcnN0TGV0dGVyLCBjb21wYXJlQnlGaWVsZFNwZWNzLCBjb21wdXRlSW50ZXJ2YWxVbml0LCBjb21wdXRlT2Zmc2V0Rm9yU2VnLCBjb21wdXRlT2Zmc2V0Rm9yU2VncywgY29weVJlY3QsIGNzc1RvU3RyLCBkZWJvdW5jZSwgZGV0ZWN0V2FybmluZ0luQ29udGFpbmVyLCBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24sIGRpdmlkZVJhbmdlQnlEdXJhdGlvbiwgZHVyYXRpb25IYXNUaW1lLCBmbGV4aWJsZUNvbXBhcmUsIGdldENvbnRlbnRSZWN0LCBnZXRPdXRlclJlY3QsIGdldE93bkNlbGxzLCBnZXRSZWN0SGVpZ2h0LCBnZXRSZWN0V2lkdGgsIGdldFNjcm9sbGJhcldpZHRocywgaENvbnRhaW5SZWN0LCBodG1sRXNjYXBlLCBpbnRlcnNlY3RSYW5nZXMsIGludGVyc2VjdFJlY3RzLCBpc0ltbXVuZVVybCwgaXNJbnQsIGlzVmFsaWRLZXksIGpvaW5SZWN0cywgbXVsdGlwbHlEdXJhdGlvbiwgb3JpZ0Rpc3BsYXlFdmVudHMsIG9yaWdEaXNwbGF5Vmlldywgb3JpZ0dldFNlZ0N1c3RvbUNsYXNzZXMsIG9yaWdHZXRTZWdEZWZhdWx0QmFja2dyb3VuZENvbG9yLCBvcmlnR2V0U2VnRGVmYXVsdEJvcmRlckNvbG9yLCBvcmlnR2V0U2VnRGVmYXVsdFRleHRDb2xvciwgb3JpZ1JlbmRlclNrZWxldG9uLCBvcmlnVW5yZW5kZXJTa2VsZXRvbiwgcGFyc2VGaWVsZFNwZWNzLCBwcm9jZXNzTGljZW5zZUtleSwgcHJveHksIHJlbmRlcmluZ1dhcm5pbmdJbkNvbnRhaW5lciwgc3luY1RoZW4sIHRlc3RSZWN0Q29udGFpbnMsIHRlc3RSZWN0SENvbnRhaW5zLCB0ZXN0UmVjdFZDb250YWlucywgdGltZVJvd1NlZ3NDb2xsaWRlLCB2Q29udGFpblJlY3QsCiAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LAogIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eSwKICBpbmRleE9mID0gW10uaW5kZXhPZiB8fCBmdW5jdGlvbihpdGVtKSB7IGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsgaWYgKGkgaW4gdGhpcyAmJiB0aGlzW2ldID09PSBpdGVtKSByZXR1cm4gaTsgfSByZXR1cm4gLTE7IH0sCiAgc2xpY2UgPSBbXS5zbGljZTsKCkZDID0gJC5mdWxsQ2FsZW5kYXI7CgpGQy5zY2hlZHVsZXJWZXJzaW9uID0gIjEuNC4wIjsKCmlmIChGQy5pbnRlcm5hbEFwaVZlcnNpb24gIT09IDYpIHsKICBGQy53YXJuKCd2JyArIEZDLnNjaGVkdWxlclZlcnNpb24gKyAnIG9mIEZ1bGxDYWxlbmRhciBTY2hlZHVsZXIgJyArICdpcyBpbmNvbXBhdGlibGUgd2l0aCB2JyArIEZDLnZlcnNpb24gKyAnIG9mIHRoZSBjb3JlLlxuJyArICdQbGVhc2Ugc2VlIGh0dHA6Ly9mdWxsY2FsZW5kYXIuaW8vc3VwcG9ydC8gZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7CiAgcmV0dXJuOwp9CgpDYWxlbmRhciA9IEZDLkNhbGVuZGFyOwoKQ2xhc3MgPSBGQy5DbGFzczsKClZpZXcgPSBGQy5WaWV3OwoKR3JpZCA9IEZDLkdyaWQ7CgppbnRlcnNlY3RSYW5nZXMgPSBGQy5pbnRlcnNlY3RSYW5nZXM7CgpkZWJvdW5jZSA9IEZDLmRlYm91bmNlOwoKaXNJbnQgPSBGQy5pc0ludDsKCmdldFNjcm9sbGJhcldpZHRocyA9IEZDLmdldFNjcm9sbGJhcldpZHRoczsKCkRyYWdMaXN0ZW5lciA9IEZDLkRyYWdMaXN0ZW5lcjsKCmh0bWxFc2NhcGUgPSBGQy5odG1sRXNjYXBlOwoKY29tcHV0ZUludGVydmFsVW5pdCA9IEZDLmNvbXB1dGVJbnRlcnZhbFVuaXQ7Cgpwcm94eSA9IEZDLnByb3h5OwoKY2FwaXRhbGlzZUZpcnN0TGV0dGVyID0gRkMuY2FwaXRhbGlzZUZpcnN0TGV0dGVyOwoKYXBwbHlBbGwgPSBGQy5hcHBseUFsbDsKCkVtaXR0ZXJNaXhpbiA9IEZDLkVtaXR0ZXJNaXhpbjsKCkxpc3RlbmVyTWl4aW4gPSBGQy5MaXN0ZW5lck1peGluOwoKZHVyYXRpb25IYXNUaW1lID0gRkMuZHVyYXRpb25IYXNUaW1lOwoKZGl2aWRlUmFuZ2VCeUR1cmF0aW9uID0gRkMuZGl2aWRlUmFuZ2VCeUR1cmF0aW9uOwoKZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uID0gRkMuZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uOwoKbXVsdGlwbHlEdXJhdGlvbiA9IEZDLm11bHRpcGx5RHVyYXRpb247CgpwYXJzZUZpZWxkU3BlY3MgPSBGQy5wYXJzZUZpZWxkU3BlY3M7Cgpjb21wYXJlQnlGaWVsZFNwZWNzID0gRkMuY29tcGFyZUJ5RmllbGRTcGVjczsKCmZsZXhpYmxlQ29tcGFyZSA9IEZDLmZsZXhpYmxlQ29tcGFyZTsKCmludGVyc2VjdFJlY3RzID0gRkMuaW50ZXJzZWN0UmVjdHM7CgpDb29yZENhY2hlID0gRkMuQ29vcmRDYWNoZTsKCmdldENvbnRlbnRSZWN0ID0gRkMuZ2V0Q29udGVudFJlY3Q7CgpnZXRPdXRlclJlY3QgPSBGQy5nZXRPdXRlclJlY3Q7CgoKLyoKR2l2ZW4gYSBqUXVlcnkgPHRyPiBzZXQsIHJldHVybnMgdGhlIDx0ZD4ncyB0aGF0IGRvIG5vdCBoYXZlIG11bHRpLWxpbmUgcm93c3BhbnMuCldvdWxkIHVzZSB0aGUgW3Jvd3NwYW5dIHNlbGVjdG9yLCBidXQgbmV2ZXIgbm90IGRlZmluZWQgaW4gSUU4LgogKi8KCmdldE93bkNlbGxzID0gZnVuY3Rpb24odHJzKSB7CiAgcmV0dXJuIHRycy5maW5kKCc+IHRkJykuZmlsdGVyKGZ1bmN0aW9uKGksIHRkTm9kZSkgewogICAgcmV0dXJuIHRkTm9kZS5yb3dTcGFuIDw9IDE7CiAgfSk7Cn07CgoKLyoKSEFDSyB0byBjb21iYXQgalF1ZXJ5IDMgcHJvbWlzZXMgbm93IGFsd2F5cyBleGVjdXRlZCBkb25lIGhhbmRsZXJzIGFzeW5jaHJvbm91c2x5LgppZiB0aGUgcHJvbWlzZSBpcyByZXNvbHZlZCwgb3Igbm90IGEgcHJvbWlzZSBhdCBhbGwsIGRvbmVGdW5jIGV4ZWN1dGVzIGltbWVkaWF0ZWx5LgppZiB0aGUgcHJvbWlzZSBoYXMgYWxyZWFkeSBiZWVuIHJlamVjdGVkLCBmYWlsRnVuYyBleGVjdXRlcyBpbW1lZGlhdGVseS4KICovCgpzeW5jVGhlbiA9IGZ1bmN0aW9uKHByb21pc2UsIGRvbmVGdW5jLCBmYWlsRnVuYykgewogIGlmICghcHJvbWlzZSB8fCAhcHJvbWlzZS50aGVuIHx8IHByb21pc2Uuc3RhdGUoKSA9PT0gJ3Jlc29sdmVkJykgewogICAgaWYgKGRvbmVGdW5jKSB7CiAgICAgIHJldHVybiAkLndoZW4oZG9uZUZ1bmMoKSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJC53aGVuKCk7CiAgICB9CiAgfSBlbHNlIGlmIChwcm9taXNlLnN0YXRlKCkgPT09ICdyZWplY3RlZCcpIHsKICAgIGlmIChmYWlsRnVuYykgewogICAgICBmYWlsRnVuYygpOwogICAgfQogICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoKS5wcm9taXNlKCk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBwcm9taXNlLnRoZW4oZG9uZUZ1bmMsIGZhaWxGdW5jKTsKICB9Cn07CgoKLyoKQSBTY3JvbGxlciB3aXRoIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eToKLSBvcHRpb25hbCBTY3JvbGxlckNhbnZhcyBmb3IgY29udGVudAotIGZpcmVkIGV2ZW50cyBmb3Igc2Nyb2xsIHN0YXJ0L2VuZAotIGNyb3NzLWJyb3dzZXIgbm9ybWFsaXphdGlvbiBvZiBob3Jpem9udGFsIHNjcm9sbCBmb3IgUlRMCiAqLwoKRW5oYW5jZWRTY3JvbGxlciA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgdmFyIGRldGVjdFJ0bFNjcm9sbFN5c3RlbSwgcnRsU2Nyb2xsU3lzdGVtOwoKICBleHRlbmQoRW5oYW5jZWRTY3JvbGxlciwgc3VwZXJDbGFzcyk7CgogIEVuaGFuY2VkU2Nyb2xsZXIubWl4aW4oRW1pdHRlck1peGluKTsKCiAgRW5oYW5jZWRTY3JvbGxlci5taXhpbihMaXN0ZW5lck1peGluKTsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUuY2FudmFzID0gbnVsbDsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUuaXNTY3JvbGxpbmcgPSBmYWxzZTsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUuaXNUb3VjaGluZyA9IGZhbHNlOwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5pc01vdmluZyA9IGZhbHNlOwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5pc1RvdWNoU2Nyb2xsRW5hYmxlZCA9IHRydWU7CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXIgPSBudWxsOwoKICBmdW5jdGlvbiBFbmhhbmNlZFNjcm9sbGVyKCkgewogICAgRW5oYW5jZWRTY3JvbGxlci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMucmVxdWVzdE1vdmluZ0VuZCA9IGRlYm91bmNlKHRoaXMucmVwb3J0TW92aW5nRW5kLCA1MDApOwogIH0KCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24oKSB7CiAgICBFbmhhbmNlZFNjcm9sbGVyLl9fc3VwZXJfXy5yZW5kZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmICh0aGlzLmNhbnZhcykgewogICAgICB0aGlzLmNhbnZhcy5yZW5kZXIoKTsKICAgICAgdGhpcy5jYW52YXMuZWwuYXBwZW5kVG8odGhpcy5zY3JvbGxFbCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5iaW5kSGFuZGxlcnMoKTsKICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7CiAgICBFbmhhbmNlZFNjcm9sbGVyLl9fc3VwZXJfXy5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdGhpcy51bmJpbmRIYW5kbGVycygpOwogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLmRpc2FibGVUb3VjaFNjcm9sbCA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5pc1RvdWNoU2Nyb2xsRW5hYmxlZCA9IGZhbHNlOwogICAgcmV0dXJuIHRoaXMuYmluZFByZXZlbnRUb3VjaFNjcm9sbCgpOwogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLmVuYWJsZVRvdWNoU2Nyb2xsID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmlzVG91Y2hTY3JvbGxFbmFibGVkID0gdHJ1ZTsKICAgIGlmICghdGhpcy5pc1RvdWNoaW5nKSB7CiAgICAgIHJldHVybiB0aGlzLnVuYmluZFByZXZlbnRUb3VjaFNjcm9sbCgpOwogICAgfQogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLmJpbmRQcmV2ZW50VG91Y2hTY3JvbGwgPSBmdW5jdGlvbigpIHsKICAgIGlmICghdGhpcy5wcmV2ZW50VG91Y2hTY3JvbGxIYW5kbGVyKSB7CiAgICAgIHJldHVybiB0aGlzLnNjcm9sbEVsLm9uKCd0b3VjaG1vdmUnLCB0aGlzLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXIgPSBGQy5wcmV2ZW50RGVmYXVsdCk7CiAgICB9CiAgfTsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUudW5iaW5kUHJldmVudFRvdWNoU2Nyb2xsID0gZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5wcmV2ZW50VG91Y2hTY3JvbGxIYW5kbGVyKSB7CiAgICAgIHRoaXMuc2Nyb2xsRWwub2ZmKCd0b3VjaG1vdmUnLCB0aGlzLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXIpOwogICAgICByZXR1cm4gdGhpcy5wcmV2ZW50VG91Y2hTY3JvbGxIYW5kbGVyID0gbnVsbDsKICAgIH0KICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5iaW5kSGFuZGxlcnMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmxpc3RlblRvKHRoaXMuc2Nyb2xsRWwsIHsKICAgICAgc2Nyb2xsOiB0aGlzLnJlcG9ydFNjcm9sbCwKICAgICAgdG91Y2hzdGFydDogdGhpcy5yZXBvcnRUb3VjaFN0YXJ0LAogICAgICB0b3VjaGVuZDogdGhpcy5yZXBvcnRUb3VjaEVuZAogICAgfSk7CiAgfTsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUudW5iaW5kSGFuZGxlcnMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnN0b3BMaXN0ZW5pbmdUbyh0aGlzLnNjcm9sbEVsKTsKICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5yZXBvcnRTY3JvbGwgPSBmdW5jdGlvbigpIHsKICAgIGlmICghdGhpcy5pc1Njcm9sbGluZykgewogICAgICB0aGlzLnJlcG9ydFNjcm9sbFN0YXJ0KCk7CiAgICB9CiAgICB0aGlzLnRyaWdnZXIoJ3Njcm9sbCcpOwogICAgdGhpcy5pc01vdmluZyA9IHRydWU7CiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0TW92aW5nRW5kKCk7CiAgfTsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUucmVwb3J0U2Nyb2xsU3RhcnQgPSBmdW5jdGlvbigpIHsKICAgIGlmICghdGhpcy5pc1Njcm9sbGluZykgewogICAgICB0aGlzLmlzU2Nyb2xsaW5nID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRoaXMudHJpZ2dlcignc2Nyb2xsU3RhcnQnLCB0aGlzLmlzVG91Y2hpbmcpOwogICAgfQogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLnJlcXVlc3RNb3ZpbmdFbmQgPSBudWxsOwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5yZXBvcnRNb3ZpbmdFbmQgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuaXNNb3ZpbmcgPSBmYWxzZTsKICAgIGlmICghdGhpcy5pc1RvdWNoaW5nKSB7CiAgICAgIHJldHVybiB0aGlzLnJlcG9ydFNjcm9sbEVuZCgpOwogICAgfQogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLnJlcG9ydFNjcm9sbEVuZCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuaXNTY3JvbGxpbmcpIHsKICAgICAgdGhpcy50cmlnZ2VyKCdzY3JvbGxFbmQnKTsKICAgICAgcmV0dXJuIHRoaXMuaXNTY3JvbGxpbmcgPSBmYWxzZTsKICAgIH0KICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5yZXBvcnRUb3VjaFN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5pc1RvdWNoaW5nID0gdHJ1ZTsKICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5yZXBvcnRUb3VjaEVuZCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuaXNUb3VjaGluZykgewogICAgICB0aGlzLmlzVG91Y2hpbmcgPSBmYWxzZTsKICAgICAgaWYgKHRoaXMuaXNUb3VjaFNjcm9sbEVuYWJsZWQpIHsKICAgICAgICB0aGlzLnVuYmluZFByZXZlbnRUb3VjaFNjcm9sbCgpOwogICAgICB9CiAgICAgIGlmICghdGhpcy5pc01vdmluZykgewogICAgICAgIHJldHVybiB0aGlzLnJlcG9ydFNjcm9sbEVuZCgpOwogICAgICB9CiAgICB9CiAgfTsKCgogIC8qCiAgCUlmIFJUTCwgYW5kIHNjcm9sbGVkIHRvIHRoZSBsZWZ0LCByZXR1cm5zIE5FR0FUSVZFIHZhbHVlIChsaWtlIEZpcmVmb3gpCiAgICovCgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLmdldFNjcm9sbExlZnQgPSBmdW5jdGlvbigpIHsKICAgIHZhciBkaXJlY3Rpb24sIG5vZGUsIHZhbDsKICAgIGRpcmVjdGlvbiA9IHRoaXMuc2Nyb2xsRWwuY3NzKCdkaXJlY3Rpb24nKTsKICAgIG5vZGUgPSB0aGlzLnNjcm9sbEVsWzBdOwogICAgdmFsID0gbm9kZS5zY3JvbGxMZWZ0OwogICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3J0bCcpIHsKICAgICAgc3dpdGNoIChydGxTY3JvbGxTeXN0ZW0pIHsKICAgICAgICBjYXNlICdwb3NpdGl2ZSc6CiAgICAgICAgICB2YWwgPSB2YWwgKyBub2RlLmNsaWVudFdpZHRoIC0gbm9kZS5zY3JvbGxXaWR0aDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3JldmVyc2UnOgogICAgICAgICAgdmFsID0gLXZhbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbDsKICB9OwoKCiAgLyoKICAJQWNjZXB0cyBhIE5FR0FUSVZFIHZhbHVlIGZvciB3aGVuIHNjcm9sbGVkIGluIFJUTAogICAqLwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5zZXRTY3JvbGxMZWZ0ID0gZnVuY3Rpb24odmFsKSB7CiAgICB2YXIgZGlyZWN0aW9uLCBub2RlOwogICAgZGlyZWN0aW9uID0gdGhpcy5zY3JvbGxFbC5jc3MoJ2RpcmVjdGlvbicpOwogICAgbm9kZSA9IHRoaXMuc2Nyb2xsRWxbMF07CiAgICBpZiAoZGlyZWN0aW9uID09PSAncnRsJykgewogICAgICBzd2l0Y2ggKHJ0bFNjcm9sbFN5c3RlbSkgewogICAgICAgIGNhc2UgJ3Bvc2l0aXZlJzoKICAgICAgICAgIHZhbCA9IHZhbCAtIG5vZGUuY2xpZW50V2lkdGggKyBub2RlLnNjcm9sbFdpZHRoOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncmV2ZXJzZSc6CiAgICAgICAgICB2YWwgPSAtdmFsOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9kZS5zY3JvbGxMZWZ0ID0gdmFsOwogIH07CgoKICAvKgogIAlBbHdheXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBpeGVscyBzY3JvbGxlZCBmcm9tIHRoZSBsZWZ0bW9zdCBwb3NpdGlvbiAoZXZlbiBpZiBSVEwpLgogIAlBbHdheXMgcG9zaXRpdmUuCiAgICovCgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLmdldFNjcm9sbEZyb21MZWZ0ID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZGlyZWN0aW9uLCBub2RlLCB2YWw7CiAgICBkaXJlY3Rpb24gPSB0aGlzLnNjcm9sbEVsLmNzcygnZGlyZWN0aW9uJyk7CiAgICBub2RlID0gdGhpcy5zY3JvbGxFbFswXTsKICAgIHZhbCA9IG5vZGUuc2Nyb2xsTGVmdDsKICAgIGlmIChkaXJlY3Rpb24gPT09ICdydGwnKSB7CiAgICAgIHN3aXRjaCAocnRsU2Nyb2xsU3lzdGVtKSB7CiAgICAgICAgY2FzZSAnbmVnYXRpdmUnOgogICAgICAgICAgdmFsID0gdmFsIC0gbm9kZS5jbGllbnRXaWR0aCArIG5vZGUuc2Nyb2xsV2lkdGg7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdyZXZlcnNlJzoKICAgICAgICAgIHZhbCA9IC12YWwgLSBub2RlLmNsaWVudFdpZHRoICsgbm9kZS5zY3JvbGxXaWR0aDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbDsKICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5nZXROYXRpdmVTY3JvbGxMZWZ0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5zY3JvbGxFbFswXS5zY3JvbGxMZWZ0OwogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLnNldE5hdGl2ZVNjcm9sbExlZnQgPSBmdW5jdGlvbih2YWwpIHsKICAgIHJldHVybiB0aGlzLnNjcm9sbEVsWzBdLnNjcm9sbExlZnQgPSB2YWw7CiAgfTsKCiAgcnRsU2Nyb2xsU3lzdGVtID0gbnVsbDsKCiAgZGV0ZWN0UnRsU2Nyb2xsU3lzdGVtID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZWwsIG5vZGUsIHN5c3RlbTsKICAgIGVsID0gJCgnPGRpdiBzdHlsZT0iIHBvc2l0aW9uOiBhYnNvbHV0ZSB0b3A6IC0xMDAwcHg7IHdpZHRoOiAxcHg7IGhlaWdodDogMXB4OyBvdmVyZmxvdzogc2Nyb2xsOyBkaXJlY3Rpb246IHJ0bDsgZm9udC1zaXplOiAxNHB4OyAiPkE8L2Rpdj4nKS5hcHBlbmRUbygnYm9keScpOwogICAgbm9kZSA9IGVsWzBdOwogICAgc3lzdGVtID0gbm9kZS5zY3JvbGxMZWZ0ID4gMCA/ICdwb3NpdGl2ZScgOiAobm9kZS5zY3JvbGxMZWZ0ID0gMSwgZWwuc2Nyb2xsTGVmdCA+IDAgPyAncmV2ZXJzZScgOiAnbmVnYXRpdmUnKTsKICAgIGVsLnJlbW92ZSgpOwogICAgcmV0dXJuIHN5c3RlbTsKICB9OwoKICAkKGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHJ0bFNjcm9sbFN5c3RlbSA9IGRldGVjdFJ0bFNjcm9sbFN5c3RlbSgpOwogIH0pOwoKICByZXR1cm4gRW5oYW5jZWRTY3JvbGxlcjsKCn0pKEZDLlNjcm9sbGVyKTsKCgovKgpBIFNjcm9sbGVyLCBidXQgd2l0aCBhIHdyYXBwaW5nIGRpdiB0aGF0IGFsbG93cyAiY2xpcHBpbmciIGF3YXkgb2YgbmF0aXZlIHNjcm9sbGJhcnMsCmdpdmluZyB0aGUgYXBwZWFyYW5jZSB0aGF0IHRoZXJlIGFyZSBubyBzY3JvbGxiYXJzLgogKi8KCkNsaXBwZWRTY3JvbGxlciA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKENsaXBwZWRTY3JvbGxlciwgc3VwZXJDbGFzcyk7CgogIENsaXBwZWRTY3JvbGxlci5wcm90b3R5cGUuaXNIU2Nyb2xsYmFyc0NsaXBwZWQgPSBmYWxzZTsKCiAgQ2xpcHBlZFNjcm9sbGVyLnByb3RvdHlwZS5pc1ZTY3JvbGxiYXJzQ2xpcHBlZCA9IGZhbHNlOwoKCiAgLyoKICAJUmVjZWl2ZWQgb3ZlcmZsb3dzIGNhbiBiZSBzZXQgdG8gJ2NsaXBwZWQnLCBtZWFuaW5nIHNjcm9sbGJhcnMgc2hvdWxkbid0IGJlIHZpc2libGUKICAJdG8gdGhlIHVzZXIsIGJ1dCB0aGUgYXJlYSBzaG91bGQgc3RpbGwgc2Nyb2xsLgogICAqLwoKICBmdW5jdGlvbiBDbGlwcGVkU2Nyb2xsZXIoKSB7CiAgICBDbGlwcGVkU2Nyb2xsZXIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodGhpcy5vdmVyZmxvd1ggPT09ICdjbGlwcGVkLXNjcm9sbCcpIHsKICAgICAgdGhpcy5vdmVyZmxvd1ggPSAnc2Nyb2xsJzsKICAgICAgdGhpcy5pc0hTY3JvbGxiYXJzQ2xpcHBlZCA9IHRydWU7CiAgICB9CiAgICBpZiAodGhpcy5vdmVyZmxvd1kgPT09ICdjbGlwcGVkLXNjcm9sbCcpIHsKICAgICAgdGhpcy5vdmVyZmxvd1kgPSAnc2Nyb2xsJzsKICAgICAgdGhpcy5pc1ZTY3JvbGxiYXJzQ2xpcHBlZCA9IHRydWU7CiAgICB9CiAgfQoKICBDbGlwcGVkU2Nyb2xsZXIucHJvdG90eXBlLnJlbmRlckVsID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgc2Nyb2xsRWw7CiAgICBzY3JvbGxFbCA9IENsaXBwZWRTY3JvbGxlci5fX3N1cGVyX18ucmVuZGVyRWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHJldHVybiAkKCc8ZGl2IGNsYXNzPSJmYy1zY3JvbGxlci1jbGlwIiAvPicpLmFwcGVuZChzY3JvbGxFbCk7CiAgfTsKCiAgQ2xpcHBlZFNjcm9sbGVyLnByb3RvdHlwZS51cGRhdGVTaXplID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgY3NzUHJvcHMsIHNjcm9sbEVsLCBzY3JvbGxiYXJXaWR0aHM7CiAgICBzY3JvbGxFbCA9IHRoaXMuc2Nyb2xsRWw7CiAgICBzY3JvbGxiYXJXaWR0aHMgPSBnZXRTY3JvbGxiYXJXaWR0aHMoc2Nyb2xsRWwpOwogICAgY3NzUHJvcHMgPSB7CiAgICAgIG1hcmdpbkxlZnQ6IDAsCiAgICAgIG1hcmdpblJpZ2h0OiAwLAogICAgICBtYXJnaW5Ub3A6IDAsCiAgICAgIG1hcmdpbkJvdHRvbTogMAogICAgfTsKICAgIGlmICh0aGlzLmlzSFNjcm9sbGJhcnNDbGlwcGVkKSB7CiAgICAgIGNzc1Byb3BzLm1hcmdpblRvcCA9IC1zY3JvbGxiYXJXaWR0aHMudG9wOwogICAgICBjc3NQcm9wcy5tYXJnaW5Cb3R0b20gPSAtc2Nyb2xsYmFyV2lkdGhzLmJvdHRvbTsKICAgIH0KICAgIGlmICh0aGlzLmlzVlNjcm9sbGJhcnNDbGlwcGVkKSB7CiAgICAgIGNzc1Byb3BzLm1hcmdpbkxlZnQgPSAtc2Nyb2xsYmFyV2lkdGhzLmxlZnQ7CiAgICAgIGNzc1Byb3BzLm1hcmdpblJpZ2h0ID0gLXNjcm9sbGJhcldpZHRocy5yaWdodDsKICAgIH0KICAgIHNjcm9sbEVsLmNzcyhjc3NQcm9wcyk7CiAgICByZXR1cm4gc2Nyb2xsRWwudG9nZ2xlQ2xhc3MoJ2ZjLW5vLXNjcm9sbGJhcnMnLCAodGhpcy5pc0hTY3JvbGxiYXJzQ2xpcHBlZCB8fCB0aGlzLm92ZXJmbG93WCA9PT0gJ2hpZGRlbicpICYmICh0aGlzLmlzVlNjcm9sbGJhcnNDbGlwcGVkIHx8IHRoaXMub3ZlcmZsb3dZID09PSAnaGlkZGVuJykgJiYgIShzY3JvbGxiYXJXaWR0aHMudG9wIHx8IHNjcm9sbGJhcldpZHRocy5ib3R0b20gfHwgc2Nyb2xsYmFyV2lkdGhzLmxlZnQgfHwgc2Nyb2xsYmFyV2lkdGhzLnJpZ2h0KSk7CiAgfTsKCgogIC8qCiAgCUFjY291bnRzIGZvciAnY2xpcHBlZCcgc2Nyb2xsYmFycwogICAqLwoKICBDbGlwcGVkU2Nyb2xsZXIucHJvdG90eXBlLmdldFNjcm9sbGJhcldpZHRocyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHdpZHRoczsKICAgIHdpZHRocyA9IGdldFNjcm9sbGJhcldpZHRocyh0aGlzLnNjcm9sbEVsKTsKICAgIGlmICh0aGlzLmlzSFNjcm9sbGJhcnNDbGlwcGVkKSB7CiAgICAgIHdpZHRocy50b3AgPSAwOwogICAgICB3aWR0aHMuYm90dG9tID0gMDsKICAgIH0KICAgIGlmICh0aGlzLmlzVlNjcm9sbGJhcnNDbGlwcGVkKSB7CiAgICAgIHdpZHRocy5sZWZ0ID0gMDsKICAgICAgd2lkdGhzLnJpZ2h0ID0gMDsKICAgIH0KICAgIHJldHVybiB3aWR0aHM7CiAgfTsKCiAgcmV0dXJuIENsaXBwZWRTY3JvbGxlcjsKCn0pKEVuaGFuY2VkU2Nyb2xsZXIpOwoKCi8qCkEgcmVjdGFuZ3VsYXIgYXJlYSBvZiBjb250ZW50IHRoYXQgbGl2ZXMgd2l0aGluIGEgU2Nyb2xsZXIuCkNhbiBoYXZlICJndXR0ZXJzIiwgYXJlYXMgb2YgZGVhZCBzcGFjaW5nIGFyb3VuZCB0aGUgcGVyaW1ldGVyLgpBbHNvIHZlcnkgdXNlZnVsIGZvciBmb3JjaW5nIGEgd2lkdGgsIHdoaWNoIGEgU2Nyb2xsZXIgY2Fubm90IGRvIGFsb25lLgpIYXMgYSBjb250ZW50IGFyZWEgdGhhdCBsaXZlcyBhYm92ZSBhIGJhY2tncm91bmQgYXJlYS4KICovCgpTY3JvbGxlckNhbnZhcyA9IChmdW5jdGlvbigpIHsKICBTY3JvbGxlckNhbnZhcy5wcm90b3R5cGUuZWwgPSBudWxsOwoKICBTY3JvbGxlckNhbnZhcy5wcm90b3R5cGUuY29udGVudEVsID0gbnVsbDsKCiAgU2Nyb2xsZXJDYW52YXMucHJvdG90eXBlLmJnRWwgPSBudWxsOwoKICBTY3JvbGxlckNhbnZhcy5wcm90b3R5cGUuZ3V0dGVycyA9IG51bGw7CgogIFNjcm9sbGVyQ2FudmFzLnByb3RvdHlwZS53aWR0aCA9IG51bGw7CgogIFNjcm9sbGVyQ2FudmFzLnByb3RvdHlwZS5taW5XaWR0aCA9IG51bGw7CgogIGZ1bmN0aW9uIFNjcm9sbGVyQ2FudmFzKCkgewogICAgdGhpcy5ndXR0ZXJzID0ge307CiAgfQoKICBTY3JvbGxlckNhbnZhcy5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsID0gJCgnPGRpdiBjbGFzcz0iZmMtc2Nyb2xsZXItY2FudmFzIj4gPGRpdiBjbGFzcz0iZmMtY29udGVudCI+PC9kaXY+IDxkaXYgY2xhc3M9ImZjLWJnIj48L2Rpdj4gPC9kaXY+Jyk7CiAgICB0aGlzLmNvbnRlbnRFbCA9IHRoaXMuZWwuZmluZCgnLmZjLWNvbnRlbnQnKTsKICAgIHJldHVybiB0aGlzLmJnRWwgPSB0aGlzLmVsLmZpbmQoJy5mYy1iZycpOwogIH07CgoKICAvKgogIAlJZiBmYWxzeSwgcmVzZXRzIGFsbCB0aGUgZ3V0dGVycyB0byAwCiAgICovCgogIFNjcm9sbGVyQ2FudmFzLnByb3RvdHlwZS5zZXRHdXR0ZXJzID0gZnVuY3Rpb24oZ3V0dGVycykgewogICAgaWYgKCFndXR0ZXJzKSB7CiAgICAgIHRoaXMuZ3V0dGVycyA9IHt9OwogICAgfSBlbHNlIHsKICAgICAgJC5leHRlbmQodGhpcy5ndXR0ZXJzLCBndXR0ZXJzKTsKICAgIH0KICAgIHJldHVybiB0aGlzLnVwZGF0ZVNpemUoKTsKICB9OwoKICBTY3JvbGxlckNhbnZhcy5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbih3aWR0aDEpIHsKICAgIHRoaXMud2lkdGggPSB3aWR0aDE7CiAgICByZXR1cm4gdGhpcy51cGRhdGVTaXplKCk7CiAgfTsKCiAgU2Nyb2xsZXJDYW52YXMucHJvdG90eXBlLnNldE1pbldpZHRoID0gZnVuY3Rpb24obWluV2lkdGgxKSB7CiAgICB0aGlzLm1pbldpZHRoID0gbWluV2lkdGgxOwogICAgcmV0dXJuIHRoaXMudXBkYXRlU2l6ZSgpOwogIH07CgogIFNjcm9sbGVyQ2FudmFzLnByb3RvdHlwZS5jbGVhcldpZHRoID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLndpZHRoID0gbnVsbDsKICAgIHRoaXMubWluV2lkdGggPSBudWxsOwogICAgcmV0dXJuIHRoaXMudXBkYXRlU2l6ZSgpOwogIH07CgogIFNjcm9sbGVyQ2FudmFzLnByb3RvdHlwZS51cGRhdGVTaXplID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZ3V0dGVyczsKICAgIGd1dHRlcnMgPSB0aGlzLmd1dHRlcnM7CiAgICB0aGlzLmVsLnRvZ2dsZUNsYXNzKCdmYy1ndXR0ZXItbGVmdCcsIEJvb2xlYW4oZ3V0dGVycy5sZWZ0KSkudG9nZ2xlQ2xhc3MoJ2ZjLWd1dHRlci1yaWdodCcsIEJvb2xlYW4oZ3V0dGVycy5yaWdodCkpLnRvZ2dsZUNsYXNzKCdmYy1ndXR0ZXItdG9wJywgQm9vbGVhbihndXR0ZXJzLnRvcCkpLnRvZ2dsZUNsYXNzKCdmYy1ndXR0ZXItYm90dG9tJywgQm9vbGVhbihndXR0ZXJzLmJvdHRvbSkpLmNzcyh7CiAgICAgIHBhZGRpbmdMZWZ0OiBndXR0ZXJzLmxlZnQgfHwgJycsCiAgICAgIHBhZGRpbmdSaWdodDogZ3V0dGVycy5yaWdodCB8fCAnJywKICAgICAgcGFkZGluZ1RvcDogZ3V0dGVycy50b3AgfHwgJycsCiAgICAgIHBhZGRpbmdCb3R0b206IGd1dHRlcnMuYm90dG9tIHx8ICcnLAogICAgICB3aWR0aDogdGhpcy53aWR0aCAhPSBudWxsID8gdGhpcy53aWR0aCArIChndXR0ZXJzLmxlZnQgfHwgMCkgKyAoZ3V0dGVycy5yaWdodCB8fCAwKSA6ICcnLAogICAgICBtaW5XaWR0aDogdGhpcy5taW5XaWR0aCAhPSBudWxsID8gdGhpcy5taW5XaWR0aCArIChndXR0ZXJzLmxlZnQgfHwgMCkgKyAoZ3V0dGVycy5yaWdodCB8fCAwKSA6ICcnCiAgICB9KTsKICAgIHJldHVybiB0aGlzLmJnRWwuY3NzKHsKICAgICAgbGVmdDogZ3V0dGVycy5sZWZ0IHx8ICcnLAogICAgICByaWdodDogZ3V0dGVycy5yaWdodCB8fCAnJywKICAgICAgdG9wOiBndXR0ZXJzLnRvcCB8fCAnJywKICAgICAgYm90dG9tOiBndXR0ZXJzLmJvdHRvbSB8fCAnJwogICAgfSk7CiAgfTsKCiAgcmV0dXJuIFNjcm9sbGVyQ2FudmFzOwoKfSkoKTsKClNjcm9sbEpvaW5lciA9IChmdW5jdGlvbigpIHsKICBTY3JvbGxKb2luZXIucHJvdG90eXBlLmF4aXMgPSBudWxsOwoKICBTY3JvbGxKb2luZXIucHJvdG90eXBlLnNjcm9sbGVycyA9IG51bGw7CgogIFNjcm9sbEpvaW5lci5wcm90b3R5cGUubWFzdGVyU2Nyb2xsZXIgPSBudWxsOwoKICBmdW5jdGlvbiBTY3JvbGxKb2luZXIoYXhpcywgc2Nyb2xsZXJzKSB7CiAgICB2YXIgaiwgbGVuLCByZWYsIHNjcm9sbGVyOwogICAgdGhpcy5heGlzID0gYXhpczsKICAgIHRoaXMuc2Nyb2xsZXJzID0gc2Nyb2xsZXJzOwogICAgcmVmID0gdGhpcy5zY3JvbGxlcnM7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgc2Nyb2xsZXIgPSByZWZbal07CiAgICAgIHRoaXMuaW5pdFNjcm9sbGVyKHNjcm9sbGVyKTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIFNjcm9sbEpvaW5lci5wcm90b3R5cGUuaW5pdFNjcm9sbGVyID0gZnVuY3Rpb24oc2Nyb2xsZXIpIHsKICAgIHNjcm9sbGVyLnNjcm9sbEVsLm9uKCd3aGVlbCBtb3VzZXdoZWVsIERvbU1vdXNlU2Nyb2xsIE1vek1vdXNlUGl4ZWxTY3JvbGwnLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIF90aGlzLmFzc2lnbk1hc3RlclNjcm9sbGVyKHNjcm9sbGVyKTsKICAgICAgfTsKICAgIH0pKHRoaXMpKTsKICAgIHJldHVybiBzY3JvbGxlci5vbignc2Nyb2xsU3RhcnQnLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghX3RoaXMubWFzdGVyU2Nyb2xsZXIpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5hc3NpZ25NYXN0ZXJTY3JvbGxlcihzY3JvbGxlcik7CiAgICAgICAgfQogICAgICB9OwogICAgfSkodGhpcykpLm9uKCdzY3JvbGwnLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBqLCBsZW4sIG90aGVyU2Nyb2xsZXIsIHJlZiwgcmVzdWx0czsKICAgICAgICBpZiAoc2Nyb2xsZXIgPT09IF90aGlzLm1hc3RlclNjcm9sbGVyKSB7CiAgICAgICAgICByZWYgPSBfdGhpcy5zY3JvbGxlcnM7CiAgICAgICAgICByZXN1bHRzID0gW107CiAgICAgICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICAgICAgb3RoZXJTY3JvbGxlciA9IHJlZltqXTsKICAgICAgICAgICAgaWYgKG90aGVyU2Nyb2xsZXIgIT09IHNjcm9sbGVyKSB7CiAgICAgICAgICAgICAgc3dpdGNoIChfdGhpcy5heGlzKSB7CiAgICAgICAgICAgICAgICBjYXNlICdob3Jpem9udGFsJzoKICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKG90aGVyU2Nyb2xsZXIuc2V0TmF0aXZlU2Nyb2xsTGVmdChzY3JvbGxlci5nZXROYXRpdmVTY3JvbGxMZWZ0KCkpKTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICd2ZXJ0aWNhbCc6CiAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChvdGhlclNjcm9sbGVyLnNldFNjcm9sbFRvcChzY3JvbGxlci5nZXRTY3JvbGxUb3AoKSkpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXN1bHRzLnB1c2godm9pZCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgfQogICAgICB9OwogICAgfSkodGhpcykpLm9uKCdzY3JvbGxFbmQnLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChzY3JvbGxlciA9PT0gX3RoaXMubWFzdGVyU2Nyb2xsZXIpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy51bmFzc2lnbk1hc3RlclNjcm9sbGVyKCk7CiAgICAgICAgfQogICAgICB9OwogICAgfSkodGhpcykpOwogIH07CgogIFNjcm9sbEpvaW5lci5wcm90b3R5cGUuYXNzaWduTWFzdGVyU2Nyb2xsZXIgPSBmdW5jdGlvbihzY3JvbGxlcikgewogICAgdmFyIGosIGxlbiwgb3RoZXJTY3JvbGxlciwgcmVmOwogICAgdGhpcy51bmFzc2lnbk1hc3RlclNjcm9sbGVyKCk7CiAgICB0aGlzLm1hc3RlclNjcm9sbGVyID0gc2Nyb2xsZXI7CiAgICByZWYgPSB0aGlzLnNjcm9sbGVyczsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBvdGhlclNjcm9sbGVyID0gcmVmW2pdOwogICAgICBpZiAob3RoZXJTY3JvbGxlciAhPT0gc2Nyb2xsZXIpIHsKICAgICAgICBvdGhlclNjcm9sbGVyLmRpc2FibGVUb3VjaFNjcm9sbCgpOwogICAgICB9CiAgICB9CiAgfTsKCiAgU2Nyb2xsSm9pbmVyLnByb3RvdHlwZS51bmFzc2lnbk1hc3RlclNjcm9sbGVyID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCBvdGhlclNjcm9sbGVyLCByZWY7CiAgICBpZiAodGhpcy5tYXN0ZXJTY3JvbGxlcikgewogICAgICByZWYgPSB0aGlzLnNjcm9sbGVyczsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgb3RoZXJTY3JvbGxlciA9IHJlZltqXTsKICAgICAgICBvdGhlclNjcm9sbGVyLmVuYWJsZVRvdWNoU2Nyb2xsKCk7CiAgICAgIH0KICAgICAgdGhpcy5tYXN0ZXJTY3JvbGxlciA9IG51bGw7CiAgICB9CiAgfTsKCiAgU2Nyb2xsSm9pbmVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhbGxXaWR0aHMsIGksIGosIGssIGxlbiwgbGVuMSwgbWF4Qm90dG9tLCBtYXhMZWZ0LCBtYXhSaWdodCwgbWF4VG9wLCByZWYsIHNjcm9sbGVyLCB3aWR0aHM7CiAgICBhbGxXaWR0aHMgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBqLCBsZW4sIHJlZiwgcmVzdWx0czsKICAgICAgcmVmID0gdGhpcy5zY3JvbGxlcnM7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgc2Nyb2xsZXIgPSByZWZbal07CiAgICAgICAgcmVzdWx0cy5wdXNoKHNjcm9sbGVyLmdldFNjcm9sbGJhcldpZHRocygpKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pLmNhbGwodGhpcyk7CiAgICBtYXhMZWZ0ID0gbWF4UmlnaHQgPSBtYXhUb3AgPSBtYXhCb3R0b20gPSAwOwogICAgZm9yIChqID0gMCwgbGVuID0gYWxsV2lkdGhzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHdpZHRocyA9IGFsbFdpZHRoc1tqXTsKICAgICAgbWF4TGVmdCA9IE1hdGgubWF4KG1heExlZnQsIHdpZHRocy5sZWZ0KTsKICAgICAgbWF4UmlnaHQgPSBNYXRoLm1heChtYXhSaWdodCwgd2lkdGhzLnJpZ2h0KTsKICAgICAgbWF4VG9wID0gTWF0aC5tYXgobWF4VG9wLCB3aWR0aHMudG9wKTsKICAgICAgbWF4Qm90dG9tID0gTWF0aC5tYXgobWF4Qm90dG9tLCB3aWR0aHMuYm90dG9tKTsKICAgIH0KICAgIHJlZiA9IHRoaXMuc2Nyb2xsZXJzOwogICAgZm9yIChpID0gayA9IDAsIGxlbjEgPSByZWYubGVuZ3RoOyBrIDwgbGVuMTsgaSA9ICsraykgewogICAgICBzY3JvbGxlciA9IHJlZltpXTsKICAgICAgd2lkdGhzID0gYWxsV2lkdGhzW2ldOwogICAgICBzY3JvbGxlci5jYW52YXMuc2V0R3V0dGVycyh0aGlzLmF4aXMgPT09ICdob3Jpem9udGFsJyA/IHsKICAgICAgICBsZWZ0OiBtYXhMZWZ0IC0gd2lkdGhzLmxlZnQsCiAgICAgICAgcmlnaHQ6IG1heFJpZ2h0IC0gd2lkdGhzLnJpZ2h0CiAgICAgIH0gOiB7CiAgICAgICAgdG9wOiBtYXhUb3AgLSB3aWR0aHMudG9wLAogICAgICAgIGJvdHRvbTogbWF4Qm90dG9tIC0gd2lkdGhzLmJvdHRvbQogICAgICB9KTsKICAgIH0KICB9OwoKICByZXR1cm4gU2Nyb2xsSm9pbmVyOwoKfSkoKTsKClNjcm9sbEZvbGxvd2VyID0gKGZ1bmN0aW9uKCkgewogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5zY3JvbGxlciA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5zY3JvbGxiYXJXaWR0aHMgPSBudWxsOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuc3ByaXRlcyA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS52aWV3cG9ydFJlY3QgPSBudWxsOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuY29udGVudE9mZnNldCA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5pc0hGb2xsb3dpbmcgPSB0cnVlOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuaXNWRm9sbG93aW5nID0gZmFsc2U7CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5jb250YWluT25OYXR1cmFsTGVmdCA9IGZhbHNlOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuY29udGFpbk9uTmF0dXJhbFJpZ2h0ID0gZmFsc2U7CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5taW5UcmF2ZWwgPSAwOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuaXNUb3VjaCA9IGZhbHNlOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuaXNGb3JjZWRSZWxhdGl2ZSA9IGZhbHNlOwoKICBmdW5jdGlvbiBTY3JvbGxGb2xsb3dlcihzY3JvbGxlciwgaXNUb3VjaCkgewogICAgdGhpcy5pc1RvdWNoID0gaXNUb3VjaDsKICAgIHRoaXMuc2Nyb2xsZXIgPSBzY3JvbGxlcjsKICAgIHRoaXMuc3ByaXRlcyA9IFtdOwogICAgaWYgKHRoaXMuaXNUb3VjaCkgewogICAgICB0aGlzLmlzRm9yY2VkUmVsYXRpdmUgPSB0cnVlOwogICAgfQogICAgc2Nyb2xsZXIub24oKHRoaXMuaXNUb3VjaCA/ICdzY3JvbGxFbmQnIDogJ3Njcm9sbCcpLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBfdGhpcy5oYW5kbGVTY3JvbGwoKTsKICAgICAgfTsKICAgIH0pKHRoaXMpKTsKICB9CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5zZXRTcHJpdGVzID0gZnVuY3Rpb24oc3ByaXRlcykgewogICAgdmFyIGosIGxlbiwgc3ByaXRlOwogICAgdGhpcy5jbGVhclNwcml0ZXMoKTsKICAgIGlmIChzcHJpdGVzIGluc3RhbmNlb2YgJCkgewogICAgICByZXR1cm4gdGhpcy5zcHJpdGVzID0gKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBqLCBsZW4sIHJlc3VsdHM7CiAgICAgICAgcmVzdWx0cyA9IFtdOwogICAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHNwcml0ZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICAgIHNwcml0ZSA9IHNwcml0ZXNbal07CiAgICAgICAgICByZXN1bHRzLnB1c2gobmV3IFNjcm9sbEZvbGxvd2VyU3ByaXRlKCQoc3ByaXRlKSwgdGhpcykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgfSkuY2FsbCh0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHNwcml0ZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICBzcHJpdGUgPSBzcHJpdGVzW2pdOwogICAgICAgIHNwcml0ZS5mb2xsb3dlciA9IHRoaXM7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuc3ByaXRlcyA9IHNwcml0ZXM7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXIucHJvdG90eXBlLmNsZWFyU3ByaXRlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGosIGxlbiwgcmVmLCBzcHJpdGU7CiAgICByZWYgPSB0aGlzLnNwcml0ZXM7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgc3ByaXRlID0gcmVmW2pdOwogICAgICBzcHJpdGUuY2xlYXIoKTsKICAgIH0KICAgIHJldHVybiB0aGlzLnNwcml0ZXMgPSBbXTsKICB9OwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KCk7CiAgICByZXR1cm4gdGhpcy51cGRhdGVQb3NpdGlvbnMoKTsKICB9OwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuY2FjaGVEaW1lbnNpb25zID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCByZWYsIHNwcml0ZTsKICAgIHRoaXMudXBkYXRlVmlld3BvcnQoKTsKICAgIHRoaXMuc2Nyb2xsYmFyV2lkdGhzID0gdGhpcy5zY3JvbGxlci5nZXRTY3JvbGxiYXJXaWR0aHMoKTsKICAgIHRoaXMuY29udGVudE9mZnNldCA9IHRoaXMuc2Nyb2xsZXIuY2FudmFzLmVsLm9mZnNldCgpOwogICAgcmVmID0gdGhpcy5zcHJpdGVzOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHNwcml0ZSA9IHJlZltqXTsKICAgICAgc3ByaXRlLmNhY2hlRGltZW5zaW9ucygpOwogICAgfQogIH07CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS51cGRhdGVWaWV3cG9ydCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGxlZnQsIHNjcm9sbGVyLCB0b3A7CiAgICBzY3JvbGxlciA9IHRoaXMuc2Nyb2xsZXI7CiAgICBsZWZ0ID0gc2Nyb2xsZXIuZ2V0U2Nyb2xsRnJvbUxlZnQoKTsKICAgIHRvcCA9IHNjcm9sbGVyLmdldFNjcm9sbFRvcCgpOwogICAgcmV0dXJuIHRoaXMudmlld3BvcnRSZWN0ID0gewogICAgICBsZWZ0OiBsZWZ0LAogICAgICByaWdodDogbGVmdCArIHNjcm9sbGVyLmdldENsaWVudFdpZHRoKCksCiAgICAgIHRvcDogdG9wLAogICAgICBib3R0b206IHRvcCArIHNjcm9sbGVyLmdldENsaWVudEhlaWdodCgpCiAgICB9OwogIH07CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5mb3JjZVJlbGF0aXZlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCByZWYsIHJlc3VsdHMsIHNwcml0ZTsKICAgIGlmICghdGhpcy5pc0ZvcmNlZFJlbGF0aXZlKSB7CiAgICAgIHRoaXMuaXNGb3JjZWRSZWxhdGl2ZSA9IHRydWU7CiAgICAgIHJlZiA9IHRoaXMuc3ByaXRlczsKICAgICAgcmVzdWx0cyA9IFtdOwogICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICBzcHJpdGUgPSByZWZbal07CiAgICAgICAgaWYgKHNwcml0ZS5kb0Fic29sdXRlKSB7CiAgICAgICAgICByZXN1bHRzLnB1c2goc3ByaXRlLmFzc2lnblBvc2l0aW9uKCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHRzLnB1c2godm9pZCAwKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXIucHJvdG90eXBlLmNsZWFyRm9yY2UgPSBmdW5jdGlvbigpIHsKICAgIHZhciBqLCBsZW4sIHJlZiwgcmVzdWx0cywgc3ByaXRlOwogICAgaWYgKHRoaXMuaXNGb3JjZWRSZWxhdGl2ZSAmJiAhdGhpcy5pc1RvdWNoKSB7CiAgICAgIHRoaXMuaXNGb3JjZWRSZWxhdGl2ZSA9IGZhbHNlOwogICAgICByZWYgPSB0aGlzLnNwcml0ZXM7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgc3ByaXRlID0gcmVmW2pdOwogICAgICAgIHJlc3VsdHMucHVzaChzcHJpdGUuYXNzaWduUG9zaXRpb24oKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jYWNoZURpbWVuc2lvbnMoKTsKICAgIHJldHVybiB0aGlzLnVwZGF0ZVBvc2l0aW9ucygpOwogIH07CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS51cGRhdGVQb3NpdGlvbnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBqLCBsZW4sIHJlZiwgc3ByaXRlOwogICAgcmVmID0gdGhpcy5zcHJpdGVzOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHNwcml0ZSA9IHJlZltqXTsKICAgICAgc3ByaXRlLnVwZGF0ZVBvc2l0aW9uKCk7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXIucHJvdG90eXBlLmdldENvbnRlbnRSZWN0ID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBnZXRDb250ZW50UmVjdChlbCwgdGhpcy5jb250ZW50T2Zmc2V0KTsKICB9OwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuZ2V0Qm91bmRpbmdSZWN0ID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBnZXRPdXRlclJlY3QoZWwsIHRoaXMuY29udGVudE9mZnNldCk7CiAgfTsKCiAgcmV0dXJuIFNjcm9sbEZvbGxvd2VyOwoKfSkoKTsKClNjcm9sbEZvbGxvd2VyU3ByaXRlID0gKGZ1bmN0aW9uKCkgewogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5mb2xsb3dlciA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5lbCA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5hYnNvbHV0ZUVsID0gbnVsbDsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLm5hdHVyYWxSZWN0ID0gbnVsbDsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLnBhcmVudFJlY3QgPSBudWxsOwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUuY29udGFpbmVyUmVjdCA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5pc0VuYWJsZWQgPSB0cnVlOwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUuaXNIRm9sbG93aW5nID0gZmFsc2U7CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5pc1ZGb2xsb3dpbmcgPSBmYWxzZTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmRvQWJzb2x1dGUgPSBmYWxzZTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmlzQWJzb2x1dGUgPSBmYWxzZTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmlzQ2VudGVyZWQgPSBmYWxzZTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLnJlY3QgPSBudWxsOwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUuaXNCbG9jayA9IGZhbHNlOwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUubmF0dXJhbFdpZHRoID0gbnVsbDsKCiAgZnVuY3Rpb24gU2Nyb2xsRm9sbG93ZXJTcHJpdGUoZWwxLCBmb2xsb3dlcjEpIHsKICAgIHRoaXMuZWwgPSBlbDE7CiAgICB0aGlzLmZvbGxvd2VyID0gZm9sbG93ZXIxICE9IG51bGwgPyBmb2xsb3dlcjEgOiBudWxsOwogICAgdGhpcy5pc0Jsb2NrID0gdGhpcy5lbC5jc3MoJ2Rpc3BsYXknKSA9PT0gJ2Jsb2NrJzsKICAgIHRoaXMuZWwuY3NzKCdwb3NpdGlvbicsICdyZWxhdGl2ZScpOwogIH0KCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmlzRW5hYmxlZCkgewogICAgICB0aGlzLmlzRW5hYmxlZCA9IGZhbHNlOwogICAgICB0aGlzLnJlc2V0UG9zaXRpb24oKTsKICAgICAgcmV0dXJuIHRoaXMudW5hYnNvbHV0aXplKCk7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKCF0aGlzLmlzRW5hYmxlZCkgewogICAgICB0aGlzLmlzRW5hYmxlZCA9IHRydWU7CiAgICAgIHJldHVybiB0aGlzLmFzc2lnblBvc2l0aW9uKCk7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmRpc2FibGUoKTsKICAgIHRoaXMuZm9sbG93ZXIgPSBudWxsOwogICAgcmV0dXJuIHRoaXMuYWJzb2x1dGVFbCA9IG51bGw7CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmNhY2hlRGltZW5zaW9ucyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNvbnRhaW5lclJlY3QsIGZvbGxvd2VyLCBpc0NlbnRlcmVkLCBpc0hGb2xsb3dpbmcsIGlzVkZvbGxvd2luZywgbWluVHJhdmVsLCBuYXR1cmFsUmVjdCwgcGFyZW50RWw7CiAgICBpc0hGb2xsb3dpbmcgPSBmYWxzZTsKICAgIGlzVkZvbGxvd2luZyA9IGZhbHNlOwogICAgaXNDZW50ZXJlZCA9IGZhbHNlOwogICAgdGhpcy5uYXR1cmFsV2lkdGggPSB0aGlzLmVsLndpZHRoKCk7CiAgICB0aGlzLnJlc2V0UG9zaXRpb24oKTsKICAgIGZvbGxvd2VyID0gdGhpcy5mb2xsb3dlcjsKICAgIG5hdHVyYWxSZWN0ID0gdGhpcy5uYXR1cmFsUmVjdCA9IGZvbGxvd2VyLmdldEJvdW5kaW5nUmVjdCh0aGlzLmVsKTsKICAgIHBhcmVudEVsID0gdGhpcy5lbC5wYXJlbnQoKTsKICAgIHRoaXMucGFyZW50UmVjdCA9IGZvbGxvd2VyLmdldEJvdW5kaW5nUmVjdChwYXJlbnRFbCk7CiAgICBjb250YWluZXJSZWN0ID0gdGhpcy5jb250YWluZXJSZWN0ID0gam9pblJlY3RzKGZvbGxvd2VyLmdldENvbnRlbnRSZWN0KHBhcmVudEVsKSwgbmF0dXJhbFJlY3QpOwogICAgbWluVHJhdmVsID0gZm9sbG93ZXIubWluVHJhdmVsOwogICAgaWYgKGZvbGxvd2VyLmNvbnRhaW5Pbk5hdHVyYWxMZWZ0KSB7CiAgICAgIGNvbnRhaW5lclJlY3QubGVmdCA9IG5hdHVyYWxSZWN0LmxlZnQ7CiAgICB9CiAgICBpZiAoZm9sbG93ZXIuY29udGFpbk9uTmF0dXJhbFJpZ2h0KSB7CiAgICAgIGNvbnRhaW5lclJlY3QucmlnaHQgPSBuYXR1cmFsUmVjdC5yaWdodDsKICAgIH0KICAgIGlmIChmb2xsb3dlci5pc0hGb2xsb3dpbmcpIHsKICAgICAgaWYgKGdldFJlY3RXaWR0aChjb250YWluZXJSZWN0KSAtIGdldFJlY3RXaWR0aChuYXR1cmFsUmVjdCkgPj0gbWluVHJhdmVsKSB7CiAgICAgICAgaXNDZW50ZXJlZCA9IHRoaXMuZWwuY3NzKCd0ZXh0LWFsaWduJykgPT09ICdjZW50ZXInOwogICAgICAgIGlzSEZvbGxvd2luZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb2xsb3dlci5pc1ZGb2xsb3dpbmcpIHsKICAgICAgaWYgKGdldFJlY3RIZWlnaHQoY29udGFpbmVyUmVjdCkgLSBnZXRSZWN0SGVpZ2h0KG5hdHVyYWxSZWN0KSA+PSBtaW5UcmF2ZWwpIHsKICAgICAgICBpc1ZGb2xsb3dpbmcgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICB0aGlzLmlzSEZvbGxvd2luZyA9IGlzSEZvbGxvd2luZzsKICAgIHRoaXMuaXNWRm9sbG93aW5nID0gaXNWRm9sbG93aW5nOwogICAgcmV0dXJuIHRoaXMuaXNDZW50ZXJlZCA9IGlzQ2VudGVyZWQ7CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLnVwZGF0ZVBvc2l0aW9uID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNvbXB1dGVQb3NpdGlvbigpOwogICAgcmV0dXJuIHRoaXMuYXNzaWduUG9zaXRpb24oKTsKICB9OwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUucmVzZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZWwuY3NzKHsKICAgICAgdG9wOiAnJywKICAgICAgbGVmdDogJycKICAgIH0pOwogIH07CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5jb21wdXRlUG9zaXRpb24gPSBmdW5jdGlvbigpIHsKICAgIHZhciBjb250YWluZXJSZWN0LCBkb0Fic29sdXRlLCBwYXJlbnRSZWN0LCByZWN0LCByZWN0V2lkdGgsIHN1YmplY3RSZWN0LCB2aWV3cG9ydFJlY3QsIHZpc2libGVQYXJlbnRSZWN0OwogICAgdmlld3BvcnRSZWN0ID0gdGhpcy5mb2xsb3dlci52aWV3cG9ydFJlY3Q7CiAgICBwYXJlbnRSZWN0ID0gdGhpcy5wYXJlbnRSZWN0OwogICAgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyUmVjdDsKICAgIHZpc2libGVQYXJlbnRSZWN0ID0gaW50ZXJzZWN0UmVjdHModmlld3BvcnRSZWN0LCBwYXJlbnRSZWN0KTsKICAgIHJlY3QgPSBudWxsOwogICAgZG9BYnNvbHV0ZSA9IGZhbHNlOwogICAgaWYgKHZpc2libGVQYXJlbnRSZWN0KSB7CiAgICAgIHJlY3QgPSBjb3B5UmVjdCh0aGlzLm5hdHVyYWxSZWN0KTsKICAgICAgc3ViamVjdFJlY3QgPSBpbnRlcnNlY3RSZWN0cyhyZWN0LCBwYXJlbnRSZWN0KTsKICAgICAgaWYgKCh0aGlzLmlzQ2VudGVyZWQgJiYgIXRlc3RSZWN0Q29udGFpbnModmlld3BvcnRSZWN0LCBwYXJlbnRSZWN0KSkgfHwgKHN1YmplY3RSZWN0ICYmICF0ZXN0UmVjdENvbnRhaW5zKHZpZXdwb3J0UmVjdCwgc3ViamVjdFJlY3QpKSkgewogICAgICAgIGRvQWJzb2x1dGUgPSB0cnVlOwogICAgICAgIGlmICh0aGlzLmlzSEZvbGxvd2luZykgewogICAgICAgICAgaWYgKHRoaXMuaXNDZW50ZXJlZCkgewogICAgICAgICAgICByZWN0V2lkdGggPSBnZXRSZWN0V2lkdGgocmVjdCk7CiAgICAgICAgICAgIHJlY3QubGVmdCA9ICh2aXNpYmxlUGFyZW50UmVjdC5sZWZ0ICsgdmlzaWJsZVBhcmVudFJlY3QucmlnaHQpIC8gMiAtIHJlY3RXaWR0aCAvIDI7CiAgICAgICAgICAgIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyByZWN0V2lkdGg7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoIWhDb250YWluUmVjdChyZWN0LCB2aWV3cG9ydFJlY3QpKSB7CiAgICAgICAgICAgICAgZG9BYnNvbHV0ZSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaENvbnRhaW5SZWN0KHJlY3QsIGNvbnRhaW5lclJlY3QpKSB7CiAgICAgICAgICAgIGRvQWJzb2x1dGUgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuaXNWRm9sbG93aW5nKSB7CiAgICAgICAgICBpZiAoIXZDb250YWluUmVjdChyZWN0LCB2aWV3cG9ydFJlY3QpKSB7CiAgICAgICAgICAgIGRvQWJzb2x1dGUgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2Q29udGFpblJlY3QocmVjdCwgY29udGFpbmVyUmVjdCkpIHsKICAgICAgICAgICAgZG9BYnNvbHV0ZSA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXRlc3RSZWN0Q29udGFpbnModmlld3BvcnRSZWN0LCByZWN0KSkgewogICAgICAgICAgZG9BYnNvbHV0ZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhpcy5yZWN0ID0gcmVjdDsKICAgIHJldHVybiB0aGlzLmRvQWJzb2x1dGUgPSBkb0Fic29sdXRlOwogIH07CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5hc3NpZ25Qb3NpdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGxlZnQsIHRvcDsKICAgIGlmICh0aGlzLmlzRW5hYmxlZCkgewogICAgICBpZiAoIXRoaXMucmVjdCkgewogICAgICAgIHJldHVybiB0aGlzLnVuYWJzb2x1dGl6ZSgpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuZG9BYnNvbHV0ZSAmJiAhdGhpcy5mb2xsb3dlci5pc0ZvcmNlZFJlbGF0aXZlKSB7CiAgICAgICAgdGhpcy5hYnNvbHV0aXplKCk7CiAgICAgICAgcmV0dXJuIHRoaXMuYWJzb2x1dGVFbC5jc3MoewogICAgICAgICAgdG9wOiB0aGlzLnJlY3QudG9wIC0gdGhpcy5mb2xsb3dlci52aWV3cG9ydFJlY3QudG9wICsgdGhpcy5mb2xsb3dlci5zY3JvbGxiYXJXaWR0aHMudG9wLAogICAgICAgICAgbGVmdDogdGhpcy5yZWN0LmxlZnQgLSB0aGlzLmZvbGxvd2VyLnZpZXdwb3J0UmVjdC5sZWZ0ICsgdGhpcy5mb2xsb3dlci5zY3JvbGxiYXJXaWR0aHMubGVmdCwKICAgICAgICAgIHdpZHRoOiB0aGlzLmlzQmxvY2sgPyB0aGlzLm5hdHVyYWxXaWR0aCA6ICcnCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9wID0gdGhpcy5yZWN0LnRvcCAtIHRoaXMubmF0dXJhbFJlY3QudG9wOwogICAgICAgIGxlZnQgPSB0aGlzLnJlY3QubGVmdCAtIHRoaXMubmF0dXJhbFJlY3QubGVmdDsKICAgICAgICB0aGlzLnVuYWJzb2x1dGl6ZSgpOwogICAgICAgIHJldHVybiB0aGlzLmVsLnRvZ2dsZUNsYXNzKCdmYy1mb2xsb3dpbmcnLCBCb29sZWFuKHRvcCB8fCBsZWZ0KSkuY3NzKHsKICAgICAgICAgIHRvcDogdG9wLAogICAgICAgICAgbGVmdDogbGVmdAogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmFic29sdXRpemUgPSBmdW5jdGlvbigpIHsKICAgIGlmICghdGhpcy5pc0Fic29sdXRlKSB7CiAgICAgIGlmICghdGhpcy5hYnNvbHV0ZUVsKSB7CiAgICAgICAgdGhpcy5hYnNvbHV0ZUVsID0gdGhpcy5idWlsZEFic29sdXRlRWwoKTsKICAgICAgfQogICAgICB0aGlzLmFic29sdXRlRWwuYXBwZW5kVG8odGhpcy5mb2xsb3dlci5zY3JvbGxlci5lbCk7CiAgICAgIHRoaXMuZWwuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpOwogICAgICByZXR1cm4gdGhpcy5pc0Fic29sdXRlID0gdHJ1ZTsKICAgIH0KICB9OwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUudW5hYnNvbHV0aXplID0gZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5pc0Fic29sdXRlKSB7CiAgICAgIHRoaXMuYWJzb2x1dGVFbC5kZXRhY2goKTsKICAgICAgdGhpcy5lbC5jc3MoJ3Zpc2liaWxpdHknLCAnJyk7CiAgICAgIHJldHVybiB0aGlzLmlzQWJzb2x1dGUgPSBmYWxzZTsKICAgIH0KICB9OwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUuYnVpbGRBYnNvbHV0ZUVsID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5lbC5jbG9uZSgpLmFkZENsYXNzKCdmYy1mb2xsb3dpbmcnKS5jc3MoewogICAgICAncG9zaXRpb24nOiAnYWJzb2x1dGUnLAogICAgICAnei1pbmRleCc6IDEwMDAsCiAgICAgICdmb250LXdlaWdodCc6IHRoaXMuZWwuY3NzKCdmb250LXdlaWdodCcpLAogICAgICAnZm9udC1zaXplJzogdGhpcy5lbC5jc3MoJ2ZvbnQtc2l6ZScpLAogICAgICAnZm9udC1mYW1pbHknOiB0aGlzLmVsLmNzcygnZm9udC1mYW1pbHknKSwKICAgICAgJ2NvbG9yJzogdGhpcy5lbC5jc3MoJ2NvbG9yJyksCiAgICAgICdwYWRkaW5nLXRvcCc6IHRoaXMuZWwuY3NzKCdwYWRkaW5nLXRvcCcpLAogICAgICAncGFkZGluZy1ib3R0b20nOiB0aGlzLmVsLmNzcygncGFkZGluZy1ib3R0b20nKSwKICAgICAgJ3BhZGRpbmctbGVmdCc6IHRoaXMuZWwuY3NzKCdwYWRkaW5nLWxlZnQnKSwKICAgICAgJ3BhZGRpbmctcmlnaHQnOiB0aGlzLmVsLmNzcygncGFkZGluZy1yaWdodCcpLAogICAgICAncG9pbnRlci1ldmVudHMnOiAnbm9uZScKICAgIH0pOwogIH07CgogIHJldHVybiBTY3JvbGxGb2xsb3dlclNwcml0ZTsKCn0pKCk7Cgpjb3B5UmVjdCA9IGZ1bmN0aW9uKHJlY3QpIHsKICByZXR1cm4gewogICAgbGVmdDogcmVjdC5sZWZ0LAogICAgcmlnaHQ6IHJlY3QucmlnaHQsCiAgICB0b3A6IHJlY3QudG9wLAogICAgYm90dG9tOiByZWN0LmJvdHRvbQogIH07Cn07CgpnZXRSZWN0V2lkdGggPSBmdW5jdGlvbihyZWN0KSB7CiAgcmV0dXJuIHJlY3QucmlnaHQgLSByZWN0LmxlZnQ7Cn07CgpnZXRSZWN0SGVpZ2h0ID0gZnVuY3Rpb24ocmVjdCkgewogIHJldHVybiByZWN0LmJvdHRvbSAtIHJlY3QudG9wOwp9OwoKdGVzdFJlY3RDb250YWlucyA9IGZ1bmN0aW9uKHJlY3QsIGlubmVyUmVjdCkgewogIHJldHVybiB0ZXN0UmVjdEhDb250YWlucyhyZWN0LCBpbm5lclJlY3QpICYmIHRlc3RSZWN0VkNvbnRhaW5zKHJlY3QsIGlubmVyUmVjdCk7Cn07Cgp0ZXN0UmVjdEhDb250YWlucyA9IGZ1bmN0aW9uKHJlY3QsIGlubmVyUmVjdCkgewogIHJldHVybiBpbm5lclJlY3QubGVmdCA+PSByZWN0LmxlZnQgJiYgaW5uZXJSZWN0LnJpZ2h0IDw9IHJlY3QucmlnaHQ7Cn07Cgp0ZXN0UmVjdFZDb250YWlucyA9IGZ1bmN0aW9uKHJlY3QsIGlubmVyUmVjdCkgewogIHJldHVybiBpbm5lclJlY3QudG9wID49IHJlY3QudG9wICYmIGlubmVyUmVjdC5ib3R0b20gPD0gcmVjdC5ib3R0b207Cn07CgpoQ29udGFpblJlY3QgPSBmdW5jdGlvbihyZWN0LCBvdXRlclJlY3QpIHsKICBpZiAocmVjdC5sZWZ0IDwgb3V0ZXJSZWN0LmxlZnQpIHsKICAgIHJlY3QucmlnaHQgPSBvdXRlclJlY3QubGVmdCArIGdldFJlY3RXaWR0aChyZWN0KTsKICAgIHJlY3QubGVmdCA9IG91dGVyUmVjdC5sZWZ0OwogICAgcmV0dXJuIHRydWU7CiAgfSBlbHNlIGlmIChyZWN0LnJpZ2h0ID4gb3V0ZXJSZWN0LnJpZ2h0KSB7CiAgICByZWN0LmxlZnQgPSBvdXRlclJlY3QucmlnaHQgLSBnZXRSZWN0V2lkdGgocmVjdCk7CiAgICByZWN0LnJpZ2h0ID0gb3V0ZXJSZWN0LnJpZ2h0OwogICAgcmV0dXJuIHRydWU7CiAgfSBlbHNlIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn07Cgp2Q29udGFpblJlY3QgPSBmdW5jdGlvbihyZWN0LCBvdXRlclJlY3QpIHsKICBpZiAocmVjdC50b3AgPCBvdXRlclJlY3QudG9wKSB7CiAgICByZWN0LmJvdHRvbSA9IG91dGVyUmVjdC50b3AgKyBnZXRSZWN0SGVpZ2h0KHJlY3QpOwogICAgcmVjdC50b3AgPSBvdXRlclJlY3QudG9wOwogICAgcmV0dXJuIHRydWU7CiAgfSBlbHNlIGlmIChyZWN0LmJvdHRvbSA+IG91dGVyUmVjdC5ib3R0b20pIHsKICAgIHJlY3QudG9wID0gb3V0ZXJSZWN0LmJvdHRvbSAtIGdldFJlY3RIZWlnaHQocmVjdCk7CiAgICByZWN0LmJvdHRvbSA9IG91dGVyUmVjdC5ib3R0b207CiAgICByZXR1cm4gdHJ1ZTsKICB9IGVsc2UgewogICAgcmV0dXJuIGZhbHNlOwogIH0KfTsKCmpvaW5SZWN0cyA9IGZ1bmN0aW9uKHJlY3QxLCByZWN0MikgewogIHJldHVybiB7CiAgICBsZWZ0OiBNYXRoLm1pbihyZWN0MS5sZWZ0LCByZWN0Mi5sZWZ0KSwKICAgIHJpZ2h0OiBNYXRoLm1heChyZWN0MS5yaWdodCwgcmVjdDIucmlnaHQpLAogICAgdG9wOiBNYXRoLm1pbihyZWN0MS50b3AsIHJlY3QyLnRvcCksCiAgICBib3R0b206IE1hdGgubWF4KHJlY3QxLmJvdHRvbSwgcmVjdDIuYm90dG9tKQogIH07Cn07CgpDYWxlbmRhckV4dGVuc2lvbiA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKENhbGVuZGFyRXh0ZW5zaW9uLCBzdXBlckNsYXNzKTsKCiAgZnVuY3Rpb24gQ2FsZW5kYXJFeHRlbnNpb24oKSB7CiAgICByZXR1cm4gQ2FsZW5kYXJFeHRlbnNpb24uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUucmVzb3VyY2VNYW5hZ2VyID0gbnVsbDsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnJlc291cmNlTWFuYWdlciA9IG5ldyBSZXNvdXJjZU1hbmFnZXIodGhpcyk7CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLmluc3RhbnRpYXRlVmlldyA9IGZ1bmN0aW9uKHZpZXdUeXBlKSB7CiAgICB2YXIgc3BlYywgdmlld0NsYXNzOwogICAgc3BlYyA9IHRoaXMuZ2V0Vmlld1NwZWModmlld1R5cGUpOwogICAgdmlld0NsYXNzID0gc3BlY1snY2xhc3MnXTsKICAgIGlmICh0aGlzLm9wdGlvbnMucmVzb3VyY2VzICYmIHNwZWMub3B0aW9ucy5yZXNvdXJjZXMgIT09IGZhbHNlKSB7CiAgICAgIGlmIChzcGVjLnF1ZXJ5UmVzb3VyY2VDbGFzcykgewogICAgICAgIHZpZXdDbGFzcyA9IHNwZWMucXVlcnlSZXNvdXJjZUNsYXNzKHNwZWMpIHx8IHZpZXdDbGFzczsKICAgICAgfSBlbHNlIGlmIChzcGVjLnJlc291cmNlQ2xhc3MpIHsKICAgICAgICB2aWV3Q2xhc3MgPSBzcGVjLnJlc291cmNlQ2xhc3M7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgdmlld0NsYXNzKHRoaXMsIHZpZXdUeXBlLCBzcGVjLm9wdGlvbnMsIHNwZWMuZHVyYXRpb24pOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRSZXNvdXJjZXMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLnJlc291cmNlTWFuYWdlci50b3BMZXZlbFJlc291cmNlcyk7CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLmFkZFJlc291cmNlID0gZnVuY3Rpb24ocmVzb3VyY2VJbnB1dCwgc2Nyb2xsKSB7CiAgICB2YXIgcHJvbWlzZTsKICAgIGlmIChzY3JvbGwgPT0gbnVsbCkgewogICAgICBzY3JvbGwgPSBmYWxzZTsKICAgIH0KICAgIHByb21pc2UgPSB0aGlzLnJlc291cmNlTWFuYWdlci5hZGRSZXNvdXJjZShyZXNvdXJjZUlucHV0KTsKICAgIGlmIChzY3JvbGwgJiYgdGhpcy52aWV3LnNjcm9sbFRvUmVzb3VyY2UpIHsKICAgICAgcHJvbWlzZS5kb25lKChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihyZXNvdXJjZSkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnZpZXcuc2Nyb2xsVG9SZXNvdXJjZShyZXNvdXJjZSk7CiAgICAgICAgfTsKICAgICAgfSkodGhpcykpOwogICAgfQogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5yZW1vdmVSZXNvdXJjZSA9IGZ1bmN0aW9uKGlkT3JSZXNvdXJjZSkgewogICAgcmV0dXJuIHRoaXMucmVzb3VyY2VNYW5hZ2VyLnJlbW92ZVJlc291cmNlKGlkT3JSZXNvdXJjZSk7CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLnJlZmV0Y2hSZXNvdXJjZXMgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVzb3VyY2VNYW5hZ2VyLmZldGNoUmVzb3VyY2VzKCk7CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLnJlcmVuZGVyUmVzb3VyY2VzID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlc291cmNlTWFuYWdlci5yZXNldFJlc291cmNlcygpOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5pc1NwYW5BbGxvd2VkID0gZnVuY3Rpb24oc3BhbiwgY29uc3RyYWludCkgewogICAgdmFyIGNvbnN0cmFpblRvUmVzb3VyY2VJZHMsIHJlZjsKICAgIGlmICh0eXBlb2YgY29uc3RyYWludCA9PT0gJ29iamVjdCcpIHsKICAgICAgY29uc3RyYWluVG9SZXNvdXJjZUlkcyA9IHRoaXMuZ2V0RXZlbnRSZXNvdXJjZUlkcyhjb25zdHJhaW50KTsKICAgICAgaWYgKGNvbnN0cmFpblRvUmVzb3VyY2VJZHMubGVuZ3RoICYmICghc3Bhbi5yZXNvdXJjZUlkIHx8ICEocmVmID0gc3Bhbi5yZXNvdXJjZUlkLCBpbmRleE9mLmNhbGwoY29uc3RyYWluVG9SZXNvdXJjZUlkcywgcmVmKSA+PSAwKSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBDYWxlbmRhckV4dGVuc2lvbi5fX3N1cGVyX18uaXNTcGFuQWxsb3dlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRQZWVyRXZlbnRzID0gZnVuY3Rpb24oc3BhbiwgZXZlbnQpIHsKICAgIHZhciBmaWx0ZXJlZFBlZXJFdmVudHMsIGlzUGVlciwgaiwgaywgbCwgbGVuLCBsZW4xLCBsZW4yLCBuZXdSZXNvdXJjZUlkLCBuZXdSZXNvdXJjZUlkcywgcGVlckV2ZW50LCBwZWVyRXZlbnRzLCBwZWVyUmVzb3VyY2VJZCwgcGVlclJlc291cmNlSWRzOwogICAgcGVlckV2ZW50cyA9IENhbGVuZGFyRXh0ZW5zaW9uLl9fc3VwZXJfXy5nZXRQZWVyRXZlbnRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBuZXdSZXNvdXJjZUlkcyA9IHNwYW4ucmVzb3VyY2VJZCA/IFtzcGFuLnJlc291cmNlSWRdIDogZXZlbnQgPyB0aGlzLmdldEV2ZW50UmVzb3VyY2VJZHMoZXZlbnQpIDogW107CiAgICBmaWx0ZXJlZFBlZXJFdmVudHMgPSBbXTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHBlZXJFdmVudHMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcGVlckV2ZW50ID0gcGVlckV2ZW50c1tqXTsKICAgICAgaXNQZWVyID0gZmFsc2U7CiAgICAgIHBlZXJSZXNvdXJjZUlkcyA9IHRoaXMuZ2V0RXZlbnRSZXNvdXJjZUlkcyhwZWVyRXZlbnQpOwogICAgICBpZiAoIXBlZXJSZXNvdXJjZUlkcy5sZW5ndGggfHwgIW5ld1Jlc291cmNlSWRzLmxlbmd0aCkgewogICAgICAgIGlzUGVlciA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHBlZXJSZXNvdXJjZUlkcy5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgICAgIHBlZXJSZXNvdXJjZUlkID0gcGVlclJlc291cmNlSWRzW2tdOwogICAgICAgICAgZm9yIChsID0gMCwgbGVuMiA9IG5ld1Jlc291cmNlSWRzLmxlbmd0aDsgbCA8IGxlbjI7IGwrKykgewogICAgICAgICAgICBuZXdSZXNvdXJjZUlkID0gbmV3UmVzb3VyY2VJZHNbbF07CiAgICAgICAgICAgIGlmIChuZXdSZXNvdXJjZUlkID09PSBwZWVyUmVzb3VyY2VJZCkgewogICAgICAgICAgICAgIGlzUGVlciA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlzUGVlcikgewogICAgICAgIGZpbHRlcmVkUGVlckV2ZW50cy5wdXNoKHBlZXJFdmVudCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmaWx0ZXJlZFBlZXJFdmVudHM7CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLnNwYW5Db250YWluc1NwYW4gPSBmdW5jdGlvbihvdXRlclNwYW4sIGlubmVyU3BhbikgewogICAgaWYgKG91dGVyU3Bhbi5yZXNvdXJjZUlkICYmIG91dGVyU3Bhbi5yZXNvdXJjZUlkICE9PSBpbm5lclNwYW4ucmVzb3VyY2VJZCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gQ2FsZW5kYXJFeHRlbnNpb24uX19zdXBlcl9fLnNwYW5Db250YWluc1NwYW4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0KICB9OwoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUuZ2V0Q3VycmVudEJ1c2luZXNzSG91ckV2ZW50cyA9IGZ1bmN0aW9uKHdob2xlRGF5KSB7CiAgICB2YXIgYWxsRXZlbnRzLCBhbnlDdXN0b21CdXNpbmVzc0hvdXJzLCBldmVudCwgZXZlbnRzLCBmbGF0UmVzb3VyY2VzLCBqLCBrLCBsLCBsZW4sIGxlbjEsIGxlbjIsIHJlc291cmNlOwogICAgZmxhdFJlc291cmNlcyA9IHRoaXMucmVzb3VyY2VNYW5hZ2VyLmdldEZsYXRSZXNvdXJjZXMoKTsKICAgIGFueUN1c3RvbUJ1c2luZXNzSG91cnMgPSBmYWxzZTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IGZsYXRSZXNvdXJjZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcmVzb3VyY2UgPSBmbGF0UmVzb3VyY2VzW2pdOwogICAgICBpZiAocmVzb3VyY2UuYnVzaW5lc3NIb3VycykgewogICAgICAgIGFueUN1c3RvbUJ1c2luZXNzSG91cnMgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoYW55Q3VzdG9tQnVzaW5lc3NIb3VycykgewogICAgICBhbGxFdmVudHMgPSBbXTsKICAgICAgZm9yIChrID0gMCwgbGVuMSA9IGZsYXRSZXNvdXJjZXMubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7CiAgICAgICAgcmVzb3VyY2UgPSBmbGF0UmVzb3VyY2VzW2tdOwogICAgICAgIGV2ZW50cyA9IHRoaXMuY29tcHV0ZUJ1c2luZXNzSG91ckV2ZW50cyh3aG9sZURheSwgcmVzb3VyY2UuYnVzaW5lc3NIb3VycyB8fCB0aGlzLm9wdGlvbnMuYnVzaW5lc3NIb3Vycyk7CiAgICAgICAgZm9yIChsID0gMCwgbGVuMiA9IGV2ZW50cy5sZW5ndGg7IGwgPCBsZW4yOyBsKyspIHsKICAgICAgICAgIGV2ZW50ID0gZXZlbnRzW2xdOwogICAgICAgICAgZXZlbnQucmVzb3VyY2VJZCA9IHJlc291cmNlLmlkOwogICAgICAgICAgYWxsRXZlbnRzLnB1c2goZXZlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYWxsRXZlbnRzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIENhbGVuZGFyRXh0ZW5zaW9uLl9fc3VwZXJfXy5nZXRDdXJyZW50QnVzaW5lc3NIb3VyRXZlbnRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLmJ1aWxkU2VsZWN0U3BhbiA9IGZ1bmN0aW9uKHN0YXJ0SW5wdXQsIGVuZElucHV0LCByZXNvdXJjZUlkKSB7CiAgICB2YXIgc3BhbjsKICAgIHNwYW4gPSBDYWxlbmRhckV4dGVuc2lvbi5fX3N1cGVyX18uYnVpbGRTZWxlY3RTcGFuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAocmVzb3VyY2VJZCkgewogICAgICBzcGFuLnJlc291cmNlSWQgPSByZXNvdXJjZUlkOwogICAgfQogICAgcmV0dXJuIHNwYW47CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLmdldFJlc291cmNlQnlJZCA9IGZ1bmN0aW9uKGlkKSB7CiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZU1hbmFnZXIuZ2V0UmVzb3VyY2VCeUlkKGlkKTsKICB9OwoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUubm9ybWFsaXplRXZlbnQgPSBmdW5jdGlvbihldmVudCkgewogICAgQ2FsZW5kYXJFeHRlbnNpb24uX19zdXBlcl9fLm5vcm1hbGl6ZUV2ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAoZXZlbnQucmVzb3VyY2VJZCA9PSBudWxsKSB7CiAgICAgIGV2ZW50LnJlc291cmNlSWQgPSBudWxsOwogICAgfQogICAgcmV0dXJuIGV2ZW50LnJlc291cmNlSWRzICE9IG51bGwgPyBldmVudC5yZXNvdXJjZUlkcyA6IGV2ZW50LnJlc291cmNlSWRzID0gbnVsbDsKICB9OwoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUuZ2V0RXZlbnRSZXNvdXJjZUlkID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgIHJldHVybiB0aGlzLmdldEV2ZW50UmVzb3VyY2VJZHMoZXZlbnQpWzBdOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRFdmVudFJlc291cmNlSWRzID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgIHZhciBqLCBsZW4sIG5vcm1hbFJlc291cmNlSWQsIG5vcm1hbFJlc291cmNlSWRzLCByZWYsIHJlZjEsIHJlZjIsIHJlc291cmNlSWQ7CiAgICByZXNvdXJjZUlkID0gU3RyaW5nKChyZWYgPSAocmVmMSA9IGV2ZW50W3RoaXMuZ2V0RXZlbnRSZXNvdXJjZUZpZWxkKCldKSAhPSBudWxsID8gcmVmMSA6IGV2ZW50LnJlc291cmNlSWQpICE9IG51bGwgPyByZWYgOiAnJyk7CiAgICBpZiAocmVzb3VyY2VJZCkgewogICAgICByZXR1cm4gW3Jlc291cmNlSWRdOwogICAgfSBlbHNlIGlmIChldmVudC5yZXNvdXJjZUlkcykgewogICAgICBub3JtYWxSZXNvdXJjZUlkcyA9IFtdOwogICAgICByZWYyID0gZXZlbnQucmVzb3VyY2VJZHM7CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZjIubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICByZXNvdXJjZUlkID0gcmVmMltqXTsKICAgICAgICBub3JtYWxSZXNvdXJjZUlkID0gU3RyaW5nKHJlc291cmNlSWQgIT0gbnVsbCA/IHJlc291cmNlSWQgOiAnJyk7CiAgICAgICAgaWYgKG5vcm1hbFJlc291cmNlSWQpIHsKICAgICAgICAgIG5vcm1hbFJlc291cmNlSWRzLnB1c2gobm9ybWFsUmVzb3VyY2VJZCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBub3JtYWxSZXNvdXJjZUlkczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICB9OwoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUuc2V0RXZlbnRSZXNvdXJjZUlkID0gZnVuY3Rpb24oZXZlbnQsIHJlc291cmNlSWQpIHsKICAgIHJldHVybiBldmVudFt0aGlzLmdldEV2ZW50UmVzb3VyY2VGaWVsZCgpXSA9IFN0cmluZyhyZXNvdXJjZUlkICE9IG51bGwgPyByZXNvdXJjZUlkIDogJycpOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRFdmVudFJlc291cmNlRmllbGQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLm9wdGlvbnNbJ2V2ZW50UmVzb3VyY2VGaWVsZCddIHx8ICdyZXNvdXJjZUlkJzsKICB9OwoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUuZ2V0UmVzb3VyY2VFdmVudHMgPSBmdW5jdGlvbihpZE9yUmVzb3VyY2UpIHsKICAgIHZhciByZXNvdXJjZTsKICAgIHJlc291cmNlID0gdHlwZW9mIGlkT3JSZXNvdXJjZSA9PT0gJ29iamVjdCcgPyBpZE9yUmVzb3VyY2UgOiB0aGlzLmdldFJlc291cmNlQnlJZChpZE9yUmVzb3VyY2UpOwogICAgaWYgKHJlc291cmNlKSB7CiAgICAgIHJldHVybiB0aGlzLmNsaWVudEV2ZW50cygoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgIHJldHVybiAkLmluQXJyYXkocmVzb3VyY2UuaWQsIF90aGlzLmdldEV2ZW50UmVzb3VyY2VJZHMoZXZlbnQpKSAhPT0gLTE7CiAgICAgICAgfTsKICAgICAgfSkodGhpcykpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIFtdOwogICAgfQogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRFdmVudFJlc291cmNlID0gZnVuY3Rpb24oaWRPckV2ZW50KSB7CiAgICByZXR1cm4gdGhpcy5nZXRFdmVudFJlc291cmNlcyhpZE9yRXZlbnQpWzBdOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRFdmVudFJlc291cmNlcyA9IGZ1bmN0aW9uKGlkT3JFdmVudCkgewogICAgdmFyIGV2ZW50LCBqLCBsZW4sIHJlZiwgcmVzb3VyY2UsIHJlc291cmNlSWQsIHJlc291cmNlczsKICAgIGV2ZW50ID0gdHlwZW9mIGlkT3JFdmVudCA9PT0gJ29iamVjdCcgPyBpZE9yRXZlbnQgOiB0aGlzLmNsaWVudEV2ZW50cyhpZE9yRXZlbnQpWzBdOwogICAgcmVzb3VyY2VzID0gW107CiAgICBpZiAoZXZlbnQpIHsKICAgICAgcmVmID0gdGhpcy5nZXRFdmVudFJlc291cmNlSWRzKGV2ZW50KTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgcmVzb3VyY2VJZCA9IHJlZltqXTsKICAgICAgICByZXNvdXJjZSA9IHRoaXMuZ2V0UmVzb3VyY2VCeUlkKHJlc291cmNlSWQpOwogICAgICAgIGlmIChyZXNvdXJjZSkgewogICAgICAgICAgcmVzb3VyY2VzLnB1c2gocmVzb3VyY2UpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc291cmNlczsKICB9OwoKICByZXR1cm4gQ2FsZW5kYXJFeHRlbnNpb247Cgp9KShDYWxlbmRhcik7CgpDYWxlbmRhci5wcm90b3R5cGUgPSBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGU7CgpvcmlnRGlzcGxheVZpZXcgPSBWaWV3LnByb3RvdHlwZS5kaXNwbGF5VmlldzsKCm9yaWdSZW5kZXJTa2VsZXRvbiA9IFZpZXcucHJvdG90eXBlLnJlbmRlclNrZWxldG9uOwoKb3JpZ1VucmVuZGVyU2tlbGV0b24gPSBWaWV3LnByb3RvdHlwZS51bnJlbmRlclNrZWxldG9uOwoKb3JpZ0Rpc3BsYXlFdmVudHMgPSBWaWV3LnByb3RvdHlwZS5kaXNwbGF5RXZlbnRzOwoKVmlldy5wcm90b3R5cGUuaXNSZXNvdXJjZXNCb3VuZCA9IGZhbHNlOwoKVmlldy5wcm90b3R5cGUuc2V0dGluZ1Jlc291cmNlcyA9IG51bGw7CgpWaWV3LnByb3RvdHlwZS5kaXNwbGF5VmlldyA9IGZ1bmN0aW9uKCkgewogIG9yaWdEaXNwbGF5Vmlldy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIHByb2Nlc3NMaWNlbnNlS2V5KHRoaXMuY2FsZW5kYXIub3B0aW9ucy5zY2hlZHVsZXJMaWNlbnNlS2V5LCB0aGlzLmVsKTsKICB0aGlzLmJpbmRSZXNvdXJjZXMoKTsKICByZXR1cm4gdGhpcy53aGVuUmVzb3VyY2VzKCk7Cn07CgpWaWV3LnByb3RvdHlwZS51bnJlbmRlclNrZWxldG9uID0gZnVuY3Rpb24oKSB7CiAgb3JpZ1VucmVuZGVyU2tlbGV0b24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICByZXR1cm4gdGhpcy51bmJpbmRSZXNvdXJjZXModHJ1ZSk7Cn07CgpWaWV3LnByb3RvdHlwZS5kaXNwbGF5RXZlbnRzID0gZnVuY3Rpb24oZXZlbnRzKSB7CiAgcmV0dXJuIHRoaXMud2hlblJlc291cmNlcygoZnVuY3Rpb24oX3RoaXMpIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIG9yaWdEaXNwbGF5RXZlbnRzLmNhbGwoX3RoaXMsIGV2ZW50cyk7CiAgICB9OwogIH0pKHRoaXMpKTsKfTsKClZpZXcucHJvdG90eXBlLmJpbmRSZXNvdXJjZXMgPSBmdW5jdGlvbigpIHsKICB2YXIgc2V0UmVzb3VyY2VzOwogIGlmICghdGhpcy5pc1Jlc291cmNlc0JvdW5kKSB7CiAgICB0aGlzLmlzUmVzb3VyY2VzQm91bmQgPSB0cnVlOwogICAgdGhpcy5zZXR0aW5nUmVzb3VyY2VzID0gJC5EZWZlcnJlZCgpOwogICAgc2V0UmVzb3VyY2VzID0gKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihyZXNvdXJjZXMpIHsKICAgICAgICBfdGhpcy5zZXRSZXNvdXJjZXMocmVzb3VyY2VzKTsKICAgICAgICByZXR1cm4gX3RoaXMuc2V0dGluZ1Jlc291cmNlcy5yZXNvbHZlKCk7CiAgICAgIH07CiAgICB9KSh0aGlzKTsKICAgIHRoaXMubGlzdGVuVG8odGhpcy5jYWxlbmRhci5yZXNvdXJjZU1hbmFnZXIsIHsKICAgICAgc2V0OiBzZXRSZXNvdXJjZXMsCiAgICAgIHVuc2V0OiB0aGlzLnVuc2V0UmVzb3VyY2VzLAogICAgICByZXNldDogdGhpcy5yZXNldFJlc291cmNlcywKICAgICAgYWRkOiB0aGlzLmFkZFJlc291cmNlLAogICAgICByZW1vdmU6IHRoaXMucmVtb3ZlUmVzb3VyY2UKICAgIH0pOwogICAgaWYgKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyLmhhc0ZldGNoZWQoKSkgewogICAgICByZXR1cm4gc2V0UmVzb3VyY2VzKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyLnRvcExldmVsUmVzb3VyY2VzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlci5nZXRSZXNvdXJjZXMoKTsKICAgIH0KICB9Cn07CgpWaWV3LnByb3RvdHlwZS51bmJpbmRSZXNvdXJjZXMgPSBmdW5jdGlvbihpc0Rlc3Ryb3lpbmcpIHsKICBpZiAodGhpcy5pc1Jlc291cmNlc0JvdW5kKSB7CiAgICB0aGlzLnN0b3BMaXN0ZW5pbmdUbyh0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlcik7CiAgICBpZiAodGhpcy5zZXR0aW5nUmVzb3VyY2VzLnN0YXRlKCkgPT09ICdyZXNvbHZlZCcpIHsKICAgICAgdGhpcy51bnNldFJlc291cmNlcyhpc0Rlc3Ryb3lpbmcpOwogICAgfQogICAgdGhpcy5zZXR0aW5nUmVzb3VyY2VzID0gbnVsbDsKICAgIHJldHVybiB0aGlzLmlzUmVzb3VyY2VzQm91bmQgPSBmYWxzZTsKICB9Cn07CgpWaWV3LnByb3RvdHlwZS53aGVuUmVzb3VyY2VzID0gZnVuY3Rpb24odGhlbkZ1bmMpIHsKICByZXR1cm4gc3luY1RoZW4odGhpcy5zZXR0aW5nUmVzb3VyY2VzLCB0aGVuRnVuYyk7Cn07CgpWaWV3LnByb3RvdHlwZS5zZXRSZXNvdXJjZXMgPSBmdW5jdGlvbihyZXNvdXJjZXMpIHt9OwoKVmlldy5wcm90b3R5cGUudW5zZXRSZXNvdXJjZXMgPSBmdW5jdGlvbigpIHt9OwoKVmlldy5wcm90b3R5cGUucmVzZXRSZXNvdXJjZXMgPSBmdW5jdGlvbihyZXNvdXJjZXMpIHsKICByZXR1cm4gdGhpcy5jYWxlbmRhci5yZXJlbmRlckV2ZW50cygpOwp9OwoKVmlldy5wcm90b3R5cGUuYWRkUmVzb3VyY2UgPSBmdW5jdGlvbihyZXNvdXJjZSkgewogIHJldHVybiB0aGlzLnJlc2V0UmVzb3VyY2VzKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyLnRvcExldmVsUmVzb3VyY2VzKTsKfTsKClZpZXcucHJvdG90eXBlLnJlbW92ZVJlc291cmNlID0gZnVuY3Rpb24ocmVzb3VyY2UpIHsKICByZXR1cm4gdGhpcy5yZXNldFJlc291cmNlcyh0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlci50b3BMZXZlbFJlc291cmNlcyk7Cn07CgpvcmlnR2V0U2VnQ3VzdG9tQ2xhc3NlcyA9IEdyaWQucHJvdG90eXBlLmdldFNlZ0N1c3RvbUNsYXNzZXM7CgpvcmlnR2V0U2VnRGVmYXVsdEJhY2tncm91bmRDb2xvciA9IEdyaWQucHJvdG90eXBlLmdldFNlZ0RlZmF1bHRCYWNrZ3JvdW5kQ29sb3I7CgpvcmlnR2V0U2VnRGVmYXVsdEJvcmRlckNvbG9yID0gR3JpZC5wcm90b3R5cGUuZ2V0U2VnRGVmYXVsdEJvcmRlckNvbG9yOwoKb3JpZ0dldFNlZ0RlZmF1bHRUZXh0Q29sb3IgPSBHcmlkLnByb3RvdHlwZS5nZXRTZWdEZWZhdWx0VGV4dENvbG9yOwoKR3JpZC5wcm90b3R5cGUuZ2V0U2VnQ3VzdG9tQ2xhc3NlcyA9IGZ1bmN0aW9uKHNlZykgewogIHZhciBjbGFzc2VzLCBqLCBsZW4sIHJlZiwgcmVzb3VyY2U7CiAgY2xhc3NlcyA9IG9yaWdHZXRTZWdDdXN0b21DbGFzc2VzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgcmVmID0gdGhpcy5nZXRTZWdSZXNvdXJjZXMoc2VnKTsKICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgIHJlc291cmNlID0gcmVmW2pdOwogICAgY2xhc3NlcyA9IGNsYXNzZXMuY29uY2F0KHJlc291cmNlLmV2ZW50Q2xhc3NOYW1lIHx8IFtdKTsKICB9CiAgcmV0dXJuIGNsYXNzZXM7Cn07CgpHcmlkLnByb3RvdHlwZS5nZXRTZWdEZWZhdWx0QmFja2dyb3VuZENvbG9yID0gZnVuY3Rpb24oc2VnKSB7CiAgdmFyIGN1cnJlbnRSZXNvdXJjZSwgaiwgbGVuLCByZXNvdXJjZXMsIHZhbDsKICByZXNvdXJjZXMgPSB0aGlzLmdldFNlZ1Jlc291cmNlcyhzZWcpOwogIGZvciAoaiA9IDAsIGxlbiA9IHJlc291cmNlcy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgY3VycmVudFJlc291cmNlID0gcmVzb3VyY2VzW2pdOwogICAgd2hpbGUgKGN1cnJlbnRSZXNvdXJjZSkgewogICAgICB2YWwgPSBjdXJyZW50UmVzb3VyY2UuZXZlbnRCYWNrZ3JvdW5kQ29sb3IgfHwgY3VycmVudFJlc291cmNlLmV2ZW50Q29sb3I7CiAgICAgIGlmICh2YWwpIHsKICAgICAgICByZXR1cm4gdmFsOwogICAgICB9CiAgICAgIGN1cnJlbnRSZXNvdXJjZSA9IGN1cnJlbnRSZXNvdXJjZS5fcGFyZW50OwogICAgfQogIH0KICByZXR1cm4gb3JpZ0dldFNlZ0RlZmF1bHRCYWNrZ3JvdW5kQ29sb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfTsKCkdyaWQucHJvdG90eXBlLmdldFNlZ0RlZmF1bHRCb3JkZXJDb2xvciA9IGZ1bmN0aW9uKHNlZykgewogIHZhciBjdXJyZW50UmVzb3VyY2UsIGosIGxlbiwgcmVzb3VyY2VzLCB2YWw7CiAgcmVzb3VyY2VzID0gdGhpcy5nZXRTZWdSZXNvdXJjZXMoc2VnKTsKICBmb3IgKGogPSAwLCBsZW4gPSByZXNvdXJjZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgIGN1cnJlbnRSZXNvdXJjZSA9IHJlc291cmNlc1tqXTsKICAgIHdoaWxlIChjdXJyZW50UmVzb3VyY2UpIHsKICAgICAgdmFsID0gY3VycmVudFJlc291cmNlLmV2ZW50Qm9yZGVyQ29sb3IgfHwgY3VycmVudFJlc291cmNlLmV2ZW50Q29sb3I7CiAgICAgIGlmICh2YWwpIHsKICAgICAgICByZXR1cm4gdmFsOwogICAgICB9CiAgICAgIGN1cnJlbnRSZXNvdXJjZSA9IGN1cnJlbnRSZXNvdXJjZS5fcGFyZW50OwogICAgfQogIH0KICByZXR1cm4gb3JpZ0dldFNlZ0RlZmF1bHRCb3JkZXJDb2xvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwp9OwoKR3JpZC5wcm90b3R5cGUuZ2V0U2VnRGVmYXVsdFRleHRDb2xvciA9IGZ1bmN0aW9uKHNlZykgewogIHZhciBjdXJyZW50UmVzb3VyY2UsIGosIGxlbiwgcmVzb3VyY2VzLCB2YWw7CiAgcmVzb3VyY2VzID0gdGhpcy5nZXRTZWdSZXNvdXJjZXMoc2VnKTsKICBmb3IgKGogPSAwLCBsZW4gPSByZXNvdXJjZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgIGN1cnJlbnRSZXNvdXJjZSA9IHJlc291cmNlc1tqXTsKICAgIHdoaWxlIChjdXJyZW50UmVzb3VyY2UpIHsKICAgICAgdmFsID0gY3VycmVudFJlc291cmNlLmV2ZW50VGV4dENvbG9yOwogICAgICBpZiAodmFsKSB7CiAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgfQogICAgICBjdXJyZW50UmVzb3VyY2UgPSBjdXJyZW50UmVzb3VyY2UuX3BhcmVudDsKICAgIH0KICB9CiAgcmV0dXJuIG9yaWdHZXRTZWdEZWZhdWx0VGV4dENvbG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn07CgpHcmlkLnByb3RvdHlwZS5nZXRTZWdSZXNvdXJjZXMgPSBmdW5jdGlvbihzZWcpIHsKICBpZiAoc2VnLnJlc291cmNlKSB7CiAgICByZXR1cm4gW3NlZy5yZXNvdXJjZV07CiAgfSBlbHNlIHsKICAgIHJldHVybiB0aGlzLnZpZXcuY2FsZW5kYXIuZ2V0RXZlbnRSZXNvdXJjZXMoc2VnLmV2ZW50KTsKICB9Cn07CgpSZXNvdXJjZU1hbmFnZXIgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChSZXNvdXJjZU1hbmFnZXIsIHN1cGVyQ2xhc3MpOwoKICBSZXNvdXJjZU1hbmFnZXIubWl4aW4oRW1pdHRlck1peGluKTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnJlc291cmNlR3VpZCA9IDE7CgogIFJlc291cmNlTWFuYWdlci5hamF4RGVmYXVsdHMgPSB7CiAgICBkYXRhVHlwZTogJ2pzb24nLAogICAgY2FjaGU6IGZhbHNlCiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5jYWxlbmRhciA9IG51bGw7CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUudG9wTGV2ZWxSZXNvdXJjZXMgPSBudWxsOwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLnJlc291cmNlc0J5SWQgPSBudWxsOwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLmZldGNoaW5nID0gbnVsbDsKCiAgZnVuY3Rpb24gUmVzb3VyY2VNYW5hZ2VyKGNhbGVuZGFyMSkgewogICAgdGhpcy5jYWxlbmRhciA9IGNhbGVuZGFyMTsKICAgIHRoaXMuaW5pdGlhbGl6ZUNhY2hlKCk7CiAgfQoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLmhhc0ZldGNoZWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmZldGNoaW5nICYmIHRoaXMuZmV0Y2hpbmcuc3RhdGUoKSA9PT0gJ3Jlc29sdmVkJzsKICB9OwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLmdldFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGdldHRpbmc7CiAgICBpZiAoIXRoaXMuZmV0Y2hpbmcpIHsKICAgICAgZ2V0dGluZyA9ICQuRGVmZXJyZWQoKTsKICAgICAgc3luY1RoZW4odGhpcy5mZXRjaFJlc291cmNlcygpLCBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZ2V0dGluZy5yZXNvbHZlKHRoaXMudG9wTGV2ZWxSZXNvdXJjZXMpOwogICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZ2V0dGluZy5yZXNvbHZlKFtdKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBnZXR0aW5nLnByb21pc2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSh0aGlzLnRvcExldmVsUmVzb3VyY2VzKS5wcm9taXNlKCk7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5mZXRjaFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHByZXZGZXRjaGluZzsKICAgIHByZXZGZXRjaGluZyA9IHRoaXMuZmV0Y2hpbmc7CiAgICByZXR1cm4gc3luY1RoZW4ocHJldkZldGNoaW5nLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIF90aGlzLmZldGNoaW5nID0gJC5EZWZlcnJlZCgpOwogICAgICAgIF90aGlzLmZldGNoUmVzb3VyY2VJbnB1dHMoZnVuY3Rpb24ocmVzb3VyY2VJbnB1dHMpIHsKICAgICAgICAgIF90aGlzLnNldFJlc291cmNlcyhyZXNvdXJjZUlucHV0cywgQm9vbGVhbihwcmV2RmV0Y2hpbmcpKTsKICAgICAgICAgIHJldHVybiBfdGhpcy5mZXRjaGluZy5yZXNvbHZlKF90aGlzLnRvcExldmVsUmVzb3VyY2VzKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gX3RoaXMuZmV0Y2hpbmcucHJvbWlzZSgpOwogICAgICB9OwogICAgfSkodGhpcykpOwogIH07CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUuZmV0Y2hSZXNvdXJjZUlucHV0cyA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICB2YXIgc291cmNlOwogICAgc291cmNlID0gdGhpcy5jYWxlbmRhci5vcHRpb25zWydyZXNvdXJjZXMnXTsKICAgIGlmICgkLnR5cGUoc291cmNlKSA9PT0gJ3N0cmluZycpIHsKICAgICAgc291cmNlID0gewogICAgICAgIHVybDogc291cmNlCiAgICAgIH07CiAgICB9CiAgICBzd2l0Y2ggKCQudHlwZShzb3VyY2UpKSB7CiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoKICAgICAgICB0aGlzLmNhbGVuZGFyLnB1c2hMb2FkaW5nKCk7CiAgICAgICAgcmV0dXJuIHNvdXJjZSgoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihyZXNvdXJjZUlucHV0cykgewogICAgICAgICAgICBfdGhpcy5jYWxlbmRhci5wb3BMb2FkaW5nKCk7CiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhyZXNvdXJjZUlucHV0cyk7CiAgICAgICAgICB9OwogICAgICAgIH0pKHRoaXMpKTsKICAgICAgY2FzZSAnb2JqZWN0JzoKICAgICAgICB0aGlzLmNhbGVuZGFyLnB1c2hMb2FkaW5nKCk7CiAgICAgICAgcmV0dXJuICQuYWpheCgkLmV4dGVuZCh7fSwgUmVzb3VyY2VNYW5hZ2VyLmFqYXhEZWZhdWx0cywgc291cmNlKSkuZG9uZSgoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihyZXNvdXJjZUlucHV0cykgewogICAgICAgICAgICBfdGhpcy5jYWxlbmRhci5wb3BMb2FkaW5nKCk7CiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhyZXNvdXJjZUlucHV0cyk7CiAgICAgICAgICB9OwogICAgICAgIH0pKHRoaXMpKTsKICAgICAgY2FzZSAnYXJyYXknOgogICAgICAgIHJldHVybiBjYWxsYmFjayhzb3VyY2UpOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBjYWxsYmFjayhbXSk7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5yZXNldFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHN5bmNUaGVuKHRoaXMuZ2V0UmVzb3VyY2VzKCksIChmdW5jdGlvbihfdGhpcykgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIF90aGlzLnRyaWdnZXIoJ3Jlc2V0JywgX3RoaXMudG9wTGV2ZWxSZXNvdXJjZXMpOwogICAgICB9OwogICAgfSkodGhpcykpOwogIH07CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUuZ2V0UmVzb3VyY2VCeUlkID0gZnVuY3Rpb24oaWQpIHsKICAgIHJldHVybiB0aGlzLnJlc291cmNlc0J5SWRbaWRdOwogIH07CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUuZ2V0RmxhdFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGlkLCByZXN1bHRzOwogICAgcmVzdWx0cyA9IFtdOwogICAgZm9yIChpZCBpbiB0aGlzLnJlc291cmNlc0J5SWQpIHsKICAgICAgcmVzdWx0cy5wdXNoKHRoaXMucmVzb3VyY2VzQnlJZFtpZF0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5pbml0aWFsaXplQ2FjaGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudG9wTGV2ZWxSZXNvdXJjZXMgPSBbXTsKICAgIHJldHVybiB0aGlzLnJlc291cmNlc0J5SWQgPSB7fTsKICB9OwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKHJlc291cmNlSW5wdXRzLCBpc1Jlc2V0KSB7CiAgICB2YXIgaiwgbGVuLCByZXNvdXJjZSwgcmVzb3VyY2VJbnB1dCwgcmVzb3VyY2VzLCB2YWxpZFJlc291cmNlczsKICAgIHRoaXMuaW5pdGlhbGl6ZUNhY2hlKCk7CiAgICByZXNvdXJjZXMgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBqLCBsZW4sIHJlc3VsdHM7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVzb3VyY2VJbnB1dHMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICByZXNvdXJjZUlucHV0ID0gcmVzb3VyY2VJbnB1dHNbal07CiAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuYnVpbGRSZXNvdXJjZShyZXNvdXJjZUlucHV0KSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9KS5jYWxsKHRoaXMpOwogICAgdmFsaWRSZXNvdXJjZXMgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBqLCBsZW4sIHJlc3VsdHM7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVzb3VyY2VzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZXNbal07CiAgICAgICAgaWYgKHRoaXMuYWRkUmVzb3VyY2VUb0luZGV4KHJlc291cmNlKSkgewogICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc291cmNlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9KS5jYWxsKHRoaXMpOwogICAgZm9yIChqID0gMCwgbGVuID0gdmFsaWRSZXNvdXJjZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcmVzb3VyY2UgPSB2YWxpZFJlc291cmNlc1tqXTsKICAgICAgdGhpcy5hZGRSZXNvdXJjZVRvVHJlZShyZXNvdXJjZSk7CiAgICB9CiAgICBpZiAoaXNSZXNldCkgewogICAgICB0aGlzLnRyaWdnZXIoJ3Jlc2V0JywgdGhpcy50b3BMZXZlbFJlc291cmNlcyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnRyaWdnZXIoJ3NldCcsIHRoaXMudG9wTGV2ZWxSZXNvdXJjZXMpOwogICAgfQogICAgcmV0dXJuIHRoaXMuY2FsZW5kYXIudHJpZ2dlcigncmVzb3VyY2VzU2V0JywgbnVsbCwgdGhpcy50b3BMZXZlbFJlc291cmNlcyk7CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5hZGRSZXNvdXJjZSA9IGZ1bmN0aW9uKHJlc291cmNlSW5wdXQpIHsKICAgIHJldHVybiBzeW5jVGhlbih0aGlzLmZldGNoaW5nLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciByZXNvdXJjZTsKICAgICAgICByZXNvdXJjZSA9IF90aGlzLmJ1aWxkUmVzb3VyY2UocmVzb3VyY2VJbnB1dCk7CiAgICAgICAgaWYgKF90aGlzLmFkZFJlc291cmNlVG9JbmRleChyZXNvdXJjZSkpIHsKICAgICAgICAgIF90aGlzLmFkZFJlc291cmNlVG9UcmVlKHJlc291cmNlKTsKICAgICAgICAgIF90aGlzLnRyaWdnZXIoJ2FkZCcsIHJlc291cmNlKTsKICAgICAgICAgIHJldHVybiByZXNvdXJjZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfTsKICAgIH0pKHRoaXMpKTsKICB9OwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLmFkZFJlc291cmNlVG9JbmRleCA9IGZ1bmN0aW9uKHJlc291cmNlKSB7CiAgICB2YXIgY2hpbGQsIGosIGxlbiwgcmVmOwogICAgaWYgKHRoaXMucmVzb3VyY2VzQnlJZFtyZXNvdXJjZS5pZF0pIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5yZXNvdXJjZXNCeUlkW3Jlc291cmNlLmlkXSA9IHJlc291cmNlOwogICAgICByZWYgPSByZXNvdXJjZS5jaGlsZHJlbjsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgY2hpbGQgPSByZWZbal07CiAgICAgICAgdGhpcy5hZGRSZXNvdXJjZVRvSW5kZXgoY2hpbGQpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH07CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUuYWRkUmVzb3VyY2VUb1RyZWUgPSBmdW5jdGlvbihyZXNvdXJjZSkgewogICAgdmFyIHBhcmVudCwgcGFyZW50SWQsIHJlZiwgc2libGluZ3M7CiAgICBpZiAoIXJlc291cmNlLnBhcmVudCkgewogICAgICBwYXJlbnRJZCA9IFN0cmluZygocmVmID0gcmVzb3VyY2VbJ3BhcmVudElkJ10pICE9IG51bGwgPyByZWYgOiAnJyk7CiAgICAgIGlmIChwYXJlbnRJZCkgewogICAgICAgIHBhcmVudCA9IHRoaXMucmVzb3VyY2VzQnlJZFtwYXJlbnRJZF07CiAgICAgICAgaWYgKHBhcmVudCkgewogICAgICAgICAgcmVzb3VyY2UucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgc2libGluZ3MgPSBwYXJlbnQuY2hpbGRyZW47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2libGluZ3MgPSB0aGlzLnRvcExldmVsUmVzb3VyY2VzOwogICAgICB9CiAgICAgIHNpYmxpbmdzLnB1c2gocmVzb3VyY2UpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5yZW1vdmVSZXNvdXJjZSA9IGZ1bmN0aW9uKGlkT3JSZXNvdXJjZSkgewogICAgdmFyIGlkOwogICAgaWQgPSB0eXBlb2YgaWRPclJlc291cmNlID09PSAnb2JqZWN0JyA/IGlkT3JSZXNvdXJjZS5pZCA6IGlkT3JSZXNvdXJjZTsKICAgIHJldHVybiBzeW5jVGhlbih0aGlzLmZldGNoaW5nLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciByZXNvdXJjZTsKICAgICAgICByZXNvdXJjZSA9IF90aGlzLnJlbW92ZVJlc291cmNlRnJvbUluZGV4KGlkKTsKICAgICAgICBpZiAocmVzb3VyY2UpIHsKICAgICAgICAgIF90aGlzLnJlbW92ZVJlc291cmNlRnJvbVRyZWUocmVzb3VyY2UpOwogICAgICAgICAgX3RoaXMudHJpZ2dlcigncmVtb3ZlJywgcmVzb3VyY2UpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzb3VyY2U7CiAgICAgIH07CiAgICB9KSh0aGlzKSk7CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5yZW1vdmVSZXNvdXJjZUZyb21JbmRleCA9IGZ1bmN0aW9uKHJlc291cmNlSWQpIHsKICAgIHZhciBjaGlsZCwgaiwgbGVuLCByZWYsIHJlc291cmNlOwogICAgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlc0J5SWRbcmVzb3VyY2VJZF07CiAgICBpZiAocmVzb3VyY2UpIHsKICAgICAgZGVsZXRlIHRoaXMucmVzb3VyY2VzQnlJZFtyZXNvdXJjZUlkXTsKICAgICAgcmVmID0gcmVzb3VyY2UuY2hpbGRyZW47CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICAgIGNoaWxkID0gcmVmW2pdOwogICAgICAgIHRoaXMucmVtb3ZlUmVzb3VyY2VGcm9tSW5kZXgoY2hpbGQuaWQpOwogICAgICB9CiAgICAgIHJldHVybiByZXNvdXJjZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9OwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLnJlbW92ZVJlc291cmNlRnJvbVRyZWUgPSBmdW5jdGlvbihyZXNvdXJjZSwgc2libGluZ3MpIHsKICAgIHZhciBpLCBqLCBsZW4sIHNpYmxpbmc7CiAgICBpZiAoc2libGluZ3MgPT0gbnVsbCkgewogICAgICBzaWJsaW5ncyA9IHRoaXMudG9wTGV2ZWxSZXNvdXJjZXM7CiAgICB9CiAgICBmb3IgKGkgPSBqID0gMCwgbGVuID0gc2libGluZ3MubGVuZ3RoOyBqIDwgbGVuOyBpID0gKytqKSB7CiAgICAgIHNpYmxpbmcgPSBzaWJsaW5nc1tpXTsKICAgICAgaWYgKHNpYmxpbmcgPT09IHJlc291cmNlKSB7CiAgICAgICAgcmVzb3VyY2UucGFyZW50ID0gbnVsbDsKICAgICAgICBzaWJsaW5ncy5zcGxpY2UoaSwgMSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKHRoaXMucmVtb3ZlUmVzb3VyY2VGcm9tVHJlZShyZXNvdXJjZSwgc2libGluZy5jaGlsZHJlbikpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUuYnVpbGRSZXNvdXJjZSA9IGZ1bmN0aW9uKHJlc291cmNlSW5wdXQpIHsKICAgIHZhciBjaGlsZCwgY2hpbGRJbnB1dCwgcmF3Q2xhc3NOYW1lLCByZWYsIHJlc291cmNlOwogICAgcmVzb3VyY2UgPSAkLmV4dGVuZCh7fSwgcmVzb3VyY2VJbnB1dCk7CiAgICByZXNvdXJjZS5pZCA9IFN0cmluZygocmVmID0gcmVzb3VyY2VJbnB1dC5pZCkgIT0gbnVsbCA/IHJlZiA6ICdfZmMnICsgUmVzb3VyY2VNYW5hZ2VyLnJlc291cmNlR3VpZCsrKTsKICAgIHJhd0NsYXNzTmFtZSA9IHJlc291cmNlSW5wdXQuZXZlbnRDbGFzc05hbWU7CiAgICByZXNvdXJjZS5ldmVudENsYXNzTmFtZSA9IChmdW5jdGlvbigpIHsKICAgICAgc3dpdGNoICgkLnR5cGUocmF3Q2xhc3NOYW1lKSkgewogICAgICAgIGNhc2UgJ3N0cmluZyc6CiAgICAgICAgICByZXR1cm4gcmF3Q2xhc3NOYW1lLnNwbGl0KC9ccysvKTsKICAgICAgICBjYXNlICdhcnJheSc6CiAgICAgICAgICByZXR1cm4gcmF3Q2xhc3NOYW1lOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgIH0pKCk7CiAgICByZXNvdXJjZS5jaGlsZHJlbiA9IChmdW5jdGlvbigpIHsKICAgICAgdmFyIGosIGxlbiwgcmVmMSwgcmVmMiwgcmVzdWx0czsKICAgICAgcmVmMiA9IChyZWYxID0gcmVzb3VyY2VJbnB1dC5jaGlsZHJlbikgIT0gbnVsbCA/IHJlZjEgOiBbXTsKICAgICAgcmVzdWx0cyA9IFtdOwogICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYyLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgY2hpbGRJbnB1dCA9IHJlZjJbal07CiAgICAgICAgY2hpbGQgPSB0aGlzLmJ1aWxkUmVzb3VyY2UoY2hpbGRJbnB1dCk7CiAgICAgICAgY2hpbGQucGFyZW50ID0gcmVzb3VyY2U7CiAgICAgICAgcmVzdWx0cy5wdXNoKGNoaWxkKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pLmNhbGwodGhpcyk7CiAgICByZXR1cm4gcmVzb3VyY2U7CiAgfTsKCiAgcmV0dXJuIFJlc291cmNlTWFuYWdlcjsKCn0pKENsYXNzKTsKCgovKgpBIHZpZXcgdGhhdCBzdHJ1Y3R1cmFsbHkgZGlzdGluZ3Vpc2hlcyBldmVudHMgYnkgcmVzb3VyY2UKICovCgpSZXNvdXJjZVZpZXdNaXhpbiA9IHsKICByZXNvdXJjZVRleHRGdW5jOiBudWxsLAogIHVuc2V0UmVzb3VyY2VzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmNsZWFyRXZlbnRzKCk7CiAgfSwKICByZXNldFJlc291cmNlczogZnVuY3Rpb24ocmVzb3VyY2VzKSB7CiAgICB2YXIgc2Nyb2xsU3RhdGU7CiAgICBzY3JvbGxTdGF0ZSA9IHRoaXMucXVlcnlTY3JvbGwoKTsKICAgIHRoaXMudW5zZXRSZXNvdXJjZXMoKTsKICAgIHRoaXMuc2V0UmVzb3VyY2VzKHJlc291cmNlcyk7CiAgICB0aGlzLnNldFNjcm9sbChzY3JvbGxTdGF0ZSk7CiAgICByZXR1cm4gdGhpcy5jYWxlbmRhci5yZXJlbmRlckV2ZW50cygpOwogIH0sCiAgaXNFdmVudERyYWdnYWJsZTogZnVuY3Rpb24oZXZlbnQpIHsKICAgIHJldHVybiB0aGlzLmlzRXZlbnRSZXNvdXJjZUVkaXRhYmxlKGV2ZW50KSB8fCBWaWV3LnByb3RvdHlwZS5pc0V2ZW50RHJhZ2dhYmxlLmNhbGwodGhpcywgZXZlbnQpOwogIH0sCiAgaXNFdmVudFJlc291cmNlRWRpdGFibGU6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICB2YXIgcmVmLCByZWYxLCByZWYyOwogICAgcmV0dXJuIChyZWYgPSAocmVmMSA9IChyZWYyID0gZXZlbnQucmVzb3VyY2VFZGl0YWJsZSkgIT0gbnVsbCA/IHJlZjIgOiAoZXZlbnQuc291cmNlIHx8IHt9KS5yZXNvdXJjZUVkaXRhYmxlKSAhPSBudWxsID8gcmVmMSA6IHRoaXMub3B0KCdldmVudFJlc291cmNlRWRpdGFibGUnKSkgIT0gbnVsbCA/IHJlZiA6IHRoaXMuaXNFdmVudEdlbmVyYWxseUVkaXRhYmxlKGV2ZW50KTsKICB9LAogIGdldFJlc291cmNlVGV4dDogZnVuY3Rpb24ocmVzb3VyY2UpIHsKICAgIHJldHVybiB0aGlzLmdldFJlc291cmNlVGV4dEZ1bmMoKShyZXNvdXJjZSk7CiAgfSwKICBnZXRSZXNvdXJjZVRleHRGdW5jOiBmdW5jdGlvbigpIHsKICAgIHZhciBmdW5jOwogICAgaWYgKHRoaXMucmVzb3VyY2VUZXh0RnVuYykgewogICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVRleHRGdW5jOwogICAgfSBlbHNlIHsKICAgICAgZnVuYyA9IHRoaXMub3B0KCdyZXNvdXJjZVRleHQnKTsKICAgICAgaWYgKHR5cGVvZiBmdW5jICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZnVuYyA9IGZ1bmN0aW9uKHJlc291cmNlKSB7CiAgICAgICAgICByZXR1cm4gcmVzb3VyY2UudGl0bGUgfHwgcmVzb3VyY2UuaWQ7CiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVRleHRGdW5jID0gZnVuYzsKICAgIH0KICB9LAogIHRyaWdnZXJEYXlDbGljazogZnVuY3Rpb24oc3BhbiwgZGF5RWwsIGV2KSB7CiAgICB2YXIgcmVzb3VyY2VNYW5hZ2VyOwogICAgcmVzb3VyY2VNYW5hZ2VyID0gdGhpcy5jYWxlbmRhci5yZXNvdXJjZU1hbmFnZXI7CiAgICByZXR1cm4gdGhpcy50cmlnZ2VyKCdkYXlDbGljaycsIGRheUVsLCB0aGlzLmNhbGVuZGFyLmFwcGx5VGltZXpvbmUoc3Bhbi5zdGFydCksIGV2LCB0aGlzLCByZXNvdXJjZU1hbmFnZXIuZ2V0UmVzb3VyY2VCeUlkKHNwYW4ucmVzb3VyY2VJZCkpOwogIH0sCiAgdHJpZ2dlclNlbGVjdDogZnVuY3Rpb24oc3BhbiwgZXYpIHsKICAgIHZhciByZXNvdXJjZU1hbmFnZXI7CiAgICByZXNvdXJjZU1hbmFnZXIgPSB0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlcjsKICAgIHJldHVybiB0aGlzLnRyaWdnZXIoJ3NlbGVjdCcsIG51bGwsIHRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZShzcGFuLnN0YXJ0KSwgdGhpcy5jYWxlbmRhci5hcHBseVRpbWV6b25lKHNwYW4uZW5kKSwgZXYsIHRoaXMsIHJlc291cmNlTWFuYWdlci5nZXRSZXNvdXJjZUJ5SWQoc3Bhbi5yZXNvdXJjZUlkKSk7CiAgfSwKICB0cmlnZ2VyRXh0ZXJuYWxEcm9wOiBmdW5jdGlvbihldmVudCwgZHJvcExvY2F0aW9uLCBlbCwgZXYsIHVpKSB7CiAgICB0aGlzLnRyaWdnZXIoJ2Ryb3AnLCBlbFswXSwgZHJvcExvY2F0aW9uLnN0YXJ0LCBldiwgdWksIGRyb3BMb2NhdGlvbi5yZXNvdXJjZUlkKTsKICAgIGlmIChldmVudCkgewogICAgICByZXR1cm4gdGhpcy50cmlnZ2VyKCdldmVudFJlY2VpdmUnLCBudWxsLCBldmVudCk7CiAgICB9CiAgfSwKCiAgLyogSGFja3MKICAJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgCVRoZXNlIHRyaWdnZXJzIHVzdWFsbHkgY2FsbCBtdXRhdGVFdmVudCB3aXRoIGRyb3BMb2NhdGlvbiwgd2hpY2ggY2F1c2VzIGFuIGV2ZW50IG1vZGlmaWNhdGlvbiBhbmQgcmVyZW5kZXIuCiAgCUJ1dCBtdXRhdGVFdmVudCBpc24ndCBhd2FyZSBvZiBldmVudFJlc291cmNlRmllbGQsIHNvIGl0IG1pZ2h0IGJlIHNldHRpbmcgdGhlIHdyb25nIHByb3BlcnR5LiBXb3JrYXJvdW5kLgogIAlUT0RPOiBub3JtYWxpemUgc29tZXdoZXJlIGVsc2UuIG1heWJlIG1ha2UgYSBob29rIGluIGNvcmUuCiAgICovCiAgcmVwb3J0RXZlbnREcm9wOiBmdW5jdGlvbigpIHsKICAgIHZhciBkcm9wTG9jYXRpb24sIGV2ZW50LCBvdGhlckFyZ3MsIHJlZjsKICAgIGV2ZW50ID0gYXJndW1lbnRzWzBdLCBkcm9wTG9jYXRpb24gPSBhcmd1bWVudHNbMV0sIG90aGVyQXJncyA9IDMgPD0gYXJndW1lbnRzLmxlbmd0aCA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSA6IFtdOwogICAgZHJvcExvY2F0aW9uID0gdGhpcy5ub3JtYWxpemVEcm9wTG9jYXRpb24oZHJvcExvY2F0aW9uKTsKICAgIGlmIChkcm9wTG9jYXRpb24ucmVzb3VyY2VJZCAmJiBldmVudC5yZXNvdXJjZUlkcykgewogICAgICBkcm9wTG9jYXRpb24ucmVzb3VyY2VJZHMgPSBudWxsOwogICAgfQogICAgcmV0dXJuIChyZWYgPSBWaWV3LnByb3RvdHlwZS5yZXBvcnRFdmVudERyb3ApLmNhbGwuYXBwbHkocmVmLCBbdGhpcywgZXZlbnQsIGRyb3BMb2NhdGlvbl0uY29uY2F0KHNsaWNlLmNhbGwob3RoZXJBcmdzKSkpOwogIH0sCiAgcmVwb3J0RXh0ZXJuYWxEcm9wOiBmdW5jdGlvbigpIHsKICAgIHZhciBkcm9wTG9jYXRpb24sIG1ldGEsIG90aGVyQXJncywgcmVmOwogICAgbWV0YSA9IGFyZ3VtZW50c1swXSwgZHJvcExvY2F0aW9uID0gYXJndW1lbnRzWzFdLCBvdGhlckFyZ3MgPSAzIDw9IGFyZ3VtZW50cy5sZW5ndGggPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMikgOiBbXTsKICAgIGRyb3BMb2NhdGlvbiA9IHRoaXMubm9ybWFsaXplRHJvcExvY2F0aW9uKGRyb3BMb2NhdGlvbik7CiAgICByZXR1cm4gKHJlZiA9IFZpZXcucHJvdG90eXBlLnJlcG9ydEV4dGVybmFsRHJvcCkuY2FsbC5hcHBseShyZWYsIFt0aGlzLCBtZXRhLCBkcm9wTG9jYXRpb25dLmNvbmNhdChzbGljZS5jYWxsKG90aGVyQXJncykpKTsKICB9LAogIG5vcm1hbGl6ZURyb3BMb2NhdGlvbjogZnVuY3Rpb24oZHJvcExvY2F0aW9uKSB7CiAgICB2YXIgb3V0OwogICAgb3V0ID0gJC5leHRlbmQoe30sIGRyb3BMb2NhdGlvbik7CiAgICBkZWxldGUgb3V0LnJlc291cmNlSWQ7CiAgICB0aGlzLmNhbGVuZGFyLnNldEV2ZW50UmVzb3VyY2VJZChvdXQsIGRyb3BMb2NhdGlvbi5yZXNvdXJjZUlkKTsKICAgIHJldHVybiBvdXQ7CiAgfQp9OwoKUmVzb3VyY2VHcmlkTWl4aW4gPSB7CiAgYWxsb3dDcm9zc1Jlc291cmNlOiB0cnVlLAogIGV2ZW50UmFuZ2VUb1NwYW5zOiBmdW5jdGlvbihyYW5nZSwgZXZlbnQpIHsKICAgIHZhciBqLCBsZW4sIHJlc291cmNlSWQsIHJlc291cmNlSWRzLCByZXN1bHRzOwogICAgcmVzb3VyY2VJZHMgPSB0aGlzLnZpZXcuY2FsZW5kYXIuZ2V0RXZlbnRSZXNvdXJjZUlkcyhldmVudCk7CiAgICBpZiAocmVzb3VyY2VJZHMubGVuZ3RoKSB7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVzb3VyY2VJZHMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICByZXNvdXJjZUlkID0gcmVzb3VyY2VJZHNbal07CiAgICAgICAgcmVzdWx0cy5wdXNoKCQuZXh0ZW5kKHt9LCByYW5nZSwgewogICAgICAgICAgcmVzb3VyY2VJZDogcmVzb3VyY2VJZAogICAgICAgIH0pKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0gZWxzZSBpZiAoRkMuaXNCZ0V2ZW50KGV2ZW50KSkgewogICAgICByZXR1cm4gR3JpZC5wcm90b3R5cGUuZXZlbnRSYW5nZVRvU3BhbnMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICB9LAogIGZhYnJpY2F0ZUhlbHBlckV2ZW50OiBmdW5jdGlvbihldmVudExvY2F0aW9uLCBzZWcpIHsKICAgIHZhciBldmVudDsKICAgIGV2ZW50ID0gR3JpZC5wcm90b3R5cGUuZmFicmljYXRlSGVscGVyRXZlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMudmlldy5jYWxlbmRhci5zZXRFdmVudFJlc291cmNlSWQoZXZlbnQsIGV2ZW50TG9jYXRpb24ucmVzb3VyY2VJZCk7CiAgICByZXR1cm4gZXZlbnQ7CiAgfSwKICBjb21wdXRlRXZlbnREcm9wOiBmdW5jdGlvbihzdGFydFNwYW4sIGVuZFNwYW4sIGV2ZW50KSB7CiAgICB2YXIgZHJvcExvY2F0aW9uOwogICAgaWYgKHRoaXMudmlldy5pc0V2ZW50U3RhcnRFZGl0YWJsZShldmVudCkpIHsKICAgICAgZHJvcExvY2F0aW9uID0gR3JpZC5wcm90b3R5cGUuY29tcHV0ZUV2ZW50RHJvcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfSBlbHNlIHsKICAgICAgZHJvcExvY2F0aW9uID0gRkMucGx1Y2tFdmVudERhdGVQcm9wcyhldmVudCk7CiAgICB9CiAgICBpZiAoZHJvcExvY2F0aW9uKSB7CiAgICAgIGlmICh0aGlzLnZpZXcuaXNFdmVudFJlc291cmNlRWRpdGFibGUoZXZlbnQpKSB7CiAgICAgICAgZHJvcExvY2F0aW9uLnJlc291cmNlSWQgPSBlbmRTcGFuLnJlc291cmNlSWQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZHJvcExvY2F0aW9uLnJlc291cmNlSWQgPSBzdGFydFNwYW4ucmVzb3VyY2VJZDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRyb3BMb2NhdGlvbjsKICB9LAogIGNvbXB1dGVFeHRlcm5hbERyb3A6IGZ1bmN0aW9uKHNwYW4sIG1ldGEpIHsKICAgIHZhciBkcm9wTG9jYXRpb247CiAgICBkcm9wTG9jYXRpb24gPSBHcmlkLnByb3RvdHlwZS5jb21wdXRlRXh0ZXJuYWxEcm9wLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAoZHJvcExvY2F0aW9uKSB7CiAgICAgIGRyb3BMb2NhdGlvbi5yZXNvdXJjZUlkID0gc3Bhbi5yZXNvdXJjZUlkOwogICAgfQogICAgcmV0dXJuIGRyb3BMb2NhdGlvbjsKICB9LAogIGNvbXB1dGVFdmVudFJlc2l6ZTogZnVuY3Rpb24odHlwZSwgc3RhcnRTcGFuLCBlbmRTcGFuLCBldmVudCkgewogICAgdmFyIHJlc2l6ZUxvY2F0aW9uOwogICAgaWYgKCF0aGlzLmFsbG93Q3Jvc3NSZXNvdXJjZSAmJiBzdGFydFNwYW4ucmVzb3VyY2VJZCAhPT0gZW5kU3Bhbi5yZXNvdXJjZUlkKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHJlc2l6ZUxvY2F0aW9uID0gR3JpZC5wcm90b3R5cGUuY29tcHV0ZUV2ZW50UmVzaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAocmVzaXplTG9jYXRpb24pIHsKICAgICAgcmVzaXplTG9jYXRpb24ucmVzb3VyY2VJZCA9IHN0YXJ0U3Bhbi5yZXNvdXJjZUlkOwogICAgfQogICAgcmV0dXJuIHJlc2l6ZUxvY2F0aW9uOwogIH0sCiAgY29tcHV0ZVNlbGVjdGlvblNwYW46IGZ1bmN0aW9uKHN0YXJ0U3BhbiwgZW5kU3BhbikgewogICAgdmFyIHNlbGVjdGlvblNwYW47CiAgICBpZiAoIXRoaXMuYWxsb3dDcm9zc1Jlc291cmNlICYmIHN0YXJ0U3Bhbi5yZXNvdXJjZUlkICE9PSBlbmRTcGFuLnJlc291cmNlSWQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgc2VsZWN0aW9uU3BhbiA9IEdyaWQucHJvdG90eXBlLmNvbXB1dGVTZWxlY3Rpb25TcGFuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAoc2VsZWN0aW9uU3BhbikgewogICAgICBzZWxlY3Rpb25TcGFuLnJlc291cmNlSWQgPSBzdGFydFNwYW4ucmVzb3VyY2VJZDsKICAgIH0KICAgIHJldHVybiBzZWxlY3Rpb25TcGFuOwogIH0KfTsKCgovKgpSZXF1aXJlbWVudHM6Ci0gbXVzdCBiZSBhIEdyaWQKLSBncmlkIG11c3QgaGF2ZSBhIHZpZXcgdGhhdCdzIGEgUmVzb3VyY2VWaWV3Ci0gRGF5VGFibGVNaXhpbiBtdXN0IGFscmVhZHkgYmUgbWl4ZWQgaW4KICovCgpSZXNvdXJjZURheVRhYmxlTWl4aW4gPSB7CiAgZmxhdHRlbmVkUmVzb3VyY2VzOiBudWxsLAogIHJlc291cmNlQ250OiAwLAogIGRhdGVzQWJvdmVSZXNvdXJjZXM6IGZhbHNlLAogIGFsbG93Q3Jvc3NSZXNvdXJjZTogZmFsc2UsCiAgc2V0UmVzb3VyY2VzOiBmdW5jdGlvbihyZXNvdXJjZXMpIHsKICAgIHRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzID0gdGhpcy5mbGF0dGVuUmVzb3VyY2VzKHJlc291cmNlcyk7CiAgICB0aGlzLnJlc291cmNlQ250ID0gdGhpcy5mbGF0dGVuZWRSZXNvdXJjZXMubGVuZ3RoOwogICAgcmV0dXJuIHRoaXMudXBkYXRlRGF5VGFibGVDb2xzKCk7CiAgfSwKICB1bnNldFJlc291cmNlczogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmZsYXR0ZW5lZFJlc291cmNlcyA9IG51bGw7CiAgICB0aGlzLnJlc291cmNlQ250ID0gMDsKICAgIHJldHVybiB0aGlzLnVwZGF0ZURheVRhYmxlQ29scygpOwogIH0sCiAgZmxhdHRlblJlc291cmNlczogZnVuY3Rpb24ocmVzb3VyY2VzKSB7CiAgICB2YXIgb3JkZXJTcGVjcywgb3JkZXJWYWwsIHJlcywgc29ydEZ1bmM7CiAgICBvcmRlclZhbCA9IHRoaXMudmlldy5vcHQoJ3Jlc291cmNlT3JkZXInKTsKICAgIGlmIChvcmRlclZhbCkgewogICAgICBvcmRlclNwZWNzID0gcGFyc2VGaWVsZFNwZWNzKG9yZGVyVmFsKTsKICAgICAgc29ydEZ1bmMgPSBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIGNvbXBhcmVCeUZpZWxkU3BlY3MoYSwgYiwgb3JkZXJTcGVjcyk7CiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBzb3J0RnVuYyA9IG51bGw7CiAgICB9CiAgICByZXMgPSBbXTsKICAgIHRoaXMuYWNjdW11bGF0ZVJlc291cmNlcyhyZXNvdXJjZXMsIHNvcnRGdW5jLCByZXMpOwogICAgcmV0dXJuIHJlczsKICB9LAogIGFjY3VtdWxhdGVSZXNvdXJjZXM6IGZ1bmN0aW9uKHJlc291cmNlcywgc29ydEZ1bmMsIHJlcykgewogICAgdmFyIGosIGxlbiwgcmVzb3VyY2UsIHJlc3VsdHMsIHNvcnRlZFJlc291cmNlczsKICAgIGlmIChzb3J0RnVuYykgewogICAgICBzb3J0ZWRSZXNvdXJjZXMgPSByZXNvdXJjZXMuc2xpY2UoMCk7CiAgICAgIHNvcnRlZFJlc291cmNlcy5zb3J0KHNvcnRGdW5jKTsKICAgIH0gZWxzZSB7CiAgICAgIHNvcnRlZFJlc291cmNlcyA9IHJlc291cmNlczsKICAgIH0KICAgIHJlc3VsdHMgPSBbXTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHNvcnRlZFJlc291cmNlcy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByZXNvdXJjZSA9IHNvcnRlZFJlc291cmNlc1tqXTsKICAgICAgcmVzLnB1c2gocmVzb3VyY2UpOwogICAgICByZXN1bHRzLnB1c2godGhpcy5hY2N1bXVsYXRlUmVzb3VyY2VzKHJlc291cmNlLmNoaWxkcmVuLCBzb3J0RnVuYywgcmVzKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9LAogIHVwZGF0ZURheVRhYmxlQ29sczogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmRhdGVzQWJvdmVSZXNvdXJjZXMgPSB0aGlzLnZpZXcub3B0KCdncm91cEJ5RGF0ZUFuZFJlc291cmNlJyk7CiAgICByZXR1cm4gRkMuRGF5VGFibGVNaXhpbi51cGRhdGVEYXlUYWJsZUNvbHMuY2FsbCh0aGlzKTsKICB9LAogIGNvbXB1dGVDb2xDbnQ6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICh0aGlzLnJlc291cmNlQ250IHx8IDEpICogdGhpcy5kYXlzUGVyUm93OwogIH0sCiAgZ2V0Q29sRGF5SW5kZXg6IGZ1bmN0aW9uKGNvbCkgewogICAgaWYgKHRoaXMuaXNSVEwpIHsKICAgICAgY29sID0gdGhpcy5jb2xDbnQgLSAxIC0gY29sOwogICAgfQogICAgaWYgKHRoaXMuZGF0ZXNBYm92ZVJlc291cmNlcykgewogICAgICByZXR1cm4gTWF0aC5mbG9vcihjb2wgLyAodGhpcy5yZXNvdXJjZUNudCB8fCAxKSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gY29sICUgdGhpcy5kYXlzUGVyUm93OwogICAgfQogIH0sCiAgZ2V0Q29sUmVzb3VyY2U6IGZ1bmN0aW9uKGNvbCkgewogICAgcmV0dXJuIHRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzW3RoaXMuZ2V0Q29sUmVzb3VyY2VJbmRleChjb2wpXTsKICB9LAogIGdldENvbFJlc291cmNlSW5kZXg6IGZ1bmN0aW9uKGNvbCkgewogICAgaWYgKHRoaXMuaXNSVEwpIHsKICAgICAgY29sID0gdGhpcy5jb2xDbnQgLSAxIC0gY29sOwogICAgfQogICAgaWYgKHRoaXMuZGF0ZXNBYm92ZVJlc291cmNlcykgewogICAgICByZXR1cm4gY29sICUgKHRoaXMucmVzb3VyY2VDbnQgfHwgMSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gTWF0aC5mbG9vcihjb2wgLyB0aGlzLmRheXNQZXJSb3cpOwogICAgfQogIH0sCiAgaW5kaWNlc1RvQ29sOiBmdW5jdGlvbihyZXNvdXJjZUluZGV4LCBkYXlJbmRleCkgewogICAgdmFyIGNvbDsKICAgIGNvbCA9IHRoaXMuZGF0ZXNBYm92ZVJlc291cmNlcyA/IGRheUluZGV4ICogKHRoaXMucmVzb3VyY2VDbnQgfHwgMSkgKyByZXNvdXJjZUluZGV4IDogcmVzb3VyY2VJbmRleCAqIHRoaXMuZGF5c1BlclJvdyArIGRheUluZGV4OwogICAgaWYgKHRoaXMuaXNSVEwpIHsKICAgICAgY29sID0gdGhpcy5jb2xDbnQgLSAxIC0gY29sOwogICAgfQogICAgcmV0dXJuIGNvbDsKICB9LAogIHJlbmRlckhlYWRUckh0bWw6IGZ1bmN0aW9uKCkgewogICAgaWYgKCF0aGlzLnJlc291cmNlQ250KSB7CiAgICAgIHJldHVybiBGQy5EYXlUYWJsZU1peGluLnJlbmRlckhlYWRUckh0bWwuY2FsbCh0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICh0aGlzLmRheXNQZXJSb3cgPiAxKSB7CiAgICAgICAgaWYgKHRoaXMuZGF0ZXNBYm92ZVJlc291cmNlcykgewogICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySGVhZERhdGVBbmRSZXNvdXJjZUh0bWwoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySGVhZFJlc291cmNlQW5kRGF0ZUh0bWwoKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySGVhZFJlc291cmNlSHRtbCgpOwogICAgICB9CiAgICB9CiAgfSwKICByZW5kZXJIZWFkUmVzb3VyY2VIdG1sOiBmdW5jdGlvbigpIHsKICAgIHZhciBqLCBsZW4sIHJlZiwgcmVzb3VyY2UsIHJlc291cmNlSHRtbHM7CiAgICByZXNvdXJjZUh0bWxzID0gW107CiAgICByZWYgPSB0aGlzLmZsYXR0ZW5lZFJlc291cmNlczsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByZXNvdXJjZSA9IHJlZltqXTsKICAgICAgcmVzb3VyY2VIdG1scy5wdXNoKHRoaXMucmVuZGVySGVhZFJlc291cmNlQ2VsbEh0bWwocmVzb3VyY2UpKTsKICAgIH0KICAgIHJldHVybiB0aGlzLndyYXBUcihyZXNvdXJjZUh0bWxzLCAncmVuZGVySGVhZEludHJvSHRtbCcpOwogIH0sCiAgcmVuZGVySGVhZFJlc291cmNlQW5kRGF0ZUh0bWw6IGZ1bmN0aW9uKCkgewogICAgdmFyIGRhdGUsIGRhdGVIdG1scywgZGF5SW5kZXgsIGosIGssIGxlbiwgcmVmLCByZWYxLCByZXNvdXJjZSwgcmVzb3VyY2VIdG1sczsKICAgIHJlc291cmNlSHRtbHMgPSBbXTsKICAgIGRhdGVIdG1scyA9IFtdOwogICAgcmVmID0gdGhpcy5mbGF0dGVuZWRSZXNvdXJjZXM7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcmVzb3VyY2UgPSByZWZbal07CiAgICAgIHJlc291cmNlSHRtbHMucHVzaCh0aGlzLnJlbmRlckhlYWRSZXNvdXJjZUNlbGxIdG1sKHJlc291cmNlLCBudWxsLCB0aGlzLmRheXNQZXJSb3cpKTsKICAgICAgZm9yIChkYXlJbmRleCA9IGsgPSAwLCByZWYxID0gdGhpcy5kYXlzUGVyUm93OyBrIDwgcmVmMTsgZGF5SW5kZXggPSBrICs9IDEpIHsKICAgICAgICBkYXRlID0gdGhpcy5kYXlEYXRlc1tkYXlJbmRleF0uY2xvbmUoKTsKICAgICAgICBkYXRlSHRtbHMucHVzaCh0aGlzLnJlbmRlckhlYWRSZXNvdXJjZURhdGVDZWxsSHRtbChkYXRlLCByZXNvdXJjZSkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy53cmFwVHIocmVzb3VyY2VIdG1scywgJ3JlbmRlckhlYWRJbnRyb0h0bWwnKSArIHRoaXMud3JhcFRyKGRhdGVIdG1scywgJ3JlbmRlckhlYWRJbnRyb0h0bWwnKTsKICB9LAogIHJlbmRlckhlYWREYXRlQW5kUmVzb3VyY2VIdG1sOiBmdW5jdGlvbigpIHsKICAgIHZhciBkYXRlLCBkYXRlSHRtbHMsIGRheUluZGV4LCBqLCBrLCBsZW4sIHJlZiwgcmVmMSwgcmVzb3VyY2UsIHJlc291cmNlSHRtbHM7CiAgICBkYXRlSHRtbHMgPSBbXTsKICAgIHJlc291cmNlSHRtbHMgPSBbXTsKICAgIGZvciAoZGF5SW5kZXggPSBqID0gMCwgcmVmID0gdGhpcy5kYXlzUGVyUm93OyBqIDwgcmVmOyBkYXlJbmRleCA9IGogKz0gMSkgewogICAgICBkYXRlID0gdGhpcy5kYXlEYXRlc1tkYXlJbmRleF0uY2xvbmUoKTsKICAgICAgZGF0ZUh0bWxzLnB1c2godGhpcy5yZW5kZXJIZWFkRGF0ZUNlbGxIdG1sKGRhdGUsIHRoaXMucmVzb3VyY2VDbnQpKTsKICAgICAgcmVmMSA9IHRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzOwogICAgICBmb3IgKGsgPSAwLCBsZW4gPSByZWYxLmxlbmd0aDsgayA8IGxlbjsgaysrKSB7CiAgICAgICAgcmVzb3VyY2UgPSByZWYxW2tdOwogICAgICAgIHJlc291cmNlSHRtbHMucHVzaCh0aGlzLnJlbmRlckhlYWRSZXNvdXJjZUNlbGxIdG1sKHJlc291cmNlLCBkYXRlKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzLndyYXBUcihkYXRlSHRtbHMsICdyZW5kZXJIZWFkSW50cm9IdG1sJykgKyB0aGlzLndyYXBUcihyZXNvdXJjZUh0bWxzLCAncmVuZGVySGVhZEludHJvSHRtbCcpOwogIH0sCiAgcmVuZGVySGVhZFJlc291cmNlQ2VsbEh0bWw6IGZ1bmN0aW9uKHJlc291cmNlLCBkYXRlLCBjb2xzcGFuKSB7CiAgICByZXR1cm4gJzx0aCBjbGFzcz0iZmMtcmVzb3VyY2UtY2VsbCInICsgJyBkYXRhLXJlc291cmNlLWlkPSInICsgcmVzb3VyY2UuaWQgKyAnIicgKyAoZGF0ZSA/ICcgZGF0YS1kYXRlPSInICsgZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSArICciJyA6ICcnKSArIChjb2xzcGFuID4gMSA/ICcgY29sc3Bhbj0iJyArIGNvbHNwYW4gKyAnIicgOiAnJykgKyAnPicgKyBodG1sRXNjYXBlKHRoaXMudmlldy5nZXRSZXNvdXJjZVRleHQocmVzb3VyY2UpKSArICc8L3RoPic7CiAgfSwKICByZW5kZXJIZWFkUmVzb3VyY2VEYXRlQ2VsbEh0bWw6IGZ1bmN0aW9uKGRhdGUsIHJlc291cmNlLCBjb2xzcGFuKSB7CiAgICByZXR1cm4gdGhpcy5yZW5kZXJIZWFkRGF0ZUNlbGxIdG1sKGRhdGUsIGNvbHNwYW4sICdkYXRhLXJlc291cmNlLWlkPSInICsgcmVzb3VyY2UuaWQgKyAnIicpOwogIH0sCiAgcHJvY2Vzc0hlYWRSZXNvdXJjZUVsczogZnVuY3Rpb24oY29udGFpbmVyRWwpIHsKICAgIHJldHVybiBjb250YWluZXJFbC5maW5kKCcuZmMtcmVzb3VyY2UtY2VsbCcpLmVhY2goKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihjb2wsIG5vZGUpIHsKICAgICAgICB2YXIgcmVzb3VyY2U7CiAgICAgICAgaWYgKF90aGlzLmRhdGVzQWJvdmVSZXNvdXJjZXMpIHsKICAgICAgICAgIHJlc291cmNlID0gX3RoaXMuZ2V0Q29sUmVzb3VyY2UoY29sKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzb3VyY2UgPSBfdGhpcy5mbGF0dGVuZWRSZXNvdXJjZXNbX3RoaXMuaXNSVEwgPyBfdGhpcy5mbGF0dGVuZWRSZXNvdXJjZXMubGVuZ3RoIC0gMSAtIGNvbCA6IGNvbF07CiAgICAgICAgfQogICAgICAgIHJldHVybiBfdGhpcy52aWV3LnRyaWdnZXIoJ3Jlc291cmNlUmVuZGVyJywgcmVzb3VyY2UsIHJlc291cmNlLCAkKG5vZGUpLCAkKCkpOwogICAgICB9OwogICAgfSkodGhpcykpOwogIH0sCiAgcmVuZGVyQmdDZWxsc0h0bWw6IGZ1bmN0aW9uKHJvdykgewogICAgdmFyIGNvbCwgZGF0ZSwgaHRtbHMsIGosIHJlZiwgcmVzb3VyY2U7CiAgICBpZiAoIXRoaXMucmVzb3VyY2VDbnQpIHsKICAgICAgcmV0dXJuIEZDLkRheVRhYmxlTWl4aW4ucmVuZGVyQmdDZWxsc0h0bWwuY2FsbCh0aGlzLCByb3cpOwogICAgfSBlbHNlIHsKICAgICAgaHRtbHMgPSBbXTsKICAgICAgZm9yIChjb2wgPSBqID0gMCwgcmVmID0gdGhpcy5jb2xDbnQ7IGogPCByZWY7IGNvbCA9IGogKz0gMSkgewogICAgICAgIGRhdGUgPSB0aGlzLmdldENlbGxEYXRlKHJvdywgY29sKTsKICAgICAgICByZXNvdXJjZSA9IHRoaXMuZ2V0Q29sUmVzb3VyY2UoY29sKTsKICAgICAgICBodG1scy5wdXNoKHRoaXMucmVuZGVyUmVzb3VyY2VCZ0NlbGxIdG1sKGRhdGUsIHJlc291cmNlKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGh0bWxzLmpvaW4oJycpOwogICAgfQogIH0sCiAgcmVuZGVyUmVzb3VyY2VCZ0NlbGxIdG1sOiBmdW5jdGlvbihkYXRlLCByZXNvdXJjZSkgewogICAgcmV0dXJuIHRoaXMucmVuZGVyQmdDZWxsSHRtbChkYXRlLCAnZGF0YS1yZXNvdXJjZS1pZD0iJyArIHJlc291cmNlLmlkICsgJyInKTsKICB9LAogIHdyYXBUcjogZnVuY3Rpb24oY2VsbEh0bWxzLCBpbnRyb01ldGhvZE5hbWUpIHsKICAgIGlmICh0aGlzLmlzUlRMKSB7CiAgICAgIGNlbGxIdG1scy5yZXZlcnNlKCk7CiAgICAgIHJldHVybiAnPHRyPicgKyBjZWxsSHRtbHMuam9pbignJykgKyB0aGlzW2ludHJvTWV0aG9kTmFtZV0oKSArICc8L3RyPic7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJzx0cj4nICsgdGhpc1tpbnRyb01ldGhvZE5hbWVdKCkgKyBjZWxsSHRtbHMuam9pbignJykgKyAnPC90cj4nOwogICAgfQogIH0sCgogIC8qCiAgCUlmIHRoZXJlIGFyZSBubyBwZXItcmVzb3VyY2UgYnVzaW5lc3MgaG91ciBkZWZpbml0aW9ucywgcmV0dXJucyBudWxsLgogIAlPdGhlcndpc2UsIHJldHVybnMgYSBsaXN0IG9mIGJ1c2luZXNzIGhvdXJzIHNlZ3MgZm9yICpldmVyeSogcmVzb3VyY2UuCiAgICovCiAgY29tcHV0ZVBlclJlc291cmNlQnVzaW5lc3NIb3VyU2VnczogZnVuY3Rpb24od2hvbGVEYXkpIHsKICAgIHZhciBhbGxTZWdzLCBhbnlDdXN0b21CdXNpbmVzc0hvdXJzLCBidXNpbmVzc0hvdXJzLCBldmVudCwgZXZlbnRzLCBqLCBrLCBsLCBsZW4sIGxlbjEsIGxlbjIsIHJlZiwgcmVmMSwgcmVzb3VyY2UsIHNlZ3M7CiAgICBpZiAodGhpcy5mbGF0dGVuZWRSZXNvdXJjZXMpIHsKICAgICAgYW55Q3VzdG9tQnVzaW5lc3NIb3VycyA9IGZhbHNlOwogICAgICByZWYgPSB0aGlzLmZsYXR0ZW5lZFJlc291cmNlczsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgcmVzb3VyY2UgPSByZWZbal07CiAgICAgICAgaWYgKHJlc291cmNlLmJ1c2luZXNzSG91cnMpIHsKICAgICAgICAgIGFueUN1c3RvbUJ1c2luZXNzSG91cnMgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoYW55Q3VzdG9tQnVzaW5lc3NIb3VycykgewogICAgICAgIGFsbFNlZ3MgPSBbXTsKICAgICAgICByZWYxID0gdGhpcy5mbGF0dGVuZWRSZXNvdXJjZXM7CiAgICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHJlZjEubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7CiAgICAgICAgICByZXNvdXJjZSA9IHJlZjFba107CiAgICAgICAgICBidXNpbmVzc0hvdXJzID0gcmVzb3VyY2UuYnVzaW5lc3NIb3VycyB8fCB0aGlzLnZpZXcub3B0KCdidXNpbmVzc0hvdXJzJyk7CiAgICAgICAgICBldmVudHMgPSB0aGlzLnZpZXcuY2FsZW5kYXIuY29tcHV0ZUJ1c2luZXNzSG91ckV2ZW50cyh3aG9sZURheSwgYnVzaW5lc3NIb3Vycyk7CiAgICAgICAgICBmb3IgKGwgPSAwLCBsZW4yID0gZXZlbnRzLmxlbmd0aDsgbCA8IGxlbjI7IGwrKykgewogICAgICAgICAgICBldmVudCA9IGV2ZW50c1tsXTsKICAgICAgICAgICAgZXZlbnQucmVzb3VyY2VJZCA9IHJlc291cmNlLmlkOwogICAgICAgICAgfQogICAgICAgICAgc2VncyA9IHRoaXMuZXZlbnRzVG9TZWdzKGV2ZW50cyk7CiAgICAgICAgICBhbGxTZWdzLnB1c2guYXBwbHkoYWxsU2Vncywgc2Vncyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbGxTZWdzOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn07CgpSZXNvdXJjZURheUdyaWQgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChSZXNvdXJjZURheUdyaWQsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBSZXNvdXJjZURheUdyaWQoKSB7CiAgICByZXR1cm4gUmVzb3VyY2VEYXlHcmlkLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgUmVzb3VyY2VEYXlHcmlkLm1peGluKFJlc291cmNlR3JpZE1peGluKTsKCiAgUmVzb3VyY2VEYXlHcmlkLm1peGluKFJlc291cmNlRGF5VGFibGVNaXhpbik7CgogIFJlc291cmNlRGF5R3JpZC5wcm90b3R5cGUuZ2V0SGl0U3BhbiA9IGZ1bmN0aW9uKGhpdCkgewogICAgdmFyIHNwYW47CiAgICBzcGFuID0gUmVzb3VyY2VEYXlHcmlkLl9fc3VwZXJfXy5nZXRIaXRTcGFuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodGhpcy5yZXNvdXJjZUNudCkgewogICAgICBzcGFuLnJlc291cmNlSWQgPSB0aGlzLmdldENvbFJlc291cmNlKGhpdC5jb2wpLmlkOwogICAgfQogICAgcmV0dXJuIHNwYW47CiAgfTsKCiAgUmVzb3VyY2VEYXlHcmlkLnByb3RvdHlwZS5zcGFuVG9TZWdzID0gZnVuY3Rpb24oc3BhbikgewogICAgdmFyIGNvcHksIGdlbmVyaWNTZWdzLCBqLCBrLCBsLCBsZW4sIGxlbjEsIHJlZiwgcmVzb3VyY2VDbnQsIHJlc291cmNlSW5kZXgsIHJlc291cmNlT2JqLCByZXNvdXJjZVNlZ3MsIHNlZzsKICAgIHJlc291cmNlQ250ID0gdGhpcy5yZXNvdXJjZUNudDsKICAgIGdlbmVyaWNTZWdzID0gdGhpcy5kYXRlc0Fib3ZlUmVzb3VyY2VzID8gdGhpcy5zbGljZVJhbmdlQnlEYXkoc3BhbikgOiB0aGlzLnNsaWNlUmFuZ2VCeVJvdyhzcGFuKTsKICAgIGlmICghcmVzb3VyY2VDbnQpIHsKICAgICAgZm9yIChqID0gMCwgbGVuID0gZ2VuZXJpY1NlZ3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICBzZWcgPSBnZW5lcmljU2Vnc1tqXTsKICAgICAgICBpZiAodGhpcy5pc1JUTCkgewogICAgICAgICAgc2VnLmxlZnRDb2wgPSBzZWcubGFzdFJvd0RheUluZGV4OwogICAgICAgICAgc2VnLnJpZ2h0Q29sID0gc2VnLmZpcnN0Um93RGF5SW5kZXg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlZy5sZWZ0Q29sID0gc2VnLmZpcnN0Um93RGF5SW5kZXg7CiAgICAgICAgICBzZWcucmlnaHRDb2wgPSBzZWcubGFzdFJvd0RheUluZGV4OwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZ2VuZXJpY1NlZ3M7CiAgICB9IGVsc2UgewogICAgICByZXNvdXJjZVNlZ3MgPSBbXTsKICAgICAgZm9yIChrID0gMCwgbGVuMSA9IGdlbmVyaWNTZWdzLmxlbmd0aDsgayA8IGxlbjE7IGsrKykgewogICAgICAgIHNlZyA9IGdlbmVyaWNTZWdzW2tdOwogICAgICAgIGZvciAocmVzb3VyY2VJbmRleCA9IGwgPSAwLCByZWYgPSByZXNvdXJjZUNudDsgbCA8IHJlZjsgcmVzb3VyY2VJbmRleCA9IGwgKz0gMSkgewogICAgICAgICAgcmVzb3VyY2VPYmogPSB0aGlzLmZsYXR0ZW5lZFJlc291cmNlc1tyZXNvdXJjZUluZGV4XTsKICAgICAgICAgIGlmICghc3Bhbi5yZXNvdXJjZUlkIHx8IHNwYW4ucmVzb3VyY2VJZCA9PT0gcmVzb3VyY2VPYmouaWQpIHsKICAgICAgICAgICAgY29weSA9ICQuZXh0ZW5kKHt9LCBzZWcpOwogICAgICAgICAgICBjb3B5LnJlc291cmNlID0gcmVzb3VyY2VPYmo7CiAgICAgICAgICAgIGlmICh0aGlzLmlzUlRMKSB7CiAgICAgICAgICAgICAgY29weS5sZWZ0Q29sID0gdGhpcy5pbmRpY2VzVG9Db2wocmVzb3VyY2VJbmRleCwgc2VnLmxhc3RSb3dEYXlJbmRleCk7CiAgICAgICAgICAgICAgY29weS5yaWdodENvbCA9IHRoaXMuaW5kaWNlc1RvQ29sKHJlc291cmNlSW5kZXgsIHNlZy5maXJzdFJvd0RheUluZGV4KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb3B5LmxlZnRDb2wgPSB0aGlzLmluZGljZXNUb0NvbChyZXNvdXJjZUluZGV4LCBzZWcuZmlyc3RSb3dEYXlJbmRleCk7CiAgICAgICAgICAgICAgY29weS5yaWdodENvbCA9IHRoaXMuaW5kaWNlc1RvQ29sKHJlc291cmNlSW5kZXgsIHNlZy5sYXN0Um93RGF5SW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlc291cmNlU2Vncy5wdXNoKGNvcHkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzb3VyY2VTZWdzOwogICAgfQogIH07CgogIFJlc291cmNlRGF5R3JpZC5wcm90b3R5cGUucmVuZGVyQnVzaW5lc3NIb3VycyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHNlZ3M7CiAgICBzZWdzID0gdGhpcy5jb21wdXRlUGVyUmVzb3VyY2VCdXNpbmVzc0hvdXJTZWdzKHRydWUpOwogICAgaWYgKHNlZ3MpIHsKICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRmlsbCgnYnVzaW5lc3NIb3VycycsIHNlZ3MsICdiZ2V2ZW50Jyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gUmVzb3VyY2VEYXlHcmlkLl9fc3VwZXJfXy5yZW5kZXJCdXNpbmVzc0hvdXJzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIFJlc291cmNlRGF5R3JpZDsKCn0pKEZDLkRheUdyaWQpOwoKUmVzb3VyY2VUaW1lR3JpZCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKFJlc291cmNlVGltZUdyaWQsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBSZXNvdXJjZVRpbWVHcmlkKCkgewogICAgcmV0dXJuIFJlc291cmNlVGltZUdyaWQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKICBSZXNvdXJjZVRpbWVHcmlkLm1peGluKFJlc291cmNlR3JpZE1peGluKTsKCiAgUmVzb3VyY2VUaW1lR3JpZC5taXhpbihSZXNvdXJjZURheVRhYmxlTWl4aW4pOwoKICBSZXNvdXJjZVRpbWVHcmlkLnByb3RvdHlwZS5nZXRIaXRTcGFuID0gZnVuY3Rpb24oaGl0KSB7CiAgICB2YXIgc3BhbjsKICAgIHNwYW4gPSBSZXNvdXJjZVRpbWVHcmlkLl9fc3VwZXJfXy5nZXRIaXRTcGFuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodGhpcy5yZXNvdXJjZUNudCkgewogICAgICBzcGFuLnJlc291cmNlSWQgPSB0aGlzLmdldENvbFJlc291cmNlKGhpdC5jb2wpLmlkOwogICAgfQogICAgcmV0dXJuIHNwYW47CiAgfTsKCiAgUmVzb3VyY2VUaW1lR3JpZC5wcm90b3R5cGUuc3BhblRvU2VncyA9IGZ1bmN0aW9uKHNwYW4pIHsKICAgIHZhciBjb3B5LCBnZW5lcmljU2VncywgaiwgaywgbCwgbGVuLCBsZW4xLCByZWYsIHJlc291cmNlQ250LCByZXNvdXJjZUluZGV4LCByZXNvdXJjZU9iaiwgcmVzb3VyY2VTZWdzLCBzZWc7CiAgICByZXNvdXJjZUNudCA9IHRoaXMucmVzb3VyY2VDbnQ7CiAgICBnZW5lcmljU2VncyA9IHRoaXMuc2xpY2VSYW5nZUJ5VGltZXMoc3Bhbik7CiAgICBpZiAoIXJlc291cmNlQ250KSB7CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IGdlbmVyaWNTZWdzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgc2VnID0gZ2VuZXJpY1NlZ3Nbal07CiAgICAgICAgc2VnLmNvbCA9IHNlZy5kYXlJbmRleDsKICAgICAgfQogICAgICByZXR1cm4gZ2VuZXJpY1NlZ3M7CiAgICB9IGVsc2UgewogICAgICByZXNvdXJjZVNlZ3MgPSBbXTsKICAgICAgZm9yIChrID0gMCwgbGVuMSA9IGdlbmVyaWNTZWdzLmxlbmd0aDsgayA8IGxlbjE7IGsrKykgewogICAgICAgIHNlZyA9IGdlbmVyaWNTZWdzW2tdOwogICAgICAgIGZvciAocmVzb3VyY2VJbmRleCA9IGwgPSAwLCByZWYgPSByZXNvdXJjZUNudDsgbCA8IHJlZjsgcmVzb3VyY2VJbmRleCA9IGwgKz0gMSkgewogICAgICAgICAgcmVzb3VyY2VPYmogPSB0aGlzLmZsYXR0ZW5lZFJlc291cmNlc1tyZXNvdXJjZUluZGV4XTsKICAgICAgICAgIGlmICghc3Bhbi5yZXNvdXJjZUlkIHx8IHNwYW4ucmVzb3VyY2VJZCA9PT0gcmVzb3VyY2VPYmouaWQpIHsKICAgICAgICAgICAgY29weSA9ICQuZXh0ZW5kKHt9LCBzZWcpOwogICAgICAgICAgICBjb3B5LnJlc291cmNlID0gcmVzb3VyY2VPYmo7CiAgICAgICAgICAgIGNvcHkuY29sID0gdGhpcy5pbmRpY2VzVG9Db2wocmVzb3VyY2VJbmRleCwgc2VnLmRheUluZGV4KTsKICAgICAgICAgICAgcmVzb3VyY2VTZWdzLnB1c2goY29weSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXNvdXJjZVNlZ3M7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lR3JpZC5wcm90b3R5cGUucmVuZGVyQnVzaW5lc3NIb3VycyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHNlZ3M7CiAgICBzZWdzID0gdGhpcy5jb21wdXRlUGVyUmVzb3VyY2VCdXNpbmVzc0hvdXJTZWdzKGZhbHNlKTsKICAgIGlmIChzZWdzKSB7CiAgICAgIHJldHVybiB0aGlzLnJlbmRlckJ1c2luZXNzU2VncyhzZWdzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBSZXNvdXJjZVRpbWVHcmlkLl9fc3VwZXJfXy5yZW5kZXJCdXNpbmVzc0hvdXJzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIFJlc291cmNlVGltZUdyaWQ7Cgp9KShGQy5UaW1lR3JpZCk7CgpUaW1lbGluZVZpZXcgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChUaW1lbGluZVZpZXcsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBUaW1lbGluZVZpZXcoKSB7CiAgICByZXR1cm4gVGltZWxpbmVWaWV3Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS50aW1lR3JpZCA9IG51bGw7CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUuaXNTY3JvbGxlZCA9IGZhbHNlOwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudGltZUdyaWQgPSB0aGlzLmluc3RhbnRpYXRlR3JpZCgpOwogICAgcmV0dXJuIHRoaXMuaW50ZXJ2YWxEdXJhdGlvbiA9IHRoaXMudGltZUdyaWQuZHVyYXRpb247CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5pbnN0YW50aWF0ZUdyaWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBuZXcgVGltZWxpbmVHcmlkKHRoaXMpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUuc2V0UmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgewogICAgVGltZWxpbmVWaWV3Ll9fc3VwZXJfXy5zZXRSYW5nZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuc2V0UmFuZ2UocmFuZ2UpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVuZGVyU2tlbGV0b24gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuYWRkQ2xhc3MoJ2ZjLXRpbWVsaW5lJyk7CiAgICBpZiAodGhpcy5vcHQoJ2V2ZW50T3ZlcmxhcCcpID09PSBmYWxzZSkgewogICAgICB0aGlzLmVsLmFkZENsYXNzKCdmYy1uby1vdmVybGFwJyk7CiAgICB9CiAgICB0aGlzLmVsLmh0bWwodGhpcy5yZW5kZXJTa2VsZXRvbkh0bWwoKSk7CiAgICByZXR1cm4gdGhpcy5yZW5kZXJUaW1lR3JpZFNrZWxldG9uKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbkh0bWwgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiAnPHRhYmxlPiA8dGhlYWQgY2xhc3M9ImZjLWhlYWQiPiA8dHI+IDx0ZCBjbGFzcz0iZmMtdGltZS1hcmVhICcgKyB0aGlzLndpZGdldEhlYWRlckNsYXNzICsgJyI+PC90ZD4gPC90cj4gPC90aGVhZD4gPHRib2R5IGNsYXNzPSJmYy1ib2R5Ij4gPHRyPiA8dGQgY2xhc3M9ImZjLXRpbWUtYXJlYSAnICsgdGhpcy53aWRnZXRDb250ZW50Q2xhc3MgKyAnIj48L3RkPiA8L3RyPiA8L3Rib2R5PiA8L3RhYmxlPic7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJUaW1lR3JpZFNrZWxldG9uID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnRpbWVHcmlkLnNldEVsZW1lbnQodGhpcy5lbC5maW5kKCd0Ym9keSAuZmMtdGltZS1hcmVhJykpOwogICAgdGhpcy50aW1lR3JpZC5oZWFkRWwgPSB0aGlzLmVsLmZpbmQoJ3RoZWFkIC5mYy10aW1lLWFyZWEnKTsKICAgIHRoaXMudGltZUdyaWQucmVuZGVyU2tlbGV0b24oKTsKICAgIHRoaXMuaXNTY3JvbGxlZCA9IGZhbHNlOwogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuYm9keVNjcm9sbGVyLm9uKCdzY3JvbGwnLCBwcm94eSh0aGlzLCAnaGFuZGxlQm9keVNjcm9sbCcpKTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLmhhbmRsZUJvZHlTY3JvbGwgPSBmdW5jdGlvbih0b3AsIGxlZnQpIHsKICAgIGlmICh0b3ApIHsKICAgICAgaWYgKCF0aGlzLmlzU2Nyb2xsZWQpIHsKICAgICAgICB0aGlzLmlzU2Nyb2xsZWQgPSB0cnVlOwogICAgICAgIHJldHVybiB0aGlzLmVsLmFkZENsYXNzKCdmYy1zY3JvbGxlZCcpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAodGhpcy5pc1Njcm9sbGVkKSB7CiAgICAgICAgdGhpcy5pc1Njcm9sbGVkID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRoaXMuZWwucmVtb3ZlQ2xhc3MoJ2ZjLXNjcm9sbGVkJyk7CiAgICAgIH0KICAgIH0KICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLnVucmVuZGVyU2tlbGV0b24gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudGltZUdyaWQucmVtb3ZlRWxlbWVudCgpOwogICAgdGhpcy5oYW5kbGVCb2R5U2Nyb2xsKDApOwogICAgcmV0dXJuIFRpbWVsaW5lVmlldy5fX3N1cGVyX18udW5yZW5kZXJTa2VsZXRvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVuZGVyRGF0ZXMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlckRhdGVzKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS51bnJlbmRlckRhdGVzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC51bnJlbmRlckRhdGVzKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJCdXNpbmVzc0hvdXJzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5yZW5kZXJCdXNpbmVzc0hvdXJzKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS51bnJlbmRlckJ1c2luZXNzSG91cnMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnVucmVuZGVyQnVzaW5lc3NIb3VycygpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUuZ2V0Tm93SW5kaWNhdG9yVW5pdCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0Tm93SW5kaWNhdG9yVW5pdCgpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVuZGVyTm93SW5kaWNhdG9yID0gZnVuY3Rpb24oZGF0ZSkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQucmVuZGVyTm93SW5kaWNhdG9yKGRhdGUpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUudW5yZW5kZXJOb3dJbmRpY2F0b3IgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnVucmVuZGVyTm93SW5kaWNhdG9yKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5wcmVwYXJlSGl0cyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQucHJlcGFyZUhpdHMoKTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLnJlbGVhc2VIaXRzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5yZWxlYXNlSGl0cygpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUucXVlcnlIaXQgPSBmdW5jdGlvbihsZWZ0T2Zmc2V0LCB0b3BPZmZzZXQpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnF1ZXJ5SGl0KGxlZnRPZmZzZXQsIHRvcE9mZnNldCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5nZXRIaXRTcGFuID0gZnVuY3Rpb24oaGl0KSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5nZXRIaXRTcGFuKGhpdCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5nZXRIaXRFbCA9IGZ1bmN0aW9uKGhpdCkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0SGl0RWwoaGl0KTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLnVwZGF0ZVdpZHRoID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC51cGRhdGVXaWR0aCgpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUuc2V0SGVpZ2h0ID0gZnVuY3Rpb24odG90YWxIZWlnaHQsIGlzQXV0bykgewogICAgdmFyIGJvZHlIZWlnaHQ7CiAgICBpZiAoaXNBdXRvKSB7CiAgICAgIGJvZHlIZWlnaHQgPSAnYXV0byc7CiAgICB9IGVsc2UgewogICAgICBib2R5SGVpZ2h0ID0gdG90YWxIZWlnaHQgLSB0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQoKSAtIHRoaXMucXVlcnlNaXNjSGVpZ2h0KCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXIuc2V0SGVpZ2h0KGJvZHlIZWlnaHQpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUucXVlcnlNaXNjSGVpZ2h0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5lbC5vdXRlckhlaWdodCgpIC0gdGhpcy50aW1lR3JpZC5oZWFkU2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSAtIHRoaXMudGltZUdyaWQuYm9keVNjcm9sbGVyLmVsLm91dGVySGVpZ2h0KCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5jb21wdXRlSW5pdGlhbFNjcm9sbCA9IGZ1bmN0aW9uKHByZXZTY3JvbGxTdGF0ZSkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuY29tcHV0ZUluaXRpYWxTY3JvbGwocHJldlNjcm9sbFN0YXRlKTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLnF1ZXJ5U2Nyb2xsID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5xdWVyeVNjcm9sbCgpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUuc2V0U2Nyb2xsID0gZnVuY3Rpb24oc3RhdGUpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnNldFNjcm9sbChzdGF0ZSk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJFdmVudHMgPSBmdW5jdGlvbihldmVudHMpIHsKICAgIHRoaXMudGltZUdyaWQucmVuZGVyRXZlbnRzKGV2ZW50cyk7CiAgICByZXR1cm4gdGhpcy51cGRhdGVXaWR0aCgpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUudW5yZW5kZXJFdmVudHMgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudGltZUdyaWQudW5yZW5kZXJFdmVudHMoKTsKICAgIHJldHVybiB0aGlzLnVwZGF0ZVdpZHRoKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJEcmFnID0gZnVuY3Rpb24oZHJvcExvY2F0aW9uLCBzZWcpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlckRyYWcoZHJvcExvY2F0aW9uLCBzZWcpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUudW5yZW5kZXJEcmFnID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC51bnJlbmRlckRyYWcoKTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLmdldEV2ZW50U2VncyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0RXZlbnRTZWdzKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJTZWxlY3Rpb24gPSBmdW5jdGlvbihyYW5nZSkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQucmVuZGVyU2VsZWN0aW9uKHJhbmdlKTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLnVucmVuZGVyU2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC51bnJlbmRlclNlbGVjdGlvbigpOwogIH07CgogIHJldHVybiBUaW1lbGluZVZpZXc7Cgp9KShWaWV3KTsKCmNzc1RvU3RyID0gRkMuY3NzVG9TdHI7CgpUaW1lbGluZUdyaWQgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChUaW1lbGluZUdyaWQsIHN1cGVyQ2xhc3MpOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNsb3REYXRlcyA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc2xvdENudCA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc25hcENudCA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc25hcHNQZXJTbG90ID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zbmFwRGlmZlRvSW5kZXggPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNuYXBJbmRleFRvRGlmZiA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuaGVhZEVsID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zbGF0Q29udGFpbmVyRWwgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNsYXRFbHMgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmNvbnRhaW5lckNvb3JkQ2FjaGUgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNsYXRDb29yZENhY2hlID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zbGF0SW5uZXJDb29yZENhY2hlID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5oZWFkU2Nyb2xsZXIgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmJvZHlTY3JvbGxlciA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuam9pbmVyID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5mb2xsb3dlciA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZXZlbnRUaXRsZUZvbGxvd2VyID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5taW5UaW1lID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5tYXhUaW1lID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS50aW1lV2luZG93TXMgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNsb3REdXJhdGlvbiA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc25hcER1cmF0aW9uID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5kdXJhdGlvbiA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUubGFiZWxJbnRlcnZhbCA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuaGVhZGVyRm9ybWF0cyA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuaXNUaW1lU2NhbGUgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmxhcmdlVW5pdCA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZW1waGFzaXplV2Vla3MgPSBmYWxzZTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS50aXRsZUZvbGxvd2VyID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zZWdDb250YWluZXJFbCA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc2VnQ29udGFpbmVySGVpZ2h0ID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5iZ1NlZ0NvbnRhaW5lckVsID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5oZWxwZXJFbHMgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmlubmVyRWwgPSBudWxsOwoKICBmdW5jdGlvbiBUaW1lbGluZUdyaWQoKSB7CiAgICB2YXIgaW5wdXQ7CiAgICBUaW1lbGluZUdyaWQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB0aGlzLmluaXRTY2FsZVByb3BzKCk7CiAgICB0aGlzLm1pblRpbWUgPSBtb21lbnQuZHVyYXRpb24odGhpcy5vcHQoJ21pblRpbWUnKSB8fCAnMDA6MDAnKTsKICAgIHRoaXMubWF4VGltZSA9IG1vbWVudC5kdXJhdGlvbih0aGlzLm9wdCgnbWF4VGltZScpIHx8ICcyNDowMCcpOwogICAgdGhpcy50aW1lV2luZG93TXMgPSB0aGlzLm1heFRpbWUgLSB0aGlzLm1pblRpbWU7CiAgICB0aGlzLnNuYXBEdXJhdGlvbiA9IChpbnB1dCA9IHRoaXMub3B0KCdzbmFwRHVyYXRpb24nKSkgPyBtb21lbnQuZHVyYXRpb24oaW5wdXQpIDogdGhpcy5zbG90RHVyYXRpb247CiAgICB0aGlzLm1pblJlc2l6ZUR1cmF0aW9uID0gdGhpcy5zbmFwRHVyYXRpb247CiAgICB0aGlzLnNuYXBzUGVyU2xvdCA9IGRpdmlkZUR1cmF0aW9uQnlEdXJhdGlvbih0aGlzLnNsb3REdXJhdGlvbiwgdGhpcy5zbmFwRHVyYXRpb24pOwogICAgdGhpcy5zbG90V2lkdGggPSB0aGlzLm9wdCgnc2xvdFdpZHRoJyk7CiAgfQoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLm9wdCA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgIHJldHVybiB0aGlzLnZpZXcub3B0KG5hbWUpOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuaXNWYWxpZERhdGUgPSBmdW5jdGlvbihkYXRlKSB7CiAgICB2YXIgbXM7CiAgICBpZiAodGhpcy52aWV3LmlzSGlkZGVuRGF5KGRhdGUpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSBpZiAodGhpcy5pc1RpbWVTY2FsZSkgewogICAgICBtcyA9IGRhdGUudGltZSgpIC0gdGhpcy5taW5UaW1lOwogICAgICBtcyA9ICgobXMgJSA4NjQwMDAwMCkgKyA4NjQwMDAwMCkgJSA4NjQwMDAwMDsKICAgICAgcmV0dXJuIG1zIDwgdGhpcy50aW1lV2luZG93TXM7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmNvbXB1dGVEaXNwbGF5RXZlbnRUaW1lID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gIXRoaXMuaXNUaW1lU2NhbGU7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5jb21wdXRlRGlzcGxheUV2ZW50RW5kID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5jb21wdXRlRXZlbnRUaW1lRm9ybWF0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5vcHQoJ2V4dHJhU21hbGxUaW1lRm9ybWF0Jyk7CiAgfTsKCgogIC8qCiAgCU1ha2VzIHRoZSBnaXZlbiBkYXRlIGNvbnNpc3RlbnQgd2l0aCBpc1RpbWVTY2FsZS9sYXJnZVVuaXQsCiAgCXNvLCBlaXRoZXIgcmVtb3ZlcyB0aGUgdGltZXMsIGVuc3VyZXMgYSB0aW1lLCBvciBtYWtlcyBpdCB0aGUgc3RhcnRPZiBsYXJnZVVuaXQuCiAgCVN0cmlwcyBhbGwgdGltZXpvbmVzLiBSZXR1cm5zIG5ldyBjb3B5LgogIAlUT0RPOiBzaG91bGQgbWF5YmUgYmUgY2FsbGVkICJub3JtYWxpemVSYW5nZURhdGUiLgogICAqLwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLm5vcm1hbGl6ZUdyaWREYXRlID0gZnVuY3Rpb24oZGF0ZSkgewogICAgdmFyIG5vcm1hbERhdGU7CiAgICBpZiAodGhpcy5pc1RpbWVTY2FsZSkgewogICAgICBub3JtYWxEYXRlID0gZGF0ZS5jbG9uZSgpOwogICAgICBpZiAoIW5vcm1hbERhdGUuaGFzVGltZSgpKSB7CiAgICAgICAgbm9ybWFsRGF0ZS50aW1lKDApOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBub3JtYWxEYXRlID0gZGF0ZS5jbG9uZSgpLnN0cmlwVGltZSgpOwogICAgICBpZiAodGhpcy5sYXJnZVVuaXQpIHsKICAgICAgICBub3JtYWxEYXRlLnN0YXJ0T2YodGhpcy5sYXJnZVVuaXQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9ybWFsRGF0ZTsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLm5vcm1hbGl6ZUdyaWRSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7CiAgICB2YXIgYWRqdXN0ZWRFbmQsIG5vcm1hbFJhbmdlOwogICAgaWYgKHRoaXMuaXNUaW1lU2NhbGUpIHsKICAgICAgbm9ybWFsUmFuZ2UgPSB7CiAgICAgICAgc3RhcnQ6IHRoaXMubm9ybWFsaXplR3JpZERhdGUocmFuZ2Uuc3RhcnQpLAogICAgICAgIGVuZDogdGhpcy5ub3JtYWxpemVHcmlkRGF0ZShyYW5nZS5lbmQpCiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBub3JtYWxSYW5nZSA9IHRoaXMudmlldy5jb21wdXRlRGF5UmFuZ2UocmFuZ2UpOwogICAgICBpZiAodGhpcy5sYXJnZVVuaXQpIHsKICAgICAgICBub3JtYWxSYW5nZS5zdGFydC5zdGFydE9mKHRoaXMubGFyZ2VVbml0KTsKICAgICAgICBhZGp1c3RlZEVuZCA9IG5vcm1hbFJhbmdlLmVuZC5jbG9uZSgpLnN0YXJ0T2YodGhpcy5sYXJnZVVuaXQpOwogICAgICAgIGlmICghYWRqdXN0ZWRFbmQuaXNTYW1lKG5vcm1hbFJhbmdlLmVuZCkgfHwgIWFkanVzdGVkRW5kLmlzQWZ0ZXIobm9ybWFsUmFuZ2Uuc3RhcnQpKSB7CiAgICAgICAgICBhZGp1c3RlZEVuZC5hZGQodGhpcy5zbG90RHVyYXRpb24pOwogICAgICAgIH0KICAgICAgICBub3JtYWxSYW5nZS5lbmQgPSBhZGp1c3RlZEVuZDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vcm1hbFJhbmdlOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmFuZ2VVcGRhdGVkID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZGF0ZSwgc2xvdERhdGVzOwogICAgdGhpcy5zdGFydCA9IHRoaXMubm9ybWFsaXplR3JpZERhdGUodGhpcy5zdGFydCk7CiAgICB0aGlzLmVuZCA9IHRoaXMubm9ybWFsaXplR3JpZERhdGUodGhpcy5lbmQpOwogICAgaWYgKHRoaXMuaXNUaW1lU2NhbGUpIHsKICAgICAgdGhpcy5zdGFydC5hZGQodGhpcy5taW5UaW1lKTsKICAgICAgdGhpcy5lbmQuc3VidHJhY3QoMSwgJ2RheScpLmFkZCh0aGlzLm1heFRpbWUpOwogICAgfQogICAgc2xvdERhdGVzID0gW107CiAgICBkYXRlID0gdGhpcy5zdGFydC5jbG9uZSgpOwogICAgd2hpbGUgKGRhdGUgPCB0aGlzLmVuZCkgewogICAgICBpZiAodGhpcy5pc1ZhbGlkRGF0ZShkYXRlKSkgewogICAgICAgIHNsb3REYXRlcy5wdXNoKGRhdGUuY2xvbmUoKSk7CiAgICAgIH0KICAgICAgZGF0ZS5hZGQodGhpcy5zbG90RHVyYXRpb24pOwogICAgfQogICAgdGhpcy5zbG90RGF0ZXMgPSBzbG90RGF0ZXM7CiAgICByZXR1cm4gdGhpcy51cGRhdGVHcmlkRGF0ZXMoKTsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnVwZGF0ZUdyaWREYXRlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGRhdGUsIHNuYXBEaWZmLCBzbmFwRGlmZlRvSW5kZXgsIHNuYXBJbmRleCwgc25hcEluZGV4VG9EaWZmOwogICAgc25hcEluZGV4ID0gLTE7CiAgICBzbmFwRGlmZiA9IDA7CiAgICBzbmFwRGlmZlRvSW5kZXggPSBbXTsKICAgIHNuYXBJbmRleFRvRGlmZiA9IFtdOwogICAgZGF0ZSA9IHRoaXMuc3RhcnQuY2xvbmUoKTsKICAgIHdoaWxlIChkYXRlIDwgdGhpcy5lbmQpIHsKICAgICAgaWYgKHRoaXMuaXNWYWxpZERhdGUoZGF0ZSkpIHsKICAgICAgICBzbmFwSW5kZXgrKzsKICAgICAgICBzbmFwRGlmZlRvSW5kZXgucHVzaChzbmFwSW5kZXgpOwogICAgICAgIHNuYXBJbmRleFRvRGlmZi5wdXNoKHNuYXBEaWZmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzbmFwRGlmZlRvSW5kZXgucHVzaChzbmFwSW5kZXggKyAwLjUpOwogICAgICB9CiAgICAgIGRhdGUuYWRkKHRoaXMuc25hcER1cmF0aW9uKTsKICAgICAgc25hcERpZmYrKzsKICAgIH0KICAgIHRoaXMuc25hcERpZmZUb0luZGV4ID0gc25hcERpZmZUb0luZGV4OwogICAgdGhpcy5zbmFwSW5kZXhUb0RpZmYgPSBzbmFwSW5kZXhUb0RpZmY7CiAgICB0aGlzLnNuYXBDbnQgPSBzbmFwSW5kZXggKyAxOwogICAgcmV0dXJuIHRoaXMuc2xvdENudCA9IHRoaXMuc25hcENudCAvIHRoaXMuc25hcHNQZXJTbG90OwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc3BhblRvU2VncyA9IGZ1bmN0aW9uKHNwYW4pIHsKICAgIHZhciBub3JtYWxSYW5nZSwgc2VnOwogICAgbm9ybWFsUmFuZ2UgPSB0aGlzLm5vcm1hbGl6ZUdyaWRSYW5nZShzcGFuKTsKICAgIGlmICh0aGlzLmNvbXB1dGVEYXRlU25hcENvdmVyYWdlKHNwYW4uc3RhcnQpIDwgdGhpcy5jb21wdXRlRGF0ZVNuYXBDb3ZlcmFnZShzcGFuLmVuZCkpIHsKICAgICAgc2VnID0gaW50ZXJzZWN0UmFuZ2VzKG5vcm1hbFJhbmdlLCB0aGlzKTsKICAgICAgaWYgKHNlZykgewogICAgICAgIGlmIChzZWcuaXNTdGFydCAmJiAhdGhpcy5pc1ZhbGlkRGF0ZShzZWcuc3RhcnQpKSB7CiAgICAgICAgICBzZWcuaXNTdGFydCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoc2VnLmlzRW5kICYmIHNlZy5lbmQgJiYgIXRoaXMuaXNWYWxpZERhdGUoc2VnLmVuZC5jbG9uZSgpLnN1YnRyYWN0KDEpKSkgewogICAgICAgICAgc2VnLmlzRW5kID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiBbc2VnXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIFtdOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucHJlcGFyZUhpdHMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmJ1aWxkQ29vcmRzKCk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5xdWVyeUhpdCA9IGZ1bmN0aW9uKGxlZnRPZmZzZXQsIHRvcE9mZnNldCkgewogICAgdmFyIGNvbnRhaW5lckNvb3JkQ2FjaGUsIGxvY2FsU25hcEluZGV4LCBwYXJ0aWFsLCBzbGF0Q29vcmRDYWNoZSwgc2xhdEluZGV4LCBzbGF0TGVmdCwgc2xhdFJpZ2h0LCBzbGF0V2lkdGgsIHNuYXBJbmRleCwgc25hcExlZnQsIHNuYXBSaWdodCwgc25hcHNQZXJTbG90OwogICAgc25hcHNQZXJTbG90ID0gdGhpcy5zbmFwc1BlclNsb3Q7CiAgICBzbGF0Q29vcmRDYWNoZSA9IHRoaXMuc2xhdENvb3JkQ2FjaGU7CiAgICBjb250YWluZXJDb29yZENhY2hlID0gdGhpcy5jb250YWluZXJDb29yZENhY2hlOwogICAgaWYgKGNvbnRhaW5lckNvb3JkQ2FjaGUuaXNUb3BJbkJvdW5kcyh0b3BPZmZzZXQpKSB7CiAgICAgIHNsYXRJbmRleCA9IHNsYXRDb29yZENhY2hlLmdldEhvcml6b250YWxJbmRleChsZWZ0T2Zmc2V0KTsKICAgICAgaWYgKHNsYXRJbmRleCAhPSBudWxsKSB7CiAgICAgICAgc2xhdFdpZHRoID0gc2xhdENvb3JkQ2FjaGUuZ2V0V2lkdGgoc2xhdEluZGV4KTsKICAgICAgICBpZiAodGhpcy5pc1JUTCkgewogICAgICAgICAgc2xhdFJpZ2h0ID0gc2xhdENvb3JkQ2FjaGUuZ2V0UmlnaHRPZmZzZXQoc2xhdEluZGV4KTsKICAgICAgICAgIHBhcnRpYWwgPSAoc2xhdFJpZ2h0IC0gbGVmdE9mZnNldCkgLyBzbGF0V2lkdGg7CiAgICAgICAgICBsb2NhbFNuYXBJbmRleCA9IE1hdGguZmxvb3IocGFydGlhbCAqIHNuYXBzUGVyU2xvdCk7CiAgICAgICAgICBzbmFwSW5kZXggPSBzbGF0SW5kZXggKiBzbmFwc1BlclNsb3QgKyBsb2NhbFNuYXBJbmRleDsKICAgICAgICAgIHNuYXBSaWdodCA9IHNsYXRSaWdodCAtIChsb2NhbFNuYXBJbmRleCAvIHNuYXBzUGVyU2xvdCkgKiBzbGF0V2lkdGg7CiAgICAgICAgICBzbmFwTGVmdCA9IHNuYXBSaWdodCAtICgobG9jYWxTbmFwSW5kZXggKyAxKSAvIHNuYXBzUGVyU2xvdCkgKiBzbGF0V2lkdGg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNsYXRMZWZ0ID0gc2xhdENvb3JkQ2FjaGUuZ2V0TGVmdE9mZnNldChzbGF0SW5kZXgpOwogICAgICAgICAgcGFydGlhbCA9IChsZWZ0T2Zmc2V0IC0gc2xhdExlZnQpIC8gc2xhdFdpZHRoOwogICAgICAgICAgbG9jYWxTbmFwSW5kZXggPSBNYXRoLmZsb29yKHBhcnRpYWwgKiBzbmFwc1BlclNsb3QpOwogICAgICAgICAgc25hcEluZGV4ID0gc2xhdEluZGV4ICogc25hcHNQZXJTbG90ICsgbG9jYWxTbmFwSW5kZXg7CiAgICAgICAgICBzbmFwTGVmdCA9IHNsYXRMZWZ0ICsgKGxvY2FsU25hcEluZGV4IC8gc25hcHNQZXJTbG90KSAqIHNsYXRXaWR0aDsKICAgICAgICAgIHNuYXBSaWdodCA9IHNsYXRMZWZ0ICsgKChsb2NhbFNuYXBJbmRleCArIDEpIC8gc25hcHNQZXJTbG90KSAqIHNsYXRXaWR0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHNuYXA6IHNuYXBJbmRleCwKICAgICAgICAgIGNvbXBvbmVudDogdGhpcywKICAgICAgICAgIGxlZnQ6IHNuYXBMZWZ0LAogICAgICAgICAgcmlnaHQ6IHNuYXBSaWdodCwKICAgICAgICAgIHRvcDogY29udGFpbmVyQ29vcmRDYWNoZS5nZXRUb3BPZmZzZXQoMCksCiAgICAgICAgICBib3R0b206IGNvbnRhaW5lckNvb3JkQ2FjaGUuZ2V0Qm90dG9tT2Zmc2V0KDApCiAgICAgICAgfTsKICAgICAgfQogICAgfQogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZ2V0SGl0U3BhbiA9IGZ1bmN0aW9uKGhpdCkgewogICAgcmV0dXJuIHRoaXMuZ2V0U25hcFJhbmdlKGhpdC5zbmFwKTsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmdldEhpdEVsID0gZnVuY3Rpb24oaGl0KSB7CiAgICByZXR1cm4gdGhpcy5nZXRTbmFwRWwoaGl0LnNuYXApOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZ2V0U25hcFJhbmdlID0gZnVuY3Rpb24oc25hcEluZGV4KSB7CiAgICB2YXIgZW5kLCBzdGFydDsKICAgIHN0YXJ0ID0gdGhpcy5zdGFydC5jbG9uZSgpOwogICAgc3RhcnQuYWRkKG11bHRpcGx5RHVyYXRpb24odGhpcy5zbmFwRHVyYXRpb24sIHRoaXMuc25hcEluZGV4VG9EaWZmW3NuYXBJbmRleF0pKTsKICAgIGVuZCA9IHN0YXJ0LmNsb25lKCkuYWRkKHRoaXMuc25hcER1cmF0aW9uKTsKICAgIHJldHVybiB7CiAgICAgIHN0YXJ0OiBzdGFydCwKICAgICAgZW5kOiBlbmQKICAgIH07CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5nZXRTbmFwRWwgPSBmdW5jdGlvbihzbmFwSW5kZXgpIHsKICAgIHJldHVybiB0aGlzLnNsYXRFbHMuZXEoTWF0aC5mbG9vcihzbmFwSW5kZXggLyB0aGlzLnNuYXBzUGVyU2xvdCkpOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyU2tlbGV0b24gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuaGVhZFNjcm9sbGVyID0gbmV3IENsaXBwZWRTY3JvbGxlcih7CiAgICAgIG92ZXJmbG93WDogJ2NsaXBwZWQtc2Nyb2xsJywKICAgICAgb3ZlcmZsb3dZOiAnaGlkZGVuJwogICAgfSk7CiAgICB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMgPSBuZXcgU2Nyb2xsZXJDYW52YXMoKTsKICAgIHRoaXMuaGVhZFNjcm9sbGVyLnJlbmRlcigpOwogICAgdGhpcy5oZWFkRWwuYXBwZW5kKHRoaXMuaGVhZFNjcm9sbGVyLmVsKTsKICAgIHRoaXMuYm9keVNjcm9sbGVyID0gbmV3IENsaXBwZWRTY3JvbGxlcigpOwogICAgdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzID0gbmV3IFNjcm9sbGVyQ2FudmFzKCk7CiAgICB0aGlzLmJvZHlTY3JvbGxlci5yZW5kZXIoKTsKICAgIHRoaXMuZWwuYXBwZW5kKHRoaXMuYm9keVNjcm9sbGVyLmVsKTsKICAgIHRoaXMuaW5uZXJFbCA9IHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWw7CiAgICB0aGlzLnNsYXRDb250YWluZXJFbCA9ICQoJzxkaXYgY2xhc3M9ImZjLXNsYXRzIi8+JykuYXBwZW5kVG8odGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmJnRWwpOwogICAgdGhpcy5zZWdDb250YWluZXJFbCA9ICQoJzxkaXYgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciIvPicpLmFwcGVuZFRvKHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwpOwogICAgdGhpcy5iZ1NlZ0NvbnRhaW5lckVsID0gdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmJnRWw7CiAgICB0aGlzLmNvbnRhaW5lckNvb3JkQ2FjaGUgPSBuZXcgQ29vcmRDYWNoZSh7CiAgICAgIGVsczogdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsLAogICAgICBpc0hvcml6b250YWw6IHRydWUsCiAgICAgIGlzVmVydGljYWw6IHRydWUKICAgIH0pOwogICAgdGhpcy5qb2luZXIgPSBuZXcgU2Nyb2xsSm9pbmVyKCdob3Jpem9udGFsJywgW3RoaXMuaGVhZFNjcm9sbGVyLCB0aGlzLmJvZHlTY3JvbGxlcl0pOwogICAgaWYgKHRydWUpIHsKICAgICAgdGhpcy5mb2xsb3dlciA9IG5ldyBTY3JvbGxGb2xsb3dlcih0aGlzLmhlYWRTY3JvbGxlciwgdGhpcy52aWV3LmNhbGVuZGFyLmlzVG91Y2gpOwogICAgfQogICAgaWYgKHRydWUpIHsKICAgICAgdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIgPSBuZXcgU2Nyb2xsRm9sbG93ZXIodGhpcy5ib2R5U2Nyb2xsZXIsIHRoaXMudmlldy5jYWxlbmRhci5pc1RvdWNoKTsKICAgICAgdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIubWluVHJhdmVsID0gNTA7CiAgICAgIGlmICh0aGlzLmlzUlRMKSB7CiAgICAgICAgdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIuY29udGFpbk9uTmF0dXJhbFJpZ2h0ID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5jb250YWluT25OYXR1cmFsTGVmdCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBUaW1lbGluZUdyaWQuX19zdXBlcl9fLnJlbmRlclNrZWxldG9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5oZWFkQ29sRWxzID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zbGF0Q29sRWxzID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJEYXRlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGRhdGUsIGksIGosIGxlbiwgcmVmOwogICAgdGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbC5odG1sKHRoaXMucmVuZGVySGVhZEh0bWwoKSk7CiAgICB0aGlzLmhlYWRDb2xFbHMgPSB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuY29udGVudEVsLmZpbmQoJ2NvbCcpOwogICAgdGhpcy5zbGF0Q29udGFpbmVyRWwuaHRtbCh0aGlzLnJlbmRlclNsYXRIdG1sKCkpOwogICAgdGhpcy5zbGF0Q29sRWxzID0gdGhpcy5zbGF0Q29udGFpbmVyRWwuZmluZCgnY29sJyk7CiAgICB0aGlzLnNsYXRFbHMgPSB0aGlzLnNsYXRDb250YWluZXJFbC5maW5kKCd0ZCcpOwogICAgdGhpcy5zbGF0Q29vcmRDYWNoZSA9IG5ldyBDb29yZENhY2hlKHsKICAgICAgZWxzOiB0aGlzLnNsYXRFbHMsCiAgICAgIGlzSG9yaXpvbnRhbDogdHJ1ZQogICAgfSk7CiAgICB0aGlzLnNsYXRJbm5lckNvb3JkQ2FjaGUgPSBuZXcgQ29vcmRDYWNoZSh7CiAgICAgIGVsczogdGhpcy5zbGF0RWxzLmZpbmQoJz4gZGl2JyksCiAgICAgIGlzSG9yaXpvbnRhbDogdHJ1ZSwKICAgICAgb2Zmc2V0UGFyZW50OiB0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuZWwKICAgIH0pOwogICAgcmVmID0gdGhpcy5zbG90RGF0ZXM7CiAgICBmb3IgKGkgPSBqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaSA9ICsraikgewogICAgICBkYXRlID0gcmVmW2ldOwogICAgICB0aGlzLnZpZXcudHJpZ2dlcignZGF5UmVuZGVyJywgbnVsbCwgZGF0ZSwgdGhpcy5zbGF0RWxzLmVxKGkpKTsKICAgIH0KICAgIGlmICh0aGlzLmZvbGxvd2VyKSB7CiAgICAgIHJldHVybiB0aGlzLmZvbGxvd2VyLnNldFNwcml0ZXModGhpcy5oZWFkRWwuZmluZCgndHI6bm90KDpsYXN0LWNoaWxkKSBzcGFuJykpOwogICAgfQogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUudW5yZW5kZXJEYXRlcyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuZm9sbG93ZXIpIHsKICAgICAgdGhpcy5mb2xsb3dlci5jbGVhclNwcml0ZXMoKTsKICAgIH0KICAgIHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuZW1wdHkoKTsKICAgIHRoaXMuc2xhdENvbnRhaW5lckVsLmVtcHR5KCk7CiAgICB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuY2xlYXJXaWR0aCgpOwogICAgcmV0dXJuIHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jbGVhcldpZHRoKCk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJIZWFkSHRtbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNlbGwsIGNlbGxSb3dzLCBkYXRlLCBkYXRlRGF0YSwgZm9ybWF0LCBmb3JtYXRzLCBodG1sLCBpLCBpc0Nocm9ubywgaXNMYXN0LCBpc1N1cGVyUm93LCBpc1dlZWtTdGFydCwgaiwgaywgbCwgbGFiZWxJbnRlcnZhbCwgbGVhZGluZ0NlbGwsIGxlbiwgbGVuMSwgbGVuMiwgbGVuMywgbGVuNCwgbGVuNSwgbGVuNiwgbSwgbiwgbmV3Q2VsbCwgcCwgcHJldldlZWtOdW1iZXIsIHEsIHJvdywgcm93Q2VsbHMsIHNsYXRIdG1sLCBzbG90Q2VsbHMsIHNsb3REYXRlcywgdGV4dCwgd2Vla051bWJlcjsKICAgIGxhYmVsSW50ZXJ2YWwgPSB0aGlzLmxhYmVsSW50ZXJ2YWw7CiAgICBmb3JtYXRzID0gdGhpcy5oZWFkZXJGb3JtYXRzOwogICAgY2VsbFJvd3MgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBqLCBsZW4sIHJlc3VsdHM7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gZm9ybWF0cy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICAgIGZvcm1hdCA9IGZvcm1hdHNbal07CiAgICAgICAgcmVzdWx0cy5wdXNoKFtdKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pKCk7CiAgICBsZWFkaW5nQ2VsbCA9IG51bGw7CiAgICBwcmV2V2Vla051bWJlciA9IG51bGw7CiAgICBzbG90RGF0ZXMgPSB0aGlzLnNsb3REYXRlczsKICAgIHNsb3RDZWxscyA9IFtdOwogICAgZm9yIChqID0gMCwgbGVuID0gc2xvdERhdGVzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGRhdGUgPSBzbG90RGF0ZXNbal07CiAgICAgIHdlZWtOdW1iZXIgPSBkYXRlLndlZWsoKTsKICAgICAgaXNXZWVrU3RhcnQgPSB0aGlzLmVtcGhhc2l6ZVdlZWtzICYmIHByZXZXZWVrTnVtYmVyICE9PSBudWxsICYmIHByZXZXZWVrTnVtYmVyICE9PSB3ZWVrTnVtYmVyOwogICAgICBmb3IgKHJvdyA9IGsgPSAwLCBsZW4xID0gZm9ybWF0cy5sZW5ndGg7IGsgPCBsZW4xOyByb3cgPSArK2spIHsKICAgICAgICBmb3JtYXQgPSBmb3JtYXRzW3Jvd107CiAgICAgICAgcm93Q2VsbHMgPSBjZWxsUm93c1tyb3ddOwogICAgICAgIGxlYWRpbmdDZWxsID0gcm93Q2VsbHNbcm93Q2VsbHMubGVuZ3RoIC0gMV07CiAgICAgICAgaXNTdXBlclJvdyA9IGZvcm1hdHMubGVuZ3RoID4gMSAmJiByb3cgPCBmb3JtYXRzLmxlbmd0aCAtIDE7CiAgICAgICAgbmV3Q2VsbCA9IG51bGw7CiAgICAgICAgaWYgKGlzU3VwZXJSb3cpIHsKICAgICAgICAgIHRleHQgPSBkYXRlLmZvcm1hdChmb3JtYXQpOwogICAgICAgICAgZGF0ZURhdGEgPSBkYXRlLmZvcm1hdCgpOwogICAgICAgICAgaWYgKCFsZWFkaW5nQ2VsbCB8fCBsZWFkaW5nQ2VsbC50ZXh0ICE9PSB0ZXh0KSB7CiAgICAgICAgICAgIG5ld0NlbGwgPSB7CiAgICAgICAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICAgICAgICBkYXRlRGF0YTogZGF0ZURhdGEsCiAgICAgICAgICAgICAgY29sc3BhbjogMQogICAgICAgICAgICB9OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGVhZGluZ0NlbGwuY29sc3BhbiArPSAxOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIWxlYWRpbmdDZWxsIHx8IGlzSW50KGRpdmlkZVJhbmdlQnlEdXJhdGlvbih0aGlzLnN0YXJ0LCBkYXRlLCBsYWJlbEludGVydmFsKSkpIHsKICAgICAgICAgICAgdGV4dCA9IGRhdGUuZm9ybWF0KGZvcm1hdCk7CiAgICAgICAgICAgIGRhdGVEYXRhID0gZGF0ZS5mb3JtYXQoKTsKICAgICAgICAgICAgbmV3Q2VsbCA9IHsKICAgICAgICAgICAgICB0ZXh0OiB0ZXh0LAogICAgICAgICAgICAgIGRhdGVEYXRhOiBkYXRlRGF0YSwKICAgICAgICAgICAgICBjb2xzcGFuOiAxCiAgICAgICAgICAgIH07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZWFkaW5nQ2VsbC5jb2xzcGFuICs9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChuZXdDZWxsKSB7CiAgICAgICAgICBuZXdDZWxsLndlZWtTdGFydCA9IGlzV2Vla1N0YXJ0OwogICAgICAgICAgcm93Q2VsbHMucHVzaChuZXdDZWxsKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc2xvdENlbGxzLnB1c2goewogICAgICAgIHdlZWtTdGFydDogaXNXZWVrU3RhcnQKICAgICAgfSk7CiAgICAgIHByZXZXZWVrTnVtYmVyID0gd2Vla051bWJlcjsKICAgIH0KICAgIGlzQ2hyb25vID0gbGFiZWxJbnRlcnZhbCA+IHRoaXMuc2xvdER1cmF0aW9uOwogICAgaHRtbCA9ICc8dGFibGU+JzsKICAgIGh0bWwgKz0gJzxjb2xncm91cD4nOwogICAgZm9yIChsID0gMCwgbGVuMiA9IHNsb3REYXRlcy5sZW5ndGg7IGwgPCBsZW4yOyBsKyspIHsKICAgICAgZGF0ZSA9IHNsb3REYXRlc1tsXTsKICAgICAgaHRtbCArPSAnPGNvbC8+JzsKICAgIH0KICAgIGh0bWwgKz0gJzwvY29sZ3JvdXA+JzsKICAgIGh0bWwgKz0gJzx0Ym9keT4nOwogICAgZm9yIChpID0gbSA9IDAsIGxlbjMgPSBjZWxsUm93cy5sZW5ndGg7IG0gPCBsZW4zOyBpID0gKyttKSB7CiAgICAgIHJvd0NlbGxzID0gY2VsbFJvd3NbaV07CiAgICAgIGlzTGFzdCA9IGkgPT09IGNlbGxSb3dzLmxlbmd0aCAtIDE7CiAgICAgIGh0bWwgKz0gJzx0cicgKyAoaXNDaHJvbm8gJiYgaXNMYXN0ID8gJyBjbGFzcz0iZmMtY2hyb25vIicgOiAnJykgKyAnPic7CiAgICAgIGZvciAobiA9IDAsIGxlbjQgPSByb3dDZWxscy5sZW5ndGg7IG4gPCBsZW40OyBuKyspIHsKICAgICAgICBjZWxsID0gcm93Q2VsbHNbbl07CiAgICAgICAgaHRtbCArPSAnPHRoIGNsYXNzPSInICsgdGhpcy52aWV3LndpZGdldEhlYWRlckNsYXNzICsgJyAnICsgKGNlbGwud2Vla1N0YXJ0ID8gJ2ZjLWVtLWNlbGwnIDogJycpICsgJyInICsgJyBkYXRhLWRhdGU9IicgKyBjZWxsLmRhdGVEYXRhICsgJyInICsgKGNlbGwuY29sc3BhbiA+IDEgPyAnIGNvbHNwYW49IicgKyBjZWxsLmNvbHNwYW4gKyAnIicgOiAnJykgKyAnPicgKyAnPGRpdiBjbGFzcz0iZmMtY2VsbC1jb250ZW50Ij4nICsgJzxzcGFuIGNsYXNzPSJmYy1jZWxsLXRleHQiPicgKyBodG1sRXNjYXBlKGNlbGwudGV4dCkgKyAnPC9zcGFuPicgKyAnPC9kaXY+JyArICc8L3RoPic7CiAgICAgIH0KICAgICAgaHRtbCArPSAnPC90cj4nOwogICAgfQogICAgaHRtbCArPSAnPC90Ym9keT48L3RhYmxlPic7CiAgICBzbGF0SHRtbCA9ICc8dGFibGU+JzsKICAgIHNsYXRIdG1sICs9ICc8Y29sZ3JvdXA+JzsKICAgIGZvciAocCA9IDAsIGxlbjUgPSBzbG90Q2VsbHMubGVuZ3RoOyBwIDwgbGVuNTsgcCsrKSB7CiAgICAgIGNlbGwgPSBzbG90Q2VsbHNbcF07CiAgICAgIHNsYXRIdG1sICs9ICc8Y29sLz4nOwogICAgfQogICAgc2xhdEh0bWwgKz0gJzwvY29sZ3JvdXA+JzsKICAgIHNsYXRIdG1sICs9ICc8dGJvZHk+PHRyPic7CiAgICBmb3IgKGkgPSBxID0gMCwgbGVuNiA9IHNsb3RDZWxscy5sZW5ndGg7IHEgPCBsZW42OyBpID0gKytxKSB7CiAgICAgIGNlbGwgPSBzbG90Q2VsbHNbaV07CiAgICAgIGRhdGUgPSBzbG90RGF0ZXNbaV07CiAgICAgIHNsYXRIdG1sICs9IHRoaXMuc2xhdENlbGxIdG1sKGRhdGUsIGNlbGwud2Vla1N0YXJ0KTsKICAgIH0KICAgIHNsYXRIdG1sICs9ICc8L3RyPjwvdGJvZHk+PC90YWJsZT4nOwogICAgdGhpcy5fc2xhdEh0bWwgPSBzbGF0SHRtbDsKICAgIHJldHVybiBodG1sOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyU2xhdEh0bWwgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLl9zbGF0SHRtbDsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNsYXRDZWxsSHRtbCA9IGZ1bmN0aW9uKGRhdGUsIGlzRW0pIHsKICAgIHZhciBjbGFzc2VzOwogICAgaWYgKHRoaXMuaXNUaW1lU2NhbGUpIHsKICAgICAgY2xhc3NlcyA9IFtdOwogICAgICBjbGFzc2VzLnB1c2goaXNJbnQoZGl2aWRlUmFuZ2VCeUR1cmF0aW9uKHRoaXMuc3RhcnQsIGRhdGUsIHRoaXMubGFiZWxJbnRlcnZhbCkpID8gJ2ZjLW1ham9yJyA6ICdmYy1taW5vcicpOwogICAgfSBlbHNlIHsKICAgICAgY2xhc3NlcyA9IHRoaXMuZ2V0RGF5Q2xhc3NlcyhkYXRlKTsKICAgICAgY2xhc3Nlcy5wdXNoKCdmYy1kYXknKTsKICAgIH0KICAgIGNsYXNzZXMudW5zaGlmdCh0aGlzLnZpZXcud2lkZ2V0Q29udGVudENsYXNzKTsKICAgIGlmIChpc0VtKSB7CiAgICAgIGNsYXNzZXMucHVzaCgnZmMtZW0tY2VsbCcpOwogICAgfQogICAgcmV0dXJuICc8dGQgY2xhc3M9IicgKyBjbGFzc2VzLmpvaW4oJyAnKSArICciJyArICcgZGF0YS1kYXRlPSInICsgZGF0ZS5mb3JtYXQoKSArICciJyArICc+PGRpdiAvPjwvdGQ+JzsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmJ1c2luZXNzSG91clNlZ3MgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnJlbmRlckJ1c2luZXNzSG91cnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBzZWdzOwogICAgaWYgKCF0aGlzLmxhcmdlVW5pdCkgewogICAgICBzZWdzID0gdGhpcy5idXNpbmVzc0hvdXJTZWdzID0gdGhpcy5idWlsZEJ1c2luZXNzSG91clNlZ3MoIXRoaXMuaXNUaW1lU2NhbGUpOwogICAgICByZXR1cm4gdGhpcy5yZW5kZXJGaWxsKCdidXNpbmVzc0hvdXJzJywgc2VncywgJ2JnZXZlbnQnKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnVucmVuZGVyQnVzaW5lc3NIb3VycyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudW5yZW5kZXJGaWxsKCdidXNpbmVzc0hvdXJzJyk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5ub3dJbmRpY2F0b3JFbHMgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmdldE5vd0luZGljYXRvclVuaXQgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmlzVGltZVNjYWxlKSB7CiAgICAgIHJldHVybiBjb21wdXRlSW50ZXJ2YWxVbml0KHRoaXMuc2xvdER1cmF0aW9uKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnJlbmRlck5vd0luZGljYXRvciA9IGZ1bmN0aW9uKGRhdGUpIHsKICAgIHZhciBjb29yZCwgY3NzLCBub2RlczsKICAgIG5vZGVzID0gW107CiAgICBkYXRlID0gdGhpcy5ub3JtYWxpemVHcmlkRGF0ZShkYXRlKTsKICAgIGlmIChkYXRlID49IHRoaXMuc3RhcnQgJiYgZGF0ZSA8IHRoaXMuZW5kKSB7CiAgICAgIGNvb3JkID0gdGhpcy5kYXRlVG9Db29yZChkYXRlKTsKICAgICAgY3NzID0gdGhpcy5pc1JUTCA/IHsKICAgICAgICByaWdodDogLWNvb3JkCiAgICAgIH0gOiB7CiAgICAgICAgbGVmdDogY29vcmQKICAgICAgfTsKICAgICAgbm9kZXMucHVzaCgkKCI8ZGl2IGNsYXNzPSdmYy1ub3ctaW5kaWNhdG9yIGZjLW5vdy1pbmRpY2F0b3ItYXJyb3cnPjwvZGl2PiIpLmNzcyhjc3MpLmFwcGVuZFRvKHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5lbClbMF0pOwogICAgICBub2Rlcy5wdXNoKCQoIjxkaXYgY2xhc3M9J2ZjLW5vdy1pbmRpY2F0b3IgZmMtbm93LWluZGljYXRvci1saW5lJz48L2Rpdj4iKS5jc3MoY3NzKS5hcHBlbmRUbyh0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuZWwpWzBdKTsKICAgIH0KICAgIHJldHVybiB0aGlzLm5vd0luZGljYXRvckVscyA9ICQobm9kZXMpOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUudW5yZW5kZXJOb3dJbmRpY2F0b3IgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLm5vd0luZGljYXRvckVscykgewogICAgICB0aGlzLm5vd0luZGljYXRvckVscy5yZW1vdmUoKTsKICAgICAgcmV0dXJuIHRoaXMubm93SW5kaWNhdG9yRWxzID0gbnVsbDsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmV4cGxpY2l0U2xvdFdpZHRoID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5kZWZhdWx0U2xvdFdpZHRoID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS51cGRhdGVXaWR0aCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGF2YWlsYWJsZVdpZHRoLCBjb250YWluZXJNaW5XaWR0aCwgY29udGFpbmVyV2lkdGgsIG5vbkxhc3RTbG90V2lkdGgsIHNsb3RXaWR0aDsKICAgIHNsb3RXaWR0aCA9IE1hdGgucm91bmQodGhpcy5zbG90V2lkdGggfHwgKHRoaXMuc2xvdFdpZHRoID0gdGhpcy5jb21wdXRlU2xvdFdpZHRoKCkpKTsKICAgIGNvbnRhaW5lcldpZHRoID0gc2xvdFdpZHRoICogdGhpcy5zbG90RGF0ZXMubGVuZ3RoOwogICAgY29udGFpbmVyTWluV2lkdGggPSAnJzsKICAgIG5vbkxhc3RTbG90V2lkdGggPSBzbG90V2lkdGg7CiAgICBhdmFpbGFibGVXaWR0aCA9IHRoaXMuYm9keVNjcm9sbGVyLmdldENsaWVudFdpZHRoKCk7CiAgICBpZiAoYXZhaWxhYmxlV2lkdGggPiBjb250YWluZXJXaWR0aCkgewogICAgICBjb250YWluZXJNaW5XaWR0aCA9IGF2YWlsYWJsZVdpZHRoOwogICAgICBjb250YWluZXJXaWR0aCA9ICcnOwogICAgICBub25MYXN0U2xvdFdpZHRoID0gTWF0aC5mbG9vcihhdmFpbGFibGVXaWR0aCAvIHRoaXMuc2xvdERhdGVzLmxlbmd0aCk7CiAgICB9CiAgICB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuc2V0V2lkdGgoY29udGFpbmVyV2lkdGgpOwogICAgdGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLnNldE1pbldpZHRoKGNvbnRhaW5lck1pbldpZHRoKTsKICAgIHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5zZXRXaWR0aChjb250YWluZXJXaWR0aCk7CiAgICB0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuc2V0TWluV2lkdGgoY29udGFpbmVyTWluV2lkdGgpOwogICAgdGhpcy5oZWFkQ29sRWxzLnNsaWNlKDAsIC0xKS5hZGQodGhpcy5zbGF0Q29sRWxzLnNsaWNlKDAsIC0xKSkud2lkdGgobm9uTGFzdFNsb3RXaWR0aCk7CiAgICB0aGlzLmhlYWRTY3JvbGxlci51cGRhdGVTaXplKCk7CiAgICB0aGlzLmJvZHlTY3JvbGxlci51cGRhdGVTaXplKCk7CiAgICB0aGlzLmpvaW5lci51cGRhdGUoKTsKICAgIHRoaXMuYnVpbGRDb29yZHMoKTsKICAgIHRoaXMudXBkYXRlU2VnUG9zaXRpb25zKCk7CiAgICB0aGlzLnZpZXcudXBkYXRlTm93SW5kaWNhdG9yKCk7CiAgICBpZiAodGhpcy5mb2xsb3dlcikgewogICAgICB0aGlzLmZvbGxvd2VyLnVwZGF0ZSgpOwogICAgfQogICAgaWYgKHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci51cGRhdGUoKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmNvbXB1dGVTbG90V2lkdGggPSBmdW5jdGlvbigpIHsKICAgIHZhciBoZWFkZXJXaWR0aCwgaW5uZXJFbHMsIG1heElubmVyV2lkdGgsIG1pbldpZHRoLCBzbG90V2lkdGgsIHNsb3RzUGVyTGFiZWw7CiAgICBtYXhJbm5lcldpZHRoID0gMDsKICAgIGlubmVyRWxzID0gdGhpcy5oZWFkRWwuZmluZCgndHI6bGFzdC1jaGlsZCB0aCBzcGFuJyk7CiAgICBpbm5lckVscy5lYWNoKGZ1bmN0aW9uKGksIG5vZGUpIHsKICAgICAgdmFyIGlubmVyV2lkdGg7CiAgICAgIGlubmVyV2lkdGggPSAkKG5vZGUpLm91dGVyV2lkdGgoKTsKICAgICAgcmV0dXJuIG1heElubmVyV2lkdGggPSBNYXRoLm1heChtYXhJbm5lcldpZHRoLCBpbm5lcldpZHRoKTsKICAgIH0pOwogICAgaGVhZGVyV2lkdGggPSBtYXhJbm5lcldpZHRoICsgMTsKICAgIHNsb3RzUGVyTGFiZWwgPSBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24odGhpcy5sYWJlbEludGVydmFsLCB0aGlzLnNsb3REdXJhdGlvbik7CiAgICBzbG90V2lkdGggPSBNYXRoLmNlaWwoaGVhZGVyV2lkdGggLyBzbG90c1BlckxhYmVsKTsKICAgIG1pbldpZHRoID0gdGhpcy5oZWFkQ29sRWxzLmVxKDApLmNzcygnbWluLXdpZHRoJyk7CiAgICBpZiAobWluV2lkdGgpIHsKICAgICAgbWluV2lkdGggPSBwYXJzZUludChtaW5XaWR0aCwgMTApOwogICAgICBpZiAobWluV2lkdGgpIHsKICAgICAgICBzbG90V2lkdGggPSBNYXRoLm1heChzbG90V2lkdGgsIG1pbldpZHRoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNsb3RXaWR0aDsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmJ1aWxkQ29vcmRzID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNvbnRhaW5lckNvb3JkQ2FjaGUuYnVpbGQoKTsKICAgIHRoaXMuc2xhdENvb3JkQ2FjaGUuYnVpbGQoKTsKICAgIHJldHVybiB0aGlzLnNsYXRJbm5lckNvb3JkQ2FjaGUuYnVpbGQoKTsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmNvbXB1dGVEYXRlU25hcENvdmVyYWdlID0gZnVuY3Rpb24oZGF0ZSkgewogICAgdmFyIHNuYXBDb3ZlcmFnZSwgc25hcERpZmYsIHNuYXBEaWZmSW50OwogICAgc25hcERpZmYgPSBkaXZpZGVSYW5nZUJ5RHVyYXRpb24odGhpcy5zdGFydCwgZGF0ZSwgdGhpcy5zbmFwRHVyYXRpb24pOwogICAgaWYgKHNuYXBEaWZmIDwgMCkgewogICAgICByZXR1cm4gMDsKICAgIH0gZWxzZSBpZiAoc25hcERpZmYgPj0gdGhpcy5zbmFwRGlmZlRvSW5kZXgubGVuZ3RoKSB7CiAgICAgIHJldHVybiB0aGlzLnNuYXBDbnQ7CiAgICB9IGVsc2UgewogICAgICBzbmFwRGlmZkludCA9IE1hdGguZmxvb3Ioc25hcERpZmYpOwogICAgICBzbmFwQ292ZXJhZ2UgPSB0aGlzLnNuYXBEaWZmVG9JbmRleFtzbmFwRGlmZkludF07CiAgICAgIGlmIChpc0ludChzbmFwQ292ZXJhZ2UpKSB7CiAgICAgICAgc25hcENvdmVyYWdlICs9IHNuYXBEaWZmIC0gc25hcERpZmZJbnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc25hcENvdmVyYWdlID0gTWF0aC5jZWlsKHNuYXBDb3ZlcmFnZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHNuYXBDb3ZlcmFnZTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmRhdGVUb0Nvb3JkID0gZnVuY3Rpb24oZGF0ZSkgewogICAgdmFyIGNvb3JkQ2FjaGUsIHBhcnRpYWwsIHNsb3RDb3ZlcmFnZSwgc2xvdEluZGV4LCBzbmFwQ292ZXJhZ2U7CiAgICBzbmFwQ292ZXJhZ2UgPSB0aGlzLmNvbXB1dGVEYXRlU25hcENvdmVyYWdlKGRhdGUpOwogICAgc2xvdENvdmVyYWdlID0gc25hcENvdmVyYWdlIC8gdGhpcy5zbmFwc1BlclNsb3Q7CiAgICBzbG90SW5kZXggPSBNYXRoLmZsb29yKHNsb3RDb3ZlcmFnZSk7CiAgICBzbG90SW5kZXggPSBNYXRoLm1pbihzbG90SW5kZXgsIHRoaXMuc2xvdENudCAtIDEpOwogICAgcGFydGlhbCA9IHNsb3RDb3ZlcmFnZSAtIHNsb3RJbmRleDsKICAgIGNvb3JkQ2FjaGUgPSB0aGlzLnNsYXRJbm5lckNvb3JkQ2FjaGU7CiAgICBpZiAodGhpcy5pc1JUTCkgewogICAgICByZXR1cm4gKGNvb3JkQ2FjaGUuZ2V0UmlnaHRQb3NpdGlvbihzbG90SW5kZXgpIC0gY29vcmRDYWNoZS5nZXRXaWR0aChzbG90SW5kZXgpICogcGFydGlhbCkgLSB0aGlzLmNvbnRhaW5lckNvb3JkQ2FjaGUuZ2V0V2lkdGgoMCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gY29vcmRDYWNoZS5nZXRMZWZ0UG9zaXRpb24oc2xvdEluZGV4KSArIGNvb3JkQ2FjaGUuZ2V0V2lkdGgoc2xvdEluZGV4KSAqIHBhcnRpYWw7CiAgICB9CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yYW5nZVRvQ29vcmRzID0gZnVuY3Rpb24ocmFuZ2UpIHsKICAgIGlmICh0aGlzLmlzUlRMKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgcmlnaHQ6IHRoaXMuZGF0ZVRvQ29vcmQocmFuZ2Uuc3RhcnQpLAogICAgICAgIGxlZnQ6IHRoaXMuZGF0ZVRvQ29vcmQocmFuZ2UuZW5kKQogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBsZWZ0OiB0aGlzLmRhdGVUb0Nvb3JkKHJhbmdlLnN0YXJ0KSwKICAgICAgICByaWdodDogdGhpcy5kYXRlVG9Db29yZChyYW5nZS5lbmQpCiAgICAgIH07CiAgICB9CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5oZWFkSGVpZ2h0ID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgdGFibGU7CiAgICB0YWJsZSA9IHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuZmluZCgndGFibGUnKTsKICAgIHJldHVybiB0YWJsZS5oZWlnaHQuYXBwbHkodGFibGUsIGFyZ3VtZW50cyk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS51cGRhdGVTZWdQb3NpdGlvbnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjb29yZHMsIGosIGxlbiwgc2VnLCBzZWdzOwogICAgc2VncyA9ICh0aGlzLnNlZ3MgfHwgW10pLmNvbmNhdCh0aGlzLmJ1c2luZXNzSG91clNlZ3MgfHwgW10pOwogICAgZm9yIChqID0gMCwgbGVuID0gc2Vncy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBzZWcgPSBzZWdzW2pdOwogICAgICBjb29yZHMgPSB0aGlzLnJhbmdlVG9Db29yZHMoc2VnKTsKICAgICAgc2VnLmVsLmNzcyh7CiAgICAgICAgbGVmdDogKHNlZy5sZWZ0ID0gY29vcmRzLmxlZnQpLAogICAgICAgIHJpZ2h0OiAtKHNlZy5yaWdodCA9IGNvb3Jkcy5yaWdodCkKICAgICAgfSk7CiAgICB9CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5jb21wdXRlSW5pdGlhbFNjcm9sbCA9IGZ1bmN0aW9uKHByZXZTdGF0ZSkgewogICAgdmFyIGxlZnQsIHNjcm9sbFRpbWU7CiAgICBsZWZ0ID0gMDsKICAgIGlmICh0aGlzLmlzVGltZVNjYWxlKSB7CiAgICAgIHNjcm9sbFRpbWUgPSB0aGlzLm9wdCgnc2Nyb2xsVGltZScpOwogICAgICBpZiAoc2Nyb2xsVGltZSkgewogICAgICAgIHNjcm9sbFRpbWUgPSBtb21lbnQuZHVyYXRpb24oc2Nyb2xsVGltZSk7CiAgICAgICAgbGVmdCA9IHRoaXMuZGF0ZVRvQ29vcmQodGhpcy5zdGFydC5jbG9uZSgpLnRpbWUoc2Nyb2xsVGltZSkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gewogICAgICBsZWZ0OiBsZWZ0LAogICAgICB0b3A6IDAKICAgIH07CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5xdWVyeVNjcm9sbCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHsKICAgICAgbGVmdDogdGhpcy5ib2R5U2Nyb2xsZXIuZ2V0U2Nyb2xsTGVmdCgpLAogICAgICB0b3A6IHRoaXMuYm9keVNjcm9sbGVyLmdldFNjcm9sbFRvcCgpCiAgICB9OwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc2V0U2Nyb2xsID0gZnVuY3Rpb24oc3RhdGUpIHsKICAgIHRoaXMuaGVhZFNjcm9sbGVyLnNldFNjcm9sbExlZnQoc3RhdGUubGVmdCk7CiAgICB0aGlzLmhlYWRTY3JvbGxlci5zZXRTY3JvbGxMZWZ0KHN0YXRlLmxlZnQpOwogICAgcmV0dXJuIHRoaXMuYm9keVNjcm9sbGVyLnNldFNjcm9sbFRvcChzdGF0ZS50b3ApOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyRmdTZWdzID0gZnVuY3Rpb24oc2VncykgewogICAgc2VncyA9IHRoaXMucmVuZGVyRmdTZWdFbHMoc2Vncyk7CiAgICB0aGlzLnJlbmRlckZnU2Vnc0luQ29udGFpbmVycyhbW3RoaXMsIHNlZ3NdXSk7CiAgICB0aGlzLnVwZGF0ZVNlZ0ZvbGxvd2VycyhzZWdzKTsKICAgIHJldHVybiBzZWdzOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUudW5yZW5kZXJGZ1NlZ3MgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuY2xlYXJTZWdGb2xsb3dlcnMoKTsKICAgIHJldHVybiB0aGlzLnVucmVuZGVyRmdDb250YWluZXJzKFt0aGlzXSk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJGZ1NlZ3NJbkNvbnRhaW5lcnMgPSBmdW5jdGlvbihwYWlycykgewogICAgdmFyIGNvbnRhaW5lciwgY29vcmRzLCBqLCBrLCBsLCBsZW4sIGxlbjEsIGxlbjIsIGxlbjMsIGxlbjQsIGxlbjUsIGxlbjYsIGxlbjcsIG0sIG4sIHAsIHEsIHIsIHJlZiwgcmVmMSwgcmVmMiwgcmVmMywgcmVzdWx0cywgc2VnLCBzZWdzOwogICAgZm9yIChqID0gMCwgbGVuID0gcGFpcnMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcmVmID0gcGFpcnNbal0sIGNvbnRhaW5lciA9IHJlZlswXSwgc2VncyA9IHJlZlsxXTsKICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHNlZ3MubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7CiAgICAgICAgc2VnID0gc2Vnc1trXTsKICAgICAgICBjb29yZHMgPSB0aGlzLnJhbmdlVG9Db29yZHMoc2VnKTsKICAgICAgICBzZWcuZWwuY3NzKHsKICAgICAgICAgIGxlZnQ6IChzZWcubGVmdCA9IGNvb3Jkcy5sZWZ0KSwKICAgICAgICAgIHJpZ2h0OiAtKHNlZy5yaWdodCA9IGNvb3Jkcy5yaWdodCkKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgZm9yIChsID0gMCwgbGVuMiA9IHBhaXJzLmxlbmd0aDsgbCA8IGxlbjI7IGwrKykgewogICAgICByZWYxID0gcGFpcnNbbF0sIGNvbnRhaW5lciA9IHJlZjFbMF0sIHNlZ3MgPSByZWYxWzFdOwogICAgICBmb3IgKG0gPSAwLCBsZW4zID0gc2Vncy5sZW5ndGg7IG0gPCBsZW4zOyBtKyspIHsKICAgICAgICBzZWcgPSBzZWdzW21dOwogICAgICAgIHNlZy5lbC5hcHBlbmRUbyhjb250YWluZXIuc2VnQ29udGFpbmVyRWwpOwogICAgICB9CiAgICB9CiAgICBmb3IgKG4gPSAwLCBsZW40ID0gcGFpcnMubGVuZ3RoOyBuIDwgbGVuNDsgbisrKSB7CiAgICAgIHJlZjIgPSBwYWlyc1tuXSwgY29udGFpbmVyID0gcmVmMlswXSwgc2VncyA9IHJlZjJbMV07CiAgICAgIGZvciAocCA9IDAsIGxlbjUgPSBzZWdzLmxlbmd0aDsgcCA8IGxlbjU7IHArKykgewogICAgICAgIHNlZyA9IHNlZ3NbcF07CiAgICAgICAgc2VnLmhlaWdodCA9IHNlZy5lbC5vdXRlckhlaWdodCh0cnVlKTsKICAgICAgfQogICAgICB0aGlzLmJ1aWxkU2VnTGV2ZWxzKHNlZ3MpOwogICAgICBjb250YWluZXIuc2VnQ29udGFpbmVySGVpZ2h0ID0gY29tcHV0ZU9mZnNldEZvclNlZ3Moc2Vncyk7CiAgICB9CiAgICByZXN1bHRzID0gW107CiAgICBmb3IgKHEgPSAwLCBsZW42ID0gcGFpcnMubGVuZ3RoOyBxIDwgbGVuNjsgcSsrKSB7CiAgICAgIHJlZjMgPSBwYWlyc1txXSwgY29udGFpbmVyID0gcmVmM1swXSwgc2VncyA9IHJlZjNbMV07CiAgICAgIGZvciAociA9IDAsIGxlbjcgPSBzZWdzLmxlbmd0aDsgciA8IGxlbjc7IHIrKykgewogICAgICAgIHNlZyA9IHNlZ3Nbcl07CiAgICAgICAgc2VnLmVsLmNzcygndG9wJywgc2VnLnRvcCk7CiAgICAgIH0KICAgICAgcmVzdWx0cy5wdXNoKGNvbnRhaW5lci5zZWdDb250YWluZXJFbC5oZWlnaHQoY29udGFpbmVyLnNlZ0NvbnRhaW5lckhlaWdodCkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5idWlsZFNlZ0xldmVscyA9IGZ1bmN0aW9uKHNlZ3MpIHsKICAgIHZhciBiZWxvd1NlZywgaXNMZXZlbENvbGxpc2lvbiwgaiwgaywgbCwgbGVuLCBsZW4xLCBsZW4yLCBsZXZlbCwgcGxhY2VkU2VnLCByZWYsIHJlZjEsIHNlZ0xldmVscywgdW5wbGFjZWRTZWc7CiAgICBzZWdMZXZlbHMgPSBbXTsKICAgIHRoaXMuc29ydEV2ZW50U2VncyhzZWdzKTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHNlZ3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgdW5wbGFjZWRTZWcgPSBzZWdzW2pdOwogICAgICB1bnBsYWNlZFNlZy5hYm92ZSA9IFtdOwogICAgICBsZXZlbCA9IDA7CiAgICAgIHdoaWxlIChsZXZlbCA8IHNlZ0xldmVscy5sZW5ndGgpIHsKICAgICAgICBpc0xldmVsQ29sbGlzaW9uID0gZmFsc2U7CiAgICAgICAgcmVmID0gc2VnTGV2ZWxzW2xldmVsXTsKICAgICAgICBmb3IgKGsgPSAwLCBsZW4xID0gcmVmLmxlbmd0aDsgayA8IGxlbjE7IGsrKykgewogICAgICAgICAgcGxhY2VkU2VnID0gcmVmW2tdOwogICAgICAgICAgaWYgKHRpbWVSb3dTZWdzQ29sbGlkZSh1bnBsYWNlZFNlZywgcGxhY2VkU2VnKSkgewogICAgICAgICAgICB1bnBsYWNlZFNlZy5hYm92ZS5wdXNoKHBsYWNlZFNlZyk7CiAgICAgICAgICAgIGlzTGV2ZWxDb2xsaXNpb24gPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaXNMZXZlbENvbGxpc2lvbikgewogICAgICAgICAgbGV2ZWwgKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIChzZWdMZXZlbHNbbGV2ZWxdIHx8IChzZWdMZXZlbHNbbGV2ZWxdID0gW10pKS5wdXNoKHVucGxhY2VkU2VnKTsKICAgICAgbGV2ZWwgKz0gMTsKICAgICAgd2hpbGUgKGxldmVsIDwgc2VnTGV2ZWxzLmxlbmd0aCkgewogICAgICAgIHJlZjEgPSBzZWdMZXZlbHNbbGV2ZWxdOwogICAgICAgIGZvciAobCA9IDAsIGxlbjIgPSByZWYxLmxlbmd0aDsgbCA8IGxlbjI7IGwrKykgewogICAgICAgICAgYmVsb3dTZWcgPSByZWYxW2xdOwogICAgICAgICAgaWYgKHRpbWVSb3dTZWdzQ29sbGlkZSh1bnBsYWNlZFNlZywgYmVsb3dTZWcpKSB7CiAgICAgICAgICAgIGJlbG93U2VnLmFib3ZlLnB1c2godW5wbGFjZWRTZWcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXZlbCArPSAxOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2VnTGV2ZWxzOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUudW5yZW5kZXJGZ0NvbnRhaW5lcnMgPSBmdW5jdGlvbihjb250YWluZXJzKSB7CiAgICB2YXIgY29udGFpbmVyLCBqLCBsZW4sIHJlc3VsdHM7CiAgICByZXN1bHRzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSBjb250YWluZXJzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lcnNbal07CiAgICAgIGNvbnRhaW5lci5zZWdDb250YWluZXJFbC5lbXB0eSgpOwogICAgICBjb250YWluZXIuc2VnQ29udGFpbmVyRWwuaGVpZ2h0KCcnKTsKICAgICAgcmVzdWx0cy5wdXNoKGNvbnRhaW5lci5zZWdDb250YWluZXJIZWlnaHQgPSBudWxsKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZmdTZWdIdG1sID0gZnVuY3Rpb24oc2VnLCBkaXNhYmxlUmVzaXppbmcpIHsKICAgIHZhciBjbGFzc2VzLCBldmVudCwgaXNEcmFnZ2FibGUsIGlzUmVzaXphYmxlRnJvbUVuZCwgaXNSZXNpemFibGVGcm9tU3RhcnQsIHRpbWVUZXh0OwogICAgZXZlbnQgPSBzZWcuZXZlbnQ7CiAgICBpc0RyYWdnYWJsZSA9IHRoaXMudmlldy5pc0V2ZW50RHJhZ2dhYmxlKGV2ZW50KTsKICAgIGlzUmVzaXphYmxlRnJvbVN0YXJ0ID0gc2VnLmlzU3RhcnQgJiYgdGhpcy52aWV3LmlzRXZlbnRSZXNpemFibGVGcm9tU3RhcnQoZXZlbnQpOwogICAgaXNSZXNpemFibGVGcm9tRW5kID0gc2VnLmlzRW5kICYmIHRoaXMudmlldy5pc0V2ZW50UmVzaXphYmxlRnJvbUVuZChldmVudCk7CiAgICBjbGFzc2VzID0gdGhpcy5nZXRTZWdDbGFzc2VzKHNlZywgaXNEcmFnZ2FibGUsIGlzUmVzaXphYmxlRnJvbVN0YXJ0IHx8IGlzUmVzaXphYmxlRnJvbUVuZCk7CiAgICBjbGFzc2VzLnVuc2hpZnQoJ2ZjLXRpbWVsaW5lLWV2ZW50JywgJ2ZjLWgtZXZlbnQnKTsKICAgIHRpbWVUZXh0ID0gdGhpcy5nZXRFdmVudFRpbWVUZXh0KGV2ZW50KTsKICAgIHJldHVybiAnPGEgY2xhc3M9IicgKyBjbGFzc2VzLmpvaW4oJyAnKSArICciIHN0eWxlPSInICsgY3NzVG9TdHIodGhpcy5nZXRTZWdTa2luQ3NzKHNlZykpICsgJyInICsgKGV2ZW50LnVybCA/ICcgaHJlZj0iJyArIGh0bWxFc2NhcGUoZXZlbnQudXJsKSArICciJyA6ICcnKSArICc+JyArICc8ZGl2IGNsYXNzPSJmYy1jb250ZW50Ij4nICsgKHRpbWVUZXh0ID8gJzxzcGFuIGNsYXNzPSJmYy10aW1lIj4nICsgaHRtbEVzY2FwZSh0aW1lVGV4dCkgKyAnPC9zcGFuPicgOiAnJykgKyAnPHNwYW4gY2xhc3M9ImZjLXRpdGxlIj4nICsgKGV2ZW50LnRpdGxlID8gaHRtbEVzY2FwZShldmVudC50aXRsZSkgOiAnJm5ic3A7JykgKyAnPC9zcGFuPicgKyAnPC9kaXY+JyArICc8ZGl2IGNsYXNzPSJmYy1iZyIgLz4nICsgKGlzUmVzaXphYmxlRnJvbVN0YXJ0ID8gJzxkaXYgY2xhc3M9ImZjLXJlc2l6ZXIgZmMtc3RhcnQtcmVzaXplciI+PC9kaXY+JyA6ICcnKSArIChpc1Jlc2l6YWJsZUZyb21FbmQgPyAnPGRpdiBjbGFzcz0iZmMtcmVzaXplciBmYy1lbmQtcmVzaXplciI+PC9kaXY+JyA6ICcnKSArICc8L2E+JzsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnVwZGF0ZVNlZ0ZvbGxvd2VycyA9IGZ1bmN0aW9uKHNlZ3MpIHsKICAgIHZhciBqLCBsZW4sIHNlZywgc3ByaXRlcywgdGl0bGVFbDsKICAgIGlmICh0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcikgewogICAgICBzcHJpdGVzID0gW107CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHNlZ3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICBzZWcgPSBzZWdzW2pdOwogICAgICAgIHRpdGxlRWwgPSBzZWcuZWwuZmluZCgnLmZjLXRpdGxlJyk7CiAgICAgICAgaWYgKHRpdGxlRWwubGVuZ3RoKSB7CiAgICAgICAgICBzcHJpdGVzLnB1c2gobmV3IFNjcm9sbEZvbGxvd2VyU3ByaXRlKHRpdGxlRWwpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyLnNldFNwcml0ZXMoc3ByaXRlcyk7CiAgICB9CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5jbGVhclNlZ0ZvbGxvd2VycyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5jbGVhclNwcml0ZXMoKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNlZ0RyYWdTdGFydCA9IGZ1bmN0aW9uKCkgewogICAgVGltZWxpbmVHcmlkLl9fc3VwZXJfXy5zZWdEcmFnU3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmICh0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcikgewogICAgICByZXR1cm4gdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIuZm9yY2VSZWxhdGl2ZSgpOwogICAgfQogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc2VnRHJhZ0VuZCA9IGZ1bmN0aW9uKCkgewogICAgVGltZWxpbmVHcmlkLl9fc3VwZXJfXy5zZWdEcmFnRW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodGhpcy5ldmVudFRpdGxlRm9sbG93ZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyLmNsZWFyRm9yY2UoKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNlZ1Jlc2l6ZVN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICBUaW1lbGluZUdyaWQuX19zdXBlcl9fLnNlZ1Jlc2l6ZVN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodGhpcy5ldmVudFRpdGxlRm9sbG93ZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyLmZvcmNlUmVsYXRpdmUoKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNlZ1Jlc2l6ZUVuZCA9IGZ1bmN0aW9uKCkgewogICAgVGltZWxpbmVHcmlkLl9fc3VwZXJfXy5zZWdSZXNpemVFbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmICh0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcikgewogICAgICByZXR1cm4gdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIuY2xlYXJGb3JjZSgpOwogICAgfQogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVySGVscGVyID0gZnVuY3Rpb24oZXZlbnQsIHNvdXJjZVNlZykgewogICAgdmFyIHNlZ3M7CiAgICBzZWdzID0gdGhpcy5ldmVudFRvU2VncyhldmVudCk7CiAgICBzZWdzID0gdGhpcy5yZW5kZXJGZ1NlZ0VscyhzZWdzKTsKICAgIHJldHVybiB0aGlzLnJlbmRlckhlbHBlclNlZ3NJbkNvbnRhaW5lcnMoW1t0aGlzLCBzZWdzXV0sIHNvdXJjZVNlZyk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJIZWxwZXJTZWdzSW5Db250YWluZXJzID0gZnVuY3Rpb24ocGFpcnMsIHNvdXJjZVNlZykgewogICAgdmFyIGNvbnRhaW5lck9iaiwgY29vcmRzLCBoZWxwZXJDb250YWluZXJFbCwgaGVscGVyTm9kZXMsIGosIGssIGwsIGxlbiwgbGVuMSwgbGVuMiwgbGVuMywgbSwgcmVmLCByZWYxLCByZWYyLCBzZWcsIHNlZ05vZGVzLCBzZWdzOwogICAgaGVscGVyTm9kZXMgPSBbXTsKICAgIHNlZ05vZGVzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSBwYWlycy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByZWYgPSBwYWlyc1tqXSwgY29udGFpbmVyT2JqID0gcmVmWzBdLCBzZWdzID0gcmVmWzFdOwogICAgICBmb3IgKGsgPSAwLCBsZW4xID0gc2Vncy5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgICBzZWcgPSBzZWdzW2tdOwogICAgICAgIGNvb3JkcyA9IHRoaXMucmFuZ2VUb0Nvb3JkcyhzZWcpOwogICAgICAgIHNlZy5lbC5jc3MoewogICAgICAgICAgbGVmdDogKHNlZy5sZWZ0ID0gY29vcmRzLmxlZnQpLAogICAgICAgICAgcmlnaHQ6IC0oc2VnLnJpZ2h0ID0gY29vcmRzLnJpZ2h0KQogICAgICAgIH0pOwogICAgICAgIGlmIChzb3VyY2VTZWcgJiYgc291cmNlU2VnLnJlc291cmNlSWQgPT09ICgocmVmMSA9IGNvbnRhaW5lck9iai5yZXNvdXJjZSkgIT0gbnVsbCA/IHJlZjEuaWQgOiB2b2lkIDApKSB7CiAgICAgICAgICBzZWcuZWwuY3NzKCd0b3AnLCBzb3VyY2VTZWcuZWwuY3NzKCd0b3AnKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlZy5lbC5jc3MoJ3RvcCcsIDApOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZm9yIChsID0gMCwgbGVuMiA9IHBhaXJzLmxlbmd0aDsgbCA8IGxlbjI7IGwrKykgewogICAgICByZWYyID0gcGFpcnNbbF0sIGNvbnRhaW5lck9iaiA9IHJlZjJbMF0sIHNlZ3MgPSByZWYyWzFdOwogICAgICBoZWxwZXJDb250YWluZXJFbCA9ICQoJzxkaXYgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciBmYy1oZWxwZXItY29udGFpbmVyIi8+JykuYXBwZW5kVG8oY29udGFpbmVyT2JqLmlubmVyRWwpOwogICAgICBoZWxwZXJOb2Rlcy5wdXNoKGhlbHBlckNvbnRhaW5lckVsWzBdKTsKICAgICAgZm9yIChtID0gMCwgbGVuMyA9IHNlZ3MubGVuZ3RoOyBtIDwgbGVuMzsgbSsrKSB7CiAgICAgICAgc2VnID0gc2Vnc1ttXTsKICAgICAgICBoZWxwZXJDb250YWluZXJFbC5hcHBlbmQoc2VnLmVsKTsKICAgICAgICBzZWdOb2Rlcy5wdXNoKHNlZy5lbFswXSk7CiAgICAgIH0KICAgIH0KICAgIGlmICh0aGlzLmhlbHBlckVscykgewogICAgICB0aGlzLmhlbHBlckVscyA9IHRoaXMuaGVscGVyRWxzLmFkZCgkKGhlbHBlck5vZGVzKSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmhlbHBlckVscyA9ICQoaGVscGVyTm9kZXMpOwogICAgfQogICAgcmV0dXJuICQoc2VnTm9kZXMpOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUudW5yZW5kZXJIZWxwZXIgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmhlbHBlckVscykgewogICAgICB0aGlzLmhlbHBlckVscy5yZW1vdmUoKTsKICAgICAgcmV0dXJuIHRoaXMuaGVscGVyRWxzID0gbnVsbDsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnJlbmRlckV2ZW50UmVzaXplID0gZnVuY3Rpb24ocmVzaXplTG9jYXRpb24sIHNlZykgewogICAgdGhpcy5yZW5kZXJIaWdobGlnaHQodGhpcy5ldmVudFRvU3BhbihyZXNpemVMb2NhdGlvbikpOwogICAgcmV0dXJuIHRoaXMucmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcihyZXNpemVMb2NhdGlvbiwgc2VnKTsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnVucmVuZGVyRXZlbnRSZXNpemUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudW5yZW5kZXJIaWdobGlnaHQoKTsKICAgIHJldHVybiB0aGlzLnVucmVuZGVySGVscGVyKCk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJGaWxsID0gZnVuY3Rpb24odHlwZSwgc2VncywgY2xhc3NOYW1lKSB7CiAgICBzZWdzID0gdGhpcy5yZW5kZXJGaWxsU2VnRWxzKHR5cGUsIHNlZ3MpOwogICAgdGhpcy5yZW5kZXJGaWxsSW5Db250YWluZXJzKHR5cGUsIFtbdGhpcywgc2Vnc11dLCBjbGFzc05hbWUpOwogICAgcmV0dXJuIHNlZ3M7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJGaWxsSW5Db250YWluZXJzID0gZnVuY3Rpb24odHlwZSwgcGFpcnMsIGNsYXNzTmFtZSkgewogICAgdmFyIGNvbnRhaW5lck9iaiwgaiwgbGVuLCByZWYsIHJlc3VsdHMsIHNlZ3M7CiAgICByZXN1bHRzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSBwYWlycy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByZWYgPSBwYWlyc1tqXSwgY29udGFpbmVyT2JqID0gcmVmWzBdLCBzZWdzID0gcmVmWzFdOwogICAgICByZXN1bHRzLnB1c2godGhpcy5yZW5kZXJGaWxsSW5Db250YWluZXIodHlwZSwgY29udGFpbmVyT2JqLCBzZWdzLCBjbGFzc05hbWUpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyRmlsbEluQ29udGFpbmVyID0gZnVuY3Rpb24odHlwZSwgY29udGFpbmVyT2JqLCBzZWdzLCBjbGFzc05hbWUpIHsKICAgIHZhciBjb250YWluZXJFbCwgY29vcmRzLCBqLCBsZW4sIHNlZzsKICAgIGlmIChzZWdzLmxlbmd0aCkgewogICAgICBjbGFzc05hbWUgfHwgKGNsYXNzTmFtZSA9IHR5cGUudG9Mb3dlckNhc2UoKSk7CiAgICAgIGNvbnRhaW5lckVsID0gJCgnPGRpdiBjbGFzcz0iZmMtJyArIGNsYXNzTmFtZSArICctY29udGFpbmVyIiAvPicpLmFwcGVuZFRvKGNvbnRhaW5lck9iai5iZ1NlZ0NvbnRhaW5lckVsKTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gc2Vncy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICAgIHNlZyA9IHNlZ3Nbal07CiAgICAgICAgY29vcmRzID0gdGhpcy5yYW5nZVRvQ29vcmRzKHNlZyk7CiAgICAgICAgc2VnLmVsLmNzcyh7CiAgICAgICAgICBsZWZ0OiAoc2VnLmxlZnQgPSBjb29yZHMubGVmdCksCiAgICAgICAgICByaWdodDogLShzZWcucmlnaHQgPSBjb29yZHMucmlnaHQpCiAgICAgICAgfSk7CiAgICAgICAgc2VnLmVsLmFwcGVuZFRvKGNvbnRhaW5lckVsKTsKICAgICAgfQogICAgICBpZiAodGhpcy5lbHNCeUZpbGxbdHlwZV0pIHsKICAgICAgICByZXR1cm4gdGhpcy5lbHNCeUZpbGxbdHlwZV0gPSB0aGlzLmVsc0J5RmlsbFt0eXBlXS5hZGQoY29udGFpbmVyRWwpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB0aGlzLmVsc0J5RmlsbFt0eXBlXSA9IGNvbnRhaW5lckVsOwogICAgICB9CiAgICB9CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJEcmFnID0gZnVuY3Rpb24oZHJvcExvY2F0aW9uLCBzZWcpIHsKICAgIGlmIChzZWcpIHsKICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcihkcm9wTG9jYXRpb24sIHNlZyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKGRyb3BMb2NhdGlvbikpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnVucmVuZGVyRHJhZyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy51bnJlbmRlckhlbHBlcigpOwogICAgcmV0dXJuIHRoaXMudW5yZW5kZXJIaWdobGlnaHQoKTsKICB9OwoKICByZXR1cm4gVGltZWxpbmVHcmlkOwoKfSkoR3JpZCk7Cgpjb21wdXRlT2Zmc2V0Rm9yU2VncyA9IGZ1bmN0aW9uKHNlZ3MpIHsKICB2YXIgaiwgbGVuLCBtYXgsIHNlZzsKICBtYXggPSAwOwogIGZvciAoaiA9IDAsIGxlbiA9IHNlZ3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgIHNlZyA9IHNlZ3Nbal07CiAgICBtYXggPSBNYXRoLm1heChtYXgsIGNvbXB1dGVPZmZzZXRGb3JTZWcoc2VnKSk7CiAgfQogIHJldHVybiBtYXg7Cn07Cgpjb21wdXRlT2Zmc2V0Rm9yU2VnID0gZnVuY3Rpb24oc2VnKSB7CiAgaWYgKHNlZy50b3AgPT0gbnVsbCkgewogICAgc2VnLnRvcCA9IGNvbXB1dGVPZmZzZXRGb3JTZWdzKHNlZy5hYm92ZSk7CiAgfQogIHJldHVybiBzZWcudG9wICsgc2VnLmhlaWdodDsKfTsKCnRpbWVSb3dTZWdzQ29sbGlkZSA9IGZ1bmN0aW9uKHNlZzAsIHNlZzEpIHsKICByZXR1cm4gc2VnMC5sZWZ0IDwgc2VnMS5yaWdodCAmJiBzZWcwLnJpZ2h0ID4gc2VnMS5sZWZ0Owp9OwoKTUlOX0FVVE9fTEFCRUxTID0gMTg7CgpNQVhfQVVUT19TTE9UU19QRVJfTEFCRUwgPSA2OwoKTUFYX0FVVE9fQ0VMTFMgPSAyMDA7CgpNQVhfQ0VMTFMgPSAxMDAwOwoKREVGQVVMVF9HUklEX0RVUkFUSU9OID0gewogIG1vbnRoczogMQp9OwoKU1RPQ0tfU1VCX0RVUkFUSU9OUyA9IFsKICB7CiAgICB5ZWFyczogMQogIH0sIHsKICAgIG1vbnRoczogMQogIH0sIHsKICAgIGRheXM6IDEKICB9LCB7CiAgICBob3VyczogMQogIH0sIHsKICAgIG1pbnV0ZXM6IDMwCiAgfSwgewogICAgbWludXRlczogMTUKICB9LCB7CiAgICBtaW51dGVzOiAxMAogIH0sIHsKICAgIG1pbnV0ZXM6IDUKICB9LCB7CiAgICBtaW51dGVzOiAxCiAgfSwgewogICAgc2Vjb25kczogMzAKICB9LCB7CiAgICBzZWNvbmRzOiAxNQogIH0sIHsKICAgIHNlY29uZHM6IDEwCiAgfSwgewogICAgc2Vjb25kczogNQogIH0sIHsKICAgIHNlY29uZHM6IDEKICB9LCB7CiAgICBtaWxsaXNlY29uZHM6IDUwMAogIH0sIHsKICAgIG1pbGxpc2Vjb25kczogMTAwCiAgfSwgewogICAgbWlsbGlzZWNvbmRzOiAxMAogIH0sIHsKICAgIG1pbGxpc2Vjb25kczogMQogIH0KXTsKClRpbWVsaW5lR3JpZC5wcm90b3R5cGUuaW5pdFNjYWxlUHJvcHMgPSBmdW5jdGlvbigpIHsKICB2YXIgaW5wdXQsIHNsb3RVbml0LCB0eXBlOwogIHRoaXMubGFiZWxJbnRlcnZhbCA9IHRoaXMucXVlcnlEdXJhdGlvbk9wdGlvbignc2xvdExhYmVsSW50ZXJ2YWwnKTsKICB0aGlzLnNsb3REdXJhdGlvbiA9IHRoaXMucXVlcnlEdXJhdGlvbk9wdGlvbignc2xvdER1cmF0aW9uJyk7CiAgdGhpcy5lbnN1cmVHcmlkRHVyYXRpb24oKTsKICB0aGlzLnZhbGlkYXRlTGFiZWxBbmRTbG90KCk7CiAgdGhpcy5lbnN1cmVMYWJlbEludGVydmFsKCk7CiAgdGhpcy5lbnN1cmVTbG90RHVyYXRpb24oKTsKICBpbnB1dCA9IHRoaXMub3B0KCdzbG90TGFiZWxGb3JtYXQnKTsKICB0eXBlID0gJC50eXBlKGlucHV0KTsKICB0aGlzLmhlYWRlckZvcm1hdHMgPSB0eXBlID09PSAnYXJyYXknID8gaW5wdXQgOiB0eXBlID09PSAnc3RyaW5nJyA/IFtpbnB1dF0gOiB0aGlzLmNvbXB1dGVIZWFkZXJGb3JtYXRzKCk7CiAgdGhpcy5pc1RpbWVTY2FsZSA9IGR1cmF0aW9uSGFzVGltZSh0aGlzLnNsb3REdXJhdGlvbik7CiAgdGhpcy5sYXJnZVVuaXQgPSAhdGhpcy5pc1RpbWVTY2FsZSA/IChzbG90VW5pdCA9IGNvbXB1dGVJbnRlcnZhbFVuaXQodGhpcy5zbG90RHVyYXRpb24pLCAveWVhcnxtb250aHx3ZWVrLy50ZXN0KHNsb3RVbml0KSA/IHNsb3RVbml0IDogdm9pZCAwKSA6IHZvaWQgMDsKICByZXR1cm4gdGhpcy5lbXBoYXNpemVXZWVrcyA9IHRoaXMuc2xvdER1cmF0aW9uLmFzKCdkYXlzJykgPT09IDEgJiYgdGhpcy5kdXJhdGlvbi5hcygnd2Vla3MnKSA+PSAyICYmICF0aGlzLm9wdCgnYnVzaW5lc3NIb3VycycpOwoKICAvKgogIAljb25zb2xlLmxvZygndmlldyBkdXJhdGlvbiA9JywgQGR1cmF0aW9uLmh1bWFuaXplKCkpCiAgCWNvbnNvbGUubG9nKCdsYWJlbCBpbnRlcnZhbCA9JywgQGxhYmVsSW50ZXJ2YWwuaHVtYW5pemUoKSkKICAJY29uc29sZS5sb2coJ3Nsb3QgZHVyYXRpb24gPScsIEBzbG90RHVyYXRpb24uaHVtYW5pemUoKSkKICAJY29uc29sZS5sb2coJ2hlYWRlciBmb3JtYXRzID0nLCBAaGVhZGVyRm9ybWF0cykKICAJY29uc29sZS5sb2coJ2lzVGltZVNjYWxlJywgQGlzVGltZVNjYWxlKQogIAljb25zb2xlLmxvZygnbGFyZ2VVbml0JywgQGxhcmdlVW5pdCkKICAgKi8KfTsKClRpbWVsaW5lR3JpZC5wcm90b3R5cGUucXVlcnlEdXJhdGlvbk9wdGlvbiA9IGZ1bmN0aW9uKG5hbWUpIHsKICB2YXIgZHVyLCBpbnB1dDsKICBpbnB1dCA9IHRoaXMub3B0KG5hbWUpOwogIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICBkdXIgPSBtb21lbnQuZHVyYXRpb24oaW5wdXQpOwogICAgaWYgKCtkdXIpIHsKICAgICAgcmV0dXJuIGR1cjsKICAgIH0KICB9Cn07CgpUaW1lbGluZUdyaWQucHJvdG90eXBlLnZhbGlkYXRlTGFiZWxBbmRTbG90ID0gZnVuY3Rpb24oKSB7CiAgdmFyIGxhYmVsQ250LCBzbG90Q250LCBzbG90c1BlckxhYmVsOwogIGlmICh0aGlzLmxhYmVsSW50ZXJ2YWwpIHsKICAgIGxhYmVsQ250ID0gZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uKHRoaXMuZHVyYXRpb24sIHRoaXMubGFiZWxJbnRlcnZhbCk7CiAgICBpZiAobGFiZWxDbnQgPiBNQVhfQ0VMTFMpIHsKICAgICAgRkMud2Fybignc2xvdExhYmVsSW50ZXJ2YWwgcmVzdWx0cyBpbiB0b28gbWFueSBjZWxscycpOwogICAgICB0aGlzLmxhYmVsSW50ZXJ2YWwgPSBudWxsOwogICAgfQogIH0KICBpZiAodGhpcy5zbG90RHVyYXRpb24pIHsKICAgIHNsb3RDbnQgPSBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24odGhpcy5kdXJhdGlvbiwgdGhpcy5zbG90RHVyYXRpb24pOwogICAgaWYgKHNsb3RDbnQgPiBNQVhfQ0VMTFMpIHsKICAgICAgRkMud2Fybignc2xvdER1cmF0aW9uIHJlc3VsdHMgaW4gdG9vIG1hbnkgY2VsbHMnKTsKICAgICAgdGhpcy5zbG90RHVyYXRpb24gPSBudWxsOwogICAgfQogIH0KICBpZiAodGhpcy5sYWJlbEludGVydmFsICYmIHRoaXMuc2xvdER1cmF0aW9uKSB7CiAgICBzbG90c1BlckxhYmVsID0gZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uKHRoaXMubGFiZWxJbnRlcnZhbCwgdGhpcy5zbG90RHVyYXRpb24pOwogICAgaWYgKCFpc0ludChzbG90c1BlckxhYmVsKSB8fCBzbG90c1BlckxhYmVsIDwgMSkgewogICAgICBGQy53YXJuKCdzbG90TGFiZWxJbnRlcnZhbCBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygc2xvdER1cmF0aW9uJyk7CiAgICAgIHJldHVybiB0aGlzLnNsb3REdXJhdGlvbiA9IG51bGw7CiAgICB9CiAgfQp9OwoKVGltZWxpbmVHcmlkLnByb3RvdHlwZS5lbnN1cmVHcmlkRHVyYXRpb24gPSBmdW5jdGlvbigpIHsKICB2YXIgZ3JpZER1cmF0aW9uLCBpbnB1dCwgaiwgbGFiZWxDbnQsIGxhYmVsSW50ZXJ2YWw7CiAgZ3JpZER1cmF0aW9uID0gdGhpcy5kdXJhdGlvbjsKICBpZiAoIWdyaWREdXJhdGlvbikgewogICAgZ3JpZER1cmF0aW9uID0gdGhpcy52aWV3LmludGVydmFsRHVyYXRpb247CiAgICBpZiAoIWdyaWREdXJhdGlvbikgewogICAgICBpZiAoIXRoaXMubGFiZWxJbnRlcnZhbCAmJiAhdGhpcy5zbG90RHVyYXRpb24pIHsKICAgICAgICBncmlkRHVyYXRpb24gPSBtb21lbnQuZHVyYXRpb24oREVGQVVMVF9HUklEX0RVUkFUSU9OKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsYWJlbEludGVydmFsID0gdGhpcy5lbnN1cmVMYWJlbEludGVydmFsKCk7CiAgICAgICAgZm9yIChqID0gU1RPQ0tfU1VCX0RVUkFUSU9OUy5sZW5ndGggLSAxOyBqID49IDA7IGogKz0gLTEpIHsKICAgICAgICAgIGlucHV0ID0gU1RPQ0tfU1VCX0RVUkFUSU9OU1tqXTsKICAgICAgICAgIGdyaWREdXJhdGlvbiA9IG1vbWVudC5kdXJhdGlvbihpbnB1dCk7CiAgICAgICAgICBsYWJlbENudCA9IGRpdmlkZUR1cmF0aW9uQnlEdXJhdGlvbihncmlkRHVyYXRpb24sIGxhYmVsSW50ZXJ2YWwpOwogICAgICAgICAgaWYgKGxhYmVsQ250ID49IE1JTl9BVVRPX0xBQkVMUykgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRoaXMuZHVyYXRpb24gPSBncmlkRHVyYXRpb247CiAgfQogIHJldHVybiBncmlkRHVyYXRpb247Cn07CgpUaW1lbGluZUdyaWQucHJvdG90eXBlLmVuc3VyZUxhYmVsSW50ZXJ2YWwgPSBmdW5jdGlvbigpIHsKICB2YXIgaW5wdXQsIGosIGssIGxhYmVsQ250LCBsYWJlbEludGVydmFsLCBsZW4sIGxlbjEsIHNsb3RzUGVyTGFiZWwsIHRyeUxhYmVsSW50ZXJ2YWw7CiAgbGFiZWxJbnRlcnZhbCA9IHRoaXMubGFiZWxJbnRlcnZhbDsKICBpZiAoIWxhYmVsSW50ZXJ2YWwpIHsKICAgIGlmICghdGhpcy5kdXJhdGlvbiAmJiAhdGhpcy5zbG90RHVyYXRpb24pIHsKICAgICAgdGhpcy5lbnN1cmVHcmlkRHVyYXRpb24oKTsKICAgIH0KICAgIGlmICh0aGlzLnNsb3REdXJhdGlvbikgewogICAgICBmb3IgKGogPSAwLCBsZW4gPSBTVE9DS19TVUJfRFVSQVRJT05TLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgaW5wdXQgPSBTVE9DS19TVUJfRFVSQVRJT05TW2pdOwogICAgICAgIHRyeUxhYmVsSW50ZXJ2YWwgPSBtb21lbnQuZHVyYXRpb24oaW5wdXQpOwogICAgICAgIHNsb3RzUGVyTGFiZWwgPSBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24odHJ5TGFiZWxJbnRlcnZhbCwgdGhpcy5zbG90RHVyYXRpb24pOwogICAgICAgIGlmIChpc0ludChzbG90c1BlckxhYmVsKSAmJiBzbG90c1BlckxhYmVsIDw9IE1BWF9BVVRPX1NMT1RTX1BFUl9MQUJFTCkgewogICAgICAgICAgbGFiZWxJbnRlcnZhbCA9IHRyeUxhYmVsSW50ZXJ2YWw7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFsYWJlbEludGVydmFsKSB7CiAgICAgICAgbGFiZWxJbnRlcnZhbCA9IHRoaXMuc2xvdER1cmF0aW9uOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGsgPSAwLCBsZW4xID0gU1RPQ0tfU1VCX0RVUkFUSU9OUy5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgICBpbnB1dCA9IFNUT0NLX1NVQl9EVVJBVElPTlNba107CiAgICAgICAgbGFiZWxJbnRlcnZhbCA9IG1vbWVudC5kdXJhdGlvbihpbnB1dCk7CiAgICAgICAgbGFiZWxDbnQgPSBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24odGhpcy5kdXJhdGlvbiwgbGFiZWxJbnRlcnZhbCk7CiAgICAgICAgaWYgKGxhYmVsQ250ID49IE1JTl9BVVRPX0xBQkVMUykgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aGlzLmxhYmVsSW50ZXJ2YWwgPSBsYWJlbEludGVydmFsOwogIH0KICByZXR1cm4gbGFiZWxJbnRlcnZhbDsKfTsKClRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZW5zdXJlU2xvdER1cmF0aW9uID0gZnVuY3Rpb24oKSB7CiAgdmFyIGlucHV0LCBqLCBsYWJlbEludGVydmFsLCBsZW4sIHNsb3RDbnQsIHNsb3REdXJhdGlvbiwgc2xvdHNQZXJMYWJlbCwgdHJ5U2xvdER1cmF0aW9uOwogIHNsb3REdXJhdGlvbiA9IHRoaXMuc2xvdER1cmF0aW9uOwogIGlmICghc2xvdER1cmF0aW9uKSB7CiAgICBsYWJlbEludGVydmFsID0gdGhpcy5lbnN1cmVMYWJlbEludGVydmFsKCk7CiAgICBmb3IgKGogPSAwLCBsZW4gPSBTVE9DS19TVUJfRFVSQVRJT05TLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGlucHV0ID0gU1RPQ0tfU1VCX0RVUkFUSU9OU1tqXTsKICAgICAgdHJ5U2xvdER1cmF0aW9uID0gbW9tZW50LmR1cmF0aW9uKGlucHV0KTsKICAgICAgc2xvdHNQZXJMYWJlbCA9IGRpdmlkZUR1cmF0aW9uQnlEdXJhdGlvbihsYWJlbEludGVydmFsLCB0cnlTbG90RHVyYXRpb24pOwogICAgICBpZiAoaXNJbnQoc2xvdHNQZXJMYWJlbCkgJiYgc2xvdHNQZXJMYWJlbCA+IDEgJiYgc2xvdHNQZXJMYWJlbCA8PSBNQVhfQVVUT19TTE9UU19QRVJfTEFCRUwpIHsKICAgICAgICBzbG90RHVyYXRpb24gPSB0cnlTbG90RHVyYXRpb247CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmIChzbG90RHVyYXRpb24gJiYgdGhpcy5kdXJhdGlvbikgewogICAgICBzbG90Q250ID0gZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uKHRoaXMuZHVyYXRpb24sIHNsb3REdXJhdGlvbik7CiAgICAgIGlmIChzbG90Q250ID4gTUFYX0FVVE9fQ0VMTFMpIHsKICAgICAgICBzbG90RHVyYXRpb24gPSBudWxsOwogICAgICB9CiAgICB9CiAgICBpZiAoIXNsb3REdXJhdGlvbikgewogICAgICBzbG90RHVyYXRpb24gPSBsYWJlbEludGVydmFsOwogICAgfQogICAgdGhpcy5zbG90RHVyYXRpb24gPSBzbG90RHVyYXRpb247CiAgfQogIHJldHVybiBzbG90RHVyYXRpb247Cn07CgpUaW1lbGluZUdyaWQucHJvdG90eXBlLmNvbXB1dGVIZWFkZXJGb3JtYXRzID0gZnVuY3Rpb24oKSB7CiAgdmFyIGZvcm1hdDAsIGZvcm1hdDEsIGZvcm1hdDIsIGdyaWREdXJhdGlvbiwgbGFiZWxJbnRlcnZhbCwgdW5pdCwgdmlldywgd2Vla051bWJlcnNWaXNpYmxlOwogIHZpZXcgPSB0aGlzLnZpZXc7CiAgZ3JpZER1cmF0aW9uID0gdGhpcy5kdXJhdGlvbjsKICBsYWJlbEludGVydmFsID0gdGhpcy5sYWJlbEludGVydmFsOwogIHVuaXQgPSBjb21wdXRlSW50ZXJ2YWxVbml0KGxhYmVsSW50ZXJ2YWwpOwogIHdlZWtOdW1iZXJzVmlzaWJsZSA9IHRoaXMub3B0KCd3ZWVrTnVtYmVycycpOwogIGZvcm1hdDAgPSBmb3JtYXQxID0gZm9ybWF0MiA9IG51bGw7CiAgaWYgKHVuaXQgPT09ICd3ZWVrJyAmJiAhd2Vla051bWJlcnNWaXNpYmxlKSB7CiAgICB1bml0ID0gJ2RheSc7CiAgfQogIHN3aXRjaCAodW5pdCkgewogICAgY2FzZSAneWVhcic6CiAgICAgIGZvcm1hdDAgPSAnWVlZWSc7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnbW9udGgnOgogICAgICBpZiAoZ3JpZER1cmF0aW9uLmFzWWVhcnMoKSA+IDEpIHsKICAgICAgICBmb3JtYXQwID0gJ1lZWVknOwogICAgICB9CiAgICAgIGZvcm1hdDEgPSAnTU1NJzsKICAgICAgYnJlYWs7CiAgICBjYXNlICd3ZWVrJzoKICAgICAgaWYgKGdyaWREdXJhdGlvbi5hc1llYXJzKCkgPiAxKSB7CiAgICAgICAgZm9ybWF0MCA9ICdZWVlZJzsKICAgICAgfQogICAgICBmb3JtYXQxID0gdGhpcy5vcHQoJ3Nob3J0V2Vla0Zvcm1hdCcpOwogICAgICBicmVhazsKICAgIGNhc2UgJ2RheSc6CiAgICAgIGlmIChncmlkRHVyYXRpb24uYXNZZWFycygpID4gMSkgewogICAgICAgIGZvcm1hdDAgPSB0aGlzLm9wdCgnbW9udGhZZWFyRm9ybWF0Jyk7CiAgICAgIH0gZWxzZSBpZiAoZ3JpZER1cmF0aW9uLmFzTW9udGhzKCkgPiAxKSB7CiAgICAgICAgZm9ybWF0MCA9ICdNTU1NJzsKICAgICAgfQogICAgICBpZiAod2Vla051bWJlcnNWaXNpYmxlKSB7CiAgICAgICAgZm9ybWF0MSA9IHRoaXMub3B0KCd3ZWVrRm9ybWF0Jyk7CiAgICAgIH0KICAgICAgZm9ybWF0MiA9ICdkZCBEJzsKICAgICAgYnJlYWs7CiAgICBjYXNlICdob3VyJzoKICAgICAgaWYgKHdlZWtOdW1iZXJzVmlzaWJsZSkgewogICAgICAgIGZvcm1hdDAgPSB0aGlzLm9wdCgnd2Vla0Zvcm1hdCcpOwogICAgICB9CiAgICAgIGlmIChncmlkRHVyYXRpb24uYXNEYXlzKCkgPiAxKSB7CiAgICAgICAgZm9ybWF0MSA9IHRoaXMub3B0KCdkYXlPZk1vbnRoRm9ybWF0Jyk7CiAgICAgIH0KICAgICAgZm9ybWF0MiA9IHRoaXMub3B0KCdzbWFsbFRpbWVGb3JtYXQnKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdtaW51dGUnOgogICAgICBpZiAobGFiZWxJbnRlcnZhbC5hc01pbnV0ZXMoKSAvIDYwID49IE1BWF9BVVRPX1NMT1RTX1BFUl9MQUJFTCkgewogICAgICAgIGZvcm1hdDAgPSB0aGlzLm9wdCgnaG91ckZvcm1hdCcpOwogICAgICAgIGZvcm1hdDEgPSAnWzpdbW0nOwogICAgICB9IGVsc2UgewogICAgICAgIGZvcm1hdDAgPSB0aGlzLm9wdCgnbWVkaXVtVGltZUZvcm1hdCcpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAnc2Vjb25kJzoKICAgICAgaWYgKGxhYmVsSW50ZXJ2YWwuYXNTZWNvbmRzKCkgLyA2MCA+PSBNQVhfQVVUT19TTE9UU19QRVJfTEFCRUwpIHsKICAgICAgICBmb3JtYXQwID0gJ0xUJzsKICAgICAgICBmb3JtYXQxID0gJ1s6XXNzJzsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3JtYXQwID0gJ0xUUyc7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICdtaWxsaXNlY29uZCc6CiAgICAgIGZvcm1hdDAgPSAnTFRTJzsKICAgICAgZm9ybWF0MSA9ICdbLl1TU1MnOwogIH0KICByZXR1cm4gW10uY29uY2F0KGZvcm1hdDAgfHwgW10sIGZvcm1hdDEgfHwgW10sIGZvcm1hdDIgfHwgW10pOwp9OwoKRkMudmlld3MudGltZWxpbmUgPSB7CiAgImNsYXNzIjogVGltZWxpbmVWaWV3LAogIGRlZmF1bHRzOiB7CiAgICBldmVudFJlc2l6YWJsZUZyb21TdGFydDogdHJ1ZQogIH0KfTsKCkZDLnZpZXdzLnRpbWVsaW5lRGF5ID0gewogIHR5cGU6ICd0aW1lbGluZScsCiAgZHVyYXRpb246IHsKICAgIGRheXM6IDEKICB9Cn07CgpGQy52aWV3cy50aW1lbGluZVdlZWsgPSB7CiAgdHlwZTogJ3RpbWVsaW5lJywKICBkdXJhdGlvbjogewogICAgd2Vla3M6IDEKICB9Cn07CgpGQy52aWV3cy50aW1lbGluZU1vbnRoID0gewogIHR5cGU6ICd0aW1lbGluZScsCiAgZHVyYXRpb246IHsKICAgIG1vbnRoczogMQogIH0KfTsKCkZDLnZpZXdzLnRpbWVsaW5lWWVhciA9IHsKICB0eXBlOiAndGltZWxpbmUnLAogIGR1cmF0aW9uOiB7CiAgICB5ZWFyczogMQogIH0KfTsKClJlc291cmNlVGltZWxpbmVWaWV3ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHsKICBleHRlbmQoUmVzb3VyY2VUaW1lbGluZVZpZXcsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBSZXNvdXJjZVRpbWVsaW5lVmlldygpIHsKICAgIHJldHVybiBSZXNvdXJjZVRpbWVsaW5lVmlldy5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CgogIFJlc291cmNlVGltZWxpbmVWaWV3Lm1peGluKFJlc291cmNlVmlld01peGluKTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJlc291cmNlR3JpZCA9IG51bGw7CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS50Ym9keUhhc2ggPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuam9pbmVyID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmRpdmlkZXJFbHMgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuc3VwZXJIZWFkZXJUZXh0ID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmlzVkdyb3VwaW5nID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmlzSEdyb3VwaW5nID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmdyb3VwU3BlY3MgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuY29sU3BlY3MgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUub3JkZXJTcGVjcyA9IG51bGw7CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yb3dIaWVyYXJjaHkgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVzb3VyY2VSb3dIYXNoID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLm5lc3RpbmdDbnQgPSAwOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuaXNOZXN0aW5nID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmRpdmlkZXJXaWR0aCA9IG51bGw7CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24oKSB7CiAgICBSZXNvdXJjZVRpbWVsaW5lVmlldy5fX3N1cGVyX18uaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgdGhpcy5wcm9jZXNzUmVzb3VyY2VPcHRpb25zKCk7CiAgICB0aGlzLnJlc291cmNlR3JpZCA9IG5ldyBTcHJlYWRzaGVldCh0aGlzKTsKICAgIHRoaXMucm93SGllcmFyY2h5ID0gbmV3IFJvd1BhcmVudCh0aGlzKTsKICAgIHJldHVybiB0aGlzLnJlc291cmNlUm93SGFzaCA9IHt9OwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5pbnN0YW50aWF0ZUdyaWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBuZXcgUmVzb3VyY2VUaW1lbGluZUdyaWQodGhpcyk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnByb2Nlc3NSZXNvdXJjZU9wdGlvbnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhbGxDb2xTcGVjcywgYWxsT3JkZXJTcGVjcywgY29sU3BlYywgZGVmYXVsdExhYmVsVGV4dCwgZ3JvdXBDb2xTcGVjcywgZ3JvdXBTcGVjLCBncm91cFNwZWNzLCBoR3JvdXBGaWVsZCwgaXNHcm91cCwgaXNIR3JvdXBpbmcsIGlzVkdyb3VwaW5nLCBqLCBrLCBsLCBsYWJlbFRleHQsIGxlbiwgbGVuMSwgbGVuMiwgb3JkZXJTcGVjLCBwbGFpbkNvbFNwZWNzLCBwbGFpbk9yZGVyU3BlY3MsIHN1cGVySGVhZGVyVGV4dDsKICAgIGFsbENvbFNwZWNzID0gdGhpcy5vcHQoJ3Jlc291cmNlQ29sdW1ucycpIHx8IFtdOwogICAgbGFiZWxUZXh0ID0gdGhpcy5vcHQoJ3Jlc291cmNlTGFiZWxUZXh0Jyk7CiAgICBkZWZhdWx0TGFiZWxUZXh0ID0gJ1Jlc291cmNlcyc7CiAgICBzdXBlckhlYWRlclRleHQgPSBudWxsOwogICAgaWYgKCFhbGxDb2xTcGVjcy5sZW5ndGgpIHsKICAgICAgYWxsQ29sU3BlY3MucHVzaCh7CiAgICAgICAgbGFiZWxUZXh0OiBsYWJlbFRleHQgfHwgZGVmYXVsdExhYmVsVGV4dCwKICAgICAgICB0ZXh0OiB0aGlzLmdldFJlc291cmNlVGV4dEZ1bmMoKQogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHN1cGVySGVhZGVyVGV4dCA9IGxhYmVsVGV4dDsKICAgIH0KICAgIHBsYWluQ29sU3BlY3MgPSBbXTsKICAgIGdyb3VwQ29sU3BlY3MgPSBbXTsKICAgIGdyb3VwU3BlY3MgPSBbXTsKICAgIGlzVkdyb3VwaW5nID0gZmFsc2U7CiAgICBpc0hHcm91cGluZyA9IGZhbHNlOwogICAgZm9yIChqID0gMCwgbGVuID0gYWxsQ29sU3BlY3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgY29sU3BlYyA9IGFsbENvbFNwZWNzW2pdOwogICAgICBpZiAoY29sU3BlYy5ncm91cCkgewogICAgICAgIGdyb3VwQ29sU3BlY3MucHVzaChjb2xTcGVjKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbGFpbkNvbFNwZWNzLnB1c2goY29sU3BlYyk7CiAgICAgIH0KICAgIH0KICAgIHBsYWluQ29sU3BlY3NbMF0uaXNNYWluID0gdHJ1ZTsKICAgIGlmIChncm91cENvbFNwZWNzLmxlbmd0aCkgewogICAgICBncm91cFNwZWNzID0gZ3JvdXBDb2xTcGVjczsKICAgICAgaXNWR3JvdXBpbmcgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgaEdyb3VwRmllbGQgPSB0aGlzLm9wdCgncmVzb3VyY2VHcm91cEZpZWxkJyk7CiAgICAgIGlmIChoR3JvdXBGaWVsZCkgewogICAgICAgIGlzSEdyb3VwaW5nID0gdHJ1ZTsKICAgICAgICBncm91cFNwZWNzLnB1c2goewogICAgICAgICAgZmllbGQ6IGhHcm91cEZpZWxkLAogICAgICAgICAgdGV4dDogdGhpcy5vcHQoJ3Jlc291cmNlR3JvdXBUZXh0JyksCiAgICAgICAgICByZW5kZXI6IHRoaXMub3B0KCdyZXNvdXJjZUdyb3VwUmVuZGVyJykKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgYWxsT3JkZXJTcGVjcyA9IHBhcnNlRmllbGRTcGVjcyh0aGlzLm9wdCgncmVzb3VyY2VPcmRlcicpKTsKICAgIHBsYWluT3JkZXJTcGVjcyA9IFtdOwogICAgZm9yIChrID0gMCwgbGVuMSA9IGFsbE9yZGVyU3BlY3MubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7CiAgICAgIG9yZGVyU3BlYyA9IGFsbE9yZGVyU3BlY3Nba107CiAgICAgIGlzR3JvdXAgPSBmYWxzZTsKICAgICAgZm9yIChsID0gMCwgbGVuMiA9IGdyb3VwU3BlY3MubGVuZ3RoOyBsIDwgbGVuMjsgbCsrKSB7CiAgICAgICAgZ3JvdXBTcGVjID0gZ3JvdXBTcGVjc1tsXTsKICAgICAgICBpZiAoZ3JvdXBTcGVjLmZpZWxkID09PSBvcmRlclNwZWMuZmllbGQpIHsKICAgICAgICAgIGdyb3VwU3BlYy5vcmRlciA9IG9yZGVyU3BlYy5vcmRlcjsKICAgICAgICAgIGlzR3JvdXAgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghaXNHcm91cCkgewogICAgICAgIHBsYWluT3JkZXJTcGVjcy5wdXNoKG9yZGVyU3BlYyk7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuc3VwZXJIZWFkZXJUZXh0ID0gc3VwZXJIZWFkZXJUZXh0OwogICAgdGhpcy5pc1ZHcm91cGluZyA9IGlzVkdyb3VwaW5nOwogICAgdGhpcy5pc0hHcm91cGluZyA9IGlzSEdyb3VwaW5nOwogICAgdGhpcy5ncm91cFNwZWNzID0gZ3JvdXBTcGVjczsKICAgIHRoaXMuY29sU3BlY3MgPSBncm91cENvbFNwZWNzLmNvbmNhdChwbGFpbkNvbFNwZWNzKTsKICAgIHJldHVybiB0aGlzLm9yZGVyU3BlY3MgPSBwbGFpbk9yZGVyU3BlY3M7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJlbmRlclNrZWxldG9uID0gZnVuY3Rpb24oKSB7CiAgICBSZXNvdXJjZVRpbWVsaW5lVmlldy5fX3N1cGVyX18ucmVuZGVyU2tlbGV0b24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMucmVuZGVyUmVzb3VyY2VHcmlkU2tlbGV0b24oKTsKICAgIHRoaXMudGJvZHlIYXNoID0gewogICAgICBzcHJlYWRzaGVldDogdGhpcy5yZXNvdXJjZUdyaWQudGJvZHlFbCwKICAgICAgZXZlbnQ6IHRoaXMudGltZUdyaWQudGJvZHlFbAogICAgfTsKICAgIHRoaXMuam9pbmVyID0gbmV3IFNjcm9sbEpvaW5lcigndmVydGljYWwnLCBbdGhpcy5yZXNvdXJjZUdyaWQuYm9keVNjcm9sbGVyLCB0aGlzLnRpbWVHcmlkLmJvZHlTY3JvbGxlcl0pOwogICAgcmV0dXJuIHRoaXMuaW5pdERpdmlkZXJNb3ZpbmcoKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVuZGVyU2tlbGV0b25IdG1sID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gJzx0YWJsZT4gPHRoZWFkIGNsYXNzPSJmYy1oZWFkIj4gPHRyPiA8dGQgY2xhc3M9ImZjLXJlc291cmNlLWFyZWEgJyArIHRoaXMud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIj48L3RkPiA8dGQgY2xhc3M9ImZjLWRpdmlkZXIgZmMtY29sLXJlc2l6ZXIgJyArIHRoaXMud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIj48L3RkPiA8dGQgY2xhc3M9ImZjLXRpbWUtYXJlYSAnICsgdGhpcy53aWRnZXRIZWFkZXJDbGFzcyArICciPjwvdGQ+IDwvdHI+IDwvdGhlYWQ+IDx0Ym9keSBjbGFzcz0iZmMtYm9keSI+IDx0cj4gPHRkIGNsYXNzPSJmYy1yZXNvdXJjZS1hcmVhICcgKyB0aGlzLndpZGdldENvbnRlbnRDbGFzcyArICciPjwvdGQ+IDx0ZCBjbGFzcz0iZmMtZGl2aWRlciBmYy1jb2wtcmVzaXplciAnICsgdGhpcy53aWRnZXRIZWFkZXJDbGFzcyArICciPjwvdGQ+IDx0ZCBjbGFzcz0iZmMtdGltZS1hcmVhICcgKyB0aGlzLndpZGdldENvbnRlbnRDbGFzcyArICciPjwvdGQ+IDwvdHI+IDwvdGJvZHk+IDwvdGFibGU+JzsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVuZGVyUmVzb3VyY2VHcmlkU2tlbGV0b24gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVzb3VyY2VHcmlkLmVsID0gdGhpcy5lbC5maW5kKCd0Ym9keSAuZmMtcmVzb3VyY2UtYXJlYScpOwogICAgdGhpcy5yZXNvdXJjZUdyaWQuaGVhZEVsID0gdGhpcy5lbC5maW5kKCd0aGVhZCAuZmMtcmVzb3VyY2UtYXJlYScpOwogICAgcmV0dXJuIHRoaXMucmVzb3VyY2VHcmlkLnJlbmRlclNrZWxldG9uKCk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmluaXREaXZpZGVyTW92aW5nID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcmVmOwogICAgdGhpcy5kaXZpZGVyRWxzID0gdGhpcy5lbC5maW5kKCcuZmMtZGl2aWRlcicpOwogICAgdGhpcy5kaXZpZGVyV2lkdGggPSAocmVmID0gdGhpcy5vcHQoJ3Jlc291cmNlQXJlYVdpZHRoJykpICE9IG51bGwgPyByZWYgOiB0aGlzLnJlc291cmNlR3JpZC50YWJsZVdpZHRoOwogICAgaWYgKHRoaXMuZGl2aWRlcldpZHRoICE9IG51bGwpIHsKICAgICAgdGhpcy5wb3NpdGlvbkRpdmlkZXIodGhpcy5kaXZpZGVyV2lkdGgpOwogICAgfQogICAgcmV0dXJuIHRoaXMuZGl2aWRlckVscy5vbignbW91c2Vkb3duJywgKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihldikgewogICAgICAgIHJldHVybiBfdGhpcy5kaXZpZGVyTW91c2Vkb3duKGV2KTsKICAgICAgfTsKICAgIH0pKHRoaXMpKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuZGl2aWRlck1vdXNlZG93biA9IGZ1bmN0aW9uKGV2KSB7CiAgICB2YXIgZHJhZ0xpc3RlbmVyLCBpc1JUTCwgbWF4V2lkdGgsIG1pbldpZHRoLCBvcmlnV2lkdGg7CiAgICBpc1JUTCA9IHRoaXMub3B0KCdpc1JUTCcpOwogICAgbWluV2lkdGggPSAzMDsKICAgIG1heFdpZHRoID0gdGhpcy5lbC53aWR0aCgpIC0gMzA7CiAgICBvcmlnV2lkdGggPSB0aGlzLmdldE5hdHVyYWxEaXZpZGVyV2lkdGgoKTsKICAgIGRyYWdMaXN0ZW5lciA9IG5ldyBEcmFnTGlzdGVuZXIoewogICAgICBkcmFnU3RhcnQ6IChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5kaXZpZGVyRWxzLmFkZENsYXNzKCdmYy1hY3RpdmUnKTsKICAgICAgICB9OwogICAgICB9KSh0aGlzKSwKICAgICAgZHJhZzogKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGR4LCBkeSkgewogICAgICAgICAgdmFyIHdpZHRoOwogICAgICAgICAgaWYgKGlzUlRMKSB7CiAgICAgICAgICAgIHdpZHRoID0gb3JpZ1dpZHRoIC0gZHg7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aWR0aCA9IG9yaWdXaWR0aCArIGR4OwogICAgICAgICAgfQogICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgbWluV2lkdGgpOwogICAgICAgICAgd2lkdGggPSBNYXRoLm1pbih3aWR0aCwgbWF4V2lkdGgpOwogICAgICAgICAgX3RoaXMuZGl2aWRlcldpZHRoID0gd2lkdGg7CiAgICAgICAgICBfdGhpcy5wb3NpdGlvbkRpdmlkZXIod2lkdGgpOwogICAgICAgICAgcmV0dXJuIF90aGlzLnVwZGF0ZVdpZHRoKCk7CiAgICAgICAgfTsKICAgICAgfSkodGhpcyksCiAgICAgIGRyYWdFbmQ6IChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5kaXZpZGVyRWxzLnJlbW92ZUNsYXNzKCdmYy1hY3RpdmUnKTsKICAgICAgICB9OwogICAgICB9KSh0aGlzKQogICAgfSk7CiAgICByZXR1cm4gZHJhZ0xpc3RlbmVyLnN0YXJ0SW50ZXJhY3Rpb24oZXYpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5nZXROYXR1cmFsRGl2aWRlcldpZHRoID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5lbC5maW5kKCcuZmMtcmVzb3VyY2UtYXJlYScpLndpZHRoKCk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnBvc2l0aW9uRGl2aWRlciA9IGZ1bmN0aW9uKHcpIHsKICAgIHJldHVybiB0aGlzLmVsLmZpbmQoJy5mYy1yZXNvdXJjZS1hcmVhJykud2lkdGgodyk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJlbmRlckV2ZW50cyA9IGZ1bmN0aW9uKGV2ZW50cykgewogICAgdGhpcy50aW1lR3JpZC5yZW5kZXJFdmVudHMoZXZlbnRzKTsKICAgIHRoaXMuc3luY1Jvd0hlaWdodHMoKTsKICAgIHJldHVybiB0aGlzLnVwZGF0ZVdpZHRoKCk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnVucmVuZGVyRXZlbnRzID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnRpbWVHcmlkLnVucmVuZGVyRXZlbnRzKCk7CiAgICB0aGlzLnN5bmNSb3dIZWlnaHRzKCk7CiAgICByZXR1cm4gdGhpcy51cGRhdGVXaWR0aCgpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS51cGRhdGVXaWR0aCA9IGZ1bmN0aW9uKCkgewogICAgUmVzb3VyY2VUaW1lbGluZVZpZXcuX19zdXBlcl9fLnVwZGF0ZVdpZHRoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB0aGlzLnJlc291cmNlR3JpZC51cGRhdGVXaWR0aCgpOwogICAgdGhpcy5qb2luZXIudXBkYXRlKCk7CiAgICBpZiAodGhpcy5jZWxsRm9sbG93ZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuY2VsbEZvbGxvd2VyLnVwZGF0ZSgpOwogICAgfQogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS51cGRhdGVIZWlnaHQgPSBmdW5jdGlvbihpc1Jlc2l6ZSkgewogICAgUmVzb3VyY2VUaW1lbGluZVZpZXcuX19zdXBlcl9fLnVwZGF0ZUhlaWdodC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKGlzUmVzaXplKSB7CiAgICAgIHJldHVybiB0aGlzLnN5bmNSb3dIZWlnaHRzKCk7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnNldEhlaWdodCA9IGZ1bmN0aW9uKHRvdGFsSGVpZ2h0LCBpc0F1dG8pIHsKICAgIHZhciBib2R5SGVpZ2h0LCBoZWFkSGVpZ2h0OwogICAgaGVhZEhlaWdodCA9IHRoaXMuc3luY0hlYWRIZWlnaHRzKCk7CiAgICBpZiAoaXNBdXRvKSB7CiAgICAgIGJvZHlIZWlnaHQgPSAnYXV0byc7CiAgICB9IGVsc2UgewogICAgICBib2R5SGVpZ2h0ID0gdG90YWxIZWlnaHQgLSBoZWFkSGVpZ2h0IC0gdGhpcy5xdWVyeU1pc2NIZWlnaHQoKTsKICAgIH0KICAgIHRoaXMudGltZUdyaWQuYm9keVNjcm9sbGVyLnNldEhlaWdodChib2R5SGVpZ2h0KTsKICAgIHJldHVybiB0aGlzLnJlc291cmNlR3JpZC5ib2R5U2Nyb2xsZXIuc2V0SGVpZ2h0KGJvZHlIZWlnaHQpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5xdWVyeU1pc2NIZWlnaHQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmVsLm91dGVySGVpZ2h0KCkgLSBNYXRoLm1heCh0aGlzLnJlc291cmNlR3JpZC5oZWFkU2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSwgdGhpcy50aW1lR3JpZC5oZWFkU2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSkgLSBNYXRoLm1heCh0aGlzLnJlc291cmNlR3JpZC5ib2R5U2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSwgdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnN5bmNIZWFkSGVpZ2h0cyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGhlYWRIZWlnaHQ7CiAgICB0aGlzLnJlc291cmNlR3JpZC5oZWFkSGVpZ2h0KCdhdXRvJyk7CiAgICB0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQoJ2F1dG8nKTsKICAgIGhlYWRIZWlnaHQgPSBNYXRoLm1heCh0aGlzLnJlc291cmNlR3JpZC5oZWFkSGVpZ2h0KCksIHRoaXMudGltZUdyaWQuaGVhZEhlaWdodCgpKTsKICAgIHRoaXMucmVzb3VyY2VHcmlkLmhlYWRIZWlnaHQoaGVhZEhlaWdodCk7CiAgICB0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQoaGVhZEhlaWdodCk7CiAgICByZXR1cm4gaGVhZEhlaWdodDsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuc2Nyb2xsVG9SZXNvdXJjZSA9IGZ1bmN0aW9uKHJlc291cmNlKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5zY3JvbGxUb1Jlc291cmNlKHJlc291cmNlKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuc2V0UmVzb3VyY2VzID0gZnVuY3Rpb24ocmVzb3VyY2VzKSB7CiAgICB2YXIgaiwgbGVuLCByZXNvdXJjZTsKICAgIHRoaXMuYmF0Y2hSb3dzKCk7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZXNvdXJjZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZXNbal07CiAgICAgIHRoaXMuaW5zZXJ0UmVzb3VyY2UocmVzb3VyY2UpOwogICAgfQogICAgdGhpcy5yb3dIaWVyYXJjaHkuc2hvdygpOwogICAgdGhpcy51bmJhdGNoUm93cygpOwogICAgcmV0dXJuIHRoaXMucmVpbml0aWFsaXplQ2VsbEZvbGxvd2VycygpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS51bnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jbGVhckV2ZW50cygpOwogICAgdGhpcy5iYXRjaFJvd3MoKTsKICAgIHRoaXMucm93SGllcmFyY2h5LnJlbW92ZUNoaWxkcmVuKCk7CiAgICB0aGlzLnVuYmF0Y2hSb3dzKCk7CiAgICByZXR1cm4gdGhpcy5yZWluaXRpYWxpemVDZWxsRm9sbG93ZXJzKCk7CiAgfTsKCgogIC8qCiAgCVRPRE86IHRoZSBzY2VuYXJpbyB3aGVyZSB0aGVyZSB3ZXJlIHByZXZpb3VzbHkgdW5hc3NvY2lhdGVkIGV2ZW50cyB0aGF0IGFyZSBub3cKICAJIGF0dGFjaGVkIHRvIHRoaXMgcmVzb3VyY2UuIHNob3VsZCByZW5kZXIgdGhvc2UgZXZlbnRzIGltbWVkaWF0ZWx5LgogIAogIAlSZXNwb25zaWJsZSBmb3IgcmVuZGVyaW5nIHRoZSBuZXcgcmVzb3VyY2UKICAgKi8KCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmFkZFJlc291cmNlID0gZnVuY3Rpb24ocmVzb3VyY2UpIHsKICAgIHRoaXMuaW5zZXJ0UmVzb3VyY2UocmVzb3VyY2UpOwogICAgcmV0dXJuIHRoaXMucmVpbml0aWFsaXplQ2VsbEZvbGxvd2VycygpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW1vdmVSZXNvdXJjZSA9IGZ1bmN0aW9uKHJlc291cmNlKSB7CiAgICB2YXIgcm93OwogICAgcm93ID0gdGhpcy5nZXRSZXNvdXJjZVJvdyhyZXNvdXJjZS5pZCk7CiAgICBpZiAocm93KSB7CiAgICAgIHRoaXMuYmF0Y2hSb3dzKCk7CiAgICAgIHJvdy5yZW1vdmUoKTsKICAgICAgdGhpcy51bmJhdGNoUm93cygpOwogICAgICByZXR1cm4gdGhpcy5yZWluaXRpYWxpemVDZWxsRm9sbG93ZXJzKCk7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmNlbGxGb2xsb3dlciA9IG51bGw7CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZWluaXRpYWxpemVDZWxsRm9sbG93ZXJzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgY2VsbENvbnRlbnQsIGosIGxlbiwgbm9kZXMsIHJlZiwgcm93OwogICAgaWYgKHRoaXMuY2VsbEZvbGxvd2VyKSB7CiAgICAgIHRoaXMuY2VsbEZvbGxvd2VyLmNsZWFyU3ByaXRlcygpOwogICAgfQogICAgdGhpcy5jZWxsRm9sbG93ZXIgPSBuZXcgU2Nyb2xsRm9sbG93ZXIodGhpcy5yZXNvdXJjZUdyaWQuYm9keVNjcm9sbGVyLCB0aGlzLmNhbGVuZGFyLmlzVG91Y2gpOwogICAgdGhpcy5jZWxsRm9sbG93ZXIuaXNIRm9sbG93aW5nID0gZmFsc2U7CiAgICB0aGlzLmNlbGxGb2xsb3dlci5pc1ZGb2xsb3dpbmcgPSB0cnVlOwogICAgbm9kZXMgPSBbXTsKICAgIHJlZiA9IHRoaXMucm93SGllcmFyY2h5LmdldE5vZGVzKCk7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcm93ID0gcmVmW2pdOwogICAgICBpZiAocm93IGluc3RhbmNlb2YgVlJvd0dyb3VwKSB7CiAgICAgICAgaWYgKHJvdy5ncm91cFRkKSB7CiAgICAgICAgICBjZWxsQ29udGVudCA9IHJvdy5ncm91cFRkLmZpbmQoJy5mYy1jZWxsLWNvbnRlbnQnKTsKICAgICAgICAgIGlmIChjZWxsQ29udGVudC5sZW5ndGgpIHsKICAgICAgICAgICAgbm9kZXMucHVzaChjZWxsQ29udGVudFswXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy5jZWxsRm9sbG93ZXIuc2V0U3ByaXRlcygkKG5vZGVzKSk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmluc2VydFJlc291cmNlID0gZnVuY3Rpb24ocmVzb3VyY2UsIHBhcmVudFJlc291cmNlUm93KSB7CiAgICB2YXIgY2hpbGRSZXNvdXJjZSwgaiwgbGVuLCBwYXJlbnRJZCwgcmVmLCByZXN1bHRzLCByb3c7CiAgICByb3cgPSBuZXcgUmVzb3VyY2VSb3codGhpcywgcmVzb3VyY2UpOwogICAgaWYgKHBhcmVudFJlc291cmNlUm93ID09IG51bGwpIHsKICAgICAgcGFyZW50SWQgPSByZXNvdXJjZS5wYXJlbnRJZDsKICAgICAgaWYgKHBhcmVudElkKSB7CiAgICAgICAgcGFyZW50UmVzb3VyY2VSb3cgPSB0aGlzLmdldFJlc291cmNlUm93KHBhcmVudElkKTsKICAgICAgfQogICAgfQogICAgaWYgKHBhcmVudFJlc291cmNlUm93KSB7CiAgICAgIHRoaXMuaW5zZXJ0Um93QXNDaGlsZChyb3csIHBhcmVudFJlc291cmNlUm93KTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuaW5zZXJ0Um93KHJvdyk7CiAgICB9CiAgICByZWYgPSByZXNvdXJjZS5jaGlsZHJlbjsKICAgIHJlc3VsdHMgPSBbXTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBjaGlsZFJlc291cmNlID0gcmVmW2pdOwogICAgICByZXN1bHRzLnB1c2godGhpcy5pbnNlcnRSZXNvdXJjZShjaGlsZFJlc291cmNlLCByb3cpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5pbnNlcnRSb3cgPSBmdW5jdGlvbihyb3csIHBhcmVudCwgZ3JvdXBTcGVjcykgewogICAgdmFyIGdyb3VwOwogICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CiAgICAgIHBhcmVudCA9IHRoaXMucm93SGllcmFyY2h5OwogICAgfQogICAgaWYgKGdyb3VwU3BlY3MgPT0gbnVsbCkgewogICAgICBncm91cFNwZWNzID0gdGhpcy5ncm91cFNwZWNzOwogICAgfQogICAgaWYgKGdyb3VwU3BlY3MubGVuZ3RoKSB7CiAgICAgIGdyb3VwID0gdGhpcy5lbnN1cmVSZXNvdXJjZUdyb3VwKHJvdywgcGFyZW50LCBncm91cFNwZWNzWzBdKTsKICAgICAgaWYgKGdyb3VwIGluc3RhbmNlb2YgSFJvd0dyb3VwKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0Um93QXNDaGlsZChyb3csIGdyb3VwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRSb3cocm93LCBncm91cCwgZ3JvdXBTcGVjcy5zbGljZSgxKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmluc2VydFJvd0FzQ2hpbGQocm93LCBwYXJlbnQpOwogICAgfQogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5pbnNlcnRSb3dBc0NoaWxkID0gZnVuY3Rpb24ocm93LCBwYXJlbnQpIHsKICAgIHJldHVybiBwYXJlbnQuYWRkQ2hpbGQocm93LCB0aGlzLmNvbXB1dGVDaGlsZFJvd1Bvc2l0aW9uKHJvdywgcGFyZW50KSk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmNvbXB1dGVDaGlsZFJvd1Bvc2l0aW9uID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgewogICAgdmFyIGNtcCwgaSwgaiwgbGVuLCByZWYsIHNpYmxpbmc7CiAgICBpZiAodGhpcy5vcmRlclNwZWNzLmxlbmd0aCkgewogICAgICByZWYgPSBwYXJlbnQuY2hpbGRyZW47CiAgICAgIGZvciAoaSA9IGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBpID0gKytqKSB7CiAgICAgICAgc2libGluZyA9IHJlZltpXTsKICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmVSZXNvdXJjZXMoc2libGluZy5yZXNvdXJjZSB8fCB7fSwgY2hpbGQucmVzb3VyY2UgfHwge30pOwogICAgICAgIGlmIChjbXAgPiAwKSB7CiAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5jb21wYXJlUmVzb3VyY2VzID0gZnVuY3Rpb24oYSwgYikgewogICAgcmV0dXJuIGNvbXBhcmVCeUZpZWxkU3BlY3MoYSwgYiwgdGhpcy5vcmRlclNwZWNzKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuZW5zdXJlUmVzb3VyY2VHcm91cCA9IGZ1bmN0aW9uKHJvdywgcGFyZW50LCBzcGVjKSB7CiAgICB2YXIgY21wLCBncm91cCwgZ3JvdXBWYWx1ZSwgaSwgaiwgaywgbGVuLCBsZW4xLCByZWYsIHJlZjEsIHRlc3RHcm91cDsKICAgIGdyb3VwVmFsdWUgPSAocm93LnJlc291cmNlIHx8IHt9KVtzcGVjLmZpZWxkXTsKICAgIGdyb3VwID0gbnVsbDsKICAgIGlmIChzcGVjLm9yZGVyKSB7CiAgICAgIHJlZiA9IHBhcmVudC5jaGlsZHJlbjsKICAgICAgZm9yIChpID0gaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGkgPSArK2opIHsKICAgICAgICB0ZXN0R3JvdXAgPSByZWZbaV07CiAgICAgICAgY21wID0gZmxleGlibGVDb21wYXJlKHRlc3RHcm91cC5ncm91cFZhbHVlLCBncm91cFZhbHVlKSAqIHNwZWMub3JkZXI7CiAgICAgICAgaWYgKGNtcCA9PT0gMCkgewogICAgICAgICAgZ3JvdXAgPSB0ZXN0R3JvdXA7CiAgICAgICAgICBicmVhazsKICAgICAgICB9IGVsc2UgaWYgKGNtcCA+IDApIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVmMSA9IHBhcmVudC5jaGlsZHJlbjsKICAgICAgZm9yIChpID0gayA9IDAsIGxlbjEgPSByZWYxLmxlbmd0aDsgayA8IGxlbjE7IGkgPSArK2spIHsKICAgICAgICB0ZXN0R3JvdXAgPSByZWYxW2ldOwogICAgICAgIGlmICh0ZXN0R3JvdXAuZ3JvdXBWYWx1ZSA9PT0gZ3JvdXBWYWx1ZSkgewogICAgICAgICAgZ3JvdXAgPSB0ZXN0R3JvdXA7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICghZ3JvdXApIHsKICAgICAgaWYgKHRoaXMuaXNWR3JvdXBpbmcpIHsKICAgICAgICBncm91cCA9IG5ldyBWUm93R3JvdXAodGhpcywgc3BlYywgZ3JvdXBWYWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZ3JvdXAgPSBuZXcgSFJvd0dyb3VwKHRoaXMsIHNwZWMsIGdyb3VwVmFsdWUpOwogICAgICB9CiAgICAgIHBhcmVudC5hZGRDaGlsZChncm91cCwgaSk7CiAgICB9CiAgICByZXR1cm4gZ3JvdXA7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnBhaXJTZWdzV2l0aFJvd3MgPSBmdW5jdGlvbihzZWdzKSB7CiAgICB2YXIgaiwgbGVuLCBwYWlyLCBwYWlycywgcGFpcnNCeUlkLCByZXNvdXJjZUlkLCByb3dPYmosIHNlZzsKICAgIHBhaXJzID0gW107CiAgICBwYWlyc0J5SWQgPSB7fTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHNlZ3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgc2VnID0gc2Vnc1tqXTsKICAgICAgcmVzb3VyY2VJZCA9IHNlZy5yZXNvdXJjZUlkOwogICAgICBpZiAocmVzb3VyY2VJZCkgewogICAgICAgIHJvd09iaiA9IHRoaXMuZ2V0UmVzb3VyY2VSb3cocmVzb3VyY2VJZCk7CiAgICAgICAgaWYgKHJvd09iaikgewogICAgICAgICAgcGFpciA9IHBhaXJzQnlJZFtyZXNvdXJjZUlkXTsKICAgICAgICAgIGlmICghcGFpcikgewogICAgICAgICAgICBwYWlyID0gW3Jvd09iaiwgW11dOwogICAgICAgICAgICBwYWlycy5wdXNoKHBhaXIpOwogICAgICAgICAgICBwYWlyc0J5SWRbcmVzb3VyY2VJZF0gPSBwYWlyOwogICAgICAgICAgfQogICAgICAgICAgcGFpclsxXS5wdXNoKHNlZyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGFpcnM7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJvd0FkZGVkID0gZnVuY3Rpb24ocm93KSB7CiAgICB2YXIgaXNOZXN0aW5nLCB3YXNOZXN0aW5nOwogICAgaWYgKHJvdyBpbnN0YW5jZW9mIFJlc291cmNlUm93KSB7CiAgICAgIHRoaXMucmVzb3VyY2VSb3dIYXNoW3Jvdy5yZXNvdXJjZS5pZF0gPSByb3c7CiAgICAgIHRoaXMudGltZUdyaWQuYXNzaWduUm93QnVzaW5lc3NIb3VyU2Vncyhyb3cpOwogICAgfQogICAgd2FzTmVzdGluZyA9IHRoaXMuaXNOZXN0aW5nOwogICAgaXNOZXN0aW5nID0gQm9vbGVhbih0aGlzLm5lc3RpbmdDbnQgKz0gcm93LmRlcHRoID8gMSA6IDApOwogICAgaWYgKHdhc05lc3RpbmcgIT09IGlzTmVzdGluZykgewogICAgICB0aGlzLmVsLnRvZ2dsZUNsYXNzKCdmYy1uZXN0ZWQnLCBpc05lc3RpbmcpOwogICAgICB0aGlzLmVsLnRvZ2dsZUNsYXNzKCdmYy1mbGF0JywgIWlzTmVzdGluZyk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5pc05lc3RpbmcgPSBpc05lc3Rpbmc7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJvd1JlbW92ZWQgPSBmdW5jdGlvbihyb3cpIHsKICAgIHZhciBpc05lc3RpbmcsIHdhc05lc3Rpbmc7CiAgICBpZiAocm93IGluc3RhbmNlb2YgUmVzb3VyY2VSb3cpIHsKICAgICAgZGVsZXRlIHRoaXMucmVzb3VyY2VSb3dIYXNoW3Jvdy5yZXNvdXJjZS5pZF07CiAgICAgIHRoaXMudGltZUdyaWQuZGVzdHJveVJvd0J1c2luZXNzSG91clNlZ3Mocm93KTsKICAgIH0KICAgIHdhc05lc3RpbmcgPSB0aGlzLmlzTmVzdGluZzsKICAgIGlzTmVzdGluZyA9IEJvb2xlYW4odGhpcy5uZXN0aW5nQ250IC09IHJvdy5kZXB0aCA/IDEgOiAwKTsKICAgIGlmICh3YXNOZXN0aW5nICE9PSBpc05lc3RpbmcpIHsKICAgICAgdGhpcy5lbC50b2dnbGVDbGFzcygnZmMtbmVzdGVkJywgaXNOZXN0aW5nKTsKICAgICAgdGhpcy5lbC50b2dnbGVDbGFzcygnZmMtZmxhdCcsICFpc05lc3RpbmcpOwogICAgfQogICAgcmV0dXJuIHRoaXMuaXNOZXN0aW5nID0gaXNOZXN0aW5nOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5iYXRjaFJvd0RlcHRoID0gMDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnNob3duUm93QmF0Y2ggPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuaGlkZGVuUm93QmF0Y2ggPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuYmF0Y2hSb3dzID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoISh0aGlzLmJhdGNoUm93RGVwdGgrKykpIHsKICAgICAgdGhpcy5zaG93blJvd0JhdGNoID0gW107CiAgICAgIHJldHVybiB0aGlzLmhpZGRlblJvd0JhdGNoID0gW107CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnVuYmF0Y2hSb3dzID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoISgtLXRoaXMuYmF0Y2hSb3dEZXB0aCkpIHsKICAgICAgaWYgKHRoaXMuaGlkZGVuUm93QmF0Y2gubGVuZ3RoKSB7CiAgICAgICAgdGhpcy5yb3dzSGlkZGVuKHRoaXMuaGlkZGVuUm93QmF0Y2gpOwogICAgICB9CiAgICAgIGlmICh0aGlzLnNob3duUm93QmF0Y2gubGVuZ3RoKSB7CiAgICAgICAgdGhpcy5yb3dzU2hvd24odGhpcy5zaG93blJvd0JhdGNoKTsKICAgICAgfQogICAgICB0aGlzLmhpZGRlblJvd0JhdGNoID0gbnVsbDsKICAgICAgcmV0dXJuIHRoaXMuc2hvd25Sb3dCYXRjaCA9IG51bGw7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJvd1Nob3duID0gZnVuY3Rpb24ocm93KSB7CiAgICBpZiAodGhpcy5zaG93blJvd0JhdGNoKSB7CiAgICAgIHJldHVybiB0aGlzLnNob3duUm93QmF0Y2gucHVzaChyb3cpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHRoaXMucm93c1Nob3duKFtyb3ddKTsKICAgIH0KICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUucm93SGlkZGVuID0gZnVuY3Rpb24ocm93KSB7CiAgICBpZiAodGhpcy5oaWRkZW5Sb3dCYXRjaCkgewogICAgICByZXR1cm4gdGhpcy5oaWRkZW5Sb3dCYXRjaC5wdXNoKHJvdyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdGhpcy5yb3dzSGlkZGVuKFtyb3ddKTsKICAgIH0KICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUucm93c1Nob3duID0gZnVuY3Rpb24ocm93cykgewogICAgdGhpcy5zeW5jUm93SGVpZ2h0cyhyb3dzKTsKICAgIHJldHVybiB0aGlzLnVwZGF0ZVdpZHRoKCk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJvd3NIaWRkZW4gPSBmdW5jdGlvbihyb3dzKSB7CiAgICByZXR1cm4gdGhpcy51cGRhdGVXaWR0aCgpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5zeW5jUm93SGVpZ2h0cyA9IGZ1bmN0aW9uKHZpc2libGVSb3dzLCBzYWZlKSB7CiAgICB2YXIgaCwgaDEsIGgyLCBpLCBpbm5lckhlaWdodHMsIGosIGssIGxlbiwgbGVuMSwgcm93OwogICAgaWYgKHNhZmUgPT0gbnVsbCkgewogICAgICBzYWZlID0gZmFsc2U7CiAgICB9CiAgICBpZiAodmlzaWJsZVJvd3MgPT0gbnVsbCkgewogICAgICB2aXNpYmxlUm93cyA9IHRoaXMuZ2V0VmlzaWJsZVJvd3MoKTsKICAgIH0KICAgIGZvciAoaiA9IDAsIGxlbiA9IHZpc2libGVSb3dzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHJvdyA9IHZpc2libGVSb3dzW2pdOwogICAgICByb3cuc2V0VHJJbm5lckhlaWdodCgnJyk7CiAgICB9CiAgICBpbm5lckhlaWdodHMgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBrLCBsZW4xLCByZXN1bHRzOwogICAgICByZXN1bHRzID0gW107CiAgICAgIGZvciAoayA9IDAsIGxlbjEgPSB2aXNpYmxlUm93cy5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgICByb3cgPSB2aXNpYmxlUm93c1trXTsKICAgICAgICBoID0gcm93LmdldE1heFRySW5uZXJIZWlnaHQoKTsKICAgICAgICBpZiAoc2FmZSkgewogICAgICAgICAgaCArPSBoICUgMjsKICAgICAgICB9CiAgICAgICAgcmVzdWx0cy5wdXNoKGgpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHRzOwogICAgfSkoKTsKICAgIGZvciAoaSA9IGsgPSAwLCBsZW4xID0gdmlzaWJsZVJvd3MubGVuZ3RoOyBrIDwgbGVuMTsgaSA9ICsraykgewogICAgICByb3cgPSB2aXNpYmxlUm93c1tpXTsKICAgICAgcm93LnNldFRySW5uZXJIZWlnaHQoaW5uZXJIZWlnaHRzW2ldKTsKICAgIH0KICAgIGlmICghc2FmZSkgewogICAgICBoMSA9IHRoaXMucmVzb3VyY2VHcmlkLnRib2R5RWwuaGVpZ2h0KCk7CiAgICAgIGgyID0gdGhpcy50aW1lR3JpZC50Ym9keUVsLmhlaWdodCgpOwogICAgICBpZiAoTWF0aC5hYnMoaDEgLSBoMikgPiAxKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3luY1Jvd0hlaWdodHModmlzaWJsZVJvd3MsIHRydWUpOwogICAgICB9CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmdldFZpc2libGVSb3dzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCByZWYsIHJlc3VsdHMsIHJvdzsKICAgIHJlZiA9IHRoaXMucm93SGllcmFyY2h5LmdldFJvd3MoKTsKICAgIHJlc3VsdHMgPSBbXTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByb3cgPSByZWZbal07CiAgICAgIGlmIChyb3cuaXNTaG93bikgewogICAgICAgIHJlc3VsdHMucHVzaChyb3cpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuZ2V0RXZlbnRSb3dzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCByZWYsIHJlc3VsdHMsIHJvdzsKICAgIHJlZiA9IHRoaXMucm93SGllcmFyY2h5LmdldFJvd3MoKTsKICAgIHJlc3VsdHMgPSBbXTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByb3cgPSByZWZbal07CiAgICAgIGlmIChyb3cgaW5zdGFuY2VvZiBFdmVudFJvdykgewogICAgICAgIHJlc3VsdHMucHVzaChyb3cpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuZ2V0UmVzb3VyY2VSb3cgPSBmdW5jdGlvbihyZXNvdXJjZUlkKSB7CiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVJvd0hhc2hbcmVzb3VyY2VJZF07CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnNldFNjcm9sbCA9IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICBSZXNvdXJjZVRpbWVsaW5lVmlldy5fX3N1cGVyX18uc2V0U2Nyb2xsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUdyaWQuYm9keVNjcm9sbGVyLnNldFNjcm9sbFRvcChzdGF0ZS50b3ApOwogIH07CgogIHJldHVybiBSZXNvdXJjZVRpbWVsaW5lVmlldzsKCn0pKFRpbWVsaW5lVmlldyk7CgpSZXNvdXJjZVRpbWVsaW5lR3JpZCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKFJlc291cmNlVGltZWxpbmVHcmlkLCBzdXBlckNsYXNzKTsKCiAgZnVuY3Rpb24gUmVzb3VyY2VUaW1lbGluZUdyaWQoKSB7CiAgICByZXR1cm4gUmVzb3VyY2VUaW1lbGluZUdyaWQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5taXhpbihSZXNvdXJjZUdyaWRNaXhpbik7CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5ldmVudFJvd3MgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc2hvd25FdmVudFJvd3MgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUudGJvZHlFbCA9IG51bGw7CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yb3dDb29yZENhY2hlID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLnNwYW5Ub1NlZ3MgPSBmdW5jdGlvbihzcGFuKSB7CiAgICB2YXIgY2FsZW5kYXIsIGosIGxlbiwgcmVzb3VyY2VJZCwgc2VnLCBzZWdzOwogICAgc2VncyA9IFJlc291cmNlVGltZWxpbmVHcmlkLl9fc3VwZXJfXy5zcGFuVG9TZWdzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBjYWxlbmRhciA9IHRoaXMudmlldy5jYWxlbmRhcjsKICAgIHJlc291cmNlSWQgPSBzcGFuLnJlc291cmNlSWQ7CiAgICBpZiAocmVzb3VyY2VJZCkgewogICAgICBmb3IgKGogPSAwLCBsZW4gPSBzZWdzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgc2VnID0gc2Vnc1tqXTsKICAgICAgICBzZWcucmVzb3VyY2UgPSBjYWxlbmRhci5nZXRSZXNvdXJjZUJ5SWQocmVzb3VyY2VJZCk7CiAgICAgICAgc2VnLnJlc291cmNlSWQgPSByZXNvdXJjZUlkOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2VnczsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucHJlcGFyZUhpdHMgPSBmdW5jdGlvbigpIHsKICAgIHZhciByb3csIHRyQXJyYXk7CiAgICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18ucHJlcGFyZUhpdHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMuZXZlbnRSb3dzID0gdGhpcy52aWV3LmdldEV2ZW50Um93cygpOwogICAgdGhpcy5zaG93bkV2ZW50Um93cyA9IChmdW5jdGlvbigpIHsKICAgICAgdmFyIGosIGxlbiwgcmVmLCByZXN1bHRzOwogICAgICByZWYgPSB0aGlzLmV2ZW50Um93czsKICAgICAgcmVzdWx0cyA9IFtdOwogICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICByb3cgPSByZWZbal07CiAgICAgICAgaWYgKHJvdy5pc1Nob3duKSB7CiAgICAgICAgICByZXN1bHRzLnB1c2gocm93KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9KS5jYWxsKHRoaXMpOwogICAgdHJBcnJheSA9IChmdW5jdGlvbigpIHsKICAgICAgdmFyIGosIGxlbiwgcmVmLCByZXN1bHRzOwogICAgICByZWYgPSB0aGlzLnNob3duRXZlbnRSb3dzOwogICAgICByZXN1bHRzID0gW107CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICAgIHJvdyA9IHJlZltqXTsKICAgICAgICByZXN1bHRzLnB1c2gocm93LmdldFRyKCdldmVudCcpWzBdKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pLmNhbGwodGhpcyk7CiAgICB0aGlzLnJvd0Nvb3JkQ2FjaGUgPSBuZXcgQ29vcmRDYWNoZSh7CiAgICAgIGVsczogdHJBcnJheSwKICAgICAgaXNWZXJ0aWNhbDogdHJ1ZQogICAgfSk7CiAgICByZXR1cm4gdGhpcy5yb3dDb29yZENhY2hlLmJ1aWxkKCk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLnJlbGVhc2VIaXRzID0gZnVuY3Rpb24oKSB7CiAgICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18ucmVsZWFzZUhpdHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMuZXZlbnRSb3dzID0gbnVsbDsKICAgIHRoaXMuc2hvd25FdmVudFJvd3MgPSBudWxsOwogICAgcmV0dXJuIHRoaXMucm93Q29vcmRDYWNoZS5jbGVhcigpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5xdWVyeUhpdCA9IGZ1bmN0aW9uKGxlZnRPZmZzZXQsIHRvcE9mZnNldCkgewogICAgdmFyIHJvd0luZGV4LCBzaW1wbGVIaXQ7CiAgICBzaW1wbGVIaXQgPSBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18ucXVlcnlIaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmIChzaW1wbGVIaXQpIHsKICAgICAgcm93SW5kZXggPSB0aGlzLnJvd0Nvb3JkQ2FjaGUuZ2V0VmVydGljYWxJbmRleCh0b3BPZmZzZXQpOwogICAgICBpZiAocm93SW5kZXggIT0gbnVsbCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICByZXNvdXJjZUlkOiB0aGlzLnNob3duRXZlbnRSb3dzW3Jvd0luZGV4XS5yZXNvdXJjZS5pZCwKICAgICAgICAgIHNuYXA6IHNpbXBsZUhpdC5zbmFwLAogICAgICAgICAgY29tcG9uZW50OiB0aGlzLAogICAgICAgICAgbGVmdDogc2ltcGxlSGl0LmxlZnQsCiAgICAgICAgICByaWdodDogc2ltcGxlSGl0LnJpZ2h0LAogICAgICAgICAgdG9wOiB0aGlzLnJvd0Nvb3JkQ2FjaGUuZ2V0VG9wT2Zmc2V0KHJvd0luZGV4KSwKICAgICAgICAgIGJvdHRvbTogdGhpcy5yb3dDb29yZENhY2hlLmdldEJvdHRvbU9mZnNldChyb3dJbmRleCkKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLmdldEhpdFNwYW4gPSBmdW5jdGlvbihoaXQpIHsKICAgIHZhciBzcGFuOwogICAgc3BhbiA9IHRoaXMuZ2V0U25hcFJhbmdlKGhpdC5zbmFwKTsKICAgIHNwYW4ucmVzb3VyY2VJZCA9IGhpdC5yZXNvdXJjZUlkOwogICAgcmV0dXJuIHNwYW47CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLmdldEhpdEVsID0gZnVuY3Rpb24oaGl0KSB7CiAgICByZXR1cm4gdGhpcy5nZXRTbmFwRWwoaGl0LnNuYXApOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbiA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHJvd0NvbnRhaW5lckVsOwogICAgUmVzb3VyY2VUaW1lbGluZUdyaWQuX19zdXBlcl9fLnJlbmRlclNrZWxldG9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB0aGlzLnNlZ0NvbnRhaW5lckVsLnJlbW92ZSgpOwogICAgdGhpcy5zZWdDb250YWluZXJFbCA9IG51bGw7CiAgICByb3dDb250YWluZXJFbCA9ICQoJzxkaXYgY2xhc3M9ImZjLXJvd3MiPjx0YWJsZT48dGJvZHkvPjwvdGFibGU+PC9kaXY+JykuYXBwZW5kVG8odGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbCk7CiAgICByZXR1cm4gdGhpcy50Ym9keUVsID0gcm93Q29udGFpbmVyRWwuZmluZCgndGJvZHknKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyRmdTZWdzID0gZnVuY3Rpb24oc2VncykgewogICAgdmFyIGNvbnRhaW5lck9iaiwgY29udGFpbmVyU2VncywgaiwgbGVuLCBwYWlyLCBwYWlycywgdmlzaWJsZVBhaXJzOwogICAgc2VncyA9IHRoaXMucmVuZGVyRmdTZWdFbHMoc2Vncyk7CiAgICBwYWlycyA9IHRoaXMudmlldy5wYWlyU2Vnc1dpdGhSb3dzKHNlZ3MpOwogICAgdmlzaWJsZVBhaXJzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSBwYWlycy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBwYWlyID0gcGFpcnNbal07CiAgICAgIGNvbnRhaW5lck9iaiA9IHBhaXJbMF0sIGNvbnRhaW5lclNlZ3MgPSBwYWlyWzFdOwogICAgICBjb250YWluZXJPYmouZmdTZWdzID0gY29udGFpbmVyU2VnczsKICAgICAgaWYgKGNvbnRhaW5lck9iai5pc1Nob3duKSB7CiAgICAgICAgY29udGFpbmVyT2JqLmlzU2Vnc1JlbmRlcmVkID0gdHJ1ZTsKICAgICAgICB2aXNpYmxlUGFpcnMucHVzaChwYWlyKTsKICAgICAgfQogICAgfQogICAgdGhpcy5yZW5kZXJGZ1NlZ3NJbkNvbnRhaW5lcnModmlzaWJsZVBhaXJzKTsKICAgIHRoaXMudXBkYXRlU2VnRm9sbG93ZXJzKHNlZ3MpOwogICAgcmV0dXJuIHNlZ3M7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLnVucmVuZGVyRmdTZWdzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZXZlbnRSb3csIGV2ZW50Um93cywgaiwgbGVuOwogICAgdGhpcy5jbGVhclNlZ0ZvbGxvd2VycygpOwogICAgZXZlbnRSb3dzID0gdGhpcy52aWV3LmdldEV2ZW50Um93cygpOwogICAgZm9yIChqID0gMCwgbGVuID0gZXZlbnRSb3dzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGV2ZW50Um93ID0gZXZlbnRSb3dzW2pdOwogICAgICBldmVudFJvdy5mZ1NlZ3MgPSBudWxsOwogICAgICBldmVudFJvdy5pc1NlZ3NSZW5kZXJlZCA9IGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRoaXMudW5yZW5kZXJGZ0NvbnRhaW5lcnMoZXZlbnRSb3dzKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMgPSAwOwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyQnVzaW5lc3NIb3VycyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMpIHsKICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlSW5kaXZpZHVhbEJ1c2luZXNzSG91cnMoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18ucmVuZGVyQnVzaW5lc3NIb3Vycy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfQogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS51bnJlbmRlckJ1c2luZXNzSG91cnMgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnJvd0NudFdpdGhDdXN0b21CdXNpbmVzc0hvdXJzKSB7CiAgICAgIHJldHVybiB0aGlzLmNsZWFySW5kaXZpZHVhbEJ1c2luZXNzSG91cnMoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18udW5yZW5kZXJCdXNpbmVzc0hvdXJzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfTsKCgogIC8qCiAgCUVuc3VyZXMgdGhhdCBhbGwgcm93cyBoYXZlIHRoZWlyIGluZGl2aWR1YWwgYnVzaW5lc3MgaG91cnMgRElTUExBWUVELgogICAqLwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZW5zdXJlSW5kaXZpZHVhbEJ1c2luZXNzSG91cnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBqLCBsZW4sIHJlZiwgcmVzdWx0cywgcm93OwogICAgcmVmID0gdGhpcy52aWV3LmdldEV2ZW50Um93cygpOwogICAgcmVzdWx0cyA9IFtdOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHJvdyA9IHJlZltqXTsKICAgICAgaWYgKCFyb3cuYnVzaW5lc3NIb3VyU2VncykgewogICAgICAgIHRoaXMucG9wdWxhdGVSb3dCdXNpbmVzc0hvdXJzU2Vncyhyb3cpOwogICAgICB9CiAgICAgIGlmIChyb3cuaXNTaG93bikgewogICAgICAgIHJlc3VsdHMucHVzaChyb3cuZW5zdXJlQnVzaW5lc3NIb3VyU2Vnc1JlbmRlcmVkKCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKCiAgLyoKICAJRW5zdXJlcyB0aGF0IGFsbCByb3dzIGhhdmUgdGhlaXIgaW5kaXZpZHVhbCBidXNpbmVzcyBob3VycyBDTEVBUkVELgogICAqLwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUuY2xlYXJJbmRpdmlkdWFsQnVzaW5lc3NIb3VycyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGosIGxlbiwgcmVmLCByZXN1bHRzLCByb3c7CiAgICByZWYgPSB0aGlzLnZpZXcuZ2V0RXZlbnRSb3dzKCk7CiAgICByZXN1bHRzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcm93ID0gcmVmW2pdOwogICAgICByZXN1bHRzLnB1c2gocm93LmNsZWFyQnVzaW5lc3NIb3VyU2VncygpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgoKICAvKgogIAlDYWxsZWQgd2hlbiBhIHJvdyBoYXMgYmVlbiBhZGRlZCB0byB0aGUgdHJlZSBkYXRhIHN0cnVjdHVyZSwgYnV0IGJlZm9yZSBpdCdzIHJlbmRlcmVkLgogIAlDb21wdXRlcyBhbmQgYXNzaWducyBidXNpbmVzcyBob3VyIGRhdGEgKmlmIG5lY2Vzc2FyeSouIFRvIGJlIHJlbmRlcmVkIHNvb24gYWZ0ZXIuCiAgICovCgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5hc3NpZ25Sb3dCdXNpbmVzc0hvdXJTZWdzID0gZnVuY3Rpb24ocm93KSB7CiAgICBpZiAocm93LnJlc291cmNlLmJ1c2luZXNzSG91cnMpIHsKICAgICAgaWYgKCF0aGlzLnJvd0NudFdpdGhDdXN0b21CdXNpbmVzc0hvdXJzKSB7CiAgICAgICAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS51bnJlbmRlckJ1c2luZXNzSG91cnMuY2FsbCh0aGlzKTsKICAgICAgICB0aGlzLmVuc3VyZUluZGl2aWR1YWxCdXNpbmVzc0hvdXJzKCk7CiAgICAgIH0KICAgICAgdGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3VycyArPSAxOwogICAgfQogICAgaWYgKHRoaXMucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMpIHsKICAgICAgcmV0dXJuIHRoaXMucG9wdWxhdGVSb3dCdXNpbmVzc0hvdXJzU2Vncyhyb3cpOwogICAgfQogIH07CgoKICAvKgogIAlDYWxsZWQgd2hlbiBhIHJvdyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmUuCiAgCVVucmVuZGVycyB0aGUgcm93J3Mgc2VncyBhbmQsIGlmIG5lY2Vzc2FyeSwgZm9yY2VzIGJ1c2luZXNzSG91cnMgYmFjayB0byBnZW5lcmljIHJlbmRlcmluZy4KICAgKi8KCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLmRlc3Ryb3lSb3dCdXNpbmVzc0hvdXJTZWdzID0gZnVuY3Rpb24ocm93KSB7CiAgICByb3cuY2xlYXJCdXNpbmVzc0hvdXJTZWdzKCk7CiAgICBpZiAocm93LnJlc291cmNlLmJ1c2luZXNzSG91cnMpIHsKICAgICAgdGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3VycyAtPSAxOwogICAgICBpZiAoIXRoaXMucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMpIHsKICAgICAgICB0aGlzLmNsZWFySW5kaXZpZHVhbEJ1c2luZXNzSG91cnMoKTsKICAgICAgICByZXR1cm4gVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJCdXNpbmVzc0hvdXJzLmNhbGwodGhpcyk7CiAgICAgIH0KICAgIH0KICB9OwoKCiAgLyoKICAJQ29tcHV0ZSBhbmQgYXNzaWduIHRvIHJvdy5idXNpbmVzc0hvdXJTZWdzIHVuY29uZGl0aW9uYWxseQogICAqLwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucG9wdWxhdGVSb3dCdXNpbmVzc0hvdXJzU2VncyA9IGZ1bmN0aW9uKHJvdykgewogICAgdmFyIGJ1c2luZXNzSG91clNlZ3MsIGJ1c2luZXNzSG91cnMsIGJ1c2luZXNzSG91cnNFdmVudHM7CiAgICBidXNpbmVzc0hvdXJzID0gcm93LnJlc291cmNlLmJ1c2luZXNzSG91cnMgfHwgdGhpcy52aWV3Lm9wdCgnYnVzaW5lc3NIb3VycycpOwogICAgYnVzaW5lc3NIb3Vyc0V2ZW50cyA9IHRoaXMudmlldy5jYWxlbmRhci5jb21wdXRlQnVzaW5lc3NIb3VyRXZlbnRzKCF0aGlzLmlzVGltZVNjYWxlLCBidXNpbmVzc0hvdXJzKTsKICAgIGJ1c2luZXNzSG91clNlZ3MgPSB0aGlzLmV2ZW50c1RvU2VncyhidXNpbmVzc0hvdXJzRXZlbnRzKTsKICAgIGJ1c2luZXNzSG91clNlZ3MgPSB0aGlzLnJlbmRlckZpbGxTZWdFbHMoJ2J1c2luZXNzSG91cnMnLCBidXNpbmVzc0hvdXJTZWdzKTsKICAgIHJvdy5idXNpbmVzc0hvdXJTZWdzID0gYnVzaW5lc3NIb3VyU2VnczsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyRmlsbCA9IGZ1bmN0aW9uKHR5cGUsIHNlZ3MsIGNsYXNzTmFtZSkgewogICAgdmFyIGosIGssIGxlbiwgbGVuMSwgbm9uUmVzb3VyY2VTZWdzLCBwYWlyLCBwYWlycywgcmVzb3VyY2VTZWdzLCByb3dPYmosIHJvd1NlZ3MsIHNlZywgdmlzaWJsZVBhaXJzOwogICAgc2VncyA9IHRoaXMucmVuZGVyRmlsbFNlZ0Vscyh0eXBlLCBzZWdzKTsKICAgIHJlc291cmNlU2VncyA9IFtdOwogICAgbm9uUmVzb3VyY2VTZWdzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSBzZWdzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHNlZyA9IHNlZ3Nbal07CiAgICAgIGlmIChzZWcucmVzb3VyY2VJZCkgewogICAgICAgIHJlc291cmNlU2Vncy5wdXNoKHNlZyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9uUmVzb3VyY2VTZWdzLnB1c2goc2VnKTsKICAgICAgfQogICAgfQogICAgcGFpcnMgPSB0aGlzLnZpZXcucGFpclNlZ3NXaXRoUm93cyhyZXNvdXJjZVNlZ3MpOwogICAgdmlzaWJsZVBhaXJzID0gW107CiAgICBmb3IgKGsgPSAwLCBsZW4xID0gcGFpcnMubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7CiAgICAgIHBhaXIgPSBwYWlyc1trXTsKICAgICAgcm93T2JqID0gcGFpclswXSwgcm93U2VncyA9IHBhaXJbMV07CiAgICAgIGlmICh0eXBlID09PSAnYmdFdmVudCcpIHsKICAgICAgICByb3dPYmouYmdTZWdzID0gcm93U2VnczsKICAgICAgfQogICAgICBpZiAocm93T2JqLmlzU2hvd24pIHsKICAgICAgICB2aXNpYmxlUGFpcnMucHVzaChwYWlyKTsKICAgICAgfQogICAgfQogICAgaWYgKG5vblJlc291cmNlU2Vncy5sZW5ndGgpIHsKICAgICAgdmlzaWJsZVBhaXJzLnVuc2hpZnQoW3RoaXMsIG5vblJlc291cmNlU2Vnc10pOwogICAgfQogICAgdGhpcy5yZW5kZXJGaWxsSW5Db250YWluZXJzKHR5cGUsIHZpc2libGVQYWlycywgY2xhc3NOYW1lKTsKICAgIHJldHVybiBzZWdzOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJIZWxwZXIgPSBmdW5jdGlvbihldmVudCwgc291cmNlU2VnKSB7CiAgICB2YXIgcGFpcnMsIHNlZ3M7CiAgICBzZWdzID0gdGhpcy5ldmVudFRvU2VncyhldmVudCk7CiAgICBzZWdzID0gdGhpcy5yZW5kZXJGZ1NlZ0VscyhzZWdzKTsKICAgIHBhaXJzID0gdGhpcy52aWV3LnBhaXJTZWdzV2l0aFJvd3Moc2Vncyk7CiAgICByZXR1cm4gdGhpcy5yZW5kZXJIZWxwZXJTZWdzSW5Db250YWluZXJzKHBhaXJzLCBzb3VyY2VTZWcpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5jb21wdXRlSW5pdGlhbFNjcm9sbCA9IGZ1bmN0aW9uKHByZXZTdGF0ZSkgewogICAgdmFyIHN0YXRlOwogICAgc3RhdGUgPSBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18uY29tcHV0ZUluaXRpYWxTY3JvbGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmIChwcmV2U3RhdGUpIHsKICAgICAgc3RhdGUucmVzb3VyY2VJZCA9IHByZXZTdGF0ZS5yZXNvdXJjZUlkOwogICAgICBzdGF0ZS5ib3R0b20gPSBwcmV2U3RhdGUuYm90dG9tOwogICAgfQogICAgcmV0dXJuIHN0YXRlOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5xdWVyeVNjcm9sbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGVsLCBlbEJvdHRvbSwgaiwgbGVuLCByZWYsIHJvd09iaiwgc2Nyb2xsZXJUb3AsIHN0YXRlOwogICAgc3RhdGUgPSBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18ucXVlcnlTY3JvbGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHNjcm9sbGVyVG9wID0gdGhpcy5ib2R5U2Nyb2xsZXIuc2Nyb2xsRWwub2Zmc2V0KCkudG9wOwogICAgcmVmID0gdGhpcy52aWV3LmdldFZpc2libGVSb3dzKCk7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcm93T2JqID0gcmVmW2pdOwogICAgICBpZiAocm93T2JqLnJlc291cmNlKSB7CiAgICAgICAgZWwgPSByb3dPYmouZ2V0VHIoJ2V2ZW50Jyk7CiAgICAgICAgZWxCb3R0b20gPSBlbC5vZmZzZXQoKS50b3AgKyBlbC5vdXRlckhlaWdodCgpOwogICAgICAgIGlmIChlbEJvdHRvbSA+IHNjcm9sbGVyVG9wKSB7CiAgICAgICAgICBzdGF0ZS5yZXNvdXJjZUlkID0gcm93T2JqLnJlc291cmNlLmlkOwogICAgICAgICAgc3RhdGUuYm90dG9tID0gZWxCb3R0b20gLSBzY3JvbGxlclRvcDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0YXRlOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zZXRTY3JvbGwgPSBmdW5jdGlvbihzdGF0ZSkgewogICAgdmFyIGVsLCBlbEJvdHRvbSwgaW5uZXJUb3AsIHJvdzsKICAgIGlmIChzdGF0ZS5yZXNvdXJjZUlkKSB7CiAgICAgIHJvdyA9IHRoaXMudmlldy5nZXRSZXNvdXJjZVJvdyhzdGF0ZS5yZXNvdXJjZUlkKTsKICAgICAgaWYgKHJvdykgewogICAgICAgIGVsID0gcm93LmdldFRyKCdldmVudCcpOwogICAgICAgIGlmIChlbCkgewogICAgICAgICAgaW5uZXJUb3AgPSB0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuZWwub2Zmc2V0KCkudG9wOwogICAgICAgICAgZWxCb3R0b20gPSBlbC5vZmZzZXQoKS50b3AgKyBlbC5vdXRlckhlaWdodCgpOwogICAgICAgICAgc3RhdGUudG9wID0gZWxCb3R0b20gLSBzdGF0ZS5ib3R0b20gLSBpbm5lclRvcDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18uc2V0U2Nyb2xsLmNhbGwodGhpcywgc3RhdGUpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zY3JvbGxUb1Jlc291cmNlID0gZnVuY3Rpb24ocmVzb3VyY2UpIHsKICAgIHZhciBlbCwgaW5uZXJUb3AsIHJvdywgc2Nyb2xsVG9wOwogICAgcm93ID0gdGhpcy52aWV3LmdldFJlc291cmNlUm93KHJlc291cmNlLmlkKTsKICAgIGlmIChyb3cpIHsKICAgICAgZWwgPSByb3cuZ2V0VHIoJ2V2ZW50Jyk7CiAgICAgIGlmIChlbCkgewogICAgICAgIGlubmVyVG9wID0gdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsLm9mZnNldCgpLnRvcDsKICAgICAgICBzY3JvbGxUb3AgPSBlbC5vZmZzZXQoKS50b3AgLSBpbm5lclRvcDsKICAgICAgICByZXR1cm4gdGhpcy5ib2R5U2Nyb2xsZXIuc2Nyb2xsRWwuc2Nyb2xsVG9wKHNjcm9sbFRvcCk7CiAgICAgIH0KICAgIH0KICB9OwoKICByZXR1cm4gUmVzb3VyY2VUaW1lbGluZUdyaWQ7Cgp9KShUaW1lbGluZUdyaWQpOwoKQ09MX01JTl9XSURUSCA9IDMwOwoKU3ByZWFkc2hlZXQgPSAoZnVuY3Rpb24oKSB7CiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLnZpZXcgPSBudWxsOwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUuaGVhZEVsID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmVsID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLnRib2R5RWwgPSBudWxsOwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUuaGVhZFNjcm9sbGVyID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmJvZHlTY3JvbGxlciA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5qb2luZXIgPSBudWxsOwoKICBmdW5jdGlvbiBTcHJlYWRzaGVldCh2aWV3MSkgewogICAgdmFyIGNvbFNwZWM7CiAgICB0aGlzLnZpZXcgPSB2aWV3MTsKICAgIHRoaXMuaXNSVEwgPSB0aGlzLnZpZXcub3B0KCdpc1JUTCcpOwogICAgdGhpcy5naXZlbkNvbFdpZHRocyA9IHRoaXMuY29sV2lkdGhzID0gKGZ1bmN0aW9uKCkgewogICAgICB2YXIgaiwgbGVuLCByZWYsIHJlc3VsdHM7CiAgICAgIHJlZiA9IHRoaXMudmlldy5jb2xTcGVjczsKICAgICAgcmVzdWx0cyA9IFtdOwogICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICBjb2xTcGVjID0gcmVmW2pdOwogICAgICAgIHJlc3VsdHMucHVzaChjb2xTcGVjLndpZHRoKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pLmNhbGwodGhpcyk7CiAgfQoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUuY29sR3JvdXBIdG1sID0gJyc7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5oZWFkVGFibGUgPSBudWxsOwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUuaGVhZENvbEVscyA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5oZWFkQ2VsbEVscyA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5ib2R5Q29sRWxzID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmJvZHlUYWJsZSA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbiA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5oZWFkU2Nyb2xsZXIgPSBuZXcgQ2xpcHBlZFNjcm9sbGVyKHsKICAgICAgb3ZlcmZsb3dYOiAnY2xpcHBlZC1zY3JvbGwnLAogICAgICBvdmVyZmxvd1k6ICdoaWRkZW4nCiAgICB9KTsKICAgIHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcyA9IG5ldyBTY3JvbGxlckNhbnZhcygpOwogICAgdGhpcy5oZWFkU2Nyb2xsZXIucmVuZGVyKCk7CiAgICB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuY29udGVudEVsLmh0bWwodGhpcy5yZW5kZXJIZWFkSHRtbCgpKTsKICAgIHRoaXMuaGVhZEVsLmFwcGVuZCh0aGlzLmhlYWRTY3JvbGxlci5lbCk7CiAgICB0aGlzLmJvZHlTY3JvbGxlciA9IG5ldyBDbGlwcGVkU2Nyb2xsZXIoewogICAgICBvdmVyZmxvd1k6ICdjbGlwcGVkLXNjcm9sbCcKICAgIH0pOwogICAgdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzID0gbmV3IFNjcm9sbGVyQ2FudmFzKCk7CiAgICB0aGlzLmJvZHlTY3JvbGxlci5yZW5kZXIoKTsKICAgIHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuaHRtbCgnPHRhYmxlPicgKyB0aGlzLmNvbEdyb3VwSHRtbCArICc8dGJvZHkvPjwvdGFibGU+Jyk7CiAgICB0aGlzLnRib2R5RWwgPSB0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuY29udGVudEVsLmZpbmQoJ3Rib2R5Jyk7CiAgICB0aGlzLmVsLmFwcGVuZCh0aGlzLmJvZHlTY3JvbGxlci5lbCk7CiAgICB0aGlzLmpvaW5lciA9IG5ldyBTY3JvbGxKb2luZXIoJ2hvcml6b250YWwnLCBbdGhpcy5oZWFkU2Nyb2xsZXIsIHRoaXMuYm9keVNjcm9sbGVyXSk7CiAgICB0aGlzLmhlYWRUYWJsZSA9IHRoaXMuaGVhZEVsLmZpbmQoJ3RhYmxlJyk7CiAgICB0aGlzLmhlYWRDb2xFbHMgPSB0aGlzLmhlYWRFbC5maW5kKCdjb2wnKTsKICAgIHRoaXMuaGVhZENlbGxFbHMgPSB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuY29udGVudEVsLmZpbmQoJ3RyOmxhc3QtY2hpbGQgdGgnKTsKICAgIHRoaXMuYm9keUNvbEVscyA9IHRoaXMuZWwuZmluZCgnY29sJyk7CiAgICB0aGlzLmJvZHlUYWJsZSA9IHRoaXMuZWwuZmluZCgndGFibGUnKTsKICAgIHRoaXMuY29sTWluV2lkdGhzID0gdGhpcy5jb21wdXRlQ29sTWluV2lkdGhzKCk7CiAgICB0aGlzLmFwcGx5Q29sV2lkdGhzKCk7CiAgICByZXR1cm4gdGhpcy5pbml0Q29sUmVzaXppbmcoKTsKICB9OwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUucmVuZGVySGVhZEh0bWwgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjb2xHcm91cEh0bWwsIGNvbFNwZWNzLCBodG1sLCBpLCBpc0xhc3QsIGlzTWFpbkNvbCwgaiwgaywgbGVuLCBsZW4xLCBvOwogICAgY29sU3BlY3MgPSB0aGlzLnZpZXcuY29sU3BlY3M7CiAgICBodG1sID0gJzx0YWJsZT4nOwogICAgY29sR3JvdXBIdG1sID0gJzxjb2xncm91cD4nOwogICAgZm9yIChqID0gMCwgbGVuID0gY29sU3BlY3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgbyA9IGNvbFNwZWNzW2pdOwogICAgICBpZiAoby5pc01haW4pIHsKICAgICAgICBjb2xHcm91cEh0bWwgKz0gJzxjb2wgY2xhc3M9ImZjLW1haW4tY29sIi8+JzsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb2xHcm91cEh0bWwgKz0gJzxjb2wvPic7CiAgICAgIH0KICAgIH0KICAgIGNvbEdyb3VwSHRtbCArPSAnPC9jb2xncm91cD4nOwogICAgdGhpcy5jb2xHcm91cEh0bWwgPSBjb2xHcm91cEh0bWw7CiAgICBodG1sICs9IGNvbEdyb3VwSHRtbDsKICAgIGh0bWwgKz0gJzx0Ym9keT4nOwogICAgaWYgKHRoaXMudmlldy5zdXBlckhlYWRlclRleHQpIHsKICAgICAgaHRtbCArPSAnPHRyIGNsYXNzPSJmYy1zdXBlciI+JyArICc8dGggY2xhc3M9IicgKyB0aGlzLnZpZXcud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIiBjb2xzcGFuPSInICsgY29sU3BlY3MubGVuZ3RoICsgJyI+JyArICc8ZGl2IGNsYXNzPSJmYy1jZWxsLWNvbnRlbnQiPicgKyAnPHNwYW4gY2xhc3M9ImZjLWNlbGwtdGV4dCI+JyArIGh0bWxFc2NhcGUodGhpcy52aWV3LnN1cGVySGVhZGVyVGV4dCkgKyAnPC9zcGFuPicgKyAnPC9kaXY+JyArICc8L3RoPicgKyAnPC90cj4nOwogICAgfQogICAgaHRtbCArPSAnPHRyPic7CiAgICBpc01haW5Db2wgPSB0cnVlOwogICAgZm9yIChpID0gayA9IDAsIGxlbjEgPSBjb2xTcGVjcy5sZW5ndGg7IGsgPCBsZW4xOyBpID0gKytrKSB7CiAgICAgIG8gPSBjb2xTcGVjc1tpXTsKICAgICAgaXNMYXN0ID0gaSA9PT0gY29sU3BlY3MubGVuZ3RoIC0gMTsKICAgICAgaHRtbCArPSAnPHRoIGNsYXNzPSInICsgdGhpcy52aWV3LndpZGdldEhlYWRlckNsYXNzICsgJyI+JyArICc8ZGl2PicgKyAnPGRpdiBjbGFzcz0iZmMtY2VsbC1jb250ZW50Ij4nICsgKG8uaXNNYWluID8gJzxzcGFuIGNsYXNzPSJmYy1leHBhbmRlci1zcGFjZSI+JyArICc8c3BhbiBjbGFzcz0iZmMtaWNvbiI+PC9zcGFuPicgKyAnPC9zcGFuPicgOiAnJykgKyAnPHNwYW4gY2xhc3M9ImZjLWNlbGwtdGV4dCI+JyArIGh0bWxFc2NhcGUoby5sYWJlbFRleHQgfHwgJycpICsgJzwvc3Bhbj4nICsgJzwvZGl2PicgKyAoIWlzTGFzdCA/ICc8ZGl2IGNsYXNzPSJmYy1jb2wtcmVzaXplciI+PC9kaXY+JyA6ICcnKSArICc8L2Rpdj4nICsgJzwvdGg+JzsKICAgIH0KICAgIGh0bWwgKz0gJzwvdHI+JzsKICAgIGh0bWwgKz0gJzwvdGJvZHk+PC90YWJsZT4nOwogICAgcmV0dXJuIGh0bWw7CiAgfTsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmdpdmVuQ29sV2lkdGhzID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmNvbFdpZHRocyA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5jb2xNaW5XaWR0aHMgPSBudWxsOwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUudGFibGVXaWR0aCA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS50YWJsZU1pbldpZHRoID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmluaXRDb2xSZXNpemluZyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuaGVhZEVsLmZpbmQoJ3RoIC5mYy1jb2wtcmVzaXplcicpLmVhY2goKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihpLCByZXNpemVyRWwpIHsKICAgICAgICByZXNpemVyRWwgPSAkKHJlc2l6ZXJFbCk7CiAgICAgICAgcmV0dXJuIHJlc2l6ZXJFbC5vbignbW91c2Vkb3duJywgZnVuY3Rpb24oZXYpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5jb2xSZXNpemVNb3VzZWRvd24oaSwgZXYsIHJlc2l6ZXJFbCk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICB9KSh0aGlzKSk7CiAgfTsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmNvbFJlc2l6ZU1vdXNlZG93biA9IGZ1bmN0aW9uKGksIGV2LCByZXNpemVyRWwpIHsKICAgIHZhciBjb2xXaWR0aHMsIGRyYWdMaXN0ZW5lciwgbWluV2lkdGgsIG9yaWdDb2xXaWR0aDsKICAgIGNvbFdpZHRocyA9IHRoaXMuY29sV2lkdGhzID0gdGhpcy5xdWVyeUNvbFdpZHRocygpOwogICAgY29sV2lkdGhzLnBvcCgpOwogICAgY29sV2lkdGhzLnB1c2gobnVsbCk7CiAgICBvcmlnQ29sV2lkdGggPSBjb2xXaWR0aHNbaV07CiAgICBtaW5XaWR0aCA9IE1hdGgubWluKHRoaXMuY29sTWluV2lkdGhzW2ldLCBDT0xfTUlOX1dJRFRIKTsKICAgIGRyYWdMaXN0ZW5lciA9IG5ldyBEcmFnTGlzdGVuZXIoewogICAgICBkcmFnU3RhcnQ6IChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiByZXNpemVyRWwuYWRkQ2xhc3MoJ2ZjLWFjdGl2ZScpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpLAogICAgICBkcmFnOiAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oZHgsIGR5KSB7CiAgICAgICAgICB2YXIgd2lkdGg7CiAgICAgICAgICB3aWR0aCA9IG9yaWdDb2xXaWR0aCArIChfdGhpcy5pc1JUTCA/IC1keCA6IGR4KTsKICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIG1pbldpZHRoKTsKICAgICAgICAgIGNvbFdpZHRoc1tpXSA9IHdpZHRoOwogICAgICAgICAgcmV0dXJuIF90aGlzLmFwcGx5Q29sV2lkdGhzKCk7CiAgICAgICAgfTsKICAgICAgfSkodGhpcyksCiAgICAgIGRyYWdFbmQ6IChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiByZXNpemVyRWwucmVtb3ZlQ2xhc3MoJ2ZjLWFjdGl2ZScpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpCiAgICB9KTsKICAgIHJldHVybiBkcmFnTGlzdGVuZXIuc3RhcnRJbnRlcmFjdGlvbihldik7CiAgfTsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmFwcGx5Q29sV2lkdGhzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgYWxsTnVtYmVycywgYW55UGVyY2VudGFnZXMsIGNvbE1pbldpZHRocywgY29sV2lkdGgsIGNvbFdpZHRocywgY3NzV2lkdGgsIGNzc1dpZHRocywgZGVmYXVsdENzc1dpZHRoLCBpLCBqLCBrLCBsLCBsZW4sIGxlbjEsIGxlbjIsIHRhYmxlTWluV2lkdGgsIHRvdGFsOwogICAgY29sTWluV2lkdGhzID0gdGhpcy5jb2xNaW5XaWR0aHM7CiAgICBjb2xXaWR0aHMgPSB0aGlzLmNvbFdpZHRoczsKICAgIGFsbE51bWJlcnMgPSB0cnVlOwogICAgYW55UGVyY2VudGFnZXMgPSBmYWxzZTsKICAgIHRvdGFsID0gMDsKICAgIGZvciAoaiA9IDAsIGxlbiA9IGNvbFdpZHRocy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBjb2xXaWR0aCA9IGNvbFdpZHRoc1tqXTsKICAgICAgaWYgKHR5cGVvZiBjb2xXaWR0aCA9PT0gJ251bWJlcicpIHsKICAgICAgICB0b3RhbCArPSBjb2xXaWR0aDsKICAgICAgfSBlbHNlIHsKICAgICAgICBhbGxOdW1iZXJzID0gZmFsc2U7CiAgICAgICAgaWYgKGNvbFdpZHRoKSB7CiAgICAgICAgICBhbnlQZXJjZW50YWdlcyA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBkZWZhdWx0Q3NzV2lkdGggPSBhbnlQZXJjZW50YWdlcyAmJiAhdGhpcy52aWV3LmlzSEdyb3VwaW5nID8gJ2F1dG8nIDogJyc7CiAgICBjc3NXaWR0aHMgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBrLCBsZW4xLCByZXN1bHRzOwogICAgICByZXN1bHRzID0gW107CiAgICAgIGZvciAoaSA9IGsgPSAwLCBsZW4xID0gY29sV2lkdGhzLmxlbmd0aDsgayA8IGxlbjE7IGkgPSArK2spIHsKICAgICAgICBjb2xXaWR0aCA9IGNvbFdpZHRoc1tpXTsKICAgICAgICByZXN1bHRzLnB1c2goY29sV2lkdGggIT0gbnVsbCA/IGNvbFdpZHRoIDogZGVmYXVsdENzc1dpZHRoKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pKCk7CiAgICB0YWJsZU1pbldpZHRoID0gMDsKICAgIGZvciAoaSA9IGsgPSAwLCBsZW4xID0gY3NzV2lkdGhzLmxlbmd0aDsgayA8IGxlbjE7IGkgPSArK2spIHsKICAgICAgY3NzV2lkdGggPSBjc3NXaWR0aHNbaV07CiAgICAgIHRhYmxlTWluV2lkdGggKz0gdHlwZW9mIGNzc1dpZHRoID09PSAnbnVtYmVyJyA/IGNzc1dpZHRoIDogY29sTWluV2lkdGhzW2ldOwogICAgfQogICAgZm9yIChpID0gbCA9IDAsIGxlbjIgPSBjc3NXaWR0aHMubGVuZ3RoOyBsIDwgbGVuMjsgaSA9ICsrbCkgewogICAgICBjc3NXaWR0aCA9IGNzc1dpZHRoc1tpXTsKICAgICAgdGhpcy5oZWFkQ29sRWxzLmVxKGkpLndpZHRoKGNzc1dpZHRoKTsKICAgICAgdGhpcy5ib2R5Q29sRWxzLmVxKGkpLndpZHRoKGNzc1dpZHRoKTsKICAgIH0KICAgIHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5zZXRNaW5XaWR0aCh0YWJsZU1pbldpZHRoKTsKICAgIHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5zZXRNaW5XaWR0aCh0YWJsZU1pbldpZHRoKTsKICAgIHRoaXMudGFibGVNaW5XaWR0aCA9IHRhYmxlTWluV2lkdGg7CiAgICByZXR1cm4gdGhpcy50YWJsZVdpZHRoID0gYWxsTnVtYmVycyA/IHRvdGFsIDogdm9pZCAwOwogIH07CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5jb21wdXRlQ29sTWluV2lkdGhzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaSwgaiwgbGVuLCByZWYsIHJlc3VsdHMsIHdpZHRoOwogICAgcmVmID0gdGhpcy5naXZlbkNvbFdpZHRoczsKICAgIHJlc3VsdHMgPSBbXTsKICAgIGZvciAoaSA9IGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBpID0gKytqKSB7CiAgICAgIHdpZHRoID0gcmVmW2ldOwogICAgICBpZiAodHlwZW9mIHdpZHRoID09PSAnbnVtYmVyJykgewogICAgICAgIHJlc3VsdHMucHVzaCh3aWR0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0cy5wdXNoKHBhcnNlSW50KHRoaXMuaGVhZENvbEVscy5lcShpKS5jc3MoJ21pbi13aWR0aCcpKSB8fCBDT0xfTUlOX1dJRFRIKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLnF1ZXJ5Q29sV2lkdGhzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCBub2RlLCByZWYsIHJlc3VsdHM7CiAgICByZWYgPSB0aGlzLmhlYWRDZWxsRWxzOwogICAgcmVzdWx0cyA9IFtdOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIG5vZGUgPSByZWZbal07CiAgICAgIHJlc3VsdHMucHVzaCgkKG5vZGUpLm91dGVyV2lkdGgoKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUudXBkYXRlV2lkdGggPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuaGVhZFNjcm9sbGVyLnVwZGF0ZVNpemUoKTsKICAgIHRoaXMuYm9keVNjcm9sbGVyLnVwZGF0ZVNpemUoKTsKICAgIHRoaXMuam9pbmVyLnVwZGF0ZSgpOwogICAgaWYgKHRoaXMuZm9sbG93ZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuZm9sbG93ZXIudXBkYXRlKCk7CiAgICB9CiAgfTsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmhlYWRIZWlnaHQgPSBmdW5jdGlvbigpIHsKICAgIHZhciB0YWJsZTsKICAgIHRhYmxlID0gdGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbC5maW5kKCd0YWJsZScpOwogICAgcmV0dXJuIHRhYmxlLmhlaWdodC5hcHBseSh0YWJsZSwgYXJndW1lbnRzKTsKICB9OwoKICByZXR1cm4gU3ByZWFkc2hlZXQ7Cgp9KSgpOwoKCi8qCkFuIGFic3RyYWN0IG5vZGUgaW4gYSByb3ctaGllcmFyY2h5IHRyZWUuCk1heSBiZSBhIHNlbGYtY29udGFpbmVkIHNpbmdsZSByb3csIGEgcm93IHdpdGggc3Vicm93cywKT1IgYSBncm91cGluZyBvZiByb3dzIHdpdGhvdXQgaXRzIG93biBkaXN0aW5jdCByb3cuCiAqLwoKUm93UGFyZW50ID0gKGZ1bmN0aW9uKCkgewogIFJvd1BhcmVudC5wcm90b3R5cGUudmlldyA9IG51bGw7CgogIFJvd1BhcmVudC5wcm90b3R5cGUucGFyZW50ID0gbnVsbDsKCiAgUm93UGFyZW50LnByb3RvdHlwZS5wcmV2U2libGluZyA9IG51bGw7CgogIFJvd1BhcmVudC5wcm90b3R5cGUuY2hpbGRyZW4gPSBudWxsOwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmRlcHRoID0gMDsKCiAgUm93UGFyZW50LnByb3RvdHlwZS5oYXNPd25Sb3cgPSBmYWxzZTsKCiAgUm93UGFyZW50LnByb3RvdHlwZS50ckhhc2ggPSBudWxsOwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnRycyA9IG51bGw7CgogIFJvd1BhcmVudC5wcm90b3R5cGUuaXNSZW5kZXJlZCA9IGZhbHNlOwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmlzRXhwYW5kZWQgPSB0cnVlOwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmlzU2hvd24gPSBmYWxzZTsKCiAgZnVuY3Rpb24gUm93UGFyZW50KHZpZXcxKSB7CiAgICB0aGlzLnZpZXcgPSB2aWV3MTsKICAgIHRoaXMuY2hpbGRyZW4gPSBbXTsKICAgIHRoaXMudHJIYXNoID0ge307CiAgICB0aGlzLnRycyA9ICQoKTsKICB9CgoKICAvKgogIAlBZGRzIHRoZSBnaXZlbiBub2RlIGFzIGEgY2hpbGQuCiAgCVdpbGwgYmUgaW5zZXJ0ZWQgYXQgdGhlIGBpbmRleGAuIElmIG5vdCBnaXZlbiwgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZW5kLgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24oY2hpbGQsIGluZGV4KSB7CiAgICB2YXIgY2hpbGRyZW4sIGosIGxlbiwgbm9kZSwgcmVmOwogICAgY2hpbGQucmVtb3ZlKCk7CiAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CiAgICBpZiAoaW5kZXggIT0gbnVsbCkgewogICAgICBjaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDAsIGNoaWxkKTsKICAgIH0gZWxzZSB7CiAgICAgIGluZGV4ID0gY2hpbGRyZW4ubGVuZ3RoOwogICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKTsKICAgIH0KICAgIGNoaWxkLnByZXZTaWJsaW5nID0gaW5kZXggPiAwID8gY2hpbGRyZW5baW5kZXggLSAxXSA6IG51bGw7CiAgICBpZiAoaW5kZXggPCBjaGlsZHJlbi5sZW5ndGggLSAxKSB7CiAgICAgIGNoaWxkcmVuW2luZGV4ICsgMV0ucHJldlNpYmxpbmcgPSBjaGlsZDsKICAgIH0KICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7CiAgICBjaGlsZC5kZXB0aCA9IHRoaXMuZGVwdGggKyAodGhpcy5oYXNPd25Sb3cgPyAxIDogMCk7CiAgICByZWYgPSBjaGlsZC5nZXROb2RlcygpOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIG5vZGUgPSByZWZbal07CiAgICAgIG5vZGUuYWRkZWQoKTsKICAgIH0KICAgIGlmICh0aGlzLmlzU2hvd24gJiYgdGhpcy5pc0V4cGFuZGVkKSB7CiAgICAgIHJldHVybiBjaGlsZC5zaG93KCk7CiAgICB9CiAgfTsKCgogIC8qCiAgCVJlbW92ZXMgdGhlIGdpdmVuIGNoaWxkIGZyb20gdGhlIG5vZGUuIEFzc3VtZXMgaXQgaXMgYSBkaXJlY3QgY2hpbGQuCiAgCUlmIG5vdCBhIGRpcmVjdCBjaGlsZCwgcmV0dXJucyBmYWxzZSBhbmQgbm90aGluZyBoYXBwZW5zLgogIAlVbnJlbmRlcnMgdGhlIGNoaWxkIGFuZCB0cmlnZ2VycyBoYW5kbGVycy4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5yZW1vdmVDaGlsZCA9IGZ1bmN0aW9uKGNoaWxkKSB7CiAgICB2YXIgY2hpbGRyZW4sIGksIGlzRm91bmQsIGosIGssIGxlbiwgbGVuMSwgcmVmLCByb3csIHRlc3RDaGlsZDsKICAgIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjsKICAgIGlzRm91bmQgPSBmYWxzZTsKICAgIGZvciAoaSA9IGogPSAwLCBsZW4gPSBjaGlsZHJlbi5sZW5ndGg7IGogPCBsZW47IGkgPSArK2opIHsKICAgICAgdGVzdENoaWxkID0gY2hpbGRyZW5baV07CiAgICAgIGlmICh0ZXN0Q2hpbGQgPT09IGNoaWxkKSB7CiAgICAgICAgaXNGb3VuZCA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICghaXNGb3VuZCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICBpZiAoaSA8IGNoaWxkcmVuLmxlbmd0aCAtIDEpIHsKICAgICAgICBjaGlsZHJlbltpICsgMV0ucHJldlNpYmxpbmcgPSBjaGlsZC5wcmV2U2libGluZzsKICAgICAgfQogICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSk7CiAgICAgIGNoaWxkLnJlY3Vyc2l2ZWx5VW5yZW5kZXIoKTsKICAgICAgcmVmID0gY2hpbGQuZ2V0Tm9kZXMoKTsKICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHJlZi5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgICByb3cgPSByZWZba107CiAgICAgICAgcm93LnJlbW92ZWQoKTsKICAgICAgfQogICAgICBjaGlsZC5wYXJlbnQgPSBudWxsOwogICAgICBjaGlsZC5wcmV2U2libGluZyA9IG51bGw7CiAgICAgIHJldHVybiBjaGlsZDsKICAgIH0KICB9OwoKCiAgLyoKICAJUmVtb3ZlcyBhbGwgb2YgdGhlIG5vZGUncyBjaGlsZHJlbiBmcm9tIHRoZSBoaWVyYXJjaHkuIFVucmVuZGVycyB0aGVtIGFuZCB0cmlnZ2VycyBjYWxsYmFja3MuCiAgCU5PVEU6IGJhdGNoUm93cy91bmJhdGNoUm93cyBzaG91bGQgcHJvYmFibHkgYmUgY2FsbGVkIGJlZm9yZSB0aGlzIGhhcHBlbnMgOigKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5yZW1vdmVDaGlsZHJlbiA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNoaWxkLCBqLCBrLCBsZW4sIGxlbjEsIHJlZiwgcmVmMTsKICAgIHJlZiA9IHRoaXMuY2hpbGRyZW47CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgY2hpbGQgPSByZWZbal07CiAgICAgIGNoaWxkLnJlY3Vyc2l2ZWx5VW5yZW5kZXIoKTsKICAgIH0KICAgIHJlZjEgPSB0aGlzLmdldERlc2NlbmRhbnRzKCk7CiAgICBmb3IgKGsgPSAwLCBsZW4xID0gcmVmMS5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgY2hpbGQgPSByZWYxW2tdOwogICAgICBjaGlsZC5yZW1vdmVkKCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbiA9IFtdOwogIH07CgoKICAvKgogIAlSZW1vdmVzIHRoaXMgbm9kZSBmcm9tIGl0cyBwYXJlbnQKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnBhcmVudCkgewogICAgICByZXR1cm4gdGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CiAgICB9CiAgfTsKCgogIC8qCiAgCUdldHMgdGhlIGxhc3QgZGlyZWN0IGNoaWxkIG5vZGUKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5nZXRMYXN0Q2hpbGQgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjaGlsZHJlbjsKICAgIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjsKICAgIHJldHVybiBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXTsKICB9OwoKCiAgLyoKICAJV2Fsa3MgYmFja3dhcmQgaW4gdGhlIGhpZXJhcmNoeSB0byBmaW5kIHRoZSBwcmV2aW91cyByb3cgbGVhZiBub2RlLgogIAlXaGVuIGxvb2tpbmcgYXQgdGhlIGhpZXJhcmNoeSBpbiBhIGZsYXQgbGluZWFyIGZhc2hpb24sIHRoaXMgaXMgdGhlIHJldmVhbGVkIHJvdyBqdXN0IGJlZm9yZSB0aGUgY3VycmVudC4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5nZXRQcmV2Um93ID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgbGFzdENoaWxkLCBub2RlOwogICAgbm9kZSA9IHRoaXM7CiAgICB3aGlsZSAobm9kZSkgewogICAgICBpZiAobm9kZS5wcmV2U2libGluZykgewogICAgICAgIG5vZGUgPSBub2RlLnByZXZTaWJsaW5nOwogICAgICAgIHdoaWxlICgobGFzdENoaWxkID0gbm9kZS5nZXRMYXN0Q2hpbGQoKSkpIHsKICAgICAgICAgIG5vZGUgPSBsYXN0Q2hpbGQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICAgICAgfQogICAgICBpZiAobm9kZSAmJiBub2RlLmhhc093blJvdyAmJiBub2RlLmlzU2hvd24pIHsKICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfTsKCgogIC8qCiAgCVJldHVybnMgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHN1YnRyZWUgdGhhdCBoYXMgYSByZXZlYWxlZCByb3cKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5nZXRMZWFkaW5nUm93ID0gZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5oYXNPd25Sb3cpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgaWYgKHRoaXMuaXNFeHBhbmRlZCAmJiB0aGlzLmNoaWxkcmVuLmxlbmd0aCkgewogICAgICByZXR1cm4gdGhpcy5jaGlsZHJlblswXS5nZXRMZWFkaW5nUm93KCk7CiAgICB9CiAgfTsKCgogIC8qCiAgCUdlbmVyYXRlcyBhIGZsYXQgYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIHJvdy1ub2RlcyBvZiB0aGUgc3VidHJlZS4gRGVzY2VuZGFudHMgKyBzZWxmCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuZ2V0Um93cyA9IGZ1bmN0aW9uKGJhdGNoQXJyYXkpIHsKICAgIHZhciBjaGlsZCwgaiwgbGVuLCByZWY7CiAgICBpZiAoYmF0Y2hBcnJheSA9PSBudWxsKSB7CiAgICAgIGJhdGNoQXJyYXkgPSBbXTsKICAgIH0KICAgIGlmICh0aGlzLmhhc093blJvdykgewogICAgICBiYXRjaEFycmF5LnB1c2godGhpcyk7CiAgICB9CiAgICByZWYgPSB0aGlzLmNoaWxkcmVuOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGNoaWxkID0gcmVmW2pdOwogICAgICBjaGlsZC5nZXRSb3dzKGJhdGNoQXJyYXkpOwogICAgfQogICAgcmV0dXJuIGJhdGNoQXJyYXk7CiAgfTsKCgogIC8qCiAgCUdlbmVyYXRlcyBhIGZsYXQgYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIG5vZGVzIChyb3cvbm9uLXJvdykgb2YgdGhlIHN1YnRyZWUuIERlc2NlbmRhbnRzICsgc2VsZgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmdldE5vZGVzID0gZnVuY3Rpb24oYmF0Y2hBcnJheSkgewogICAgdmFyIGNoaWxkLCBqLCBsZW4sIHJlZjsKICAgIGlmIChiYXRjaEFycmF5ID09IG51bGwpIHsKICAgICAgYmF0Y2hBcnJheSA9IFtdOwogICAgfQogICAgYmF0Y2hBcnJheS5wdXNoKHRoaXMpOwogICAgcmVmID0gdGhpcy5jaGlsZHJlbjsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBjaGlsZCA9IHJlZltqXTsKICAgICAgY2hpbGQuZ2V0Tm9kZXMoYmF0Y2hBcnJheSk7CiAgICB9CiAgICByZXR1cm4gYmF0Y2hBcnJheTsKICB9OwoKCiAgLyoKICAJR2VuZXJhdGVzIGEgZmxhdCBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgZGVzY2VuZGFudCBub2RlcyB0aGUgY3VycmVudCBub2RlCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuZ2V0RGVzY2VuZGFudHMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiYXRjaEFycmF5LCBjaGlsZCwgaiwgbGVuLCByZWY7CiAgICBiYXRjaEFycmF5ID0gW107CiAgICByZWYgPSB0aGlzLmNoaWxkcmVuOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGNoaWxkID0gcmVmW2pdOwogICAgICBjaGlsZC5nZXROb2RlcyhiYXRjaEFycmF5KTsKICAgIH0KICAgIHJldHVybiBiYXRjaEFycmF5OwogIH07CgoKICAvKgogIAlCdWlsZHMgYW5kIHBvcHVsYXRlcyB0aGUgVFJzIGZvciBlYWNoIHJvdyB0eXBlLiBJbnNlcnRzIHRoZW0gaW50byB0aGUgRE9NLgogIAlEb2VzIHRoaXMgb25seSBmb3IgdGhpcyBzaW5nbGUgcm93LiBOb3QgcmVjdXJzaXZlLiBJZiBub3QgYSByb3cgKGhhc093blJvdz1mYWxzZSksIGRvZXMgbm90IHJlbmRlciBhbnl0aGluZy4KICAJUFJFQ09ORElUSU9OOiBhc3N1bWVzIHRoZSBwYXJlbnQgaGFzIGFscmVhZHkgYmVlbiByZW5kZXJlZC4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBwcmV2Um93LCByZWYsIHJlbmRlck1ldGhvZE5hbWUsIHRib2R5LCB0ciwgdHJOb2RlcywgdHlwZTsKICAgIHRoaXMudHJIYXNoID0ge307CiAgICB0ck5vZGVzID0gW107CiAgICBpZiAodGhpcy5oYXNPd25Sb3cpIHsKICAgICAgcHJldlJvdyA9IHRoaXMuZ2V0UHJldlJvdygpOwogICAgICByZWYgPSB0aGlzLnZpZXcudGJvZHlIYXNoOwogICAgICBmb3IgKHR5cGUgaW4gcmVmKSB7CiAgICAgICAgdGJvZHkgPSByZWZbdHlwZV07CiAgICAgICAgdHIgPSAkKCc8dHIvPicpOwogICAgICAgIHRoaXMudHJIYXNoW3R5cGVdID0gdHI7CiAgICAgICAgdHJOb2Rlcy5wdXNoKHRyWzBdKTsKICAgICAgICByZW5kZXJNZXRob2ROYW1lID0gJ3JlbmRlcicgKyBjYXBpdGFsaXNlRmlyc3RMZXR0ZXIodHlwZSkgKyAnQ29udGVudCc7CiAgICAgICAgaWYgKHRoaXNbcmVuZGVyTWV0aG9kTmFtZV0pIHsKICAgICAgICAgIHRoaXNbcmVuZGVyTWV0aG9kTmFtZV0odHIpOwogICAgICAgIH0KICAgICAgICBpZiAocHJldlJvdykgewogICAgICAgICAgcHJldlJvdy50ckhhc2hbdHlwZV0uYWZ0ZXIodHIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0Ym9keS5wcmVwZW5kKHRyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRoaXMudHJzID0gJCh0ck5vZGVzKS5vbignY2xpY2snLCAnLmZjLWV4cGFuZGVyJywgcHJveHkodGhpcywgJ3RvZ2dsZUV4cGFuZGVkJykpOwogICAgcmV0dXJuIHRoaXMuaXNSZW5kZXJlZCA9IHRydWU7CiAgfTsKCgogIC8qCiAgCVVucG9wdWxhdGVzIGFuZCByZW1vdmVzIGFsbCBvZiB0aGlzIHJvdydzIFRScyBmcm9tIHRoZSBET00uIE9ubHkgZm9yIHRoaXMgc2luZ2xlIHJvdy4gTm90IHJlY3Vyc2l2ZS4KICAJV2lsbCB0cmlnZ2VyICJoaWRkZW4iLgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnVucmVuZGVyID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcmVmLCB0ciwgdHlwZSwgdW5yZW5kZXJNZXRob2ROYW1lOwogICAgaWYgKHRoaXMuaXNSZW5kZXJlZCkgewogICAgICByZWYgPSB0aGlzLnRySGFzaDsKICAgICAgZm9yICh0eXBlIGluIHJlZikgewogICAgICAgIHRyID0gcmVmW3R5cGVdOwogICAgICAgIHVucmVuZGVyTWV0aG9kTmFtZSA9ICd1bnJlbmRlcicgKyBjYXBpdGFsaXNlRmlyc3RMZXR0ZXIodHlwZSkgKyAnQ29udGVudCc7CiAgICAgICAgaWYgKHRoaXNbdW5yZW5kZXJNZXRob2ROYW1lXSkgewogICAgICAgICAgdGhpc1t1bnJlbmRlck1ldGhvZE5hbWVdKHRyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy50ckhhc2ggPSB7fTsKICAgICAgdGhpcy50cnMucmVtb3ZlKCk7CiAgICAgIHRoaXMudHJzID0gJCgpOwogICAgICB0aGlzLmlzUmVuZGVyZWQgPSBmYWxzZTsKICAgICAgdGhpcy5pc1Nob3duID0gZmFsc2U7CiAgICAgIHJldHVybiB0aGlzLmhpZGRlbigpOwogICAgfQogIH07CgoKICAvKgogIAlMaWtlIHVucmVuZGVyKCksIGJ1dCBkb2VzIGl0IGZvciB0aGlzIHJvdyBBTkQgYWxsIGRlc2NlbmRhbnRzLgogIAlOT1RFOiBiYXRjaFJvd3MvdW5iYXRjaFJvd3Mgc2hvdWxkIHByb2JhYmx5IGJlIGNhbGxlZCBiZWZvcmUgdGhpcyBoYXBwZW5zIDooCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUucmVjdXJzaXZlbHlVbnJlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNoaWxkLCBqLCBsZW4sIHJlZiwgcmVzdWx0czsKICAgIHRoaXMudW5yZW5kZXIoKTsKICAgIHJlZiA9IHRoaXMuY2hpbGRyZW47CiAgICByZXN1bHRzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgY2hpbGQgPSByZWZbal07CiAgICAgIHJlc3VsdHMucHVzaChjaGlsZC5yZWN1cnNpdmVseVVucmVuZGVyKCkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCgogIC8qCiAgCUEgc2ltcGxlIGdldHRlciBmb3IgcmV0cmlldmluZyBhIFRSIGpRdWVyeSBvYmplY3Qgb2YgYSBjZXJ0YWluIHJvdyB0eXBlCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuZ2V0VHIgPSBmdW5jdGlvbih0eXBlKSB7CiAgICByZXR1cm4gdGhpcy50ckhhc2hbdHlwZV07CiAgfTsKCgogIC8qCiAgCVJlbmRlcnMgdGhpcyByb3cgaWYgbm90IGFscmVhZHkgcmVuZGVyZWQsIG1ha2luZyBzdXJlIGl0IGlzIHZpc2libGUuCiAgCUFsc28gcmVuZGVycyBkZXNjZW5kYW50cyBvZiB0aGlzIHN1YnRyZWUsIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBhcmUgZXhwYW5kZWQgb3Igbm90LgogIAlOT1RFOiBJZiBjYWxsZWQgZXh0ZXJuYWxseSwgYmF0Y2hSb3dzL3VuYmF0Y2hSb3dzIHNob3VsZCBwcm9iYWJseSBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgaGFwcGVucyA6KAogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjaGlsZCwgaiwgbGVuLCByZWYsIHJlc3VsdHM7CiAgICBpZiAoIXRoaXMuaXNTaG93bikgewogICAgICBpZiAoIXRoaXMuaXNSZW5kZXJlZCkgewogICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy50cnMuY3NzKCdkaXNwbGF5JywgJycpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmVuc3VyZVNlZ3NSZW5kZXJlZCkgewogICAgICAgIHRoaXMuZW5zdXJlU2Vnc1JlbmRlcmVkKCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuaXNFeHBhbmRlZCkgewogICAgICAgIHRoaXMuaW5kaWNhdGVFeHBhbmRlZCgpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuaW5kaWNhdGVDb2xsYXBzZWQoKTsKICAgICAgfQogICAgICB0aGlzLmlzU2hvd24gPSB0cnVlOwogICAgICB0aGlzLnNob3duKCk7CiAgICAgIGlmICh0aGlzLmlzRXhwYW5kZWQpIHsKICAgICAgICByZWYgPSB0aGlzLmNoaWxkcmVuOwogICAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICAgIGNoaWxkID0gcmVmW2pdOwogICAgICAgICAgcmVzdWx0cy5wdXNoKGNoaWxkLnNob3coKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRzOwogICAgICB9CiAgICB9CiAgfTsKCgogIC8qCiAgCVRlbXBvcmFyaWx5IGhpZGVzIHRoaXMgbm9kZSdzIFRScyAoaWYgYXBwbGljYWJsZSkgYXMgd2VsbCBhcyBhbGwgbm9kZXMgaW4gdGhlIHN1YnRyZWUKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgY2hpbGQsIGosIGxlbiwgcmVmLCByZXN1bHRzOwogICAgaWYgKHRoaXMuaXNTaG93bikgewogICAgICBpZiAodGhpcy5pc1JlbmRlcmVkKSB7CiAgICAgICAgdGhpcy50cnMuaGlkZSgpOwogICAgICB9CiAgICAgIHRoaXMuaXNTaG93biA9IGZhbHNlOwogICAgICB0aGlzLmhpZGRlbigpOwogICAgICBpZiAodGhpcy5pc0V4cGFuZGVkKSB7CiAgICAgICAgcmVmID0gdGhpcy5jaGlsZHJlbjsKICAgICAgICByZXN1bHRzID0gW107CiAgICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgICBjaGlsZCA9IHJlZltqXTsKICAgICAgICAgIHJlc3VsdHMucHVzaChjaGlsZC5oaWRlKCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgfQogICAgfQogIH07CgoKICAvKgogIAlSZXZlYWxzIHRoaXMgbm9kZSdzIGNoaWxkcmVuIGlmIHRoZXkgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIHJldmVhbGVkLiBDaGFuZ2VzIGFueSBleHBhbmRlciBpY29uLgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmV4cGFuZCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNoaWxkLCBqLCBsZW4sIHJlZjsKICAgIGlmICghdGhpcy5pc0V4cGFuZGVkKSB7CiAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IHRydWU7CiAgICAgIHRoaXMuaW5kaWNhdGVFeHBhbmRlZCgpOwogICAgICB0aGlzLnZpZXcuYmF0Y2hSb3dzKCk7CiAgICAgIHJlZiA9IHRoaXMuY2hpbGRyZW47CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICAgIGNoaWxkID0gcmVmW2pdOwogICAgICAgIGNoaWxkLnNob3coKTsKICAgICAgfQogICAgICB0aGlzLnZpZXcudW5iYXRjaFJvd3MoKTsKICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0ZUV4cGFuZCgpOwogICAgfQogIH07CgoKICAvKgogIAlIaWRlcyB0aGlzIG5vZGUncyBjaGlsZHJlbiBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBoaWRkZW4uIENoYW5nZXMgYW55IGV4cGFuZGVyIGljb24uCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuY29sbGFwc2UgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjaGlsZCwgaiwgbGVuLCByZWY7CiAgICBpZiAodGhpcy5pc0V4cGFuZGVkKSB7CiAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IGZhbHNlOwogICAgICB0aGlzLmluZGljYXRlQ29sbGFwc2VkKCk7CiAgICAgIHRoaXMudmlldy5iYXRjaFJvd3MoKTsKICAgICAgcmVmID0gdGhpcy5jaGlsZHJlbjsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgY2hpbGQgPSByZWZbal07CiAgICAgICAgY2hpbGQuaGlkZSgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnZpZXcudW5iYXRjaFJvd3MoKTsKICAgIH0KICB9OwoKCiAgLyoKICAJU3dpdGNoZXMgYmV0d2VlbiBleHBhbmRlZC9jb2xsYXBzZWQgc3RhdGVzCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUudG9nZ2xlRXhwYW5kZWQgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmlzRXhwYW5kZWQpIHsKICAgICAgcmV0dXJuIHRoaXMuY29sbGFwc2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmV4cGFuZCgpOwogICAgfQogIH07CgoKICAvKgogIAlDaGFuZ2VzIHRoZSBleHBhbmRlciBpY29uIHRvIHRoZSAiZXhwYW5kZWQiIHN0YXRlCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuaW5kaWNhdGVFeHBhbmRlZCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudHJzLmZpbmQoJy5mYy1leHBhbmRlciAuZmMtaWNvbicpLnJlbW92ZUNsYXNzKHRoaXMuZ2V0Q29sbGFwc2VkSWNvbigpKS5hZGRDbGFzcyh0aGlzLmdldEV4cGFuZGVkSWNvbigpKTsKICB9OwoKCiAgLyoKICAJQ2hhbmdlcyB0aGUgZXhwYW5kZXIgaWNvbiB0byB0aGUgImNvbGxhcHNlZCIgc3RhdGUKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5pbmRpY2F0ZUNvbGxhcHNlZCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudHJzLmZpbmQoJy5mYy1leHBhbmRlciAuZmMtaWNvbicpLnJlbW92ZUNsYXNzKHRoaXMuZ2V0RXhwYW5kZWRJY29uKCkpLmFkZENsYXNzKHRoaXMuZ2V0Q29sbGFwc2VkSWNvbigpKTsKICB9OwoKCiAgLyoKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5lbmFibGVFeHBhbmRpbmcgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnRycy5maW5kKCcuZmMtZXhwYW5kZXItc3BhY2UnKS5hZGRDbGFzcygnZmMtZXhwYW5kZXInKTsKICB9OwoKCiAgLyoKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5kaXNhYmxlRXhwYW5kaW5nID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50cnMuZmluZCgnLmZjLWV4cGFuZGVyLXNwYWNlJykucmVtb3ZlQ2xhc3MoJ2ZjLWV4cGFuZGVyJykuZmluZCgnLmZjLWljb24nKS5yZW1vdmVDbGFzcyh0aGlzLmdldEV4cGFuZGVkSWNvbigpKS5yZW1vdmVDbGFzcyh0aGlzLmdldENvbGxhcHNlZEljb24oKSk7CiAgfTsKCiAgUm93UGFyZW50LnByb3RvdHlwZS5nZXRFeHBhbmRlZEljb24gPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiAnZmMtaWNvbi1kb3duLXRyaWFuZ2xlJzsKICB9OwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmdldENvbGxhcHNlZEljb24gPSBmdW5jdGlvbigpIHsKICAgIHZhciBkaXI7CiAgICBkaXIgPSB0aGlzLnZpZXcuaXNSVEwgPyAnbGVmdCcgOiAncmlnaHQnOwogICAgcmV0dXJuICdmYy1pY29uLScgKyBkaXIgKyAnLXRyaWFuZ2xlJzsKICB9OwoKCiAgLyoKICAJQ2F1c2VzIGEgc2xpZGUtZG93biBDU1MgdHJhbnNpdGlvbiB0byBkZW1vbnN0cmF0ZSB0aGF0IHRoZSBleHBhbmQgaGFzIGhhcHBlbmVkCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuYW5pbWF0ZUV4cGFuZCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHJlZiwgcmVmMSwgdHJzOwogICAgdHJzID0gKHJlZiA9IHRoaXMuY2hpbGRyZW5bMF0pICE9IG51bGwgPyAocmVmMSA9IHJlZi5nZXRMZWFkaW5nUm93KCkpICE9IG51bGwgPyByZWYxLnRycyA6IHZvaWQgMCA6IHZvaWQgMDsKICAgIGlmICh0cnMpIHsKICAgICAgdHJzLmFkZENsYXNzKCdmYy1jb2xsYXBzZWQnKTsKICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICB0cnMuYWRkQ2xhc3MoJ2ZjLXRyYW5zaXRpb25pbmcnKTsKICAgICAgICByZXR1cm4gdHJzLnJlbW92ZUNsYXNzKCdmYy1jb2xsYXBzZWQnKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnMub25lKCd3ZWJraXRUcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kIG9UcmFuc2l0aW9uRW5kIG1zVHJhbnNpdGlvbkVuZCB0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRycy5yZW1vdmVDbGFzcygnZmMtdHJhbnNpdGlvbmluZycpOwogICAgICB9KTsKICAgIH0KICB9OwoKCiAgLyoKICAJRmluZCBlYWNoIFRScyAiaW5uZXIgZGl2IiAoZGl2IHdpdGhpbiBmaXJzdCBjZWxsKS4gVGhpcyBkaXYgY29udHJvbHMgZWFjaCBUUnMgaGVpZ2h0LgogIAlSZXR1cm5zIHRoZSBtYXggcGl4ZWwgaGVpZ2h0LgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmdldE1heFRySW5uZXJIZWlnaHQgPSBmdW5jdGlvbigpIHsKICAgIHZhciBtYXg7CiAgICBtYXggPSAwOwogICAgJC5lYWNoKHRoaXMudHJIYXNoLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHR5cGUsIHRyKSB7CiAgICAgICAgdmFyIGlubmVyRWw7CiAgICAgICAgaW5uZXJFbCA9IGdldE93bkNlbGxzKHRyKS5maW5kKCc+IGRpdjpub3QoLmZjLWNlbGwtY29udGVudCk6Zmlyc3QnKTsKICAgICAgICByZXR1cm4gbWF4ID0gTWF0aC5tYXgoaW5uZXJFbC5oZWlnaHQoKSwgbWF4KTsKICAgICAgfTsKICAgIH0pKHRoaXMpKTsKICAgIHJldHVybiBtYXg7CiAgfTsKCgogIC8qCiAgCUZpbmQgZWFjaCBUUnMgImlubmVyIGRpdiIgYW5kIHNldHMgYWxsIG9mIHRoZWlyIGhlaWdodHMgdG8gdGhlIHNhbWUgdmFsdWUuCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuc2V0VHJJbm5lckhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCkgewogICAgcmV0dXJuICQuZWFjaCh0aGlzLnRySGFzaCwgKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0eXBlLCB0cikgewogICAgICAgIHJldHVybiBnZXRPd25DZWxscyh0cikuZmluZCgnPiBkaXY6bm90KC5mYy1jZWxsLWNvbnRlbnQpOmZpcnN0JykuaGVpZ2h0KGhlaWdodCk7CiAgICAgIH07CiAgICB9KSh0aGlzKSk7CiAgfTsKCgogIC8qCiAgCVRyaWdnZXJlZCB3aGVuIHRoZSBjdXJyZW50IG5vZGUgaGFzIGJlZW4gc2hvd24gKGVpdGhlciBmcmVzaGx5IHJlbmRlcmVkIG9yIHJlLXNob3duKQogIAl3aGVuIGl0IGhhZCBwcmV2aW91c2x5IGJlZW4gdW5yZW5kZXJlZCBvciBoaWRkZW4uIGBzaG93bmAgZG9lcyBub3QgYnViYmxlIHVwIHRoZSBoaWVyYXJjaHkuCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuc2hvd24gPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmhhc093blJvdykgewogICAgICByZXR1cm4gdGhpcy5yb3dTaG93bih0aGlzKTsKICAgIH0KICB9OwoKCiAgLyoKICAJVHJpZ2dlcmVkIHdoZW4gdGhlIGN1cnJlbnQgbm9kZSBoYXMgYmVlbiBoaWRkZW4gKGVpdGhlciB0ZW1wb3JhcmlseSBvciBwZXJtYW5lbnRseSkKICAJd2hlbiBpdCBoYWQgcHJldmlvdXNseSBiZWVuIHNob3duLiBgaGlkZGVuYCBkb2VzIG5vdCBidWJibGUgdXAgdGhlIGhpZXJhcmNoeS4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5oaWRkZW4gPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmhhc093blJvdykgewogICAgICByZXR1cm4gdGhpcy5yb3dIaWRkZW4odGhpcyk7CiAgICB9CiAgfTsKCgogIC8qCiAgCUp1c3QgbGlrZSBgc2hvd25gLCBidXQgb25seSB0cmlnZ2VyZWQgZm9yIG5vZGVzIHRoYXQgYXJlIGFjdHVhbCByb3dzLiBCdWJibGVzIHVwIHRoZSBoaWVyYXJjaHkuCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUucm93U2hvd24gPSBmdW5jdGlvbihyb3cpIHsKICAgIHJldHVybiAodGhpcy5wYXJlbnQgfHwgdGhpcy52aWV3KS5yb3dTaG93bihyb3cpOwogIH07CgoKICAvKgogIAlKdXN0IGxpa2UgYGhpZGRlbmAsIGJ1dCBvbmx5IHRyaWdnZXJlZCBmb3Igbm9kZXMgdGhhdCBhcmUgYWN0dWFsIHJvd3MuIEJ1YmJsZXMgdXAgdGhlIGhpZXJhcmNoeS4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5yb3dIaWRkZW4gPSBmdW5jdGlvbihyb3cpIHsKICAgIHJldHVybiAodGhpcy5wYXJlbnQgfHwgdGhpcy52aWV3KS5yb3dIaWRkZW4ocm93KTsKICB9OwoKCiAgLyoKICAJVHJpZ2dlcmVkIHdoZW4gdGhlIGN1cnJlbnQgbm9kZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgaGllcmFyY2h5LiBgYWRkZWRgIGRvZXMgbm90IGJ1YmJsZSB1cC4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5hZGRlZCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuaGFzT3duUm93KSB7CiAgICAgIHJldHVybiB0aGlzLnJvd0FkZGVkKHRoaXMpOwogICAgfQogIH07CgoKICAvKgogIAlUcmlnZ2VyZWQgd2hlbiB0aGUgY3VycmVudCBub2RlIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgaGllcmFyY2h5LiBgcmVtb3ZlZGAgZG9lcyBub3QgYnViYmxlIHVwLgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnJlbW92ZWQgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmhhc093blJvdykgewogICAgICByZXR1cm4gdGhpcy5yb3dSZW1vdmVkKHRoaXMpOwogICAgfQogIH07CgoKICAvKgogIAlKdXN0IGxpa2UgYGFkZGVkYCwgYnV0IG9ubHkgdHJpZ2dlcmVkIGZvciBub2RlcyB0aGF0IGFyZSBhY3R1YWwgcm93cy4gQnViYmxlcyB1cCB0aGUgaGllcmFyY2h5LgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnJvd0FkZGVkID0gZnVuY3Rpb24ocm93KSB7CiAgICByZXR1cm4gKHRoaXMucGFyZW50IHx8IHRoaXMudmlldykucm93QWRkZWQocm93KTsKICB9OwoKCiAgLyoKICAJSnVzdCBsaWtlIGByZW1vdmVkYCwgYnV0IG9ubHkgdHJpZ2dlcmVkIGZvciBub2RlcyB0aGF0IGFyZSBhY3R1YWwgcm93cy4gQnViYmxlcyB1cCB0aGUgaGllcmFyY2h5LgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnJvd1JlbW92ZWQgPSBmdW5jdGlvbihyb3cpIHsKICAgIHJldHVybiAodGhpcy5wYXJlbnQgfHwgdGhpcy52aWV3KS5yb3dSZW1vdmVkKHJvdyk7CiAgfTsKCiAgcmV0dXJuIFJvd1BhcmVudDsKCn0pKCk7CgoKLyoKQW4gYWJzdHJhY3Qgbm9kZSBpbiBhIHJvdy1oaWVyYXJjaHkgdHJlZSB0aGF0IGNvbnRhaW5zIG90aGVyIG5vZGVzLgpXaWxsIGhhdmUgc29tZSBzb3J0IG9mIHJlbmRlcmVkIGxhYmVsIGluZGljYXRpbmcgdGhlIGdyb3VwaW5nLAp1cCB0byB0aGUgc3ViY2xhc3MgZm9yIGRldGVybWluaW5nIHdoYXQgdG8gZG8gd2l0aCBpdC4KICovCgpSb3dHcm91cCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKFJvd0dyb3VwLCBzdXBlckNsYXNzKTsKCiAgUm93R3JvdXAucHJvdG90eXBlLmdyb3VwU3BlYyA9IG51bGw7CgogIFJvd0dyb3VwLnByb3RvdHlwZS5ncm91cFZhbHVlID0gbnVsbDsKCiAgZnVuY3Rpb24gUm93R3JvdXAodmlldywgZ3JvdXBTcGVjMSwgZ3JvdXBWYWx1ZTEpIHsKICAgIHRoaXMuZ3JvdXBTcGVjID0gZ3JvdXBTcGVjMTsKICAgIHRoaXMuZ3JvdXBWYWx1ZSA9IGdyb3VwVmFsdWUxOwogICAgUm93R3JvdXAuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKCiAgLyoKICAJQ2FsbGVkIHdoZW4gdGhpcyByb3cgKGlmIGl0IHJlbmRlcnMgYSByb3cpIG9yIGEgc3Vicm93IGlzIHJlbW92ZWQKICAgKi8KCiAgUm93R3JvdXAucHJvdG90eXBlLnJvd1JlbW92ZWQgPSBmdW5jdGlvbihyb3cpIHsKICAgIFJvd0dyb3VwLl9fc3VwZXJfXy5yb3dSZW1vdmVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAocm93ICE9PSB0aGlzICYmICF0aGlzLmNoaWxkcmVuLmxlbmd0aCkgewogICAgICByZXR1cm4gdGhpcy5yZW1vdmUoKTsKICAgIH0KICB9OwoKCiAgLyoKICAJUmVuZGVycyB0aGUgY29udGVudCB3cmFwcGVyIGVsZW1lbnQgdGhhdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhpcyByb3cncyBURCBjZWxsCiAgICovCgogIFJvd0dyb3VwLnByb3RvdHlwZS5yZW5kZXJHcm91cENvbnRlbnRFbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNvbnRlbnRFbCwgZmlsdGVyOwogICAgY29udGVudEVsID0gJCgnPGRpdiBjbGFzcz0iZmMtY2VsbC1jb250ZW50IiAvPicpLmFwcGVuZCh0aGlzLnJlbmRlckdyb3VwVGV4dEVsKCkpOwogICAgZmlsdGVyID0gdGhpcy5ncm91cFNwZWMucmVuZGVyOwogICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgY29udGVudEVsID0gZmlsdGVyKGNvbnRlbnRFbCwgdGhpcy5ncm91cFZhbHVlKSB8fCBjb250ZW50RWw7CiAgICB9CiAgICByZXR1cm4gY29udGVudEVsOwogIH07CgoKICAvKgogIAlSZW5kZXJzIHRoZSB0ZXh0IHNwYW4gZWxlbWVudCB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGlzIHJvdydzIFREIGNlbGwuCiAgCUdvZXMgd2l0aGluIHRoZSBjb250ZW50IGVsZW1lbnQuCiAgICovCgogIFJvd0dyb3VwLnByb3RvdHlwZS5yZW5kZXJHcm91cFRleHRFbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGZpbHRlciwgdGV4dDsKICAgIHRleHQgPSB0aGlzLmdyb3VwVmFsdWUgfHwgJyc7CiAgICBmaWx0ZXIgPSB0aGlzLmdyb3VwU3BlYy50ZXh0OwogICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdGV4dCA9IGZpbHRlcih0ZXh0KSB8fCB0ZXh0OwogICAgfQogICAgcmV0dXJuICQoJzxzcGFuIGNsYXNzPSJmYy1jZWxsLXRleHQiIC8+JykudGV4dCh0ZXh0KTsKICB9OwoKICByZXR1cm4gUm93R3JvdXA7Cgp9KShSb3dQYXJlbnQpOwoKCi8qCkEgcm93IGdyb3VwaW5nIHRoYXQgcmVuZGVycyBhcyBhIHNpbmdsZSBzb2xpZCByb3cgdGhhdCBzcGFucyB3aWR0aC13aXNlIChsaWtlIGEgaG9yaXpvbnRhbCBydWxlKQogKi8KCkhSb3dHcm91cCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKEhSb3dHcm91cCwgc3VwZXJDbGFzcyk7CgogIGZ1bmN0aW9uIEhSb3dHcm91cCgpIHsKICAgIHJldHVybiBIUm93R3JvdXAuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKICBIUm93R3JvdXAucHJvdG90eXBlLmhhc093blJvdyA9IHRydWU7CgoKICAvKgogIAlSZW5kZXJzIHRoaXMgcm93J3MgVFIgZm9yIHRoZSAic3ByZWFkc2hlZXQiIHF1YWRyYW50LCB0aGUgYXJlYSB3aXRoIGluZm8gYWJvdXQgZWFjaCByZXNvdXJjZQogICAqLwoKICBIUm93R3JvdXAucHJvdG90eXBlLnJlbmRlclNwcmVhZHNoZWV0Q29udGVudCA9IGZ1bmN0aW9uKHRyKSB7CiAgICB2YXIgY29udGVudEVsOwogICAgY29udGVudEVsID0gdGhpcy5yZW5kZXJHcm91cENvbnRlbnRFbCgpOwogICAgY29udGVudEVsLnByZXBlbmQoJzxzcGFuIGNsYXNzPSJmYy1leHBhbmRlciI+JyArICc8c3BhbiBjbGFzcz0iZmMtaWNvbiI+PC9zcGFuPicgKyAnPC9zcGFuPicpOwogICAgcmV0dXJuICQoJzx0ZCBjbGFzcz0iZmMtZGl2aWRlciIgLz4nKS5hdHRyKCdjb2xzcGFuJywgdGhpcy52aWV3LmNvbFNwZWNzLmxlbmd0aCkuYXBwZW5kKCQoJzxkaXYvPicpLmFwcGVuZChjb250ZW50RWwpKS5hcHBlbmRUbyh0cik7CiAgfTsKCgogIC8qCiAgCVJlbmRlcnMgdGhpcyByb3cncyBUUiBmb3IgdGhlIHF1YWRyYW50IHRoYXQgY29udGFpbnMgYSByZXNvdXJjZSdzIGV2ZW50cwogICAqLwoKICBIUm93R3JvdXAucHJvdG90eXBlLnJlbmRlckV2ZW50Q29udGVudCA9IGZ1bmN0aW9uKHRyKSB7CiAgICByZXR1cm4gdHIuYXBwZW5kKCc8dGQgY2xhc3M9ImZjLWRpdmlkZXIiPiA8ZGl2Lz4gPC90ZD4nKTsKICB9OwoKICByZXR1cm4gSFJvd0dyb3VwOwoKfSkoUm93R3JvdXApOwoKCi8qCkEgcm93IGdyb3VwaW5nIHRoYXQgcmVuZGVycyBhcyBhIHRhbGwgbXVsdGktY2VsbCB2ZXJ0aWNhbCBzcGFuIGluIHRoZSAic3ByZWFkc2hlZXQiIGFyZWEKICovCgpWUm93R3JvdXAgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChWUm93R3JvdXAsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBWUm93R3JvdXAoKSB7CiAgICByZXR1cm4gVlJvd0dyb3VwLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgVlJvd0dyb3VwLnByb3RvdHlwZS5yb3dzcGFuID0gMDsKCiAgVlJvd0dyb3VwLnByb3RvdHlwZS5sZWFkaW5nVHIgPSBudWxsOwoKICBWUm93R3JvdXAucHJvdG90eXBlLmdyb3VwVGQgPSBudWxsOwoKCiAgLyoKICAJQ2FsbGVkIHdoZW4gYSByb3cgc29tZXdoZXJlIHdpdGhpbiB0aGUgZ3JvdXBpbmcgaXMgc2hvd24KICAgKi8KCiAgVlJvd0dyb3VwLnByb3RvdHlwZS5yb3dTaG93biA9IGZ1bmN0aW9uKHJvdykgewogICAgdGhpcy5yb3dzcGFuICs9IDE7CiAgICB0aGlzLnJlbmRlclJvd3NwYW4oKTsKICAgIHJldHVybiBWUm93R3JvdXAuX19zdXBlcl9fLnJvd1Nob3duLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfTsKCgogIC8qCiAgCUNhbGxlZCB3aGVuIGEgcm93IHNvbWV3aGVyZSB3aXRoaW4gdGhlIGdyb3VwaW5nIGlzIGhpZGRlbgogICAqLwoKICBWUm93R3JvdXAucHJvdG90eXBlLnJvd0hpZGRlbiA9IGZ1bmN0aW9uKHJvdykgewogICAgdGhpcy5yb3dzcGFuIC09IDE7CiAgICB0aGlzLnJlbmRlclJvd3NwYW4oKTsKICAgIHJldHVybiBWUm93R3JvdXAuX19zdXBlcl9fLnJvd0hpZGRlbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH07CgoKICAvKgogIAlNYWtlcyBzdXJlIHRoZSBncm91cFRkIGhhcyB0aGUgY29ycmVjdCByb3dzcGFuIC8gcGxhY2UgaW4gdGhlIERPTS4KICAJUFJFQ09ORElUSU9OOiBpbiB0aGUgY2FzZSBvZiBtdWx0aXBsZSBncm91cCBuZXN0aW5nLCBhIGNoaWxkJ3MgcmVuZGVyUm93c3BhbigpCiAgCXdpbGwgYmUgY2FsbGVkIGJlZm9yZSB0aGUgcGFyZW50J3MgcmVuZGVyUm93c3BhbigpLgogICAqLwoKICBWUm93R3JvdXAucHJvdG90eXBlLnJlbmRlclJvd3NwYW4gPSBmdW5jdGlvbigpIHsKICAgIHZhciBsZWFkaW5nVHI7CiAgICBpZiAodGhpcy5yb3dzcGFuKSB7CiAgICAgIGlmICghdGhpcy5ncm91cFRkKSB7CiAgICAgICAgdGhpcy5ncm91cFRkID0gJCgnPHRkIGNsYXNzPSInICsgdGhpcy52aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciLz4nKS5hcHBlbmQodGhpcy5yZW5kZXJHcm91cENvbnRlbnRFbCgpKTsKICAgICAgfQogICAgICB0aGlzLmdyb3VwVGQuYXR0cigncm93c3BhbicsIHRoaXMucm93c3Bhbik7CiAgICAgIGxlYWRpbmdUciA9IHRoaXMuZ2V0TGVhZGluZ1JvdygpLmdldFRyKCdzcHJlYWRzaGVldCcpOwogICAgICBpZiAobGVhZGluZ1RyICE9PSB0aGlzLmxlYWRpbmdUcikgewogICAgICAgIGlmIChsZWFkaW5nVHIpIHsKICAgICAgICAgIGxlYWRpbmdUci5wcmVwZW5kKHRoaXMuZ3JvdXBUZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmxlYWRpbmdUciA9IGxlYWRpbmdUcjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKHRoaXMuZ3JvdXBUZCkgewogICAgICAgIHRoaXMuZ3JvdXBUZC5yZW1vdmUoKTsKICAgICAgICB0aGlzLmdyb3VwVGQgPSBudWxsOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLmxlYWRpbmdUciA9IG51bGw7CiAgICB9CiAgfTsKCiAgcmV0dXJuIFZSb3dHcm91cDsKCn0pKFJvd0dyb3VwKTsKCkV2ZW50Um93ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHsKICBleHRlbmQoRXZlbnRSb3csIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBFdmVudFJvdygpIHsKICAgIHJldHVybiBFdmVudFJvdy5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CgogIEV2ZW50Um93LnByb3RvdHlwZS5oYXNPd25Sb3cgPSB0cnVlOwoKICBFdmVudFJvdy5wcm90b3R5cGUuc2VnQ29udGFpbmVyRWwgPSBudWxsOwoKICBFdmVudFJvdy5wcm90b3R5cGUuc2VnQ29udGFpbmVySGVpZ2h0ID0gbnVsbDsKCiAgRXZlbnRSb3cucHJvdG90eXBlLmlubmVyRWwgPSBudWxsOwoKICBFdmVudFJvdy5wcm90b3R5cGUuYmdTZWdDb250YWluZXJFbCA9IG51bGw7CgogIEV2ZW50Um93LnByb3RvdHlwZS5pc1NlZ3NSZW5kZXJlZCA9IGZhbHNlOwoKICBFdmVudFJvdy5wcm90b3R5cGUuaXNCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQgPSBmYWxzZTsKCiAgRXZlbnRSb3cucHJvdG90eXBlLmJ1c2luZXNzSG91clNlZ3MgPSBudWxsOwoKICBFdmVudFJvdy5wcm90b3R5cGUuYmdTZWdzID0gbnVsbDsKCiAgRXZlbnRSb3cucHJvdG90eXBlLmZnU2VncyA9IG51bGw7CgogIEV2ZW50Um93LnByb3RvdHlwZS5yZW5kZXJFdmVudENvbnRlbnQgPSBmdW5jdGlvbih0cikgewogICAgdHIuaHRtbCgnPHRkIGNsYXNzPSInICsgdGhpcy52aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciPiA8ZGl2PiA8ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIiIC8+IDwvZGl2PiA8L3RkPicpOwogICAgdGhpcy5zZWdDb250YWluZXJFbCA9IHRyLmZpbmQoJy5mYy1ldmVudC1jb250YWluZXInKTsKICAgIHRoaXMuaW5uZXJFbCA9IHRoaXMuYmdTZWdDb250YWluZXJFbCA9IHRyLmZpbmQoJ3RkID4gZGl2Jyk7CiAgICByZXR1cm4gdGhpcy5lbnN1cmVTZWdzUmVuZGVyZWQoKTsKICB9OwoKICBFdmVudFJvdy5wcm90b3R5cGUuZW5zdXJlU2Vnc1JlbmRlcmVkID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoIXRoaXMuaXNTZWdzUmVuZGVyZWQpIHsKICAgICAgdGhpcy5lbnN1cmVCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQoKTsKICAgICAgaWYgKHRoaXMuYmdTZWdzKSB7CiAgICAgICAgdGhpcy52aWV3LnRpbWVHcmlkLnJlbmRlckZpbGxJbkNvbnRhaW5lcignYmdFdmVudCcsIHRoaXMsIHRoaXMuYmdTZWdzKTsKICAgICAgfQogICAgICBpZiAodGhpcy5mZ1NlZ3MpIHsKICAgICAgICB0aGlzLnZpZXcudGltZUdyaWQucmVuZGVyRmdTZWdzSW5Db250YWluZXJzKFtbdGhpcywgdGhpcy5mZ1NlZ3NdXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuaXNTZWdzUmVuZGVyZWQgPSB0cnVlOwogICAgfQogIH07CgogIEV2ZW50Um93LnByb3RvdHlwZS5lbnN1cmVCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmJ1c2luZXNzSG91clNlZ3MgJiYgIXRoaXMuaXNCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQpIHsKICAgICAgdGhpcy52aWV3LnRpbWVHcmlkLnJlbmRlckZpbGxJbkNvbnRhaW5lcignYnVzaW5lc3NIb3VycycsIHRoaXMsIHRoaXMuYnVzaW5lc3NIb3VyU2VncywgJ2JnZXZlbnQnKTsKICAgICAgcmV0dXJuIHRoaXMuaXNCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQgPSB0cnVlOwogICAgfQogIH07CgogIEV2ZW50Um93LnByb3RvdHlwZS51bnJlbmRlckV2ZW50Q29udGVudCA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jbGVhckJ1c2luZXNzSG91clNlZ3MoKTsKICAgIHRoaXMuYmdTZWdzID0gbnVsbDsKICAgIHRoaXMuZmdTZWdzID0gbnVsbDsKICAgIHJldHVybiB0aGlzLmlzU2Vnc1JlbmRlcmVkID0gZmFsc2U7CiAgfTsKCiAgRXZlbnRSb3cucHJvdG90eXBlLmNsZWFyQnVzaW5lc3NIb3VyU2VncyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGosIGxlbiwgcmVmLCBzZWc7CiAgICBpZiAodGhpcy5idXNpbmVzc0hvdXJTZWdzKSB7CiAgICAgIHJlZiA9IHRoaXMuYnVzaW5lc3NIb3VyU2VnczsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgc2VnID0gcmVmW2pdOwogICAgICAgIGlmIChzZWcuZWwpIHsKICAgICAgICAgIHNlZy5lbC5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5idXNpbmVzc0hvdXJTZWdzID0gbnVsbDsKICAgIH0KICAgIHJldHVybiB0aGlzLmlzQnVzaW5lc3NIb3VyU2Vnc1JlbmRlcmVkID0gZmFsc2U7CiAgfTsKCiAgcmV0dXJuIEV2ZW50Um93OwoKfSkoUm93UGFyZW50KTsKCgovKgpBIHJvdyB0aGF0IHJlbmRlcnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIHJlc291cmNlLCBhcyB3ZWxsIGFzIGl0IGV2ZW50cyAoaGFuZGxlZCBieSBzdXBlcmNsYXNzKQogKi8KClJlc291cmNlUm93ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHsKICBleHRlbmQoUmVzb3VyY2VSb3csIHN1cGVyQ2xhc3MpOwoKICBSZXNvdXJjZVJvdy5wcm90b3R5cGUucmVzb3VyY2UgPSBudWxsOwoKICBmdW5jdGlvbiBSZXNvdXJjZVJvdyh2aWV3LCByZXNvdXJjZTEpIHsKICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTE7CiAgICBSZXNvdXJjZVJvdy5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CgoKICAvKgogIAlDYWxsZWQgd2hlbiBhIHJvdyBpbiB0aGUgdHJlZSBoYXMgYmVlbiBhZGRlZAogICAqLwoKICBSZXNvdXJjZVJvdy5wcm90b3R5cGUucm93QWRkZWQgPSBmdW5jdGlvbihyb3cpIHsKICAgIFJlc291cmNlUm93Ll9fc3VwZXJfXy5yb3dBZGRlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKHJvdyAhPT0gdGhpcyAmJiB0aGlzLmlzUmVuZGVyZWQpIHsKICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7CiAgICAgICAgdGhpcy5lbmFibGVFeHBhbmRpbmcoKTsKICAgICAgICBpZiAodGhpcy5pc0V4cGFuZGVkKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5pbmRpY2F0ZUV4cGFuZGVkKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiB0aGlzLmluZGljYXRlQ29sbGFwc2VkKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKCgogIC8qCiAgCUNhbGxlZCB3aGVuIGEgcm93IGluIHRoZSB0cmVlIGhhcyBiZWVuIHJlbW92ZWQKICAgKi8KCiAgUmVzb3VyY2VSb3cucHJvdG90eXBlLnJvd1JlbW92ZWQgPSBmdW5jdGlvbihyb3cpIHsKICAgIFJlc291cmNlUm93Ll9fc3VwZXJfXy5yb3dSZW1vdmVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAocm93ICE9PSB0aGlzICYmIHRoaXMuaXNSZW5kZXJlZCkgewogICAgICBpZiAoIXRoaXMuY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZUV4cGFuZGluZygpOwogICAgICB9CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VSb3cucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgUmVzb3VyY2VSb3cuX19zdXBlcl9fLnJlbmRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICB0aGlzLmVuYWJsZUV4cGFuZGluZygpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kaXNhYmxlRXhwYW5kaW5nKCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy52aWV3LnRyaWdnZXIoJ3Jlc291cmNlUmVuZGVyJywgdGhpcy5yZXNvdXJjZSwgdGhpcy5yZXNvdXJjZSwgdGhpcy5nZXRUcignc3ByZWFkc2hlZXQnKS5maW5kKCc+IHRkJyksIHRoaXMuZ2V0VHIoJ2V2ZW50JykuZmluZCgnPiB0ZCcpKTsKICB9OwoKICBSZXNvdXJjZVJvdy5wcm90b3R5cGUucmVuZGVyRXZlbnRDb250ZW50ID0gZnVuY3Rpb24odHIpIHsKICAgIFJlc291cmNlUm93Ll9fc3VwZXJfXy5yZW5kZXJFdmVudENvbnRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHJldHVybiB0ci5hdHRyKCdkYXRhLXJlc291cmNlLWlkJywgdGhpcy5yZXNvdXJjZS5pZCk7CiAgfTsKCgogIC8qCiAgCVBvcHVsYXRlcyB0aGUgVFIgd2l0aCBjZWxscyBjb250YWluaW5nIGRhdGEgYWJvdXQgdGhlIHJlc291cmNlCiAgICovCgogIFJlc291cmNlUm93LnByb3RvdHlwZS5yZW5kZXJTcHJlYWRzaGVldENvbnRlbnQgPSBmdW5jdGlvbih0cikgewogICAgdmFyIGNvbFNwZWMsIGNvbnRlbnRFbCwgaW5wdXQsIGosIGxlbiwgcmVmLCByZXNvdXJjZSwgdGQsIHRleHQ7CiAgICByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2U7CiAgICByZWYgPSB0aGlzLnZpZXcuY29sU3BlY3M7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgY29sU3BlYyA9IHJlZltqXTsKICAgICAgaWYgKGNvbFNwZWMuZ3JvdXApIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpbnB1dCA9IGNvbFNwZWMuZmllbGQgPyByZXNvdXJjZVtjb2xTcGVjLmZpZWxkXSB8fCBudWxsIDogcmVzb3VyY2U7CiAgICAgIHRleHQgPSB0eXBlb2YgY29sU3BlYy50ZXh0ID09PSAnZnVuY3Rpb24nID8gY29sU3BlYy50ZXh0KHJlc291cmNlLCBpbnB1dCkgOiBpbnB1dDsKICAgICAgY29udGVudEVsID0gJCgnPGRpdiBjbGFzcz0iZmMtY2VsbC1jb250ZW50Ij4nICsgKGNvbFNwZWMuaXNNYWluID8gdGhpcy5yZW5kZXJHdXR0ZXJIdG1sKCkgOiAnJykgKyAnPHNwYW4gY2xhc3M9ImZjLWNlbGwtdGV4dCI+JyArICh0ZXh0ID8gaHRtbEVzY2FwZSh0ZXh0KSA6ICcmbmJzcDsnKSArICc8L3NwYW4+JyArICc8L2Rpdj4nKTsKICAgICAgaWYgKHR5cGVvZiBjb2xTcGVjLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGNvbnRlbnRFbCA9IGNvbFNwZWMucmVuZGVyKHJlc291cmNlLCBjb250ZW50RWwsIGlucHV0KSB8fCBjb250ZW50RWw7CiAgICAgIH0KICAgICAgdGQgPSAkKCc8dGQgY2xhc3M9IicgKyB0aGlzLnZpZXcud2lkZ2V0Q29udGVudENsYXNzICsgJyIvPicpLmFwcGVuZChjb250ZW50RWwpOwogICAgICBpZiAoY29sU3BlYy5pc01haW4pIHsKICAgICAgICB0ZC53cmFwSW5uZXIoJzxkaXYvPicpOwogICAgICB9CiAgICAgIHRyLmFwcGVuZCh0ZCk7CiAgICB9CiAgICByZXR1cm4gdHIuYXR0cignZGF0YS1yZXNvdXJjZS1pZCcsIHJlc291cmNlLmlkKTsKICB9OwoKCiAgLyoKICAJUmVuZGVycyB0aGUgSFRNTCByZXNwb25zaWJsZSBmb3IgdGhlIHN1YnJvdyBleHBhbmRlciBhcmVhLAogIAlhcyB3ZWxsIGFzIHRoZSBzcGFjZSBiZWZvcmUgaXQgKHVzZWQgdG8gYWxpZ24gZXhwYW5kZXJzIG9mIHNpbWlsYXIgZGVwdGhzKQogICAqLwoKICBSZXNvdXJjZVJvdy5wcm90b3R5cGUucmVuZGVyR3V0dGVySHRtbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGh0bWwsIGksIGosIHJlZjsKICAgIGh0bWwgPSAnJzsKICAgIGZvciAoaSA9IGogPSAwLCByZWYgPSB0aGlzLmRlcHRoOyBqIDwgcmVmOyBpID0gaiArPSAxKSB7CiAgICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPSJmYy1pY29uIi8+JzsKICAgIH0KICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPSJmYy1leHBhbmRlci1zcGFjZSI+JyArICc8c3BhbiBjbGFzcz0iZmMtaWNvbiI+PC9zcGFuPicgKyAnPC9zcGFuPic7CiAgICByZXR1cm4gaHRtbDsKICB9OwoKICByZXR1cm4gUmVzb3VyY2VSb3c7Cgp9KShFdmVudFJvdyk7CgpGQy52aWV3cy50aW1lbGluZS5yZXNvdXJjZUNsYXNzID0gUmVzb3VyY2VUaW1lbGluZVZpZXc7CgpSZXNvdXJjZUFnZW5kYVZpZXcgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChSZXNvdXJjZUFnZW5kYVZpZXcsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBSZXNvdXJjZUFnZW5kYVZpZXcoKSB7CiAgICByZXR1cm4gUmVzb3VyY2VBZ2VuZGFWaWV3Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgUmVzb3VyY2VBZ2VuZGFWaWV3Lm1peGluKFJlc291cmNlVmlld01peGluKTsKCiAgUmVzb3VyY2VBZ2VuZGFWaWV3LnByb3RvdHlwZS50aW1lR3JpZENsYXNzID0gUmVzb3VyY2VUaW1lR3JpZDsKCiAgUmVzb3VyY2VBZ2VuZGFWaWV3LnByb3RvdHlwZS5kYXlHcmlkQ2xhc3MgPSBSZXNvdXJjZURheUdyaWQ7CgogIFJlc291cmNlQWdlbmRhVmlldy5wcm90b3R5cGUucmVuZGVySGVhZCA9IGZ1bmN0aW9uKCkgewogICAgUmVzb3VyY2VBZ2VuZGFWaWV3Ll9fc3VwZXJfXy5yZW5kZXJIZWFkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5wcm9jZXNzSGVhZFJlc291cmNlRWxzKHRoaXMuaGVhZENvbnRhaW5lckVsKTsKICB9OwoKICBSZXNvdXJjZUFnZW5kYVZpZXcucHJvdG90eXBlLnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKHJlc291cmNlcykgewogICAgdGhpcy50aW1lR3JpZC5zZXRSZXNvdXJjZXMocmVzb3VyY2VzKTsKICAgIGlmICh0aGlzLmRheUdyaWQpIHsKICAgICAgdGhpcy5kYXlHcmlkLnNldFJlc291cmNlcyhyZXNvdXJjZXMpOwogICAgfQogICAgdGhpcy5jbGVhclZpZXcoKTsKICAgIHJldHVybiB0aGlzLmRpc3BsYXlWaWV3KCk7CiAgfTsKCiAgUmVzb3VyY2VBZ2VuZGFWaWV3LnByb3RvdHlwZS51bnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKGlzRGVzdHJveWluZykgewogICAgdGhpcy5jbGVhckV2ZW50cygpOwogICAgdGhpcy50aW1lR3JpZC51bnNldFJlc291cmNlcygpOwogICAgaWYgKHRoaXMuZGF5R3JpZCkgewogICAgICB0aGlzLmRheUdyaWQudW5zZXRSZXNvdXJjZXMoKTsKICAgIH0KICAgIGlmICghaXNEZXN0cm95aW5nKSB7CiAgICAgIHRoaXMuY2xlYXJWaWV3KCk7CiAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlWaWV3KCk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIFJlc291cmNlQWdlbmRhVmlldzsKCn0pKEZDLkFnZW5kYVZpZXcpOwoKRkMudmlld3MuYWdlbmRhLnF1ZXJ5UmVzb3VyY2VDbGFzcyA9IGZ1bmN0aW9uKHZpZXdTcGVjKSB7CiAgdmFyIHJlZjsKICBpZiAoKHJlZiA9IHZpZXdTcGVjLm9wdGlvbnMuZ3JvdXBCeVJlc291cmNlIHx8IHZpZXdTcGVjLm9wdGlvbnMuZ3JvdXBCeURhdGVBbmRSZXNvdXJjZSkgIT0gbnVsbCA/IHJlZiA6IHZpZXdTcGVjLmR1cmF0aW9uLmFzKCdkYXlzJykgPT09IDEpIHsKICAgIHJldHVybiBSZXNvdXJjZUFnZW5kYVZpZXc7CiAgfQp9OwoKUmVzb3VyY2VCYXNpY1ZpZXcgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChSZXNvdXJjZUJhc2ljVmlldywgc3VwZXJDbGFzcyk7CgogIGZ1bmN0aW9uIFJlc291cmNlQmFzaWNWaWV3KCkgewogICAgcmV0dXJuIFJlc291cmNlQmFzaWNWaWV3Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgUmVzb3VyY2VCYXNpY1ZpZXcubWl4aW4oUmVzb3VyY2VWaWV3TWl4aW4pOwoKICBSZXNvdXJjZUJhc2ljVmlldy5wcm90b3R5cGUuZGF5R3JpZENsYXNzID0gUmVzb3VyY2VEYXlHcmlkOwoKICBSZXNvdXJjZUJhc2ljVmlldy5wcm90b3R5cGUucmVuZGVySGVhZCA9IGZ1bmN0aW9uKCkgewogICAgUmVzb3VyY2VCYXNpY1ZpZXcuX19zdXBlcl9fLnJlbmRlckhlYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHJldHVybiB0aGlzLmRheUdyaWQucHJvY2Vzc0hlYWRSZXNvdXJjZUVscyh0aGlzLmhlYWRDb250YWluZXJFbCk7CiAgfTsKCiAgUmVzb3VyY2VCYXNpY1ZpZXcucHJvdG90eXBlLnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKHJlc291cmNlcykgewogICAgdGhpcy5kYXlHcmlkLnNldFJlc291cmNlcyhyZXNvdXJjZXMpOwogICAgdGhpcy5jbGVhclZpZXcoKTsKICAgIHJldHVybiB0aGlzLmRpc3BsYXlWaWV3KCk7CiAgfTsKCiAgUmVzb3VyY2VCYXNpY1ZpZXcucHJvdG90eXBlLnVuc2V0UmVzb3VyY2VzID0gZnVuY3Rpb24oaXNEZXN0cm95aW5nKSB7CiAgICB0aGlzLmNsZWFyRXZlbnRzKCk7CiAgICB0aGlzLmRheUdyaWQudW5zZXRSZXNvdXJjZXMoKTsKICAgIGlmICghaXNEZXN0cm95aW5nKSB7CiAgICAgIHRoaXMuY2xlYXJWaWV3KCk7CiAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlWaWV3KCk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIFJlc291cmNlQmFzaWNWaWV3OwoKfSkoRkMuQmFzaWNWaWV3KTsKClJlc291cmNlTW9udGhWaWV3ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHsKICBleHRlbmQoUmVzb3VyY2VNb250aFZpZXcsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBSZXNvdXJjZU1vbnRoVmlldygpIHsKICAgIHJldHVybiBSZXNvdXJjZU1vbnRoVmlldy5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CgogIFJlc291cmNlTW9udGhWaWV3Lm1peGluKFJlc291cmNlVmlld01peGluKTsKCiAgUmVzb3VyY2VNb250aFZpZXcucHJvdG90eXBlLmRheUdyaWRDbGFzcyA9IFJlc291cmNlRGF5R3JpZDsKCiAgUmVzb3VyY2VNb250aFZpZXcucHJvdG90eXBlLnJlbmRlckhlYWQgPSBmdW5jdGlvbigpIHsKICAgIFJlc291cmNlTW9udGhWaWV3Ll9fc3VwZXJfXy5yZW5kZXJIZWFkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdGhpcy5kYXlHcmlkLnByb2Nlc3NIZWFkUmVzb3VyY2VFbHModGhpcy5oZWFkQ29udGFpbmVyRWwpOwogIH07CgogIFJlc291cmNlTW9udGhWaWV3LnByb3RvdHlwZS5zZXRSZXNvdXJjZXMgPSBmdW5jdGlvbihyZXNvdXJjZXMpIHsKICAgIHRoaXMuZGF5R3JpZC5zZXRSZXNvdXJjZXMocmVzb3VyY2VzKTsKICAgIHRoaXMuY2xlYXJWaWV3KCk7CiAgICByZXR1cm4gdGhpcy5kaXNwbGF5VmlldygpOwogIH07CgogIFJlc291cmNlTW9udGhWaWV3LnByb3RvdHlwZS51bnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jbGVhckV2ZW50cygpOwogICAgdGhpcy5kYXlHcmlkLnVuc2V0UmVzb3VyY2VzKCk7CiAgICB0aGlzLmNsZWFyVmlldygpOwogICAgcmV0dXJuIHRoaXMuZGlzcGxheVZpZXcoKTsKICB9OwoKICByZXR1cm4gUmVzb3VyY2VNb250aFZpZXc7Cgp9KShGQy5Nb250aFZpZXcpOwoKRkMudmlld3MuYmFzaWMucXVlcnlSZXNvdXJjZUNsYXNzID0gZnVuY3Rpb24odmlld1NwZWMpIHsKICB2YXIgcmVmOwogIGlmICgocmVmID0gdmlld1NwZWMub3B0aW9ucy5ncm91cEJ5UmVzb3VyY2UgfHwgdmlld1NwZWMub3B0aW9ucy5ncm91cEJ5RGF0ZUFuZFJlc291cmNlKSAhPSBudWxsID8gcmVmIDogdmlld1NwZWMuZHVyYXRpb24uYXMoJ2RheXMnKSA9PT0gMSkgewogICAgcmV0dXJuIFJlc291cmNlQmFzaWNWaWV3OwogIH0KfTsKCkZDLnZpZXdzLm1vbnRoLnF1ZXJ5UmVzb3VyY2VDbGFzcyA9IGZ1bmN0aW9uKHZpZXdTcGVjKSB7CiAgaWYgKHZpZXdTcGVjLm9wdGlvbnMuZ3JvdXBCeVJlc291cmNlIHx8IHZpZXdTcGVjLm9wdGlvbnMuZ3JvdXBCeURhdGVBbmRSZXNvdXJjZSkgewogICAgcmV0dXJuIFJlc291cmNlTW9udGhWaWV3OwogIH0KfTsKClJFTEVBU0VfREFURSA9ICcyMDE2LTA5LTA0JzsKClVQR1JBREVfV0lORE9XID0gewogIHllYXJzOiAxLAogIHdlZWtzOiAxCn07CgpMSUNFTlNFX0lORk9fVVJMID0gJ2h0dHA6Ly9mdWxsY2FsZW5kYXIuaW8vc2NoZWR1bGVyL2xpY2Vuc2UvJzsKClBSRVNFVF9MSUNFTlNFX0tFWVMgPSBbJ0dQTC1NeS1Qcm9qZWN0LUlzLU9wZW4tU291cmNlJywgJ0NDLUF0dHJpYnV0aW9uLU5vbkNvbW1lcmNpYWwtTm9EZXJpdmF0aXZlcyddOwoKcHJvY2Vzc0xpY2Vuc2VLZXkgPSBmdW5jdGlvbihrZXksIGNvbnRhaW5lckVsKSB7CiAgaWYgKCFpc0ltbXVuZVVybCh3aW5kb3cubG9jYXRpb24uaHJlZikgJiYgIWlzVmFsaWRLZXkoa2V5KSkgewogICAgaWYgKCFkZXRlY3RXYXJuaW5nSW5Db250YWluZXIoY29udGFpbmVyRWwpKSB7CiAgICAgIHJldHVybiByZW5kZXJpbmdXYXJuaW5nSW5Db250YWluZXIoJ1BsZWFzZSB1c2UgYSB2YWxpZCBsaWNlbnNlIGtleS4gPGEgaHJlZj0iJyArIExJQ0VOU0VfSU5GT19VUkwgKyAnIj5Nb3JlIEluZm88L2E+JywgY29udGFpbmVyRWwpOwogICAgfQogIH0KfTsKCgovKgpUaGlzIGRlY3J5cHRpb24gaXMgbm90IG1lYW50IHRvIGJlIGJ1bGxldHByb29mLiBKdXN0IGEgd2F5IHRvIHJlbWluZCBhYm91dCBhbiB1cGdyYWRlLgogKi8KCmlzVmFsaWRLZXkgPSBmdW5jdGlvbihrZXkpIHsKICB2YXIgbWluUHVyY2hhc2VEYXRlLCBwYXJ0cywgcHVyY2hhc2VEYXRlLCByZWxlYXNlRGF0ZTsKICBpZiAoJC5pbkFycmF5KGtleSwgUFJFU0VUX0xJQ0VOU0VfS0VZUykgIT09IC0xKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcGFydHMgPSAoa2V5IHx8ICcnKS5tYXRjaCgvXihcZCspXC1mY3NcLShcZCspJC8pOwogIGlmIChwYXJ0cyAmJiBwYXJ0c1sxXS5sZW5ndGggPT09IDEwKSB7CiAgICBwdXJjaGFzZURhdGUgPSBtb21lbnQudXRjKHBhcnNlSW50KHBhcnRzWzJdKSAqIDEwMDApOwogICAgcmVsZWFzZURhdGUgPSBtb21lbnQudXRjKEZDLm1vY2tTY2hlZHVsZXJSZWxlYXNlRGF0ZSB8fCBSRUxFQVNFX0RBVEUpOwogICAgaWYgKHJlbGVhc2VEYXRlLmlzVmFsaWQoKSkgewogICAgICBtaW5QdXJjaGFzZURhdGUgPSByZWxlYXNlRGF0ZS5jbG9uZSgpLnN1YnRyYWN0KFVQR1JBREVfV0lORE9XKTsKICAgICAgaWYgKHB1cmNoYXNlRGF0ZS5pc0FmdGVyKG1pblB1cmNoYXNlRGF0ZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn07Cgppc0ltbXVuZVVybCA9IGZ1bmN0aW9uKHVybCkgewogIHJldHVybiBCb29sZWFuKHVybC5tYXRjaCgvXHcrXDpcL1wvZnVsbGNhbGVuZGFyXC5pb1wvfFwvZGVtb3NcL1tcdy1dK1wuaHRtbCQvKSk7Cn07CgpyZW5kZXJpbmdXYXJuaW5nSW5Db250YWluZXIgPSBmdW5jdGlvbihtZXNzYWdlSHRtbCwgY29udGFpbmVyRWwpIHsKICByZXR1cm4gY29udGFpbmVyRWwuYXBwZW5kKCQoJzxkaXYgY2xhc3M9ImZjLWxpY2Vuc2UtbWVzc2FnZSIgLz4nKS5odG1sKG1lc3NhZ2VIdG1sKSk7Cn07CgpkZXRlY3RXYXJuaW5nSW5Db250YWluZXIgPSBmdW5jdGlvbihjb250YWluZXJFbCkgewogIHJldHVybiBjb250YWluZXJFbC5maW5kKCcuZmMtbGljZW5zZS1tZXNzYWdlJykubGVuZ3RoID49IDE7Cn07Cgp9KTsK
LyohCkZ1bGxDYWxlbmRhciBTY2hlZHVsZXIgdjEuNC4wCkRvY3MgJiBMaWNlbnNlOiBodHRwOi8vZnVsbGNhbGVuZGFyLmlvL3NjaGVkdWxlci8KKGMpIDIwMTYgQWRhbSBTaGF3CiAqLwohZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiLCJtb21lbnQiLCJmdWxsY2FsZW5kYXIiXSx0KToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9dChyZXF1aXJlKCJqcXVlcnkiKSxyZXF1aXJlKCJtb21lbnQiKSxyZXF1aXJlKCJmdWxsY2FsZW5kYXIiKSk6dChqUXVlcnksbW9tZW50KX0oZnVuY3Rpb24odCxlKXt2YXIgcixvLHMsaSxuLGwsdSxoLGEsYyxwLGQsZixnLHksdix3LG0sUyxSLGIsQyxFLEgsVCxfLEksRCx4LEIsRixHLE0sVyxMLHosayxWLFAsQSxPLHEsTixqLFksVSxYLCQsSyxRLEosWix0dCxldCxydCxvdCxzdCxpdCxudCxsdCx1dCxodCxhdCxjdCxwdCxkdCxmdCxndCx5dCx2dCx3dCxtdCxTdCxSdCxidCxDdCxFdCxIdCxUdCxfdCxJdCxEdCx4dCxCdCxGdCxHdCxNdCxXdCxMdCx6dCxrdCxWdCxQdCxBdCxPdD1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciBvIGluIGUpcXQuY2FsbChlLG8pJiYodFtvXT1lW29dKTtyZXR1cm4gci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IHIsdC5fX3N1cGVyX189ZS5wcm90b3R5cGUsdH0scXQ9e30uaGFzT3duUHJvcGVydHksTnQ9W10uaW5kZXhPZnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAscj10aGlzLmxlbmd0aDtlPHI7ZSsrKWlmKGUgaW4gdGhpcyYmdGhpc1tlXT09PXQpcmV0dXJuIGU7cmV0dXJuLTF9LGp0PVtdLnNsaWNlO3JldHVybiBkPXQuZnVsbENhbGVuZGFyLGQuc2NoZWR1bGVyVmVyc2lvbj0iMS40LjAiLDYhPT1kLmludGVybmFsQXBpVmVyc2lvbj92b2lkIGQud2FybigidiIrZC5zY2hlZHVsZXJWZXJzaW9uKyIgb2YgRnVsbENhbGVuZGFyIFNjaGVkdWxlciBpcyBpbmNvbXBhdGlibGUgd2l0aCB2IitkLnZlcnNpb24rIiBvZiB0aGUgY29yZS5cblBsZWFzZSBzZWUgaHR0cDovL2Z1bGxjYWxlbmRhci5pby9zdXBwb3J0LyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iKToobz1kLkNhbGVuZGFyLGk9ZC5DbGFzcyxYPWQuVmlldyxmPWQuR3JpZCx2dD1kLmludGVyc2VjdFJhbmdlcyxvdD1kLmRlYm91bmNlLFN0PWQuaXNJbnQsZnQ9ZC5nZXRTY3JvbGxiYXJXaWR0aHMsaD1kLkRyYWdMaXN0ZW5lcix5dD1kLmh0bWxFc2NhcGUsSj1kLmNvbXB1dGVJbnRlcnZhbFVuaXQsTXQ9ZC5wcm94eSxLPWQuY2FwaXRhbGlzZUZpcnN0TGV0dGVyLCQ9ZC5hcHBseUFsbCxhPWQuRW1pdHRlck1peGluLHY9ZC5MaXN0ZW5lck1peGluLGx0PWQuZHVyYXRpb25IYXNUaW1lLG50PWQuZGl2aWRlUmFuZ2VCeUR1cmF0aW9uLGl0PWQuZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uLEN0PWQubXVsdGlwbHlEdXJhdGlvbixGdD1kLnBhcnNlRmllbGRTcGVjcyxRPWQuY29tcGFyZUJ5RmllbGRTcGVjcyx1dD1kLmZsZXhpYmxlQ29tcGFyZSx3dD1kLmludGVyc2VjdFJlY3RzLGw9ZC5Db29yZENhY2hlLGh0PWQuZ2V0Q29udGVudFJlY3QsYXQ9ZC5nZXRPdXRlclJlY3QsY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZmluZCgiPiB0ZCIpLmZpbHRlcihmdW5jdGlvbih0LGUpe3JldHVybiBlLnJvd1NwYW48PTF9KX0sTHQ9ZnVuY3Rpb24oZSxyLG8pe3JldHVybiBlJiZlLnRoZW4mJiJyZXNvbHZlZCIhPT1lLnN0YXRlKCk/InJlamVjdGVkIj09PWUuc3RhdGUoKT8obyYmbygpLHQuRGVmZXJyZWQoKS5yZWplY3QoKS5wcm9taXNlKCkpOmUudGhlbihyLG8pOnI/dC53aGVuKHIoKSk6dC53aGVuKCl9LGM9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gcigpe3IuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnJlcXVlc3RNb3ZpbmdFbmQ9b3QodGhpcy5yZXBvcnRNb3ZpbmdFbmQsNTAwKX12YXIgbyxzO3JldHVybiBPdChyLGUpLHIubWl4aW4oYSksci5taXhpbih2KSxyLnByb3RvdHlwZS5jYW52YXM9bnVsbCxyLnByb3RvdHlwZS5pc1Njcm9sbGluZz0hMSxyLnByb3RvdHlwZS5pc1RvdWNoaW5nPSExLHIucHJvdG90eXBlLmlzTW92aW5nPSExLHIucHJvdG90eXBlLmlzVG91Y2hTY3JvbGxFbmFibGVkPSEwLHIucHJvdG90eXBlLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXI9bnVsbCxyLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gci5fX3N1cGVyX18ucmVuZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmNhbnZhcyYmKHRoaXMuY2FudmFzLnJlbmRlcigpLHRoaXMuY2FudmFzLmVsLmFwcGVuZFRvKHRoaXMuc2Nyb2xsRWwpKSx0aGlzLmJpbmRIYW5kbGVycygpfSxyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7cmV0dXJuIHIuX19zdXBlcl9fLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMudW5iaW5kSGFuZGxlcnMoKX0sci5wcm90b3R5cGUuZGlzYWJsZVRvdWNoU2Nyb2xsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNUb3VjaFNjcm9sbEVuYWJsZWQ9ITEsdGhpcy5iaW5kUHJldmVudFRvdWNoU2Nyb2xsKCl9LHIucHJvdG90eXBlLmVuYWJsZVRvdWNoU2Nyb2xsPWZ1bmN0aW9uKCl7aWYodGhpcy5pc1RvdWNoU2Nyb2xsRW5hYmxlZD0hMCwhdGhpcy5pc1RvdWNoaW5nKXJldHVybiB0aGlzLnVuYmluZFByZXZlbnRUb3VjaFNjcm9sbCgpfSxyLnByb3RvdHlwZS5iaW5kUHJldmVudFRvdWNoU2Nyb2xsPWZ1bmN0aW9uKCl7aWYoIXRoaXMucHJldmVudFRvdWNoU2Nyb2xsSGFuZGxlcilyZXR1cm4gdGhpcy5zY3JvbGxFbC5vbigidG91Y2htb3ZlIix0aGlzLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXI9ZC5wcmV2ZW50RGVmYXVsdCl9LHIucHJvdG90eXBlLnVuYmluZFByZXZlbnRUb3VjaFNjcm9sbD1mdW5jdGlvbigpe2lmKHRoaXMucHJldmVudFRvdWNoU2Nyb2xsSGFuZGxlcilyZXR1cm4gdGhpcy5zY3JvbGxFbC5vZmYoInRvdWNobW92ZSIsdGhpcy5wcmV2ZW50VG91Y2hTY3JvbGxIYW5kbGVyKSx0aGlzLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXI9bnVsbH0sci5wcm90b3R5cGUuYmluZEhhbmRsZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGlzdGVuVG8odGhpcy5zY3JvbGxFbCx7c2Nyb2xsOnRoaXMucmVwb3J0U2Nyb2xsLHRvdWNoc3RhcnQ6dGhpcy5yZXBvcnRUb3VjaFN0YXJ0LHRvdWNoZW5kOnRoaXMucmVwb3J0VG91Y2hFbmR9KX0sci5wcm90b3R5cGUudW5iaW5kSGFuZGxlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdG9wTGlzdGVuaW5nVG8odGhpcy5zY3JvbGxFbCl9LHIucHJvdG90eXBlLnJlcG9ydFNjcm9sbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzU2Nyb2xsaW5nfHx0aGlzLnJlcG9ydFNjcm9sbFN0YXJ0KCksdGhpcy50cmlnZ2VyKCJzY3JvbGwiKSx0aGlzLmlzTW92aW5nPSEwLHRoaXMucmVxdWVzdE1vdmluZ0VuZCgpfSxyLnByb3RvdHlwZS5yZXBvcnRTY3JvbGxTdGFydD1mdW5jdGlvbigpe2lmKCF0aGlzLmlzU2Nyb2xsaW5nKXJldHVybiB0aGlzLmlzU2Nyb2xsaW5nPSEwLHRoaXMudHJpZ2dlcigic2Nyb2xsU3RhcnQiLHRoaXMuaXNUb3VjaGluZyl9LHIucHJvdG90eXBlLnJlcXVlc3RNb3ZpbmdFbmQ9bnVsbCxyLnByb3RvdHlwZS5yZXBvcnRNb3ZpbmdFbmQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTW92aW5nPSExLCF0aGlzLmlzVG91Y2hpbmcpcmV0dXJuIHRoaXMucmVwb3J0U2Nyb2xsRW5kKCl9LHIucHJvdG90eXBlLnJlcG9ydFNjcm9sbEVuZD1mdW5jdGlvbigpe2lmKHRoaXMuaXNTY3JvbGxpbmcpcmV0dXJuIHRoaXMudHJpZ2dlcigic2Nyb2xsRW5kIiksdGhpcy5pc1Njcm9sbGluZz0hMX0sci5wcm90b3R5cGUucmVwb3J0VG91Y2hTdGFydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzVG91Y2hpbmc9ITB9LHIucHJvdG90eXBlLnJlcG9ydFRvdWNoRW5kPWZ1bmN0aW9uKCl7aWYodGhpcy5pc1RvdWNoaW5nJiYodGhpcy5pc1RvdWNoaW5nPSExLHRoaXMuaXNUb3VjaFNjcm9sbEVuYWJsZWQmJnRoaXMudW5iaW5kUHJldmVudFRvdWNoU2Nyb2xsKCksIXRoaXMuaXNNb3ZpbmcpKXJldHVybiB0aGlzLnJlcG9ydFNjcm9sbEVuZCgpfSxyLnByb3RvdHlwZS5nZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKCl7dmFyIHQsZSxyO2lmKHQ9dGhpcy5zY3JvbGxFbC5jc3MoImRpcmVjdGlvbiIpLGU9dGhpcy5zY3JvbGxFbFswXSxyPWUuc2Nyb2xsTGVmdCwicnRsIj09PXQpc3dpdGNoKHMpe2Nhc2UicG9zaXRpdmUiOnI9citlLmNsaWVudFdpZHRoLWUuc2Nyb2xsV2lkdGg7YnJlYWs7Y2FzZSJyZXZlcnNlIjpyPS1yfXJldHVybiByfSxyLnByb3RvdHlwZS5zZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKHQpe3ZhciBlLHI7aWYoZT10aGlzLnNjcm9sbEVsLmNzcygiZGlyZWN0aW9uIikscj10aGlzLnNjcm9sbEVsWzBdLCJydGwiPT09ZSlzd2l0Y2gocyl7Y2FzZSJwb3NpdGl2ZSI6dD10LXIuY2xpZW50V2lkdGgrci5zY3JvbGxXaWR0aDticmVhaztjYXNlInJldmVyc2UiOnQ9LXR9cmV0dXJuIHIuc2Nyb2xsTGVmdD10fSxyLnByb3RvdHlwZS5nZXRTY3JvbGxGcm9tTGVmdD1mdW5jdGlvbigpe3ZhciB0LGUscjtpZih0PXRoaXMuc2Nyb2xsRWwuY3NzKCJkaXJlY3Rpb24iKSxlPXRoaXMuc2Nyb2xsRWxbMF0scj1lLnNjcm9sbExlZnQsInJ0bCI9PT10KXN3aXRjaChzKXtjYXNlIm5lZ2F0aXZlIjpyPXItZS5jbGllbnRXaWR0aCtlLnNjcm9sbFdpZHRoO2JyZWFrO2Nhc2UicmV2ZXJzZSI6cj0tci1lLmNsaWVudFdpZHRoK2Uuc2Nyb2xsV2lkdGh9cmV0dXJuIHJ9LHIucHJvdG90eXBlLmdldE5hdGl2ZVNjcm9sbExlZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY3JvbGxFbFswXS5zY3JvbGxMZWZ0fSxyLnByb3RvdHlwZS5zZXROYXRpdmVTY3JvbGxMZWZ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNjcm9sbEVsWzBdLnNjcm9sbExlZnQ9dH0scz1udWxsLG89ZnVuY3Rpb24oKXt2YXIgZSxyLG87cmV0dXJuIGU9dCgnPGRpdiBzdHlsZT0iIHBvc2l0aW9uOiBhYnNvbHV0ZSB0b3A6IC0xMDAwcHg7IHdpZHRoOiAxcHg7IGhlaWdodDogMXB4OyBvdmVyZmxvdzogc2Nyb2xsOyBkaXJlY3Rpb246IHJ0bDsgZm9udC1zaXplOiAxNHB4OyAiPkE8L2Rpdj4nKS5hcHBlbmRUbygiYm9keSIpLHI9ZVswXSxvPXIuc2Nyb2xsTGVmdD4wPyJwb3NpdGl2ZSI6KHIuc2Nyb2xsTGVmdD0xLGUuc2Nyb2xsTGVmdD4wPyJyZXZlcnNlIjoibmVnYXRpdmUiKSxlLnJlbW92ZSgpLG99LHQoZnVuY3Rpb24oKXtyZXR1cm4gcz1vKCl9KSxyfShkLlNjcm9sbGVyKSxuPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyksImNsaXBwZWQtc2Nyb2xsIj09PXRoaXMub3ZlcmZsb3dYJiYodGhpcy5vdmVyZmxvd1g9InNjcm9sbCIsdGhpcy5pc0hTY3JvbGxiYXJzQ2xpcHBlZD0hMCksImNsaXBwZWQtc2Nyb2xsIj09PXRoaXMub3ZlcmZsb3dZJiYodGhpcy5vdmVyZmxvd1k9InNjcm9sbCIsdGhpcy5pc1ZTY3JvbGxiYXJzQ2xpcHBlZD0hMCl9cmV0dXJuIE90KHIsZSksci5wcm90b3R5cGUuaXNIU2Nyb2xsYmFyc0NsaXBwZWQ9ITEsci5wcm90b3R5cGUuaXNWU2Nyb2xsYmFyc0NsaXBwZWQ9ITEsci5wcm90b3R5cGUucmVuZGVyRWw9ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gZT1yLl9fc3VwZXJfXy5yZW5kZXJFbC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdCgnPGRpdiBjbGFzcz0iZmMtc2Nyb2xsZXItY2xpcCIgLz4nKS5hcHBlbmQoZSl9LHIucHJvdG90eXBlLnVwZGF0ZVNpemU9ZnVuY3Rpb24oKXt2YXIgdCxlLHI7cmV0dXJuIGU9dGhpcy5zY3JvbGxFbCxyPWZ0KGUpLHQ9e21hcmdpbkxlZnQ6MCxtYXJnaW5SaWdodDowLG1hcmdpblRvcDowLG1hcmdpbkJvdHRvbTowfSx0aGlzLmlzSFNjcm9sbGJhcnNDbGlwcGVkJiYodC5tYXJnaW5Ub3A9LXIudG9wLHQubWFyZ2luQm90dG9tPS1yLmJvdHRvbSksdGhpcy5pc1ZTY3JvbGxiYXJzQ2xpcHBlZCYmKHQubWFyZ2luTGVmdD0tci5sZWZ0LHQubWFyZ2luUmlnaHQ9LXIucmlnaHQpLGUuY3NzKHQpLGUudG9nZ2xlQ2xhc3MoImZjLW5vLXNjcm9sbGJhcnMiLCh0aGlzLmlzSFNjcm9sbGJhcnNDbGlwcGVkfHwiaGlkZGVuIj09PXRoaXMub3ZlcmZsb3dYKSYmKHRoaXMuaXNWU2Nyb2xsYmFyc0NsaXBwZWR8fCJoaWRkZW4iPT09dGhpcy5vdmVyZmxvd1kpJiYhKHIudG9wfHxyLmJvdHRvbXx8ci5sZWZ0fHxyLnJpZ2h0KSl9LHIucHJvdG90eXBlLmdldFNjcm9sbGJhcldpZHRocz1mdW5jdGlvbigpe3ZhciB0O3JldHVybiB0PWZ0KHRoaXMuc2Nyb2xsRWwpLHRoaXMuaXNIU2Nyb2xsYmFyc0NsaXBwZWQmJih0LnRvcD0wLHQuYm90dG9tPTApLHRoaXMuaXNWU2Nyb2xsYmFyc0NsaXBwZWQmJih0LmxlZnQ9MCx0LnJpZ2h0PTApLHR9LHJ9KGMpLE89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5ndXR0ZXJzPXt9fXJldHVybiBlLnByb3RvdHlwZS5lbD1udWxsLGUucHJvdG90eXBlLmNvbnRlbnRFbD1udWxsLGUucHJvdG90eXBlLmJnRWw9bnVsbCxlLnByb3RvdHlwZS5ndXR0ZXJzPW51bGwsZS5wcm90b3R5cGUud2lkdGg9bnVsbCxlLnByb3RvdHlwZS5taW5XaWR0aD1udWxsLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVsPXQoJzxkaXYgY2xhc3M9ImZjLXNjcm9sbGVyLWNhbnZhcyI+IDxkaXYgY2xhc3M9ImZjLWNvbnRlbnQiPjwvZGl2PiA8ZGl2IGNsYXNzPSJmYy1iZyI+PC9kaXY+IDwvZGl2PicpLHRoaXMuY29udGVudEVsPXRoaXMuZWwuZmluZCgiLmZjLWNvbnRlbnQiKSx0aGlzLmJnRWw9dGhpcy5lbC5maW5kKCIuZmMtYmciKX0sZS5wcm90b3R5cGUuc2V0R3V0dGVycz1mdW5jdGlvbihlKXtyZXR1cm4gZT90LmV4dGVuZCh0aGlzLmd1dHRlcnMsZSk6dGhpcy5ndXR0ZXJzPXt9LHRoaXMudXBkYXRlU2l6ZSgpfSxlLnByb3RvdHlwZS5zZXRXaWR0aD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy53aWR0aD10LHRoaXMudXBkYXRlU2l6ZSgpfSxlLnByb3RvdHlwZS5zZXRNaW5XaWR0aD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5taW5XaWR0aD10LHRoaXMudXBkYXRlU2l6ZSgpfSxlLnByb3RvdHlwZS5jbGVhcldpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2lkdGg9bnVsbCx0aGlzLm1pbldpZHRoPW51bGwsdGhpcy51cGRhdGVTaXplKCl9LGUucHJvdG90eXBlLnVwZGF0ZVNpemU9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdD10aGlzLmd1dHRlcnMsdGhpcy5lbC50b2dnbGVDbGFzcygiZmMtZ3V0dGVyLWxlZnQiLEJvb2xlYW4odC5sZWZ0KSkudG9nZ2xlQ2xhc3MoImZjLWd1dHRlci1yaWdodCIsQm9vbGVhbih0LnJpZ2h0KSkudG9nZ2xlQ2xhc3MoImZjLWd1dHRlci10b3AiLEJvb2xlYW4odC50b3ApKS50b2dnbGVDbGFzcygiZmMtZ3V0dGVyLWJvdHRvbSIsQm9vbGVhbih0LmJvdHRvbSkpLmNzcyh7cGFkZGluZ0xlZnQ6dC5sZWZ0fHwiIixwYWRkaW5nUmlnaHQ6dC5yaWdodHx8IiIscGFkZGluZ1RvcDp0LnRvcHx8IiIscGFkZGluZ0JvdHRvbTp0LmJvdHRvbXx8IiIsd2lkdGg6bnVsbCE9dGhpcy53aWR0aD90aGlzLndpZHRoKyh0LmxlZnR8fDApKyh0LnJpZ2h0fHwwKToiIixtaW5XaWR0aDpudWxsIT10aGlzLm1pbldpZHRoP3RoaXMubWluV2lkdGgrKHQubGVmdHx8MCkrKHQucmlnaHR8fDApOiIifSksdGhpcy5iZ0VsLmNzcyh7bGVmdDp0LmxlZnR8fCIiLHJpZ2h0OnQucmlnaHR8fCIiLHRvcDp0LnRvcHx8IiIsYm90dG9tOnQuYm90dG9tfHwiIn0pfSxlfSgpLEE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dmFyIHIsbyxzLGk7Zm9yKHRoaXMuYXhpcz10LHRoaXMuc2Nyb2xsZXJzPWUscz10aGlzLnNjcm9sbGVycyxyPTAsbz1zLmxlbmd0aDtyPG87cisrKWk9c1tyXSx0aGlzLmluaXRTY3JvbGxlcihpKX1yZXR1cm4gdC5wcm90b3R5cGUuYXhpcz1udWxsLHQucHJvdG90eXBlLnNjcm9sbGVycz1udWxsLHQucHJvdG90eXBlLm1hc3RlclNjcm9sbGVyPW51bGwsdC5wcm90b3R5cGUuaW5pdFNjcm9sbGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0LnNjcm9sbEVsLm9uKCJ3aGVlbCBtb3VzZXdoZWVsIERvbU1vdXNlU2Nyb2xsIE1vek1vdXNlUGl4ZWxTY3JvbGwiLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe2UuYXNzaWduTWFzdGVyU2Nyb2xsZXIodCl9fSh0aGlzKSksdC5vbigic2Nyb2xsU3RhcnQiLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe2lmKCFlLm1hc3RlclNjcm9sbGVyKXJldHVybiBlLmFzc2lnbk1hc3RlclNjcm9sbGVyKHQpfX0odGhpcykpLm9uKCJzY3JvbGwiLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByLG8scyxpLG47aWYodD09PWUubWFzdGVyU2Nyb2xsZXIpe2ZvcihpPWUuc2Nyb2xsZXJzLG49W10scj0wLG89aS5sZW5ndGg7cjxvO3IrKylpZihzPWlbcl0scyE9PXQpc3dpdGNoKGUuYXhpcyl7Y2FzZSJob3Jpem9udGFsIjpuLnB1c2gocy5zZXROYXRpdmVTY3JvbGxMZWZ0KHQuZ2V0TmF0aXZlU2Nyb2xsTGVmdCgpKSk7YnJlYWs7Y2FzZSJ2ZXJ0aWNhbCI6bi5wdXNoKHMuc2V0U2Nyb2xsVG9wKHQuZ2V0U2Nyb2xsVG9wKCkpKTticmVhaztkZWZhdWx0Om4ucHVzaCh2b2lkIDApfWVsc2Ugbi5wdXNoKHZvaWQgMCk7cmV0dXJuIG59fX0odGhpcykpLm9uKCJzY3JvbGxFbmQiLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe2lmKHQ9PT1lLm1hc3RlclNjcm9sbGVyKXJldHVybiBlLnVuYXNzaWduTWFzdGVyU2Nyb2xsZXIoKX19KHRoaXMpKX0sdC5wcm90b3R5cGUuYXNzaWduTWFzdGVyU2Nyb2xsZXI9ZnVuY3Rpb24odCl7dmFyIGUscixvLHM7Zm9yKHRoaXMudW5hc3NpZ25NYXN0ZXJTY3JvbGxlcigpLHRoaXMubWFzdGVyU2Nyb2xsZXI9dCxzPXRoaXMuc2Nyb2xsZXJzLGU9MCxyPXMubGVuZ3RoO2U8cjtlKyspbz1zW2VdLG8hPT10JiZvLmRpc2FibGVUb3VjaFNjcm9sbCgpfSx0LnByb3RvdHlwZS51bmFzc2lnbk1hc3RlclNjcm9sbGVyPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG87aWYodGhpcy5tYXN0ZXJTY3JvbGxlcil7Zm9yKG89dGhpcy5zY3JvbGxlcnMsdD0wLGU9by5sZW5ndGg7dDxlO3QrKylyPW9bdF0sci5lbmFibGVUb3VjaFNjcm9sbCgpO3RoaXMubWFzdGVyU2Nyb2xsZXI9bnVsbH19LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciB0LGUscixvLHMsaSxuLGwsdSxoLGEsYyxwO2Zvcih0PWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG87Zm9yKHI9dGhpcy5zY3JvbGxlcnMsbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKWM9clt0XSxvLnB1c2goYy5nZXRTY3JvbGxiYXJXaWR0aHMoKSk7cmV0dXJuIG99LmNhbGwodGhpcyksbD11PWg9bj0wLHI9MCxzPXQubGVuZ3RoO3I8cztyKyspcD10W3JdLGw9TWF0aC5tYXgobCxwLmxlZnQpLHU9TWF0aC5tYXgodSxwLnJpZ2h0KSxoPU1hdGgubWF4KGgscC50b3ApLG49TWF0aC5tYXgobixwLmJvdHRvbSk7Zm9yKGE9dGhpcy5zY3JvbGxlcnMsZT1vPTAsaT1hLmxlbmd0aDtvPGk7ZT0rK28pYz1hW2VdLHA9dFtlXSxjLmNhbnZhcy5zZXRHdXR0ZXJzKCJob3Jpem9udGFsIj09PXRoaXMuYXhpcz97bGVmdDpsLXAubGVmdCxyaWdodDp1LXAucmlnaHR9Ont0b3A6aC1wLnRvcCxib3R0b206bi1wLmJvdHRvbX0pfSx0fSgpLFY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsZSl7dGhpcy5pc1RvdWNoPWUsdGhpcy5zY3JvbGxlcj10LHRoaXMuc3ByaXRlcz1bXSx0aGlzLmlzVG91Y2gmJih0aGlzLmlzRm9yY2VkUmVsYXRpdmU9ITApLHQub24odGhpcy5pc1RvdWNoPyJzY3JvbGxFbmQiOiJzY3JvbGwiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmhhbmRsZVNjcm9sbCgpfX0odGhpcykpfXJldHVybiBlLnByb3RvdHlwZS5zY3JvbGxlcj1udWxsLGUucHJvdG90eXBlLnNjcm9sbGJhcldpZHRocz1udWxsLGUucHJvdG90eXBlLnNwcml0ZXM9bnVsbCxlLnByb3RvdHlwZS52aWV3cG9ydFJlY3Q9bnVsbCxlLnByb3RvdHlwZS5jb250ZW50T2Zmc2V0PW51bGwsZS5wcm90b3R5cGUuaXNIRm9sbG93aW5nPSEwLGUucHJvdG90eXBlLmlzVkZvbGxvd2luZz0hMSxlLnByb3RvdHlwZS5jb250YWluT25OYXR1cmFsTGVmdD0hMSxlLnByb3RvdHlwZS5jb250YWluT25OYXR1cmFsUmlnaHQ9ITEsZS5wcm90b3R5cGUubWluVHJhdmVsPTAsZS5wcm90b3R5cGUuaXNUb3VjaD0hMSxlLnByb3RvdHlwZS5pc0ZvcmNlZFJlbGF0aXZlPSExLGUucHJvdG90eXBlLnNldFNwcml0ZXM9ZnVuY3Rpb24oZSl7dmFyIHIsbyxzO2lmKHRoaXMuY2xlYXJTcHJpdGVzKCksZSBpbnN0YW5jZW9mIHQpcmV0dXJuIHRoaXMuc3ByaXRlcz1mdW5jdGlvbigpe3ZhciByLG8saTtmb3IoaT1bXSxyPTAsbz1lLmxlbmd0aDtyPG87cisrKXM9ZVtyXSxpLnB1c2gobmV3IFAodChzKSx0aGlzKSk7cmV0dXJuIGl9LmNhbGwodGhpcyk7Zm9yKHI9MCxvPWUubGVuZ3RoO3I8bztyKyspcz1lW3JdLHMuZm9sbG93ZXI9dGhpcztyZXR1cm4gdGhpcy5zcHJpdGVzPWV9LGUucHJvdG90eXBlLmNsZWFyU3ByaXRlcz1mdW5jdGlvbigpe3ZhciB0LGUscixvO2ZvcihyPXRoaXMuc3ByaXRlcyx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKW89clt0XSxvLmNsZWFyKCk7cmV0dXJuIHRoaXMuc3ByaXRlcz1bXX0sZS5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXBkYXRlVmlld3BvcnQoKSx0aGlzLnVwZGF0ZVBvc2l0aW9ucygpfSxlLnByb3RvdHlwZS5jYWNoZURpbWVuc2lvbnM9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbztmb3IodGhpcy51cGRhdGVWaWV3cG9ydCgpLHRoaXMuc2Nyb2xsYmFyV2lkdGhzPXRoaXMuc2Nyb2xsZXIuZ2V0U2Nyb2xsYmFyV2lkdGhzKCksdGhpcy5jb250ZW50T2Zmc2V0PXRoaXMuc2Nyb2xsZXIuY2FudmFzLmVsLm9mZnNldCgpLHI9dGhpcy5zcHJpdGVzLHQ9MCxlPXIubGVuZ3RoO3Q8ZTt0Kyspbz1yW3RdLG8uY2FjaGVEaW1lbnNpb25zKCl9LGUucHJvdG90eXBlLnVwZGF0ZVZpZXdwb3J0PWZ1bmN0aW9uKCl7dmFyIHQsZSxyO3JldHVybiBlPXRoaXMuc2Nyb2xsZXIsdD1lLmdldFNjcm9sbEZyb21MZWZ0KCkscj1lLmdldFNjcm9sbFRvcCgpLHRoaXMudmlld3BvcnRSZWN0PXtsZWZ0OnQscmlnaHQ6dCtlLmdldENsaWVudFdpZHRoKCksdG9wOnIsYm90dG9tOnIrZS5nZXRDbGllbnRIZWlnaHQoKX19LGUucHJvdG90eXBlLmZvcmNlUmVsYXRpdmU9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzO2lmKCF0aGlzLmlzRm9yY2VkUmVsYXRpdmUpe2Zvcih0aGlzLmlzRm9yY2VkUmVsYXRpdmU9ITAscj10aGlzLnNwcml0ZXMsbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxzLmRvQWJzb2x1dGU/by5wdXNoKHMuYXNzaWduUG9zaXRpb24oKSk6by5wdXNoKHZvaWQgMCk7cmV0dXJuIG99fSxlLnByb3RvdHlwZS5jbGVhckZvcmNlPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztpZih0aGlzLmlzRm9yY2VkUmVsYXRpdmUmJiF0aGlzLmlzVG91Y2gpe2Zvcih0aGlzLmlzRm9yY2VkUmVsYXRpdmU9ITEscj10aGlzLnNwcml0ZXMsbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxvLnB1c2gocy5hc3NpZ25Qb3NpdGlvbigpKTtyZXR1cm4gb319LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhY2hlRGltZW5zaW9ucygpLHRoaXMudXBkYXRlUG9zaXRpb25zKCl9LGUucHJvdG90eXBlLnVwZGF0ZVBvc2l0aW9ucz1mdW5jdGlvbigpe3ZhciB0LGUscixvO2ZvcihyPXRoaXMuc3ByaXRlcyx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKW89clt0XSxvLnVwZGF0ZVBvc2l0aW9uKCl9LGUucHJvdG90eXBlLmdldENvbnRlbnRSZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBodCh0LHRoaXMuY29udGVudE9mZnNldCl9LGUucHJvdG90eXBlLmdldEJvdW5kaW5nUmVjdD1mdW5jdGlvbih0KXtyZXR1cm4gYXQodCx0aGlzLmNvbnRlbnRPZmZzZXQpfSxlfSgpLFA9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5lbD10LHRoaXMuZm9sbG93ZXI9bnVsbCE9ZT9lOm51bGwsdGhpcy5pc0Jsb2NrPSJibG9jayI9PT10aGlzLmVsLmNzcygiZGlzcGxheSIpLHRoaXMuZWwuY3NzKCJwb3NpdGlvbiIsInJlbGF0aXZlIil9cmV0dXJuIHQucHJvdG90eXBlLmZvbGxvd2VyPW51bGwsdC5wcm90b3R5cGUuZWw9bnVsbCx0LnByb3RvdHlwZS5hYnNvbHV0ZUVsPW51bGwsdC5wcm90b3R5cGUubmF0dXJhbFJlY3Q9bnVsbCx0LnByb3RvdHlwZS5wYXJlbnRSZWN0PW51bGwsdC5wcm90b3R5cGUuY29udGFpbmVyUmVjdD1udWxsLHQucHJvdG90eXBlLmlzRW5hYmxlZD0hMCx0LnByb3RvdHlwZS5pc0hGb2xsb3dpbmc9ITEsdC5wcm90b3R5cGUuaXNWRm9sbG93aW5nPSExLHQucHJvdG90eXBlLmRvQWJzb2x1dGU9ITEsdC5wcm90b3R5cGUuaXNBYnNvbHV0ZT0hMSx0LnByb3RvdHlwZS5pc0NlbnRlcmVkPSExLHQucHJvdG90eXBlLnJlY3Q9bnVsbCx0LnByb3RvdHlwZS5pc0Jsb2NrPSExLHQucHJvdG90eXBlLm5hdHVyYWxXaWR0aD1udWxsLHQucHJvdG90eXBlLmRpc2FibGU9ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZClyZXR1cm4gdGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5yZXNldFBvc2l0aW9uKCksdGhpcy51bmFic29sdXRpemUoKX0sdC5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNFbmFibGVkKXJldHVybiB0aGlzLmlzRW5hYmxlZD0hMCx0aGlzLmFzc2lnblBvc2l0aW9uKCl9LHQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZSgpLHRoaXMuZm9sbG93ZXI9bnVsbCx0aGlzLmFic29sdXRlRWw9bnVsbH0sdC5wcm90b3R5cGUuY2FjaGVEaW1lbnNpb25zPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scyxpLG4sbDtyZXR1cm4gbz0hMSxzPSExLHI9ITEsdGhpcy5uYXR1cmFsV2lkdGg9dGhpcy5lbC53aWR0aCgpLHRoaXMucmVzZXRQb3NpdGlvbigpLGU9dGhpcy5mb2xsb3dlcixuPXRoaXMubmF0dXJhbFJlY3Q9ZS5nZXRCb3VuZGluZ1JlY3QodGhpcy5lbCksbD10aGlzLmVsLnBhcmVudCgpLHRoaXMucGFyZW50UmVjdD1lLmdldEJvdW5kaW5nUmVjdChsKSx0PXRoaXMuY29udGFpbmVyUmVjdD1idChlLmdldENvbnRlbnRSZWN0KGwpLG4pLGk9ZS5taW5UcmF2ZWwsZS5jb250YWluT25OYXR1cmFsTGVmdCYmKHQubGVmdD1uLmxlZnQpLGUuY29udGFpbk9uTmF0dXJhbFJpZ2h0JiYodC5yaWdodD1uLnJpZ2h0KSxlLmlzSEZvbGxvd2luZyYmZHQodCktZHQobik+PWkmJihyPSJjZW50ZXIiPT09dGhpcy5lbC5jc3MoInRleHQtYWxpZ24iKSxvPSEwKSxlLmlzVkZvbGxvd2luZyYmcHQodCktcHQobik+PWkmJihzPSEwKSx0aGlzLmlzSEZvbGxvd2luZz1vLHRoaXMuaXNWRm9sbG93aW5nPXMsdGhpcy5pc0NlbnRlcmVkPXJ9LHQucHJvdG90eXBlLnVwZGF0ZVBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZVBvc2l0aW9uKCksdGhpcy5hc3NpZ25Qb3NpdGlvbigpfSx0LnByb3RvdHlwZS5yZXNldFBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWwuY3NzKHt0b3A6IiIsbGVmdDoiIn0pfSx0LnByb3RvdHlwZS5jb21wdXRlUG9zaXRpb249ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzLGksbixsO3JldHVybiBuPXRoaXMuZm9sbG93ZXIudmlld3BvcnRSZWN0LHI9dGhpcy5wYXJlbnRSZWN0LHQ9dGhpcy5jb250YWluZXJSZWN0LGw9d3QobixyKSxvPW51bGwsZT0hMSxsJiYobz1ldCh0aGlzLm5hdHVyYWxSZWN0KSxpPXd0KG8sciksKHRoaXMuaXNDZW50ZXJlZCYmIXp0KG4scil8fGkmJiF6dChuLGkpKSYmKGU9ITAsdGhpcy5pc0hGb2xsb3dpbmcmJih0aGlzLmlzQ2VudGVyZWQ/KHM9ZHQobyksby5sZWZ0PShsLmxlZnQrbC5yaWdodCkvMi1zLzIsby5yaWdodD1vLmxlZnQrcyk6Z3QobyxuKXx8KGU9ITEpLGd0KG8sdCkmJihlPSExKSksdGhpcy5pc1ZGb2xsb3dpbmcmJihBdChvLG4pfHwoZT0hMSksQXQobyx0KSYmKGU9ITEpKSx6dChuLG8pfHwoZT0hMSkpKSx0aGlzLnJlY3Q9byx0aGlzLmRvQWJzb2x1dGU9ZX0sdC5wcm90b3R5cGUuYXNzaWduUG9zaXRpb249ZnVuY3Rpb24oKXt2YXIgdCxlO2lmKHRoaXMuaXNFbmFibGVkKXJldHVybiB0aGlzLnJlY3Q/dGhpcy5kb0Fic29sdXRlJiYhdGhpcy5mb2xsb3dlci5pc0ZvcmNlZFJlbGF0aXZlPyh0aGlzLmFic29sdXRpemUoKSx0aGlzLmFic29sdXRlRWwuY3NzKHt0b3A6dGhpcy5yZWN0LnRvcC10aGlzLmZvbGxvd2VyLnZpZXdwb3J0UmVjdC50b3ArdGhpcy5mb2xsb3dlci5zY3JvbGxiYXJXaWR0aHMudG9wLGxlZnQ6dGhpcy5yZWN0LmxlZnQtdGhpcy5mb2xsb3dlci52aWV3cG9ydFJlY3QubGVmdCt0aGlzLmZvbGxvd2VyLnNjcm9sbGJhcldpZHRocy5sZWZ0LHdpZHRoOnRoaXMuaXNCbG9jaz90aGlzLm5hdHVyYWxXaWR0aDoiIn0pKTooZT10aGlzLnJlY3QudG9wLXRoaXMubmF0dXJhbFJlY3QudG9wLHQ9dGhpcy5yZWN0LmxlZnQtdGhpcy5uYXR1cmFsUmVjdC5sZWZ0LHRoaXMudW5hYnNvbHV0aXplKCksdGhpcy5lbC50b2dnbGVDbGFzcygiZmMtZm9sbG93aW5nIixCb29sZWFuKGV8fHQpKS5jc3Moe3RvcDplLGxlZnQ6dH0pKTp0aGlzLnVuYWJzb2x1dGl6ZSgpfSx0LnByb3RvdHlwZS5hYnNvbHV0aXplPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNBYnNvbHV0ZSlyZXR1cm4gdGhpcy5hYnNvbHV0ZUVsfHwodGhpcy5hYnNvbHV0ZUVsPXRoaXMuYnVpbGRBYnNvbHV0ZUVsKCkpLHRoaXMuYWJzb2x1dGVFbC5hcHBlbmRUbyh0aGlzLmZvbGxvd2VyLnNjcm9sbGVyLmVsKSx0aGlzLmVsLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpLHRoaXMuaXNBYnNvbHV0ZT0hMH0sdC5wcm90b3R5cGUudW5hYnNvbHV0aXplPWZ1bmN0aW9uKCl7aWYodGhpcy5pc0Fic29sdXRlKXJldHVybiB0aGlzLmFic29sdXRlRWwuZGV0YWNoKCksdGhpcy5lbC5jc3MoInZpc2liaWxpdHkiLCIiKSx0aGlzLmlzQWJzb2x1dGU9ITF9LHQucHJvdG90eXBlLmJ1aWxkQWJzb2x1dGVFbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVsLmNsb25lKCkuYWRkQ2xhc3MoImZjLWZvbGxvd2luZyIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIiwiei1pbmRleCI6MWUzLCJmb250LXdlaWdodCI6dGhpcy5lbC5jc3MoImZvbnQtd2VpZ2h0IiksImZvbnQtc2l6ZSI6dGhpcy5lbC5jc3MoImZvbnQtc2l6ZSIpLCJmb250LWZhbWlseSI6dGhpcy5lbC5jc3MoImZvbnQtZmFtaWx5IiksY29sb3I6dGhpcy5lbC5jc3MoImNvbG9yIiksInBhZGRpbmctdG9wIjp0aGlzLmVsLmNzcygicGFkZGluZy10b3AiKSwicGFkZGluZy1ib3R0b20iOnRoaXMuZWwuY3NzKCJwYWRkaW5nLWJvdHRvbSIpLCJwYWRkaW5nLWxlZnQiOnRoaXMuZWwuY3NzKCJwYWRkaW5nLWxlZnQiKSwicGFkZGluZy1yaWdodCI6dGhpcy5lbC5jc3MoInBhZGRpbmctcmlnaHQiKSwicG9pbnRlci1ldmVudHMiOiJub25lIn0pfSx0fSgpLGV0PWZ1bmN0aW9uKHQpe3JldHVybntsZWZ0OnQubGVmdCxyaWdodDp0LnJpZ2h0LHRvcDp0LnRvcCxib3R0b206dC5ib3R0b219fSxkdD1mdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodC10LmxlZnR9LHB0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmJvdHRvbS10LnRvcH0senQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4ga3QodCxlKSYmVnQodCxlKX0sa3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5sZWZ0Pj10LmxlZnQmJmUucmlnaHQ8PXQucmlnaHR9LFZ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudG9wPj10LnRvcCYmZS5ib3R0b208PXQuYm90dG9tfSxndD1mdW5jdGlvbih0LGUpe3JldHVybiB0LmxlZnQ8ZS5sZWZ0Pyh0LnJpZ2h0PWUubGVmdCtkdCh0KSx0LmxlZnQ9ZS5sZWZ0LCEwKTp0LnJpZ2h0PmUucmlnaHQmJih0LmxlZnQ9ZS5yaWdodC1kdCh0KSx0LnJpZ2h0PWUucmlnaHQsITApfSxBdD1mdW5jdGlvbih0LGUpe3JldHVybiB0LnRvcDxlLnRvcD8odC5ib3R0b209ZS50b3ArcHQodCksdC50b3A9ZS50b3AsITApOnQuYm90dG9tPmUuYm90dG9tJiYodC50b3A9ZS5ib3R0b20tcHQodCksdC5ib3R0b209ZS5ib3R0b20sITApfSxidD1mdW5jdGlvbih0LGUpe3JldHVybntsZWZ0Ok1hdGgubWluKHQubGVmdCxlLmxlZnQpLHJpZ2h0Ok1hdGgubWF4KHQucmlnaHQsZS5yaWdodCksdG9wOk1hdGgubWluKHQudG9wLGUudG9wKSxib3R0b206TWF0aC5tYXgodC5ib3R0b20sZS5ib3R0b20pfX0scz1mdW5jdGlvbihlKXtmdW5jdGlvbiByKCl7cmV0dXJuIHIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gT3QocixlKSxyLnByb3RvdHlwZS5yZXNvdXJjZU1hbmFnZXI9bnVsbCxyLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzb3VyY2VNYW5hZ2VyPW5ldyBEKHRoaXMpfSxyLnByb3RvdHlwZS5pbnN0YW50aWF0ZVZpZXc9ZnVuY3Rpb24odCl7dmFyIGUscjtyZXR1cm4gZT10aGlzLmdldFZpZXdTcGVjKHQpLHI9ZVsiY2xhc3MiXSx0aGlzLm9wdGlvbnMucmVzb3VyY2VzJiZlLm9wdGlvbnMucmVzb3VyY2VzIT09ITEmJihlLnF1ZXJ5UmVzb3VyY2VDbGFzcz9yPWUucXVlcnlSZXNvdXJjZUNsYXNzKGUpfHxyOmUucmVzb3VyY2VDbGFzcyYmKHI9ZS5yZXNvdXJjZUNsYXNzKSksbmV3IHIodGhpcyx0LGUub3B0aW9ucyxlLmR1cmF0aW9uKX0sci5wcm90b3R5cGUuZ2V0UmVzb3VyY2VzPWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMucmVzb3VyY2VNYW5hZ2VyLnRvcExldmVsUmVzb3VyY2VzKX0sci5wcm90b3R5cGUuYWRkUmVzb3VyY2U9ZnVuY3Rpb24odCxlKXt2YXIgcjtudWxsPT1lJiYoZT0hMSkscj10aGlzLnJlc291cmNlTWFuYWdlci5hZGRSZXNvdXJjZSh0KSxlJiZ0aGlzLnZpZXcuc2Nyb2xsVG9SZXNvdXJjZSYmci5kb25lKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC52aWV3LnNjcm9sbFRvUmVzb3VyY2UoZSl9fSh0aGlzKSl9LHIucHJvdG90eXBlLnJlbW92ZVJlc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlc291cmNlTWFuYWdlci5yZW1vdmVSZXNvdXJjZSh0KX0sci5wcm90b3R5cGUucmVmZXRjaFJlc291cmNlcz1mdW5jdGlvbigpe3RoaXMucmVzb3VyY2VNYW5hZ2VyLmZldGNoUmVzb3VyY2VzKCl9LHIucHJvdG90eXBlLnJlcmVuZGVyUmVzb3VyY2VzPWZ1bmN0aW9uKCl7dGhpcy5yZXNvdXJjZU1hbmFnZXIucmVzZXRSZXNvdXJjZXMoKX0sci5wcm90b3R5cGUuaXNTcGFuQWxsb3dlZD1mdW5jdGlvbih0LGUpe3ZhciBvLHM7cmV0dXJuISgib2JqZWN0Ij09dHlwZW9mIGUmJihvPXRoaXMuZ2V0RXZlbnRSZXNvdXJjZUlkcyhlKSxvLmxlbmd0aCYmISh0LnJlc291cmNlSWQmJihzPXQucmVzb3VyY2VJZCxOdC5jYWxsKG8scyk+PTApKSkpJiZyLl9fc3VwZXJfXy5pc1NwYW5BbGxvd2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sci5wcm90b3R5cGUuZ2V0UGVlckV2ZW50cz1mdW5jdGlvbih0LGUpe3ZhciBvLHMsaSxuLGwsdSxoLGEsYyxwLGQsZixnLHk7Zm9yKGY9ci5fX3N1cGVyX18uZ2V0UGVlckV2ZW50cy5hcHBseSh0aGlzLGFyZ3VtZW50cykscD10LnJlc291cmNlSWQ/W3QucmVzb3VyY2VJZF06ZT90aGlzLmdldEV2ZW50UmVzb3VyY2VJZHMoZSk6W10sbz1bXSxpPTAsdT1mLmxlbmd0aDtpPHU7aSsrKXtpZihkPWZbaV0scz0hMSx5PXRoaXMuZ2V0RXZlbnRSZXNvdXJjZUlkcyhkKSx5Lmxlbmd0aCYmcC5sZW5ndGgpe2ZvcihuPTAsaD15Lmxlbmd0aDtuPGg7bisrKWZvcihnPXlbbl0sbD0wLGE9cC5sZW5ndGg7bDxhO2wrKylpZihjPXBbbF0sYz09PWcpe3M9ITA7YnJlYWt9fWVsc2Ugcz0hMDtzJiZvLnB1c2goZCl9cmV0dXJuIG99LHIucHJvdG90eXBlLnNwYW5Db250YWluc1NwYW49ZnVuY3Rpb24odCxlKXtyZXR1cm4oIXQucmVzb3VyY2VJZHx8dC5yZXNvdXJjZUlkPT09ZS5yZXNvdXJjZUlkKSYmci5fX3N1cGVyX18uc3BhbkNvbnRhaW5zU3Bhbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLmdldEN1cnJlbnRCdXNpbmVzc0hvdXJFdmVudHM9ZnVuY3Rpb24odCl7dmFyIGUsbyxzLGksbixsLHUsaCxhLGMscCxkO2ZvcihuPXRoaXMucmVzb3VyY2VNYW5hZ2VyLmdldEZsYXRSZXNvdXJjZXMoKSxvPSExLGw9MCxhPW4ubGVuZ3RoO2w8YTtsKyspZD1uW2xdLGQuYnVzaW5lc3NIb3VycyYmKG89ITApO2lmKG8pe2ZvcihlPVtdLHU9MCxjPW4ubGVuZ3RoO3U8Yzt1KyspZm9yKGQ9blt1XSxpPXRoaXMuY29tcHV0ZUJ1c2luZXNzSG91ckV2ZW50cyh0LGQuYnVzaW5lc3NIb3Vyc3x8dGhpcy5vcHRpb25zLmJ1c2luZXNzSG91cnMpLGg9MCxwPWkubGVuZ3RoO2g8cDtoKyspcz1pW2hdLHMucmVzb3VyY2VJZD1kLmlkLGUucHVzaChzKTtyZXR1cm4gZX1yZXR1cm4gci5fX3N1cGVyX18uZ2V0Q3VycmVudEJ1c2luZXNzSG91ckV2ZW50cy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLmJ1aWxkU2VsZWN0U3Bhbj1mdW5jdGlvbih0LGUsbyl7dmFyIHM7cmV0dXJuIHM9ci5fX3N1cGVyX18uYnVpbGRTZWxlY3RTcGFuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxvJiYocy5yZXNvdXJjZUlkPW8pLHN9LHIucHJvdG90eXBlLmdldFJlc291cmNlQnlJZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXNvdXJjZU1hbmFnZXIuZ2V0UmVzb3VyY2VCeUlkKHQpfSxyLnByb3RvdHlwZS5ub3JtYWxpemVFdmVudD1mdW5jdGlvbih0KXtyZXR1cm4gci5fX3N1cGVyX18ubm9ybWFsaXplRXZlbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLG51bGw9PXQucmVzb3VyY2VJZCYmKHQucmVzb3VyY2VJZD1udWxsKSxudWxsIT10LnJlc291cmNlSWRzP3QucmVzb3VyY2VJZHM6dC5yZXNvdXJjZUlkcz1udWxsfSxyLnByb3RvdHlwZS5nZXRFdmVudFJlc291cmNlSWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0RXZlbnRSZXNvdXJjZUlkcyh0KVswXX0sci5wcm90b3R5cGUuZ2V0RXZlbnRSZXNvdXJjZUlkcz1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpLG4sbCx1O2lmKHU9U3RyaW5nKG51bGwhPShpPW51bGwhPShuPXRbdGhpcy5nZXRFdmVudFJlc291cmNlRmllbGQoKV0pP246dC5yZXNvdXJjZUlkKT9pOiIiKSlyZXR1cm5bdV07aWYodC5yZXNvdXJjZUlkcyl7Zm9yKHM9W10sbD10LnJlc291cmNlSWRzLGU9MCxyPWwubGVuZ3RoO2U8cjtlKyspdT1sW2VdLG89U3RyaW5nKG51bGwhPXU/dToiIiksbyYmcy5wdXNoKG8pO3JldHVybiBzfXJldHVybltdfSxyLnByb3RvdHlwZS5zZXRFdmVudFJlc291cmNlSWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFt0aGlzLmdldEV2ZW50UmVzb3VyY2VGaWVsZCgpXT1TdHJpbmcobnVsbCE9ZT9lOiIiKX0sci5wcm90b3R5cGUuZ2V0RXZlbnRSZXNvdXJjZUZpZWxkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5ldmVudFJlc291cmNlRmllbGR8fCJyZXNvdXJjZUlkIn0sci5wcm90b3R5cGUuZ2V0UmVzb3VyY2VFdmVudHM9ZnVuY3Rpb24oZSl7dmFyIHI7cmV0dXJuIHI9Im9iamVjdCI9PXR5cGVvZiBlP2U6dGhpcy5nZXRSZXNvdXJjZUJ5SWQoZSkscj90aGlzLmNsaWVudEV2ZW50cyhmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obyl7cmV0dXJuIHQuaW5BcnJheShyLmlkLGUuZ2V0RXZlbnRSZXNvdXJjZUlkcyhvKSkhPT0tMX19KHRoaXMpKTpbXX0sci5wcm90b3R5cGUuZ2V0RXZlbnRSZXNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRFdmVudFJlc291cmNlcyh0KVswXX0sci5wcm90b3R5cGUuZ2V0RXZlbnRSZXNvdXJjZXM9ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaSxuLGw7aWYoZT0ib2JqZWN0Ij09dHlwZW9mIHQ/dDp0aGlzLmNsaWVudEV2ZW50cyh0KVswXSxsPVtdLGUpZm9yKHM9dGhpcy5nZXRFdmVudFJlc291cmNlSWRzKGUpLHI9MCxvPXMubGVuZ3RoO3I8bztyKyspbj1zW3JdLGk9dGhpcy5nZXRSZXNvdXJjZUJ5SWQobiksaSYmbC5wdXNoKGkpO3JldHVybiBsfSxyfShvKSxvLnByb3RvdHlwZT1zLnByb3RvdHlwZSxIdD1YLnByb3RvdHlwZS5kaXNwbGF5Vmlldyx4dD1YLnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbixCdD1YLnByb3RvdHlwZS51bnJlbmRlclNrZWxldG9uLEV0PVgucHJvdG90eXBlLmRpc3BsYXlFdmVudHMsWC5wcm90b3R5cGUuaXNSZXNvdXJjZXNCb3VuZD0hMSxYLnByb3RvdHlwZS5zZXR0aW5nUmVzb3VyY2VzPW51bGwsWC5wcm90b3R5cGUuZGlzcGxheVZpZXc9ZnVuY3Rpb24oKXtyZXR1cm4gSHQuYXBwbHkodGhpcyxhcmd1bWVudHMpLEd0KHRoaXMuY2FsZW5kYXIub3B0aW9ucy5zY2hlZHVsZXJMaWNlbnNlS2V5LHRoaXMuZWwpLHRoaXMuYmluZFJlc291cmNlcygpLHRoaXMud2hlblJlc291cmNlcygpfSxYLnByb3RvdHlwZS51bnJlbmRlclNrZWxldG9uPWZ1bmN0aW9uKCl7cmV0dXJuIEJ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnVuYmluZFJlc291cmNlcyghMCl9LFgucHJvdG90eXBlLmRpc3BsYXlFdmVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMud2hlblJlc291cmNlcyhmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gRXQuY2FsbChlLHQpfX0odGhpcykpfSxYLnByb3RvdHlwZS5iaW5kUmVzb3VyY2VzPWZ1bmN0aW9uKCl7dmFyIGU7aWYoIXRoaXMuaXNSZXNvdXJjZXNCb3VuZClyZXR1cm4gdGhpcy5pc1Jlc291cmNlc0JvdW5kPSEwLHRoaXMuc2V0dGluZ1Jlc291cmNlcz10LkRlZmVycmVkKCksZT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2V0UmVzb3VyY2VzKGUpLHQuc2V0dGluZ1Jlc291cmNlcy5yZXNvbHZlKCl9fSh0aGlzKSx0aGlzLmxpc3RlblRvKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyLHtzZXQ6ZSx1bnNldDp0aGlzLnVuc2V0UmVzb3VyY2VzLHJlc2V0OnRoaXMucmVzZXRSZXNvdXJjZXMsYWRkOnRoaXMuYWRkUmVzb3VyY2UscmVtb3ZlOnRoaXMucmVtb3ZlUmVzb3VyY2V9KSx0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlci5oYXNGZXRjaGVkKCk/ZSh0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlci50b3BMZXZlbFJlc291cmNlcyk6dGhpcy5jYWxlbmRhci5yZXNvdXJjZU1hbmFnZXIuZ2V0UmVzb3VyY2VzKCl9LFgucHJvdG90eXBlLnVuYmluZFJlc291cmNlcz1mdW5jdGlvbih0KXtpZih0aGlzLmlzUmVzb3VyY2VzQm91bmQpcmV0dXJuIHRoaXMuc3RvcExpc3RlbmluZ1RvKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyKSwicmVzb2x2ZWQiPT09dGhpcy5zZXR0aW5nUmVzb3VyY2VzLnN0YXRlKCkmJnRoaXMudW5zZXRSZXNvdXJjZXModCksdGhpcy5zZXR0aW5nUmVzb3VyY2VzPW51bGwsdGhpcy5pc1Jlc291cmNlc0JvdW5kPSExfSxYLnByb3RvdHlwZS53aGVuUmVzb3VyY2VzPWZ1bmN0aW9uKHQpe3JldHVybiBMdCh0aGlzLnNldHRpbmdSZXNvdXJjZXMsdCl9LFgucHJvdG90eXBlLnNldFJlc291cmNlcz1mdW5jdGlvbih0KXt9LFgucHJvdG90eXBlLnVuc2V0UmVzb3VyY2VzPWZ1bmN0aW9uKCl7fSxYLnByb3RvdHlwZS5yZXNldFJlc291cmNlcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jYWxlbmRhci5yZXJlbmRlckV2ZW50cygpfSxYLnByb3RvdHlwZS5hZGRSZXNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXNldFJlc291cmNlcyh0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlci50b3BMZXZlbFJlc291cmNlcyl9LFgucHJvdG90eXBlLnJlbW92ZVJlc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlc2V0UmVzb3VyY2VzKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyLnRvcExldmVsUmVzb3VyY2VzKX0sVHQ9Zi5wcm90b3R5cGUuZ2V0U2VnQ3VzdG9tQ2xhc3NlcyxfdD1mLnByb3RvdHlwZS5nZXRTZWdEZWZhdWx0QmFja2dyb3VuZENvbG9yLEl0PWYucHJvdG90eXBlLmdldFNlZ0RlZmF1bHRCb3JkZXJDb2xvcixEdD1mLnByb3RvdHlwZS5nZXRTZWdEZWZhdWx0VGV4dENvbG9yLGYucHJvdG90eXBlLmdldFNlZ0N1c3RvbUNsYXNzZXM9ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaTtmb3IoZT1UdC5hcHBseSh0aGlzLGFyZ3VtZW50cykscz10aGlzLmdldFNlZ1Jlc291cmNlcyh0KSxyPTAsbz1zLmxlbmd0aDtyPG87cisrKWk9c1tyXSxlPWUuY29uY2F0KGkuZXZlbnRDbGFzc05hbWV8fFtdKTtyZXR1cm4gZX0sZi5wcm90b3R5cGUuZ2V0U2VnRGVmYXVsdEJhY2tncm91bmRDb2xvcj1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpO2ZvcihzPXRoaXMuZ2V0U2VnUmVzb3VyY2VzKHQpLHI9MCxvPXMubGVuZ3RoO3I8bztyKyspZm9yKGU9c1tyXTtlOyl7aWYoaT1lLmV2ZW50QmFja2dyb3VuZENvbG9yfHxlLmV2ZW50Q29sb3IpcmV0dXJuIGk7ZT1lLl9wYXJlbnR9cmV0dXJuIF90LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZi5wcm90b3R5cGUuZ2V0U2VnRGVmYXVsdEJvcmRlckNvbG9yPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzLGk7Zm9yKHM9dGhpcy5nZXRTZWdSZXNvdXJjZXModCkscj0wLG89cy5sZW5ndGg7cjxvO3IrKylmb3IoZT1zW3JdO2U7KXtpZihpPWUuZXZlbnRCb3JkZXJDb2xvcnx8ZS5ldmVudENvbG9yKXJldHVybiBpO2U9ZS5fcGFyZW50fXJldHVybiBJdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGYucHJvdG90eXBlLmdldFNlZ0RlZmF1bHRUZXh0Q29sb3I9ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaTtmb3Iocz10aGlzLmdldFNlZ1Jlc291cmNlcyh0KSxyPTAsbz1zLmxlbmd0aDtyPG87cisrKWZvcihlPXNbcl07ZTspe2lmKGk9ZS5ldmVudFRleHRDb2xvcilyZXR1cm4gaTtlPWUuX3BhcmVudH1yZXR1cm4gRHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxmLnByb3RvdHlwZS5nZXRTZWdSZXNvdXJjZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVzb3VyY2U/W3QucmVzb3VyY2VdOnRoaXMudmlldy5jYWxlbmRhci5nZXRFdmVudFJlc291cmNlcyh0LmV2ZW50KX0sRD1mdW5jdGlvbihlKXtmdW5jdGlvbiByKHQpe3RoaXMuY2FsZW5kYXI9dCx0aGlzLmluaXRpYWxpemVDYWNoZSgpfXJldHVybiBPdChyLGUpLHIubWl4aW4oYSksci5yZXNvdXJjZUd1aWQ9MSxyLmFqYXhEZWZhdWx0cz17ZGF0YVR5cGU6Impzb24iLGNhY2hlOiExfSxyLnByb3RvdHlwZS5jYWxlbmRhcj1udWxsLHIucHJvdG90eXBlLnRvcExldmVsUmVzb3VyY2VzPW51bGwsci5wcm90b3R5cGUucmVzb3VyY2VzQnlJZD1udWxsLHIucHJvdG90eXBlLmZldGNoaW5nPW51bGwsci5wcm90b3R5cGUuaGFzRmV0Y2hlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZldGNoaW5nJiYicmVzb2x2ZWQiPT09dGhpcy5mZXRjaGluZy5zdGF0ZSgpfSxyLnByb3RvdHlwZS5nZXRSZXNvdXJjZXM9ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gdGhpcy5mZXRjaGluZz90LkRlZmVycmVkKCkucmVzb2x2ZSh0aGlzLnRvcExldmVsUmVzb3VyY2VzKS5wcm9taXNlKCk6KGU9dC5EZWZlcnJlZCgpLEx0KHRoaXMuZmV0Y2hSZXNvdXJjZXMoKSxmdW5jdGlvbigpe3JldHVybiBlLnJlc29sdmUodGhpcy50b3BMZXZlbFJlc291cmNlcyl9LGZ1bmN0aW9uKCl7cmV0dXJuIGUucmVzb2x2ZShbXSl9KSxlLnByb21pc2UoKSl9LHIucHJvdG90eXBlLmZldGNoUmVzb3VyY2VzPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIGU9dGhpcy5mZXRjaGluZyxMdChlLGZ1bmN0aW9uKHIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiByLmZldGNoaW5nPXQuRGVmZXJyZWQoKSxyLmZldGNoUmVzb3VyY2VJbnB1dHMoZnVuY3Rpb24odCl7cmV0dXJuIHIuc2V0UmVzb3VyY2VzKHQsQm9vbGVhbihlKSksci5mZXRjaGluZy5yZXNvbHZlKHIudG9wTGV2ZWxSZXNvdXJjZXMpfSksci5mZXRjaGluZy5wcm9taXNlKCl9fSh0aGlzKSl9LHIucHJvdG90eXBlLmZldGNoUmVzb3VyY2VJbnB1dHM9ZnVuY3Rpb24oZSl7dmFyIG87c3dpdGNoKG89dGhpcy5jYWxlbmRhci5vcHRpb25zLnJlc291cmNlcywic3RyaW5nIj09PXQudHlwZShvKSYmKG89e3VybDpvfSksdC50eXBlKG8pKXtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gdGhpcy5jYWxlbmRhci5wdXNoTG9hZGluZygpLG8oZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0LmNhbGVuZGFyLnBvcExvYWRpbmcoKSxlKHIpfX0odGhpcykpO2Nhc2Uib2JqZWN0IjpyZXR1cm4gdGhpcy5jYWxlbmRhci5wdXNoTG9hZGluZygpLHQuYWpheCh0LmV4dGVuZCh7fSxyLmFqYXhEZWZhdWx0cyxvKSkuZG9uZShmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQuY2FsZW5kYXIucG9wTG9hZGluZygpLGUocil9fSh0aGlzKSk7Y2FzZSJhcnJheSI6cmV0dXJuIGUobyk7ZGVmYXVsdDpyZXR1cm4gZShbXSl9fSxyLnByb3RvdHlwZS5yZXNldFJlc291cmNlcz1mdW5jdGlvbigpe3JldHVybiBMdCh0aGlzLmdldFJlc291cmNlcygpLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LnRyaWdnZXIoInJlc2V0Iix0LnRvcExldmVsUmVzb3VyY2VzKX19KHRoaXMpKX0sci5wcm90b3R5cGUuZ2V0UmVzb3VyY2VCeUlkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlc291cmNlc0J5SWRbdF19LHIucHJvdG90eXBlLmdldEZsYXRSZXNvdXJjZXM9ZnVuY3Rpb24oKXt2YXIgdCxlO2U9W107Zm9yKHQgaW4gdGhpcy5yZXNvdXJjZXNCeUlkKWUucHVzaCh0aGlzLnJlc291cmNlc0J5SWRbdF0pO3JldHVybiBlfSxyLnByb3RvdHlwZS5pbml0aWFsaXplQ2FjaGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b3BMZXZlbFJlc291cmNlcz1bXSx0aGlzLnJlc291cmNlc0J5SWQ9e319LHIucHJvdG90eXBlLnNldFJlc291cmNlcz1mdW5jdGlvbih0LGUpe3ZhciByLG8scyxpLG4sbDtmb3IodGhpcy5pbml0aWFsaXplQ2FjaGUoKSxuPWZ1bmN0aW9uKCl7dmFyIGUscixvO2ZvcihvPVtdLGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspaT10W2VdLG8ucHVzaCh0aGlzLmJ1aWxkUmVzb3VyY2UoaSkpO3JldHVybiBvfS5jYWxsKHRoaXMpLGw9ZnVuY3Rpb24oKXt2YXIgdCxlLHI7Zm9yKHI9W10sdD0wLGU9bi5sZW5ndGg7dDxlO3QrKylzPW5bdF0sdGhpcy5hZGRSZXNvdXJjZVRvSW5kZXgocykmJnIucHVzaChzKTtyZXR1cm4gcn0uY2FsbCh0aGlzKSxyPTAsbz1sLmxlbmd0aDtyPG87cisrKXM9bFtyXSx0aGlzLmFkZFJlc291cmNlVG9UcmVlKHMpO3JldHVybiBlP3RoaXMudHJpZ2dlcigicmVzZXQiLHRoaXMudG9wTGV2ZWxSZXNvdXJjZXMpOnRoaXMudHJpZ2dlcigic2V0Iix0aGlzLnRvcExldmVsUmVzb3VyY2VzKSx0aGlzLmNhbGVuZGFyLnRyaWdnZXIoInJlc291cmNlc1NldCIsbnVsbCx0aGlzLnRvcExldmVsUmVzb3VyY2VzKX0sci5wcm90b3R5cGUuYWRkUmVzb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIEx0KHRoaXMuZmV0Y2hpbmcsZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI7cmV0dXJuIHI9ZS5idWlsZFJlc291cmNlKHQpLCEhZS5hZGRSZXNvdXJjZVRvSW5kZXgocikmJihlLmFkZFJlc291cmNlVG9UcmVlKHIpLGUudHJpZ2dlcigiYWRkIixyKSxyKX19KHRoaXMpKX0sci5wcm90b3R5cGUuYWRkUmVzb3VyY2VUb0luZGV4PWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzO2lmKHRoaXMucmVzb3VyY2VzQnlJZFt0LmlkXSlyZXR1cm4hMTtmb3IodGhpcy5yZXNvdXJjZXNCeUlkW3QuaWRdPXQscz10LmNoaWxkcmVuLHI9MCxvPXMubGVuZ3RoO3I8bztyKyspZT1zW3JdLHRoaXMuYWRkUmVzb3VyY2VUb0luZGV4KGUpO3JldHVybiEwfSxyLnByb3RvdHlwZS5hZGRSZXNvdXJjZVRvVHJlZT1mdW5jdGlvbih0KXt2YXIgZSxyLG8scztpZighdC5wYXJlbnQpe2lmKHI9U3RyaW5nKG51bGwhPShvPXQucGFyZW50SWQpP286IiIpKXtpZihlPXRoaXMucmVzb3VyY2VzQnlJZFtyXSwhZSlyZXR1cm4hMTt0LnBhcmVudD1lLHM9ZS5jaGlsZHJlbn1lbHNlIHM9dGhpcy50b3BMZXZlbFJlc291cmNlcztzLnB1c2godCl9cmV0dXJuITB9LHIucHJvdG90eXBlLnJlbW92ZVJlc291cmNlPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBlPSJvYmplY3QiPT10eXBlb2YgdD90LmlkOnQsTHQodGhpcy5mZXRjaGluZyxmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcjtyZXR1cm4gcj10LnJlbW92ZVJlc291cmNlRnJvbUluZGV4KGUpLHImJih0LnJlbW92ZVJlc291cmNlRnJvbVRyZWUociksdC50cmlnZ2VyKCJyZW1vdmUiLHIpKSxyfX0odGhpcykpfSxyLnByb3RvdHlwZS5yZW1vdmVSZXNvdXJjZUZyb21JbmRleD1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpO2lmKGk9dGhpcy5yZXNvdXJjZXNCeUlkW3RdKXtmb3IoZGVsZXRlIHRoaXMucmVzb3VyY2VzQnlJZFt0XSxzPWkuY2hpbGRyZW4scj0wLG89cy5sZW5ndGg7cjxvO3IrKyllPXNbcl0sdGhpcy5yZW1vdmVSZXNvdXJjZUZyb21JbmRleChlLmlkKTtyZXR1cm4gaX1yZXR1cm4hMX0sci5wcm90b3R5cGUucmVtb3ZlUmVzb3VyY2VGcm9tVHJlZT1mdW5jdGlvbih0LGUpe3ZhciByLG8scyxpO2ZvcihudWxsPT1lJiYoZT10aGlzLnRvcExldmVsUmVzb3VyY2VzKSxyPW89MCxzPWUubGVuZ3RoO288cztyPSsrbyl7aWYoaT1lW3JdLGk9PT10KXJldHVybiB0LnBhcmVudD1udWxsLGUuc3BsaWNlKHIsMSksITA7aWYodGhpcy5yZW1vdmVSZXNvdXJjZUZyb21UcmVlKHQsaS5jaGlsZHJlbikpcmV0dXJuITB9cmV0dXJuITF9LHIucHJvdG90eXBlLmJ1aWxkUmVzb3VyY2U9ZnVuY3Rpb24oZSl7dmFyIG8scyxpLG4sbDtyZXR1cm4gbD10LmV4dGVuZCh7fSxlKSxsLmlkPVN0cmluZyhudWxsIT0obj1lLmlkKT9uOiJfZmMiK3IucmVzb3VyY2VHdWlkKyspLGk9ZS5ldmVudENsYXNzTmFtZSxsLmV2ZW50Q2xhc3NOYW1lPWZ1bmN0aW9uKCl7c3dpdGNoKHQudHlwZShpKSl7Y2FzZSJzdHJpbmciOnJldHVybiBpLnNwbGl0KC9ccysvKTtjYXNlImFycmF5IjpyZXR1cm4gaTtkZWZhdWx0OnJldHVybltdfX0oKSxsLmNoaWxkcmVuPWZ1bmN0aW9uKCl7dmFyIHQscixpLG4sdTtmb3Iobj1udWxsIT0oaT1lLmNoaWxkcmVuKT9pOltdLHU9W10sdD0wLHI9bi5sZW5ndGg7dDxyO3QrKylzPW5bdF0sbz10aGlzLmJ1aWxkUmVzb3VyY2Uocyksby5wYXJlbnQ9bCx1LnB1c2gobyk7cmV0dXJuIHV9LmNhbGwodGhpcyksbH0scn0oaSksVz17cmVzb3VyY2VUZXh0RnVuYzpudWxsLHVuc2V0UmVzb3VyY2VzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xlYXJFdmVudHMoKX0scmVzZXRSZXNvdXJjZXM6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIGU9dGhpcy5xdWVyeVNjcm9sbCgpLHRoaXMudW5zZXRSZXNvdXJjZXMoKSx0aGlzLnNldFJlc291cmNlcyh0KSx0aGlzLnNldFNjcm9sbChlKSx0aGlzLmNhbGVuZGFyLnJlcmVuZGVyRXZlbnRzKCl9LGlzRXZlbnREcmFnZ2FibGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNFdmVudFJlc291cmNlRWRpdGFibGUodCl8fFgucHJvdG90eXBlLmlzRXZlbnREcmFnZ2FibGUuY2FsbCh0aGlzLHQpfSxpc0V2ZW50UmVzb3VyY2VFZGl0YWJsZTpmdW5jdGlvbih0KXt2YXIgZSxyLG87cmV0dXJuIG51bGwhPShlPW51bGwhPShyPW51bGwhPShvPXQucmVzb3VyY2VFZGl0YWJsZSk/bzoodC5zb3VyY2V8fHt9KS5yZXNvdXJjZUVkaXRhYmxlKT9yOnRoaXMub3B0KCJldmVudFJlc291cmNlRWRpdGFibGUiKSk/ZTp0aGlzLmlzRXZlbnRHZW5lcmFsbHlFZGl0YWJsZSh0KX0sZ2V0UmVzb3VyY2VUZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldFJlc291cmNlVGV4dEZ1bmMoKSh0KX0sZ2V0UmVzb3VyY2VUZXh0RnVuYzpmdW5jdGlvbigpe3ZhciB0O3JldHVybiB0aGlzLnJlc291cmNlVGV4dEZ1bmM/dGhpcy5yZXNvdXJjZVRleHRGdW5jOih0PXRoaXMub3B0KCJyZXNvdXJjZVRleHQiKSwiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudGl0bGV8fHQuaWR9KSx0aGlzLnJlc291cmNlVGV4dEZ1bmM9dCl9LHRyaWdnZXJEYXlDbGljazpmdW5jdGlvbih0LGUscil7dmFyIG87cmV0dXJuIG89dGhpcy5jYWxlbmRhci5yZXNvdXJjZU1hbmFnZXIsdGhpcy50cmlnZ2VyKCJkYXlDbGljayIsZSx0aGlzLmNhbGVuZGFyLmFwcGx5VGltZXpvbmUodC5zdGFydCkscix0aGlzLG8uZ2V0UmVzb3VyY2VCeUlkKHQucmVzb3VyY2VJZCkpfSx0cmlnZ2VyU2VsZWN0OmZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIHI9dGhpcy5jYWxlbmRhci5yZXNvdXJjZU1hbmFnZXIsdGhpcy50cmlnZ2VyKCJzZWxlY3QiLG51bGwsdGhpcy5jYWxlbmRhci5hcHBseVRpbWV6b25lKHQuc3RhcnQpLHRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZSh0LmVuZCksZSx0aGlzLHIuZ2V0UmVzb3VyY2VCeUlkKHQucmVzb3VyY2VJZCkpfSx0cmlnZ2VyRXh0ZXJuYWxEcm9wOmZ1bmN0aW9uKHQsZSxyLG8scyl7aWYodGhpcy50cmlnZ2VyKCJkcm9wIixyWzBdLGUuc3RhcnQsbyxzLGUucmVzb3VyY2VJZCksdClyZXR1cm4gdGhpcy50cmlnZ2VyKCJldmVudFJlY2VpdmUiLG51bGwsdCl9LHJlcG9ydEV2ZW50RHJvcDpmdW5jdGlvbigpe3ZhciB0LGUscixvO3JldHVybiBlPWFyZ3VtZW50c1swXSx0PWFyZ3VtZW50c1sxXSxyPTM8PWFyZ3VtZW50cy5sZW5ndGg/anQuY2FsbChhcmd1bWVudHMsMik6W10sdD10aGlzLm5vcm1hbGl6ZURyb3BMb2NhdGlvbih0KSx0LnJlc291cmNlSWQmJmUucmVzb3VyY2VJZHMmJih0LnJlc291cmNlSWRzPW51bGwpLChvPVgucHJvdG90eXBlLnJlcG9ydEV2ZW50RHJvcCkuY2FsbC5hcHBseShvLFt0aGlzLGUsdF0uY29uY2F0KGp0LmNhbGwocikpKX0scmVwb3J0RXh0ZXJuYWxEcm9wOmZ1bmN0aW9uKCl7dmFyIHQsZSxyLG87cmV0dXJuIGU9YXJndW1lbnRzWzBdLHQ9YXJndW1lbnRzWzFdLHI9Mzw9YXJndW1lbnRzLmxlbmd0aD9qdC5jYWxsKGFyZ3VtZW50cywyKTpbXSx0PXRoaXMubm9ybWFsaXplRHJvcExvY2F0aW9uKHQpLChvPVgucHJvdG90eXBlLnJlcG9ydEV4dGVybmFsRHJvcCkuY2FsbC5hcHBseShvLFt0aGlzLGUsdF0uY29uY2F0KGp0LmNhbGwocikpKX0sbm9ybWFsaXplRHJvcExvY2F0aW9uOmZ1bmN0aW9uKGUpe3ZhciByO3JldHVybiByPXQuZXh0ZW5kKHt9LGUpLGRlbGV0ZSByLnJlc291cmNlSWQsdGhpcy5jYWxlbmRhci5zZXRFdmVudFJlc291cmNlSWQocixlLnJlc291cmNlSWQpLHJ9fSxJPXthbGxvd0Nyb3NzUmVzb3VyY2U6ITAsZXZlbnRSYW5nZVRvU3BhbnM6ZnVuY3Rpb24oZSxyKXt2YXIgbyxzLGksbixsO2lmKG49dGhpcy52aWV3LmNhbGVuZGFyLmdldEV2ZW50UmVzb3VyY2VJZHMociksbi5sZW5ndGgpe2ZvcihsPVtdLG89MCxzPW4ubGVuZ3RoO288cztvKyspaT1uW29dLGwucHVzaCh0LmV4dGVuZCh7fSxlLHtyZXNvdXJjZUlkOml9KSk7cmV0dXJuIGx9cmV0dXJuIGQuaXNCZ0V2ZW50KHIpP2YucHJvdG90eXBlLmV2ZW50UmFuZ2VUb1NwYW5zLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpbXX0sZmFicmljYXRlSGVscGVyRXZlbnQ6ZnVuY3Rpb24odCxlKXt2YXIgcjtyZXR1cm4gcj1mLnByb3RvdHlwZS5mYWJyaWNhdGVIZWxwZXJFdmVudC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy52aWV3LmNhbGVuZGFyLnNldEV2ZW50UmVzb3VyY2VJZChyLHQucmVzb3VyY2VJZCkscn0sY29tcHV0ZUV2ZW50RHJvcDpmdW5jdGlvbih0LGUscil7dmFyIG87cmV0dXJuIG89dGhpcy52aWV3LmlzRXZlbnRTdGFydEVkaXRhYmxlKHIpP2YucHJvdG90eXBlLmNvbXB1dGVFdmVudERyb3AuYXBwbHkodGhpcyxhcmd1bWVudHMpOmQucGx1Y2tFdmVudERhdGVQcm9wcyhyKSxvJiYodGhpcy52aWV3LmlzRXZlbnRSZXNvdXJjZUVkaXRhYmxlKHIpP28ucmVzb3VyY2VJZD1lLnJlc291cmNlSWQ6by5yZXNvdXJjZUlkPXQucmVzb3VyY2VJZCksb30sY29tcHV0ZUV4dGVybmFsRHJvcDpmdW5jdGlvbih0LGUpe3ZhciByO3JldHVybiByPWYucHJvdG90eXBlLmNvbXB1dGVFeHRlcm5hbERyb3AuYXBwbHkodGhpcyxhcmd1bWVudHMpLHImJihyLnJlc291cmNlSWQ9dC5yZXNvdXJjZUlkKSxyfSxjb21wdXRlRXZlbnRSZXNpemU6ZnVuY3Rpb24odCxlLHIsbyl7dmFyIHM7aWYodGhpcy5hbGxvd0Nyb3NzUmVzb3VyY2V8fGUucmVzb3VyY2VJZD09PXIucmVzb3VyY2VJZClyZXR1cm4gcz1mLnByb3RvdHlwZS5jb21wdXRlRXZlbnRSZXNpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHMmJihzLnJlc291cmNlSWQ9ZS5yZXNvdXJjZUlkKSxzfSxjb21wdXRlU2VsZWN0aW9uU3BhbjpmdW5jdGlvbih0LGUpe3ZhciByO2lmKHRoaXMuYWxsb3dDcm9zc1Jlc291cmNlfHx0LnJlc291cmNlSWQ9PT1lLnJlc291cmNlSWQpcmV0dXJuIHI9Zi5wcm90b3R5cGUuY29tcHV0ZVNlbGVjdGlvblNwYW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHImJihyLnJlc291cmNlSWQ9dC5yZXNvdXJjZUlkKSxyfX0sXz17ZmxhdHRlbmVkUmVzb3VyY2VzOm51bGwscmVzb3VyY2VDbnQ6MCxkYXRlc0Fib3ZlUmVzb3VyY2VzOiExLGFsbG93Q3Jvc3NSZXNvdXJjZTohMSxzZXRSZXNvdXJjZXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzPXRoaXMuZmxhdHRlblJlc291cmNlcyh0KSx0aGlzLnJlc291cmNlQ250PXRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzLmxlbmd0aCx0aGlzLnVwZGF0ZURheVRhYmxlQ29scygpfSx1bnNldFJlc291cmNlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZsYXR0ZW5lZFJlc291cmNlcz1udWxsLHRoaXMucmVzb3VyY2VDbnQ9MCx0aGlzLnVwZGF0ZURheVRhYmxlQ29scygpfSxmbGF0dGVuUmVzb3VyY2VzOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzO3JldHVybiByPXRoaXMudmlldy5vcHQoInJlc291cmNlT3JkZXIiKSxyPyhlPUZ0KHIpLHM9ZnVuY3Rpb24odCxyKXtyZXR1cm4gUSh0LHIsZSl9KTpzPW51bGwsbz1bXSx0aGlzLmFjY3VtdWxhdGVSZXNvdXJjZXModCxzLG8pLG99LGFjY3VtdWxhdGVSZXNvdXJjZXM6ZnVuY3Rpb24odCxlLHIpe3ZhciBvLHMsaSxuLGw7Zm9yKGU/KGw9dC5zbGljZSgwKSxsLnNvcnQoZSkpOmw9dCxuPVtdLG89MCxzPWwubGVuZ3RoO288cztvKyspaT1sW29dLHIucHVzaChpKSxuLnB1c2godGhpcy5hY2N1bXVsYXRlUmVzb3VyY2VzKGkuY2hpbGRyZW4sZSxyKSk7cmV0dXJuIG59LHVwZGF0ZURheVRhYmxlQ29sczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGVzQWJvdmVSZXNvdXJjZXM9dGhpcy52aWV3Lm9wdCgiZ3JvdXBCeURhdGVBbmRSZXNvdXJjZSIpLGQuRGF5VGFibGVNaXhpbi51cGRhdGVEYXlUYWJsZUNvbHMuY2FsbCh0aGlzKX0sY29tcHV0ZUNvbENudDpmdW5jdGlvbigpe3JldHVybih0aGlzLnJlc291cmNlQ250fHwxKSp0aGlzLmRheXNQZXJSb3d9LGdldENvbERheUluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzUlRMJiYodD10aGlzLmNvbENudC0xLXQpLHRoaXMuZGF0ZXNBYm92ZVJlc291cmNlcz9NYXRoLmZsb29yKHQvKHRoaXMucmVzb3VyY2VDbnR8fDEpKTp0JXRoaXMuZGF5c1BlclJvd30sZ2V0Q29sUmVzb3VyY2U6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzW3RoaXMuZ2V0Q29sUmVzb3VyY2VJbmRleCh0KV19LGdldENvbFJlc291cmNlSW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNSVEwmJih0PXRoaXMuY29sQ250LTEtdCksdGhpcy5kYXRlc0Fib3ZlUmVzb3VyY2VzP3QlKHRoaXMucmVzb3VyY2VDbnR8fDEpOk1hdGguZmxvb3IodC90aGlzLmRheXNQZXJSb3cpfSxpbmRpY2VzVG9Db2w6ZnVuY3Rpb24odCxlKXt2YXIgcjtyZXR1cm4gcj10aGlzLmRhdGVzQWJvdmVSZXNvdXJjZXM/ZSoodGhpcy5yZXNvdXJjZUNudHx8MSkrdDp0KnRoaXMuZGF5c1BlclJvdytlLHRoaXMuaXNSVEwmJihyPXRoaXMuY29sQ250LTEtcikscn0scmVuZGVySGVhZFRySHRtbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlc291cmNlQ250P3RoaXMuZGF5c1BlclJvdz4xP3RoaXMuZGF0ZXNBYm92ZVJlc291cmNlcz90aGlzLnJlbmRlckhlYWREYXRlQW5kUmVzb3VyY2VIdG1sKCk6dGhpcy5yZW5kZXJIZWFkUmVzb3VyY2VBbmREYXRlSHRtbCgpOnRoaXMucmVuZGVySGVhZFJlc291cmNlSHRtbCgpOmQuRGF5VGFibGVNaXhpbi5yZW5kZXJIZWFkVHJIdG1sLmNhbGwodGhpcyl9LHJlbmRlckhlYWRSZXNvdXJjZUh0bWw6ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzO2ZvcihzPVtdLHI9dGhpcy5mbGF0dGVuZWRSZXNvdXJjZXMsdD0wLGU9ci5sZW5ndGg7dDxlO3QrKylvPXJbdF0sCnMucHVzaCh0aGlzLnJlbmRlckhlYWRSZXNvdXJjZUNlbGxIdG1sKG8pKTtyZXR1cm4gdGhpcy53cmFwVHIocywicmVuZGVySGVhZEludHJvSHRtbCIpfSxyZW5kZXJIZWFkUmVzb3VyY2VBbmREYXRlSHRtbDpmdW5jdGlvbigpe3ZhciB0LGUscixvLHMsaSxuLGwsdSxoO2ZvcihoPVtdLGU9W10sbj10aGlzLmZsYXR0ZW5lZFJlc291cmNlcyxvPTAsaT1uLmxlbmd0aDtvPGk7bysrKWZvcih1PW5bb10saC5wdXNoKHRoaXMucmVuZGVySGVhZFJlc291cmNlQ2VsbEh0bWwodSxudWxsLHRoaXMuZGF5c1BlclJvdykpLHI9cz0wLGw9dGhpcy5kYXlzUGVyUm93O3M8bDtyPXMrPTEpdD10aGlzLmRheURhdGVzW3JdLmNsb25lKCksZS5wdXNoKHRoaXMucmVuZGVySGVhZFJlc291cmNlRGF0ZUNlbGxIdG1sKHQsdSkpO3JldHVybiB0aGlzLndyYXBUcihoLCJyZW5kZXJIZWFkSW50cm9IdG1sIikrdGhpcy53cmFwVHIoZSwicmVuZGVySGVhZEludHJvSHRtbCIpfSxyZW5kZXJIZWFkRGF0ZUFuZFJlc291cmNlSHRtbDpmdW5jdGlvbigpe3ZhciB0LGUscixvLHMsaSxuLGwsdSxoO2ZvcihlPVtdLGg9W10scj1vPTAsbj10aGlzLmRheXNQZXJSb3c7bzxuO3I9bys9MSlmb3IodD10aGlzLmRheURhdGVzW3JdLmNsb25lKCksZS5wdXNoKHRoaXMucmVuZGVySGVhZERhdGVDZWxsSHRtbCh0LHRoaXMucmVzb3VyY2VDbnQpKSxsPXRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzLHM9MCxpPWwubGVuZ3RoO3M8aTtzKyspdT1sW3NdLGgucHVzaCh0aGlzLnJlbmRlckhlYWRSZXNvdXJjZUNlbGxIdG1sKHUsdCkpO3JldHVybiB0aGlzLndyYXBUcihlLCJyZW5kZXJIZWFkSW50cm9IdG1sIikrdGhpcy53cmFwVHIoaCwicmVuZGVySGVhZEludHJvSHRtbCIpfSxyZW5kZXJIZWFkUmVzb3VyY2VDZWxsSHRtbDpmdW5jdGlvbih0LGUscil7cmV0dXJuJzx0aCBjbGFzcz0iZmMtcmVzb3VyY2UtY2VsbCIgZGF0YS1yZXNvdXJjZS1pZD0iJyt0LmlkKyciJysoZT8nIGRhdGEtZGF0ZT0iJytlLmZvcm1hdCgiWVlZWS1NTS1ERCIpKyciJzoiIikrKHI+MT8nIGNvbHNwYW49IicrcisnIic6IiIpKyI+Iit5dCh0aGlzLnZpZXcuZ2V0UmVzb3VyY2VUZXh0KHQpKSsiPC90aD4ifSxyZW5kZXJIZWFkUmVzb3VyY2VEYXRlQ2VsbEh0bWw6ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0aGlzLnJlbmRlckhlYWREYXRlQ2VsbEh0bWwodCxyLCdkYXRhLXJlc291cmNlLWlkPSInK2UuaWQrJyInKX0scHJvY2Vzc0hlYWRSZXNvdXJjZUVsczpmdW5jdGlvbihlKXtyZXR1cm4gZS5maW5kKCIuZmMtcmVzb3VyY2UtY2VsbCIpLmVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHIsbyl7dmFyIHM7cmV0dXJuIHM9ZS5kYXRlc0Fib3ZlUmVzb3VyY2VzP2UuZ2V0Q29sUmVzb3VyY2Uocik6ZS5mbGF0dGVuZWRSZXNvdXJjZXNbZS5pc1JUTD9lLmZsYXR0ZW5lZFJlc291cmNlcy5sZW5ndGgtMS1yOnJdLGUudmlldy50cmlnZ2VyKCJyZXNvdXJjZVJlbmRlciIscyxzLHQobyksdCgpKX19KHRoaXMpKX0scmVuZGVyQmdDZWxsc0h0bWw6ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaSxuO2lmKHRoaXMucmVzb3VyY2VDbnQpe2ZvcihvPVtdLGU9cz0wLGk9dGhpcy5jb2xDbnQ7czxpO2U9cys9MSlyPXRoaXMuZ2V0Q2VsbERhdGUodCxlKSxuPXRoaXMuZ2V0Q29sUmVzb3VyY2UoZSksby5wdXNoKHRoaXMucmVuZGVyUmVzb3VyY2VCZ0NlbGxIdG1sKHIsbikpO3JldHVybiBvLmpvaW4oIiIpfXJldHVybiBkLkRheVRhYmxlTWl4aW4ucmVuZGVyQmdDZWxsc0h0bWwuY2FsbCh0aGlzLHQpfSxyZW5kZXJSZXNvdXJjZUJnQ2VsbEh0bWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZW5kZXJCZ0NlbGxIdG1sKHQsJ2RhdGEtcmVzb3VyY2UtaWQ9IicrZS5pZCsnIicpfSx3cmFwVHI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pc1JUTD8odC5yZXZlcnNlKCksIjx0cj4iK3Quam9pbigiIikrdGhpc1tlXSgpKyI8L3RyPiIpOiI8dHI+Iit0aGlzW2VdKCkrdC5qb2luKCIiKSsiPC90cj4ifSxjb21wdXRlUGVyUmVzb3VyY2VCdXNpbmVzc0hvdXJTZWdzOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzLGksbixsLHUsaCxhLGMscCxkLGYsZztpZih0aGlzLmZsYXR0ZW5lZFJlc291cmNlcyl7Zm9yKHI9ITEscD10aGlzLmZsYXR0ZW5lZFJlc291cmNlcyxuPTAsaD1wLmxlbmd0aDtuPGg7bisrKWY9cFtuXSxmLmJ1c2luZXNzSG91cnMmJihyPSEwKTtpZihyKXtmb3IoZT1bXSxkPXRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzLGw9MCxhPWQubGVuZ3RoO2w8YTtsKyspe2ZvcihmPWRbbF0sbz1mLmJ1c2luZXNzSG91cnN8fHRoaXMudmlldy5vcHQoImJ1c2luZXNzSG91cnMiKSxpPXRoaXMudmlldy5jYWxlbmRhci5jb21wdXRlQnVzaW5lc3NIb3VyRXZlbnRzKHQsbyksdT0wLGM9aS5sZW5ndGg7dTxjO3UrKylzPWlbdV0scy5yZXNvdXJjZUlkPWYuaWQ7Zz10aGlzLmV2ZW50c1RvU2VncyhpKSxlLnB1c2guYXBwbHkoZSxnKX1yZXR1cm4gZX19cmV0dXJuIG51bGx9fSxUPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChyLGUpLHIubWl4aW4oSSksci5taXhpbihfKSxyLnByb3RvdHlwZS5nZXRIaXRTcGFuPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBlPXIuX19zdXBlcl9fLmdldEhpdFNwYW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucmVzb3VyY2VDbnQmJihlLnJlc291cmNlSWQ9dGhpcy5nZXRDb2xSZXNvdXJjZSh0LmNvbCkuaWQpLGV9LHIucHJvdG90eXBlLnNwYW5Ub1NlZ3M9ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGksbixsLHUsaCxhLGMscCxkLGY7aWYoYT10aGlzLnJlc291cmNlQ250LG89dGhpcy5kYXRlc0Fib3ZlUmVzb3VyY2VzP3RoaXMuc2xpY2VSYW5nZUJ5RGF5KGUpOnRoaXMuc2xpY2VSYW5nZUJ5Um93KGUpLGEpe2ZvcihkPVtdLGk9MCx1PW8ubGVuZ3RoO2k8dTtpKyspZm9yKGY9b1tpXSxjPW49MCxoPWE7bjxoO2M9bis9MSlwPXRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzW2NdLGUucmVzb3VyY2VJZCYmZS5yZXNvdXJjZUlkIT09cC5pZHx8KHI9dC5leHRlbmQoe30sZiksci5yZXNvdXJjZT1wLHRoaXMuaXNSVEw/KHIubGVmdENvbD10aGlzLmluZGljZXNUb0NvbChjLGYubGFzdFJvd0RheUluZGV4KSxyLnJpZ2h0Q29sPXRoaXMuaW5kaWNlc1RvQ29sKGMsZi5maXJzdFJvd0RheUluZGV4KSk6KHIubGVmdENvbD10aGlzLmluZGljZXNUb0NvbChjLGYuZmlyc3RSb3dEYXlJbmRleCksci5yaWdodENvbD10aGlzLmluZGljZXNUb0NvbChjLGYubGFzdFJvd0RheUluZGV4KSksZC5wdXNoKHIpKTtyZXR1cm4gZH1mb3Iocz0wLGw9by5sZW5ndGg7czxsO3MrKylmPW9bc10sdGhpcy5pc1JUTD8oZi5sZWZ0Q29sPWYubGFzdFJvd0RheUluZGV4LGYucmlnaHRDb2w9Zi5maXJzdFJvd0RheUluZGV4KTooZi5sZWZ0Q29sPWYuZmlyc3RSb3dEYXlJbmRleCxmLnJpZ2h0Q29sPWYubGFzdFJvd0RheUluZGV4KTtyZXR1cm4gb30sci5wcm90b3R5cGUucmVuZGVyQnVzaW5lc3NIb3Vycz1mdW5jdGlvbigpe3ZhciB0O3JldHVybiB0PXRoaXMuY29tcHV0ZVBlclJlc291cmNlQnVzaW5lc3NIb3VyU2VncyghMCksdD90aGlzLnJlbmRlckZpbGwoImJ1c2luZXNzSG91cnMiLHQsImJnZXZlbnQiKTpyLl9fc3VwZXJfXy5yZW5kZXJCdXNpbmVzc0hvdXJzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scn0oZC5EYXlHcmlkKSxGPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChyLGUpLHIubWl4aW4oSSksci5taXhpbihfKSxyLnByb3RvdHlwZS5nZXRIaXRTcGFuPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBlPXIuX19zdXBlcl9fLmdldEhpdFNwYW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucmVzb3VyY2VDbnQmJihlLnJlc291cmNlSWQ9dGhpcy5nZXRDb2xSZXNvdXJjZSh0LmNvbCkuaWQpLGV9LHIucHJvdG90eXBlLnNwYW5Ub1NlZ3M9ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGksbixsLHUsaCxhLGMscCxkLGY7aWYoYT10aGlzLnJlc291cmNlQ250LG89dGhpcy5zbGljZVJhbmdlQnlUaW1lcyhlKSxhKXtmb3IoZD1bXSxpPTAsdT1vLmxlbmd0aDtpPHU7aSsrKWZvcihmPW9baV0sYz1uPTAsaD1hO248aDtjPW4rPTEpcD10aGlzLmZsYXR0ZW5lZFJlc291cmNlc1tjXSxlLnJlc291cmNlSWQmJmUucmVzb3VyY2VJZCE9PXAuaWR8fChyPXQuZXh0ZW5kKHt9LGYpLHIucmVzb3VyY2U9cCxyLmNvbD10aGlzLmluZGljZXNUb0NvbChjLGYuZGF5SW5kZXgpLGQucHVzaChyKSk7cmV0dXJuIGR9Zm9yKHM9MCxsPW8ubGVuZ3RoO3M8bDtzKyspZj1vW3NdLGYuY29sPWYuZGF5SW5kZXg7cmV0dXJuIG99LHIucHJvdG90eXBlLnJlbmRlckJ1c2luZXNzSG91cnM9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdD10aGlzLmNvbXB1dGVQZXJSZXNvdXJjZUJ1c2luZXNzSG91clNlZ3MoITEpLHQ/dGhpcy5yZW5kZXJCdXNpbmVzc1NlZ3ModCk6ci5fX3N1cGVyX18ucmVuZGVyQnVzaW5lc3NIb3Vycy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHJ9KGQuVGltZUdyaWQpLGo9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBlLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIE90KGUsdCksZS5wcm90b3R5cGUudGltZUdyaWQ9bnVsbCxlLnByb3RvdHlwZS5pc1Njcm9sbGVkPSExLGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZD10aGlzLmluc3RhbnRpYXRlR3JpZCgpLHRoaXMuaW50ZXJ2YWxEdXJhdGlvbj10aGlzLnRpbWVHcmlkLmR1cmF0aW9ufSxlLnByb3RvdHlwZS5pbnN0YW50aWF0ZUdyaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE4odGhpcyl9LGUucHJvdG90eXBlLnNldFJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBlLl9fc3VwZXJfXy5zZXRSYW5nZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy50aW1lR3JpZC5zZXRSYW5nZSh0KX0sZS5wcm90b3R5cGUucmVuZGVyU2tlbGV0b249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbC5hZGRDbGFzcygiZmMtdGltZWxpbmUiKSx0aGlzLm9wdCgiZXZlbnRPdmVybGFwIik9PT0hMSYmdGhpcy5lbC5hZGRDbGFzcygiZmMtbm8tb3ZlcmxhcCIpLHRoaXMuZWwuaHRtbCh0aGlzLnJlbmRlclNrZWxldG9uSHRtbCgpKSx0aGlzLnJlbmRlclRpbWVHcmlkU2tlbGV0b24oKX0sZS5wcm90b3R5cGUucmVuZGVyU2tlbGV0b25IdG1sPWZ1bmN0aW9uKCl7cmV0dXJuJzx0YWJsZT4gPHRoZWFkIGNsYXNzPSJmYy1oZWFkIj4gPHRyPiA8dGQgY2xhc3M9ImZjLXRpbWUtYXJlYSAnK3RoaXMud2lkZ2V0SGVhZGVyQ2xhc3MrJyI+PC90ZD4gPC90cj4gPC90aGVhZD4gPHRib2R5IGNsYXNzPSJmYy1ib2R5Ij4gPHRyPiA8dGQgY2xhc3M9ImZjLXRpbWUtYXJlYSAnK3RoaXMud2lkZ2V0Q29udGVudENsYXNzKyciPjwvdGQ+IDwvdHI+IDwvdGJvZHk+IDwvdGFibGU+J30sZS5wcm90b3R5cGUucmVuZGVyVGltZUdyaWRTa2VsZXRvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnNldEVsZW1lbnQodGhpcy5lbC5maW5kKCJ0Ym9keSAuZmMtdGltZS1hcmVhIikpLHRoaXMudGltZUdyaWQuaGVhZEVsPXRoaXMuZWwuZmluZCgidGhlYWQgLmZjLXRpbWUtYXJlYSIpLHRoaXMudGltZUdyaWQucmVuZGVyU2tlbGV0b24oKSx0aGlzLmlzU2Nyb2xsZWQ9ITEsdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXIub24oInNjcm9sbCIsTXQodGhpcywiaGFuZGxlQm9keVNjcm9sbCIpKX0sZS5wcm90b3R5cGUuaGFuZGxlQm9keVNjcm9sbD1mdW5jdGlvbih0LGUpe2lmKHQpe2lmKCF0aGlzLmlzU2Nyb2xsZWQpcmV0dXJuIHRoaXMuaXNTY3JvbGxlZD0hMCx0aGlzLmVsLmFkZENsYXNzKCJmYy1zY3JvbGxlZCIpfWVsc2UgaWYodGhpcy5pc1Njcm9sbGVkKXJldHVybiB0aGlzLmlzU2Nyb2xsZWQ9ITEsdGhpcy5lbC5yZW1vdmVDbGFzcygiZmMtc2Nyb2xsZWQiKX0sZS5wcm90b3R5cGUudW5yZW5kZXJTa2VsZXRvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnJlbW92ZUVsZW1lbnQoKSx0aGlzLmhhbmRsZUJvZHlTY3JvbGwoMCksZS5fX3N1cGVyX18udW5yZW5kZXJTa2VsZXRvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLnJlbmRlckRhdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQucmVuZGVyRGF0ZXMoKX0sZS5wcm90b3R5cGUudW5yZW5kZXJEYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnVucmVuZGVyRGF0ZXMoKX0sZS5wcm90b3R5cGUucmVuZGVyQnVzaW5lc3NIb3Vycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlckJ1c2luZXNzSG91cnMoKX0sZS5wcm90b3R5cGUudW5yZW5kZXJCdXNpbmVzc0hvdXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQudW5yZW5kZXJCdXNpbmVzc0hvdXJzKCl9LGUucHJvdG90eXBlLmdldE5vd0luZGljYXRvclVuaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZC5nZXROb3dJbmRpY2F0b3JVbml0KCl9LGUucHJvdG90eXBlLnJlbmRlck5vd0luZGljYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aW1lR3JpZC5yZW5kZXJOb3dJbmRpY2F0b3IodCl9LGUucHJvdG90eXBlLnVucmVuZGVyTm93SW5kaWNhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQudW5yZW5kZXJOb3dJbmRpY2F0b3IoKX0sZS5wcm90b3R5cGUucHJlcGFyZUhpdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZC5wcmVwYXJlSGl0cygpfSxlLnByb3RvdHlwZS5yZWxlYXNlSGl0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnJlbGVhc2VIaXRzKCl9LGUucHJvdG90eXBlLnF1ZXJ5SGl0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudGltZUdyaWQucXVlcnlIaXQodCxlKX0sZS5wcm90b3R5cGUuZ2V0SGl0U3Bhbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aW1lR3JpZC5nZXRIaXRTcGFuKHQpfSxlLnByb3RvdHlwZS5nZXRIaXRFbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aW1lR3JpZC5nZXRIaXRFbCh0KX0sZS5wcm90b3R5cGUudXBkYXRlV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZC51cGRhdGVXaWR0aCgpfSxlLnByb3RvdHlwZS5zZXRIZWlnaHQ9ZnVuY3Rpb24odCxlKXt2YXIgcjtyZXR1cm4gcj1lPyJhdXRvIjp0LXRoaXMudGltZUdyaWQuaGVhZEhlaWdodCgpLXRoaXMucXVlcnlNaXNjSGVpZ2h0KCksdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXIuc2V0SGVpZ2h0KHIpfSxlLnByb3RvdHlwZS5xdWVyeU1pc2NIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbC5vdXRlckhlaWdodCgpLXRoaXMudGltZUdyaWQuaGVhZFNjcm9sbGVyLmVsLm91dGVySGVpZ2h0KCktdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKX0sZS5wcm90b3R5cGUuY29tcHV0ZUluaXRpYWxTY3JvbGw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGltZUdyaWQuY29tcHV0ZUluaXRpYWxTY3JvbGwodCl9LGUucHJvdG90eXBlLnF1ZXJ5U2Nyb2xsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQucXVlcnlTY3JvbGwoKX0sZS5wcm90b3R5cGUuc2V0U2Nyb2xsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRpbWVHcmlkLnNldFNjcm9sbCh0KX0sZS5wcm90b3R5cGUucmVuZGVyRXZlbnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlckV2ZW50cyh0KSx0aGlzLnVwZGF0ZVdpZHRoKCl9LGUucHJvdG90eXBlLnVucmVuZGVyRXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQudW5yZW5kZXJFdmVudHMoKSx0aGlzLnVwZGF0ZVdpZHRoKCl9LGUucHJvdG90eXBlLnJlbmRlckRyYWc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy50aW1lR3JpZC5yZW5kZXJEcmFnKHQsZSl9LGUucHJvdG90eXBlLnVucmVuZGVyRHJhZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnVucmVuZGVyRHJhZygpfSxlLnByb3RvdHlwZS5nZXRFdmVudFNlZ3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZC5nZXRFdmVudFNlZ3MoKX0sZS5wcm90b3R5cGUucmVuZGVyU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlclNlbGVjdGlvbih0KX0sZS5wcm90b3R5cGUudW5yZW5kZXJTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZC51bnJlbmRlclNlbGVjdGlvbigpfSxlfShYKSxydD1kLmNzc1RvU3RyLE49ZnVuY3Rpb24ocil7ZnVuY3Rpb24gbygpe3ZhciB0O28uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmluaXRTY2FsZVByb3BzKCksdGhpcy5taW5UaW1lPWUuZHVyYXRpb24odGhpcy5vcHQoIm1pblRpbWUiKXx8IjAwOjAwIiksdGhpcy5tYXhUaW1lPWUuZHVyYXRpb24odGhpcy5vcHQoIm1heFRpbWUiKXx8IjI0OjAwIiksdGhpcy50aW1lV2luZG93TXM9dGhpcy5tYXhUaW1lLXRoaXMubWluVGltZSx0aGlzLnNuYXBEdXJhdGlvbj0odD10aGlzLm9wdCgic25hcER1cmF0aW9uIikpP2UuZHVyYXRpb24odCk6dGhpcy5zbG90RHVyYXRpb24sdGhpcy5taW5SZXNpemVEdXJhdGlvbj10aGlzLnNuYXBEdXJhdGlvbix0aGlzLnNuYXBzUGVyU2xvdD1pdCh0aGlzLnNsb3REdXJhdGlvbix0aGlzLnNuYXBEdXJhdGlvbiksdGhpcy5zbG90V2lkdGg9dGhpcy5vcHQoInNsb3RXaWR0aCIpfXJldHVybiBPdChvLHIpLG8ucHJvdG90eXBlLnNsb3REYXRlcz1udWxsLG8ucHJvdG90eXBlLnNsb3RDbnQ9bnVsbCxvLnByb3RvdHlwZS5zbmFwQ250PW51bGwsby5wcm90b3R5cGUuc25hcHNQZXJTbG90PW51bGwsby5wcm90b3R5cGUuc25hcERpZmZUb0luZGV4PW51bGwsby5wcm90b3R5cGUuc25hcEluZGV4VG9EaWZmPW51bGwsby5wcm90b3R5cGUuaGVhZEVsPW51bGwsby5wcm90b3R5cGUuc2xhdENvbnRhaW5lckVsPW51bGwsby5wcm90b3R5cGUuc2xhdEVscz1udWxsLG8ucHJvdG90eXBlLmNvbnRhaW5lckNvb3JkQ2FjaGU9bnVsbCxvLnByb3RvdHlwZS5zbGF0Q29vcmRDYWNoZT1udWxsLG8ucHJvdG90eXBlLnNsYXRJbm5lckNvb3JkQ2FjaGU9bnVsbCxvLnByb3RvdHlwZS5oZWFkU2Nyb2xsZXI9bnVsbCxvLnByb3RvdHlwZS5ib2R5U2Nyb2xsZXI9bnVsbCxvLnByb3RvdHlwZS5qb2luZXI9bnVsbCxvLnByb3RvdHlwZS5mb2xsb3dlcj1udWxsLG8ucHJvdG90eXBlLmV2ZW50VGl0bGVGb2xsb3dlcj1udWxsLG8ucHJvdG90eXBlLm1pblRpbWU9bnVsbCxvLnByb3RvdHlwZS5tYXhUaW1lPW51bGwsby5wcm90b3R5cGUudGltZVdpbmRvd01zPW51bGwsby5wcm90b3R5cGUuc2xvdER1cmF0aW9uPW51bGwsby5wcm90b3R5cGUuc25hcER1cmF0aW9uPW51bGwsby5wcm90b3R5cGUuZHVyYXRpb249bnVsbCxvLnByb3RvdHlwZS5sYWJlbEludGVydmFsPW51bGwsby5wcm90b3R5cGUuaGVhZGVyRm9ybWF0cz1udWxsLG8ucHJvdG90eXBlLmlzVGltZVNjYWxlPW51bGwsby5wcm90b3R5cGUubGFyZ2VVbml0PW51bGwsby5wcm90b3R5cGUuZW1waGFzaXplV2Vla3M9ITEsby5wcm90b3R5cGUudGl0bGVGb2xsb3dlcj1udWxsLG8ucHJvdG90eXBlLnNlZ0NvbnRhaW5lckVsPW51bGwsby5wcm90b3R5cGUuc2VnQ29udGFpbmVySGVpZ2h0PW51bGwsby5wcm90b3R5cGUuYmdTZWdDb250YWluZXJFbD1udWxsLG8ucHJvdG90eXBlLmhlbHBlckVscz1udWxsLG8ucHJvdG90eXBlLmlubmVyRWw9bnVsbCxvLnByb3RvdHlwZS5vcHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudmlldy5vcHQodCl9LG8ucHJvdG90eXBlLmlzVmFsaWREYXRlPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiF0aGlzLnZpZXcuaXNIaWRkZW5EYXkodCkmJighdGhpcy5pc1RpbWVTY2FsZXx8KGU9dC50aW1lKCktdGhpcy5taW5UaW1lLGU9KGUlODY0ZTUrODY0ZTUpJTg2NGU1LGU8dGhpcy50aW1lV2luZG93TXMpKX0sby5wcm90b3R5cGUuY29tcHV0ZURpc3BsYXlFdmVudFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc1RpbWVTY2FsZX0sby5wcm90b3R5cGUuY29tcHV0ZURpc3BsYXlFdmVudEVuZD1mdW5jdGlvbigpe3JldHVybiExfSxvLnByb3RvdHlwZS5jb21wdXRlRXZlbnRUaW1lRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0KCJleHRyYVNtYWxsVGltZUZvcm1hdCIpfSxvLnByb3RvdHlwZS5ub3JtYWxpemVHcmlkRGF0ZT1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gdGhpcy5pc1RpbWVTY2FsZT8oZT10LmNsb25lKCksZS5oYXNUaW1lKCl8fGUudGltZSgwKSk6KGU9dC5jbG9uZSgpLnN0cmlwVGltZSgpLHRoaXMubGFyZ2VVbml0JiZlLnN0YXJ0T2YodGhpcy5sYXJnZVVuaXQpKSxlfSxvLnByb3RvdHlwZS5ub3JtYWxpemVHcmlkUmFuZ2U9ZnVuY3Rpb24odCl7dmFyIGUscjtyZXR1cm4gdGhpcy5pc1RpbWVTY2FsZT9yPXtzdGFydDp0aGlzLm5vcm1hbGl6ZUdyaWREYXRlKHQuc3RhcnQpLGVuZDp0aGlzLm5vcm1hbGl6ZUdyaWREYXRlKHQuZW5kKX06KHI9dGhpcy52aWV3LmNvbXB1dGVEYXlSYW5nZSh0KSx0aGlzLmxhcmdlVW5pdCYmKHIuc3RhcnQuc3RhcnRPZih0aGlzLmxhcmdlVW5pdCksZT1yLmVuZC5jbG9uZSgpLnN0YXJ0T2YodGhpcy5sYXJnZVVuaXQpLGUuaXNTYW1lKHIuZW5kKSYmZS5pc0FmdGVyKHIuc3RhcnQpfHxlLmFkZCh0aGlzLnNsb3REdXJhdGlvbiksci5lbmQ9ZSkpLHJ9LG8ucHJvdG90eXBlLnJhbmdlVXBkYXRlZD1mdW5jdGlvbigpe3ZhciB0LGU7Zm9yKHRoaXMuc3RhcnQ9dGhpcy5ub3JtYWxpemVHcmlkRGF0ZSh0aGlzLnN0YXJ0KSx0aGlzLmVuZD10aGlzLm5vcm1hbGl6ZUdyaWREYXRlKHRoaXMuZW5kKSx0aGlzLmlzVGltZVNjYWxlJiYodGhpcy5zdGFydC5hZGQodGhpcy5taW5UaW1lKSx0aGlzLmVuZC5zdWJ0cmFjdCgxLCJkYXkiKS5hZGQodGhpcy5tYXhUaW1lKSksZT1bXSx0PXRoaXMuc3RhcnQuY2xvbmUoKTt0PHRoaXMuZW5kOyl0aGlzLmlzVmFsaWREYXRlKHQpJiZlLnB1c2godC5jbG9uZSgpKSx0LmFkZCh0aGlzLnNsb3REdXJhdGlvbik7cmV0dXJuIHRoaXMuc2xvdERhdGVzPWUsdGhpcy51cGRhdGVHcmlkRGF0ZXMoKX0sby5wcm90b3R5cGUudXBkYXRlR3JpZERhdGVzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iobz0tMSxlPTAscj1bXSxzPVtdLHQ9dGhpcy5zdGFydC5jbG9uZSgpO3Q8dGhpcy5lbmQ7KXRoaXMuaXNWYWxpZERhdGUodCk/KG8rKyxyLnB1c2gobykscy5wdXNoKGUpKTpyLnB1c2gobysuNSksdC5hZGQodGhpcy5zbmFwRHVyYXRpb24pLGUrKztyZXR1cm4gdGhpcy5zbmFwRGlmZlRvSW5kZXg9cix0aGlzLnNuYXBJbmRleFRvRGlmZj1zLHRoaXMuc25hcENudD1vKzEsdGhpcy5zbG90Q250PXRoaXMuc25hcENudC90aGlzLnNuYXBzUGVyU2xvdH0sby5wcm90b3R5cGUuc3BhblRvU2Vncz1mdW5jdGlvbih0KXt2YXIgZSxyO3JldHVybiBlPXRoaXMubm9ybWFsaXplR3JpZFJhbmdlKHQpLHRoaXMuY29tcHV0ZURhdGVTbmFwQ292ZXJhZ2UodC5zdGFydCk8dGhpcy5jb21wdXRlRGF0ZVNuYXBDb3ZlcmFnZSh0LmVuZCkmJihyPXZ0KGUsdGhpcykpPyhyLmlzU3RhcnQmJiF0aGlzLmlzVmFsaWREYXRlKHIuc3RhcnQpJiYoci5pc1N0YXJ0PSExKSxyLmlzRW5kJiZyLmVuZCYmIXRoaXMuaXNWYWxpZERhdGUoci5lbmQuY2xvbmUoKS5zdWJ0cmFjdCgxKSkmJihyLmlzRW5kPSExKSxbcl0pOltdfSxvLnByb3RvdHlwZS5wcmVwYXJlSGl0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1aWxkQ29vcmRzKCl9LG8ucHJvdG90eXBlLnF1ZXJ5SGl0PWZ1bmN0aW9uKHQsZSl7dmFyIHIsbyxzLGksbixsLHUsaCxhLGMscCxkO2lmKGQ9dGhpcy5zbmFwc1BlclNsb3QsaT10aGlzLnNsYXRDb29yZENhY2hlLHI9dGhpcy5jb250YWluZXJDb29yZENhY2hlLHIuaXNUb3BJbkJvdW5kcyhlKSYmKG49aS5nZXRIb3Jpem9udGFsSW5kZXgodCksbnVsbCE9bikpcmV0dXJuIGg9aS5nZXRXaWR0aChuKSx0aGlzLmlzUlRMPyh1PWkuZ2V0UmlnaHRPZmZzZXQobikscz0odS10KS9oLG89TWF0aC5mbG9vcihzKmQpLGE9bipkK28scD11LW8vZCpoLGM9cC0obysxKS9kKmgpOihsPWkuZ2V0TGVmdE9mZnNldChuKSxzPSh0LWwpL2gsbz1NYXRoLmZsb29yKHMqZCksYT1uKmQrbyxjPWwrby9kKmgscD1sKyhvKzEpL2QqaCkse3NuYXA6YSxjb21wb25lbnQ6dGhpcyxsZWZ0OmMscmlnaHQ6cCx0b3A6ci5nZXRUb3BPZmZzZXQoMCksYm90dG9tOnIuZ2V0Qm90dG9tT2Zmc2V0KDApfX0sby5wcm90b3R5cGUuZ2V0SGl0U3Bhbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRTbmFwUmFuZ2UodC5zbmFwKX0sby5wcm90b3R5cGUuZ2V0SGl0RWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0U25hcEVsKHQuc25hcCl9LG8ucHJvdG90eXBlLmdldFNuYXBSYW5nZT1mdW5jdGlvbih0KXt2YXIgZSxyO3JldHVybiByPXRoaXMuc3RhcnQuY2xvbmUoKSxyLmFkZChDdCh0aGlzLnNuYXBEdXJhdGlvbix0aGlzLnNuYXBJbmRleFRvRGlmZlt0XSkpLGU9ci5jbG9uZSgpLmFkZCh0aGlzLnNuYXBEdXJhdGlvbikse3N0YXJ0OnIsZW5kOmV9fSxvLnByb3RvdHlwZS5nZXRTbmFwRWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2xhdEVscy5lcShNYXRoLmZsb29yKHQvdGhpcy5zbmFwc1BlclNsb3QpKX0sby5wcm90b3R5cGUucmVuZGVyU2tlbGV0b249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oZWFkU2Nyb2xsZXI9bmV3IG4oe292ZXJmbG93WDoiY2xpcHBlZC1zY3JvbGwiLG92ZXJmbG93WToiaGlkZGVuIn0pLHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcz1uZXcgTyx0aGlzLmhlYWRTY3JvbGxlci5yZW5kZXIoKSx0aGlzLmhlYWRFbC5hcHBlbmQodGhpcy5oZWFkU2Nyb2xsZXIuZWwpLHRoaXMuYm9keVNjcm9sbGVyPW5ldyBuLHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcz1uZXcgTyx0aGlzLmJvZHlTY3JvbGxlci5yZW5kZXIoKSx0aGlzLmVsLmFwcGVuZCh0aGlzLmJvZHlTY3JvbGxlci5lbCksdGhpcy5pbm5lckVsPXRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwsdGhpcy5zbGF0Q29udGFpbmVyRWw9dCgnPGRpdiBjbGFzcz0iZmMtc2xhdHMiLz4nKS5hcHBlbmRUbyh0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuYmdFbCksdGhpcy5zZWdDb250YWluZXJFbD10KCc8ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIiLz4nKS5hcHBlbmRUbyh0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuY29udGVudEVsKSx0aGlzLmJnU2VnQ29udGFpbmVyRWw9dGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmJnRWwsdGhpcy5jb250YWluZXJDb29yZENhY2hlPW5ldyBsKHtlbHM6dGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsLGlzSG9yaXpvbnRhbDohMCxpc1ZlcnRpY2FsOiEwfSksdGhpcy5qb2luZXI9bmV3IEEoImhvcml6b250YWwiLFt0aGlzLmhlYWRTY3JvbGxlcix0aGlzLmJvZHlTY3JvbGxlcl0pLHRoaXMuZm9sbG93ZXI9bmV3IFYodGhpcy5oZWFkU2Nyb2xsZXIsdGhpcy52aWV3LmNhbGVuZGFyLmlzVG91Y2gpLHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyPW5ldyBWKHRoaXMuYm9keVNjcm9sbGVyLHRoaXMudmlldy5jYWxlbmRhci5pc1RvdWNoKSx0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5taW5UcmF2ZWw9NTAsdGhpcy5pc1JUTD90aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5jb250YWluT25OYXR1cmFsUmlnaHQ9ITA6dGhpcy5ldmVudFRpdGxlRm9sbG93ZXIuY29udGFpbk9uTmF0dXJhbExlZnQ9ITAsby5fX3N1cGVyX18ucmVuZGVyU2tlbGV0b24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5oZWFkQ29sRWxzPW51bGwsby5wcm90b3R5cGUuc2xhdENvbEVscz1udWxsLG8ucHJvdG90eXBlLnJlbmRlckRhdGVzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3IodGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbC5odG1sKHRoaXMucmVuZGVySGVhZEh0bWwoKSksdGhpcy5oZWFkQ29sRWxzPXRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuZmluZCgiY29sIiksdGhpcy5zbGF0Q29udGFpbmVyRWwuaHRtbCh0aGlzLnJlbmRlclNsYXRIdG1sKCkpLHRoaXMuc2xhdENvbEVscz10aGlzLnNsYXRDb250YWluZXJFbC5maW5kKCJjb2wiKSx0aGlzLnNsYXRFbHM9dGhpcy5zbGF0Q29udGFpbmVyRWwuZmluZCgidGQiKSx0aGlzLnNsYXRDb29yZENhY2hlPW5ldyBsKHtlbHM6dGhpcy5zbGF0RWxzLGlzSG9yaXpvbnRhbDohMH0pLHRoaXMuc2xhdElubmVyQ29vcmRDYWNoZT1uZXcgbCh7ZWxzOnRoaXMuc2xhdEVscy5maW5kKCI+IGRpdiIpLGlzSG9yaXpvbnRhbDohMCxvZmZzZXRQYXJlbnQ6dGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsfSkscz10aGlzLnNsb3REYXRlcyxlPXI9MCxvPXMubGVuZ3RoO3I8bztlPSsrcil0PXNbZV0sdGhpcy52aWV3LnRyaWdnZXIoImRheVJlbmRlciIsbnVsbCx0LHRoaXMuc2xhdEVscy5lcShlKSk7aWYodGhpcy5mb2xsb3dlcilyZXR1cm4gdGhpcy5mb2xsb3dlci5zZXRTcHJpdGVzKHRoaXMuaGVhZEVsLmZpbmQoInRyOm5vdCg6bGFzdC1jaGlsZCkgc3BhbiIpKX0sby5wcm90b3R5cGUudW5yZW5kZXJEYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZvbGxvd2VyJiZ0aGlzLmZvbGxvd2VyLmNsZWFyU3ByaXRlcygpLHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuZW1wdHkoKSx0aGlzLnNsYXRDb250YWluZXJFbC5lbXB0eSgpLHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jbGVhcldpZHRoKCksdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmNsZWFyV2lkdGgoKX0sby5wcm90b3R5cGUucmVuZGVySGVhZEh0bWw9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzLGksbixsLHUsaCxhLGMscCxkLGYsZyx5LHYsdyxtLFMsUixiLEMsRSxILFQsXyxJLEQseCxCLEYsRyxNLFcsTDtmb3IoZz10aGlzLmxhYmVsSW50ZXJ2YWwsaT10aGlzLmhlYWRlckZvcm1hdHMsZT1mdW5jdGlvbigpe3ZhciB0LGUscjtmb3Iocj1bXSx0PTAsZT1pLmxlbmd0aDt0PGU7dCsrKXM9aVt0XSxyLnB1c2goW10pO3JldHVybiByfSgpLHk9bnVsbCxJPW51bGwsTT10aGlzLnNsb3REYXRlcyxHPVtdLHA9MCx2PU0ubGVuZ3RoO3A8djtwKyspe2ZvcihyPU1bcF0sTD1yLndlZWsoKSxjPXRoaXMuZW1waGFzaXplV2Vla3MmJm51bGwhPT1JJiZJIT09TCx4PWQ9MCx3PWkubGVuZ3RoO2Q8dzt4PSsrZClzPWlbeF0sQj1lW3hdLHk9QltCLmxlbmd0aC0xXSxhPWkubGVuZ3RoPjEmJng8aS5sZW5ndGgtMSxUPW51bGwsYT8oVz1yLmZvcm1hdChzKSxvPXIuZm9ybWF0KCkseSYmeS50ZXh0PT09Vz95LmNvbHNwYW4rPTE6VD17dGV4dDpXLGRhdGVEYXRhOm8sY29sc3BhbjoxfSk6IXl8fFN0KG50KHRoaXMuc3RhcnQscixnKSk/KFc9ci5mb3JtYXQocyksbz1yLmZvcm1hdCgpLFQ9e3RleHQ6VyxkYXRlRGF0YTpvLGNvbHNwYW46MX0pOnkuY29sc3Bhbis9MSxUJiYoVC53ZWVrU3RhcnQ9YyxCLnB1c2goVCkpO0cucHVzaCh7d2Vla1N0YXJ0OmN9KSxJPUx9Zm9yKHU9Zz50aGlzLnNsb3REdXJhdGlvbixuPSI8dGFibGU+IixuKz0iPGNvbGdyb3VwPiIsZj0wLG09TS5sZW5ndGg7ZjxtO2YrKylyPU1bZl0sbis9Ijxjb2wvPiI7Zm9yKG4rPSI8L2NvbGdyb3VwPiIsbis9Ijx0Ym9keT4iLGw9RT0wLFM9ZS5sZW5ndGg7RTxTO2w9KytFKXtmb3IoQj1lW2xdLGg9bD09PWUubGVuZ3RoLTEsbis9Ijx0ciIrKHUmJmg/JyBjbGFzcz0iZmMtY2hyb25vIic6IiIpKyI+IixIPTAsUj1CLmxlbmd0aDtIPFI7SCsrKXQ9QltIXSxuKz0nPHRoIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRIZWFkZXJDbGFzcysiICIrKHQud2Vla1N0YXJ0PyJmYy1lbS1jZWxsIjoiIikrJyIgZGF0YS1kYXRlPSInK3QuZGF0ZURhdGErJyInKyh0LmNvbHNwYW4+MT8nIGNvbHNwYW49IicrdC5jb2xzcGFuKyciJzoiIikrJz48ZGl2IGNsYXNzPSJmYy1jZWxsLWNvbnRlbnQiPjxzcGFuIGNsYXNzPSJmYy1jZWxsLXRleHQiPicreXQodC50ZXh0KSsiPC9zcGFuPjwvZGl2PjwvdGg+IjtuKz0iPC90cj4ifWZvcihuKz0iPC90Ym9keT48L3RhYmxlPiIsRj0iPHRhYmxlPiIsRis9Ijxjb2xncm91cD4iLF89MCxiPUcubGVuZ3RoO188YjtfKyspdD1HW19dLEYrPSI8Y29sLz4iO2ZvcihGKz0iPC9jb2xncm91cD4iLEYrPSI8dGJvZHk+PHRyPiIsbD1EPTAsQz1HLmxlbmd0aDtEPEM7bD0rK0QpdD1HW2xdLHI9TVtsXSxGKz10aGlzLnNsYXRDZWxsSHRtbChyLHQud2Vla1N0YXJ0KTtyZXR1cm4gRis9IjwvdHI+PC90Ym9keT48L3RhYmxlPiIsdGhpcy5fc2xhdEh0bWw9RixufSxvLnByb3RvdHlwZS5yZW5kZXJTbGF0SHRtbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zbGF0SHRtbH0sby5wcm90b3R5cGUuc2xhdENlbGxIdG1sPWZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIHRoaXMuaXNUaW1lU2NhbGU/KHI9W10sci5wdXNoKFN0KG50KHRoaXMuc3RhcnQsdCx0aGlzLmxhYmVsSW50ZXJ2YWwpKT8iZmMtbWFqb3IiOiJmYy1taW5vciIpKToocj10aGlzLmdldERheUNsYXNzZXModCksci5wdXNoKCJmYy1kYXkiKSksci51bnNoaWZ0KHRoaXMudmlldy53aWRnZXRDb250ZW50Q2xhc3MpLGUmJnIucHVzaCgiZmMtZW0tY2VsbCIpLCc8dGQgY2xhc3M9Iicrci5qb2luKCIgIikrJyIgZGF0YS1kYXRlPSInK3QuZm9ybWF0KCkrJyI+PGRpdiAvPjwvdGQ+J30sby5wcm90b3R5cGUuYnVzaW5lc3NIb3VyU2Vncz1udWxsLG8ucHJvdG90eXBlLnJlbmRlckJ1c2luZXNzSG91cnM9ZnVuY3Rpb24oKXt2YXIgdDtpZighdGhpcy5sYXJnZVVuaXQpcmV0dXJuIHQ9dGhpcy5idXNpbmVzc0hvdXJTZWdzPXRoaXMuYnVpbGRCdXNpbmVzc0hvdXJTZWdzKCF0aGlzLmlzVGltZVNjYWxlKSx0aGlzLnJlbmRlckZpbGwoImJ1c2luZXNzSG91cnMiLHQsImJnZXZlbnQiKX0sby5wcm90b3R5cGUudW5yZW5kZXJCdXNpbmVzc0hvdXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5yZW5kZXJGaWxsKCJidXNpbmVzc0hvdXJzIil9LG8ucHJvdG90eXBlLm5vd0luZGljYXRvckVscz1udWxsLG8ucHJvdG90eXBlLmdldE5vd0luZGljYXRvclVuaXQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzVGltZVNjYWxlKXJldHVybiBKKHRoaXMuc2xvdER1cmF0aW9uKX0sby5wcm90b3R5cGUucmVuZGVyTm93SW5kaWNhdG9yPWZ1bmN0aW9uKGUpe3ZhciByLG8scztyZXR1cm4gcz1bXSxlPXRoaXMubm9ybWFsaXplR3JpZERhdGUoZSksZT49dGhpcy5zdGFydCYmZTx0aGlzLmVuZCYmKHI9dGhpcy5kYXRlVG9Db29yZChlKSxvPXRoaXMuaXNSVEw/e3JpZ2h0Oi1yfTp7bGVmdDpyfSxzLnB1c2godCgiPGRpdiBjbGFzcz0nZmMtbm93LWluZGljYXRvciBmYy1ub3ctaW5kaWNhdG9yLWFycm93Jz48L2Rpdj4iKS5jc3MobykuYXBwZW5kVG8odGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLmVsKVswXSkscy5wdXNoKHQoIjxkaXYgY2xhc3M9J2ZjLW5vdy1pbmRpY2F0b3IgZmMtbm93LWluZGljYXRvci1saW5lJz48L2Rpdj4iKS5jc3MobykuYXBwZW5kVG8odGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsKVswXSkpLHRoaXMubm93SW5kaWNhdG9yRWxzPXQocyl9LG8ucHJvdG90eXBlLnVucmVuZGVyTm93SW5kaWNhdG9yPWZ1bmN0aW9uKCl7aWYodGhpcy5ub3dJbmRpY2F0b3JFbHMpcmV0dXJuIHRoaXMubm93SW5kaWNhdG9yRWxzLnJlbW92ZSgpLHRoaXMubm93SW5kaWNhdG9yRWxzPW51bGx9LG8ucHJvdG90eXBlLmV4cGxpY2l0U2xvdFdpZHRoPW51bGwsby5wcm90b3R5cGUuZGVmYXVsdFNsb3RXaWR0aD1udWxsLG8ucHJvdG90eXBlLnVwZGF0ZVdpZHRoPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztpZihzPU1hdGgucm91bmQodGhpcy5zbG90V2lkdGh8fCh0aGlzLnNsb3RXaWR0aD10aGlzLmNvbXB1dGVTbG90V2lkdGgoKSkpLHI9cyp0aGlzLnNsb3REYXRlcy5sZW5ndGgsZT0iIixvPXMsdD10aGlzLmJvZHlTY3JvbGxlci5nZXRDbGllbnRXaWR0aCgpLHQ+ciYmKGU9dCxyPSIiLG89TWF0aC5mbG9vcih0L3RoaXMuc2xvdERhdGVzLmxlbmd0aCkpLHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5zZXRXaWR0aChyKSx0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuc2V0TWluV2lkdGgoZSksdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLnNldFdpZHRoKHIpLHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5zZXRNaW5XaWR0aChlKSx0aGlzLmhlYWRDb2xFbHMuc2xpY2UoMCwtMSkuYWRkKHRoaXMuc2xhdENvbEVscy5zbGljZSgwLC0xKSkud2lkdGgobyksdGhpcy5oZWFkU2Nyb2xsZXIudXBkYXRlU2l6ZSgpLHRoaXMuYm9keVNjcm9sbGVyLnVwZGF0ZVNpemUoKSx0aGlzLmpvaW5lci51cGRhdGUoKSx0aGlzLmJ1aWxkQ29vcmRzKCksdGhpcy51cGRhdGVTZWdQb3NpdGlvbnMoKSx0aGlzLnZpZXcudXBkYXRlTm93SW5kaWNhdG9yKCksdGhpcy5mb2xsb3dlciYmdGhpcy5mb2xsb3dlci51cGRhdGUoKSx0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcilyZXR1cm4gdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIudXBkYXRlKCl9LG8ucHJvdG90eXBlLmNvbXB1dGVTbG90V2lkdGg9ZnVuY3Rpb24oKXt2YXIgZSxyLG8scyxpLG47cmV0dXJuIG89MCxyPXRoaXMuaGVhZEVsLmZpbmQoInRyOmxhc3QtY2hpbGQgdGggc3BhbiIpLHIuZWFjaChmdW5jdGlvbihlLHIpe3ZhciBzO3JldHVybiBzPXQocikub3V0ZXJXaWR0aCgpLG89TWF0aC5tYXgobyxzKX0pLGU9bysxLG49aXQodGhpcy5sYWJlbEludGVydmFsLHRoaXMuc2xvdER1cmF0aW9uKSxpPU1hdGguY2VpbChlL24pLHM9dGhpcy5oZWFkQ29sRWxzLmVxKDApLmNzcygibWluLXdpZHRoIikscyYmKHM9cGFyc2VJbnQocywxMCkscyYmKGk9TWF0aC5tYXgoaSxzKSkpLGl9LG8ucHJvdG90eXBlLmJ1aWxkQ29vcmRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFpbmVyQ29vcmRDYWNoZS5idWlsZCgpLHRoaXMuc2xhdENvb3JkQ2FjaGUuYnVpbGQoKSx0aGlzLnNsYXRJbm5lckNvb3JkQ2FjaGUuYnVpbGQoKX0sby5wcm90b3R5cGUuY29tcHV0ZURhdGVTbmFwQ292ZXJhZ2U9ZnVuY3Rpb24odCl7dmFyIGUscixvO3JldHVybiByPW50KHRoaXMuc3RhcnQsdCx0aGlzLnNuYXBEdXJhdGlvbikscjwwPzA6cj49dGhpcy5zbmFwRGlmZlRvSW5kZXgubGVuZ3RoP3RoaXMuc25hcENudDoobz1NYXRoLmZsb29yKHIpLGU9dGhpcy5zbmFwRGlmZlRvSW5kZXhbb10sU3QoZSk/ZSs9ci1vOmU9TWF0aC5jZWlsKGUpLGUpfSxvLnByb3RvdHlwZS5kYXRlVG9Db29yZD1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpO3JldHVybiBpPXRoaXMuY29tcHV0ZURhdGVTbmFwQ292ZXJhZ2UodCksbz1pL3RoaXMuc25hcHNQZXJTbG90LHM9TWF0aC5mbG9vcihvKSxzPU1hdGgubWluKHMsdGhpcy5zbG90Q250LTEpLHI9by1zLGU9dGhpcy5zbGF0SW5uZXJDb29yZENhY2hlLHRoaXMuaXNSVEw/ZS5nZXRSaWdodFBvc2l0aW9uKHMpLWUuZ2V0V2lkdGgocykqci10aGlzLmNvbnRhaW5lckNvb3JkQ2FjaGUuZ2V0V2lkdGgoMCk6ZS5nZXRMZWZ0UG9zaXRpb24ocykrZS5nZXRXaWR0aChzKSpyfSxvLnByb3RvdHlwZS5yYW5nZVRvQ29vcmRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzUlRMP3tyaWdodDp0aGlzLmRhdGVUb0Nvb3JkKHQuc3RhcnQpLGxlZnQ6dGhpcy5kYXRlVG9Db29yZCh0LmVuZCl9OntsZWZ0OnRoaXMuZGF0ZVRvQ29vcmQodC5zdGFydCkscmlnaHQ6dGhpcy5kYXRlVG9Db29yZCh0LmVuZCl9fSxvLnByb3RvdHlwZS5oZWFkSGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHQ9dGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbC5maW5kKCJ0YWJsZSIpLHQuaGVpZ2h0LmFwcGx5KHQsYXJndW1lbnRzKX0sby5wcm90b3R5cGUudXBkYXRlU2VnUG9zaXRpb25zPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iocz0odGhpcy5zZWdzfHxbXSkuY29uY2F0KHRoaXMuYnVzaW5lc3NIb3VyU2Vnc3x8W10pLGU9MCxyPXMubGVuZ3RoO2U8cjtlKyspbz1zW2VdLHQ9dGhpcy5yYW5nZVRvQ29vcmRzKG8pLG8uZWwuY3NzKHtsZWZ0Om8ubGVmdD10LmxlZnQscmlnaHQ6LShvLnJpZ2h0PXQucmlnaHQpfSl9LG8ucHJvdG90eXBlLmNvbXB1dGVJbml0aWFsU2Nyb2xsPWZ1bmN0aW9uKHQpe3ZhciByLG87cmV0dXJuIHI9MCx0aGlzLmlzVGltZVNjYWxlJiYobz10aGlzLm9wdCgic2Nyb2xsVGltZSIpLG8mJihvPWUuZHVyYXRpb24obykscj10aGlzLmRhdGVUb0Nvb3JkKHRoaXMuc3RhcnQuY2xvbmUoKS50aW1lKG8pKSkpLHtsZWZ0OnIsdG9wOjB9fSxvLnByb3RvdHlwZS5xdWVyeVNjcm9sbD1mdW5jdGlvbigpe3JldHVybntsZWZ0OnRoaXMuYm9keVNjcm9sbGVyLmdldFNjcm9sbExlZnQoKSx0b3A6dGhpcy5ib2R5U2Nyb2xsZXIuZ2V0U2Nyb2xsVG9wKCl9fSxvLnByb3RvdHlwZS5zZXRTY3JvbGw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaGVhZFNjcm9sbGVyLnNldFNjcm9sbExlZnQodC5sZWZ0KSx0aGlzLmhlYWRTY3JvbGxlci5zZXRTY3JvbGxMZWZ0KHQubGVmdCksdGhpcy5ib2R5U2Nyb2xsZXIuc2V0U2Nyb2xsVG9wKHQudG9wKX0sby5wcm90b3R5cGUucmVuZGVyRmdTZWdzPWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMucmVuZGVyRmdTZWdFbHModCksdGhpcy5yZW5kZXJGZ1NlZ3NJbkNvbnRhaW5lcnMoW1t0aGlzLHRdXSksdGhpcy51cGRhdGVTZWdGb2xsb3dlcnModCksdH0sby5wcm90b3R5cGUudW5yZW5kZXJGZ1NlZ3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGVhclNlZ0ZvbGxvd2VycygpLHRoaXMudW5yZW5kZXJGZ0NvbnRhaW5lcnMoW3RoaXNdKX0sby5wcm90b3R5cGUucmVuZGVyRmdTZWdzSW5Db250YWluZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzLGksbixsLHUsaCxhLGMscCxkLGYsZyx5LHYsdyxtLFMsUixiLEMsRSxIO2ZvcihvPTAsbj10Lmxlbmd0aDtvPG47bysrKWZvcihtPXRbb10sZT1tWzBdLEg9bVsxXSxzPTAsbD1ILmxlbmd0aDtzPGw7cysrKUU9SFtzXSxyPXRoaXMucmFuZ2VUb0Nvb3JkcyhFKSxFLmVsLmNzcyh7bGVmdDpFLmxlZnQ9ci5sZWZ0LHJpZ2h0Oi0oRS5yaWdodD1yLnJpZ2h0KX0pO2ZvcihpPTAsdT10Lmxlbmd0aDtpPHU7aSsrKWZvcihTPXRbaV0sZT1TWzBdLEg9U1sxXSxmPTAsaD1ILmxlbmd0aDtmPGg7ZisrKUU9SFtmXSxFLmVsLmFwcGVuZFRvKGUuc2VnQ29udGFpbmVyRWwpO2ZvcihnPTAsYT10Lmxlbmd0aDtnPGE7ZysrKXtmb3IoUj10W2ddLGU9UlswXSxIPVJbMV0seT0wLGM9SC5sZW5ndGg7eTxjO3krKylFPUhbeV0sRS5oZWlnaHQ9RS5lbC5vdXRlckhlaWdodCghMCk7dGhpcy5idWlsZFNlZ0xldmVscyhIKSxlLnNlZ0NvbnRhaW5lckhlaWdodD10dChIKX1mb3IoQz1bXSx2PTAscD10Lmxlbmd0aDt2PHA7disrKXtmb3IoYj10W3ZdLGU9YlswXSxIPWJbMV0sdz0wLGQ9SC5sZW5ndGg7dzxkO3crKylFPUhbd10sRS5lbC5jc3MoInRvcCIsRS50b3ApO0MucHVzaChlLnNlZ0NvbnRhaW5lckVsLmhlaWdodChlLnNlZ0NvbnRhaW5lckhlaWdodCkpfXJldHVybiBDfSxvLnByb3RvdHlwZS5idWlsZFNlZ0xldmVscz1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpLG4sbCx1LGgsYSxjLHAsZCxmO2ZvcihkPVtdLHRoaXMuc29ydEV2ZW50U2Vncyh0KSxvPTAsbj10Lmxlbmd0aDtvPG47bysrKXtmb3IoZj10W29dLGYuYWJvdmU9W10saD0wO2g8ZC5sZW5ndGg7KXtmb3Iocj0hMSxjPWRbaF0scz0wLGw9Yy5sZW5ndGg7czxsO3MrKylhPWNbc10sUHQoZixhKSYmKGYuYWJvdmUucHVzaChhKSxyPSEwKTtpZighcilicmVhaztoKz0xfWZvcigoZFtoXXx8KGRbaF09W10pKS5wdXNoKGYpLGgrPTE7aDxkLmxlbmd0aDspe2ZvcihwPWRbaF0saT0wLHU9cC5sZW5ndGg7aTx1O2krKyllPXBbaV0sUHQoZixlKSYmZS5hYm92ZS5wdXNoKGYpO2grPTF9fXJldHVybiBkfSxvLnByb3RvdHlwZS51bnJlbmRlckZnQ29udGFpbmVycz1mdW5jdGlvbih0KXt2YXIgZSxyLG8scztmb3Iocz1bXSxyPTAsbz10Lmxlbmd0aDtyPG87cisrKWU9dFtyXSxlLnNlZ0NvbnRhaW5lckVsLmVtcHR5KCksZS5zZWdDb250YWluZXJFbC5oZWlnaHQoIiIpLHMucHVzaChlLnNlZ0NvbnRhaW5lckhlaWdodD1udWxsKTtyZXR1cm4gc30sby5wcm90b3R5cGUuZmdTZWdIdG1sPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbyxzLGksbixsO3JldHVybiBvPXQuZXZlbnQscz10aGlzLnZpZXcuaXNFdmVudERyYWdnYWJsZShvKSxuPXQuaXNTdGFydCYmdGhpcy52aWV3LmlzRXZlbnRSZXNpemFibGVGcm9tU3RhcnQobyksaT10LmlzRW5kJiZ0aGlzLnZpZXcuaXNFdmVudFJlc2l6YWJsZUZyb21FbmQobykscj10aGlzLmdldFNlZ0NsYXNzZXModCxzLG58fGkpLHIudW5zaGlmdCgiZmMtdGltZWxpbmUtZXZlbnQiLCJmYy1oLWV2ZW50IiksbD10aGlzLmdldEV2ZW50VGltZVRleHQobyksJzxhIGNsYXNzPSInK3Iuam9pbigiICIpKyciIHN0eWxlPSInK3J0KHRoaXMuZ2V0U2VnU2tpbkNzcyh0KSkrJyInKyhvLnVybD8nIGhyZWY9IicreXQoby51cmwpKyciJzoiIikrJz48ZGl2IGNsYXNzPSJmYy1jb250ZW50Ij4nKyhsPyc8c3BhbiBjbGFzcz0iZmMtdGltZSI+Jyt5dChsKSsiPC9zcGFuPiI6IiIpKyc8c3BhbiBjbGFzcz0iZmMtdGl0bGUiPicrKG8udGl0bGU/eXQoby50aXRsZSk6IiZuYnNwOyIpKyc8L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0iZmMtYmciIC8+Jysobj8nPGRpdiBjbGFzcz0iZmMtcmVzaXplciBmYy1zdGFydC1yZXNpemVyIj48L2Rpdj4nOiIiKSsoaT8nPGRpdiBjbGFzcz0iZmMtcmVzaXplciBmYy1lbmQtcmVzaXplciI+PC9kaXY+JzoiIikrIjwvYT4ifSxvLnByb3RvdHlwZS51cGRhdGVTZWdGb2xsb3dlcnM9ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaTtpZih0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcil7Zm9yKHM9W10sZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKylvPXRbZV0saT1vLmVsLmZpbmQoIi5mYy10aXRsZSIpLGkubGVuZ3RoJiZzLnB1c2gobmV3IFAoaSkpO3JldHVybiB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5zZXRTcHJpdGVzKHMpfX0sby5wcm90b3R5cGUuY2xlYXJTZWdGb2xsb3dlcnM9ZnVuY3Rpb24oKXtpZih0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcilyZXR1cm4gdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIuY2xlYXJTcHJpdGVzKCl9LG8ucHJvdG90eXBlLnNlZ0RyYWdTdGFydD1mdW5jdGlvbigpe2lmKG8uX19zdXBlcl9fLnNlZ0RyYWdTdGFydC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIpcmV0dXJuIHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyLmZvcmNlUmVsYXRpdmUoKX0sby5wcm90b3R5cGUuc2VnRHJhZ0VuZD1mdW5jdGlvbigpe2lmKG8uX19zdXBlcl9fLnNlZ0RyYWdFbmQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyKXJldHVybiB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5jbGVhckZvcmNlKCl9LG8ucHJvdG90eXBlLnNlZ1Jlc2l6ZVN0YXJ0PWZ1bmN0aW9uKCl7aWYoby5fX3N1cGVyX18uc2VnUmVzaXplU3RhcnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyKXJldHVybiB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5mb3JjZVJlbGF0aXZlKCl9LG8ucHJvdG90eXBlLnNlZ1Jlc2l6ZUVuZD1mdW5jdGlvbigpe2lmKG8uX19zdXBlcl9fLnNlZ1Jlc2l6ZUVuZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIpcmV0dXJuIHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyLmNsZWFyRm9yY2UoKX0sby5wcm90b3R5cGUucmVuZGVySGVscGVyPWZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIHI9dGhpcy5ldmVudFRvU2Vncyh0KSxyPXRoaXMucmVuZGVyRmdTZWdFbHMociksdGhpcy5yZW5kZXJIZWxwZXJTZWdzSW5Db250YWluZXJzKFtbdGhpcyxyXV0sZSl9LG8ucHJvdG90eXBlLnJlbmRlckhlbHBlclNlZ3NJbkNvbnRhaW5lcnM9ZnVuY3Rpb24oZSxyKXt2YXIgbyxzLGksbixsLHUsaCxhLGMscCxkLGYsZyx5LHYsdyxtLFM7Zm9yKG49W10sbT1bXSxsPTAsYT1lLmxlbmd0aDtsPGE7bCsrKWZvcihnPWVbbF0sbz1nWzBdLFM9Z1sxXSx1PTAsYz1TLmxlbmd0aDt1PGM7dSsrKXc9U1t1XSxzPXRoaXMucmFuZ2VUb0Nvb3Jkcyh3KSx3LmVsLmNzcyh7bGVmdDp3LmxlZnQ9cy5sZWZ0LHJpZ2h0Oi0ody5yaWdodD1zLnJpZ2h0KX0pLHImJnIucmVzb3VyY2VJZD09PShudWxsIT0oeT1vLnJlc291cmNlKT95LmlkOnZvaWQgMCk/dy5lbC5jc3MoInRvcCIsci5lbC5jc3MoInRvcCIpKTp3LmVsLmNzcygidG9wIiwwKTtmb3IoaD0wLHA9ZS5sZW5ndGg7aDxwO2grKylmb3Iodj1lW2hdLG89dlswXSxTPXZbMV0saT10KCc8ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIgZmMtaGVscGVyLWNvbnRhaW5lciIvPicpLmFwcGVuZFRvKG8uaW5uZXJFbCksbi5wdXNoKGlbMF0pLGY9MCxkPVMubGVuZ3RoO2Y8ZDtmKyspdz1TW2ZdLGkuYXBwZW5kKHcuZWwpLG0ucHVzaCh3LmVsWzBdKTtyZXR1cm4gdGhpcy5oZWxwZXJFbHM/dGhpcy5oZWxwZXJFbHM9dGhpcy5oZWxwZXJFbHMuYWRkKHQobikpOnRoaXMuaGVscGVyRWxzPXQobiksdChtKX0sby5wcm90b3R5cGUudW5yZW5kZXJIZWxwZXI9ZnVuY3Rpb24oKXtpZih0aGlzLmhlbHBlckVscylyZXR1cm4gdGhpcy5oZWxwZXJFbHMucmVtb3ZlKCksdGhpcy5oZWxwZXJFbHM9bnVsbH0sby5wcm90b3R5cGUucmVuZGVyRXZlbnRSZXNpemU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWdobGlnaHQodGhpcy5ldmVudFRvU3Bhbih0KSksdGhpcy5yZW5kZXJFdmVudExvY2F0aW9uSGVscGVyKHQsZSl9LG8ucHJvdG90eXBlLnVucmVuZGVyRXZlbnRSZXNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnJlbmRlckhpZ2hsaWdodCgpLHRoaXMudW5yZW5kZXJIZWxwZXIoKX0sby5wcm90b3R5cGUucmVuZGVyRmlsbD1mdW5jdGlvbih0LGUscil7cmV0dXJuIGU9dGhpcy5yZW5kZXJGaWxsU2VnRWxzKHQsZSksdGhpcy5yZW5kZXJGaWxsSW5Db250YWluZXJzKHQsW1t0aGlzLGVdXSxyKSxlfSxvLnByb3RvdHlwZS5yZW5kZXJGaWxsSW5Db250YWluZXJzPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxzLGksbixsLHU7Zm9yKGw9W10scz0wLGk9ZS5sZW5ndGg7czxpO3MrKyluPWVbc10sbz1uWzBdLHU9blsxXSxsLnB1c2godGhpcy5yZW5kZXJGaWxsSW5Db250YWluZXIodCxvLHUscikpO3JldHVybiBsfSxvLnByb3RvdHlwZS5yZW5kZXJGaWxsSW5Db250YWluZXI9ZnVuY3Rpb24oZSxyLG8scyl7dmFyIGksbixsLHUsaDtpZihvLmxlbmd0aCl7Zm9yKHN8fChzPWUudG9Mb3dlckNhc2UoKSksaT10KCc8ZGl2IGNsYXNzPSJmYy0nK3MrJy1jb250YWluZXIiIC8+JykuYXBwZW5kVG8oci5iZ1NlZ0NvbnRhaW5lckVsKSxsPTAsdT1vLmxlbmd0aDtsPHU7bCsrKWg9b1tsXSxuPXRoaXMucmFuZ2VUb0Nvb3JkcyhoKSxoLmVsLmNzcyh7bGVmdDpoLmxlZnQ9bi5sZWZ0LHJpZ2h0Oi0oaC5yaWdodD1uLnJpZ2h0KX0pLGguZWwuYXBwZW5kVG8oaSk7cmV0dXJuIHRoaXMuZWxzQnlGaWxsW2VdP3RoaXMuZWxzQnlGaWxsW2VdPXRoaXMuZWxzQnlGaWxsW2VdLmFkZChpKTp0aGlzLmVsc0J5RmlsbFtlXT1pfX0sby5wcm90b3R5cGUucmVuZGVyRHJhZz1mdW5jdGlvbih0LGUpe3JldHVybiBlP3RoaXMucmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcih0LGUpOih0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKHQpKSxudWxsKX0sby5wcm90b3R5cGUudW5yZW5kZXJEcmFnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5yZW5kZXJIZWxwZXIoKSx0aGlzLnVucmVuZGVySGlnaGxpZ2h0KCl9LG99KGYpLHR0PWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzO2ZvcihvPTAsZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKylzPXRbZV0sbz1NYXRoLm1heChvLFoocykpO3JldHVybiBvfSxaPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10LnRvcCYmKHQudG9wPXR0KHQuYWJvdmUpKSx0LnRvcCt0LmhlaWdodH0sUHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5sZWZ0PGUucmlnaHQmJnQucmlnaHQ+ZS5sZWZ0fSxSPTE4LG09Nix3PTIwMCxTPTFlMyx1PXttb250aHM6MX0saz1be3llYXJzOjF9LHttb250aHM6MX0se2RheXM6MX0se2hvdXJzOjF9LHttaW51dGVzOjMwfSx7bWludXRlczoxNX0se21pbnV0ZXM6MTB9LHttaW51dGVzOjV9LHttaW51dGVzOjF9LHtzZWNvbmRzOjMwfSx7c2Vjb25kczoxNX0se3NlY29uZHM6MTB9LHtzZWNvbmRzOjV9LHtzZWNvbmRzOjF9LHttaWxsaXNlY29uZHM6NTAwfSx7bWlsbGlzZWNvbmRzOjEwMH0se21pbGxpc2Vjb25kczoxMH0se21pbGxpc2Vjb25kczoxfV0sTi5wcm90b3R5cGUuaW5pdFNjYWxlUHJvcHM9ZnVuY3Rpb24oKXt2YXIgZSxyLG87cmV0dXJuIHRoaXMubGFiZWxJbnRlcnZhbD10aGlzLnF1ZXJ5RHVyYXRpb25PcHRpb24oInNsb3RMYWJlbEludGVydmFsIiksdGhpcy5zbG90RHVyYXRpb249dGhpcy5xdWVyeUR1cmF0aW9uT3B0aW9uKCJzbG90RHVyYXRpb24iKSx0aGlzLmVuc3VyZUdyaWREdXJhdGlvbigpLHRoaXMudmFsaWRhdGVMYWJlbEFuZFNsb3QoKSx0aGlzLmVuc3VyZUxhYmVsSW50ZXJ2YWwoKSx0aGlzLmVuc3VyZVNsb3REdXJhdGlvbigpLGU9dGhpcy5vcHQoInNsb3RMYWJlbEZvcm1hdCIpLG89dC50eXBlKGUpLHRoaXMuaGVhZGVyRm9ybWF0cz0iYXJyYXkiPT09bz9lOiJzdHJpbmciPT09bz9bZV06dGhpcy5jb21wdXRlSGVhZGVyRm9ybWF0cygpLHRoaXMuaXNUaW1lU2NhbGU9bHQodGhpcy5zbG90RHVyYXRpb24pLHRoaXMubGFyZ2VVbml0PXRoaXMuaXNUaW1lU2NhbGU/dm9pZCAwOihyPUoodGhpcy5zbG90RHVyYXRpb24pLC95ZWFyfG1vbnRofHdlZWsvLnRlc3Qocik/cjp2b2lkIDApLHRoaXMuZW1waGFzaXplV2Vla3M9MT09PXRoaXMuc2xvdER1cmF0aW9uLmFzKCJkYXlzIikmJnRoaXMuZHVyYXRpb24uYXMoIndlZWtzIik+PTImJiF0aGlzLm9wdCgiYnVzaW5lc3NIb3VycyIpfSxOLnByb3RvdHlwZS5xdWVyeUR1cmF0aW9uT3B0aW9uPWZ1bmN0aW9uKHQpe3ZhciByLG87aWYobz10aGlzLm9wdCh0KSxudWxsIT1vJiYocj1lLmR1cmF0aW9uKG8pLCtyKSlyZXR1cm4gcn0sTi5wcm90b3R5cGUudmFsaWRhdGVMYWJlbEFuZFNsb3Q9ZnVuY3Rpb24oKXt2YXIgdCxlLHI7aWYodGhpcy5sYWJlbEludGVydmFsJiYodD1pdCh0aGlzLmR1cmF0aW9uLHRoaXMubGFiZWxJbnRlcnZhbCksdD5TJiYoZC53YXJuKCJzbG90TGFiZWxJbnRlcnZhbCByZXN1bHRzIGluIHRvbyBtYW55IGNlbGxzIiksdGhpcy5sYWJlbEludGVydmFsPW51bGwpKSx0aGlzLnNsb3REdXJhdGlvbiYmKGU9aXQodGhpcy5kdXJhdGlvbix0aGlzLnNsb3REdXJhdGlvbiksZT5TJiYoZC53YXJuKCJzbG90RHVyYXRpb24gcmVzdWx0cyBpbiB0b28gbWFueSBjZWxscyIpLHRoaXMuc2xvdER1cmF0aW9uPW51bGwpKSx0aGlzLmxhYmVsSW50ZXJ2YWwmJnRoaXMuc2xvdER1cmF0aW9uJiYocj1pdCh0aGlzLmxhYmVsSW50ZXJ2YWwsdGhpcy5zbG90RHVyYXRpb24pLCFTdChyKXx8cjwxKSlyZXR1cm4gZC53YXJuKCJzbG90TGFiZWxJbnRlcnZhbCBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygc2xvdER1cmF0aW9uIiksdGhpcy5zbG90RHVyYXRpb249bnVsbH0sTi5wcm90b3R5cGUuZW5zdXJlR3JpZER1cmF0aW9uPWZ1bmN0aW9uKCl7dmFyIHQscixvLHMsaTtpZih0PXRoaXMuZHVyYXRpb24sIXQpe2lmKHQ9dGhpcy52aWV3LmludGVydmFsRHVyYXRpb24sIXQpaWYodGhpcy5sYWJlbEludGVydmFsfHx0aGlzLnNsb3REdXJhdGlvbilmb3IoaT10aGlzLmVuc3VyZUxhYmVsSW50ZXJ2YWwoKSxvPWsubGVuZ3RoLTE7bz49MCYmKHI9a1tvXSx0PWUuZHVyYXRpb24ocikscz1pdCh0LGkpLCEocz49UikpO28rPS0xKTtlbHNlIHQ9ZS5kdXJhdGlvbih1KTt0aGlzLmR1cmF0aW9uPXR9cmV0dXJuIHR9LE4ucHJvdG90eXBlLmVuc3VyZUxhYmVsSW50ZXJ2YWw9ZnVuY3Rpb24oKXt2YXIgdCxyLG8scyxpLG4sbCx1LGg7aWYoaT10aGlzLmxhYmVsSW50ZXJ2YWwsIWkpe2lmKHRoaXMuZHVyYXRpb258fHRoaXMuc2xvdER1cmF0aW9ufHx0aGlzLmVuc3VyZUdyaWREdXJhdGlvbigpLHRoaXMuc2xvdER1cmF0aW9uKXtmb3Iocj0wLG49ay5sZW5ndGg7cjxuO3IrKylpZih0PWtbcl0saD1lLmR1cmF0aW9uKHQpLHU9aXQoaCx0aGlzLnNsb3REdXJhdGlvbiksU3QodSkmJnU8PW0pe2k9aDticmVha31pfHwoaT10aGlzLnNsb3REdXJhdGlvbil9ZWxzZSBmb3Iobz0wLGw9ay5sZW5ndGg7bzxsJiYodD1rW29dLGk9ZS5kdXJhdGlvbih0KSxzPWl0KHRoaXMuZHVyYXRpb24saSksIShzPj1SKSk7bysrKTt0aGlzLmxhYmVsSW50ZXJ2YWw9aX1yZXR1cm4gaX0sTi5wcm90b3R5cGUuZW5zdXJlU2xvdER1cmF0aW9uPWZ1bmN0aW9uKCl7dmFyIHQscixvLHMsaSxuLGwsdTtpZihuPXRoaXMuc2xvdER1cmF0aW9uLCFuKXtmb3Iobz10aGlzLmVuc3VyZUxhYmVsSW50ZXJ2YWwoKSxyPTAscz1rLmxlbmd0aDtyPHM7cisrKWlmKHQ9a1tyXSx1PWUuZHVyYXRpb24odCksbD1pdChvLHUpLFN0KGwpJiZsPjEmJmw8PW0pe249dTticmVha31uJiZ0aGlzLmR1cmF0aW9uJiYoaT1pdCh0aGlzLmR1cmF0aW9uLG4pLGk+dyYmKG49bnVsbCkpLG58fChuPW8pLHRoaXMuc2xvdER1cmF0aW9uPW59cmV0dXJuIG59LE4ucHJvdG90eXBlLmNvbXB1dGVIZWFkZXJGb3JtYXRzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scyxpLG4sbDtzd2l0Y2gobj10aGlzLnZpZXcsbz10aGlzLmR1cmF0aW9uLHM9dGhpcy5sYWJlbEludGVydmFsLGk9SihzKSxsPXRoaXMub3B0KCJ3ZWVrTnVtYmVycyIpLHQ9ZT1yPW51bGwsIndlZWsiIT09aXx8bHx8KGk9ImRheSIpLGkpe2Nhc2UieWVhciI6dD0iWVlZWSI7YnJlYWs7Y2FzZSJtb250aCI6by5hc1llYXJzKCk+MSYmKHQ9IllZWVkiKSxlPSJNTU0iO2JyZWFrO2Nhc2Uid2VlayI6by5hc1llYXJzKCk+MSYmKHQ9IllZWVkiKSxlPXRoaXMub3B0KCJzaG9ydFdlZWtGb3JtYXQiKTticmVhaztjYXNlImRheSI6by5hc1llYXJzKCk+MT90PXRoaXMub3B0KCJtb250aFllYXJGb3JtYXQiKTpvLmFzTW9udGhzKCk+MSYmKHQ9Ik1NTU0iKSxsJiYoZT10aGlzLm9wdCgid2Vla0Zvcm1hdCIpKSxyPSJkZCBEIjticmVhaztjYXNlImhvdXIiOmwmJih0PXRoaXMub3B0KCJ3ZWVrRm9ybWF0IikpLG8uYXNEYXlzKCk+MSYmKGU9dGhpcy5vcHQoImRheU9mTW9udGhGb3JtYXQiKSkscj10aGlzLm9wdCgic21hbGxUaW1lRm9ybWF0Iik7YnJlYWs7Y2FzZSJtaW51dGUiOnMuYXNNaW51dGVzKCkvNjA+PW0/KHQ9dGhpcy5vcHQoImhvdXJGb3JtYXQiKSxlPSJbOl1tbSIpOnQ9dGhpcy5vcHQoIm1lZGl1bVRpbWVGb3JtYXQiKTticmVhaztjYXNlInNlY29uZCI6cy5hc1NlY29uZHMoKS82MD49bT8odD0iTFQiLGU9Ils6XXNzIik6dD0iTFRTIjticmVhaztjYXNlIm1pbGxpc2Vjb25kIjp0PSJMVFMiLGU9IlsuXVNTUyJ9cmV0dXJuW10uY29uY2F0KHR8fFtdLGV8fFtdLHJ8fFtdKX0sZC52aWV3cy50aW1lbGluZT17ImNsYXNzIjpqLGRlZmF1bHRzOntldmVudFJlc2l6YWJsZUZyb21TdGFydDohMH19LGQudmlld3MudGltZWxpbmVEYXk9e3R5cGU6InRpbWVsaW5lIixkdXJhdGlvbjp7ZGF5czoxfX0sZC52aWV3cy50aW1lbGluZVdlZWs9e3R5cGU6InRpbWVsaW5lIixkdXJhdGlvbjp7d2Vla3M6MX19LGQudmlld3MudGltZWxpbmVNb250aD17dHlwZToidGltZWxpbmUiLGR1cmF0aW9uOnttb250aHM6MX19LGQudmlld3MudGltZWxpbmVZZWFyPXt0eXBlOiJ0aW1lbGluZSIsZHVyYXRpb246e3llYXJzOjF9fSxNPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChyLGUpLHIubWl4aW4oVyksci5wcm90b3R5cGUucmVzb3VyY2VHcmlkPW51bGwsci5wcm90b3R5cGUudGJvZHlIYXNoPW51bGwsci5wcm90b3R5cGUuam9pbmVyPW51bGwsci5wcm90b3R5cGUuZGl2aWRlckVscz1udWxsLHIucHJvdG90eXBlLnN1cGVySGVhZGVyVGV4dD1udWxsLHIucHJvdG90eXBlLmlzVkdyb3VwaW5nPW51bGwsci5wcm90b3R5cGUuaXNIR3JvdXBpbmc9bnVsbCxyLnByb3RvdHlwZS5ncm91cFNwZWNzPW51bGwsci5wcm90b3R5cGUuY29sU3BlY3M9bnVsbCxyLnByb3RvdHlwZS5vcmRlclNwZWNzPW51bGwsci5wcm90b3R5cGUucm93SGllcmFyY2h5PW51bGwsci5wcm90b3R5cGUucmVzb3VyY2VSb3dIYXNoPW51bGwsci5wcm90b3R5cGUubmVzdGluZ0NudD0wLHIucHJvdG90eXBlLmlzTmVzdGluZz1udWxsLHIucHJvdG90eXBlLmRpdmlkZXJXaWR0aD1udWxsLHIucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtyZXR1cm4gci5fX3N1cGVyX18uaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5wcm9jZXNzUmVzb3VyY2VPcHRpb25zKCksdGhpcy5yZXNvdXJjZUdyaWQ9bmV3IHEodGhpcyksdGhpcy5yb3dIaWVyYXJjaHk9bmV3IHoodGhpcyksdGhpcy5yZXNvdXJjZVJvd0hhc2g9e319LHIucHJvdG90eXBlLmluc3RhbnRpYXRlR3JpZD1mdW5jdGlvbigpe3JldHVybiBuZXcgRyh0aGlzKX0sci5wcm90b3R5cGUucHJvY2Vzc1Jlc291cmNlT3B0aW9ucz1mdW5jdGlvbigpe3ZhciB0LGUscixvLHMsaSxuLGwsdSxoLGEsYyxwLGQsZixnLHksdix3LG0sUyxSO2Zvcih0PXRoaXMub3B0KCJyZXNvdXJjZUNvbHVtbnMiKXx8W10sZj10aGlzLm9wdCgicmVzb3VyY2VMYWJlbFRleHQiKSxvPSJSZXNvdXJjZXMiLFI9bnVsbCx0Lmxlbmd0aD9SPWY6dC5wdXNoKHtsYWJlbFRleHQ6Znx8byx0ZXh0OnRoaXMuZ2V0UmVzb3VyY2VUZXh0RnVuYygpfSksbT1bXSxzPVtdLG49W10sYT0hMSxoPSExLGM9MCxnPXQubGVuZ3RoO2M8ZztjKyspcj10W2NdLHIuZ3JvdXA/cy5wdXNoKHIpOm0ucHVzaChyKTtmb3IobVswXS5pc01haW49ITAscy5sZW5ndGg/KG49cyxhPSEwKToobD10aGlzLm9wdCgicmVzb3VyY2VHcm91cEZpZWxkIiksbCYmKGg9ITAsbi5wdXNoKHtmaWVsZDpsLHRleHQ6dGhpcy5vcHQoInJlc291cmNlR3JvdXBUZXh0IikscmVuZGVyOnRoaXMub3B0KCJyZXNvdXJjZUdyb3VwUmVuZGVyIil9KSkpLGU9RnQodGhpcy5vcHQoInJlc291cmNlT3JkZXIiKSksUz1bXSxwPTAseT1lLmxlbmd0aDtwPHk7cCsrKXtmb3Iodz1lW3BdLHU9ITEsZD0wLHY9bi5sZW5ndGg7ZDx2O2QrKylpZihpPW5bZF0saS5maWVsZD09PXcuZmllbGQpe2kub3JkZXI9dy5vcmRlcix1PSEwO2JyZWFrfXV8fFMucHVzaCh3KX1yZXR1cm4gdGhpcy5zdXBlckhlYWRlclRleHQ9Uix0aGlzLmlzVkdyb3VwaW5nPWEsdGhpcy5pc0hHcm91cGluZz1oLHRoaXMuZ3JvdXBTcGVjcz1uLHRoaXMuY29sU3BlY3M9cy5jb25jYXQobSksdGhpcy5vcmRlclNwZWNzPVN9LHIucHJvdG90eXBlLnJlbmRlclNrZWxldG9uPWZ1bmN0aW9uKCl7cmV0dXJuIHIuX19zdXBlcl9fLnJlbmRlclNrZWxldG9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnJlbmRlclJlc291cmNlR3JpZFNrZWxldG9uKCksdGhpcy50Ym9keUhhc2g9e3NwcmVhZHNoZWV0OnRoaXMucmVzb3VyY2VHcmlkLnRib2R5RWwsZXZlbnQ6dGhpcy50aW1lR3JpZC50Ym9keUVsfSx0aGlzLmpvaW5lcj1uZXcgQSgidmVydGljYWwiLFt0aGlzLnJlc291cmNlR3JpZC5ib2R5U2Nyb2xsZXIsdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXJdKSx0aGlzLmluaXREaXZpZGVyTW92aW5nKCl9LHIucHJvdG90eXBlLnJlbmRlclNrZWxldG9uSHRtbD1mdW5jdGlvbigpe3JldHVybic8dGFibGU+IDx0aGVhZCBjbGFzcz0iZmMtaGVhZCI+IDx0cj4gPHRkIGNsYXNzPSJmYy1yZXNvdXJjZS1hcmVhICcrdGhpcy53aWRnZXRIZWFkZXJDbGFzcysnIj48L3RkPiA8dGQgY2xhc3M9ImZjLWRpdmlkZXIgZmMtY29sLXJlc2l6ZXIgJyt0aGlzLndpZGdldEhlYWRlckNsYXNzKyciPjwvdGQ+IDx0ZCBjbGFzcz0iZmMtdGltZS1hcmVhICcrdGhpcy53aWRnZXRIZWFkZXJDbGFzcysnIj48L3RkPiA8L3RyPiA8L3RoZWFkPiA8dGJvZHkgY2xhc3M9ImZjLWJvZHkiPiA8dHI+IDx0ZCBjbGFzcz0iZmMtcmVzb3VyY2UtYXJlYSAnK3RoaXMud2lkZ2V0Q29udGVudENsYXNzKyciPjwvdGQ+IDx0ZCBjbGFzcz0iZmMtZGl2aWRlciBmYy1jb2wtcmVzaXplciAnK3RoaXMud2lkZ2V0SGVhZGVyQ2xhc3MrJyI+PC90ZD4gPHRkIGNsYXNzPSJmYy10aW1lLWFyZWEgJyt0aGlzLndpZGdldENvbnRlbnRDbGFzcysnIj48L3RkPiA8L3RyPiA8L3Rib2R5PiA8L3RhYmxlPic7Cn0sci5wcm90b3R5cGUucmVuZGVyUmVzb3VyY2VHcmlkU2tlbGV0b249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXNvdXJjZUdyaWQuZWw9dGhpcy5lbC5maW5kKCJ0Ym9keSAuZmMtcmVzb3VyY2UtYXJlYSIpLHRoaXMucmVzb3VyY2VHcmlkLmhlYWRFbD10aGlzLmVsLmZpbmQoInRoZWFkIC5mYy1yZXNvdXJjZS1hcmVhIiksdGhpcy5yZXNvdXJjZUdyaWQucmVuZGVyU2tlbGV0b24oKX0sci5wcm90b3R5cGUuaW5pdERpdmlkZXJNb3Zpbmc9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy5kaXZpZGVyRWxzPXRoaXMuZWwuZmluZCgiLmZjLWRpdmlkZXIiKSx0aGlzLmRpdmlkZXJXaWR0aD1udWxsIT0odD10aGlzLm9wdCgicmVzb3VyY2VBcmVhV2lkdGgiKSk/dDp0aGlzLnJlc291cmNlR3JpZC50YWJsZVdpZHRoLG51bGwhPXRoaXMuZGl2aWRlcldpZHRoJiZ0aGlzLnBvc2l0aW9uRGl2aWRlcih0aGlzLmRpdmlkZXJXaWR0aCksdGhpcy5kaXZpZGVyRWxzLm9uKCJtb3VzZWRvd24iLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5kaXZpZGVyTW91c2Vkb3duKGUpfX0odGhpcykpfSxyLnByb3RvdHlwZS5kaXZpZGVyTW91c2Vkb3duPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzLGk7cmV0dXJuIHI9dGhpcy5vcHQoImlzUlRMIikscz0zMCxvPXRoaXMuZWwud2lkdGgoKS0zMCxpPXRoaXMuZ2V0TmF0dXJhbERpdmlkZXJXaWR0aCgpLGU9bmV3IGgoe2RyYWdTdGFydDpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5kaXZpZGVyRWxzLmFkZENsYXNzKCJmYy1hY3RpdmUiKX19KHRoaXMpLGRyYWc6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGw7cmV0dXJuIGw9cj9pLWU6aStlLGw9TWF0aC5tYXgobCxzKSxsPU1hdGgubWluKGwsbyksdC5kaXZpZGVyV2lkdGg9bCx0LnBvc2l0aW9uRGl2aWRlcihsKSx0LnVwZGF0ZVdpZHRoKCl9fSh0aGlzKSxkcmFnRW5kOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmRpdmlkZXJFbHMucmVtb3ZlQ2xhc3MoImZjLWFjdGl2ZSIpfX0odGhpcyl9KSxlLnN0YXJ0SW50ZXJhY3Rpb24odCl9LHIucHJvdG90eXBlLmdldE5hdHVyYWxEaXZpZGVyV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbC5maW5kKCIuZmMtcmVzb3VyY2UtYXJlYSIpLndpZHRoKCl9LHIucHJvdG90eXBlLnBvc2l0aW9uRGl2aWRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbC5maW5kKCIuZmMtcmVzb3VyY2UtYXJlYSIpLndpZHRoKHQpfSxyLnByb3RvdHlwZS5yZW5kZXJFdmVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGltZUdyaWQucmVuZGVyRXZlbnRzKHQpLHRoaXMuc3luY1Jvd0hlaWdodHMoKSx0aGlzLnVwZGF0ZVdpZHRoKCl9LHIucHJvdG90eXBlLnVucmVuZGVyRXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQudW5yZW5kZXJFdmVudHMoKSx0aGlzLnN5bmNSb3dIZWlnaHRzKCksdGhpcy51cGRhdGVXaWR0aCgpfSxyLnByb3RvdHlwZS51cGRhdGVXaWR0aD1mdW5jdGlvbigpe2lmKHIuX19zdXBlcl9fLnVwZGF0ZVdpZHRoLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnJlc291cmNlR3JpZC51cGRhdGVXaWR0aCgpLHRoaXMuam9pbmVyLnVwZGF0ZSgpLHRoaXMuY2VsbEZvbGxvd2VyKXJldHVybiB0aGlzLmNlbGxGb2xsb3dlci51cGRhdGUoKX0sci5wcm90b3R5cGUudXBkYXRlSGVpZ2h0PWZ1bmN0aW9uKHQpe2lmKHIuX19zdXBlcl9fLnVwZGF0ZUhlaWdodC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdClyZXR1cm4gdGhpcy5zeW5jUm93SGVpZ2h0cygpfSxyLnByb3RvdHlwZS5zZXRIZWlnaHQ9ZnVuY3Rpb24odCxlKXt2YXIgcixvO3JldHVybiBvPXRoaXMuc3luY0hlYWRIZWlnaHRzKCkscj1lPyJhdXRvIjp0LW8tdGhpcy5xdWVyeU1pc2NIZWlnaHQoKSx0aGlzLnRpbWVHcmlkLmJvZHlTY3JvbGxlci5zZXRIZWlnaHQociksdGhpcy5yZXNvdXJjZUdyaWQuYm9keVNjcm9sbGVyLnNldEhlaWdodChyKX0sci5wcm90b3R5cGUucXVlcnlNaXNjSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWwub3V0ZXJIZWlnaHQoKS1NYXRoLm1heCh0aGlzLnJlc291cmNlR3JpZC5oZWFkU2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSx0aGlzLnRpbWVHcmlkLmhlYWRTY3JvbGxlci5lbC5vdXRlckhlaWdodCgpKS1NYXRoLm1heCh0aGlzLnJlc291cmNlR3JpZC5ib2R5U2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSx0aGlzLnRpbWVHcmlkLmJvZHlTY3JvbGxlci5lbC5vdXRlckhlaWdodCgpKX0sci5wcm90b3R5cGUuc3luY0hlYWRIZWlnaHRzPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMucmVzb3VyY2VHcmlkLmhlYWRIZWlnaHQoImF1dG8iKSx0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQoImF1dG8iKSx0PU1hdGgubWF4KHRoaXMucmVzb3VyY2VHcmlkLmhlYWRIZWlnaHQoKSx0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQoKSksdGhpcy5yZXNvdXJjZUdyaWQuaGVhZEhlaWdodCh0KSx0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQodCksdH0sci5wcm90b3R5cGUuc2Nyb2xsVG9SZXNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aW1lR3JpZC5zY3JvbGxUb1Jlc291cmNlKHQpfSxyLnByb3RvdHlwZS5zZXRSZXNvdXJjZXM9ZnVuY3Rpb24odCl7dmFyIGUscixvO2Zvcih0aGlzLmJhdGNoUm93cygpLGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspbz10W2VdLHRoaXMuaW5zZXJ0UmVzb3VyY2Uobyk7cmV0dXJuIHRoaXMucm93SGllcmFyY2h5LnNob3coKSx0aGlzLnVuYmF0Y2hSb3dzKCksdGhpcy5yZWluaXRpYWxpemVDZWxsRm9sbG93ZXJzKCl9LHIucHJvdG90eXBlLnVuc2V0UmVzb3VyY2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xlYXJFdmVudHMoKSx0aGlzLmJhdGNoUm93cygpLHRoaXMucm93SGllcmFyY2h5LnJlbW92ZUNoaWxkcmVuKCksdGhpcy51bmJhdGNoUm93cygpLHRoaXMucmVpbml0aWFsaXplQ2VsbEZvbGxvd2VycygpfSxyLnByb3RvdHlwZS5hZGRSZXNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbnNlcnRSZXNvdXJjZSh0KSx0aGlzLnJlaW5pdGlhbGl6ZUNlbGxGb2xsb3dlcnMoKX0sci5wcm90b3R5cGUucmVtb3ZlUmVzb3VyY2U9ZnVuY3Rpb24odCl7dmFyIGU7aWYoZT10aGlzLmdldFJlc291cmNlUm93KHQuaWQpKXJldHVybiB0aGlzLmJhdGNoUm93cygpLGUucmVtb3ZlKCksdGhpcy51bmJhdGNoUm93cygpLHRoaXMucmVpbml0aWFsaXplQ2VsbEZvbGxvd2VycygpfSxyLnByb3RvdHlwZS5jZWxsRm9sbG93ZXI9bnVsbCxyLnByb3RvdHlwZS5yZWluaXRpYWxpemVDZWxsRm9sbG93ZXJzPWZ1bmN0aW9uKCl7dmFyIGUscixvLHMsaSxuO2Zvcih0aGlzLmNlbGxGb2xsb3dlciYmdGhpcy5jZWxsRm9sbG93ZXIuY2xlYXJTcHJpdGVzKCksdGhpcy5jZWxsRm9sbG93ZXI9bmV3IFYodGhpcy5yZXNvdXJjZUdyaWQuYm9keVNjcm9sbGVyLHRoaXMuY2FsZW5kYXIuaXNUb3VjaCksdGhpcy5jZWxsRm9sbG93ZXIuaXNIRm9sbG93aW5nPSExLHRoaXMuY2VsbEZvbGxvd2VyLmlzVkZvbGxvd2luZz0hMCxzPVtdLGk9dGhpcy5yb3dIaWVyYXJjaHkuZ2V0Tm9kZXMoKSxyPTAsbz1pLmxlbmd0aDtyPG87cisrKW49aVtyXSxuIGluc3RhbmNlb2YgVSYmbi5ncm91cFRkJiYoZT1uLmdyb3VwVGQuZmluZCgiLmZjLWNlbGwtY29udGVudCIpLGUubGVuZ3RoJiZzLnB1c2goZVswXSkpO3JldHVybiB0aGlzLmNlbGxGb2xsb3dlci5zZXRTcHJpdGVzKHQocykpfSxyLnByb3RvdHlwZS5pbnNlcnRSZXNvdXJjZT1mdW5jdGlvbih0LGUpe3ZhciByLG8scyxpLG4sbCx1O2Zvcih1PW5ldyBCKHRoaXMsdCksbnVsbD09ZSYmKGk9dC5wYXJlbnRJZCxpJiYoZT10aGlzLmdldFJlc291cmNlUm93KGkpKSksZT90aGlzLmluc2VydFJvd0FzQ2hpbGQodSxlKTp0aGlzLmluc2VydFJvdyh1KSxuPXQuY2hpbGRyZW4sbD1bXSxvPTAscz1uLmxlbmd0aDtvPHM7bysrKXI9bltvXSxsLnB1c2godGhpcy5pbnNlcnRSZXNvdXJjZShyLHUpKTtyZXR1cm4gbH0sci5wcm90b3R5cGUuaW5zZXJ0Um93PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbztyZXR1cm4gbnVsbD09ZSYmKGU9dGhpcy5yb3dIaWVyYXJjaHkpLG51bGw9PXImJihyPXRoaXMuZ3JvdXBTcGVjcyksci5sZW5ndGg/KG89dGhpcy5lbnN1cmVSZXNvdXJjZUdyb3VwKHQsZSxyWzBdKSxvIGluc3RhbmNlb2YgZz90aGlzLmluc2VydFJvd0FzQ2hpbGQodCxvKTp0aGlzLmluc2VydFJvdyh0LG8sci5zbGljZSgxKSkpOnRoaXMuaW5zZXJ0Um93QXNDaGlsZCh0LGUpfSxyLnByb3RvdHlwZS5pbnNlcnRSb3dBc0NoaWxkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuYWRkQ2hpbGQodCx0aGlzLmNvbXB1dGVDaGlsZFJvd1Bvc2l0aW9uKHQsZSkpfSxyLnByb3RvdHlwZS5jb21wdXRlQ2hpbGRSb3dQb3NpdGlvbj1mdW5jdGlvbih0LGUpe3ZhciByLG8scyxpLG4sbDtpZih0aGlzLm9yZGVyU3BlY3MubGVuZ3RoKWZvcihuPWUuY2hpbGRyZW4sbz1zPTAsaT1uLmxlbmd0aDtzPGk7bz0rK3MpaWYobD1uW29dLHI9dGhpcy5jb21wYXJlUmVzb3VyY2VzKGwucmVzb3VyY2V8fHt9LHQucmVzb3VyY2V8fHt9KSxyPjApcmV0dXJuIG87cmV0dXJuIG51bGx9LHIucHJvdG90eXBlLmNvbXBhcmVSZXNvdXJjZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gUSh0LGUsdGhpcy5vcmRlclNwZWNzKX0sci5wcm90b3R5cGUuZW5zdXJlUmVzb3VyY2VHcm91cD1mdW5jdGlvbih0LGUscil7dmFyIG8scyxpLG4sbCx1LGgsYSxjLHAsZDtpZihpPSh0LnJlc291cmNlfHx7fSlbci5maWVsZF0scz1udWxsLHIub3JkZXIpZm9yKGM9ZS5jaGlsZHJlbixuPWw9MCxoPWMubGVuZ3RoO2w8aDtuPSsrbCl7aWYoZD1jW25dLG89dXQoZC5ncm91cFZhbHVlLGkpKnIub3JkZXIsMD09PW8pe3M9ZDticmVha31pZihvPjApYnJlYWt9ZWxzZSBmb3IocD1lLmNoaWxkcmVuLG49dT0wLGE9cC5sZW5ndGg7dTxhO249Kyt1KWlmKGQ9cFtuXSxkLmdyb3VwVmFsdWU9PT1pKXtzPWQ7YnJlYWt9cmV0dXJuIHN8fChzPXRoaXMuaXNWR3JvdXBpbmc/bmV3IFUodGhpcyxyLGkpOm5ldyBnKHRoaXMscixpKSxlLmFkZENoaWxkKHMsbikpLHN9LHIucHJvdG90eXBlLnBhaXJTZWdzV2l0aFJvd3M9ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaSxuLGwsdTtmb3Iocz1bXSxpPXt9LGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspdT10W2VdLG49dS5yZXNvdXJjZUlkLG4mJihsPXRoaXMuZ2V0UmVzb3VyY2VSb3cobiksbCYmKG89aVtuXSxvfHwobz1bbCxbXV0scy5wdXNoKG8pLGlbbl09byksb1sxXS5wdXNoKHUpKSk7cmV0dXJuIHN9LHIucHJvdG90eXBlLnJvd0FkZGVkPWZ1bmN0aW9uKHQpe3ZhciBlLHI7cmV0dXJuIHQgaW5zdGFuY2VvZiBCJiYodGhpcy5yZXNvdXJjZVJvd0hhc2hbdC5yZXNvdXJjZS5pZF09dCx0aGlzLnRpbWVHcmlkLmFzc2lnblJvd0J1c2luZXNzSG91clNlZ3ModCkpLHI9dGhpcy5pc05lc3RpbmcsZT1Cb29sZWFuKHRoaXMubmVzdGluZ0NudCs9dC5kZXB0aD8xOjApLHIhPT1lJiYodGhpcy5lbC50b2dnbGVDbGFzcygiZmMtbmVzdGVkIixlKSx0aGlzLmVsLnRvZ2dsZUNsYXNzKCJmYy1mbGF0IiwhZSkpLHRoaXMuaXNOZXN0aW5nPWV9LHIucHJvdG90eXBlLnJvd1JlbW92ZWQ9ZnVuY3Rpb24odCl7dmFyIGUscjtyZXR1cm4gdCBpbnN0YW5jZW9mIEImJihkZWxldGUgdGhpcy5yZXNvdXJjZVJvd0hhc2hbdC5yZXNvdXJjZS5pZF0sdGhpcy50aW1lR3JpZC5kZXN0cm95Um93QnVzaW5lc3NIb3VyU2Vncyh0KSkscj10aGlzLmlzTmVzdGluZyxlPUJvb2xlYW4odGhpcy5uZXN0aW5nQ250LT10LmRlcHRoPzE6MCksciE9PWUmJih0aGlzLmVsLnRvZ2dsZUNsYXNzKCJmYy1uZXN0ZWQiLGUpLHRoaXMuZWwudG9nZ2xlQ2xhc3MoImZjLWZsYXQiLCFlKSksdGhpcy5pc05lc3Rpbmc9ZX0sci5wcm90b3R5cGUuYmF0Y2hSb3dEZXB0aD0wLHIucHJvdG90eXBlLnNob3duUm93QmF0Y2g9bnVsbCxyLnByb3RvdHlwZS5oaWRkZW5Sb3dCYXRjaD1udWxsLHIucHJvdG90eXBlLmJhdGNoUm93cz1mdW5jdGlvbigpe2lmKCF0aGlzLmJhdGNoUm93RGVwdGgrKylyZXR1cm4gdGhpcy5zaG93blJvd0JhdGNoPVtdLHRoaXMuaGlkZGVuUm93QmF0Y2g9W119LHIucHJvdG90eXBlLnVuYmF0Y2hSb3dzPWZ1bmN0aW9uKCl7aWYoIS0tdGhpcy5iYXRjaFJvd0RlcHRoKXJldHVybiB0aGlzLmhpZGRlblJvd0JhdGNoLmxlbmd0aCYmdGhpcy5yb3dzSGlkZGVuKHRoaXMuaGlkZGVuUm93QmF0Y2gpLHRoaXMuc2hvd25Sb3dCYXRjaC5sZW5ndGgmJnRoaXMucm93c1Nob3duKHRoaXMuc2hvd25Sb3dCYXRjaCksdGhpcy5oaWRkZW5Sb3dCYXRjaD1udWxsLHRoaXMuc2hvd25Sb3dCYXRjaD1udWxsfSxyLnByb3RvdHlwZS5yb3dTaG93bj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zaG93blJvd0JhdGNoP3RoaXMuc2hvd25Sb3dCYXRjaC5wdXNoKHQpOnRoaXMucm93c1Nob3duKFt0XSl9LHIucHJvdG90eXBlLnJvd0hpZGRlbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5oaWRkZW5Sb3dCYXRjaD90aGlzLmhpZGRlblJvd0JhdGNoLnB1c2godCk6dGhpcy5yb3dzSGlkZGVuKFt0XSl9LHIucHJvdG90eXBlLnJvd3NTaG93bj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zeW5jUm93SGVpZ2h0cyh0KSx0aGlzLnVwZGF0ZVdpZHRoKCl9LHIucHJvdG90eXBlLnJvd3NIaWRkZW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV2lkdGgoKX0sci5wcm90b3R5cGUuc3luY1Jvd0hlaWdodHM9ZnVuY3Rpb24odCxlKXt2YXIgcixvLHMsaSxuLGwsdSxoLGEsYztmb3IobnVsbD09ZSYmKGU9ITEpLG51bGw9PXQmJih0PXRoaXMuZ2V0VmlzaWJsZVJvd3MoKSksbD0wLGg9dC5sZW5ndGg7bDxoO2wrKyljPXRbbF0sYy5zZXRUcklubmVySGVpZ2h0KCIiKTtmb3Iobj1mdW5jdGlvbigpe3ZhciBvLHMsaTtmb3IoaT1bXSxvPTAscz10Lmxlbmd0aDtvPHM7bysrKWM9dFtvXSxyPWMuZ2V0TWF4VHJJbm5lckhlaWdodCgpLGUmJihyKz1yJTIpLGkucHVzaChyKTtyZXR1cm4gaX0oKSxpPXU9MCxhPXQubGVuZ3RoO3U8YTtpPSsrdSljPXRbaV0sYy5zZXRUcklubmVySGVpZ2h0KG5baV0pO2lmKCFlJiYobz10aGlzLnJlc291cmNlR3JpZC50Ym9keUVsLmhlaWdodCgpLHM9dGhpcy50aW1lR3JpZC50Ym9keUVsLmhlaWdodCgpLE1hdGguYWJzKG8tcyk+MSkpcmV0dXJuIHRoaXMuc3luY1Jvd0hlaWdodHModCwhMCl9LHIucHJvdG90eXBlLmdldFZpc2libGVSb3dzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iocj10aGlzLnJvd0hpZXJhcmNoeS5nZXRSb3dzKCksbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxzLmlzU2hvd24mJm8ucHVzaChzKTtyZXR1cm4gb30sci5wcm90b3R5cGUuZ2V0RXZlbnRSb3dzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iocj10aGlzLnJvd0hpZXJhcmNoeS5nZXRSb3dzKCksbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxzIGluc3RhbmNlb2YgcCYmby5wdXNoKHMpO3JldHVybiBvfSxyLnByb3RvdHlwZS5nZXRSZXNvdXJjZVJvdz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXNvdXJjZVJvd0hhc2hbdF19LHIucHJvdG90eXBlLnNldFNjcm9sbD1mdW5jdGlvbih0KXtyZXR1cm4gci5fX3N1cGVyX18uc2V0U2Nyb2xsLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnJlc291cmNlR3JpZC5ib2R5U2Nyb2xsZXIuc2V0U2Nyb2xsVG9wKHQudG9wKX0scn0oaiksRz1mdW5jdGlvbihlKXtmdW5jdGlvbiByKCl7cmV0dXJuIHIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gT3QocixlKSxyLm1peGluKEkpLHIucHJvdG90eXBlLmV2ZW50Um93cz1udWxsLHIucHJvdG90eXBlLnNob3duRXZlbnRSb3dzPW51bGwsci5wcm90b3R5cGUudGJvZHlFbD1udWxsLHIucHJvdG90eXBlLnJvd0Nvb3JkQ2FjaGU9bnVsbCxyLnByb3RvdHlwZS5zcGFuVG9TZWdzPWZ1bmN0aW9uKHQpe3ZhciBlLG8scyxpLG4sbDtpZihsPXIuX19zdXBlcl9fLnNwYW5Ub1NlZ3MuYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dGhpcy52aWV3LmNhbGVuZGFyLGk9dC5yZXNvdXJjZUlkKWZvcihvPTAscz1sLmxlbmd0aDtvPHM7bysrKW49bFtvXSxuLnJlc291cmNlPWUuZ2V0UmVzb3VyY2VCeUlkKGkpLG4ucmVzb3VyY2VJZD1pO3JldHVybiBsfSxyLnByb3RvdHlwZS5wcmVwYXJlSGl0cz1mdW5jdGlvbigpe3ZhciB0LGU7cmV0dXJuIHIuX19zdXBlcl9fLnByZXBhcmVIaXRzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmV2ZW50Um93cz10aGlzLnZpZXcuZ2V0RXZlbnRSb3dzKCksdGhpcy5zaG93bkV2ZW50Um93cz1mdW5jdGlvbigpe3ZhciBlLHIsbyxzO2ZvcihvPXRoaXMuZXZlbnRSb3dzLHM9W10sZT0wLHI9by5sZW5ndGg7ZTxyO2UrKyl0PW9bZV0sdC5pc1Nob3duJiZzLnB1c2godCk7cmV0dXJuIHN9LmNhbGwodGhpcyksZT1mdW5jdGlvbigpe3ZhciBlLHIsbyxzO2ZvcihvPXRoaXMuc2hvd25FdmVudFJvd3Mscz1bXSxlPTAscj1vLmxlbmd0aDtlPHI7ZSsrKXQ9b1tlXSxzLnB1c2godC5nZXRUcigiZXZlbnQiKVswXSk7cmV0dXJuIHN9LmNhbGwodGhpcyksdGhpcy5yb3dDb29yZENhY2hlPW5ldyBsKHtlbHM6ZSxpc1ZlcnRpY2FsOiEwfSksdGhpcy5yb3dDb29yZENhY2hlLmJ1aWxkKCl9LHIucHJvdG90eXBlLnJlbGVhc2VIaXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHIuX19zdXBlcl9fLnJlbGVhc2VIaXRzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmV2ZW50Um93cz1udWxsLHRoaXMuc2hvd25FdmVudFJvd3M9bnVsbCx0aGlzLnJvd0Nvb3JkQ2FjaGUuY2xlYXIoKX0sci5wcm90b3R5cGUucXVlcnlIaXQ9ZnVuY3Rpb24odCxlKXt2YXIgbyxzO2lmKHM9ci5fX3N1cGVyX18ucXVlcnlIaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHMmJihvPXRoaXMucm93Q29vcmRDYWNoZS5nZXRWZXJ0aWNhbEluZGV4KGUpLG51bGwhPW8pKXJldHVybntyZXNvdXJjZUlkOnRoaXMuc2hvd25FdmVudFJvd3Nbb10ucmVzb3VyY2UuaWQsc25hcDpzLnNuYXAsY29tcG9uZW50OnRoaXMsbGVmdDpzLmxlZnQscmlnaHQ6cy5yaWdodCx0b3A6dGhpcy5yb3dDb29yZENhY2hlLmdldFRvcE9mZnNldChvKSxib3R0b206dGhpcy5yb3dDb29yZENhY2hlLmdldEJvdHRvbU9mZnNldChvKX19LHIucHJvdG90eXBlLmdldEhpdFNwYW49ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIGU9dGhpcy5nZXRTbmFwUmFuZ2UodC5zbmFwKSxlLnJlc291cmNlSWQ9dC5yZXNvdXJjZUlkLGV9LHIucHJvdG90eXBlLmdldEhpdEVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldFNuYXBFbCh0LnNuYXApfSxyLnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbj1mdW5jdGlvbigpe3ZhciBlO3JldHVybiByLl9fc3VwZXJfXy5yZW5kZXJTa2VsZXRvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5zZWdDb250YWluZXJFbC5yZW1vdmUoKSx0aGlzLnNlZ0NvbnRhaW5lckVsPW51bGwsZT10KCc8ZGl2IGNsYXNzPSJmYy1yb3dzIj48dGFibGU+PHRib2R5Lz48L3RhYmxlPjwvZGl2PicpLmFwcGVuZFRvKHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwpLHRoaXMudGJvZHlFbD1lLmZpbmQoInRib2R5Iil9LHIucHJvdG90eXBlLnJlbmRlckZnU2Vncz1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpLG4sbDtmb3IodD10aGlzLnJlbmRlckZnU2VnRWxzKHQpLG49dGhpcy52aWV3LnBhaXJTZWdzV2l0aFJvd3ModCksbD1bXSxvPTAscz1uLmxlbmd0aDtvPHM7bysrKWk9bltvXSxlPWlbMF0scj1pWzFdLGUuZmdTZWdzPXIsZS5pc1Nob3duJiYoZS5pc1NlZ3NSZW5kZXJlZD0hMCxsLnB1c2goaSkpO3JldHVybiB0aGlzLnJlbmRlckZnU2Vnc0luQ29udGFpbmVycyhsKSx0aGlzLnVwZGF0ZVNlZ0ZvbGxvd2Vycyh0KSx0fSxyLnByb3RvdHlwZS51bnJlbmRlckZnU2Vncz1mdW5jdGlvbigpe3ZhciB0LGUscixvO2Zvcih0aGlzLmNsZWFyU2VnRm9sbG93ZXJzKCksZT10aGlzLnZpZXcuZ2V0RXZlbnRSb3dzKCkscj0wLG89ZS5sZW5ndGg7cjxvO3IrKyl0PWVbcl0sdC5mZ1NlZ3M9bnVsbCx0LmlzU2Vnc1JlbmRlcmVkPSExO3JldHVybiB0aGlzLnVucmVuZGVyRmdDb250YWluZXJzKGUpfSxyLnByb3RvdHlwZS5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3Vycz0wLHIucHJvdG90eXBlLnJlbmRlckJ1c2luZXNzSG91cnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3Vycz90aGlzLmVuc3VyZUluZGl2aWR1YWxCdXNpbmVzc0hvdXJzKCk6ci5fX3N1cGVyX18ucmVuZGVyQnVzaW5lc3NIb3Vycy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLnVucmVuZGVyQnVzaW5lc3NIb3Vycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJvd0NudFdpdGhDdXN0b21CdXNpbmVzc0hvdXJzP3RoaXMuY2xlYXJJbmRpdmlkdWFsQnVzaW5lc3NIb3VycygpOnIuX19zdXBlcl9fLnVucmVuZGVyQnVzaW5lc3NIb3Vycy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLmVuc3VyZUluZGl2aWR1YWxCdXNpbmVzc0hvdXJzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iocj10aGlzLnZpZXcuZ2V0RXZlbnRSb3dzKCksbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxzLmJ1c2luZXNzSG91clNlZ3N8fHRoaXMucG9wdWxhdGVSb3dCdXNpbmVzc0hvdXJzU2VncyhzKSxzLmlzU2hvd24/by5wdXNoKHMuZW5zdXJlQnVzaW5lc3NIb3VyU2Vnc1JlbmRlcmVkKCkpOm8ucHVzaCh2b2lkIDApO3JldHVybiBvfSxyLnByb3RvdHlwZS5jbGVhckluZGl2aWR1YWxCdXNpbmVzc0hvdXJzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iocj10aGlzLnZpZXcuZ2V0RXZlbnRSb3dzKCksbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxvLnB1c2gocy5jbGVhckJ1c2luZXNzSG91clNlZ3MoKSk7cmV0dXJuIG99LHIucHJvdG90eXBlLmFzc2lnblJvd0J1c2luZXNzSG91clNlZ3M9ZnVuY3Rpb24odCl7aWYodC5yZXNvdXJjZS5idXNpbmVzc0hvdXJzJiYodGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3Vyc3x8KE4ucHJvdG90eXBlLnVucmVuZGVyQnVzaW5lc3NIb3Vycy5jYWxsKHRoaXMpLHRoaXMuZW5zdXJlSW5kaXZpZHVhbEJ1c2luZXNzSG91cnMoKSksdGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3Vycys9MSksdGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3VycylyZXR1cm4gdGhpcy5wb3B1bGF0ZVJvd0J1c2luZXNzSG91cnNTZWdzKHQpfSxyLnByb3RvdHlwZS5kZXN0cm95Um93QnVzaW5lc3NIb3VyU2Vncz1mdW5jdGlvbih0KXtpZih0LmNsZWFyQnVzaW5lc3NIb3VyU2VncygpLHQucmVzb3VyY2UuYnVzaW5lc3NIb3VycyYmKHRoaXMucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMtPTEsIXRoaXMucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMpKXJldHVybiB0aGlzLmNsZWFySW5kaXZpZHVhbEJ1c2luZXNzSG91cnMoKSxOLnByb3RvdHlwZS5yZW5kZXJCdXNpbmVzc0hvdXJzLmNhbGwodGhpcyl9LHIucHJvdG90eXBlLnBvcHVsYXRlUm93QnVzaW5lc3NIb3Vyc1NlZ3M9ZnVuY3Rpb24odCl7dmFyIGUscixvO3I9dC5yZXNvdXJjZS5idXNpbmVzc0hvdXJzfHx0aGlzLnZpZXcub3B0KCJidXNpbmVzc0hvdXJzIiksbz10aGlzLnZpZXcuY2FsZW5kYXIuY29tcHV0ZUJ1c2luZXNzSG91ckV2ZW50cyghdGhpcy5pc1RpbWVTY2FsZSxyKSxlPXRoaXMuZXZlbnRzVG9TZWdzKG8pLGU9dGhpcy5yZW5kZXJGaWxsU2VnRWxzKCJidXNpbmVzc0hvdXJzIixlKSx0LmJ1c2luZXNzSG91clNlZ3M9ZX0sci5wcm90b3R5cGUucmVuZGVyRmlsbD1mdW5jdGlvbih0LGUscil7dmFyIG8scyxpLG4sbCx1LGgsYSxjLHAsZCxmO2ZvcihlPXRoaXMucmVuZGVyRmlsbFNlZ0Vscyh0LGUpLGE9W10sbD1bXSxvPTAsaT1lLmxlbmd0aDtvPGk7bysrKWQ9ZVtvXSxkLnJlc291cmNlSWQ/YS5wdXNoKGQpOmwucHVzaChkKTtmb3IoaD10aGlzLnZpZXcucGFpclNlZ3NXaXRoUm93cyhhKSxmPVtdLHM9MCxuPWgubGVuZ3RoO3M8bjtzKyspdT1oW3NdLGM9dVswXSxwPXVbMV0sImJnRXZlbnQiPT09dCYmKGMuYmdTZWdzPXApLGMuaXNTaG93biYmZi5wdXNoKHUpO3JldHVybiBsLmxlbmd0aCYmZi51bnNoaWZ0KFt0aGlzLGxdKSx0aGlzLnJlbmRlckZpbGxJbkNvbnRhaW5lcnModCxmLHIpLGV9LHIucHJvdG90eXBlLnJlbmRlckhlbHBlcj1mdW5jdGlvbih0LGUpe3ZhciByLG87cmV0dXJuIG89dGhpcy5ldmVudFRvU2Vncyh0KSxvPXRoaXMucmVuZGVyRmdTZWdFbHMobykscj10aGlzLnZpZXcucGFpclNlZ3NXaXRoUm93cyhvKSx0aGlzLnJlbmRlckhlbHBlclNlZ3NJbkNvbnRhaW5lcnMocixlKX0sci5wcm90b3R5cGUuY29tcHV0ZUluaXRpYWxTY3JvbGw9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIGU9ci5fX3N1cGVyX18uY29tcHV0ZUluaXRpYWxTY3JvbGwuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQmJihlLnJlc291cmNlSWQ9dC5yZXNvdXJjZUlkLGUuYm90dG9tPXQuYm90dG9tKSxlfSxyLnByb3RvdHlwZS5xdWVyeVNjcm9sbD1mdW5jdGlvbigpe3ZhciB0LGUsbyxzLGksbixsLHU7Zm9yKHU9ci5fX3N1cGVyX18ucXVlcnlTY3JvbGwuYXBwbHkodGhpcyxhcmd1bWVudHMpLGw9dGhpcy5ib2R5U2Nyb2xsZXIuc2Nyb2xsRWwub2Zmc2V0KCkudG9wLGk9dGhpcy52aWV3LmdldFZpc2libGVSb3dzKCksbz0wLHM9aS5sZW5ndGg7bzxzO28rKylpZihuPWlbb10sbi5yZXNvdXJjZSYmKHQ9bi5nZXRUcigiZXZlbnQiKSxlPXQub2Zmc2V0KCkudG9wK3Qub3V0ZXJIZWlnaHQoKSxlPmwpKXt1LnJlc291cmNlSWQ9bi5yZXNvdXJjZS5pZCx1LmJvdHRvbT1lLWw7YnJlYWt9cmV0dXJuIHV9LHIucHJvdG90eXBlLnNldFNjcm9sbD1mdW5jdGlvbih0KXt2YXIgZSxvLHMsaTtyZXR1cm4gdC5yZXNvdXJjZUlkJiYoaT10aGlzLnZpZXcuZ2V0UmVzb3VyY2VSb3codC5yZXNvdXJjZUlkKSxpJiYoZT1pLmdldFRyKCJldmVudCIpLGUmJihzPXRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5lbC5vZmZzZXQoKS50b3Asbz1lLm9mZnNldCgpLnRvcCtlLm91dGVySGVpZ2h0KCksdC50b3A9by10LmJvdHRvbS1zKSkpLHIuX19zdXBlcl9fLnNldFNjcm9sbC5jYWxsKHRoaXMsdCl9LHIucHJvdG90eXBlLnNjcm9sbFRvUmVzb3VyY2U9ZnVuY3Rpb24odCl7dmFyIGUscixvLHM7aWYobz10aGlzLnZpZXcuZ2V0UmVzb3VyY2VSb3codC5pZCksbyYmKGU9by5nZXRUcigiZXZlbnQiKSkpcmV0dXJuIHI9dGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsLm9mZnNldCgpLnRvcCxzPWUub2Zmc2V0KCkudG9wLXIsdGhpcy5ib2R5U2Nyb2xsZXIuc2Nyb2xsRWwuc2Nyb2xsVG9wKHMpfSxyfShOKSxyPTMwLHE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe3ZhciBlO3RoaXMudmlldz10LHRoaXMuaXNSVEw9dGhpcy52aWV3Lm9wdCgiaXNSVEwiKSx0aGlzLmdpdmVuQ29sV2lkdGhzPXRoaXMuY29sV2lkdGhzPWZ1bmN0aW9uKCl7dmFyIHQscixvLHM7Zm9yKG89dGhpcy52aWV3LmNvbFNwZWNzLHM9W10sdD0wLHI9by5sZW5ndGg7dDxyO3QrKyllPW9bdF0scy5wdXNoKGUud2lkdGgpO3JldHVybiBzfS5jYWxsKHRoaXMpfXJldHVybiBlLnByb3RvdHlwZS52aWV3PW51bGwsZS5wcm90b3R5cGUuaGVhZEVsPW51bGwsZS5wcm90b3R5cGUuZWw9bnVsbCxlLnByb3RvdHlwZS50Ym9keUVsPW51bGwsZS5wcm90b3R5cGUuaGVhZFNjcm9sbGVyPW51bGwsZS5wcm90b3R5cGUuYm9keVNjcm9sbGVyPW51bGwsZS5wcm90b3R5cGUuam9pbmVyPW51bGwsZS5wcm90b3R5cGUuY29sR3JvdXBIdG1sPSIiLGUucHJvdG90eXBlLmhlYWRUYWJsZT1udWxsLGUucHJvdG90eXBlLmhlYWRDb2xFbHM9bnVsbCxlLnByb3RvdHlwZS5oZWFkQ2VsbEVscz1udWxsLGUucHJvdG90eXBlLmJvZHlDb2xFbHM9bnVsbCxlLnByb3RvdHlwZS5ib2R5VGFibGU9bnVsbCxlLnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhlYWRTY3JvbGxlcj1uZXcgbih7b3ZlcmZsb3dYOiJjbGlwcGVkLXNjcm9sbCIsb3ZlcmZsb3dZOiJoaWRkZW4ifSksdGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzPW5ldyBPLHRoaXMuaGVhZFNjcm9sbGVyLnJlbmRlcigpLHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuaHRtbCh0aGlzLnJlbmRlckhlYWRIdG1sKCkpLHRoaXMuaGVhZEVsLmFwcGVuZCh0aGlzLmhlYWRTY3JvbGxlci5lbCksdGhpcy5ib2R5U2Nyb2xsZXI9bmV3IG4oe292ZXJmbG93WToiY2xpcHBlZC1zY3JvbGwifSksdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzPW5ldyBPLHRoaXMuYm9keVNjcm9sbGVyLnJlbmRlcigpLHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuaHRtbCgiPHRhYmxlPiIrdGhpcy5jb2xHcm91cEh0bWwrIjx0Ym9keS8+PC90YWJsZT4iKSx0aGlzLnRib2R5RWw9dGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbC5maW5kKCJ0Ym9keSIpLHRoaXMuZWwuYXBwZW5kKHRoaXMuYm9keVNjcm9sbGVyLmVsKSx0aGlzLmpvaW5lcj1uZXcgQSgiaG9yaXpvbnRhbCIsW3RoaXMuaGVhZFNjcm9sbGVyLHRoaXMuYm9keVNjcm9sbGVyXSksdGhpcy5oZWFkVGFibGU9dGhpcy5oZWFkRWwuZmluZCgidGFibGUiKSx0aGlzLmhlYWRDb2xFbHM9dGhpcy5oZWFkRWwuZmluZCgiY29sIiksdGhpcy5oZWFkQ2VsbEVscz10aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuY29udGVudEVsLmZpbmQoInRyOmxhc3QtY2hpbGQgdGgiKSx0aGlzLmJvZHlDb2xFbHM9dGhpcy5lbC5maW5kKCJjb2wiKSx0aGlzLmJvZHlUYWJsZT10aGlzLmVsLmZpbmQoInRhYmxlIiksdGhpcy5jb2xNaW5XaWR0aHM9dGhpcy5jb21wdXRlQ29sTWluV2lkdGhzKCksdGhpcy5hcHBseUNvbFdpZHRocygpLHRoaXMuaW5pdENvbFJlc2l6aW5nKCl9LGUucHJvdG90eXBlLnJlbmRlckhlYWRIdG1sPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scyxpLG4sbCx1LGgsYTtmb3IoZT10aGlzLnZpZXcuY29sU3BlY3Mscj0iPHRhYmxlPiIsdD0iPGNvbGdyb3VwPiIsbj0wLHU9ZS5sZW5ndGg7bjx1O24rKylhPWVbbl0sdCs9YS5pc01haW4/Jzxjb2wgY2xhc3M9ImZjLW1haW4tY29sIi8+JzoiPGNvbC8+Ijtmb3IodCs9IjwvY29sZ3JvdXA+Iix0aGlzLmNvbEdyb3VwSHRtbD10LHIrPXQscis9Ijx0Ym9keT4iLHRoaXMudmlldy5zdXBlckhlYWRlclRleHQmJihyKz0nPHRyIGNsYXNzPSJmYy1zdXBlciI+PHRoIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRIZWFkZXJDbGFzcysnIiBjb2xzcGFuPSInK2UubGVuZ3RoKyciPjxkaXYgY2xhc3M9ImZjLWNlbGwtY29udGVudCI+PHNwYW4gY2xhc3M9ImZjLWNlbGwtdGV4dCI+Jyt5dCh0aGlzLnZpZXcuc3VwZXJIZWFkZXJUZXh0KSsiPC9zcGFuPjwvZGl2PjwvdGg+PC90cj4iKSxyKz0iPHRyPiIsaT0hMCxvPWw9MCxoPWUubGVuZ3RoO2w8aDtvPSsrbClhPWVbb10scz1vPT09ZS5sZW5ndGgtMSxyKz0nPHRoIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRIZWFkZXJDbGFzcysnIj48ZGl2PjxkaXYgY2xhc3M9ImZjLWNlbGwtY29udGVudCI+JysoYS5pc01haW4/JzxzcGFuIGNsYXNzPSJmYy1leHBhbmRlci1zcGFjZSI+PHNwYW4gY2xhc3M9ImZjLWljb24iPjwvc3Bhbj48L3NwYW4+JzoiIikrJzxzcGFuIGNsYXNzPSJmYy1jZWxsLXRleHQiPicreXQoYS5sYWJlbFRleHR8fCIiKSsiPC9zcGFuPjwvZGl2PiIrKHM/IiI6JzxkaXYgY2xhc3M9ImZjLWNvbC1yZXNpemVyIj48L2Rpdj4nKSsiPC9kaXY+PC90aD4iO3JldHVybiByKz0iPC90cj4iLHIrPSI8L3Rib2R5PjwvdGFibGU+In0sZS5wcm90b3R5cGUuZ2l2ZW5Db2xXaWR0aHM9bnVsbCxlLnByb3RvdHlwZS5jb2xXaWR0aHM9bnVsbCxlLnByb3RvdHlwZS5jb2xNaW5XaWR0aHM9bnVsbCxlLnByb3RvdHlwZS50YWJsZVdpZHRoPW51bGwsZS5wcm90b3R5cGUudGFibGVNaW5XaWR0aD1udWxsLGUucHJvdG90eXBlLmluaXRDb2xSZXNpemluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhlYWRFbC5maW5kKCJ0aCAuZmMtY29sLXJlc2l6ZXIiKS5lYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihyLG8pe3JldHVybiBvPXQobyksby5vbigibW91c2Vkb3duIixmdW5jdGlvbih0KXtyZXR1cm4gZS5jb2xSZXNpemVNb3VzZWRvd24ocix0LG8pfSl9fSh0aGlzKSl9LGUucHJvdG90eXBlLmNvbFJlc2l6ZU1vdXNlZG93bj1mdW5jdGlvbih0LGUsbyl7dmFyIHMsaSxuLGw7cmV0dXJuIHM9dGhpcy5jb2xXaWR0aHM9dGhpcy5xdWVyeUNvbFdpZHRocygpLHMucG9wKCkscy5wdXNoKG51bGwpLGw9c1t0XSxuPU1hdGgubWluKHRoaXMuY29sTWluV2lkdGhzW3RdLHIpLGk9bmV3IGgoe2RyYWdTdGFydDpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gby5hZGRDbGFzcygiZmMtYWN0aXZlIil9fSh0aGlzKSxkcmFnOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihyLG8pe3ZhciBpO3JldHVybiBpPWwrKGUuaXNSVEw/LXI6ciksaT1NYXRoLm1heChpLG4pLHNbdF09aSxlLmFwcGx5Q29sV2lkdGhzKCl9fSh0aGlzKSxkcmFnRW5kOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBvLnJlbW92ZUNsYXNzKCJmYy1hY3RpdmUiKX19KHRoaXMpfSksaS5zdGFydEludGVyYWN0aW9uKGUpfSxlLnByb3RvdHlwZS5hcHBseUNvbFdpZHRocz1mdW5jdGlvbigpe3ZhciB0LGUscixvLHMsaSxuLGwsdSxoLGEsYyxwLGQsZixnLHk7Zm9yKHI9dGhpcy5jb2xNaW5XaWR0aHMscz10aGlzLmNvbFdpZHRocyx0PSEwLGU9ITEseT0wLGg9MCxwPXMubGVuZ3RoO2g8cDtoKyspbz1zW2hdLCJudW1iZXIiPT10eXBlb2Ygbz95Kz1vOih0PSExLG8mJihlPSEwKSk7Zm9yKGw9ZSYmIXRoaXMudmlldy5pc0hHcm91cGluZz8iYXV0byI6IiIsbj1mdW5jdGlvbigpe3ZhciB0LGUscjtmb3Iocj1bXSx1PXQ9MCxlPXMubGVuZ3RoO3Q8ZTt1PSsrdClvPXNbdV0sci5wdXNoKG51bGwhPW8/bzpsKTtyZXR1cm4gcn0oKSxnPTAsdT1hPTAsZD1uLmxlbmd0aDthPGQ7dT0rK2EpaT1uW3VdLGcrPSJudW1iZXIiPT10eXBlb2YgaT9pOnJbdV07Zm9yKHU9Yz0wLGY9bi5sZW5ndGg7YzxmO3U9KytjKWk9blt1XSx0aGlzLmhlYWRDb2xFbHMuZXEodSkud2lkdGgoaSksdGhpcy5ib2R5Q29sRWxzLmVxKHUpLndpZHRoKGkpO3JldHVybiB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuc2V0TWluV2lkdGgoZyksdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLnNldE1pbldpZHRoKGcpLHRoaXMudGFibGVNaW5XaWR0aD1nLHRoaXMudGFibGVXaWR0aD10P3k6dm9pZCAwfSxlLnByb3RvdHlwZS5jb21wdXRlQ29sTWluV2lkdGhzPWZ1bmN0aW9uKCl7dmFyIHQsZSxvLHMsaSxuO2ZvcihzPXRoaXMuZ2l2ZW5Db2xXaWR0aHMsaT1bXSx0PWU9MCxvPXMubGVuZ3RoO2U8bzt0PSsrZSluPXNbdF0sIm51bWJlciI9PXR5cGVvZiBuP2kucHVzaChuKTppLnB1c2gocGFyc2VJbnQodGhpcy5oZWFkQ29sRWxzLmVxKHQpLmNzcygibWluLXdpZHRoIikpfHxyKTtyZXR1cm4gaX0sZS5wcm90b3R5cGUucXVlcnlDb2xXaWR0aHM9ZnVuY3Rpb24oKXt2YXIgZSxyLG8scyxpO2ZvcihzPXRoaXMuaGVhZENlbGxFbHMsaT1bXSxlPTAscj1zLmxlbmd0aDtlPHI7ZSsrKW89c1tlXSxpLnB1c2godChvKS5vdXRlcldpZHRoKCkpO3JldHVybiBpfSxlLnByb3RvdHlwZS51cGRhdGVXaWR0aD1mdW5jdGlvbigpe2lmKHRoaXMuaGVhZFNjcm9sbGVyLnVwZGF0ZVNpemUoKSx0aGlzLmJvZHlTY3JvbGxlci51cGRhdGVTaXplKCksdGhpcy5qb2luZXIudXBkYXRlKCksdGhpcy5mb2xsb3dlcilyZXR1cm4gdGhpcy5mb2xsb3dlci51cGRhdGUoKX0sZS5wcm90b3R5cGUuaGVhZEhlaWdodD1mdW5jdGlvbigpe3ZhciB0O3JldHVybiB0PXRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuZmluZCgidGFibGUiKSx0LmhlaWdodC5hcHBseSh0LGFyZ3VtZW50cyl9LGV9KCksej1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy52aWV3PWUsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnRySGFzaD17fSx0aGlzLnRycz10KCl9cmV0dXJuIGUucHJvdG90eXBlLnZpZXc9bnVsbCxlLnByb3RvdHlwZS5wYXJlbnQ9bnVsbCxlLnByb3RvdHlwZS5wcmV2U2libGluZz1udWxsLGUucHJvdG90eXBlLmNoaWxkcmVuPW51bGwsZS5wcm90b3R5cGUuZGVwdGg9MCxlLnByb3RvdHlwZS5oYXNPd25Sb3c9ITEsZS5wcm90b3R5cGUudHJIYXNoPW51bGwsZS5wcm90b3R5cGUudHJzPW51bGwsZS5wcm90b3R5cGUuaXNSZW5kZXJlZD0hMSxlLnByb3RvdHlwZS5pc0V4cGFuZGVkPSEwLGUucHJvdG90eXBlLmlzU2hvd249ITEsZS5wcm90b3R5cGUuYWRkQ2hpbGQ9ZnVuY3Rpb24odCxlKXt2YXIgcixvLHMsaSxuO2Zvcih0LnJlbW92ZSgpLHI9dGhpcy5jaGlsZHJlbixudWxsIT1lP3Iuc3BsaWNlKGUsMCx0KTooZT1yLmxlbmd0aCxyLnB1c2godCkpLHQucHJldlNpYmxpbmc9ZT4wP3JbZS0xXTpudWxsLGU8ci5sZW5ndGgtMSYmKHJbZSsxXS5wcmV2U2libGluZz10KSx0LnBhcmVudD10aGlzLHQuZGVwdGg9dGhpcy5kZXB0aCsodGhpcy5oYXNPd25Sb3c/MTowKSxuPXQuZ2V0Tm9kZXMoKSxvPTAscz1uLmxlbmd0aDtvPHM7bysrKWk9bltvXSxpLmFkZGVkKCk7aWYodGhpcy5pc1Nob3duJiZ0aGlzLmlzRXhwYW5kZWQpcmV0dXJuIHQuc2hvdygpfSxlLnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpLG4sbCx1LGgsYTtmb3IoZT10aGlzLmNoaWxkcmVuLG89ITEscj1zPTAsbj1lLmxlbmd0aDtzPG47cj0rK3MpaWYoYT1lW3JdLGE9PT10KXtvPSEwO2JyZWFrfWlmKG8pe2ZvcihyPGUubGVuZ3RoLTEmJihlW3IrMV0ucHJldlNpYmxpbmc9dC5wcmV2U2libGluZyksZS5zcGxpY2UociwxKSx0LnJlY3Vyc2l2ZWx5VW5yZW5kZXIoKSx1PXQuZ2V0Tm9kZXMoKSxpPTAsbD11Lmxlbmd0aDtpPGw7aSsrKWg9dVtpXSxoLnJlbW92ZWQoKTtyZXR1cm4gdC5wYXJlbnQ9bnVsbCx0LnByZXZTaWJsaW5nPW51bGwsdH1yZXR1cm4hMX0sZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGRyZW49ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzLGksbjtmb3IoaT10aGlzLmNoaWxkcmVuLGU9MCxvPWkubGVuZ3RoO2U8bztlKyspdD1pW2VdLHQucmVjdXJzaXZlbHlVbnJlbmRlcigpO2ZvcihuPXRoaXMuZ2V0RGVzY2VuZGFudHMoKSxyPTAscz1uLmxlbmd0aDtyPHM7cisrKXQ9bltyXSx0LnJlbW92ZWQoKTtyZXR1cm4gdGhpcy5jaGlsZHJlbj1bXX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7aWYodGhpcy5wYXJlbnQpcmV0dXJuIHRoaXMucGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpfSxlLnByb3RvdHlwZS5nZXRMYXN0Q2hpbGQ9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdD10aGlzLmNoaWxkcmVuLHRbdC5sZW5ndGgtMV19LGUucHJvdG90eXBlLmdldFByZXZSb3c9ZnVuY3Rpb24oKXt2YXIgdCxlO2ZvcihlPXRoaXM7ZTspe2lmKGUucHJldlNpYmxpbmcpZm9yKGU9ZS5wcmV2U2libGluZzt0PWUuZ2V0TGFzdENoaWxkKCk7KWU9dDtlbHNlIGU9ZS5wYXJlbnQ7aWYoZSYmZS5oYXNPd25Sb3cmJmUuaXNTaG93bilyZXR1cm4gZX1yZXR1cm4gbnVsbH0sZS5wcm90b3R5cGUuZ2V0TGVhZGluZ1Jvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhhc093blJvdz90aGlzOnRoaXMuaXNFeHBhbmRlZCYmdGhpcy5jaGlsZHJlbi5sZW5ndGg/dGhpcy5jaGlsZHJlblswXS5nZXRMZWFkaW5nUm93KCk6dm9pZCAwfSxlLnByb3RvdHlwZS5nZXRSb3dzPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzO2ZvcihudWxsPT10JiYodD1bXSksdGhpcy5oYXNPd25Sb3cmJnQucHVzaCh0aGlzKSxzPXRoaXMuY2hpbGRyZW4scj0wLG89cy5sZW5ndGg7cjxvO3IrKyllPXNbcl0sZS5nZXRSb3dzKHQpO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXROb2Rlcz1mdW5jdGlvbih0KXt2YXIgZSxyLG8scztmb3IobnVsbD09dCYmKHQ9W10pLHQucHVzaCh0aGlzKSxzPXRoaXMuY2hpbGRyZW4scj0wLG89cy5sZW5ndGg7cjxvO3IrKyllPXNbcl0sZS5nZXROb2Rlcyh0KTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0RGVzY2VuZGFudHM9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzO2Zvcih0PVtdLHM9dGhpcy5jaGlsZHJlbixyPTAsbz1zLmxlbmd0aDtyPG87cisrKWU9c1tyXSxlLmdldE5vZGVzKHQpO3JldHVybiB0fSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZSxyLG8scyxpLG4sbDtpZih0aGlzLnRySGFzaD17fSxuPVtdLHRoaXMuaGFzT3duUm93KXtlPXRoaXMuZ2V0UHJldlJvdygpLHI9dGhpcy52aWV3LnRib2R5SGFzaDtmb3IobCBpbiByKXM9cltsXSxpPXQoIjx0ci8+IiksdGhpcy50ckhhc2hbbF09aSxuLnB1c2goaVswXSksbz0icmVuZGVyIitLKGwpKyJDb250ZW50Iix0aGlzW29dJiZ0aGlzW29dKGkpLGU/ZS50ckhhc2hbbF0uYWZ0ZXIoaSk6cy5wcmVwZW5kKGkpfXJldHVybiB0aGlzLnRycz10KG4pLm9uKCJjbGljayIsIi5mYy1leHBhbmRlciIsTXQodGhpcywidG9nZ2xlRXhwYW5kZWQiKSksdGhpcy5pc1JlbmRlcmVkPSEwfSxlLnByb3RvdHlwZS51bnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlLHIsbyxzO2lmKHRoaXMuaXNSZW5kZXJlZCl7ZT10aGlzLnRySGFzaDtmb3IobyBpbiBlKXI9ZVtvXSxzPSJ1bnJlbmRlciIrSyhvKSsiQ29udGVudCIsdGhpc1tzXSYmdGhpc1tzXShyKTtyZXR1cm4gdGhpcy50ckhhc2g9e30sdGhpcy50cnMucmVtb3ZlKCksdGhpcy50cnM9dCgpLHRoaXMuaXNSZW5kZXJlZD0hMSx0aGlzLmlzU2hvd249ITEsdGhpcy5oaWRkZW4oKX19LGUucHJvdG90eXBlLnJlY3Vyc2l2ZWx5VW5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzO2Zvcih0aGlzLnVucmVuZGVyKCksbz10aGlzLmNoaWxkcmVuLHM9W10sZT0wLHI9by5sZW5ndGg7ZTxyO2UrKyl0PW9bZV0scy5wdXNoKHQucmVjdXJzaXZlbHlVbnJlbmRlcigpKTtyZXR1cm4gc30sZS5wcm90b3R5cGUuZ2V0VHI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudHJIYXNoW3RdfSxlLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztpZighdGhpcy5pc1Nob3duJiYodGhpcy5pc1JlbmRlcmVkP3RoaXMudHJzLmNzcygiZGlzcGxheSIsIiIpOnRoaXMucmVuZGVyKCksdGhpcy5lbnN1cmVTZWdzUmVuZGVyZWQmJnRoaXMuZW5zdXJlU2Vnc1JlbmRlcmVkKCksdGhpcy5pc0V4cGFuZGVkP3RoaXMuaW5kaWNhdGVFeHBhbmRlZCgpOnRoaXMuaW5kaWNhdGVDb2xsYXBzZWQoKSx0aGlzLmlzU2hvd249ITAsdGhpcy5zaG93bigpLHRoaXMuaXNFeHBhbmRlZCkpe2ZvcihvPXRoaXMuY2hpbGRyZW4scz1bXSxlPTAscj1vLmxlbmd0aDtlPHI7ZSsrKXQ9b1tlXSxzLnB1c2godC5zaG93KCkpO3JldHVybiBzfX0sZS5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3ZhciB0LGUscixvLHM7aWYodGhpcy5pc1Nob3duJiYodGhpcy5pc1JlbmRlcmVkJiZ0aGlzLnRycy5oaWRlKCksdGhpcy5pc1Nob3duPSExLHRoaXMuaGlkZGVuKCksdGhpcy5pc0V4cGFuZGVkKSl7Zm9yKG89dGhpcy5jaGlsZHJlbixzPVtdLGU9MCxyPW8ubGVuZ3RoO2U8cjtlKyspdD1vW2VdLHMucHVzaCh0LmhpZGUoKSk7cmV0dXJuIHN9fSxlLnByb3RvdHlwZS5leHBhbmQ9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbztpZighdGhpcy5pc0V4cGFuZGVkKXtmb3IodGhpcy5pc0V4cGFuZGVkPSEwLHRoaXMuaW5kaWNhdGVFeHBhbmRlZCgpLHRoaXMudmlldy5iYXRjaFJvd3MoKSxvPXRoaXMuY2hpbGRyZW4sZT0wLHI9by5sZW5ndGg7ZTxyO2UrKyl0PW9bZV0sdC5zaG93KCk7cmV0dXJuIHRoaXMudmlldy51bmJhdGNoUm93cygpLHRoaXMuYW5pbWF0ZUV4cGFuZCgpfX0sZS5wcm90b3R5cGUuY29sbGFwc2U9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbztpZih0aGlzLmlzRXhwYW5kZWQpe2Zvcih0aGlzLmlzRXhwYW5kZWQ9ITEsdGhpcy5pbmRpY2F0ZUNvbGxhcHNlZCgpLHRoaXMudmlldy5iYXRjaFJvd3MoKSxvPXRoaXMuY2hpbGRyZW4sZT0wLHI9by5sZW5ndGg7ZTxyO2UrKyl0PW9bZV0sdC5oaWRlKCk7cmV0dXJuIHRoaXMudmlldy51bmJhdGNoUm93cygpfX0sZS5wcm90b3R5cGUudG9nZ2xlRXhwYW5kZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0V4cGFuZGVkP3RoaXMuY29sbGFwc2UoKTp0aGlzLmV4cGFuZCgpfSxlLnByb3RvdHlwZS5pbmRpY2F0ZUV4cGFuZGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJzLmZpbmQoIi5mYy1leHBhbmRlciAuZmMtaWNvbiIpLnJlbW92ZUNsYXNzKHRoaXMuZ2V0Q29sbGFwc2VkSWNvbigpKS5hZGRDbGFzcyh0aGlzLmdldEV4cGFuZGVkSWNvbigpKX0sZS5wcm90b3R5cGUuaW5kaWNhdGVDb2xsYXBzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cnMuZmluZCgiLmZjLWV4cGFuZGVyIC5mYy1pY29uIikucmVtb3ZlQ2xhc3ModGhpcy5nZXRFeHBhbmRlZEljb24oKSkuYWRkQ2xhc3ModGhpcy5nZXRDb2xsYXBzZWRJY29uKCkpfSxlLnByb3RvdHlwZS5lbmFibGVFeHBhbmRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cnMuZmluZCgiLmZjLWV4cGFuZGVyLXNwYWNlIikuYWRkQ2xhc3MoImZjLWV4cGFuZGVyIil9LGUucHJvdG90eXBlLmRpc2FibGVFeHBhbmRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cnMuZmluZCgiLmZjLWV4cGFuZGVyLXNwYWNlIikucmVtb3ZlQ2xhc3MoImZjLWV4cGFuZGVyIikuZmluZCgiLmZjLWljb24iKS5yZW1vdmVDbGFzcyh0aGlzLmdldEV4cGFuZGVkSWNvbigpKS5yZW1vdmVDbGFzcyh0aGlzLmdldENvbGxhcHNlZEljb24oKSl9LGUucHJvdG90eXBlLmdldEV4cGFuZGVkSWNvbj1mdW5jdGlvbigpe3JldHVybiJmYy1pY29uLWRvd24tdHJpYW5nbGUifSxlLnByb3RvdHlwZS5nZXRDb2xsYXBzZWRJY29uPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHQ9dGhpcy52aWV3LmlzUlRMPyJsZWZ0IjoicmlnaHQiLCJmYy1pY29uLSIrdCsiLXRyaWFuZ2xlIn0sZS5wcm90b3R5cGUuYW5pbWF0ZUV4cGFuZD1mdW5jdGlvbigpe3ZhciB0LGUscjtpZihyPW51bGwhPSh0PXRoaXMuY2hpbGRyZW5bMF0pJiZudWxsIT0oZT10LmdldExlYWRpbmdSb3coKSk/ZS50cnM6dm9pZCAwKXJldHVybiByLmFkZENsYXNzKCJmYy1jb2xsYXBzZWQiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHIuYWRkQ2xhc3MoImZjLXRyYW5zaXRpb25pbmciKSxyLnJlbW92ZUNsYXNzKCJmYy1jb2xsYXBzZWQiKX0pLHIub25lKCJ3ZWJraXRUcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kIG9UcmFuc2l0aW9uRW5kIG1zVHJhbnNpdGlvbkVuZCB0cmFuc2l0aW9uZW5kIixmdW5jdGlvbigpe3JldHVybiByLnJlbW92ZUNsYXNzKCJmYy10cmFuc2l0aW9uaW5nIil9KX0sZS5wcm90b3R5cGUuZ2V0TWF4VHJJbm5lckhlaWdodD1mdW5jdGlvbigpe3ZhciBlO3JldHVybiBlPTAsdC5lYWNoKHRoaXMudHJIYXNoLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0LHIpe3ZhciBvO3JldHVybiBvPWN0KHIpLmZpbmQoIj4gZGl2Om5vdCguZmMtY2VsbC1jb250ZW50KTpmaXJzdCIpLGU9TWF0aC5tYXgoby5oZWlnaHQoKSxlKX19KHRoaXMpKSxlfSxlLnByb3RvdHlwZS5zZXRUcklubmVySGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiB0LmVhY2godGhpcy50ckhhc2gsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQscil7cmV0dXJuIGN0KHIpLmZpbmQoIj4gZGl2Om5vdCguZmMtY2VsbC1jb250ZW50KTpmaXJzdCIpLmhlaWdodChlKX19KHRoaXMpKX0sZS5wcm90b3R5cGUuc2hvd249ZnVuY3Rpb24oKXtpZih0aGlzLmhhc093blJvdylyZXR1cm4gdGhpcy5yb3dTaG93bih0aGlzKX0sZS5wcm90b3R5cGUuaGlkZGVuPWZ1bmN0aW9uKCl7aWYodGhpcy5oYXNPd25Sb3cpcmV0dXJuIHRoaXMucm93SGlkZGVuKHRoaXMpfSxlLnByb3RvdHlwZS5yb3dTaG93bj1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5wYXJlbnR8fHRoaXMudmlldykucm93U2hvd24odCl9LGUucHJvdG90eXBlLnJvd0hpZGRlbj1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5wYXJlbnR8fHRoaXMudmlldykucm93SGlkZGVuKHQpfSxlLnByb3RvdHlwZS5hZGRlZD1mdW5jdGlvbigpe2lmKHRoaXMuaGFzT3duUm93KXJldHVybiB0aGlzLnJvd0FkZGVkKHRoaXMpfSxlLnByb3RvdHlwZS5yZW1vdmVkPWZ1bmN0aW9uKCl7aWYodGhpcy5oYXNPd25Sb3cpcmV0dXJuIHRoaXMucm93UmVtb3ZlZCh0aGlzKX0sZS5wcm90b3R5cGUucm93QWRkZWQ9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMucGFyZW50fHx0aGlzLnZpZXcpLnJvd0FkZGVkKHQpfSxlLnByb3RvdHlwZS5yb3dSZW1vdmVkPWZ1bmN0aW9uKHQpe3JldHVybih0aGlzLnBhcmVudHx8dGhpcy52aWV3KS5yb3dSZW1vdmVkKHQpfSxlfSgpLEw9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gcih0LGUsbyl7dGhpcy5ncm91cFNwZWM9ZSx0aGlzLmdyb3VwVmFsdWU9byxyLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIE90KHIsZSksci5wcm90b3R5cGUuZ3JvdXBTcGVjPW51bGwsci5wcm90b3R5cGUuZ3JvdXBWYWx1ZT1udWxsLHIucHJvdG90eXBlLnJvd1JlbW92ZWQ9ZnVuY3Rpb24odCl7aWYoci5fX3N1cGVyX18ucm93UmVtb3ZlZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdCE9PXRoaXMmJiF0aGlzLmNoaWxkcmVuLmxlbmd0aClyZXR1cm4gdGhpcy5yZW1vdmUoKX0sci5wcm90b3R5cGUucmVuZGVyR3JvdXBDb250ZW50RWw9ZnVuY3Rpb24oKXt2YXIgZSxyO3JldHVybiBlPXQoJzxkaXYgY2xhc3M9ImZjLWNlbGwtY29udGVudCIgLz4nKS5hcHBlbmQodGhpcy5yZW5kZXJHcm91cFRleHRFbCgpKSxyPXRoaXMuZ3JvdXBTcGVjLnJlbmRlciwiZnVuY3Rpb24iPT10eXBlb2YgciYmKGU9cihlLHRoaXMuZ3JvdXBWYWx1ZSl8fGUpLGV9LHIucHJvdG90eXBlLnJlbmRlckdyb3VwVGV4dEVsPWZ1bmN0aW9uKCl7dmFyIGUscjtyZXR1cm4gcj10aGlzLmdyb3VwVmFsdWV8fCIiLGU9dGhpcy5ncm91cFNwZWMudGV4dCwiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZShyKXx8ciksdCgnPHNwYW4gY2xhc3M9ImZjLWNlbGwtdGV4dCIgLz4nKS50ZXh0KHIpfSxyfSh6KSxnPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChyLGUpLHIucHJvdG90eXBlLmhhc093blJvdz0hMCxyLnByb3RvdHlwZS5yZW5kZXJTcHJlYWRzaGVldENvbnRlbnQ9ZnVuY3Rpb24oZSl7dmFyIHI7cmV0dXJuIHI9dGhpcy5yZW5kZXJHcm91cENvbnRlbnRFbCgpLHIucHJlcGVuZCgnPHNwYW4gY2xhc3M9ImZjLWV4cGFuZGVyIj48c3BhbiBjbGFzcz0iZmMtaWNvbiI+PC9zcGFuPjwvc3Bhbj4nKSx0KCc8dGQgY2xhc3M9ImZjLWRpdmlkZXIiIC8+JykuYXR0cigiY29sc3BhbiIsdGhpcy52aWV3LmNvbFNwZWNzLmxlbmd0aCkuYXBwZW5kKHQoIjxkaXYvPiIpLmFwcGVuZChyKSkuYXBwZW5kVG8oZSl9LHIucHJvdG90eXBlLnJlbmRlckV2ZW50Q29udGVudD1mdW5jdGlvbih0KXtyZXR1cm4gdC5hcHBlbmQoJzx0ZCBjbGFzcz0iZmMtZGl2aWRlciI+IDxkaXYvPiA8L3RkPicpfSxyfShMKSxVPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChyLGUpLHIucHJvdG90eXBlLnJvd3NwYW49MCxyLnByb3RvdHlwZS5sZWFkaW5nVHI9bnVsbCxyLnByb3RvdHlwZS5ncm91cFRkPW51bGwsci5wcm90b3R5cGUucm93U2hvd249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucm93c3Bhbis9MSx0aGlzLnJlbmRlclJvd3NwYW4oKSxyLl9fc3VwZXJfXy5yb3dTaG93bi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLnJvd0hpZGRlbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yb3dzcGFuLT0xLHRoaXMucmVuZGVyUm93c3BhbigpLHIuX19zdXBlcl9fLnJvd0hpZGRlbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLnJlbmRlclJvd3NwYW49ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gdGhpcy5yb3dzcGFuPyh0aGlzLmdyb3VwVGR8fCh0aGlzLmdyb3VwVGQ9dCgnPHRkIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRDb250ZW50Q2xhc3MrJyIvPicpLmFwcGVuZCh0aGlzLnJlbmRlckdyb3VwQ29udGVudEVsKCkpKSx0aGlzLmdyb3VwVGQuYXR0cigicm93c3BhbiIsdGhpcy5yb3dzcGFuKSxlPXRoaXMuZ2V0TGVhZGluZ1JvdygpLmdldFRyKCJzcHJlYWRzaGVldCIpLGUhPT10aGlzLmxlYWRpbmdUcj8oZSYmZS5wcmVwZW5kKHRoaXMuZ3JvdXBUZCksdGhpcy5sZWFkaW5nVHI9ZSk6dm9pZCAwKToodGhpcy5ncm91cFRkJiYodGhpcy5ncm91cFRkLnJlbW92ZSgpLHRoaXMuZ3JvdXBUZD1udWxsKSx0aGlzLmxlYWRpbmdUcj1udWxsKX0scn0oTCkscD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIGUuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gT3QoZSx0KSxlLnByb3RvdHlwZS5oYXNPd25Sb3c9ITAsZS5wcm90b3R5cGUuc2VnQ29udGFpbmVyRWw9bnVsbCxlLnByb3RvdHlwZS5zZWdDb250YWluZXJIZWlnaHQ9bnVsbCxlLnByb3RvdHlwZS5pbm5lckVsPW51bGwsZS5wcm90b3R5cGUuYmdTZWdDb250YWluZXJFbD1udWxsLGUucHJvdG90eXBlLmlzU2Vnc1JlbmRlcmVkPSExLGUucHJvdG90eXBlLmlzQnVzaW5lc3NIb3VyU2Vnc1JlbmRlcmVkPSExLGUucHJvdG90eXBlLmJ1c2luZXNzSG91clNlZ3M9bnVsbCxlLnByb3RvdHlwZS5iZ1NlZ3M9bnVsbCxlLnByb3RvdHlwZS5mZ1NlZ3M9bnVsbCxlLnByb3RvdHlwZS5yZW5kZXJFdmVudENvbnRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaHRtbCgnPHRkIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRDb250ZW50Q2xhc3MrJyI+IDxkaXY+IDxkaXYgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciIgLz4gPC9kaXY+IDwvdGQ+JyksdGhpcy5zZWdDb250YWluZXJFbD10LmZpbmQoIi5mYy1ldmVudC1jb250YWluZXIiKSx0aGlzLmlubmVyRWw9dGhpcy5iZ1NlZ0NvbnRhaW5lckVsPXQuZmluZCgidGQgPiBkaXYiKSx0aGlzLmVuc3VyZVNlZ3NSZW5kZXJlZCgpfSxlLnByb3RvdHlwZS5lbnN1cmVTZWdzUmVuZGVyZWQ9ZnVuY3Rpb24oKXtpZighdGhpcy5pc1NlZ3NSZW5kZXJlZClyZXR1cm4gdGhpcy5lbnN1cmVCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQoKSx0aGlzLmJnU2VncyYmdGhpcy52aWV3LnRpbWVHcmlkLnJlbmRlckZpbGxJbkNvbnRhaW5lcigiYmdFdmVudCIsdGhpcyx0aGlzLmJnU2VncyksdGhpcy5mZ1NlZ3MmJnRoaXMudmlldy50aW1lR3JpZC5yZW5kZXJGZ1NlZ3NJbkNvbnRhaW5lcnMoW1t0aGlzLHRoaXMuZmdTZWdzXV0pLHRoaXMuaXNTZWdzUmVuZGVyZWQ9ITB9LGUucHJvdG90eXBlLmVuc3VyZUJ1c2luZXNzSG91clNlZ3NSZW5kZXJlZD1mdW5jdGlvbigpe2lmKHRoaXMuYnVzaW5lc3NIb3VyU2VncyYmIXRoaXMuaXNCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQpcmV0dXJuIHRoaXMudmlldy50aW1lR3JpZC5yZW5kZXJGaWxsSW5Db250YWluZXIoImJ1c2luZXNzSG91cnMiLHRoaXMsdGhpcy5idXNpbmVzc0hvdXJTZWdzLCJiZ2V2ZW50IiksdGhpcy5pc0J1c2luZXNzSG91clNlZ3NSZW5kZXJlZD0hMH0sZS5wcm90b3R5cGUudW5yZW5kZXJFdmVudENvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGVhckJ1c2luZXNzSG91clNlZ3MoKSx0aGlzLmJnU2Vncz1udWxsLHRoaXMuZmdTZWdzPW51bGwsdGhpcy5pc1NlZ3NSZW5kZXJlZD0hMX0sZS5wcm90b3R5cGUuY2xlYXJCdXNpbmVzc0hvdXJTZWdzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG87aWYodGhpcy5idXNpbmVzc0hvdXJTZWdzKXtmb3Iocj10aGlzLmJ1c2luZXNzSG91clNlZ3MsdD0wLGU9ci5sZW5ndGg7dDxlO3QrKylvPXJbdF0sby5lbCYmby5lbC5yZW1vdmUoKTt0aGlzLmJ1c2luZXNzSG91clNlZ3M9bnVsbH1yZXR1cm4gdGhpcy5pc0J1c2luZXNzSG91clNlZ3NSZW5kZXJlZD0hMX0sZX0oeiksQj1mdW5jdGlvbihlKXtmdW5jdGlvbiByKHQsZSl7dGhpcy5yZXNvdXJjZT1lLHIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gT3QocixlKSxyLnByb3RvdHlwZS5yZXNvdXJjZT1udWxsLHIucHJvdG90eXBlLnJvd0FkZGVkPWZ1bmN0aW9uKHQpe2lmKHIuX19zdXBlcl9fLnJvd0FkZGVkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0IT09dGhpcyYmdGhpcy5pc1JlbmRlcmVkJiYxPT09dGhpcy5jaGlsZHJlbi5sZW5ndGgpcmV0dXJuIHRoaXMuZW5hYmxlRXhwYW5kaW5nKCksdGhpcy5pc0V4cGFuZGVkP3RoaXMuaW5kaWNhdGVFeHBhbmRlZCgpOnRoaXMuaW5kaWNhdGVDb2xsYXBzZWQoKX0sci5wcm90b3R5cGUucm93UmVtb3ZlZD1mdW5jdGlvbih0KXtpZihyLl9fc3VwZXJfXy5yb3dSZW1vdmVkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0IT09dGhpcyYmdGhpcy5pc1JlbmRlcmVkJiYhdGhpcy5jaGlsZHJlbi5sZW5ndGgpcmV0dXJuIHRoaXMuZGlzYWJsZUV4cGFuZGluZygpfSxyLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gci5fX3N1cGVyX18ucmVuZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmNoaWxkcmVuLmxlbmd0aD4wP3RoaXMuZW5hYmxlRXhwYW5kaW5nKCk6dGhpcy5kaXNhYmxlRXhwYW5kaW5nKCksdGhpcy52aWV3LnRyaWdnZXIoInJlc291cmNlUmVuZGVyIix0aGlzLnJlc291cmNlLHRoaXMucmVzb3VyY2UsdGhpcy5nZXRUcigic3ByZWFkc2hlZXQiKS5maW5kKCI+IHRkIiksdGhpcy5nZXRUcigiZXZlbnQiKS5maW5kKCI+IHRkIikpfSxyLnByb3RvdHlwZS5yZW5kZXJFdmVudENvbnRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHIuX19zdXBlcl9fLnJlbmRlckV2ZW50Q29udGVudC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC5hdHRyKCJkYXRhLXJlc291cmNlLWlkIix0aGlzLnJlc291cmNlLmlkKX0sci5wcm90b3R5cGUucmVuZGVyU3ByZWFkc2hlZXRDb250ZW50PWZ1bmN0aW9uKGUpe3ZhciByLG8scyxpLG4sbCx1LGgsYTtmb3IodT10aGlzLnJlc291cmNlLGw9dGhpcy52aWV3LmNvbFNwZWNzLGk9MCxuPWwubGVuZ3RoO2k8bjtpKyspcj1sW2ldLHIuZ3JvdXB8fChzPXIuZmllbGQ/dVtyLmZpZWxkXXx8bnVsbDp1LGE9ImZ1bmN0aW9uIj09dHlwZW9mIHIudGV4dD9yLnRleHQodSxzKTpzLG89dCgnPGRpdiBjbGFzcz0iZmMtY2VsbC1jb250ZW50Ij4nKyhyLmlzTWFpbj90aGlzLnJlbmRlckd1dHRlckh0bWwoKToiIikrJzxzcGFuIGNsYXNzPSJmYy1jZWxsLXRleHQiPicrKGE/eXQoYSk6IiZuYnNwOyIpKyI8L3NwYW4+PC9kaXY+IiksImZ1bmN0aW9uIj09dHlwZW9mIHIucmVuZGVyJiYobz1yLnJlbmRlcih1LG8scyl8fG8pLGg9dCgnPHRkIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRDb250ZW50Q2xhc3MrJyIvPicpLmFwcGVuZChvKSxyLmlzTWFpbiYmaC53cmFwSW5uZXIoIjxkaXYvPiIpLGUuYXBwZW5kKGgpKTtyZXR1cm4gZS5hdHRyKCJkYXRhLXJlc291cmNlLWlkIix1LmlkKX0sci5wcm90b3R5cGUucmVuZGVyR3V0dGVySHRtbD1mdW5jdGlvbigpe3ZhciB0LGUscixvO2Zvcih0PSIiLGU9cj0wLG89dGhpcy5kZXB0aDtyPG87ZT1yKz0xKXQrPSc8c3BhbiBjbGFzcz0iZmMtaWNvbiIvPic7cmV0dXJuIHQrPSc8c3BhbiBjbGFzcz0iZmMtZXhwYW5kZXItc3BhY2UiPjxzcGFuIGNsYXNzPSJmYy1pY29uIj48L3NwYW4+PC9zcGFuPid9LHJ9KHApLGQudmlld3MudGltZWxpbmUucmVzb3VyY2VDbGFzcz1NLEU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBlLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIE90KGUsdCksZS5taXhpbihXKSxlLnByb3RvdHlwZS50aW1lR3JpZENsYXNzPUYsZS5wcm90b3R5cGUuZGF5R3JpZENsYXNzPVQsZS5wcm90b3R5cGUucmVuZGVySGVhZD1mdW5jdGlvbigpe3JldHVybiBlLl9fc3VwZXJfXy5yZW5kZXJIZWFkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnRpbWVHcmlkLnByb2Nlc3NIZWFkUmVzb3VyY2VFbHModGhpcy5oZWFkQ29udGFpbmVyRWwpfSxlLnByb3RvdHlwZS5zZXRSZXNvdXJjZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGltZUdyaWQuc2V0UmVzb3VyY2VzKHQpLHRoaXMuZGF5R3JpZCYmdGhpcy5kYXlHcmlkLnNldFJlc291cmNlcyh0KSx0aGlzLmNsZWFyVmlldygpLHRoaXMuZGlzcGxheVZpZXcoKX0sZS5wcm90b3R5cGUudW5zZXRSZXNvdXJjZXM9ZnVuY3Rpb24odCl7aWYodGhpcy5jbGVhckV2ZW50cygpLHRoaXMudGltZUdyaWQudW5zZXRSZXNvdXJjZXMoKSx0aGlzLmRheUdyaWQmJnRoaXMuZGF5R3JpZC51bnNldFJlc291cmNlcygpLCF0KXJldHVybiB0aGlzLmNsZWFyVmlldygpLHRoaXMuZGlzcGxheVZpZXcoKX0sZX0oZC5BZ2VuZGFWaWV3KSxkLnZpZXdzLmFnZW5kYS5xdWVyeVJlc291cmNlQ2xhc3M9ZnVuY3Rpb24odCl7dmFyIGU7aWYobnVsbCE9KGU9dC5vcHRpb25zLmdyb3VwQnlSZXNvdXJjZXx8dC5vcHRpb25zLmdyb3VwQnlEYXRlQW5kUmVzb3VyY2UpP2U6MT09PXQuZHVyYXRpb24uYXMoImRheXMiKSlyZXR1cm4gRX0sSD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIGUuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gT3QoZSx0KSxlLm1peGluKFcpLGUucHJvdG90eXBlLmRheUdyaWRDbGFzcz1ULGUucHJvdG90eXBlLnJlbmRlckhlYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZS5fX3N1cGVyX18ucmVuZGVySGVhZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5kYXlHcmlkLnByb2Nlc3NIZWFkUmVzb3VyY2VFbHModGhpcy5oZWFkQ29udGFpbmVyRWwpfSxlLnByb3RvdHlwZS5zZXRSZXNvdXJjZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF5R3JpZC5zZXRSZXNvdXJjZXModCksdGhpcy5jbGVhclZpZXcoKSx0aGlzLmRpc3BsYXlWaWV3KCl9LGUucHJvdG90eXBlLnVuc2V0UmVzb3VyY2VzPWZ1bmN0aW9uKHQpe2lmKHRoaXMuY2xlYXJFdmVudHMoKSx0aGlzLmRheUdyaWQudW5zZXRSZXNvdXJjZXMoKSwhdClyZXR1cm4gdGhpcy5jbGVhclZpZXcoKSx0aGlzLmRpc3BsYXlWaWV3KCl9LGV9KGQuQmFzaWNWaWV3KSx4PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gZS5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChlLHQpLGUubWl4aW4oVyksZS5wcm90b3R5cGUuZGF5R3JpZENsYXNzPVQsZS5wcm90b3R5cGUucmVuZGVySGVhZD1mdW5jdGlvbigpe3JldHVybiBlLl9fc3VwZXJfXy5yZW5kZXJIZWFkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmRheUdyaWQucHJvY2Vzc0hlYWRSZXNvdXJjZUVscyh0aGlzLmhlYWRDb250YWluZXJFbCl9LGUucHJvdG90eXBlLnNldFJlc291cmNlcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kYXlHcmlkLnNldFJlc291cmNlcyh0KSx0aGlzLmNsZWFyVmlldygpLHRoaXMuZGlzcGxheVZpZXcoKX0sZS5wcm90b3R5cGUudW5zZXRSZXNvdXJjZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGVhckV2ZW50cygpLHRoaXMuZGF5R3JpZC51bnNldFJlc291cmNlcygpLHRoaXMuY2xlYXJWaWV3KCksdGhpcy5kaXNwbGF5VmlldygpfSxlfShkLk1vbnRoVmlldyksZC52aWV3cy5iYXNpYy5xdWVyeVJlc291cmNlQ2xhc3M9ZnVuY3Rpb24odCl7dmFyIGU7aWYobnVsbCE9KGU9dC5vcHRpb25zLmdyb3VwQnlSZXNvdXJjZXx8dC5vcHRpb25zLmdyb3VwQnlEYXRlQW5kUmVzb3VyY2UpP2U6MT09PXQuZHVyYXRpb24uYXMoImRheXMiKSlyZXR1cm4gSH0sZC52aWV3cy5tb250aC5xdWVyeVJlc291cmNlQ2xhc3M9ZnVuY3Rpb24odCl7aWYodC5vcHRpb25zLmdyb3VwQnlSZXNvdXJjZXx8dC5vcHRpb25zLmdyb3VwQnlEYXRlQW5kUmVzb3VyY2UpcmV0dXJuIHg7Cn0sQz0iMjAxNi0wOS0wNCIsWT17eWVhcnM6MSx3ZWVrczoxfSx5PSJodHRwOi8vZnVsbGNhbGVuZGFyLmlvL3NjaGVkdWxlci9saWNlbnNlLyIsYj1bIkdQTC1NeS1Qcm9qZWN0LUlzLU9wZW4tU291cmNlIiwiQ0MtQXR0cmlidXRpb24tTm9uQ29tbWVyY2lhbC1Ob0Rlcml2YXRpdmVzIl0sR3Q9ZnVuY3Rpb24odCxlKXtpZighbXQod2luZG93LmxvY2F0aW9uLmhyZWYpJiYhUnQodCkmJiFzdChlKSlyZXR1cm4gV3QoJ1BsZWFzZSB1c2UgYSB2YWxpZCBsaWNlbnNlIGtleS4gPGEgaHJlZj0iJyt5KyciPk1vcmUgSW5mbzwvYT4nLGUpfSxSdD1mdW5jdGlvbihyKXt2YXIgbyxzLGksbjtyZXR1cm4gdC5pbkFycmF5KHIsYikhPT0tMXx8KHM9KHJ8fCIiKS5tYXRjaCgvXihcZCspXC1mY3NcLShcZCspJC8pLCEhKHMmJjEwPT09c1sxXS5sZW5ndGgmJihpPWUudXRjKDFlMypwYXJzZUludChzWzJdKSksbj1lLnV0YyhkLm1vY2tTY2hlZHVsZXJSZWxlYXNlRGF0ZXx8Qyksbi5pc1ZhbGlkKCkmJihvPW4uY2xvbmUoKS5zdWJ0cmFjdChZKSxpLmlzQWZ0ZXIobykpKSkpfSxtdD1mdW5jdGlvbih0KXtyZXR1cm4gQm9vbGVhbih0Lm1hdGNoKC9cdytcOlwvXC9mdWxsY2FsZW5kYXJcLmlvXC98XC9kZW1vc1wvW1x3LV0rXC5odG1sJC8pKX0sV3Q9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gci5hcHBlbmQodCgnPGRpdiBjbGFzcz0iZmMtbGljZW5zZS1tZXNzYWdlIiAvPicpLmh0bWwoZSkpfSx2b2lkKHN0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmZpbmQoIi5mYy1saWNlbnNlLW1lc3NhZ2UiKS5sZW5ndGg+PTF9KSl9KTs=
Ly8hIG1vbWVudC5qcwovLyEgdmVyc2lvbiA6IDIuMTMuMAovLyEgYXV0aG9ycyA6IFRpbSBXb29kLCBJc2tyZW4gQ2hlcm5ldiwgTW9tZW50LmpzIGNvbnRyaWJ1dG9ycwovLyEgbGljZW5zZSA6IE1JVAovLyEgbW9tZW50anMuY29tCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9YigpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGIpOmEubW9tZW50PWIoKX0odGhpcyxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKCl7cmV0dXJuIGZkLmFwcGx5KG51bGwsYXJndW1lbnRzKX1mdW5jdGlvbiBiKGEpe2ZkPWF9ZnVuY3Rpb24gYyhhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIEFycmF5fHwiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpfWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBEYXRlfHwiW29iamVjdCBEYXRlXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSl9ZnVuY3Rpb24gZShhLGIpe3ZhciBjLGQ9W107Zm9yKGM9MDtjPGEubGVuZ3RoOysrYylkLnB1c2goYihhW2NdLGMpKTtyZXR1cm4gZH1mdW5jdGlvbiBmKGEsYil7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGIpfWZ1bmN0aW9uIGcoYSxiKXtmb3IodmFyIGMgaW4gYilmKGIsYykmJihhW2NdPWJbY10pO3JldHVybiBmKGIsInRvU3RyaW5nIikmJihhLnRvU3RyaW5nPWIudG9TdHJpbmcpLGYoYiwidmFsdWVPZiIpJiYoYS52YWx1ZU9mPWIudmFsdWVPZiksYX1mdW5jdGlvbiBoKGEsYixjLGQpe3JldHVybiBKYShhLGIsYyxkLCEwKS51dGMoKX1mdW5jdGlvbiBpKCl7cmV0dXJue2VtcHR5OiExLHVudXNlZFRva2VuczpbXSx1bnVzZWRJbnB1dDpbXSxvdmVyZmxvdzotMixjaGFyc0xlZnRPdmVyOjAsbnVsbElucHV0OiExLGludmFsaWRNb250aDpudWxsLGludmFsaWRGb3JtYXQ6ITEsdXNlckludmFsaWRhdGVkOiExLGlzbzohMSxwYXJzZWREYXRlUGFydHM6W10sbWVyaWRpZW06bnVsbH19ZnVuY3Rpb24gaihhKXtyZXR1cm4gbnVsbD09YS5fcGYmJihhLl9wZj1pKCkpLGEuX3BmfWZ1bmN0aW9uIGsoYSl7aWYobnVsbD09YS5faXNWYWxpZCl7dmFyIGI9aihhKSxjPWdkLmNhbGwoYi5wYXJzZWREYXRlUGFydHMsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWF9KTthLl9pc1ZhbGlkPSFpc05hTihhLl9kLmdldFRpbWUoKSkmJmIub3ZlcmZsb3c8MCYmIWIuZW1wdHkmJiFiLmludmFsaWRNb250aCYmIWIuaW52YWxpZFdlZWtkYXkmJiFiLm51bGxJbnB1dCYmIWIuaW52YWxpZEZvcm1hdCYmIWIudXNlckludmFsaWRhdGVkJiYoIWIubWVyaWRpZW18fGIubWVyaWRpZW0mJmMpLGEuX3N0cmljdCYmKGEuX2lzVmFsaWQ9YS5faXNWYWxpZCYmMD09PWIuY2hhcnNMZWZ0T3ZlciYmMD09PWIudW51c2VkVG9rZW5zLmxlbmd0aCYmdm9pZCAwPT09Yi5iaWdIb3VyKX1yZXR1cm4gYS5faXNWYWxpZH1mdW5jdGlvbiBsKGEpe3ZhciBiPWgoTmFOKTtyZXR1cm4gbnVsbCE9YT9nKGooYiksYSk6aihiKS51c2VySW52YWxpZGF0ZWQ9ITAsYn1mdW5jdGlvbiBtKGEpe3JldHVybiB2b2lkIDA9PT1hfWZ1bmN0aW9uIG4oYSxiKXt2YXIgYyxkLGU7aWYobShiLl9pc0FNb21lbnRPYmplY3QpfHwoYS5faXNBTW9tZW50T2JqZWN0PWIuX2lzQU1vbWVudE9iamVjdCksbShiLl9pKXx8KGEuX2k9Yi5faSksbShiLl9mKXx8KGEuX2Y9Yi5fZiksbShiLl9sKXx8KGEuX2w9Yi5fbCksbShiLl9zdHJpY3QpfHwoYS5fc3RyaWN0PWIuX3N0cmljdCksbShiLl90em0pfHwoYS5fdHptPWIuX3R6bSksbShiLl9pc1VUQyl8fChhLl9pc1VUQz1iLl9pc1VUQyksbShiLl9vZmZzZXQpfHwoYS5fb2Zmc2V0PWIuX29mZnNldCksbShiLl9wZil8fChhLl9wZj1qKGIpKSxtKGIuX2xvY2FsZSl8fChhLl9sb2NhbGU9Yi5fbG9jYWxlKSxoZC5sZW5ndGg+MClmb3IoYyBpbiBoZClkPWhkW2NdLGU9YltkXSxtKGUpfHwoYVtkXT1lKTtyZXR1cm4gYX1mdW5jdGlvbiBvKGIpe24odGhpcyxiKSx0aGlzLl9kPW5ldyBEYXRlKG51bGwhPWIuX2Q/Yi5fZC5nZXRUaW1lKCk6TmFOKSxpZD09PSExJiYoaWQ9ITAsYS51cGRhdGVPZmZzZXQodGhpcyksaWQ9ITEpfWZ1bmN0aW9uIHAoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBvfHxudWxsIT1hJiZudWxsIT1hLl9pc0FNb21lbnRPYmplY3R9ZnVuY3Rpb24gcShhKXtyZXR1cm4gMD5hP01hdGguY2VpbChhKTpNYXRoLmZsb29yKGEpfWZ1bmN0aW9uIHIoYSl7dmFyIGI9K2EsYz0wO3JldHVybiAwIT09YiYmaXNGaW5pdGUoYikmJihjPXEoYikpLGN9ZnVuY3Rpb24gcyhhLGIsYyl7dmFyIGQsZT1NYXRoLm1pbihhLmxlbmd0aCxiLmxlbmd0aCksZj1NYXRoLmFicyhhLmxlbmd0aC1iLmxlbmd0aCksZz0wO2ZvcihkPTA7ZT5kO2QrKykoYyYmYVtkXSE9PWJbZF18fCFjJiZyKGFbZF0pIT09cihiW2RdKSkmJmcrKztyZXR1cm4gZytmfWZ1bmN0aW9uIHQoYil7YS5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3M9PT0hMSYmInVuZGVmaW5lZCIhPXR5cGVvZiBjb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybigiRGVwcmVjYXRpb24gd2FybmluZzogIitiKX1mdW5jdGlvbiB1KGIsYyl7dmFyIGQ9ITA7cmV0dXJuIGcoZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9YS5kZXByZWNhdGlvbkhhbmRsZXImJmEuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsYiksZCYmKHQoYisiXG5Bcmd1bWVudHM6ICIrQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsICIpKyJcbiIrKG5ldyBFcnJvcikuc3RhY2spLGQ9ITEpLGMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxjKX1mdW5jdGlvbiB2KGIsYyl7bnVsbCE9YS5kZXByZWNhdGlvbkhhbmRsZXImJmEuZGVwcmVjYXRpb25IYW5kbGVyKGIsYyksamRbYl18fCh0KGMpLGpkW2JdPSEwKX1mdW5jdGlvbiB3KGEpe3JldHVybiBhIGluc3RhbmNlb2YgRnVuY3Rpb258fCJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSl9ZnVuY3Rpb24geChhKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKX1mdW5jdGlvbiB5KGEpe3ZhciBiLGM7Zm9yKGMgaW4gYSliPWFbY10sdyhiKT90aGlzW2NdPWI6dGhpc1siXyIrY109Yjt0aGlzLl9jb25maWc9YSx0aGlzLl9vcmRpbmFsUGFyc2VMZW5pZW50PW5ldyBSZWdFeHAodGhpcy5fb3JkaW5hbFBhcnNlLnNvdXJjZSsifCIrL1xkezEsMn0vLnNvdXJjZSl9ZnVuY3Rpb24geihhLGIpe3ZhciBjLGQ9Zyh7fSxhKTtmb3IoYyBpbiBiKWYoYixjKSYmKHgoYVtjXSkmJngoYltjXSk/KGRbY109e30sZyhkW2NdLGFbY10pLGcoZFtjXSxiW2NdKSk6bnVsbCE9YltjXT9kW2NdPWJbY106ZGVsZXRlIGRbY10pO3JldHVybiBkfWZ1bmN0aW9uIEEoYSl7bnVsbCE9YSYmdGhpcy5zZXQoYSl9ZnVuY3Rpb24gQihhKXtyZXR1cm4gYT9hLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgiXyIsIi0iKTphfWZ1bmN0aW9uIEMoYSl7Zm9yKHZhciBiLGMsZCxlLGY9MDtmPGEubGVuZ3RoOyl7Zm9yKGU9QihhW2ZdKS5zcGxpdCgiLSIpLGI9ZS5sZW5ndGgsYz1CKGFbZisxXSksYz1jP2Muc3BsaXQoIi0iKTpudWxsO2I+MDspe2lmKGQ9RChlLnNsaWNlKDAsYikuam9pbigiLSIpKSlyZXR1cm4gZDtpZihjJiZjLmxlbmd0aD49YiYmcyhlLGMsITApPj1iLTEpYnJlYWs7Yi0tfWYrK31yZXR1cm4gbnVsbH1mdW5jdGlvbiBEKGEpe3ZhciBiPW51bGw7aWYoIW5kW2FdJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSYmbW9kdWxlJiZtb2R1bGUuZXhwb3J0cyl0cnl7Yj1sZC5fYWJicixyZXF1aXJlKCIuL2xvY2FsZS8iK2EpLEUoYil9Y2F0Y2goYyl7fXJldHVybiBuZFthXX1mdW5jdGlvbiBFKGEsYil7dmFyIGM7cmV0dXJuIGEmJihjPW0oYik/SChhKTpGKGEsYiksYyYmKGxkPWMpKSxsZC5fYWJicn1mdW5jdGlvbiBGKGEsYil7cmV0dXJuIG51bGwhPT1iPyhiLmFiYnI9YSxudWxsIT1uZFthXT8odigiZGVmaW5lTG9jYWxlT3ZlcnJpZGUiLCJ1c2UgbW9tZW50LnVwZGF0ZUxvY2FsZShsb2NhbGVOYW1lLCBjb25maWcpIHRvIGNoYW5nZSBhbiBleGlzdGluZyBsb2NhbGUuIG1vbWVudC5kZWZpbmVMb2NhbGUobG9jYWxlTmFtZSwgY29uZmlnKSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjcmVhdGluZyBhIG5ldyBsb2NhbGUiKSxiPXoobmRbYV0uX2NvbmZpZyxiKSk6bnVsbCE9Yi5wYXJlbnRMb2NhbGUmJihudWxsIT1uZFtiLnBhcmVudExvY2FsZV0/Yj16KG5kW2IucGFyZW50TG9jYWxlXS5fY29uZmlnLGIpOnYoInBhcmVudExvY2FsZVVuZGVmaW5lZCIsInNwZWNpZmllZCBwYXJlbnRMb2NhbGUgaXMgbm90IGRlZmluZWQgeWV0IikpLG5kW2FdPW5ldyBBKGIpLEUoYSksbmRbYV0pOihkZWxldGUgbmRbYV0sbnVsbCl9ZnVuY3Rpb24gRyhhLGIpe2lmKG51bGwhPWIpe3ZhciBjO251bGwhPW5kW2FdJiYoYj16KG5kW2FdLl9jb25maWcsYikpLGM9bmV3IEEoYiksYy5wYXJlbnRMb2NhbGU9bmRbYV0sbmRbYV09YyxFKGEpfWVsc2UgbnVsbCE9bmRbYV0mJihudWxsIT1uZFthXS5wYXJlbnRMb2NhbGU/bmRbYV09bmRbYV0ucGFyZW50TG9jYWxlOm51bGwhPW5kW2FdJiZkZWxldGUgbmRbYV0pO3JldHVybiBuZFthXX1mdW5jdGlvbiBIKGEpe3ZhciBiO2lmKGEmJmEuX2xvY2FsZSYmYS5fbG9jYWxlLl9hYmJyJiYoYT1hLl9sb2NhbGUuX2FiYnIpLCFhKXJldHVybiBsZDtpZighYyhhKSl7aWYoYj1EKGEpKXJldHVybiBiO2E9W2FdfXJldHVybiBDKGEpfWZ1bmN0aW9uIEkoKXtyZXR1cm4ga2QobmQpfWZ1bmN0aW9uIEooYSxiKXt2YXIgYz1hLnRvTG93ZXJDYXNlKCk7b2RbY109b2RbYysicyJdPW9kW2JdPWF9ZnVuY3Rpb24gSyhhKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGE/b2RbYV18fG9kW2EudG9Mb3dlckNhc2UoKV06dm9pZCAwfWZ1bmN0aW9uIEwoYSl7dmFyIGIsYyxkPXt9O2ZvcihjIGluIGEpZihhLGMpJiYoYj1LKGMpLGImJihkW2JdPWFbY10pKTtyZXR1cm4gZH1mdW5jdGlvbiBNKGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBudWxsIT1kPyhPKHRoaXMsYixkKSxhLnVwZGF0ZU9mZnNldCh0aGlzLGMpLHRoaXMpOk4odGhpcyxiKX19ZnVuY3Rpb24gTihhLGIpe3JldHVybiBhLmlzVmFsaWQoKT9hLl9kWyJnZXQiKyhhLl9pc1VUQz8iVVRDIjoiIikrYl0oKTpOYU59ZnVuY3Rpb24gTyhhLGIsYyl7YS5pc1ZhbGlkKCkmJmEuX2RbInNldCIrKGEuX2lzVVRDPyJVVEMiOiIiKStiXShjKX1mdW5jdGlvbiBQKGEsYil7dmFyIGM7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWZvcihjIGluIGEpdGhpcy5zZXQoYyxhW2NdKTtlbHNlIGlmKGE9SyhhKSx3KHRoaXNbYV0pKXJldHVybiB0aGlzW2FdKGIpO3JldHVybiB0aGlzfWZ1bmN0aW9uIFEoYSxiLGMpe3ZhciBkPSIiK01hdGguYWJzKGEpLGU9Yi1kLmxlbmd0aCxmPWE+PTA7cmV0dXJuKGY/Yz8iKyI6IiI6Ii0iKStNYXRoLnBvdygxMCxNYXRoLm1heCgwLGUpKS50b1N0cmluZygpLnN1YnN0cigxKStkfWZ1bmN0aW9uIFIoYSxiLGMsZCl7dmFyIGU9ZDsic3RyaW5nIj09dHlwZW9mIGQmJihlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbZF0oKX0pLGEmJihzZFthXT1lKSxiJiYoc2RbYlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gUShlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxiWzFdLGJbMl0pfSksYyYmKHNkW2NdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm9yZGluYWwoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYSl9KX1mdW5jdGlvbiBTKGEpe3JldHVybiBhLm1hdGNoKC9cW1tcc1xTXS8pP2EucmVwbGFjZSgvXlxbfFxdJC9nLCIiKTphLnJlcGxhY2UoL1xcL2csIiIpfWZ1bmN0aW9uIFQoYSl7dmFyIGIsYyxkPWEubWF0Y2gocGQpO2ZvcihiPTAsYz1kLmxlbmd0aDtjPmI7YisrKXNkW2RbYl1dP2RbYl09c2RbZFtiXV06ZFtiXT1TKGRbYl0pO3JldHVybiBmdW5jdGlvbihiKXt2YXIgZSxmPSIiO2ZvcihlPTA7Yz5lO2UrKylmKz1kW2VdaW5zdGFuY2VvZiBGdW5jdGlvbj9kW2VdLmNhbGwoYixhKTpkW2VdO3JldHVybiBmfX1mdW5jdGlvbiBVKGEsYil7cmV0dXJuIGEuaXNWYWxpZCgpPyhiPVYoYixhLmxvY2FsZURhdGEoKSkscmRbYl09cmRbYl18fFQoYikscmRbYl0oYSkpOmEubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCl9ZnVuY3Rpb24gVihhLGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIGIubG9uZ0RhdGVGb3JtYXQoYSl8fGF9dmFyIGQ9NTtmb3IocWQubGFzdEluZGV4PTA7ZD49MCYmcWQudGVzdChhKTspYT1hLnJlcGxhY2UocWQsYykscWQubGFzdEluZGV4PTAsZC09MTtyZXR1cm4gYX1mdW5jdGlvbiBXKGEsYixjKXtLZFthXT13KGIpP2I6ZnVuY3Rpb24oYSxkKXtyZXR1cm4gYSYmYz9jOmJ9fWZ1bmN0aW9uIFgoYSxiKXtyZXR1cm4gZihLZCxhKT9LZFthXShiLl9zdHJpY3QsYi5fbG9jYWxlKTpuZXcgUmVnRXhwKFkoYSkpfWZ1bmN0aW9uIFkoYSl7cmV0dXJuIFooYS5yZXBsYWNlKCJcXCIsIiIpLnJlcGxhY2UoL1xcKFxbKXxcXChcXSl8XFsoW15cXVxbXSopXF18XFwoLikvZyxmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBifHxjfHxkfHxlfSkpfWZ1bmN0aW9uIFooYSl7cmV0dXJuIGEucmVwbGFjZSgvWy1cL1xcXiQqKz8uKCl8W1xde31dL2csIlxcJCYiKX1mdW5jdGlvbiAkKGEsYil7dmFyIGMsZD1iO2Zvcigic3RyaW5nIj09dHlwZW9mIGEmJihhPVthXSksIm51bWJlciI9PXR5cGVvZiBiJiYoZD1mdW5jdGlvbihhLGMpe2NbYl09cihhKX0pLGM9MDtjPGEubGVuZ3RoO2MrKylMZFthW2NdXT1kfWZ1bmN0aW9uIF8oYSxiKXskKGEsZnVuY3Rpb24oYSxjLGQsZSl7ZC5fdz1kLl93fHx7fSxiKGEsZC5fdyxkLGUpfSl9ZnVuY3Rpb24gYWEoYSxiLGMpe251bGwhPWImJmYoTGQsYSkmJkxkW2FdKGIsYy5fYSxjLGEpfWZ1bmN0aW9uIGJhKGEsYil7cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKGEsYisxLDApKS5nZXRVVENEYXRlKCl9ZnVuY3Rpb24gY2EoYSxiKXtyZXR1cm4gYyh0aGlzLl9tb250aHMpP3RoaXMuX21vbnRoc1thLm1vbnRoKCldOnRoaXMuX21vbnRoc1tWZC50ZXN0KGIpPyJmb3JtYXQiOiJzdGFuZGFsb25lIl1bYS5tb250aCgpXX1mdW5jdGlvbiBkYShhLGIpe3JldHVybiBjKHRoaXMuX21vbnRoc1Nob3J0KT90aGlzLl9tb250aHNTaG9ydFthLm1vbnRoKCldOnRoaXMuX21vbnRoc1Nob3J0W1ZkLnRlc3QoYik/ImZvcm1hdCI6InN0YW5kYWxvbmUiXVthLm1vbnRoKCldfWZ1bmN0aW9uIGVhKGEsYixjKXt2YXIgZCxlLGYsZz1hLnRvTG9jYWxlTG93ZXJDYXNlKCk7aWYoIXRoaXMuX21vbnRoc1BhcnNlKWZvcih0aGlzLl9tb250aHNQYXJzZT1bXSx0aGlzLl9sb25nTW9udGhzUGFyc2U9W10sdGhpcy5fc2hvcnRNb250aHNQYXJzZT1bXSxkPTA7MTI+ZDsrK2QpZj1oKFsyZTMsZF0pLHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbZF09dGhpcy5tb250aHNTaG9ydChmLCIiKS50b0xvY2FsZUxvd2VyQ2FzZSgpLHRoaXMuX2xvbmdNb250aHNQYXJzZVtkXT10aGlzLm1vbnRocyhmLCIiKS50b0xvY2FsZUxvd2VyQ2FzZSgpO3JldHVybiBjPyJNTU0iPT09Yj8oZT1tZC5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsZyksLTEhPT1lP2U6bnVsbCk6KGU9bWQuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsZyksLTEhPT1lP2U6bnVsbCk6Ik1NTSI9PT1iPyhlPW1kLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSxnKSwtMSE9PWU/ZTooZT1tZC5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSxnKSwtMSE9PWU/ZTpudWxsKSk6KGU9bWQuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsZyksLTEhPT1lP2U6KGU9bWQuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLGcpLC0xIT09ZT9lOm51bGwpKX1mdW5jdGlvbiBmYShhLGIsYyl7dmFyIGQsZSxmO2lmKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpcmV0dXJuIGVhLmNhbGwodGhpcyxhLGIsYyk7Zm9yKHRoaXMuX21vbnRoc1BhcnNlfHwodGhpcy5fbW9udGhzUGFyc2U9W10sdGhpcy5fbG9uZ01vbnRoc1BhcnNlPVtdLHRoaXMuX3Nob3J0TW9udGhzUGFyc2U9W10pLGQ9MDsxMj5kO2QrKyl7aWYoZT1oKFsyZTMsZF0pLGMmJiF0aGlzLl9sb25nTW9udGhzUGFyc2VbZF0mJih0aGlzLl9sb25nTW9udGhzUGFyc2VbZF09bmV3IFJlZ0V4cCgiXiIrdGhpcy5tb250aHMoZSwiIikucmVwbGFjZSgiLiIsIiIpKyIkIiwiaSIpLHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbZF09bmV3IFJlZ0V4cCgiXiIrdGhpcy5tb250aHNTaG9ydChlLCIiKS5yZXBsYWNlKCIuIiwiIikrIiQiLCJpIikpLGN8fHRoaXMuX21vbnRoc1BhcnNlW2RdfHwoZj0iXiIrdGhpcy5tb250aHMoZSwiIikrInxeIit0aGlzLm1vbnRoc1Nob3J0KGUsIiIpLHRoaXMuX21vbnRoc1BhcnNlW2RdPW5ldyBSZWdFeHAoZi5yZXBsYWNlKCIuIiwiIiksImkiKSksYyYmIk1NTU0iPT09YiYmdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGQ7aWYoYyYmIk1NTSI9PT1iJiZ0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGQ7aWYoIWMmJnRoaXMuX21vbnRoc1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGR9fWZ1bmN0aW9uIGdhKGEsYil7dmFyIGM7aWYoIWEuaXNWYWxpZCgpKXJldHVybiBhO2lmKCJzdHJpbmciPT10eXBlb2YgYilpZigvXlxkKyQvLnRlc3QoYikpYj1yKGIpO2Vsc2UgaWYoYj1hLmxvY2FsZURhdGEoKS5tb250aHNQYXJzZShiKSwibnVtYmVyIiE9dHlwZW9mIGIpcmV0dXJuIGE7cmV0dXJuIGM9TWF0aC5taW4oYS5kYXRlKCksYmEoYS55ZWFyKCksYikpLGEuX2RbInNldCIrKGEuX2lzVVRDPyJVVEMiOiIiKSsiTW9udGgiXShiLGMpLGF9ZnVuY3Rpb24gaGEoYil7cmV0dXJuIG51bGwhPWI/KGdhKHRoaXMsYiksYS51cGRhdGVPZmZzZXQodGhpcywhMCksdGhpcyk6Tih0aGlzLCJNb250aCIpfWZ1bmN0aW9uIGlhKCl7cmV0dXJuIGJhKHRoaXMueWVhcigpLHRoaXMubW9udGgoKSl9ZnVuY3Rpb24gamEoYSl7cmV0dXJuIHRoaXMuX21vbnRoc1BhcnNlRXhhY3Q/KGYodGhpcywiX21vbnRoc1JlZ2V4Iil8fGxhLmNhbGwodGhpcyksYT90aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4OnRoaXMuX21vbnRoc1Nob3J0UmVnZXgpOnRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXgmJmE/dGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleDp0aGlzLl9tb250aHNTaG9ydFJlZ2V4fWZ1bmN0aW9uIGthKGEpe3JldHVybiB0aGlzLl9tb250aHNQYXJzZUV4YWN0PyhmKHRoaXMsIl9tb250aHNSZWdleCIpfHxsYS5jYWxsKHRoaXMpLGE/dGhpcy5fbW9udGhzU3RyaWN0UmVnZXg6dGhpcy5fbW9udGhzUmVnZXgpOnRoaXMuX21vbnRoc1N0cmljdFJlZ2V4JiZhP3RoaXMuX21vbnRoc1N0cmljdFJlZ2V4OnRoaXMuX21vbnRoc1JlZ2V4fWZ1bmN0aW9uIGxhKCl7ZnVuY3Rpb24gYShhLGIpe3JldHVybiBiLmxlbmd0aC1hLmxlbmd0aH12YXIgYixjLGQ9W10sZT1bXSxmPVtdO2ZvcihiPTA7MTI+YjtiKyspYz1oKFsyZTMsYl0pLGQucHVzaCh0aGlzLm1vbnRoc1Nob3J0KGMsIiIpKSxlLnB1c2godGhpcy5tb250aHMoYywiIikpLGYucHVzaCh0aGlzLm1vbnRocyhjLCIiKSksZi5wdXNoKHRoaXMubW9udGhzU2hvcnQoYywiIikpO2ZvcihkLnNvcnQoYSksZS5zb3J0KGEpLGYuc29ydChhKSxiPTA7MTI+YjtiKyspZFtiXT1aKGRbYl0pLGVbYl09WihlW2JdKSxmW2JdPVooZltiXSk7dGhpcy5fbW9udGhzUmVnZXg9bmV3IFJlZ0V4cCgiXigiK2Yuam9pbigifCIpKyIpIiwiaSIpLHRoaXMuX21vbnRoc1Nob3J0UmVnZXg9dGhpcy5fbW9udGhzUmVnZXgsdGhpcy5fbW9udGhzU3RyaWN0UmVnZXg9bmV3IFJlZ0V4cCgiXigiK2Uuam9pbigifCIpKyIpIiwiaSIpLHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg9bmV3IFJlZ0V4cCgiXigiK2Quam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uIG1hKGEpe3ZhciBiLGM9YS5fYTtyZXR1cm4gYyYmLTI9PT1qKGEpLm92ZXJmbG93JiYoYj1jW05kXTwwfHxjW05kXT4xMT9OZDpjW09kXTwxfHxjW09kXT5iYShjW01kXSxjW05kXSk/T2Q6Y1tQZF08MHx8Y1tQZF0+MjR8fDI0PT09Y1tQZF0mJigwIT09Y1tRZF18fDAhPT1jW1JkXXx8MCE9PWNbU2RdKT9QZDpjW1FkXTwwfHxjW1FkXT41OT9RZDpjW1JkXTwwfHxjW1JkXT41OT9SZDpjW1NkXTwwfHxjW1NkXT45OTk/U2Q6LTEsaihhKS5fb3ZlcmZsb3dEYXlPZlllYXImJihNZD5ifHxiPk9kKSYmKGI9T2QpLGooYSkuX292ZXJmbG93V2Vla3MmJi0xPT09YiYmKGI9VGQpLGooYSkuX292ZXJmbG93V2Vla2RheSYmLTE9PT1iJiYoYj1VZCksaihhKS5vdmVyZmxvdz1iKSxhfWZ1bmN0aW9uIG5hKGEpe3ZhciBiLGMsZCxlLGYsZyxoPWEuX2ksaT0kZC5leGVjKGgpfHxfZC5leGVjKGgpO2lmKGkpe2ZvcihqKGEpLmlzbz0hMCxiPTAsYz1iZS5sZW5ndGg7Yz5iO2IrKylpZihiZVtiXVsxXS5leGVjKGlbMV0pKXtlPWJlW2JdWzBdLGQ9YmVbYl1bMl0hPT0hMTticmVha31pZihudWxsPT1lKXJldHVybiB2b2lkKGEuX2lzVmFsaWQ9ITEpO2lmKGlbM10pe2ZvcihiPTAsYz1jZS5sZW5ndGg7Yz5iO2IrKylpZihjZVtiXVsxXS5leGVjKGlbM10pKXtmPShpWzJdfHwiICIpK2NlW2JdWzBdO2JyZWFrfWlmKG51bGw9PWYpcmV0dXJuIHZvaWQoYS5faXNWYWxpZD0hMSl9aWYoIWQmJm51bGwhPWYpcmV0dXJuIHZvaWQoYS5faXNWYWxpZD0hMSk7aWYoaVs0XSl7aWYoIWFlLmV4ZWMoaVs0XSkpcmV0dXJuIHZvaWQoYS5faXNWYWxpZD0hMSk7Zz0iWiJ9YS5fZj1lKyhmfHwiIikrKGd8fCIiKSxDYShhKX1lbHNlIGEuX2lzVmFsaWQ9ITF9ZnVuY3Rpb24gb2EoYil7dmFyIGM9ZGUuZXhlYyhiLl9pKTtyZXR1cm4gbnVsbCE9PWM/dm9pZChiLl9kPW5ldyBEYXRlKCtjWzFdKSk6KG5hKGIpLHZvaWQoYi5faXNWYWxpZD09PSExJiYoZGVsZXRlIGIuX2lzVmFsaWQsYS5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhiKSkpKX1mdW5jdGlvbiBwYShhLGIsYyxkLGUsZixnKXt2YXIgaD1uZXcgRGF0ZShhLGIsYyxkLGUsZixnKTtyZXR1cm4gMTAwPmEmJmE+PTAmJmlzRmluaXRlKGguZ2V0RnVsbFllYXIoKSkmJmguc2V0RnVsbFllYXIoYSksaH1mdW5jdGlvbiBxYShhKXt2YXIgYj1uZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLGFyZ3VtZW50cykpO3JldHVybiAxMDA+YSYmYT49MCYmaXNGaW5pdGUoYi5nZXRVVENGdWxsWWVhcigpKSYmYi5zZXRVVENGdWxsWWVhcihhKSxifWZ1bmN0aW9uIHJhKGEpe3JldHVybiBzYShhKT8zNjY6MzY1fWZ1bmN0aW9uIHNhKGEpe3JldHVybiBhJTQ9PT0wJiZhJTEwMCE9PTB8fGElNDAwPT09MH1mdW5jdGlvbiB0YSgpe3JldHVybiBzYSh0aGlzLnllYXIoKSl9ZnVuY3Rpb24gdWEoYSxiLGMpe3ZhciBkPTcrYi1jLGU9KDcrcWEoYSwwLGQpLmdldFVUQ0RheSgpLWIpJTc7cmV0dXJuLWUrZC0xfWZ1bmN0aW9uIHZhKGEsYixjLGQsZSl7dmFyIGYsZyxoPSg3K2MtZCklNyxpPXVhKGEsZCxlKSxqPTErNyooYi0xKStoK2k7cmV0dXJuIDA+PWo/KGY9YS0xLGc9cmEoZikraik6aj5yYShhKT8oZj1hKzEsZz1qLXJhKGEpKTooZj1hLGc9aikse3llYXI6ZixkYXlPZlllYXI6Z319ZnVuY3Rpb24gd2EoYSxiLGMpe3ZhciBkLGUsZj11YShhLnllYXIoKSxiLGMpLGc9TWF0aC5mbG9vcigoYS5kYXlPZlllYXIoKS1mLTEpLzcpKzE7cmV0dXJuIDE+Zz8oZT1hLnllYXIoKS0xLGQ9Zyt4YShlLGIsYykpOmc+eGEoYS55ZWFyKCksYixjKT8oZD1nLXhhKGEueWVhcigpLGIsYyksZT1hLnllYXIoKSsxKTooZT1hLnllYXIoKSxkPWcpLHt3ZWVrOmQseWVhcjplfX1mdW5jdGlvbiB4YShhLGIsYyl7dmFyIGQ9dWEoYSxiLGMpLGU9dWEoYSsxLGIsYyk7cmV0dXJuKHJhKGEpLWQrZSkvN31mdW5jdGlvbiB5YShhLGIsYyl7cmV0dXJuIG51bGwhPWE/YTpudWxsIT1iP2I6Y31mdW5jdGlvbiB6YShiKXt2YXIgYz1uZXcgRGF0ZShhLm5vdygpKTtyZXR1cm4gYi5fdXNlVVRDP1tjLmdldFVUQ0Z1bGxZZWFyKCksYy5nZXRVVENNb250aCgpLGMuZ2V0VVRDRGF0ZSgpXTpbYy5nZXRGdWxsWWVhcigpLGMuZ2V0TW9udGgoKSxjLmdldERhdGUoKV19ZnVuY3Rpb24gQWEoYSl7dmFyIGIsYyxkLGUsZj1bXTtpZighYS5fZCl7Zm9yKGQ9emEoYSksYS5fdyYmbnVsbD09YS5fYVtPZF0mJm51bGw9PWEuX2FbTmRdJiZCYShhKSxhLl9kYXlPZlllYXImJihlPXlhKGEuX2FbTWRdLGRbTWRdKSxhLl9kYXlPZlllYXI+cmEoZSkmJihqKGEpLl9vdmVyZmxvd0RheU9mWWVhcj0hMCksYz1xYShlLDAsYS5fZGF5T2ZZZWFyKSxhLl9hW05kXT1jLmdldFVUQ01vbnRoKCksYS5fYVtPZF09Yy5nZXRVVENEYXRlKCkpLGI9MDszPmImJm51bGw9PWEuX2FbYl07KytiKWEuX2FbYl09ZltiXT1kW2JdO2Zvcig7Nz5iO2IrKylhLl9hW2JdPWZbYl09bnVsbD09YS5fYVtiXT8yPT09Yj8xOjA6YS5fYVtiXTsyND09PWEuX2FbUGRdJiYwPT09YS5fYVtRZF0mJjA9PT1hLl9hW1JkXSYmMD09PWEuX2FbU2RdJiYoYS5fbmV4dERheT0hMCxhLl9hW1BkXT0wKSxhLl9kPShhLl91c2VVVEM/cWE6cGEpLmFwcGx5KG51bGwsZiksbnVsbCE9YS5fdHptJiZhLl9kLnNldFVUQ01pbnV0ZXMoYS5fZC5nZXRVVENNaW51dGVzKCktYS5fdHptKSxhLl9uZXh0RGF5JiYoYS5fYVtQZF09MjQpfX1mdW5jdGlvbiBCYShhKXt2YXIgYixjLGQsZSxmLGcsaCxpO2I9YS5fdyxudWxsIT1iLkdHfHxudWxsIT1iLld8fG51bGwhPWIuRT8oZj0xLGc9NCxjPXlhKGIuR0csYS5fYVtNZF0sd2EoS2EoKSwxLDQpLnllYXIpLGQ9eWEoYi5XLDEpLGU9eWEoYi5FLDEpLCgxPmV8fGU+NykmJihpPSEwKSk6KGY9YS5fbG9jYWxlLl93ZWVrLmRvdyxnPWEuX2xvY2FsZS5fd2Vlay5kb3ksYz15YShiLmdnLGEuX2FbTWRdLHdhKEthKCksZixnKS55ZWFyKSxkPXlhKGIudywxKSxudWxsIT1iLmQ/KGU9Yi5kLCgwPmV8fGU+NikmJihpPSEwKSk6bnVsbCE9Yi5lPyhlPWIuZStmLChiLmU8MHx8Yi5lPjYpJiYoaT0hMCkpOmU9ZiksMT5kfHxkPnhhKGMsZixnKT9qKGEpLl9vdmVyZmxvd1dlZWtzPSEwOm51bGwhPWk/aihhKS5fb3ZlcmZsb3dXZWVrZGF5PSEwOihoPXZhKGMsZCxlLGYsZyksYS5fYVtNZF09aC55ZWFyLGEuX2RheU9mWWVhcj1oLmRheU9mWWVhcil9ZnVuY3Rpb24gQ2EoYil7aWYoYi5fZj09PWEuSVNPXzg2MDEpcmV0dXJuIHZvaWQgbmEoYik7Yi5fYT1bXSxqKGIpLmVtcHR5PSEwO3ZhciBjLGQsZSxmLGcsaD0iIitiLl9pLGk9aC5sZW5ndGgsaz0wO2ZvcihlPVYoYi5fZixiLl9sb2NhbGUpLm1hdGNoKHBkKXx8W10sYz0wO2M8ZS5sZW5ndGg7YysrKWY9ZVtjXSxkPShoLm1hdGNoKFgoZixiKSl8fFtdKVswXSxkJiYoZz1oLnN1YnN0cigwLGguaW5kZXhPZihkKSksZy5sZW5ndGg+MCYmaihiKS51bnVzZWRJbnB1dC5wdXNoKGcpLGg9aC5zbGljZShoLmluZGV4T2YoZCkrZC5sZW5ndGgpLGsrPWQubGVuZ3RoKSxzZFtmXT8oZD9qKGIpLmVtcHR5PSExOmooYikudW51c2VkVG9rZW5zLnB1c2goZiksYWEoZixkLGIpKTpiLl9zdHJpY3QmJiFkJiZqKGIpLnVudXNlZFRva2Vucy5wdXNoKGYpO2ooYikuY2hhcnNMZWZ0T3Zlcj1pLWssaC5sZW5ndGg+MCYmaihiKS51bnVzZWRJbnB1dC5wdXNoKGgpLGooYikuYmlnSG91cj09PSEwJiZiLl9hW1BkXTw9MTImJmIuX2FbUGRdPjAmJihqKGIpLmJpZ0hvdXI9dm9pZCAwKSxqKGIpLnBhcnNlZERhdGVQYXJ0cz1iLl9hLnNsaWNlKDApLGooYikubWVyaWRpZW09Yi5fbWVyaWRpZW0sYi5fYVtQZF09RGEoYi5fbG9jYWxlLGIuX2FbUGRdLGIuX21lcmlkaWVtKSxBYShiKSxtYShiKX1mdW5jdGlvbiBEYShhLGIsYyl7dmFyIGQ7cmV0dXJuIG51bGw9PWM/YjpudWxsIT1hLm1lcmlkaWVtSG91cj9hLm1lcmlkaWVtSG91cihiLGMpOm51bGwhPWEuaXNQTT8oZD1hLmlzUE0oYyksZCYmMTI+YiYmKGIrPTEyKSxkfHwxMiE9PWJ8fChiPTApLGIpOmJ9ZnVuY3Rpb24gRWEoYSl7dmFyIGIsYyxkLGUsZjtpZigwPT09YS5fZi5sZW5ndGgpcmV0dXJuIGooYSkuaW52YWxpZEZvcm1hdD0hMCx2b2lkKGEuX2Q9bmV3IERhdGUoTmFOKSk7Zm9yKGU9MDtlPGEuX2YubGVuZ3RoO2UrKylmPTAsYj1uKHt9LGEpLG51bGwhPWEuX3VzZVVUQyYmKGIuX3VzZVVUQz1hLl91c2VVVEMpLGIuX2Y9YS5fZltlXSxDYShiKSxrKGIpJiYoZis9aihiKS5jaGFyc0xlZnRPdmVyLGYrPTEwKmooYikudW51c2VkVG9rZW5zLmxlbmd0aCxqKGIpLnNjb3JlPWYsKG51bGw9PWR8fGQ+ZikmJihkPWYsYz1iKSk7ZyhhLGN8fGIpfWZ1bmN0aW9uIEZhKGEpe2lmKCFhLl9kKXt2YXIgYj1MKGEuX2kpO2EuX2E9ZShbYi55ZWFyLGIubW9udGgsYi5kYXl8fGIuZGF0ZSxiLmhvdXIsYi5taW51dGUsYi5zZWNvbmQsYi5taWxsaXNlY29uZF0sZnVuY3Rpb24oYSl7cmV0dXJuIGEmJnBhcnNlSW50KGEsMTApfSksQWEoYSl9fWZ1bmN0aW9uIEdhKGEpe3ZhciBiPW5ldyBvKG1hKEhhKGEpKSk7cmV0dXJuIGIuX25leHREYXkmJihiLmFkZCgxLCJkIiksYi5fbmV4dERheT12b2lkIDApLGJ9ZnVuY3Rpb24gSGEoYSl7dmFyIGI9YS5faSxlPWEuX2Y7cmV0dXJuIGEuX2xvY2FsZT1hLl9sb2NhbGV8fEgoYS5fbCksbnVsbD09PWJ8fHZvaWQgMD09PWUmJiIiPT09Yj9sKHtudWxsSW5wdXQ6ITB9KTooInN0cmluZyI9PXR5cGVvZiBiJiYoYS5faT1iPWEuX2xvY2FsZS5wcmVwYXJzZShiKSkscChiKT9uZXcgbyhtYShiKSk6KGMoZSk/RWEoYSk6ZT9DYShhKTpkKGIpP2EuX2Q9YjpJYShhKSxrKGEpfHwoYS5fZD1udWxsKSxhKSl9ZnVuY3Rpb24gSWEoYil7dmFyIGY9Yi5faTt2b2lkIDA9PT1mP2IuX2Q9bmV3IERhdGUoYS5ub3coKSk6ZChmKT9iLl9kPW5ldyBEYXRlKGYudmFsdWVPZigpKToic3RyaW5nIj09dHlwZW9mIGY/b2EoYik6YyhmKT8oYi5fYT1lKGYuc2xpY2UoMCksZnVuY3Rpb24oYSl7cmV0dXJuIHBhcnNlSW50KGEsMTApfSksQWEoYikpOiJvYmplY3QiPT10eXBlb2YgZj9GYShiKToibnVtYmVyIj09dHlwZW9mIGY/Yi5fZD1uZXcgRGF0ZShmKTphLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGIpfWZ1bmN0aW9uIEphKGEsYixjLGQsZSl7dmFyIGY9e307cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYyYmKGQ9YyxjPXZvaWQgMCksZi5faXNBTW9tZW50T2JqZWN0PSEwLGYuX3VzZVVUQz1mLl9pc1VUQz1lLGYuX2w9YyxmLl9pPWEsZi5fZj1iLGYuX3N0cmljdD1kLEdhKGYpfWZ1bmN0aW9uIEthKGEsYixjLGQpe3JldHVybiBKYShhLGIsYyxkLCExKX1mdW5jdGlvbiBMYShhLGIpe3ZhciBkLGU7aWYoMT09PWIubGVuZ3RoJiZjKGJbMF0pJiYoYj1iWzBdKSwhYi5sZW5ndGgpcmV0dXJuIEthKCk7Zm9yKGQ9YlswXSxlPTE7ZTxiLmxlbmd0aDsrK2UpKCFiW2VdLmlzVmFsaWQoKXx8YltlXVthXShkKSkmJihkPWJbZV0pO3JldHVybiBkfWZ1bmN0aW9uIE1hKCl7dmFyIGE9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIExhKCJpc0JlZm9yZSIsYSl9ZnVuY3Rpb24gTmEoKXt2YXIgYT1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gTGEoImlzQWZ0ZXIiLGEpfWZ1bmN0aW9uIE9hKGEpe3ZhciBiPUwoYSksYz1iLnllYXJ8fDAsZD1iLnF1YXJ0ZXJ8fDAsZT1iLm1vbnRofHwwLGY9Yi53ZWVrfHwwLGc9Yi5kYXl8fDAsaD1iLmhvdXJ8fDAsaT1iLm1pbnV0ZXx8MCxqPWIuc2Vjb25kfHwwLGs9Yi5taWxsaXNlY29uZHx8MDt0aGlzLl9taWxsaXNlY29uZHM9K2srMWUzKmorNmU0KmkrMWUzKmgqNjAqNjAsdGhpcy5fZGF5cz0rZys3KmYsdGhpcy5fbW9udGhzPStlKzMqZCsxMipjLHRoaXMuX2RhdGE9e30sdGhpcy5fbG9jYWxlPUgoKSx0aGlzLl9idWJibGUoKX1mdW5jdGlvbiBQYShhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIE9hfWZ1bmN0aW9uIFFhKGEsYil7UihhLDAsMCxmdW5jdGlvbigpe3ZhciBhPXRoaXMudXRjT2Zmc2V0KCksYz0iKyI7cmV0dXJuIDA+YSYmKGE9LWEsYz0iLSIpLGMrUSh+fihhLzYwKSwyKStiK1Eofn5hJTYwLDIpfSl9ZnVuY3Rpb24gUmEoYSxiKXt2YXIgYz0oYnx8IiIpLm1hdGNoKGEpfHxbXSxkPWNbYy5sZW5ndGgtMV18fFtdLGU9KGQrIiIpLm1hdGNoKGllKXx8WyItIiwwLDBdLGY9Kyg2MCplWzFdKStyKGVbMl0pO3JldHVybiIrIj09PWVbMF0/ZjotZn1mdW5jdGlvbiBTYShiLGMpe3ZhciBlLGY7cmV0dXJuIGMuX2lzVVRDPyhlPWMuY2xvbmUoKSxmPShwKGIpfHxkKGIpP2IudmFsdWVPZigpOkthKGIpLnZhbHVlT2YoKSktZS52YWx1ZU9mKCksZS5fZC5zZXRUaW1lKGUuX2QudmFsdWVPZigpK2YpLGEudXBkYXRlT2Zmc2V0KGUsITEpLGUpOkthKGIpLmxvY2FsKCl9ZnVuY3Rpb24gVGEoYSl7cmV0dXJuIDE1Ki1NYXRoLnJvdW5kKGEuX2QuZ2V0VGltZXpvbmVPZmZzZXQoKS8xNSl9ZnVuY3Rpb24gVWEoYixjKXt2YXIgZCxlPXRoaXMuX29mZnNldHx8MDtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/bnVsbCE9Yj8oInN0cmluZyI9PXR5cGVvZiBiP2I9UmEoSGQsYik6TWF0aC5hYnMoYik8MTYmJihiPTYwKmIpLCF0aGlzLl9pc1VUQyYmYyYmKGQ9VGEodGhpcykpLHRoaXMuX29mZnNldD1iLHRoaXMuX2lzVVRDPSEwLG51bGwhPWQmJnRoaXMuYWRkKGQsIm0iKSxlIT09YiYmKCFjfHx0aGlzLl9jaGFuZ2VJblByb2dyZXNzP2piKHRoaXMsZGIoYi1lLCJtIiksMSwhMSk6dGhpcy5fY2hhbmdlSW5Qcm9ncmVzc3x8KHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3M9ITAsYS51cGRhdGVPZmZzZXQodGhpcywhMCksdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcz1udWxsKSksdGhpcyk6dGhpcy5faXNVVEM/ZTpUYSh0aGlzKTpudWxsIT1iP3RoaXM6TmFOfWZ1bmN0aW9uIFZhKGEsYil7cmV0dXJuIG51bGwhPWE/KCJzdHJpbmciIT10eXBlb2YgYSYmKGE9LWEpLHRoaXMudXRjT2Zmc2V0KGEsYiksdGhpcyk6LXRoaXMudXRjT2Zmc2V0KCl9ZnVuY3Rpb24gV2EoYSl7cmV0dXJuIHRoaXMudXRjT2Zmc2V0KDAsYSl9ZnVuY3Rpb24gWGEoYSl7cmV0dXJuIHRoaXMuX2lzVVRDJiYodGhpcy51dGNPZmZzZXQoMCxhKSx0aGlzLl9pc1VUQz0hMSxhJiZ0aGlzLnN1YnRyYWN0KFRhKHRoaXMpLCJtIikpLHRoaXN9ZnVuY3Rpb24gWWEoKXtyZXR1cm4gdGhpcy5fdHptP3RoaXMudXRjT2Zmc2V0KHRoaXMuX3R6bSk6InN0cmluZyI9PXR5cGVvZiB0aGlzLl9pJiZ0aGlzLnV0Y09mZnNldChSYShHZCx0aGlzLl9pKSksdGhpc31mdW5jdGlvbiBaYShhKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/KGE9YT9LYShhKS51dGNPZmZzZXQoKTowLCh0aGlzLnV0Y09mZnNldCgpLWEpJTYwPT09MCk6ITF9ZnVuY3Rpb24gJGEoKXtyZXR1cm4gdGhpcy51dGNPZmZzZXQoKT50aGlzLmNsb25lKCkubW9udGgoMCkudXRjT2Zmc2V0KCl8fHRoaXMudXRjT2Zmc2V0KCk+dGhpcy5jbG9uZSgpLm1vbnRoKDUpLnV0Y09mZnNldCgpfWZ1bmN0aW9uIF9hKCl7aWYoIW0odGhpcy5faXNEU1RTaGlmdGVkKSlyZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO3ZhciBhPXt9O2lmKG4oYSx0aGlzKSxhPUhhKGEpLGEuX2Epe3ZhciBiPWEuX2lzVVRDP2goYS5fYSk6S2EoYS5fYSk7dGhpcy5faXNEU1RTaGlmdGVkPXRoaXMuaXNWYWxpZCgpJiZzKGEuX2EsYi50b0FycmF5KCkpPjB9ZWxzZSB0aGlzLl9pc0RTVFNoaWZ0ZWQ9ITE7cmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZH1mdW5jdGlvbiBhYigpe3JldHVybiB0aGlzLmlzVmFsaWQoKT8hdGhpcy5faXNVVEM6ITF9ZnVuY3Rpb24gYmIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/dGhpcy5faXNVVEM6ITF9ZnVuY3Rpb24gY2IoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/dGhpcy5faXNVVEMmJjA9PT10aGlzLl9vZmZzZXQ6ITF9ZnVuY3Rpb24gZGIoYSxiKXt2YXIgYyxkLGUsZz1hLGg9bnVsbDtyZXR1cm4gUGEoYSk/Zz17bXM6YS5fbWlsbGlzZWNvbmRzLGQ6YS5fZGF5cyxNOmEuX21vbnRoc306Im51bWJlciI9PXR5cGVvZiBhPyhnPXt9LGI/Z1tiXT1hOmcubWlsbGlzZWNvbmRzPWEpOihoPWplLmV4ZWMoYSkpPyhjPSItIj09PWhbMV0/LTE6MSxnPXt5OjAsZDpyKGhbT2RdKSpjLGg6cihoW1BkXSkqYyxtOnIoaFtRZF0pKmMsczpyKGhbUmRdKSpjLG1zOnIoaFtTZF0pKmN9KTooaD1rZS5leGVjKGEpKT8oYz0iLSI9PT1oWzFdPy0xOjEsZz17eTplYihoWzJdLGMpLE06ZWIoaFszXSxjKSx3OmViKGhbNF0sYyksZDplYihoWzVdLGMpLGg6ZWIoaFs2XSxjKSxtOmViKGhbN10sYyksczplYihoWzhdLGMpfSk6bnVsbD09Zz9nPXt9OiJvYmplY3QiPT10eXBlb2YgZyYmKCJmcm9tImluIGd8fCJ0byJpbiBnKSYmKGU9Z2IoS2EoZy5mcm9tKSxLYShnLnRvKSksZz17fSxnLm1zPWUubWlsbGlzZWNvbmRzLGcuTT1lLm1vbnRocyksZD1uZXcgT2EoZyksUGEoYSkmJmYoYSwiX2xvY2FsZSIpJiYoZC5fbG9jYWxlPWEuX2xvY2FsZSksZH1mdW5jdGlvbiBlYihhLGIpe3ZhciBjPWEmJnBhcnNlRmxvYXQoYS5yZXBsYWNlKCIsIiwiLiIpKTtyZXR1cm4oaXNOYU4oYyk/MDpjKSpifWZ1bmN0aW9uIGZiKGEsYil7dmFyIGM9e21pbGxpc2Vjb25kczowLG1vbnRoczowfTtyZXR1cm4gYy5tb250aHM9Yi5tb250aCgpLWEubW9udGgoKSsxMiooYi55ZWFyKCktYS55ZWFyKCkpLGEuY2xvbmUoKS5hZGQoYy5tb250aHMsIk0iKS5pc0FmdGVyKGIpJiYtLWMubW9udGhzLGMubWlsbGlzZWNvbmRzPStiLSthLmNsb25lKCkuYWRkKGMubW9udGhzLCJNIiksY31mdW5jdGlvbiBnYihhLGIpe3ZhciBjO3JldHVybiBhLmlzVmFsaWQoKSYmYi5pc1ZhbGlkKCk/KGI9U2EoYixhKSxhLmlzQmVmb3JlKGIpP2M9ZmIoYSxiKTooYz1mYihiLGEpLGMubWlsbGlzZWNvbmRzPS1jLm1pbGxpc2Vjb25kcyxjLm1vbnRocz0tYy5tb250aHMpLGMpOnttaWxsaXNlY29uZHM6MCxtb250aHM6MH19ZnVuY3Rpb24gaGIoYSl7cmV0dXJuIDA+YT8tMSpNYXRoLnJvdW5kKC0xKmEpOk1hdGgucm91bmQoYSl9ZnVuY3Rpb24gaWIoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyxkKXt2YXIgZSxmO3JldHVybiBudWxsPT09ZHx8aXNOYU4oK2QpfHwodihiLCJtb21lbnQoKS4iK2IrIihwZXJpb2QsIG51bWJlcikgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBtb21lbnQoKS4iK2IrIihudW1iZXIsIHBlcmlvZCkuIiksZj1jLGM9ZCxkPWYpLGM9InN0cmluZyI9PXR5cGVvZiBjPytjOmMsZT1kYihjLGQpLGpiKHRoaXMsZSxhKSx0aGlzfX1mdW5jdGlvbiBqYihiLGMsZCxlKXt2YXIgZj1jLl9taWxsaXNlY29uZHMsZz1oYihjLl9kYXlzKSxoPWhiKGMuX21vbnRocyk7Yi5pc1ZhbGlkKCkmJihlPW51bGw9PWU/ITA6ZSxmJiZiLl9kLnNldFRpbWUoYi5fZC52YWx1ZU9mKCkrZipkKSxnJiZPKGIsIkRhdGUiLE4oYiwiRGF0ZSIpK2cqZCksaCYmZ2EoYixOKGIsIk1vbnRoIikraCpkKSxlJiZhLnVwZGF0ZU9mZnNldChiLGd8fGgpKX1mdW5jdGlvbiBrYihhLGIpe3ZhciBjPWF8fEthKCksZD1TYShjLHRoaXMpLnN0YXJ0T2YoImRheSIpLGU9dGhpcy5kaWZmKGQsImRheXMiLCEwKSxmPS02PmU/InNhbWVFbHNlIjotMT5lPyJsYXN0V2VlayI6MD5lPyJsYXN0RGF5IjoxPmU/InNhbWVEYXkiOjI+ZT8ibmV4dERheSI6Nz5lPyJuZXh0V2VlayI6InNhbWVFbHNlIixnPWImJih3KGJbZl0pP2JbZl0oKTpiW2ZdKTtyZXR1cm4gdGhpcy5mb3JtYXQoZ3x8dGhpcy5sb2NhbGVEYXRhKCkuY2FsZW5kYXIoZix0aGlzLEthKGMpKSl9ZnVuY3Rpb24gbGIoKXtyZXR1cm4gbmV3IG8odGhpcyl9ZnVuY3Rpb24gbWIoYSxiKXt2YXIgYz1wKGEpP2E6S2EoYSk7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiZjLmlzVmFsaWQoKT8oYj1LKG0oYik/Im1pbGxpc2Vjb25kIjpiKSwibWlsbGlzZWNvbmQiPT09Yj90aGlzLnZhbHVlT2YoKT5jLnZhbHVlT2YoKTpjLnZhbHVlT2YoKTx0aGlzLmNsb25lKCkuc3RhcnRPZihiKS52YWx1ZU9mKCkpOiExfWZ1bmN0aW9uIG5iKGEsYil7dmFyIGM9cChhKT9hOkthKGEpO3JldHVybiB0aGlzLmlzVmFsaWQoKSYmYy5pc1ZhbGlkKCk/KGI9SyhtKGIpPyJtaWxsaXNlY29uZCI6YiksIm1pbGxpc2Vjb25kIj09PWI/dGhpcy52YWx1ZU9mKCk8Yy52YWx1ZU9mKCk6dGhpcy5jbG9uZSgpLmVuZE9mKGIpLnZhbHVlT2YoKTxjLnZhbHVlT2YoKSk6ITF9ZnVuY3Rpb24gb2IoYSxiLGMsZCl7cmV0dXJuIGQ9ZHx8IigpIiwoIigiPT09ZFswXT90aGlzLmlzQWZ0ZXIoYSxjKTohdGhpcy5pc0JlZm9yZShhLGMpKSYmKCIpIj09PWRbMV0/dGhpcy5pc0JlZm9yZShiLGMpOiF0aGlzLmlzQWZ0ZXIoYixjKSl9ZnVuY3Rpb24gcGIoYSxiKXt2YXIgYyxkPXAoYSk/YTpLYShhKTtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJmQuaXNWYWxpZCgpPyhiPUsoYnx8Im1pbGxpc2Vjb25kIiksIm1pbGxpc2Vjb25kIj09PWI/dGhpcy52YWx1ZU9mKCk9PT1kLnZhbHVlT2YoKTooYz1kLnZhbHVlT2YoKSx0aGlzLmNsb25lKCkuc3RhcnRPZihiKS52YWx1ZU9mKCk8PWMmJmM8PXRoaXMuY2xvbmUoKS5lbmRPZihiKS52YWx1ZU9mKCkpKTohMX1mdW5jdGlvbiBxYihhLGIpe3JldHVybiB0aGlzLmlzU2FtZShhLGIpfHx0aGlzLmlzQWZ0ZXIoYSxiKX1mdW5jdGlvbiByYihhLGIpe3JldHVybiB0aGlzLmlzU2FtZShhLGIpfHx0aGlzLmlzQmVmb3JlKGEsYil9ZnVuY3Rpb24gc2IoYSxiLGMpe3ZhciBkLGUsZixnO3JldHVybiB0aGlzLmlzVmFsaWQoKT8oZD1TYShhLHRoaXMpLGQuaXNWYWxpZCgpPyhlPTZlNCooZC51dGNPZmZzZXQoKS10aGlzLnV0Y09mZnNldCgpKSxiPUsoYiksInllYXIiPT09Ynx8Im1vbnRoIj09PWJ8fCJxdWFydGVyIj09PWI/KGc9dGIodGhpcyxkKSwicXVhcnRlciI9PT1iP2cvPTM6InllYXIiPT09YiYmKGcvPTEyKSk6KGY9dGhpcy1kLGc9InNlY29uZCI9PT1iP2YvMWUzOiJtaW51dGUiPT09Yj9mLzZlNDoiaG91ciI9PT1iP2YvMzZlNToiZGF5Ij09PWI/KGYtZSkvODY0ZTU6IndlZWsiPT09Yj8oZi1lKS82MDQ4ZTU6ZiksYz9nOnEoZykpOk5hTik6TmFOfWZ1bmN0aW9uIHRiKGEsYil7dmFyIGMsZCxlPTEyKihiLnllYXIoKS1hLnllYXIoKSkrKGIubW9udGgoKS1hLm1vbnRoKCkpLGY9YS5jbG9uZSgpLmFkZChlLCJtb250aHMiKTtyZXR1cm4gMD5iLWY/KGM9YS5jbG9uZSgpLmFkZChlLTEsIm1vbnRocyIpLGQ9KGItZikvKGYtYykpOihjPWEuY2xvbmUoKS5hZGQoZSsxLCJtb250aHMiKSxkPShiLWYpLyhjLWYpKSwtKGUrZCl8fDB9ZnVuY3Rpb24gdWIoKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmxvY2FsZSgiZW4iKS5mb3JtYXQoImRkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaIil9ZnVuY3Rpb24gdmIoKXt2YXIgYT10aGlzLmNsb25lKCkudXRjKCk7cmV0dXJuIDA8YS55ZWFyKCkmJmEueWVhcigpPD05OTk5P3coRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpP3RoaXMudG9EYXRlKCkudG9JU09TdHJpbmcoKTpVKGEsIllZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0iKTpVKGEsIllZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXSIpfWZ1bmN0aW9uIHdiKGIpe2J8fChiPXRoaXMuaXNVdGMoKT9hLmRlZmF1bHRGb3JtYXRVdGM6YS5kZWZhdWx0Rm9ybWF0KTt2YXIgYz1VKHRoaXMsYik7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLnBvc3Rmb3JtYXQoYyl9ZnVuY3Rpb24geGIoYSxiKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJihwKGEpJiZhLmlzVmFsaWQoKXx8S2EoYSkuaXNWYWxpZCgpKT9kYih7dG86dGhpcyxmcm9tOmF9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIWIpOnRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCl9ZnVuY3Rpb24geWIoYSl7cmV0dXJuIHRoaXMuZnJvbShLYSgpLGEpfWZ1bmN0aW9uIHpiKGEsYil7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiYocChhKSYmYS5pc1ZhbGlkKCl8fEthKGEpLmlzVmFsaWQoKSk/ZGIoe2Zyb206dGhpcyx0bzphfSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCFiKTp0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpfWZ1bmN0aW9uIEFiKGEpe3JldHVybiB0aGlzLnRvKEthKCksYSl9ZnVuY3Rpb24gQmIoYSl7dmFyIGI7cmV0dXJuIHZvaWQgMD09PWE/dGhpcy5fbG9jYWxlLl9hYmJyOihiPUgoYSksbnVsbCE9YiYmKHRoaXMuX2xvY2FsZT1iKSx0aGlzKX1mdW5jdGlvbiBDYigpe3JldHVybiB0aGlzLl9sb2NhbGV9ZnVuY3Rpb24gRGIoYSl7c3dpdGNoKGE9SyhhKSl7Y2FzZSJ5ZWFyIjp0aGlzLm1vbnRoKDApO2Nhc2UicXVhcnRlciI6Y2FzZSJtb250aCI6dGhpcy5kYXRlKDEpO2Nhc2Uid2VlayI6Y2FzZSJpc29XZWVrIjpjYXNlImRheSI6Y2FzZSJkYXRlIjp0aGlzLmhvdXJzKDApO2Nhc2UiaG91ciI6dGhpcy5taW51dGVzKDApO2Nhc2UibWludXRlIjp0aGlzLnNlY29uZHMoMCk7Y2FzZSJzZWNvbmQiOnRoaXMubWlsbGlzZWNvbmRzKDApfXJldHVybiJ3ZWVrIj09PWEmJnRoaXMud2Vla2RheSgwKSwiaXNvV2VlayI9PT1hJiZ0aGlzLmlzb1dlZWtkYXkoMSksInF1YXJ0ZXIiPT09YSYmdGhpcy5tb250aCgzKk1hdGguZmxvb3IodGhpcy5tb250aCgpLzMpKSx0aGlzfWZ1bmN0aW9uIEViKGEpe3JldHVybiBhPUsoYSksdm9pZCAwPT09YXx8Im1pbGxpc2Vjb25kIj09PWE/dGhpczooImRhdGUiPT09YSYmKGE9ImRheSIpLHRoaXMuc3RhcnRPZihhKS5hZGQoMSwiaXNvV2VlayI9PT1hPyJ3ZWVrIjphKS5zdWJ0cmFjdCgxLCJtcyIpKX1mdW5jdGlvbiBGYigpe3JldHVybiB0aGlzLl9kLnZhbHVlT2YoKS02ZTQqKHRoaXMuX29mZnNldHx8MCl9ZnVuY3Rpb24gR2IoKXtyZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKS8xZTMpfWZ1bmN0aW9uIEhiKCl7cmV0dXJuIHRoaXMuX29mZnNldD9uZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSk6dGhpcy5fZH1mdW5jdGlvbiBJYigpe3ZhciBhPXRoaXM7cmV0dXJuW2EueWVhcigpLGEubW9udGgoKSxhLmRhdGUoKSxhLmhvdXIoKSxhLm1pbnV0ZSgpLGEuc2Vjb25kKCksYS5taWxsaXNlY29uZCgpXX1mdW5jdGlvbiBKYigpe3ZhciBhPXRoaXM7cmV0dXJue3llYXJzOmEueWVhcigpLG1vbnRoczphLm1vbnRoKCksZGF0ZTphLmRhdGUoKSxob3VyczphLmhvdXJzKCksbWludXRlczphLm1pbnV0ZXMoKSxzZWNvbmRzOmEuc2Vjb25kcygpLG1pbGxpc2Vjb25kczphLm1pbGxpc2Vjb25kcygpfX1mdW5jdGlvbiBLYigpe3JldHVybiB0aGlzLmlzVmFsaWQoKT90aGlzLnRvSVNPU3RyaW5nKCk6bnVsbH1mdW5jdGlvbiBMYigpe3JldHVybiBrKHRoaXMpfWZ1bmN0aW9uIE1iKCl7cmV0dXJuIGcoe30saih0aGlzKSl9ZnVuY3Rpb24gTmIoKXtyZXR1cm4gaih0aGlzKS5vdmVyZmxvd31mdW5jdGlvbiBPYigpe3JldHVybntpbnB1dDp0aGlzLl9pLGZvcm1hdDp0aGlzLl9mLGxvY2FsZTp0aGlzLl9sb2NhbGUsaXNVVEM6dGhpcy5faXNVVEMsc3RyaWN0OnRoaXMuX3N0cmljdH19ZnVuY3Rpb24gUGIoYSxiKXtSKDAsW2EsYS5sZW5ndGhdLDAsYil9ZnVuY3Rpb24gUWIoYSl7cmV0dXJuIFViLmNhbGwodGhpcyxhLHRoaXMud2VlaygpLHRoaXMud2Vla2RheSgpLHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyx0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3kpfWZ1bmN0aW9uIFJiKGEpe3JldHVybiBVYi5jYWxsKHRoaXMsYSx0aGlzLmlzb1dlZWsoKSx0aGlzLmlzb1dlZWtkYXkoKSwxLDQpfWZ1bmN0aW9uIFNiKCl7cmV0dXJuIHhhKHRoaXMueWVhcigpLDEsNCl9ZnVuY3Rpb24gVGIoKXt2YXIgYT10aGlzLmxvY2FsZURhdGEoKS5fd2VlaztyZXR1cm4geGEodGhpcy55ZWFyKCksYS5kb3csYS5kb3kpfWZ1bmN0aW9uIFViKGEsYixjLGQsZSl7dmFyIGY7cmV0dXJuIG51bGw9PWE/d2EodGhpcyxkLGUpLnllYXI6KGY9eGEoYSxkLGUpLGI+ZiYmKGI9ZiksVmIuY2FsbCh0aGlzLGEsYixjLGQsZSkpfWZ1bmN0aW9uIFZiKGEsYixjLGQsZSl7dmFyIGY9dmEoYSxiLGMsZCxlKSxnPXFhKGYueWVhciwwLGYuZGF5T2ZZZWFyKTtyZXR1cm4gdGhpcy55ZWFyKGcuZ2V0VVRDRnVsbFllYXIoKSksdGhpcy5tb250aChnLmdldFVUQ01vbnRoKCkpLHRoaXMuZGF0ZShnLmdldFVUQ0RhdGUoKSksdGhpc31mdW5jdGlvbiBXYihhKXtyZXR1cm4gbnVsbD09YT9NYXRoLmNlaWwoKHRoaXMubW9udGgoKSsxKS8zKTp0aGlzLm1vbnRoKDMqKGEtMSkrdGhpcy5tb250aCgpJTMpfWZ1bmN0aW9uIFhiKGEpe3JldHVybiB3YShhLHRoaXMuX3dlZWsuZG93LHRoaXMuX3dlZWsuZG95KS53ZWVrfWZ1bmN0aW9uIFliKCl7cmV0dXJuIHRoaXMuX3dlZWsuZG93fWZ1bmN0aW9uIFpiKCl7cmV0dXJuIHRoaXMuX3dlZWsuZG95fWZ1bmN0aW9uICRiKGEpe3ZhciBiPXRoaXMubG9jYWxlRGF0YSgpLndlZWsodGhpcyk7cmV0dXJuIG51bGw9PWE/Yjp0aGlzLmFkZCg3KihhLWIpLCJkIil9ZnVuY3Rpb24gX2IoYSl7dmFyIGI9d2EodGhpcywxLDQpLndlZWs7cmV0dXJuIG51bGw9PWE/Yjp0aGlzLmFkZCg3KihhLWIpLCJkIil9ZnVuY3Rpb24gYWMoYSxiKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGE/YTppc05hTihhKT8oYT1iLndlZWtkYXlzUGFyc2UoYSksIm51bWJlciI9PXR5cGVvZiBhP2E6bnVsbCk6cGFyc2VJbnQoYSwxMCl9ZnVuY3Rpb24gYmMoYSxiKXtyZXR1cm4gYyh0aGlzLl93ZWVrZGF5cyk/dGhpcy5fd2Vla2RheXNbYS5kYXkoKV06dGhpcy5fd2Vla2RheXNbdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdChiKT8iZm9ybWF0Ijoic3RhbmRhbG9uZSJdW2EuZGF5KCldfWZ1bmN0aW9uIGNjKGEpe3JldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0W2EuZGF5KCldfWZ1bmN0aW9uIGRjKGEpe3JldHVybiB0aGlzLl93ZWVrZGF5c01pblthLmRheSgpXX1mdW5jdGlvbiBlYyhhLGIsYyl7dmFyIGQsZSxmLGc9YS50b0xvY2FsZUxvd2VyQ2FzZSgpO2lmKCF0aGlzLl93ZWVrZGF5c1BhcnNlKWZvcih0aGlzLl93ZWVrZGF5c1BhcnNlPVtdLHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZT1bXSx0aGlzLl9taW5XZWVrZGF5c1BhcnNlPVtdLGQ9MDs3PmQ7KytkKWY9aChbMmUzLDFdKS5kYXkoZCksdGhpcy5fbWluV2Vla2RheXNQYXJzZVtkXT10aGlzLndlZWtkYXlzTWluKGYsIiIpLnRvTG9jYWxlTG93ZXJDYXNlKCksdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2RdPXRoaXMud2Vla2RheXNTaG9ydChmLCIiKS50b0xvY2FsZUxvd2VyQ2FzZSgpLHRoaXMuX3dlZWtkYXlzUGFyc2VbZF09dGhpcy53ZWVrZGF5cyhmLCIiKS50b0xvY2FsZUxvd2VyQ2FzZSgpO3JldHVybiBjPyJkZGRkIj09PWI/KGU9bWQuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLGcpLC0xIT09ZT9lOm51bGwpOiJkZGQiPT09Yj8oZT1tZC5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSxnKSwtMSE9PWU/ZTpudWxsKTooZT1tZC5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsZyksLTEhPT1lP2U6bnVsbCk6ImRkZGQiPT09Yj8oZT1tZC5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsZyksLTEhPT1lP2U6KGU9bWQuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsZyksLTEhPT1lP2U6KGU9bWQuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLGcpLC0xIT09ZT9lOm51bGwpKSk6ImRkZCI9PT1iPyhlPW1kLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLGcpLC0xIT09ZT9lOihlPW1kLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSxnKSwtMSE9PWU/ZTooZT1tZC5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsZyksLTEhPT1lP2U6bnVsbCkpKTooZT1tZC5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsZyksLTEhPT1lP2U6KGU9bWQuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLGcpLC0xIT09ZT9lOihlPW1kLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLGcpLC0xIT09ZT9lOm51bGwpKSl9ZnVuY3Rpb24gZmMoYSxiLGMpe3ZhciBkLGUsZjtpZih0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpcmV0dXJuIGVjLmNhbGwodGhpcyxhLGIsYyk7Zm9yKHRoaXMuX3dlZWtkYXlzUGFyc2V8fCh0aGlzLl93ZWVrZGF5c1BhcnNlPVtdLHRoaXMuX21pbldlZWtkYXlzUGFyc2U9W10sdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlPVtdLHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlPVtdKSxkPTA7Nz5kO2QrKyl7aWYoZT1oKFsyZTMsMV0pLmRheShkKSxjJiYhdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbZF0mJih0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtkXT1uZXcgUmVnRXhwKCJeIit0aGlzLndlZWtkYXlzKGUsIiIpLnJlcGxhY2UoIi4iLCIuPyIpKyIkIiwiaSIpLHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtkXT1uZXcgUmVnRXhwKCJeIit0aGlzLndlZWtkYXlzU2hvcnQoZSwiIikucmVwbGFjZSgiLiIsIi4/IikrIiQiLCJpIiksdGhpcy5fbWluV2Vla2RheXNQYXJzZVtkXT1uZXcgUmVnRXhwKCJeIit0aGlzLndlZWtkYXlzTWluKGUsIiIpLnJlcGxhY2UoIi4iLCIuPyIpKyIkIiwiaSIpKSx0aGlzLl93ZWVrZGF5c1BhcnNlW2RdfHwoZj0iXiIrdGhpcy53ZWVrZGF5cyhlLCIiKSsifF4iK3RoaXMud2Vla2RheXNTaG9ydChlLCIiKSsifF4iK3RoaXMud2Vla2RheXNNaW4oZSwiIiksdGhpcy5fd2Vla2RheXNQYXJzZVtkXT1uZXcgUmVnRXhwKGYucmVwbGFjZSgiLiIsIiIpLCJpIikpLGMmJiJkZGRkIj09PWImJnRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGQ7aWYoYyYmImRkZCI9PT1iJiZ0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbZF0udGVzdChhKSlyZXR1cm4gZDtpZihjJiYiZGQiPT09YiYmdGhpcy5fbWluV2Vla2RheXNQYXJzZVtkXS50ZXN0KGEpKXJldHVybiBkO2lmKCFjJiZ0aGlzLl93ZWVrZGF5c1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGR9fWZ1bmN0aW9uIGdjKGEpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gbnVsbCE9YT90aGlzOk5hTjt2YXIgYj10aGlzLl9pc1VUQz90aGlzLl9kLmdldFVUQ0RheSgpOnRoaXMuX2QuZ2V0RGF5KCk7cmV0dXJuIG51bGwhPWE/KGE9YWMoYSx0aGlzLmxvY2FsZURhdGEoKSksdGhpcy5hZGQoYS1iLCJkIikpOmJ9ZnVuY3Rpb24gaGMoYSl7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBudWxsIT1hP3RoaXM6TmFOO3ZhciBiPSh0aGlzLmRheSgpKzctdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93KSU3O3JldHVybiBudWxsPT1hP2I6dGhpcy5hZGQoYS1iLCJkIil9ZnVuY3Rpb24gaWMoYSl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP251bGw9PWE/dGhpcy5kYXkoKXx8Nzp0aGlzLmRheSh0aGlzLmRheSgpJTc/YTphLTcpOm51bGwhPWE/dGhpczpOYU59ZnVuY3Rpb24gamMoYSl7cmV0dXJuIHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdD8oZih0aGlzLCJfd2Vla2RheXNSZWdleCIpfHxtYy5jYWxsKHRoaXMpLGE/dGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleDp0aGlzLl93ZWVrZGF5c1JlZ2V4KTp0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4JiZhP3RoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNSZWdleH1mdW5jdGlvbiBrYyhhKXtyZXR1cm4gdGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0PyhmKHRoaXMsIl93ZWVrZGF5c1JlZ2V4Iil8fG1jLmNhbGwodGhpcyksYT90aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4KTp0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXgmJmE/dGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleH1mdW5jdGlvbiBsYyhhKXtyZXR1cm4gdGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0PyhmKHRoaXMsIl93ZWVrZGF5c1JlZ2V4Iil8fG1jLmNhbGwodGhpcyksYT90aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzTWluUmVnZXgpOnRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXgmJmE/dGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleDp0aGlzLl93ZWVrZGF5c01pblJlZ2V4fWZ1bmN0aW9uIG1jKCl7ZnVuY3Rpb24gYShhLGIpe3JldHVybiBiLmxlbmd0aC1hLmxlbmd0aH12YXIgYixjLGQsZSxmLGc9W10saT1bXSxqPVtdLGs9W107Zm9yKGI9MDs3PmI7YisrKWM9aChbMmUzLDFdKS5kYXkoYiksZD10aGlzLndlZWtkYXlzTWluKGMsIiIpLGU9dGhpcy53ZWVrZGF5c1Nob3J0KGMsIiIpLGY9dGhpcy53ZWVrZGF5cyhjLCIiKSxnLnB1c2goZCksaS5wdXNoKGUpLGoucHVzaChmKSxrLnB1c2goZCksay5wdXNoKGUpLGsucHVzaChmKTtmb3IoZy5zb3J0KGEpLGkuc29ydChhKSxqLnNvcnQoYSksay5zb3J0KGEpLGI9MDs3PmI7YisrKWlbYl09WihpW2JdKSxqW2JdPVooaltiXSksa1tiXT1aKGtbYl0pO3RoaXMuX3dlZWtkYXlzUmVnZXg9bmV3IFJlZ0V4cCgiXigiK2suam9pbigifCIpKyIpIiwiaSIpLHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleD10aGlzLl93ZWVrZGF5c1JlZ2V4LHRoaXMuX3dlZWtkYXlzTWluUmVnZXg9dGhpcy5fd2Vla2RheXNSZWdleCx0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4PW5ldyBSZWdFeHAoIl4oIitqLmpvaW4oInwiKSsiKSIsImkiKSx0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg9bmV3IFJlZ0V4cCgiXigiK2kuam9pbigifCIpKyIpIiwiaSIpLHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXg9bmV3IFJlZ0V4cCgiXigiK2cuam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uIG5jKGEpe3ZhciBiPU1hdGgucm91bmQoKHRoaXMuY2xvbmUoKS5zdGFydE9mKCJkYXkiKS10aGlzLmNsb25lKCkuc3RhcnRPZigieWVhciIpKS84NjRlNSkrMTtyZXR1cm4gbnVsbD09YT9iOnRoaXMuYWRkKGEtYiwiZCIpfWZ1bmN0aW9uIG9jKCl7cmV0dXJuIHRoaXMuaG91cnMoKSUxMnx8MTJ9ZnVuY3Rpb24gcGMoKXtyZXR1cm4gdGhpcy5ob3VycygpfHwyNH1mdW5jdGlvbiBxYyhhLGIpe1IoYSwwLDAsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubWVyaWRpZW0odGhpcy5ob3VycygpLHRoaXMubWludXRlcygpLGIpfSl9ZnVuY3Rpb24gcmMoYSxiKXtyZXR1cm4gYi5fbWVyaWRpZW1QYXJzZX1mdW5jdGlvbiBzYyhhKXtyZXR1cm4icCI9PT0oYSsiIikudG9Mb3dlckNhc2UoKS5jaGFyQXQoMCl9ZnVuY3Rpb24gdGMoYSxiLGMpe3JldHVybiBhPjExP2M/InBtIjoiUE0iOmM/ImFtIjoiQU0ifWZ1bmN0aW9uIHVjKGEsYil7YltTZF09cigxZTMqKCIwLiIrYSkpfWZ1bmN0aW9uIHZjKCl7cmV0dXJuIHRoaXMuX2lzVVRDPyJVVEMiOiIifWZ1bmN0aW9uIHdjKCl7cmV0dXJuIHRoaXMuX2lzVVRDPyJDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSI6IiJ9ZnVuY3Rpb24geGMoYSl7cmV0dXJuIEthKDFlMyphKX1mdW5jdGlvbiB5Yygpe3JldHVybiBLYS5hcHBseShudWxsLGFyZ3VtZW50cykucGFyc2Vab25lKCl9ZnVuY3Rpb24gemMoYSxiLGMpe3ZhciBkPXRoaXMuX2NhbGVuZGFyW2FdO3JldHVybiB3KGQpP2QuY2FsbChiLGMpOmR9ZnVuY3Rpb24gQWMoYSl7dmFyIGI9dGhpcy5fbG9uZ0RhdGVGb3JtYXRbYV0sYz10aGlzLl9sb25nRGF0ZUZvcm1hdFthLnRvVXBwZXJDYXNlKCldO3JldHVybiBifHwhYz9iOih0aGlzLl9sb25nRGF0ZUZvcm1hdFthXT1jLnJlcGxhY2UoL01NTU18TU18RER8ZGRkZC9nLGZ1bmN0aW9uKGEpe3JldHVybiBhLnNsaWNlKDEpfSksdGhpcy5fbG9uZ0RhdGVGb3JtYXRbYV0pfWZ1bmN0aW9uIEJjKCl7cmV0dXJuIHRoaXMuX2ludmFsaWREYXRlfWZ1bmN0aW9uIENjKGEpe3JldHVybiB0aGlzLl9vcmRpbmFsLnJlcGxhY2UoIiVkIixhKX1mdW5jdGlvbiBEYyhhKXtyZXR1cm4gYX1mdW5jdGlvbiBFYyhhLGIsYyxkKXt2YXIgZT10aGlzLl9yZWxhdGl2ZVRpbWVbY107cmV0dXJuIHcoZSk/ZShhLGIsYyxkKTplLnJlcGxhY2UoLyVkL2ksYSl9ZnVuY3Rpb24gRmMoYSxiKXt2YXIgYz10aGlzLl9yZWxhdGl2ZVRpbWVbYT4wPyJmdXR1cmUiOiJwYXN0Il07cmV0dXJuIHcoYyk/YyhiKTpjLnJlcGxhY2UoLyVzL2ksYil9ZnVuY3Rpb24gR2MoYSxiLGMsZCl7dmFyIGU9SCgpLGY9aCgpLnNldChkLGIpO3JldHVybiBlW2NdKGYsYSl9ZnVuY3Rpb24gSGMoYSxiLGMpe2lmKCJudW1iZXIiPT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiIixudWxsIT1iKXJldHVybiBHYyhhLGIsYywibW9udGgiKTt2YXIgZCxlPVtdO2ZvcihkPTA7MTI+ZDtkKyspZVtkXT1HYyhhLGQsYywibW9udGgiKTtyZXR1cm4gZX1mdW5jdGlvbiBJYyhhLGIsYyxkKXsiYm9vbGVhbiI9PXR5cGVvZiBhPygibnVtYmVyIj09dHlwZW9mIGImJihjPWIsYj12b2lkIDApLGI9Ynx8IiIpOihiPWEsYz1iLGE9ITEsIm51bWJlciI9PXR5cGVvZiBiJiYoYz1iLGI9dm9pZCAwKSxiPWJ8fCIiKTt2YXIgZT1IKCksZj1hP2UuX3dlZWsuZG93OjA7aWYobnVsbCE9YylyZXR1cm4gR2MoYiwoYytmKSU3LGQsImRheSIpO3ZhciBnLGg9W107Zm9yKGc9MDs3Pmc7ZysrKWhbZ109R2MoYiwoZytmKSU3LGQsImRheSIpO3JldHVybiBofWZ1bmN0aW9uIEpjKGEsYil7cmV0dXJuIEhjKGEsYiwibW9udGhzIil9ZnVuY3Rpb24gS2MoYSxiKXtyZXR1cm4gSGMoYSxiLCJtb250aHNTaG9ydCIpfWZ1bmN0aW9uIExjKGEsYixjKXtyZXR1cm4gSWMoYSxiLGMsIndlZWtkYXlzIil9ZnVuY3Rpb24gTWMoYSxiLGMpe3JldHVybiBJYyhhLGIsYywid2Vla2RheXNTaG9ydCIpfWZ1bmN0aW9uIE5jKGEsYixjKXtyZXR1cm4gSWMoYSxiLGMsIndlZWtkYXlzTWluIil9ZnVuY3Rpb24gT2MoKXt2YXIgYT10aGlzLl9kYXRhO3JldHVybiB0aGlzLl9taWxsaXNlY29uZHM9TGUodGhpcy5fbWlsbGlzZWNvbmRzKSx0aGlzLl9kYXlzPUxlKHRoaXMuX2RheXMpLHRoaXMuX21vbnRocz1MZSh0aGlzLl9tb250aHMpLGEubWlsbGlzZWNvbmRzPUxlKGEubWlsbGlzZWNvbmRzKSxhLnNlY29uZHM9TGUoYS5zZWNvbmRzKSxhLm1pbnV0ZXM9TGUoYS5taW51dGVzKSxhLmhvdXJzPUxlKGEuaG91cnMpLGEubW9udGhzPUxlKGEubW9udGhzKSxhLnllYXJzPUxlKGEueWVhcnMpLHRoaXN9ZnVuY3Rpb24gUGMoYSxiLGMsZCl7dmFyIGU9ZGIoYixjKTtyZXR1cm4gYS5fbWlsbGlzZWNvbmRzKz1kKmUuX21pbGxpc2Vjb25kcyxhLl9kYXlzKz1kKmUuX2RheXMsYS5fbW9udGhzKz1kKmUuX21vbnRocyxhLl9idWJibGUoKX1mdW5jdGlvbiBRYyhhLGIpe3JldHVybiBQYyh0aGlzLGEsYiwxKX1mdW5jdGlvbiBSYyhhLGIpe3JldHVybiBQYyh0aGlzLGEsYiwtMSl9ZnVuY3Rpb24gU2MoYSl7cmV0dXJuIDA+YT9NYXRoLmZsb29yKGEpOk1hdGguY2VpbChhKX1mdW5jdGlvbiBUYygpe3ZhciBhLGIsYyxkLGUsZj10aGlzLl9taWxsaXNlY29uZHMsZz10aGlzLl9kYXlzLGg9dGhpcy5fbW9udGhzLGk9dGhpcy5fZGF0YTtyZXR1cm4gZj49MCYmZz49MCYmaD49MHx8MD49ZiYmMD49ZyYmMD49aHx8KGYrPTg2NGU1KlNjKFZjKGgpK2cpLGc9MCxoPTApLGkubWlsbGlzZWNvbmRzPWYlMWUzLGE9cShmLzFlMyksaS5zZWNvbmRzPWElNjAsYj1xKGEvNjApLGkubWludXRlcz1iJTYwLGM9cShiLzYwKSxpLmhvdXJzPWMlMjQsZys9cShjLzI0KSxlPXEoVWMoZykpLGgrPWUsZy09U2MoVmMoZSkpLGQ9cShoLzEyKSxoJT0xMixpLmRheXM9ZyxpLm1vbnRocz1oLGkueWVhcnM9ZCx0aGlzfWZ1bmN0aW9uIFVjKGEpe3JldHVybiA0ODAwKmEvMTQ2MDk3fWZ1bmN0aW9uIFZjKGEpe3JldHVybiAxNDYwOTcqYS80ODAwfWZ1bmN0aW9uIFdjKGEpe3ZhciBiLGMsZD10aGlzLl9taWxsaXNlY29uZHM7aWYoYT1LKGEpLCJtb250aCI9PT1hfHwieWVhciI9PT1hKXJldHVybiBiPXRoaXMuX2RheXMrZC84NjRlNSxjPXRoaXMuX21vbnRocytVYyhiKSwibW9udGgiPT09YT9jOmMvMTI7c3dpdGNoKGI9dGhpcy5fZGF5cytNYXRoLnJvdW5kKFZjKHRoaXMuX21vbnRocykpLGEpe2Nhc2Uid2VlayI6cmV0dXJuIGIvNytkLzYwNDhlNTtjYXNlImRheSI6cmV0dXJuIGIrZC84NjRlNTtjYXNlImhvdXIiOnJldHVybiAyNCpiK2QvMzZlNTtjYXNlIm1pbnV0ZSI6cmV0dXJuIDE0NDAqYitkLzZlNDtjYXNlInNlY29uZCI6cmV0dXJuIDg2NDAwKmIrZC8xZTM7Y2FzZSJtaWxsaXNlY29uZCI6cmV0dXJuIE1hdGguZmxvb3IoODY0ZTUqYikrZDtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biB1bml0ICIrYSl9fWZ1bmN0aW9uIFhjKCl7cmV0dXJuIHRoaXMuX21pbGxpc2Vjb25kcys4NjRlNSp0aGlzLl9kYXlzK3RoaXMuX21vbnRocyUxMioyNTkyZTYrMzE1MzZlNipyKHRoaXMuX21vbnRocy8xMil9ZnVuY3Rpb24gWWMoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXMoYSl9fWZ1bmN0aW9uIFpjKGEpewpyZXR1cm4gYT1LKGEpLHRoaXNbYSsicyJdKCl9ZnVuY3Rpb24gJGMoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGFbYV19fWZ1bmN0aW9uIF9jKCl7cmV0dXJuIHEodGhpcy5kYXlzKCkvNyl9ZnVuY3Rpb24gYWQoYSxiLGMsZCxlKXtyZXR1cm4gZS5yZWxhdGl2ZVRpbWUoYnx8MSwhIWMsYSxkKX1mdW5jdGlvbiBiZChhLGIsYyl7dmFyIGQ9ZGIoYSkuYWJzKCksZT1fZShkLmFzKCJzIikpLGY9X2UoZC5hcygibSIpKSxnPV9lKGQuYXMoImgiKSksaD1fZShkLmFzKCJkIikpLGk9X2UoZC5hcygiTSIpKSxqPV9lKGQuYXMoInkiKSksaz1lPGFmLnMmJlsicyIsZV18fDE+PWYmJlsibSJdfHxmPGFmLm0mJlsibW0iLGZdfHwxPj1nJiZbImgiXXx8ZzxhZi5oJiZbImhoIixnXXx8MT49aCYmWyJkIl18fGg8YWYuZCYmWyJkZCIsaF18fDE+PWkmJlsiTSJdfHxpPGFmLk0mJlsiTU0iLGldfHwxPj1qJiZbInkiXXx8WyJ5eSIsal07cmV0dXJuIGtbMl09YixrWzNdPSthPjAsa1s0XT1jLGFkLmFwcGx5KG51bGwsayl9ZnVuY3Rpb24gY2QoYSxiKXtyZXR1cm4gdm9pZCAwPT09YWZbYV0/ITE6dm9pZCAwPT09Yj9hZlthXTooYWZbYV09YiwhMCl9ZnVuY3Rpb24gZGQoYSl7dmFyIGI9dGhpcy5sb2NhbGVEYXRhKCksYz1iZCh0aGlzLCFhLGIpO3JldHVybiBhJiYoYz1iLnBhc3RGdXR1cmUoK3RoaXMsYykpLGIucG9zdGZvcm1hdChjKX1mdW5jdGlvbiBlZCgpe3ZhciBhLGIsYyxkPWJmKHRoaXMuX21pbGxpc2Vjb25kcykvMWUzLGU9YmYodGhpcy5fZGF5cyksZj1iZih0aGlzLl9tb250aHMpO2E9cShkLzYwKSxiPXEoYS82MCksZCU9NjAsYSU9NjAsYz1xKGYvMTIpLGYlPTEyO3ZhciBnPWMsaD1mLGk9ZSxqPWIsaz1hLGw9ZCxtPXRoaXMuYXNTZWNvbmRzKCk7cmV0dXJuIG0/KDA+bT8iLSI6IiIpKyJQIisoZz9nKyJZIjoiIikrKGg/aCsiTSI6IiIpKyhpP2krIkQiOiIiKSsoanx8a3x8bD8iVCI6IiIpKyhqP2orIkgiOiIiKSsoaz9rKyJNIjoiIikrKGw/bCsiUyI6IiIpOiJQMEQifXZhciBmZCxnZDtnZD1BcnJheS5wcm90b3R5cGUuc29tZT9BcnJheS5wcm90b3R5cGUuc29tZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9T2JqZWN0KHRoaXMpLGM9Yi5sZW5ndGg+Pj4wLGQ9MDtjPmQ7ZCsrKWlmKGQgaW4gYiYmYS5jYWxsKHRoaXMsYltkXSxkLGIpKXJldHVybiEwO3JldHVybiExfTt2YXIgaGQ9YS5tb21lbnRQcm9wZXJ0aWVzPVtdLGlkPSExLGpkPXt9O2Euc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdzPSExLGEuZGVwcmVjYXRpb25IYW5kbGVyPW51bGw7dmFyIGtkO2tkPU9iamVjdC5rZXlzP09iamVjdC5rZXlzOmZ1bmN0aW9uKGEpe3ZhciBiLGM9W107Zm9yKGIgaW4gYSlmKGEsYikmJmMucHVzaChiKTtyZXR1cm4gY307dmFyIGxkLG1kLG5kPXt9LG9kPXt9LHBkPS8oXFtbXlxbXSpcXSl8KFxcKT8oW0hoXW1tKHNzKT98TW98TU0/TT9NP3xEb3xERERvfEREP0Q/RD98ZGRkP2Q/fGRvP3x3W298d10/fFdbb3xXXT98UW8/fFlZWVlZWXxZWVlZWXxZWVlZfFlZfGdnKGdnZz8pP3xHRyhHR0c/KT98ZXxFfGF8QXxoaD98SEg/fGtrP3xtbT98c3M/fFN7MSw5fXx4fFh8eno/fFpaP3wuKS9nLHFkPS8oXFtbXlxbXSpcXSl8KFxcKT8oTFRTfExUfExMP0w/TD98bHsxLDR9KS9nLHJkPXt9LHNkPXt9LHRkPS9cZC8sdWQ9L1xkXGQvLHZkPS9cZHszfS8sd2Q9L1xkezR9Lyx4ZD0vWystXT9cZHs2fS8seWQ9L1xkXGQ/Lyx6ZD0vXGRcZFxkXGQ/LyxBZD0vXGRcZFxkXGRcZFxkPy8sQmQ9L1xkezEsM30vLENkPS9cZHsxLDR9LyxEZD0vWystXT9cZHsxLDZ9LyxFZD0vXGQrLyxGZD0vWystXT9cZCsvLEdkPS9afFsrLV1cZFxkOj9cZFxkL2dpLEhkPS9afFsrLV1cZFxkKD86Oj9cZFxkKT8vZ2ksSWQ9L1srLV0/XGQrKFwuXGR7MSwzfSk/LyxKZD0vWzAtOV0qWydhLXpcdTAwQTAtXHUwNUZGXHUwNzAwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSt8W1x1MDYwMC1cdTA2RkZcL10rKFxzKj9bXHUwNjAwLVx1MDZGRl0rKXsxLDJ9L2ksS2Q9e30sTGQ9e30sTWQ9MCxOZD0xLE9kPTIsUGQ9MyxRZD00LFJkPTUsU2Q9NixUZD03LFVkPTg7bWQ9QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/QXJyYXkucHJvdG90eXBlLmluZGV4T2Y6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGI9MDtiPHRoaXMubGVuZ3RoOysrYilpZih0aGlzW2JdPT09YSlyZXR1cm4gYjtyZXR1cm4tMX0sUigiTSIsWyJNTSIsMl0sIk1vIixmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vbnRoKCkrMX0pLFIoIk1NTSIsMCwwLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLGEpfSksUigiTU1NTSIsMCwwLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHModGhpcyxhKX0pLEooIm1vbnRoIiwiTSIpLFcoIk0iLHlkKSxXKCJNTSIseWQsdWQpLFcoIk1NTSIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5tb250aHNTaG9ydFJlZ2V4KGEpfSksVygiTU1NTSIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5tb250aHNSZWdleChhKX0pLCQoWyJNIiwiTU0iXSxmdW5jdGlvbihhLGIpe2JbTmRdPXIoYSktMX0pLCQoWyJNTU0iLCJNTU1NIl0sZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9Yy5fbG9jYWxlLm1vbnRoc1BhcnNlKGEsZCxjLl9zdHJpY3QpO251bGwhPWU/YltOZF09ZTpqKGMpLmludmFsaWRNb250aD1hfSk7dmFyIFZkPS9EW29EXT8oXFtbXlxbXF1dKlxdfFxzKykrTU1NTT8vLFdkPSJKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyIi5zcGxpdCgiXyIpLFhkPSJKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYyIuc3BsaXQoIl8iKSxZZD1KZCxaZD1KZCwkZD0vXlxzKigoPzpbKy1dXGR7Nn18XGR7NH0pLSg/OlxkXGQtXGRcZHxXXGRcZC1cZHxXXGRcZHxcZFxkXGR8XGRcZCkpKD86KFR8ICkoXGRcZCg/OjpcZFxkKD86OlxkXGQoPzpbLixdXGQrKT8pPyk/KShbXCtcLV1cZFxkKD86Oj9cZFxkKT98XHMqWik/KT8vLF9kPS9eXHMqKCg/OlsrLV1cZHs2fXxcZHs0fSkoPzpcZFxkXGRcZHxXXGRcZFxkfFdcZFxkfFxkXGRcZHxcZFxkKSkoPzooVHwgKShcZFxkKD86XGRcZCg/OlxkXGQoPzpbLixdXGQrKT8pPyk/KShbXCtcLV1cZFxkKD86Oj9cZFxkKT98XHMqWik/KT8vLGFlPS9afFsrLV1cZFxkKD86Oj9cZFxkKT8vLGJlPVtbIllZWVlZWS1NTS1ERCIsL1srLV1cZHs2fS1cZFxkLVxkXGQvXSxbIllZWVktTU0tREQiLC9cZHs0fS1cZFxkLVxkXGQvXSxbIkdHR0ctW1ddV1ctRSIsL1xkezR9LVdcZFxkLVxkL10sWyJHR0dHLVtXXVdXIiwvXGR7NH0tV1xkXGQvLCExXSxbIllZWVktREREIiwvXGR7NH0tXGR7M30vXSxbIllZWVktTU0iLC9cZHs0fS1cZFxkLywhMV0sWyJZWVlZWVlNTUREIiwvWystXVxkezEwfS9dLFsiWVlZWU1NREQiLC9cZHs4fS9dLFsiR0dHR1tXXVdXRSIsL1xkezR9V1xkezN9L10sWyJHR0dHW1ddV1ciLC9cZHs0fVdcZHsyfS8sITFdLFsiWVlZWURERCIsL1xkezd9L11dLGNlPVtbIkhIOm1tOnNzLlNTU1MiLC9cZFxkOlxkXGQ6XGRcZFwuXGQrL10sWyJISDptbTpzcyxTU1NTIiwvXGRcZDpcZFxkOlxkXGQsXGQrL10sWyJISDptbTpzcyIsL1xkXGQ6XGRcZDpcZFxkL10sWyJISDptbSIsL1xkXGQ6XGRcZC9dLFsiSEhtbXNzLlNTU1MiLC9cZFxkXGRcZFxkXGRcLlxkKy9dLFsiSEhtbXNzLFNTU1MiLC9cZFxkXGRcZFxkXGQsXGQrL10sWyJISG1tc3MiLC9cZFxkXGRcZFxkXGQvXSxbIkhIbW0iLC9cZFxkXGRcZC9dLFsiSEgiLC9cZFxkL11dLGRlPS9eXC8/RGF0ZVwoKFwtP1xkKykvaTthLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrPXUoIm1vbWVudCBjb25zdHJ1Y3Rpb24gZmFsbHMgYmFjayB0byBqcyBEYXRlLiBUaGlzIGlzIGRpc2NvdXJhZ2VkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdXBjb21pbmcgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNDA3IGZvciBtb3JlIGluZm8uIixmdW5jdGlvbihhKXthLl9kPW5ldyBEYXRlKGEuX2krKGEuX3VzZVVUQz8iIFVUQyI6IiIpKX0pLFIoIlkiLDAsMCxmdW5jdGlvbigpe3ZhciBhPXRoaXMueWVhcigpO3JldHVybiA5OTk5Pj1hPyIiK2E6IisiK2F9KSxSKDAsWyJZWSIsMl0sMCxmdW5jdGlvbigpe3JldHVybiB0aGlzLnllYXIoKSUxMDB9KSxSKDAsWyJZWVlZIiw0XSwwLCJ5ZWFyIiksUigwLFsiWVlZWVkiLDVdLDAsInllYXIiKSxSKDAsWyJZWVlZWVkiLDYsITBdLDAsInllYXIiKSxKKCJ5ZWFyIiwieSIpLFcoIlkiLEZkKSxXKCJZWSIseWQsdWQpLFcoIllZWVkiLENkLHdkKSxXKCJZWVlZWSIsRGQseGQpLFcoIllZWVlZWSIsRGQseGQpLCQoWyJZWVlZWSIsIllZWVlZWSJdLE1kKSwkKCJZWVlZIixmdW5jdGlvbihiLGMpe2NbTWRdPTI9PT1iLmxlbmd0aD9hLnBhcnNlVHdvRGlnaXRZZWFyKGIpOnIoYil9KSwkKCJZWSIsZnVuY3Rpb24oYixjKXtjW01kXT1hLnBhcnNlVHdvRGlnaXRZZWFyKGIpfSksJCgiWSIsZnVuY3Rpb24oYSxiKXtiW01kXT1wYXJzZUludChhLDEwKX0pLGEucGFyc2VUd29EaWdpdFllYXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHIoYSkrKHIoYSk+Njg/MTkwMDoyZTMpfTt2YXIgZWU9TSgiRnVsbFllYXIiLCEwKTthLklTT184NjAxPWZ1bmN0aW9uKCl7fTt2YXIgZmU9dSgibW9tZW50KCkubWluIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWF4IGluc3RlYWQuIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNTQ4IixmdW5jdGlvbigpe3ZhciBhPUthLmFwcGx5KG51bGwsYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJmEuaXNWYWxpZCgpP3RoaXM+YT90aGlzOmE6bCgpfSksZ2U9dSgibW9tZW50KCkubWF4IGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWluIGluc3RlYWQuIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNTQ4IixmdW5jdGlvbigpe3ZhciBhPUthLmFwcGx5KG51bGwsYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJmEuaXNWYWxpZCgpP2E+dGhpcz90aGlzOmE6bCgpfSksaGU9ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3c/RGF0ZS5ub3coKTorbmV3IERhdGV9O1FhKCJaIiwiOiIpLFFhKCJaWiIsIiIpLFcoIloiLEhkKSxXKCJaWiIsSGQpLCQoWyJaIiwiWloiXSxmdW5jdGlvbihhLGIsYyl7Yy5fdXNlVVRDPSEwLGMuX3R6bT1SYShIZCxhKX0pO3ZhciBpZT0vKFtcK1wtXXxcZFxkKS9naTthLnVwZGF0ZU9mZnNldD1mdW5jdGlvbigpe307dmFyIGplPS9eKFwtKT8oPzooXGQqKVsuIF0pPyhcZCspXDooXGQrKSg/Olw6KFxkKylcLj8oXGR7M30pP1xkKik/JC8sa2U9L14oLSk/UCg/OigtP1swLTksLl0qKVkpPyg/OigtP1swLTksLl0qKU0pPyg/OigtP1swLTksLl0qKVcpPyg/OigtP1swLTksLl0qKUQpPyg/OlQoPzooLT9bMC05LC5dKilIKT8oPzooLT9bMC05LC5dKilNKT8oPzooLT9bMC05LC5dKilTKT8pPyQvO2RiLmZuPU9hLnByb3RvdHlwZTt2YXIgbGU9aWIoMSwiYWRkIiksbWU9aWIoLTEsInN1YnRyYWN0Iik7YS5kZWZhdWx0Rm9ybWF0PSJZWVlZLU1NLUREVEhIOm1tOnNzWiIsYS5kZWZhdWx0Rm9ybWF0VXRjPSJZWVlZLU1NLUREVEhIOm1tOnNzW1pdIjt2YXIgbmU9dSgibW9tZW50KCkubGFuZygpIGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBtb21lbnQoKS5sb2NhbGVEYXRhKCkgdG8gZ2V0IHRoZSBsYW5ndWFnZSBjb25maWd1cmF0aW9uLiBVc2UgbW9tZW50KCkubG9jYWxlKCkgdG8gY2hhbmdlIGxhbmd1YWdlcy4iLGZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hP3RoaXMubG9jYWxlRGF0YSgpOnRoaXMubG9jYWxlKGEpfSk7UigwLFsiZ2ciLDJdLDAsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZWVrWWVhcigpJTEwMH0pLFIoMCxbIkdHIiwyXSwwLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNvV2Vla1llYXIoKSUxMDB9KSxQYigiZ2dnZyIsIndlZWtZZWFyIiksUGIoImdnZ2dnIiwid2Vla1llYXIiKSxQYigiR0dHRyIsImlzb1dlZWtZZWFyIiksUGIoIkdHR0dHIiwiaXNvV2Vla1llYXIiKSxKKCJ3ZWVrWWVhciIsImdnIiksSigiaXNvV2Vla1llYXIiLCJHRyIpLFcoIkciLEZkKSxXKCJnIixGZCksVygiR0ciLHlkLHVkKSxXKCJnZyIseWQsdWQpLFcoIkdHR0ciLENkLHdkKSxXKCJnZ2dnIixDZCx3ZCksVygiR0dHR0ciLERkLHhkKSxXKCJnZ2dnZyIsRGQseGQpLF8oWyJnZ2dnIiwiZ2dnZ2ciLCJHR0dHIiwiR0dHR0ciXSxmdW5jdGlvbihhLGIsYyxkKXtiW2Quc3Vic3RyKDAsMildPXIoYSl9KSxfKFsiZ2ciLCJHRyJdLGZ1bmN0aW9uKGIsYyxkLGUpe2NbZV09YS5wYXJzZVR3b0RpZ2l0WWVhcihiKX0pLFIoIlEiLDAsIlFvIiwicXVhcnRlciIpLEooInF1YXJ0ZXIiLCJRIiksVygiUSIsdGQpLCQoIlEiLGZ1bmN0aW9uKGEsYil7YltOZF09MyoocihhKS0xKX0pLFIoInciLFsid3ciLDJdLCJ3byIsIndlZWsiKSxSKCJXIixbIldXIiwyXSwiV28iLCJpc29XZWVrIiksSigid2VlayIsInciKSxKKCJpc29XZWVrIiwiVyIpLFcoInciLHlkKSxXKCJ3dyIseWQsdWQpLFcoIlciLHlkKSxXKCJXVyIseWQsdWQpLF8oWyJ3Iiwid3ciLCJXIiwiV1ciXSxmdW5jdGlvbihhLGIsYyxkKXtiW2Quc3Vic3RyKDAsMSldPXIoYSl9KTt2YXIgb2U9e2RvdzowLGRveTo2fTtSKCJEIixbIkREIiwyXSwiRG8iLCJkYXRlIiksSigiZGF0ZSIsIkQiKSxXKCJEIix5ZCksVygiREQiLHlkLHVkKSxXKCJEbyIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT9iLl9vcmRpbmFsUGFyc2U6Yi5fb3JkaW5hbFBhcnNlTGVuaWVudH0pLCQoWyJEIiwiREQiXSxPZCksJCgiRG8iLGZ1bmN0aW9uKGEsYil7YltPZF09cihhLm1hdGNoKHlkKVswXSwxMCl9KTt2YXIgcGU9TSgiRGF0ZSIsITApO1IoImQiLDAsImRvIiwiZGF5IiksUigiZGQiLDAsMCxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4odGhpcyxhKX0pLFIoImRkZCIsMCwwLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c1Nob3J0KHRoaXMsYSl9KSxSKCJkZGRkIiwwLDAsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzKHRoaXMsYSl9KSxSKCJlIiwwLDAsIndlZWtkYXkiKSxSKCJFIiwwLDAsImlzb1dlZWtkYXkiKSxKKCJkYXkiLCJkIiksSigid2Vla2RheSIsImUiKSxKKCJpc29XZWVrZGF5IiwiRSIpLFcoImQiLHlkKSxXKCJlIix5ZCksVygiRSIseWQpLFcoImRkIixmdW5jdGlvbihhLGIpe3JldHVybiBiLndlZWtkYXlzTWluUmVnZXgoYSl9KSxXKCJkZGQiLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGIud2Vla2RheXNTaG9ydFJlZ2V4KGEpfSksVygiZGRkZCIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi53ZWVrZGF5c1JlZ2V4KGEpfSksXyhbImRkIiwiZGRkIiwiZGRkZCJdLGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWMuX2xvY2FsZS53ZWVrZGF5c1BhcnNlKGEsZCxjLl9zdHJpY3QpO251bGwhPWU/Yi5kPWU6aihjKS5pbnZhbGlkV2Vla2RheT1hfSksXyhbImQiLCJlIiwiRSJdLGZ1bmN0aW9uKGEsYixjLGQpe2JbZF09cihhKX0pO3ZhciBxZT0iU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXkiLnNwbGl0KCJfIikscmU9IlN1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCIuc3BsaXQoIl8iKSxzZT0iU3VfTW9fVHVfV2VfVGhfRnJfU2EiLnNwbGl0KCJfIiksdGU9SmQsdWU9SmQsdmU9SmQ7UigiREREIixbIkREREQiLDNdLCJERERvIiwiZGF5T2ZZZWFyIiksSigiZGF5T2ZZZWFyIiwiREREIiksVygiREREIixCZCksVygiRERERCIsdmQpLCQoWyJEREQiLCJEREREIl0sZnVuY3Rpb24oYSxiLGMpe2MuX2RheU9mWWVhcj1yKGEpfSksUigiSCIsWyJISCIsMl0sMCwiaG91ciIpLFIoImgiLFsiaGgiLDJdLDAsb2MpLFIoImsiLFsia2siLDJdLDAscGMpLFIoImhtbSIsMCwwLGZ1bmN0aW9uKCl7cmV0dXJuIiIrb2MuYXBwbHkodGhpcykrUSh0aGlzLm1pbnV0ZXMoKSwyKX0pLFIoImhtbXNzIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm4iIitvYy5hcHBseSh0aGlzKStRKHRoaXMubWludXRlcygpLDIpK1EodGhpcy5zZWNvbmRzKCksMil9KSxSKCJIbW0iLDAsMCxmdW5jdGlvbigpe3JldHVybiIiK3RoaXMuaG91cnMoKStRKHRoaXMubWludXRlcygpLDIpfSksUigiSG1tc3MiLDAsMCxmdW5jdGlvbigpe3JldHVybiIiK3RoaXMuaG91cnMoKStRKHRoaXMubWludXRlcygpLDIpK1EodGhpcy5zZWNvbmRzKCksMil9KSxxYygiYSIsITApLHFjKCJBIiwhMSksSigiaG91ciIsImgiKSxXKCJhIixyYyksVygiQSIscmMpLFcoIkgiLHlkKSxXKCJoIix5ZCksVygiSEgiLHlkLHVkKSxXKCJoaCIseWQsdWQpLFcoImhtbSIsemQpLFcoImhtbXNzIixBZCksVygiSG1tIix6ZCksVygiSG1tc3MiLEFkKSwkKFsiSCIsIkhIIl0sUGQpLCQoWyJhIiwiQSJdLGZ1bmN0aW9uKGEsYixjKXtjLl9pc1BtPWMuX2xvY2FsZS5pc1BNKGEpLGMuX21lcmlkaWVtPWF9KSwkKFsiaCIsImhoIl0sZnVuY3Rpb24oYSxiLGMpe2JbUGRdPXIoYSksaihjKS5iaWdIb3VyPSEwfSksJCgiaG1tIixmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5sZW5ndGgtMjtiW1BkXT1yKGEuc3Vic3RyKDAsZCkpLGJbUWRdPXIoYS5zdWJzdHIoZCkpLGooYykuYmlnSG91cj0hMH0pLCQoImhtbXNzIixmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5sZW5ndGgtNCxlPWEubGVuZ3RoLTI7YltQZF09cihhLnN1YnN0cigwLGQpKSxiW1FkXT1yKGEuc3Vic3RyKGQsMikpLGJbUmRdPXIoYS5zdWJzdHIoZSkpLGooYykuYmlnSG91cj0hMH0pLCQoIkhtbSIsZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEubGVuZ3RoLTI7YltQZF09cihhLnN1YnN0cigwLGQpKSxiW1FkXT1yKGEuc3Vic3RyKGQpKX0pLCQoIkhtbXNzIixmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5sZW5ndGgtNCxlPWEubGVuZ3RoLTI7YltQZF09cihhLnN1YnN0cigwLGQpKSxiW1FkXT1yKGEuc3Vic3RyKGQsMikpLGJbUmRdPXIoYS5zdWJzdHIoZSkpfSk7dmFyIHdlPS9bYXBdXC4/bT9cLj8vaSx4ZT1NKCJIb3VycyIsITApO1IoIm0iLFsibW0iLDJdLDAsIm1pbnV0ZSIpLEooIm1pbnV0ZSIsIm0iKSxXKCJtIix5ZCksVygibW0iLHlkLHVkKSwkKFsibSIsIm1tIl0sUWQpO3ZhciB5ZT1NKCJNaW51dGVzIiwhMSk7UigicyIsWyJzcyIsMl0sMCwic2Vjb25kIiksSigic2Vjb25kIiwicyIpLFcoInMiLHlkKSxXKCJzcyIseWQsdWQpLCQoWyJzIiwic3MiXSxSZCk7dmFyIHplPU0oIlNlY29uZHMiLCExKTtSKCJTIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm5+fih0aGlzLm1pbGxpc2Vjb25kKCkvMTAwKX0pLFIoMCxbIlNTIiwyXSwwLGZ1bmN0aW9uKCl7cmV0dXJufn4odGhpcy5taWxsaXNlY29uZCgpLzEwKX0pLFIoMCxbIlNTUyIsM10sMCwibWlsbGlzZWNvbmQiKSxSKDAsWyJTU1NTIiw0XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDEwKnRoaXMubWlsbGlzZWNvbmQoKX0pLFIoMCxbIlNTU1NTIiw1XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDEwMCp0aGlzLm1pbGxpc2Vjb25kKCl9KSxSKDAsWyJTU1NTU1MiLDZdLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWUzKnRoaXMubWlsbGlzZWNvbmQoKX0pLFIoMCxbIlNTU1NTU1MiLDddLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWU0KnRoaXMubWlsbGlzZWNvbmQoKX0pLFIoMCxbIlNTU1NTU1NTIiw4XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDFlNSp0aGlzLm1pbGxpc2Vjb25kKCl9KSxSKDAsWyJTU1NTU1NTU1MiLDldLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWU2KnRoaXMubWlsbGlzZWNvbmQoKX0pLEooIm1pbGxpc2Vjb25kIiwibXMiKSxXKCJTIixCZCx0ZCksVygiU1MiLEJkLHVkKSxXKCJTU1MiLEJkLHZkKTt2YXIgQWU7Zm9yKEFlPSJTU1NTIjtBZS5sZW5ndGg8PTk7QWUrPSJTIilXKEFlLEVkKTtmb3IoQWU9IlMiO0FlLmxlbmd0aDw9OTtBZSs9IlMiKSQoQWUsdWMpO3ZhciBCZT1NKCJNaWxsaXNlY29uZHMiLCExKTtSKCJ6IiwwLDAsInpvbmVBYmJyIiksUigienoiLDAsMCwiem9uZU5hbWUiKTt2YXIgQ2U9by5wcm90b3R5cGU7Q2UuYWRkPWxlLENlLmNhbGVuZGFyPWtiLENlLmNsb25lPWxiLENlLmRpZmY9c2IsQ2UuZW5kT2Y9RWIsQ2UuZm9ybWF0PXdiLENlLmZyb209eGIsQ2UuZnJvbU5vdz15YixDZS50bz16YixDZS50b05vdz1BYixDZS5nZXQ9UCxDZS5pbnZhbGlkQXQ9TmIsQ2UuaXNBZnRlcj1tYixDZS5pc0JlZm9yZT1uYixDZS5pc0JldHdlZW49b2IsQ2UuaXNTYW1lPXBiLENlLmlzU2FtZU9yQWZ0ZXI9cWIsQ2UuaXNTYW1lT3JCZWZvcmU9cmIsQ2UuaXNWYWxpZD1MYixDZS5sYW5nPW5lLENlLmxvY2FsZT1CYixDZS5sb2NhbGVEYXRhPUNiLENlLm1heD1nZSxDZS5taW49ZmUsQ2UucGFyc2luZ0ZsYWdzPU1iLENlLnNldD1QLENlLnN0YXJ0T2Y9RGIsQ2Uuc3VidHJhY3Q9bWUsQ2UudG9BcnJheT1JYixDZS50b09iamVjdD1KYixDZS50b0RhdGU9SGIsQ2UudG9JU09TdHJpbmc9dmIsQ2UudG9KU09OPUtiLENlLnRvU3RyaW5nPXViLENlLnVuaXg9R2IsQ2UudmFsdWVPZj1GYixDZS5jcmVhdGlvbkRhdGE9T2IsQ2UueWVhcj1lZSxDZS5pc0xlYXBZZWFyPXRhLENlLndlZWtZZWFyPVFiLENlLmlzb1dlZWtZZWFyPVJiLENlLnF1YXJ0ZXI9Q2UucXVhcnRlcnM9V2IsQ2UubW9udGg9aGEsQ2UuZGF5c0luTW9udGg9aWEsQ2Uud2Vlaz1DZS53ZWVrcz0kYixDZS5pc29XZWVrPUNlLmlzb1dlZWtzPV9iLENlLndlZWtzSW5ZZWFyPVRiLENlLmlzb1dlZWtzSW5ZZWFyPVNiLENlLmRhdGU9cGUsQ2UuZGF5PUNlLmRheXM9Z2MsQ2Uud2Vla2RheT1oYyxDZS5pc29XZWVrZGF5PWljLENlLmRheU9mWWVhcj1uYyxDZS5ob3VyPUNlLmhvdXJzPXhlLENlLm1pbnV0ZT1DZS5taW51dGVzPXllLENlLnNlY29uZD1DZS5zZWNvbmRzPXplLENlLm1pbGxpc2Vjb25kPUNlLm1pbGxpc2Vjb25kcz1CZSxDZS51dGNPZmZzZXQ9VWEsQ2UudXRjPVdhLENlLmxvY2FsPVhhLENlLnBhcnNlWm9uZT1ZYSxDZS5oYXNBbGlnbmVkSG91ck9mZnNldD1aYSxDZS5pc0RTVD0kYSxDZS5pc0RTVFNoaWZ0ZWQ9X2EsQ2UuaXNMb2NhbD1hYixDZS5pc1V0Y09mZnNldD1iYixDZS5pc1V0Yz1jYixDZS5pc1VUQz1jYixDZS56b25lQWJicj12YyxDZS56b25lTmFtZT13YyxDZS5kYXRlcz11KCJkYXRlcyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgZGF0ZSBpbnN0ZWFkLiIscGUpLENlLm1vbnRocz11KCJtb250aHMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbnRoIGluc3RlYWQiLGhhKSxDZS55ZWFycz11KCJ5ZWFycyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgeWVhciBpbnN0ZWFkIixlZSksQ2Uuem9uZT11KCJtb21lbnQoKS56b25lIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQoKS51dGNPZmZzZXQgaW5zdGVhZC4gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzE3NzkiLFZhKTt2YXIgRGU9Q2UsRWU9e3NhbWVEYXk6IltUb2RheSBhdF0gTFQiLG5leHREYXk6IltUb21vcnJvdyBhdF0gTFQiLG5leHRXZWVrOiJkZGRkIFthdF0gTFQiLGxhc3REYXk6IltZZXN0ZXJkYXkgYXRdIExUIixsYXN0V2VlazoiW0xhc3RdIGRkZGQgW2F0XSBMVCIsc2FtZUVsc2U6IkwifSxGZT17TFRTOiJoOm1tOnNzIEEiLExUOiJoOm1tIEEiLEw6Ik1NL0REL1lZWVkiLExMOiJNTU1NIEQsIFlZWVkiLExMTDoiTU1NTSBELCBZWVlZIGg6bW0gQSIsTExMTDoiZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQSJ9LEdlPSJJbnZhbGlkIGRhdGUiLEhlPSIlZCIsSWU9L1xkezEsMn0vLEplPXtmdXR1cmU6ImluICVzIixwYXN0OiIlcyBhZ28iLHM6ImEgZmV3IHNlY29uZHMiLG06ImEgbWludXRlIixtbToiJWQgbWludXRlcyIsaDoiYW4gaG91ciIsaGg6IiVkIGhvdXJzIixkOiJhIGRheSIsZGQ6IiVkIGRheXMiLE06ImEgbW9udGgiLE1NOiIlZCBtb250aHMiLHk6ImEgeWVhciIseXk6IiVkIHllYXJzIn0sS2U9QS5wcm90b3R5cGU7S2UuX2NhbGVuZGFyPUVlLEtlLmNhbGVuZGFyPXpjLEtlLl9sb25nRGF0ZUZvcm1hdD1GZSxLZS5sb25nRGF0ZUZvcm1hdD1BYyxLZS5faW52YWxpZERhdGU9R2UsS2UuaW52YWxpZERhdGU9QmMsS2UuX29yZGluYWw9SGUsS2Uub3JkaW5hbD1DYyxLZS5fb3JkaW5hbFBhcnNlPUllLEtlLnByZXBhcnNlPURjLEtlLnBvc3Rmb3JtYXQ9RGMsS2UuX3JlbGF0aXZlVGltZT1KZSxLZS5yZWxhdGl2ZVRpbWU9RWMsS2UucGFzdEZ1dHVyZT1GYyxLZS5zZXQ9eSxLZS5tb250aHM9Y2EsS2UuX21vbnRocz1XZCxLZS5tb250aHNTaG9ydD1kYSxLZS5fbW9udGhzU2hvcnQ9WGQsS2UubW9udGhzUGFyc2U9ZmEsS2UuX21vbnRoc1JlZ2V4PVpkLEtlLm1vbnRoc1JlZ2V4PWthLEtlLl9tb250aHNTaG9ydFJlZ2V4PVlkLEtlLm1vbnRoc1Nob3J0UmVnZXg9amEsS2Uud2Vlaz1YYixLZS5fd2Vlaz1vZSxLZS5maXJzdERheU9mWWVhcj1aYixLZS5maXJzdERheU9mV2Vlaz1ZYixLZS53ZWVrZGF5cz1iYyxLZS5fd2Vla2RheXM9cWUsS2Uud2Vla2RheXNNaW49ZGMsS2UuX3dlZWtkYXlzTWluPXNlLEtlLndlZWtkYXlzU2hvcnQ9Y2MsS2UuX3dlZWtkYXlzU2hvcnQ9cmUsS2Uud2Vla2RheXNQYXJzZT1mYyxLZS5fd2Vla2RheXNSZWdleD10ZSxLZS53ZWVrZGF5c1JlZ2V4PWpjLEtlLl93ZWVrZGF5c1Nob3J0UmVnZXg9dWUsS2Uud2Vla2RheXNTaG9ydFJlZ2V4PWtjLEtlLl93ZWVrZGF5c01pblJlZ2V4PXZlLEtlLndlZWtkYXlzTWluUmVnZXg9bGMsS2UuaXNQTT1zYyxLZS5fbWVyaWRpZW1QYXJzZT13ZSxLZS5tZXJpZGllbT10YyxFKCJlbiIse29yZGluYWxQYXJzZTovXGR7MSwyfSh0aHxzdHxuZHxyZCkvLG9yZGluYWw6ZnVuY3Rpb24oYSl7dmFyIGI9YSUxMCxjPTE9PT1yKGElMTAwLzEwKT8idGgiOjE9PT1iPyJzdCI6Mj09PWI/Im5kIjozPT09Yj8icmQiOiJ0aCI7cmV0dXJuIGErY319KSxhLmxhbmc9dSgibW9tZW50LmxhbmcgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGUgaW5zdGVhZC4iLEUpLGEubGFuZ0RhdGE9dSgibW9tZW50LmxhbmdEYXRhIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlRGF0YSBpbnN0ZWFkLiIsSCk7dmFyIExlPU1hdGguYWJzLE1lPVljKCJtcyIpLE5lPVljKCJzIiksT2U9WWMoIm0iKSxQZT1ZYygiaCIpLFFlPVljKCJkIiksUmU9WWMoInciKSxTZT1ZYygiTSIpLFRlPVljKCJ5IiksVWU9JGMoIm1pbGxpc2Vjb25kcyIpLFZlPSRjKCJzZWNvbmRzIiksV2U9JGMoIm1pbnV0ZXMiKSxYZT0kYygiaG91cnMiKSxZZT0kYygiZGF5cyIpLFplPSRjKCJtb250aHMiKSwkZT0kYygieWVhcnMiKSxfZT1NYXRoLnJvdW5kLGFmPXtzOjQ1LG06NDUsaDoyMixkOjI2LE06MTF9LGJmPU1hdGguYWJzLGNmPU9hLnByb3RvdHlwZTtjZi5hYnM9T2MsY2YuYWRkPVFjLGNmLnN1YnRyYWN0PVJjLGNmLmFzPVdjLGNmLmFzTWlsbGlzZWNvbmRzPU1lLGNmLmFzU2Vjb25kcz1OZSxjZi5hc01pbnV0ZXM9T2UsY2YuYXNIb3Vycz1QZSxjZi5hc0RheXM9UWUsY2YuYXNXZWVrcz1SZSxjZi5hc01vbnRocz1TZSxjZi5hc1llYXJzPVRlLGNmLnZhbHVlT2Y9WGMsY2YuX2J1YmJsZT1UYyxjZi5nZXQ9WmMsY2YubWlsbGlzZWNvbmRzPVVlLGNmLnNlY29uZHM9VmUsY2YubWludXRlcz1XZSxjZi5ob3Vycz1YZSxjZi5kYXlzPVllLGNmLndlZWtzPV9jLGNmLm1vbnRocz1aZSxjZi55ZWFycz0kZSxjZi5odW1hbml6ZT1kZCxjZi50b0lTT1N0cmluZz1lZCxjZi50b1N0cmluZz1lZCxjZi50b0pTT049ZWQsY2YubG9jYWxlPUJiLGNmLmxvY2FsZURhdGE9Q2IsY2YudG9Jc29TdHJpbmc9dSgidG9Jc29TdHJpbmcoKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRvSVNPU3RyaW5nKCkgaW5zdGVhZCAobm90aWNlIHRoZSBjYXBpdGFscykiLGVkKSxjZi5sYW5nPW5lLFIoIlgiLDAsMCwidW5peCIpLFIoIngiLDAsMCwidmFsdWVPZiIpLFcoIngiLEZkKSxXKCJYIixJZCksJCgiWCIsZnVuY3Rpb24oYSxiLGMpe2MuX2Q9bmV3IERhdGUoMWUzKnBhcnNlRmxvYXQoYSwxMCkpfSksJCgieCIsZnVuY3Rpb24oYSxiLGMpe2MuX2Q9bmV3IERhdGUocihhKSl9KSxhLnZlcnNpb249IjIuMTMuMCIsYihLYSksYS5mbj1EZSxhLm1pbj1NYSxhLm1heD1OYSxhLm5vdz1oZSxhLnV0Yz1oLGEudW5peD14YyxhLm1vbnRocz1KYyxhLmlzRGF0ZT1kLGEubG9jYWxlPUUsYS5pbnZhbGlkPWwsYS5kdXJhdGlvbj1kYixhLmlzTW9tZW50PXAsYS53ZWVrZGF5cz1MYyxhLnBhcnNlWm9uZT15YyxhLmxvY2FsZURhdGE9SCxhLmlzRHVyYXRpb249UGEsYS5tb250aHNTaG9ydD1LYyxhLndlZWtkYXlzTWluPU5jLGEuZGVmaW5lTG9jYWxlPUYsYS51cGRhdGVMb2NhbGU9RyxhLmxvY2FsZXM9SSxhLndlZWtkYXlzU2hvcnQ9TWMsYS5ub3JtYWxpemVVbml0cz1LLGEucmVsYXRpdmVUaW1lVGhyZXNob2xkPWNkLGEucHJvdG90eXBlPURlO3ZhciBkZj1hO3JldHVybiBkZn0pOw==
LyohCiAqIGNsaXBib2FyZC5qcyB2MS41LjEyCiAqIGh0dHBzOi8vemVub3JvY2hhLmdpdGh1Yi5pby9jbGlwYm9hcmQuanMKICoKICogTGljZW5zZWQgTUlUIMKpIFplbm8gUm9jaGEKICovCihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpe21vZHVsZS5leHBvcnRzPWYoKX1lbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKXtkZWZpbmUoW10sZil9ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKXtnPWdsb2JhbH1lbHNlIGlmKHR5cGVvZiBzZWxmIT09InVuZGVmaW5lZCIpe2c9c2VsZn1lbHNle2c9dGhpc31nLkNsaXBib2FyZCA9IGYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIChmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK28rIiciKTt0aHJvdyBmLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkoezE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewp2YXIgbWF0Y2hlcyA9IHJlcXVpcmUoJ21hdGNoZXMtc2VsZWN0b3InKQ0KDQptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlbGVtZW50LCBzZWxlY3RvciwgY2hlY2tZb1NlbGYpIHsNCiAgdmFyIHBhcmVudCA9IGNoZWNrWW9TZWxmID8gZWxlbWVudCA6IGVsZW1lbnQucGFyZW50Tm9kZQ0KDQogIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50ICE9PSBkb2N1bWVudCkgew0KICAgIGlmIChtYXRjaGVzKHBhcmVudCwgc2VsZWN0b3IpKSByZXR1cm4gcGFyZW50Ow0KICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlDQogIH0NCn0NCgp9LHsibWF0Y2hlcy1zZWxlY3RvciI6NX1dLDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewp2YXIgY2xvc2VzdCA9IHJlcXVpcmUoJ2Nsb3Nlc3QnKTsKCi8qKgogKiBEZWxlZ2F0ZXMgZXZlbnQgdG8gYSBzZWxlY3Rvci4KICoKICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50CiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvcgogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawogKiBAcGFyYW0ge0Jvb2xlYW59IHVzZUNhcHR1cmUKICogQHJldHVybiB7T2JqZWN0fQogKi8KZnVuY3Rpb24gZGVsZWdhdGUoZWxlbWVudCwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrLCB1c2VDYXB0dXJlKSB7CiAgICB2YXIgbGlzdGVuZXJGbiA9IGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgogICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyRm4sIHVzZUNhcHR1cmUpOwoKICAgIHJldHVybiB7CiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlKTsKICAgICAgICB9CiAgICB9Cn0KCi8qKgogKiBGaW5kcyBjbG9zZXN0IG1hdGNoIGFuZCBpbnZva2VzIGNhbGxiYWNrLgogKgogKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQKICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yCiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlCiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAqIEByZXR1cm4ge0Z1bmN0aW9ufQogKi8KZnVuY3Rpb24gbGlzdGVuZXIoZWxlbWVudCwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oZSkgewogICAgICAgIGUuZGVsZWdhdGVUYXJnZXQgPSBjbG9zZXN0KGUudGFyZ2V0LCBzZWxlY3RvciwgdHJ1ZSk7CgogICAgICAgIGlmIChlLmRlbGVnYXRlVGFyZ2V0KSB7CiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoZWxlbWVudCwgZSk7CiAgICAgICAgfQogICAgfQp9Cgptb2R1bGUuZXhwb3J0cyA9IGRlbGVnYXRlOwoKfSx7ImNsb3Nlc3QiOjF9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKLyoqCiAqIENoZWNrIGlmIGFyZ3VtZW50IGlzIGEgSFRNTCBlbGVtZW50LgogKgogKiBAcGFyYW0ge09iamVjdH0gdmFsdWUKICogQHJldHVybiB7Qm9vbGVhbn0KICovCmV4cG9ydHMubm9kZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZAogICAgICAgICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQKICAgICAgICAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMTsKfTsKCi8qKgogKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIGxpc3Qgb2YgSFRNTCBlbGVtZW50cy4KICoKICogQHBhcmFtIHtPYmplY3R9IHZhbHVlCiAqIEByZXR1cm4ge0Jvb2xlYW59CiAqLwpleHBvcnRzLm5vZGVMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTsKCiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZAogICAgICAgICYmICh0eXBlID09PSAnW29iamVjdCBOb2RlTGlzdF0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXScpCiAgICAgICAgJiYgKCdsZW5ndGgnIGluIHZhbHVlKQogICAgICAgICYmICh2YWx1ZS5sZW5ndGggPT09IDAgfHwgZXhwb3J0cy5ub2RlKHZhbHVlWzBdKSk7Cn07CgovKioKICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBzdHJpbmcuCiAqCiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZQogKiBAcmV0dXJuIHtCb29sZWFufQogKi8KZXhwb3J0cy5zdHJpbmcgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycKICAgICAgICB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZzsKfTsKCi8qKgogKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uLgogKgogKiBAcGFyYW0ge09iamVjdH0gdmFsdWUKICogQHJldHVybiB7Qm9vbGVhbn0KICovCmV4cG9ydHMuZm4gPSBmdW5jdGlvbih2YWx1ZSkgewogICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpOwoKICAgIHJldHVybiB0eXBlID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwp9OwoKfSx7fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CnZhciBpcyA9IHJlcXVpcmUoJy4vaXMnKTsKdmFyIGRlbGVnYXRlID0gcmVxdWlyZSgnZGVsZWdhdGUnKTsKCi8qKgogKiBWYWxpZGF0ZXMgYWxsIHBhcmFtcyBhbmQgY2FsbHMgdGhlIHJpZ2h0CiAqIGxpc3RlbmVyIGZ1bmN0aW9uIGJhc2VkIG9uIGl0cyB0YXJnZXQgdHlwZS4KICoKICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8SFRNTENvbGxlY3Rpb258Tm9kZUxpc3R9IHRhcmdldAogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawogKiBAcmV0dXJuIHtPYmplY3R9CiAqLwpmdW5jdGlvbiBsaXN0ZW4odGFyZ2V0LCB0eXBlLCBjYWxsYmFjaykgewogICAgaWYgKCF0YXJnZXQgJiYgIXR5cGUgJiYgIWNhbGxiYWNrKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50cycpOwogICAgfQoKICAgIGlmICghaXMuc3RyaW5nKHR5cGUpKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBTdHJpbmcnKTsKICAgIH0KCiAgICBpZiAoIWlzLmZuKGNhbGxiYWNrKSkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXJkIGFyZ3VtZW50IG11c3QgYmUgYSBGdW5jdGlvbicpOwogICAgfQoKICAgIGlmIChpcy5ub2RlKHRhcmdldCkpIHsKICAgICAgICByZXR1cm4gbGlzdGVuTm9kZSh0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKTsKICAgIH0KICAgIGVsc2UgaWYgKGlzLm5vZGVMaXN0KHRhcmdldCkpIHsKICAgICAgICByZXR1cm4gbGlzdGVuTm9kZUxpc3QodGFyZ2V0LCB0eXBlLCBjYWxsYmFjayk7CiAgICB9CiAgICBlbHNlIGlmIChpcy5zdHJpbmcodGFyZ2V0KSkgewogICAgICAgIHJldHVybiBsaXN0ZW5TZWxlY3Rvcih0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBTdHJpbmcsIEhUTUxFbGVtZW50LCBIVE1MQ29sbGVjdGlvbiwgb3IgTm9kZUxpc3QnKTsKICAgIH0KfQoKLyoqCiAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYSBIVE1MIGVsZW1lbnQKICogYW5kIHJldHVybnMgYSByZW1vdmUgbGlzdGVuZXIgZnVuY3Rpb24uCiAqCiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUKICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICogQHJldHVybiB7T2JqZWN0fQogKi8KZnVuY3Rpb24gbGlzdGVuTm9kZShub2RlLCB0eXBlLCBjYWxsYmFjaykgewogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTsKCiAgICByZXR1cm4gewogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBhIGxpc3Qgb2YgSFRNTCBlbGVtZW50cwogKiBhbmQgcmV0dXJucyBhIHJlbW92ZSBsaXN0ZW5lciBmdW5jdGlvbi4KICoKICogQHBhcmFtIHtOb2RlTGlzdHxIVE1MQ29sbGVjdGlvbn0gbm9kZUxpc3QKICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICogQHJldHVybiB7T2JqZWN0fQogKi8KZnVuY3Rpb24gbGlzdGVuTm9kZUxpc3Qobm9kZUxpc3QsIHR5cGUsIGNhbGxiYWNrKSB7CiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG5vZGVMaXN0LCBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTsKICAgIH0pOwoKICAgIHJldHVybiB7CiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobm9kZUxpc3QsIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjayk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBhIHNlbGVjdG9yCiAqIGFuZCByZXR1cm5zIGEgcmVtb3ZlIGxpc3RlbmVyIGZ1bmN0aW9uLgogKgogKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3IKICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICogQHJldHVybiB7T2JqZWN0fQogKi8KZnVuY3Rpb24gbGlzdGVuU2VsZWN0b3Ioc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKSB7CiAgICByZXR1cm4gZGVsZWdhdGUoZG9jdW1lbnQuYm9keSwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBsaXN0ZW47Cgp9LHsiLi9pcyI6MywiZGVsZWdhdGUiOjJ9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKDQovKioNCiAqIEVsZW1lbnQgcHJvdG90eXBlLg0KICovDQoNCnZhciBwcm90byA9IEVsZW1lbnQucHJvdG90eXBlOw0KDQovKioNCiAqIFZlbmRvciBmdW5jdGlvbi4NCiAqLw0KDQp2YXIgdmVuZG9yID0gcHJvdG8ubWF0Y2hlc1NlbGVjdG9yDQogIHx8IHByb3RvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcg0KICB8fCBwcm90by5tb3pNYXRjaGVzU2VsZWN0b3INCiAgfHwgcHJvdG8ubXNNYXRjaGVzU2VsZWN0b3INCiAgfHwgcHJvdG8ub01hdGNoZXNTZWxlY3RvcjsNCg0KLyoqDQogKiBFeHBvc2UgYG1hdGNoKClgLg0KICovDQoNCm1vZHVsZS5leHBvcnRzID0gbWF0Y2g7DQoNCi8qKg0KICogTWF0Y2ggYGVsYCB0byBgc2VsZWN0b3JgLg0KICoNCiAqIEBwYXJhbSB7RWxlbWVudH0gZWwNCiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3Rvcg0KICogQHJldHVybiB7Qm9vbGVhbn0NCiAqIEBhcGkgcHVibGljDQogKi8NCg0KZnVuY3Rpb24gbWF0Y2goZWwsIHNlbGVjdG9yKSB7DQogIGlmICh2ZW5kb3IpIHJldHVybiB2ZW5kb3IuY2FsbChlbCwgc2VsZWN0b3IpOw0KICB2YXIgbm9kZXMgPSBlbC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOw0KICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgKytpKSB7DQogICAgaWYgKG5vZGVzW2ldID09IGVsKSByZXR1cm4gdHJ1ZTsNCiAgfQ0KICByZXR1cm4gZmFsc2U7DQp9Cn0se31dLDY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewpmdW5jdGlvbiBzZWxlY3QoZWxlbWVudCkgewogICAgdmFyIHNlbGVjdGVkVGV4dDsKCiAgICBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50Lm5vZGVOYW1lID09PSAnVEVYVEFSRUEnKSB7CiAgICAgICAgZWxlbWVudC5mb2N1cygpOwogICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgZWxlbWVudC52YWx1ZS5sZW5ndGgpOwoKICAgICAgICBzZWxlY3RlZFRleHQgPSBlbGVtZW50LnZhbHVlOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKSkgewogICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CgogICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTsKICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTsKCiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICB9CgogICAgcmV0dXJuIHNlbGVjdGVkVGV4dDsKfQoKbW9kdWxlLmV4cG9ydHMgPSBzZWxlY3Q7Cgp9LHt9XSw3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKZnVuY3Rpb24gRSAoKSB7CgkvLyBLZWVwIHRoaXMgZW1wdHkgc28gaXQncyBlYXNpZXIgdG8gaW5oZXJpdCBmcm9tCiAgLy8gKHZpYSBodHRwczovL2dpdGh1Yi5jb20vbGlwc21hY2sgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2NvdHRjb3JnYW4vdGlueS1lbWl0dGVyL2lzc3Vlcy8zKQp9CgpFLnByb3RvdHlwZSA9IHsKCW9uOiBmdW5jdGlvbiAobmFtZSwgY2FsbGJhY2ssIGN0eCkgewogICAgdmFyIGUgPSB0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KTsKCiAgICAoZVtuYW1lXSB8fCAoZVtuYW1lXSA9IFtdKSkucHVzaCh7CiAgICAgIGZuOiBjYWxsYmFjaywKICAgICAgY3R4OiBjdHgKICAgIH0pOwoKICAgIHJldHVybiB0aGlzOwogIH0sCgogIG9uY2U6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaywgY3R4KSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBmdW5jdGlvbiBsaXN0ZW5lciAoKSB7CiAgICAgIHNlbGYub2ZmKG5hbWUsIGxpc3RlbmVyKTsKICAgICAgY2FsbGJhY2suYXBwbHkoY3R4LCBhcmd1bWVudHMpOwogICAgfTsKCiAgICBsaXN0ZW5lci5fID0gY2FsbGJhY2sKICAgIHJldHVybiB0aGlzLm9uKG5hbWUsIGxpc3RlbmVyLCBjdHgpOwogIH0sCgogIGVtaXQ6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICB2YXIgZGF0YSA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgIHZhciBldnRBcnIgPSAoKHRoaXMuZSB8fCAodGhpcy5lID0ge30pKVtuYW1lXSB8fCBbXSkuc2xpY2UoKTsKICAgIHZhciBpID0gMDsKICAgIHZhciBsZW4gPSBldnRBcnIubGVuZ3RoOwoKICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGV2dEFycltpXS5mbi5hcHBseShldnRBcnJbaV0uY3R4LCBkYXRhKTsKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9LAoKICBvZmY6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaykgewogICAgdmFyIGUgPSB0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KTsKICAgIHZhciBldnRzID0gZVtuYW1lXTsKICAgIHZhciBsaXZlRXZlbnRzID0gW107CgogICAgaWYgKGV2dHMgJiYgY2FsbGJhY2spIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGV2dHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICBpZiAoZXZ0c1tpXS5mbiAhPT0gY2FsbGJhY2sgJiYgZXZ0c1tpXS5mbi5fICE9PSBjYWxsYmFjaykKICAgICAgICAgIGxpdmVFdmVudHMucHVzaChldnRzW2ldKTsKICAgICAgfQogICAgfQoKICAgIC8vIFJlbW92ZSBldmVudCBmcm9tIHF1ZXVlIHRvIHByZXZlbnQgbWVtb3J5IGxlYWsKICAgIC8vIFN1Z2dlc3RlZCBieSBodHRwczovL2dpdGh1Yi5jb20vbGF6ZAogICAgLy8gUmVmOiBodHRwczovL2dpdGh1Yi5jb20vc2NvdHRjb3JnYW4vdGlueS1lbWl0dGVyL2NvbW1pdC9jNmViZmFhOWJjOTczYjMzZDExMGE4NGEzMDc3NDJiN2NmOTRjOTUzI2NvbW1pdGNvbW1lbnQtNTAyNDkxMAoKICAgIChsaXZlRXZlbnRzLmxlbmd0aCkKICAgICAgPyBlW25hbWVdID0gbGl2ZUV2ZW50cwogICAgICA6IGRlbGV0ZSBlW25hbWVdOwoKICAgIHJldHVybiB0aGlzOwogIH0KfTsKCm1vZHVsZS5leHBvcnRzID0gRTsKCn0se31dLDg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgewogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIGRlZmluZShbJ21vZHVsZScsICdzZWxlY3QnXSwgZmFjdG9yeSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIGZhY3RvcnkobW9kdWxlLCByZXF1aXJlKCdzZWxlY3QnKSk7CiAgICB9IGVsc2UgewogICAgICAgIHZhciBtb2QgPSB7CiAgICAgICAgICAgIGV4cG9ydHM6IHt9CiAgICAgICAgfTsKICAgICAgICBmYWN0b3J5KG1vZCwgZ2xvYmFsLnNlbGVjdCk7CiAgICAgICAgZ2xvYmFsLmNsaXBib2FyZEFjdGlvbiA9IG1vZC5leHBvcnRzOwogICAgfQp9KSh0aGlzLCBmdW5jdGlvbiAobW9kdWxlLCBfc2VsZWN0KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIF9zZWxlY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2VsZWN0KTsKCiAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgIH07CiAgICB9CgogICAgdmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiID8gZnVuY3Rpb24gKG9iaikgewogICAgICAgIHJldHVybiB0eXBlb2Ygb2JqOwogICAgfSA6IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7CiAgICB9OwoKICAgIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgICAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsKICAgICAgICB9CiAgICB9CgogICAgdmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsKICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgewogICAgICAgICAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOwogICAgICAgICAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgICAgICAgICAgcmV0dXJuIENvbnN0cnVjdG9yOwogICAgICAgIH07CiAgICB9KCk7CgogICAgdmFyIENsaXBib2FyZEFjdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwogICAgICAgICAqLwoKICAgICAgICBmdW5jdGlvbiBDbGlwYm9hcmRBY3Rpb24ob3B0aW9ucykgewogICAgICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2xpcGJvYXJkQWN0aW9uKTsKCiAgICAgICAgICAgIHRoaXMucmVzb2x2ZU9wdGlvbnMob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuaW5pdFNlbGVjdGlvbigpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmaW5lcyBiYXNlIHByb3BlcnRpZXMgcGFzc2VkIGZyb20gY29uc3RydWN0b3IuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgICAgICAgKi8KCgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUucmVzb2x2ZU9wdGlvbnMgPSBmdW5jdGlvbiByZXNvbHZlT3B0aW9ucygpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTsKCiAgICAgICAgICAgIHRoaXMuYWN0aW9uID0gb3B0aW9ucy5hY3Rpb247CiAgICAgICAgICAgIHRoaXMuZW1pdHRlciA9IG9wdGlvbnMuZW1pdHRlcjsKICAgICAgICAgICAgdGhpcy50YXJnZXQgPSBvcHRpb25zLnRhcmdldDsKICAgICAgICAgICAgdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0OwogICAgICAgICAgICB0aGlzLnRyaWdnZXIgPSBvcHRpb25zLnRyaWdnZXI7CgogICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9ICcnOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUuaW5pdFNlbGVjdGlvbiA9IGZ1bmN0aW9uIGluaXRTZWxlY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnRleHQpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RmFrZSgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGFyZ2V0KSB7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFRhcmdldCgpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgQ2xpcGJvYXJkQWN0aW9uLnByb3RvdHlwZS5zZWxlY3RGYWtlID0gZnVuY3Rpb24gc2VsZWN0RmFrZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpc1JUTCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpID09ICdydGwnOwoKICAgICAgICAgICAgdGhpcy5yZW1vdmVGYWtlKCk7CgogICAgICAgICAgICB0aGlzLmZha2VIYW5kbGVyQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMucmVtb3ZlRmFrZSgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmZha2VIYW5kbGVyID0gZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZmFrZUhhbmRsZXJDYWxsYmFjaykgfHwgdHJ1ZTsKCiAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogICAgICAgICAgICAvLyBQcmV2ZW50IHpvb21pbmcgb24gaU9TCiAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0uc3R5bGUuZm9udFNpemUgPSAnMTJwdCc7CiAgICAgICAgICAgIC8vIFJlc2V0IGJveCBtb2RlbAogICAgICAgICAgICB0aGlzLmZha2VFbGVtLnN0eWxlLmJvcmRlciA9ICcwJzsKICAgICAgICAgICAgdGhpcy5mYWtlRWxlbS5zdHlsZS5wYWRkaW5nID0gJzAnOwogICAgICAgICAgICB0aGlzLmZha2VFbGVtLnN0eWxlLm1hcmdpbiA9ICcwJzsKICAgICAgICAgICAgLy8gTW92ZSBlbGVtZW50IG91dCBvZiBzY3JlZW4gaG9yaXpvbnRhbGx5CiAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0uc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOwogICAgICAgICAgICB0aGlzLmZha2VFbGVtLnN0eWxlW2lzUlRMID8gJ3JpZ2h0JyA6ICdsZWZ0J10gPSAnLTk5OTlweCc7CiAgICAgICAgICAgIC8vIE1vdmUgZWxlbWVudCB0byB0aGUgc2FtZSBwb3NpdGlvbiB2ZXJ0aWNhbGx5CiAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0uc3R5bGUudG9wID0gKHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKSArICdweCc7CiAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0uc2V0QXR0cmlidXRlKCdyZWFkb25seScsICcnKTsKICAgICAgICAgICAgdGhpcy5mYWtlRWxlbS52YWx1ZSA9IHRoaXMudGV4dDsKCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5mYWtlRWxlbSk7CgogICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9ICgwLCBfc2VsZWN0Mi5kZWZhdWx0KSh0aGlzLmZha2VFbGVtKTsKICAgICAgICAgICAgdGhpcy5jb3B5VGV4dCgpOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUucmVtb3ZlRmFrZSA9IGZ1bmN0aW9uIHJlbW92ZUZha2UoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmZha2VIYW5kbGVyKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIHRoaXMuZmFrZUhhbmRsZXIgPSBudWxsOwogICAgICAgICAgICAgICAgdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrID0gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuZmFrZUVsZW0pIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5mYWtlRWxlbSk7CiAgICAgICAgICAgICAgICB0aGlzLmZha2VFbGVtID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUuc2VsZWN0VGFyZ2V0ID0gZnVuY3Rpb24gc2VsZWN0VGFyZ2V0KCkgewogICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9ICgwLCBfc2VsZWN0Mi5kZWZhdWx0KSh0aGlzLnRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuY29weVRleHQoKTsKICAgICAgICB9OwoKICAgICAgICBDbGlwYm9hcmRBY3Rpb24ucHJvdG90eXBlLmNvcHlUZXh0ID0gZnVuY3Rpb24gY29weVRleHQoKSB7CiAgICAgICAgICAgIHZhciBzdWNjZWVkZWQgPSB1bmRlZmluZWQ7CgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgc3VjY2VlZGVkID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQodGhpcy5hY3Rpb24pOwogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmhhbmRsZVJlc3VsdChzdWNjZWVkZWQpOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUuaGFuZGxlUmVzdWx0ID0gZnVuY3Rpb24gaGFuZGxlUmVzdWx0KHN1Y2NlZWRlZCkgewogICAgICAgICAgICBpZiAoc3VjY2VlZGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIuZW1pdCgnc3VjY2VzcycsIHsKICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMuc2VsZWN0ZWRUZXh0LAogICAgICAgICAgICAgICAgICAgIHRyaWdnZXI6IHRoaXMudHJpZ2dlciwKICAgICAgICAgICAgICAgICAgICBjbGVhclNlbGVjdGlvbjogdGhpcy5jbGVhclNlbGVjdGlvbi5iaW5kKHRoaXMpCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KCdlcnJvcicsIHsKICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHRyaWdnZXI6IHRoaXMudHJpZ2dlciwKICAgICAgICAgICAgICAgICAgICBjbGVhclNlbGVjdGlvbjogdGhpcy5jbGVhclNlbGVjdGlvbi5iaW5kKHRoaXMpCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUuY2xlYXJTZWxlY3Rpb24gPSBmdW5jdGlvbiBjbGVhclNlbGVjdGlvbigpIHsKICAgICAgICAgICAgaWYgKHRoaXMudGFyZ2V0KSB7CiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5ibHVyKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICB9OwoKICAgICAgICBDbGlwYm9hcmRBY3Rpb24ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLnJlbW92ZUZha2UoKTsKICAgICAgICB9OwoKICAgICAgICBfY3JlYXRlQ2xhc3MoQ2xpcGJvYXJkQWN0aW9uLCBbewogICAgICAgICAgICBrZXk6ICdhY3Rpb24nLAogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHsKICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyAnY29weScgOiBhcmd1bWVudHNbMF07CgogICAgICAgICAgICAgICAgdGhpcy5fYWN0aW9uID0gYWN0aW9uOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hY3Rpb24gIT09ICdjb3B5JyAmJiB0aGlzLl9hY3Rpb24gIT09ICdjdXQnKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkICJhY3Rpb24iIHZhbHVlLCB1c2UgZWl0aGVyICJjb3B5IiBvciAiY3V0IicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb247CiAgICAgICAgICAgIH0KICAgICAgICB9LCB7CiAgICAgICAgICAgIGtleTogJ3RhcmdldCcsCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gc2V0KHRhcmdldCkgewogICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCAmJiAodHlwZW9mIHRhcmdldCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YodGFyZ2V0KSkgPT09ICdvYmplY3QnICYmIHRhcmdldC5ub2RlVHlwZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3Rpb24gPT09ICdjb3B5JyAmJiB0YXJnZXQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgInRhcmdldCIgYXR0cmlidXRlLiBQbGVhc2UgdXNlICJyZWFkb25seSIgaW5zdGVhZCBvZiAiZGlzYWJsZWQiIGF0dHJpYnV0ZScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3Rpb24gPT09ICdjdXQnICYmICh0YXJnZXQuaGFzQXR0cmlidXRlKCdyZWFkb25seScpIHx8IHRhcmdldC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgInRhcmdldCIgYXR0cmlidXRlLiBZb3UgY2FuXCd0IGN1dCB0ZXh0IGZyb20gZWxlbWVudHMgd2l0aCAicmVhZG9ubHkiIG9yICJkaXNhYmxlZCIgYXR0cmlidXRlcycpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXJnZXQgPSB0YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkICJ0YXJnZXQiIHZhbHVlLCB1c2UgYSB2YWxpZCBFbGVtZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90YXJnZXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9XSk7CgogICAgICAgIHJldHVybiBDbGlwYm9hcmRBY3Rpb247CiAgICB9KCk7CgogICAgbW9kdWxlLmV4cG9ydHMgPSBDbGlwYm9hcmRBY3Rpb247Cn0pOwoKfSx7InNlbGVjdCI6Nn1dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgewogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIGRlZmluZShbJ21vZHVsZScsICcuL2NsaXBib2FyZC1hY3Rpb24nLCAndGlueS1lbWl0dGVyJywgJ2dvb2QtbGlzdGVuZXInXSwgZmFjdG9yeSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIGZhY3RvcnkobW9kdWxlLCByZXF1aXJlKCcuL2NsaXBib2FyZC1hY3Rpb24nKSwgcmVxdWlyZSgndGlueS1lbWl0dGVyJyksIHJlcXVpcmUoJ2dvb2QtbGlzdGVuZXInKSk7CiAgICB9IGVsc2UgewogICAgICAgIHZhciBtb2QgPSB7CiAgICAgICAgICAgIGV4cG9ydHM6IHt9CiAgICAgICAgfTsKICAgICAgICBmYWN0b3J5KG1vZCwgZ2xvYmFsLmNsaXBib2FyZEFjdGlvbiwgZ2xvYmFsLnRpbnlFbWl0dGVyLCBnbG9iYWwuZ29vZExpc3RlbmVyKTsKICAgICAgICBnbG9iYWwuY2xpcGJvYXJkID0gbW9kLmV4cG9ydHM7CiAgICB9Cn0pKHRoaXMsIGZ1bmN0aW9uIChtb2R1bGUsIF9jbGlwYm9hcmRBY3Rpb24sIF90aW55RW1pdHRlciwgX2dvb2RMaXN0ZW5lcikgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBfY2xpcGJvYXJkQWN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsaXBib2FyZEFjdGlvbik7CgogICAgdmFyIF90aW55RW1pdHRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90aW55RW1pdHRlcik7CgogICAgdmFyIF9nb29kTGlzdGVuZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ29vZExpc3RlbmVyKTsKCiAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7CiAgICAgICAgaWYgKCFzZWxmKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSA/IGNhbGwgOiBzZWxmOwogICAgfQoKICAgIGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgewogICAgICAgIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIiArIHR5cGVvZiBzdXBlckNsYXNzKTsKICAgICAgICB9CgogICAgICAgIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgewogICAgICAgICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgICAgICAgICAgdmFsdWU6IHN1YkNsYXNzLAogICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOwogICAgfQoKICAgIHZhciBDbGlwYm9hcmQgPSBmdW5jdGlvbiAoX0VtaXR0ZXIpIHsKICAgICAgICBfaW5oZXJpdHMoQ2xpcGJvYXJkLCBfRW1pdHRlcik7CgogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fEhUTUxDb2xsZWN0aW9ufE5vZGVMaXN0fSB0cmlnZ2VyCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgICAgICAgKi8KCiAgICAgICAgZnVuY3Rpb24gQ2xpcGJvYXJkKHRyaWdnZXIsIG9wdGlvbnMpIHsKICAgICAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsaXBib2FyZCk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfRW1pdHRlci5jYWxsKHRoaXMpKTsKCiAgICAgICAgICAgIF90aGlzLnJlc29sdmVPcHRpb25zKG9wdGlvbnMpOwogICAgICAgICAgICBfdGhpcy5saXN0ZW5DbGljayh0cmlnZ2VyKTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmaW5lcyBpZiBhdHRyaWJ1dGVzIHdvdWxkIGJlIHJlc29sdmVkIHVzaW5nIGludGVybmFsIHNldHRlciBmdW5jdGlvbnMKICAgICAgICAgKiBvciBjdXN0b20gZnVuY3Rpb25zIHRoYXQgd2VyZSBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgICAgICovCgoKICAgICAgICBDbGlwYm9hcmQucHJvdG90eXBlLnJlc29sdmVPcHRpb25zID0gZnVuY3Rpb24gcmVzb2x2ZU9wdGlvbnMoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CgogICAgICAgICAgICB0aGlzLmFjdGlvbiA9IHR5cGVvZiBvcHRpb25zLmFjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMuYWN0aW9uIDogdGhpcy5kZWZhdWx0QWN0aW9uOwogICAgICAgICAgICB0aGlzLnRhcmdldCA9IHR5cGVvZiBvcHRpb25zLnRhcmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGFyZ2V0IDogdGhpcy5kZWZhdWx0VGFyZ2V0OwogICAgICAgICAgICB0aGlzLnRleHQgPSB0eXBlb2Ygb3B0aW9ucy50ZXh0ID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy50ZXh0IDogdGhpcy5kZWZhdWx0VGV4dDsKICAgICAgICB9OwoKICAgICAgICBDbGlwYm9hcmQucHJvdG90eXBlLmxpc3RlbkNsaWNrID0gZnVuY3Rpb24gbGlzdGVuQ2xpY2sodHJpZ2dlcikgewogICAgICAgICAgICB2YXIgX3RoaXMyID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIgPSAoMCwgX2dvb2RMaXN0ZW5lcjIuZGVmYXVsdCkodHJpZ2dlciwgJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIub25DbGljayhlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgQ2xpcGJvYXJkLnByb3RvdHlwZS5vbkNsaWNrID0gZnVuY3Rpb24gb25DbGljayhlKSB7CiAgICAgICAgICAgIHZhciB0cmlnZ2VyID0gZS5kZWxlZ2F0ZVRhcmdldCB8fCBlLmN1cnJlbnRUYXJnZXQ7CgogICAgICAgICAgICBpZiAodGhpcy5jbGlwYm9hcmRBY3Rpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkQWN0aW9uID0gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRBY3Rpb24gPSBuZXcgX2NsaXBib2FyZEFjdGlvbjIuZGVmYXVsdCh7CiAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuYWN0aW9uKHRyaWdnZXIpLAogICAgICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLnRhcmdldCh0cmlnZ2VyKSwKICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMudGV4dCh0cmlnZ2VyKSwKICAgICAgICAgICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsCiAgICAgICAgICAgICAgICBlbWl0dGVyOiB0aGlzCiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZC5wcm90b3R5cGUuZGVmYXVsdEFjdGlvbiA9IGZ1bmN0aW9uIGRlZmF1bHRBY3Rpb24odHJpZ2dlcikgewogICAgICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoJ2FjdGlvbicsIHRyaWdnZXIpOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZC5wcm90b3R5cGUuZGVmYXVsdFRhcmdldCA9IGZ1bmN0aW9uIGRlZmF1bHRUYXJnZXQodHJpZ2dlcikgewogICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgndGFyZ2V0JywgdHJpZ2dlcik7CgogICAgICAgICAgICBpZiAoc2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZC5wcm90b3R5cGUuZGVmYXVsdFRleHQgPSBmdW5jdGlvbiBkZWZhdWx0VGV4dCh0cmlnZ2VyKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgndGV4dCcsIHRyaWdnZXIpOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZGVzdHJveSgpOwoKICAgICAgICAgICAgaWYgKHRoaXMuY2xpcGJvYXJkQWN0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZEFjdGlvbi5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZEFjdGlvbiA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICByZXR1cm4gQ2xpcGJvYXJkOwogICAgfShfdGlueUVtaXR0ZXIyLmRlZmF1bHQpOwoKICAgIC8qKgogICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHJldHJpZXZlIGF0dHJpYnV0ZSB2YWx1ZS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWZmaXgKICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShzdWZmaXgsIGVsZW1lbnQpIHsKICAgICAgICB2YXIgYXR0cmlidXRlID0gJ2RhdGEtY2xpcGJvYXJkLScgKyBzdWZmaXg7CgogICAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKICAgIH0KCiAgICBtb2R1bGUuZXhwb3J0cyA9IENsaXBib2FyZDsKfSk7Cgp9LHsiLi9jbGlwYm9hcmQtYWN0aW9uIjo4LCJnb29kLWxpc3RlbmVyIjo0LCJ0aW55LWVtaXR0ZXIiOjd9XX0se30sWzldKSg5KQp9KTs=
LyohCiAqIGNsaXBib2FyZC5qcyB2MS41LjEyCiAqIGh0dHBzOi8vemVub3JvY2hhLmdpdGh1Yi5pby9jbGlwYm9hcmQuanMKICoKICogTGljZW5zZWQgTUlUIMKpIFplbm8gUm9jaGEKICovCiFmdW5jdGlvbih0KXtpZigib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPXQoKTtlbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFtdLHQpO2Vsc2V7dmFyIGU7ZT0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMsZS5DbGlwYm9hcmQ9dCgpfX0oZnVuY3Rpb24oKXt2YXIgdCxlLG47cmV0dXJuIGZ1bmN0aW9uIHQoZSxuLG8pe2Z1bmN0aW9uIGkoYSxjKXtpZighblthXSl7aWYoIWVbYV0pe3ZhciBzPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFjJiZzKXJldHVybiBzKGEsITApO2lmKHIpcmV0dXJuIHIoYSwhMCk7dmFyIGw9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrYSsiJyIpO3Rocm93IGwuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsbH12YXIgdT1uW2FdPXtleHBvcnRzOnt9fTtlW2FdWzBdLmNhbGwodS5leHBvcnRzLGZ1bmN0aW9uKHQpe3ZhciBuPWVbYV1bMV1bdF07cmV0dXJuIGkobj9uOnQpfSx1LHUuZXhwb3J0cyx0LGUsbixvKX1yZXR1cm4gblthXS5leHBvcnRzfWZvcih2YXIgcj0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxhPTA7YTxvLmxlbmd0aDthKyspaShvW2FdKTtyZXR1cm4gaX0oezE6W2Z1bmN0aW9uKHQsZSxuKXt2YXIgbz10KCJtYXRjaGVzLXNlbGVjdG9yIik7ZS5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9bj90OnQucGFyZW50Tm9kZTtpJiZpIT09ZG9jdW1lbnQ7KXtpZihvKGksZSkpcmV0dXJuIGk7aT1pLnBhcmVudE5vZGV9fX0seyJtYXRjaGVzLXNlbGVjdG9yIjo1fV0sMjpbZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIG8odCxlLG4sbyxyKXt2YXIgYT1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKG4sYSxyKSx7ZGVzdHJveTpmdW5jdGlvbigpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLGEscil9fX1mdW5jdGlvbiBpKHQsZSxuLG8pe3JldHVybiBmdW5jdGlvbihuKXtuLmRlbGVnYXRlVGFyZ2V0PXIobi50YXJnZXQsZSwhMCksbi5kZWxlZ2F0ZVRhcmdldCYmby5jYWxsKHQsbil9fXZhciByPXQoImNsb3Nlc3QiKTtlLmV4cG9ydHM9b30se2Nsb3Nlc3Q6MX1dLDM6W2Z1bmN0aW9uKHQsZSxuKXtuLm5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmMT09PXQubm9kZVR5cGV9LG4ubm9kZUxpc3Q9ZnVuY3Rpb24odCl7dmFyIGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpO3JldHVybiB2b2lkIDAhPT10JiYoIltvYmplY3QgTm9kZUxpc3RdIj09PWV8fCJbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXSI9PT1lKSYmImxlbmd0aCJpbiB0JiYoMD09PXQubGVuZ3RofHxuLm5vZGUodFswXSkpfSxuLnN0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBTdHJpbmd9LG4uZm49ZnVuY3Rpb24odCl7dmFyIGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpO3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1lfX0se31dLDQ6W2Z1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiBvKHQsZSxuKXtpZighdCYmIWUmJiFuKXRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudHMiKTtpZighYy5zdHJpbmcoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiU2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBTdHJpbmciKTtpZighYy5mbihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGlyZCBhcmd1bWVudCBtdXN0IGJlIGEgRnVuY3Rpb24iKTtpZihjLm5vZGUodCkpcmV0dXJuIGkodCxlLG4pO2lmKGMubm9kZUxpc3QodCkpcmV0dXJuIHIodCxlLG4pO2lmKGMuc3RyaW5nKHQpKXJldHVybiBhKHQsZSxuKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgU3RyaW5nLCBIVE1MRWxlbWVudCwgSFRNTENvbGxlY3Rpb24sIG9yIE5vZGVMaXN0Iil9ZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcihlLG4pLHtkZXN0cm95OmZ1bmN0aW9uKCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbil9fX1mdW5jdGlvbiByKHQsZSxuKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LGZ1bmN0aW9uKHQpe3QuYWRkRXZlbnRMaXN0ZW5lcihlLG4pfSkse2Rlc3Ryb3k6ZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsZnVuY3Rpb24odCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbil9KX19fWZ1bmN0aW9uIGEodCxlLG4pe3JldHVybiBzKGRvY3VtZW50LmJvZHksdCxlLG4pfXZhciBjPXQoIi4vaXMiKSxzPXQoImRlbGVnYXRlIik7ZS5leHBvcnRzPW99LHsiLi9pcyI6MyxkZWxlZ2F0ZToyfV0sNTpbZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIG8odCxlKXtpZihyKXJldHVybiByLmNhbGwodCxlKTtmb3IodmFyIG49dC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoZSksbz0wO288bi5sZW5ndGg7KytvKWlmKG5bb109PXQpcmV0dXJuITA7cmV0dXJuITF9dmFyIGk9RWxlbWVudC5wcm90b3R5cGUscj1pLm1hdGNoZXNTZWxlY3Rvcnx8aS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGkubW96TWF0Y2hlc1NlbGVjdG9yfHxpLm1zTWF0Y2hlc1NlbGVjdG9yfHxpLm9NYXRjaGVzU2VsZWN0b3I7ZS5leHBvcnRzPW99LHt9XSw2OltmdW5jdGlvbih0LGUsbil7ZnVuY3Rpb24gbyh0KXt2YXIgZTtpZigiSU5QVVQiPT09dC5ub2RlTmFtZXx8IlRFWFRBUkVBIj09PXQubm9kZU5hbWUpdC5mb2N1cygpLHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCx0LnZhbHVlLmxlbmd0aCksZT10LnZhbHVlO2Vsc2V7dC5oYXNBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpJiZ0LmZvY3VzKCk7dmFyIG49d2luZG93LmdldFNlbGVjdGlvbigpLG89ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtvLnNlbGVjdE5vZGVDb250ZW50cyh0KSxuLnJlbW92ZUFsbFJhbmdlcygpLG4uYWRkUmFuZ2UobyksZT1uLnRvU3RyaW5nKCl9cmV0dXJuIGV9ZS5leHBvcnRzPW99LHt9XSw3OltmdW5jdGlvbih0LGUsbil7ZnVuY3Rpb24gbygpe31vLnByb3RvdHlwZT17b246ZnVuY3Rpb24odCxlLG4pe3ZhciBvPXRoaXMuZXx8KHRoaXMuZT17fSk7cmV0dXJuKG9bdF18fChvW3RdPVtdKSkucHVzaCh7Zm46ZSxjdHg6bn0pLHRoaXN9LG9uY2U6ZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIG8oKXtpLm9mZih0LG8pLGUuYXBwbHkobixhcmd1bWVudHMpfXZhciBpPXRoaXM7cmV0dXJuIG8uXz1lLHRoaXMub24odCxvLG4pfSxlbWl0OmZ1bmN0aW9uKHQpe3ZhciBlPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLG49KCh0aGlzLmV8fCh0aGlzLmU9e30pKVt0XXx8W10pLnNsaWNlKCksbz0wLGk9bi5sZW5ndGg7Zm9yKG87aT5vO28rKyluW29dLmZuLmFwcGx5KG5bb10uY3R4LGUpO3JldHVybiB0aGlzfSxvZmY6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmV8fCh0aGlzLmU9e30pLG89blt0XSxpPVtdO2lmKG8mJmUpZm9yKHZhciByPTAsYT1vLmxlbmd0aDthPnI7cisrKW9bcl0uZm4hPT1lJiZvW3JdLmZuLl8hPT1lJiZpLnB1c2gob1tyXSk7cmV0dXJuIGkubGVuZ3RoP25bdF09aTpkZWxldGUgblt0XSx0aGlzfX0sZS5leHBvcnRzPW99LHt9XSw4OltmdW5jdGlvbihlLG4sbyl7IWZ1bmN0aW9uKGkscil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuYW1kKXQoWyJtb2R1bGUiLCJzZWxlY3QiXSxyKTtlbHNlIGlmKCJ1bmRlZmluZWQiIT10eXBlb2YgbylyKG4sZSgic2VsZWN0IikpO2Vsc2V7dmFyIGE9e2V4cG9ydHM6e319O3IoYSxpLnNlbGVjdCksaS5jbGlwYm9hcmRBY3Rpb249YS5leHBvcnRzfX0odGhpcyxmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ImRlZmF1bHQiOnR9fWZ1bmN0aW9uIG8odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX12YXIgaT1uKGUpLHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbD8ic3ltYm9sIjp0eXBlb2YgdH0sYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxuLG8pe3JldHVybiBuJiZ0KGUucHJvdG90eXBlLG4pLG8mJnQoZSxvKSxlfX0oKSxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCksdGhpcy5yZXNvbHZlT3B0aW9ucyhlKSx0aGlzLmluaXRTZWxlY3Rpb24oKX1yZXR1cm4gdC5wcm90b3R5cGUucmVzb2x2ZU9wdGlvbnM9ZnVuY3Rpb24gdCgpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg8PTB8fHZvaWQgMD09PWFyZ3VtZW50c1swXT97fTphcmd1bWVudHNbMF07dGhpcy5hY3Rpb249ZS5hY3Rpb24sdGhpcy5lbWl0dGVyPWUuZW1pdHRlcix0aGlzLnRhcmdldD1lLnRhcmdldCx0aGlzLnRleHQ9ZS50ZXh0LHRoaXMudHJpZ2dlcj1lLnRyaWdnZXIsdGhpcy5zZWxlY3RlZFRleHQ9IiJ9LHQucHJvdG90eXBlLmluaXRTZWxlY3Rpb249ZnVuY3Rpb24gdCgpe3RoaXMudGV4dD90aGlzLnNlbGVjdEZha2UoKTp0aGlzLnRhcmdldCYmdGhpcy5zZWxlY3RUYXJnZXQoKX0sdC5wcm90b3R5cGUuc2VsZWN0RmFrZT1mdW5jdGlvbiB0KCl7dmFyIGU9dGhpcyxuPSJydGwiPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkaXIiKTt0aGlzLnJlbW92ZUZha2UoKSx0aGlzLmZha2VIYW5kbGVyQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZW1vdmVGYWtlKCl9LHRoaXMuZmFrZUhhbmRsZXI9ZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrKXx8ITAsdGhpcy5mYWtlRWxlbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpLHRoaXMuZmFrZUVsZW0uc3R5bGUuZm9udFNpemU9IjEycHQiLHRoaXMuZmFrZUVsZW0uc3R5bGUuYm9yZGVyPSIwIix0aGlzLmZha2VFbGVtLnN0eWxlLnBhZGRpbmc9IjAiLHRoaXMuZmFrZUVsZW0uc3R5bGUubWFyZ2luPSIwIix0aGlzLmZha2VFbGVtLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5mYWtlRWxlbS5zdHlsZVtuPyJyaWdodCI6ImxlZnQiXT0iLTk5OTlweCIsdGhpcy5mYWtlRWxlbS5zdHlsZS50b3A9KHdpbmRvdy5wYWdlWU9mZnNldHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCkrInB4Iix0aGlzLmZha2VFbGVtLnNldEF0dHJpYnV0ZSgicmVhZG9ubHkiLCIiKSx0aGlzLmZha2VFbGVtLnZhbHVlPXRoaXMudGV4dCxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZmFrZUVsZW0pLHRoaXMuc2VsZWN0ZWRUZXh0PSgwLGkuZGVmYXVsdCkodGhpcy5mYWtlRWxlbSksdGhpcy5jb3B5VGV4dCgpfSx0LnByb3RvdHlwZS5yZW1vdmVGYWtlPWZ1bmN0aW9uIHQoKXt0aGlzLmZha2VIYW5kbGVyJiYoZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrKSx0aGlzLmZha2VIYW5kbGVyPW51bGwsdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrPW51bGwpLHRoaXMuZmFrZUVsZW0mJihkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRoaXMuZmFrZUVsZW0pLHRoaXMuZmFrZUVsZW09bnVsbCl9LHQucHJvdG90eXBlLnNlbGVjdFRhcmdldD1mdW5jdGlvbiB0KCl7dGhpcy5zZWxlY3RlZFRleHQ9KDAsaS5kZWZhdWx0KSh0aGlzLnRhcmdldCksdGhpcy5jb3B5VGV4dCgpfSx0LnByb3RvdHlwZS5jb3B5VGV4dD1mdW5jdGlvbiB0KCl7dmFyIGU9dm9pZCAwO3RyeXtlPWRvY3VtZW50LmV4ZWNDb21tYW5kKHRoaXMuYWN0aW9uKX1jYXRjaChuKXtlPSExfXRoaXMuaGFuZGxlUmVzdWx0KGUpfSx0LnByb3RvdHlwZS5oYW5kbGVSZXN1bHQ9ZnVuY3Rpb24gdChlKXtlP3RoaXMuZW1pdHRlci5lbWl0KCJzdWNjZXNzIix7YWN0aW9uOnRoaXMuYWN0aW9uLHRleHQ6dGhpcy5zZWxlY3RlZFRleHQsdHJpZ2dlcjp0aGlzLnRyaWdnZXIsY2xlYXJTZWxlY3Rpb246dGhpcy5jbGVhclNlbGVjdGlvbi5iaW5kKHRoaXMpfSk6dGhpcy5lbWl0dGVyLmVtaXQoImVycm9yIix7YWN0aW9uOnRoaXMuYWN0aW9uLHRyaWdnZXI6dGhpcy50cmlnZ2VyLGNsZWFyU2VsZWN0aW9uOnRoaXMuY2xlYXJTZWxlY3Rpb24uYmluZCh0aGlzKX0pfSx0LnByb3RvdHlwZS5jbGVhclNlbGVjdGlvbj1mdW5jdGlvbiB0KCl7dGhpcy50YXJnZXQmJnRoaXMudGFyZ2V0LmJsdXIoKSx3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCl9LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24gdCgpe3RoaXMucmVtb3ZlRmFrZSgpfSxhKHQsW3trZXk6ImFjdGlvbiIsc2V0OmZ1bmN0aW9uIHQoKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPD0wfHx2b2lkIDA9PT1hcmd1bWVudHNbMF0/ImNvcHkiOmFyZ3VtZW50c1swXTtpZih0aGlzLl9hY3Rpb249ZSwiY29weSIhPT10aGlzLl9hY3Rpb24mJiJjdXQiIT09dGhpcy5fYWN0aW9uKXRocm93IG5ldyBFcnJvcignSW52YWxpZCAiYWN0aW9uIiB2YWx1ZSwgdXNlIGVpdGhlciAiY29weSIgb3IgImN1dCInKX0sZ2V0OmZ1bmN0aW9uIHQoKXtyZXR1cm4gdGhpcy5fYWN0aW9ufX0se2tleToidGFyZ2V0IixzZXQ6ZnVuY3Rpb24gdChlKXtpZih2b2lkIDAhPT1lKXtpZighZXx8Im9iamVjdCIhPT0oInVuZGVmaW5lZCI9PXR5cGVvZiBlPyJ1bmRlZmluZWQiOnIoZSkpfHwxIT09ZS5ub2RlVHlwZSl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgInRhcmdldCIgdmFsdWUsIHVzZSBhIHZhbGlkIEVsZW1lbnQnKTtpZigiY29weSI9PT10aGlzLmFjdGlvbiYmZS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkICJ0YXJnZXQiIGF0dHJpYnV0ZS4gUGxlYXNlIHVzZSAicmVhZG9ubHkiIGluc3RlYWQgb2YgImRpc2FibGVkIiBhdHRyaWJ1dGUnKTtpZigiY3V0Ij09PXRoaXMuYWN0aW9uJiYoZS5oYXNBdHRyaWJ1dGUoInJlYWRvbmx5Iil8fGUuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKSl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgInRhcmdldCIgYXR0cmlidXRlLiBZb3UgY2FuXCd0IGN1dCB0ZXh0IGZyb20gZWxlbWVudHMgd2l0aCAicmVhZG9ubHkiIG9yICJkaXNhYmxlZCIgYXR0cmlidXRlcycpO3RoaXMuX3RhcmdldD1lfX0sZ2V0OmZ1bmN0aW9uIHQoKXtyZXR1cm4gdGhpcy5fdGFyZ2V0fX1dKSx0fSgpO3QuZXhwb3J0cz1jfSl9LHtzZWxlY3Q6Nn1dLDk6W2Z1bmN0aW9uKGUsbixvKXshZnVuY3Rpb24oaSxyKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5hbWQpdChbIm1vZHVsZSIsIi4vY2xpcGJvYXJkLWFjdGlvbiIsInRpbnktZW1pdHRlciIsImdvb2QtbGlzdGVuZXIiXSxyKTtlbHNlIGlmKCJ1bmRlZmluZWQiIT10eXBlb2YgbylyKG4sZSgiLi9jbGlwYm9hcmQtYWN0aW9uIiksZSgidGlueS1lbWl0dGVyIiksZSgiZ29vZC1saXN0ZW5lciIpKTtlbHNle3ZhciBhPXtleHBvcnRzOnt9fTtyKGEsaS5jbGlwYm9hcmRBY3Rpb24saS50aW55RW1pdHRlcixpLmdvb2RMaXN0ZW5lciksaS5jbGlwYm9hcmQ9YS5leHBvcnRzfX0odGhpcyxmdW5jdGlvbih0LGUsbixvKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6eyJkZWZhdWx0Ijp0fX1mdW5jdGlvbiByKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gYSh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIGModCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfWZ1bmN0aW9uIHModCxlKXt2YXIgbj0iZGF0YS1jbGlwYm9hcmQtIit0O2lmKGUuaGFzQXR0cmlidXRlKG4pKXJldHVybiBlLmdldEF0dHJpYnV0ZShuKX12YXIgbD1pKGUpLHU9aShuKSxmPWkobyksZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4sbyl7cih0aGlzLGUpO3ZhciBpPWEodGhpcyx0LmNhbGwodGhpcykpO3JldHVybiBpLnJlc29sdmVPcHRpb25zKG8pLGkubGlzdGVuQ2xpY2sobiksaX1yZXR1cm4gYyhlLHQpLGUucHJvdG90eXBlLnJlc29sdmVPcHRpb25zPWZ1bmN0aW9uIHQoKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPD0wfHx2b2lkIDA9PT1hcmd1bWVudHNbMF0/e306YXJndW1lbnRzWzBdO3RoaXMuYWN0aW9uPSJmdW5jdGlvbiI9PXR5cGVvZiBlLmFjdGlvbj9lLmFjdGlvbjp0aGlzLmRlZmF1bHRBY3Rpb24sdGhpcy50YXJnZXQ9ImZ1bmN0aW9uIj09dHlwZW9mIGUudGFyZ2V0P2UudGFyZ2V0OnRoaXMuZGVmYXVsdFRhcmdldCx0aGlzLnRleHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGUudGV4dD9lLnRleHQ6dGhpcy5kZWZhdWx0VGV4dH0sZS5wcm90b3R5cGUubGlzdGVuQ2xpY2s9ZnVuY3Rpb24gdChlKXt2YXIgbj10aGlzO3RoaXMubGlzdGVuZXI9KDAsZi5kZWZhdWx0KShlLCJjbGljayIsZnVuY3Rpb24odCl7cmV0dXJuIG4ub25DbGljayh0KX0pfSxlLnByb3RvdHlwZS5vbkNsaWNrPWZ1bmN0aW9uIHQoZSl7dmFyIG49ZS5kZWxlZ2F0ZVRhcmdldHx8ZS5jdXJyZW50VGFyZ2V0O3RoaXMuY2xpcGJvYXJkQWN0aW9uJiYodGhpcy5jbGlwYm9hcmRBY3Rpb249bnVsbCksdGhpcy5jbGlwYm9hcmRBY3Rpb249bmV3IGwuZGVmYXVsdCh7YWN0aW9uOnRoaXMuYWN0aW9uKG4pLHRhcmdldDp0aGlzLnRhcmdldChuKSx0ZXh0OnRoaXMudGV4dChuKSx0cmlnZ2VyOm4sZW1pdHRlcjp0aGlzfSl9LGUucHJvdG90eXBlLmRlZmF1bHRBY3Rpb249ZnVuY3Rpb24gdChlKXtyZXR1cm4gcygiYWN0aW9uIixlKX0sZS5wcm90b3R5cGUuZGVmYXVsdFRhcmdldD1mdW5jdGlvbiB0KGUpe3ZhciBuPXMoInRhcmdldCIsZSk7cmV0dXJuIG4/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihuKTp2b2lkIDB9LGUucHJvdG90eXBlLmRlZmF1bHRUZXh0PWZ1bmN0aW9uIHQoZSl7cmV0dXJuIHMoInRleHQiLGUpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uIHQoKXt0aGlzLmxpc3RlbmVyLmRlc3Ryb3koKSx0aGlzLmNsaXBib2FyZEFjdGlvbiYmKHRoaXMuY2xpcGJvYXJkQWN0aW9uLmRlc3Ryb3koKSx0aGlzLmNsaXBib2FyZEFjdGlvbj1udWxsKX0sZX0odS5kZWZhdWx0KTt0LmV4cG9ydHM9ZH0pfSx7Ii4vY2xpcGJvYXJkLWFjdGlvbiI6OCwiZ29vZC1saXN0ZW5lciI6NCwidGlueS1lbWl0dGVyIjo3fV19LHt9LFs5XSkoOSl9KTs=
Ly8gU3BlY3RydW0gQ29sb3JwaWNrZXIgdjEuOC4wCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZ3JpbnMvc3BlY3RydW0KLy8gQXV0aG9yOiBCcmlhbiBHcmluc3RlYWQKLy8gTGljZW5zZTogTUlUCgooZnVuY3Rpb24gKGZhY3RvcnkpIHsKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7IC8vIEFNRAogICAgICAgIGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTsKICAgIH0KICAgIGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIHsgLy8gQ29tbW9uSlMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfQogICAgZWxzZSB7IC8vIEJyb3dzZXIKICAgICAgICBmYWN0b3J5KGpRdWVyeSk7CiAgICB9Cn0pKGZ1bmN0aW9uKCQsIHVuZGVmaW5lZCkgewogICAgInVzZSBzdHJpY3QiOwoKICAgIHZhciBkZWZhdWx0T3B0cyA9IHsKCiAgICAgICAgLy8gQ2FsbGJhY2tzCiAgICAgICAgYmVmb3JlU2hvdzogbm9vcCwKICAgICAgICBtb3ZlOiBub29wLAogICAgICAgIGNoYW5nZTogbm9vcCwKICAgICAgICBzaG93OiBub29wLAogICAgICAgIGhpZGU6IG5vb3AsCgogICAgICAgIC8vIE9wdGlvbnMKICAgICAgICBjb2xvcjogZmFsc2UsCiAgICAgICAgZmxhdDogZmFsc2UsCiAgICAgICAgc2hvd0lucHV0OiBmYWxzZSwKICAgICAgICBhbGxvd0VtcHR5OiBmYWxzZSwKICAgICAgICBzaG93QnV0dG9uczogdHJ1ZSwKICAgICAgICBjbGlja291dEZpcmVzQ2hhbmdlOiB0cnVlLAogICAgICAgIHNob3dJbml0aWFsOiBmYWxzZSwKICAgICAgICBzaG93UGFsZXR0ZTogZmFsc2UsCiAgICAgICAgc2hvd1BhbGV0dGVPbmx5OiBmYWxzZSwKICAgICAgICBoaWRlQWZ0ZXJQYWxldHRlU2VsZWN0OiBmYWxzZSwKICAgICAgICB0b2dnbGVQYWxldHRlT25seTogZmFsc2UsCiAgICAgICAgc2hvd1NlbGVjdGlvblBhbGV0dGU6IHRydWUsCiAgICAgICAgbG9jYWxTdG9yYWdlS2V5OiBmYWxzZSwKICAgICAgICBhcHBlbmRUbzogImJvZHkiLAogICAgICAgIG1heFNlbGVjdGlvblNpemU6IDcsCiAgICAgICAgY2FuY2VsVGV4dDogImNhbmNlbCIsCiAgICAgICAgY2hvb3NlVGV4dDogImNob29zZSIsCiAgICAgICAgdG9nZ2xlUGFsZXR0ZU1vcmVUZXh0OiAibW9yZSIsCiAgICAgICAgdG9nZ2xlUGFsZXR0ZUxlc3NUZXh0OiAibGVzcyIsCiAgICAgICAgY2xlYXJUZXh0OiAiQ2xlYXIgQ29sb3IgU2VsZWN0aW9uIiwKICAgICAgICBub0NvbG9yU2VsZWN0ZWRUZXh0OiAiTm8gQ29sb3IgU2VsZWN0ZWQiLAogICAgICAgIHByZWZlcnJlZEZvcm1hdDogZmFsc2UsCiAgICAgICAgY2xhc3NOYW1lOiAiIiwgLy8gRGVwcmVjYXRlZCAtIHVzZSBjb250YWluZXJDbGFzc05hbWUgYW5kIHJlcGxhY2VyQ2xhc3NOYW1lIGluc3RlYWQuCiAgICAgICAgY29udGFpbmVyQ2xhc3NOYW1lOiAiIiwKICAgICAgICByZXBsYWNlckNsYXNzTmFtZTogIiIsCiAgICAgICAgc2hvd0FscGhhOiBmYWxzZSwKICAgICAgICB0aGVtZTogInNwLWxpZ2h0IiwKICAgICAgICBwYWxldHRlOiBbWyIjZmZmZmZmIiwgIiMwMDAwMDAiLCAiI2ZmMDAwMCIsICIjZmY4MDAwIiwgIiNmZmZmMDAiLCAiIzAwODAwMCIsICIjMDAwMGZmIiwgIiM0YjAwODIiLCAiIzk0MDBkMyJdXSwKICAgICAgICBzZWxlY3Rpb25QYWxldHRlOiBbXSwKICAgICAgICBkaXNhYmxlZDogZmFsc2UsCiAgICAgICAgb2Zmc2V0OiBudWxsCiAgICB9LAogICAgc3BlY3RydW1zID0gW10sCiAgICBJRSA9ICEhL21zaWUvaS5leGVjKCB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCApLAogICAgcmdiYVN1cHBvcnQgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuY3Rpb24gY29udGFpbnMoIHN0ciwgc3Vic3RyICkgewogICAgICAgICAgICByZXR1cm4gISF+KCcnICsgc3RyKS5pbmRleE9mKHN1YnN0cik7CiAgICAgICAgfQoKICAgICAgICB2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIHZhciBzdHlsZSA9IGVsZW0uc3R5bGU7CiAgICAgICAgc3R5bGUuY3NzVGV4dCA9ICdiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjUpJzsKICAgICAgICByZXR1cm4gY29udGFpbnMoc3R5bGUuYmFja2dyb3VuZENvbG9yLCAncmdiYScpIHx8IGNvbnRhaW5zKHN0eWxlLmJhY2tncm91bmRDb2xvciwgJ2hzbGEnKTsKICAgIH0pKCksCiAgICByZXBsYWNlSW5wdXQgPSBbCiAgICAgICAgIjxkaXYgY2xhc3M9J3NwLXJlcGxhY2VyJz4iLAogICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtcHJldmlldyc+PGRpdiBjbGFzcz0nc3AtcHJldmlldy1pbm5lcic+PC9kaXY+PC9kaXY+IiwKICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLWRkJz4mIzk2NjA7PC9kaXY+IiwKICAgICAgICAiPC9kaXY+IgogICAgXS5qb2luKCcnKSwKICAgIG1hcmt1cCA9IChmdW5jdGlvbiAoKSB7CgogICAgICAgIC8vIElFIGRvZXMgbm90IHN1cHBvcnQgZ3JhZGllbnRzIHdpdGggbXVsdGlwbGUgc3RvcHMsIHNvIHdlIG5lZWQgdG8gc2ltdWxhdGUKICAgICAgICAvLyAgdGhhdCBmb3IgdGhlIHJhaW5ib3cgc2xpZGVyIHdpdGggOCBkaXZzIHRoYXQgZWFjaCBoYXZlIGEgc2luZ2xlIGdyYWRpZW50CiAgICAgICAgdmFyIGdyYWRpZW50Rml4ID0gIiI7CiAgICAgICAgaWYgKElFKSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IDY7IGkrKykgewogICAgICAgICAgICAgICAgZ3JhZGllbnRGaXggKz0gIjxkaXYgY2xhc3M9J3NwLSIgKyBpICsgIic+PC9kaXY+IjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLWNvbnRhaW5lciBzcC1oaWRkZW4nPiIsCiAgICAgICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtcGFsZXR0ZS1jb250YWluZXInPiIsCiAgICAgICAgICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLXBhbGV0dGUgc3AtdGh1bWIgc3AtY2YnPjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLXBhbGV0dGUtYnV0dG9uLWNvbnRhaW5lciBzcC1jZic+IiwKICAgICAgICAgICAgICAgICAgICAgICAgIjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nc3AtcGFsZXR0ZS10b2dnbGUnPjwvYnV0dG9uPiIsCiAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAiPC9kaXY+IiwKICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1waWNrZXItY29udGFpbmVyJz4iLAogICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC10b3Agc3AtY2YnPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1maWxsJz48L2Rpdj4iLAogICAgICAgICAgICAgICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtdG9wLWlubmVyJz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLWNvbG9yJz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1zYXQnPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC12YWwnPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtZHJhZ2dlcic+PC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1jbGVhciBzcC1jbGVhci1kaXNwbGF5Jz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtaHVlJz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1zbGlkZXInPjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZGllbnRGaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1hbHBoYSc+PGRpdiBjbGFzcz0nc3AtYWxwaGEtaW5uZXInPjxkaXYgY2xhc3M9J3NwLWFscGhhLWhhbmRsZSc+PC9kaXY+PC9kaXY+PC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAiPC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtaW5wdXQtY29udGFpbmVyIHNwLWNmJz4iLAogICAgICAgICAgICAgICAgICAgICAgICAiPGlucHV0IGNsYXNzPSdzcC1pbnB1dCcgdHlwZT0ndGV4dCcgc3BlbGxjaGVjaz0nZmFsc2UnICAvPiIsCiAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLWluaXRpYWwgc3AtdGh1bWIgc3AtY2YnPjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLWJ1dHRvbi1jb250YWluZXIgc3AtY2YnPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICI8YSBjbGFzcz0nc3AtY2FuY2VsJyBocmVmPScjJz48L2E+IiwKICAgICAgICAgICAgICAgICAgICAgICAgIjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nc3AtY2hvb3NlJz48L2J1dHRvbj4iLAogICAgICAgICAgICAgICAgICAgICI8L2Rpdj4iLAogICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICI8L2Rpdj4iCiAgICAgICAgXS5qb2luKCIiKTsKICAgIH0pKCk7CgogICAgZnVuY3Rpb24gcGFsZXR0ZVRlbXBsYXRlIChwLCBjb2xvciwgY2xhc3NOYW1lLCBvcHRzKSB7CiAgICAgICAgdmFyIGh0bWwgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBwW2ldOwogICAgICAgICAgICBpZihjdXJyZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgdGlueSA9IHRpbnljb2xvcihjdXJyZW50KTsKICAgICAgICAgICAgICAgIHZhciBjID0gdGlueS50b0hzbCgpLmwgPCAwLjUgPyAic3AtdGh1bWItZWwgc3AtdGh1bWItZGFyayIgOiAic3AtdGh1bWItZWwgc3AtdGh1bWItbGlnaHQiOwogICAgICAgICAgICAgICAgYyArPSAodGlueWNvbG9yLmVxdWFscyhjb2xvciwgY3VycmVudCkpID8gIiBzcC10aHVtYi1hY3RpdmUiIDogIiI7CiAgICAgICAgICAgICAgICB2YXIgZm9ybWF0dGVkU3RyaW5nID0gdGlueS50b1N0cmluZyhvcHRzLnByZWZlcnJlZEZvcm1hdCB8fCAicmdiIik7CiAgICAgICAgICAgICAgICB2YXIgc3dhdGNoU3R5bGUgPSByZ2JhU3VwcG9ydCA/ICgiYmFja2dyb3VuZC1jb2xvcjoiICsgdGlueS50b1JnYlN0cmluZygpKSA6ICJmaWx0ZXI6IiArIHRpbnkudG9GaWx0ZXIoKTsKICAgICAgICAgICAgICAgIGh0bWwucHVzaCgnPHNwYW4gdGl0bGU9IicgKyBmb3JtYXR0ZWRTdHJpbmcgKyAnIiBkYXRhLWNvbG9yPSInICsgdGlueS50b1JnYlN0cmluZygpICsgJyIgY2xhc3M9IicgKyBjICsgJyI+PHNwYW4gY2xhc3M9InNwLXRodW1iLWlubmVyIiBzdHlsZT0iJyArIHN3YXRjaFN0eWxlICsgJzsiIC8+PC9zcGFuPicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGNscyA9ICdzcC1jbGVhci1kaXNwbGF5JzsKICAgICAgICAgICAgICAgIGh0bWwucHVzaCgkKCc8ZGl2IC8+JykKICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxzcGFuIGRhdGEtY29sb3I9IiIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7IiBjbGFzcz0iJyArIGNscyArICciPjwvc3Bhbj4nKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigndGl0bGUnLCBvcHRzLm5vQ29sb3JTZWxlY3RlZFRleHQpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIC5odG1sKCkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8ZGl2IGNsYXNzPSdzcC1jZiAiICsgY2xhc3NOYW1lICsgIic+IiArIGh0bWwuam9pbignJykgKyAiPC9kaXY+IjsKICAgIH0KCiAgICBmdW5jdGlvbiBoaWRlQWxsKCkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BlY3RydW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChzcGVjdHJ1bXNbaV0pIHsKICAgICAgICAgICAgICAgIHNwZWN0cnVtc1tpXS5oaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaW5zdGFuY2VPcHRpb25zKG8sIGNhbGxiYWNrQ29udGV4dCkgewogICAgICAgIHZhciBvcHRzID0gJC5leHRlbmQoe30sIGRlZmF1bHRPcHRzLCBvKTsKICAgICAgICBvcHRzLmNhbGxiYWNrcyA9IHsKICAgICAgICAgICAgJ21vdmUnOiBiaW5kKG9wdHMubW92ZSwgY2FsbGJhY2tDb250ZXh0KSwKICAgICAgICAgICAgJ2NoYW5nZSc6IGJpbmQob3B0cy5jaGFuZ2UsIGNhbGxiYWNrQ29udGV4dCksCiAgICAgICAgICAgICdzaG93JzogYmluZChvcHRzLnNob3csIGNhbGxiYWNrQ29udGV4dCksCiAgICAgICAgICAgICdoaWRlJzogYmluZChvcHRzLmhpZGUsIGNhbGxiYWNrQ29udGV4dCksCiAgICAgICAgICAgICdiZWZvcmVTaG93JzogYmluZChvcHRzLmJlZm9yZVNob3csIGNhbGxiYWNrQ29udGV4dCkKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gb3B0czsKICAgIH0KCiAgICBmdW5jdGlvbiBzcGVjdHJ1bShlbGVtZW50LCBvKSB7CgogICAgICAgIHZhciBvcHRzID0gaW5zdGFuY2VPcHRpb25zKG8sIGVsZW1lbnQpLAogICAgICAgICAgICBmbGF0ID0gb3B0cy5mbGF0LAogICAgICAgICAgICBzaG93U2VsZWN0aW9uUGFsZXR0ZSA9IG9wdHMuc2hvd1NlbGVjdGlvblBhbGV0dGUsCiAgICAgICAgICAgIGxvY2FsU3RvcmFnZUtleSA9IG9wdHMubG9jYWxTdG9yYWdlS2V5LAogICAgICAgICAgICB0aGVtZSA9IG9wdHMudGhlbWUsCiAgICAgICAgICAgIGNhbGxiYWNrcyA9IG9wdHMuY2FsbGJhY2tzLAogICAgICAgICAgICByZXNpemUgPSB0aHJvdHRsZShyZWZsb3csIDEwKSwKICAgICAgICAgICAgdmlzaWJsZSA9IGZhbHNlLAogICAgICAgICAgICBpc0RyYWdnaW5nID0gZmFsc2UsCiAgICAgICAgICAgIGRyYWdXaWR0aCA9IDAsCiAgICAgICAgICAgIGRyYWdIZWlnaHQgPSAwLAogICAgICAgICAgICBkcmFnSGVscGVySGVpZ2h0ID0gMCwKICAgICAgICAgICAgc2xpZGVIZWlnaHQgPSAwLAogICAgICAgICAgICBzbGlkZVdpZHRoID0gMCwKICAgICAgICAgICAgYWxwaGFXaWR0aCA9IDAsCiAgICAgICAgICAgIGFscGhhU2xpZGVIZWxwZXJXaWR0aCA9IDAsCiAgICAgICAgICAgIHNsaWRlSGVscGVySGVpZ2h0ID0gMCwKICAgICAgICAgICAgY3VycmVudEh1ZSA9IDAsCiAgICAgICAgICAgIGN1cnJlbnRTYXR1cmF0aW9uID0gMCwKICAgICAgICAgICAgY3VycmVudFZhbHVlID0gMCwKICAgICAgICAgICAgY3VycmVudEFscGhhID0gMSwKICAgICAgICAgICAgcGFsZXR0ZSA9IFtdLAogICAgICAgICAgICBwYWxldHRlQXJyYXkgPSBbXSwKICAgICAgICAgICAgcGFsZXR0ZUxvb2t1cCA9IHt9LAogICAgICAgICAgICBzZWxlY3Rpb25QYWxldHRlID0gb3B0cy5zZWxlY3Rpb25QYWxldHRlLnNsaWNlKDApLAogICAgICAgICAgICBtYXhTZWxlY3Rpb25TaXplID0gb3B0cy5tYXhTZWxlY3Rpb25TaXplLAogICAgICAgICAgICBkcmFnZ2luZ0NsYXNzID0gInNwLWRyYWdnaW5nIiwKICAgICAgICAgICAgc2hpZnRNb3ZlbWVudERpcmVjdGlvbiA9IG51bGw7CgogICAgICAgIHZhciBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQsCiAgICAgICAgICAgIGJvZHkgPSBkb2MuYm9keSwKICAgICAgICAgICAgYm91bmRFbGVtZW50ID0gJChlbGVtZW50KSwKICAgICAgICAgICAgZGlzYWJsZWQgPSBmYWxzZSwKICAgICAgICAgICAgY29udGFpbmVyID0gJChtYXJrdXAsIGRvYykuYWRkQ2xhc3ModGhlbWUpLAogICAgICAgICAgICBwaWNrZXJDb250YWluZXIgPSBjb250YWluZXIuZmluZCgiLnNwLXBpY2tlci1jb250YWluZXIiKSwKICAgICAgICAgICAgZHJhZ2dlciA9IGNvbnRhaW5lci5maW5kKCIuc3AtY29sb3IiKSwKICAgICAgICAgICAgZHJhZ0hlbHBlciA9IGNvbnRhaW5lci5maW5kKCIuc3AtZHJhZ2dlciIpLAogICAgICAgICAgICBzbGlkZXIgPSBjb250YWluZXIuZmluZCgiLnNwLWh1ZSIpLAogICAgICAgICAgICBzbGlkZUhlbHBlciA9IGNvbnRhaW5lci5maW5kKCIuc3Atc2xpZGVyIiksCiAgICAgICAgICAgIGFscGhhU2xpZGVySW5uZXIgPSBjb250YWluZXIuZmluZCgiLnNwLWFscGhhLWlubmVyIiksCiAgICAgICAgICAgIGFscGhhU2xpZGVyID0gY29udGFpbmVyLmZpbmQoIi5zcC1hbHBoYSIpLAogICAgICAgICAgICBhbHBoYVNsaWRlSGVscGVyID0gY29udGFpbmVyLmZpbmQoIi5zcC1hbHBoYS1oYW5kbGUiKSwKICAgICAgICAgICAgdGV4dElucHV0ID0gY29udGFpbmVyLmZpbmQoIi5zcC1pbnB1dCIpLAogICAgICAgICAgICBwYWxldHRlQ29udGFpbmVyID0gY29udGFpbmVyLmZpbmQoIi5zcC1wYWxldHRlIiksCiAgICAgICAgICAgIGluaXRpYWxDb2xvckNvbnRhaW5lciA9IGNvbnRhaW5lci5maW5kKCIuc3AtaW5pdGlhbCIpLAogICAgICAgICAgICBjYW5jZWxCdXR0b24gPSBjb250YWluZXIuZmluZCgiLnNwLWNhbmNlbCIpLAogICAgICAgICAgICBjbGVhckJ1dHRvbiA9IGNvbnRhaW5lci5maW5kKCIuc3AtY2xlYXIiKSwKICAgICAgICAgICAgY2hvb3NlQnV0dG9uID0gY29udGFpbmVyLmZpbmQoIi5zcC1jaG9vc2UiKSwKICAgICAgICAgICAgdG9nZ2xlQnV0dG9uID0gY29udGFpbmVyLmZpbmQoIi5zcC1wYWxldHRlLXRvZ2dsZSIpLAogICAgICAgICAgICBpc0lucHV0ID0gYm91bmRFbGVtZW50LmlzKCJpbnB1dCIpLAogICAgICAgICAgICBpc0lucHV0VHlwZUNvbG9yID0gaXNJbnB1dCAmJiBib3VuZEVsZW1lbnQuYXR0cigidHlwZSIpID09PSAiY29sb3IiICYmIGlucHV0VHlwZUNvbG9yU3VwcG9ydCgpLAogICAgICAgICAgICBzaG91bGRSZXBsYWNlID0gaXNJbnB1dCAmJiAhZmxhdCwKICAgICAgICAgICAgcmVwbGFjZXIgPSAoc2hvdWxkUmVwbGFjZSkgPyAkKHJlcGxhY2VJbnB1dCkuYWRkQ2xhc3ModGhlbWUpLmFkZENsYXNzKG9wdHMuY2xhc3NOYW1lKS5hZGRDbGFzcyhvcHRzLnJlcGxhY2VyQ2xhc3NOYW1lKSA6ICQoW10pLAogICAgICAgICAgICBvZmZzZXRFbGVtZW50ID0gKHNob3VsZFJlcGxhY2UpID8gcmVwbGFjZXIgOiBib3VuZEVsZW1lbnQsCiAgICAgICAgICAgIHByZXZpZXdFbGVtZW50ID0gcmVwbGFjZXIuZmluZCgiLnNwLXByZXZpZXctaW5uZXIiKSwKICAgICAgICAgICAgaW5pdGlhbENvbG9yID0gb3B0cy5jb2xvciB8fCAoaXNJbnB1dCAmJiBib3VuZEVsZW1lbnQudmFsKCkpLAogICAgICAgICAgICBjb2xvck9uU2hvdyA9IGZhbHNlLAogICAgICAgICAgICBjdXJyZW50UHJlZmVycmVkRm9ybWF0ID0gb3B0cy5wcmVmZXJyZWRGb3JtYXQsCiAgICAgICAgICAgIGNsaWNrb3V0RmlyZXNDaGFuZ2UgPSAhb3B0cy5zaG93QnV0dG9ucyB8fCBvcHRzLmNsaWNrb3V0RmlyZXNDaGFuZ2UsCiAgICAgICAgICAgIGlzRW1wdHkgPSAhaW5pdGlhbENvbG9yLAogICAgICAgICAgICBhbGxvd0VtcHR5ID0gb3B0cy5hbGxvd0VtcHR5ICYmICFpc0lucHV0VHlwZUNvbG9yOwoKICAgICAgICBmdW5jdGlvbiBhcHBseU9wdGlvbnMoKSB7CgogICAgICAgICAgICBpZiAob3B0cy5zaG93UGFsZXR0ZU9ubHkpIHsKICAgICAgICAgICAgICAgIG9wdHMuc2hvd1BhbGV0dGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0b2dnbGVCdXR0b24udGV4dChvcHRzLnNob3dQYWxldHRlT25seSA/IG9wdHMudG9nZ2xlUGFsZXR0ZU1vcmVUZXh0IDogb3B0cy50b2dnbGVQYWxldHRlTGVzc1RleHQpOwoKICAgICAgICAgICAgaWYgKG9wdHMucGFsZXR0ZSkgewogICAgICAgICAgICAgICAgcGFsZXR0ZSA9IG9wdHMucGFsZXR0ZS5zbGljZSgwKTsKICAgICAgICAgICAgICAgIHBhbGV0dGVBcnJheSA9ICQuaXNBcnJheShwYWxldHRlWzBdKSA/IHBhbGV0dGUgOiBbcGFsZXR0ZV07CiAgICAgICAgICAgICAgICBwYWxldHRlTG9va3VwID0ge307CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhbGV0dGVBcnJheS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFsZXR0ZUFycmF5W2ldLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZ2IgPSB0aW55Y29sb3IocGFsZXR0ZUFycmF5W2ldW2pdKS50b1JnYlN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlTG9va3VwW3JnYl0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyLnRvZ2dsZUNsYXNzKCJzcC1mbGF0IiwgZmxhdCk7CiAgICAgICAgICAgIGNvbnRhaW5lci50b2dnbGVDbGFzcygic3AtaW5wdXQtZGlzYWJsZWQiLCAhb3B0cy5zaG93SW5wdXQpOwogICAgICAgICAgICBjb250YWluZXIudG9nZ2xlQ2xhc3MoInNwLWFscGhhLWVuYWJsZWQiLCBvcHRzLnNob3dBbHBoYSk7CiAgICAgICAgICAgIGNvbnRhaW5lci50b2dnbGVDbGFzcygic3AtY2xlYXItZW5hYmxlZCIsIGFsbG93RW1wdHkpOwogICAgICAgICAgICBjb250YWluZXIudG9nZ2xlQ2xhc3MoInNwLWJ1dHRvbnMtZGlzYWJsZWQiLCAhb3B0cy5zaG93QnV0dG9ucyk7CiAgICAgICAgICAgIGNvbnRhaW5lci50b2dnbGVDbGFzcygic3AtcGFsZXR0ZS1idXR0b25zLWRpc2FibGVkIiwgIW9wdHMudG9nZ2xlUGFsZXR0ZU9ubHkpOwogICAgICAgICAgICBjb250YWluZXIudG9nZ2xlQ2xhc3MoInNwLXBhbGV0dGUtZGlzYWJsZWQiLCAhb3B0cy5zaG93UGFsZXR0ZSk7CiAgICAgICAgICAgIGNvbnRhaW5lci50b2dnbGVDbGFzcygic3AtcGFsZXR0ZS1vbmx5Iiwgb3B0cy5zaG93UGFsZXR0ZU9ubHkpOwogICAgICAgICAgICBjb250YWluZXIudG9nZ2xlQ2xhc3MoInNwLWluaXRpYWwtZGlzYWJsZWQiLCAhb3B0cy5zaG93SW5pdGlhbCk7CiAgICAgICAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyhvcHRzLmNsYXNzTmFtZSkuYWRkQ2xhc3Mob3B0cy5jb250YWluZXJDbGFzc05hbWUpOwoKICAgICAgICAgICAgcmVmbG93KCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBpbml0aWFsaXplKCkgewoKICAgICAgICAgICAgaWYgKElFKSB7CiAgICAgICAgICAgICAgICBjb250YWluZXIuZmluZCgiKjpub3QoaW5wdXQpIikuYXR0cigidW5zZWxlY3RhYmxlIiwgIm9uIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFwcGx5T3B0aW9ucygpOwoKICAgICAgICAgICAgaWYgKHNob3VsZFJlcGxhY2UpIHsKICAgICAgICAgICAgICAgIGJvdW5kRWxlbWVudC5hZnRlcihyZXBsYWNlcikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWFsbG93RW1wdHkpIHsKICAgICAgICAgICAgICAgIGNsZWFyQnV0dG9uLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGZsYXQpIHsKICAgICAgICAgICAgICAgIGJvdW5kRWxlbWVudC5hZnRlcihjb250YWluZXIpLmhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICB2YXIgYXBwZW5kVG8gPSBvcHRzLmFwcGVuZFRvID09PSAicGFyZW50IiA/IGJvdW5kRWxlbWVudC5wYXJlbnQoKSA6ICQob3B0cy5hcHBlbmRUbyk7CiAgICAgICAgICAgICAgICBpZiAoYXBwZW5kVG8ubGVuZ3RoICE9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG8gPSAkKCJib2R5Iik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYXBwZW5kVG8uYXBwZW5kKGNvbnRhaW5lcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGlvblBhbGV0dGVGcm9tU3RvcmFnZSgpOwoKICAgICAgICAgICAgb2Zmc2V0RWxlbWVudC5iaW5kKCJjbGljay5zcGVjdHJ1bSB0b3VjaHN0YXJ0LnNwZWN0cnVtIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmICghZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0b2dnbGUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwoKICAgICAgICAgICAgICAgIGlmICghJChlLnRhcmdldCkuaXMoImlucHV0IikpIHsKICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYoYm91bmRFbGVtZW50LmlzKCI6ZGlzYWJsZWQiKSB8fCAob3B0cy5kaXNhYmxlZCA9PT0gdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIGRpc2FibGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUHJldmVudCBjbGlja3MgZnJvbSBidWJibGluZyB1cCB0byBkb2N1bWVudC4gIFRoaXMgd291bGQgY2F1c2UgaXQgdG8gYmUgaGlkZGVuLgogICAgICAgICAgICBjb250YWluZXIuY2xpY2soc3RvcFByb3BhZ2F0aW9uKTsKCiAgICAgICAgICAgIC8vIEhhbmRsZSB1c2VyIHR5cGVkIGlucHV0CiAgICAgICAgICAgIHRleHRJbnB1dC5jaGFuZ2Uoc2V0RnJvbVRleHRJbnB1dCk7CiAgICAgICAgICAgIHRleHRJbnB1dC5iaW5kKCJwYXN0ZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoc2V0RnJvbVRleHRJbnB1dCwgMSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0ZXh0SW5wdXQua2V5ZG93bihmdW5jdGlvbiAoZSkgeyBpZiAoZS5rZXlDb2RlID09IDEzKSB7IHNldEZyb21UZXh0SW5wdXQoKTsgfSB9KTsKCiAgICAgICAgICAgIGNhbmNlbEJ1dHRvbi50ZXh0KG9wdHMuY2FuY2VsVGV4dCk7CiAgICAgICAgICAgIGNhbmNlbEJ1dHRvbi5iaW5kKCJjbGljay5zcGVjdHJ1bSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgcmV2ZXJ0KCk7CiAgICAgICAgICAgICAgICBoaWRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgY2xlYXJCdXR0b24uYXR0cigidGl0bGUiLCBvcHRzLmNsZWFyVGV4dCk7CiAgICAgICAgICAgIGNsZWFyQnV0dG9uLmJpbmQoImNsaWNrLnNwZWN0cnVtIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBpc0VtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIG1vdmUoKTsKCiAgICAgICAgICAgICAgICBpZihmbGF0KSB7CiAgICAgICAgICAgICAgICAgICAgLy9mb3IgdGhlIGZsYXQgc3R5bGUsIHRoaXMgaXMgYSBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGNob29zZUJ1dHRvbi50ZXh0KG9wdHMuY2hvb3NlVGV4dCk7CiAgICAgICAgICAgIGNob29zZUJ1dHRvbi5iaW5kKCJjbGljay5zcGVjdHJ1bSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgICAgIGlmIChJRSAmJiB0ZXh0SW5wdXQuaXMoIjpmb2N1cyIpKSB7CiAgICAgICAgICAgICAgICAgICAgdGV4dElucHV0LnRyaWdnZXIoJ2NoYW5nZScpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKCkpIHsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KHRydWUpOwogICAgICAgICAgICAgICAgICAgIGhpZGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0b2dnbGVCdXR0b24udGV4dChvcHRzLnNob3dQYWxldHRlT25seSA/IG9wdHMudG9nZ2xlUGFsZXR0ZU1vcmVUZXh0IDogb3B0cy50b2dnbGVQYWxldHRlTGVzc1RleHQpOwogICAgICAgICAgICB0b2dnbGVCdXR0b24uYmluZCgiY2xpY2suc3BlY3RydW0iLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICBvcHRzLnNob3dQYWxldHRlT25seSA9ICFvcHRzLnNob3dQYWxldHRlT25seTsKCiAgICAgICAgICAgICAgICAvLyBUbyBtYWtlIHN1cmUgdGhlIFBpY2tlciBhcmVhIGlzIGRyYXduIG9uIHRoZSByaWdodCwgbmV4dCB0byB0aGUKICAgICAgICAgICAgICAgIC8vIFBhbGV0dGUgYXJlYSAoYW5kIG5vdCBiZWxvdyB0aGUgcGFsZXR0ZSksIGZpcnN0IG1vdmUgdGhlIFBhbGV0dGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBsZWZ0IHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBwaWNrZXIsIHBsdXMgNXB4IGV4dHJhLgogICAgICAgICAgICAgICAgLy8gVGhlICdhcHBseU9wdGlvbnMnIGZ1bmN0aW9uIHB1dHMgdGhlIHdob2xlIGNvbnRhaW5lciBiYWNrIGludG8gcGxhY2UKICAgICAgICAgICAgICAgIC8vIGFuZCB0YWtlcyBjYXJlIG9mIHRoZSBidXR0b24tdGV4dCBhbmQgdGhlIHNwLXBhbGV0dGUtb25seSBDU1MgY2xhc3MuCiAgICAgICAgICAgICAgICBpZiAoIW9wdHMuc2hvd1BhbGV0dGVPbmx5ICYmICFmbGF0KSB7CiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmNzcygnbGVmdCcsICctPScgKyAocGlja2VyQ29udGFpbmVyLm91dGVyV2lkdGgodHJ1ZSkgKyA1KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhcHBseU9wdGlvbnMoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkcmFnZ2FibGUoYWxwaGFTbGlkZXIsIGZ1bmN0aW9uIChkcmFnWCwgZHJhZ1ksIGUpIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRBbHBoYSA9IChkcmFnWCAvIGFscGhhV2lkdGgpOwogICAgICAgICAgICAgICAgaXNFbXB0eSA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50QWxwaGEgPSBNYXRoLnJvdW5kKGN1cnJlbnRBbHBoYSAqIDEwKSAvIDEwOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1vdmUoKTsKICAgICAgICAgICAgfSwgZHJhZ1N0YXJ0LCBkcmFnU3RvcCk7CgogICAgICAgICAgICBkcmFnZ2FibGUoc2xpZGVyLCBmdW5jdGlvbiAoZHJhZ1gsIGRyYWdZKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50SHVlID0gcGFyc2VGbG9hdChkcmFnWSAvIHNsaWRlSGVpZ2h0KTsKICAgICAgICAgICAgICAgIGlzRW1wdHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmICghb3B0cy5zaG93QWxwaGEpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50QWxwaGEgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgICB9LCBkcmFnU3RhcnQsIGRyYWdTdG9wKTsKCiAgICAgICAgICAgIGRyYWdnYWJsZShkcmFnZ2VyLCBmdW5jdGlvbiAoZHJhZ1gsIGRyYWdZLCBlKSB7CgogICAgICAgICAgICAgICAgLy8gc2hpZnQrZHJhZyBzaG91bGQgc25hcCB0aGUgbW92ZW1lbnQgdG8gZWl0aGVyIHRoZSB4IG9yIHkgYXhpcy4KICAgICAgICAgICAgICAgIGlmICghZS5zaGlmdEtleSkgewogICAgICAgICAgICAgICAgICAgIHNoaWZ0TW92ZW1lbnREaXJlY3Rpb24gPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoIXNoaWZ0TW92ZW1lbnREaXJlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb2xkRHJhZ1ggPSBjdXJyZW50U2F0dXJhdGlvbiAqIGRyYWdXaWR0aDsKICAgICAgICAgICAgICAgICAgICB2YXIgb2xkRHJhZ1kgPSBkcmFnSGVpZ2h0IC0gKGN1cnJlbnRWYWx1ZSAqIGRyYWdIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIHZhciBmdXJ0aGVyRnJvbVggPSBNYXRoLmFicyhkcmFnWCAtIG9sZERyYWdYKSA+IE1hdGguYWJzKGRyYWdZIC0gb2xkRHJhZ1kpOwoKICAgICAgICAgICAgICAgICAgICBzaGlmdE1vdmVtZW50RGlyZWN0aW9uID0gZnVydGhlckZyb21YID8gIngiIDogInkiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBzZXRTYXR1cmF0aW9uID0gIXNoaWZ0TW92ZW1lbnREaXJlY3Rpb24gfHwgc2hpZnRNb3ZlbWVudERpcmVjdGlvbiA9PT0gIngiOwogICAgICAgICAgICAgICAgdmFyIHNldFZhbHVlID0gIXNoaWZ0TW92ZW1lbnREaXJlY3Rpb24gfHwgc2hpZnRNb3ZlbWVudERpcmVjdGlvbiA9PT0gInkiOwoKICAgICAgICAgICAgICAgIGlmIChzZXRTYXR1cmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNhdHVyYXRpb24gPSBwYXJzZUZsb2F0KGRyYWdYIC8gZHJhZ1dpZHRoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzZXRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IHBhcnNlRmxvYXQoKGRyYWdIZWlnaHQgLSBkcmFnWSkgLyBkcmFnSGVpZ2h0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpc0VtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpZiAoIW9wdHMuc2hvd0FscGhhKSB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudEFscGhhID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb3ZlKCk7CgogICAgICAgICAgICB9LCBkcmFnU3RhcnQsIGRyYWdTdG9wKTsKCiAgICAgICAgICAgIGlmICghIWluaXRpYWxDb2xvcikgewogICAgICAgICAgICAgICAgc2V0KGluaXRpYWxDb2xvcik7CgogICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBjb2xvciB3YXMgYmxhY2sgLSB1cGRhdGUgdGhlIHByZXZpZXcgVUkgYW5kIHNldCB0aGUgZm9ybWF0CiAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgc2V0IGZ1bmN0aW9uIHdpbGwgbm90IHJ1biAoZGVmYXVsdCBjb2xvciBpcyBibGFjaykuCiAgICAgICAgICAgICAgICB1cGRhdGVVSSgpOwogICAgICAgICAgICAgICAgY3VycmVudFByZWZlcnJlZEZvcm1hdCA9IG9wdHMucHJlZmVycmVkRm9ybWF0IHx8IHRpbnljb2xvcihpbml0aWFsQ29sb3IpLmZvcm1hdDsKCiAgICAgICAgICAgICAgICBhZGRDb2xvclRvU2VsZWN0aW9uUGFsZXR0ZShpbml0aWFsQ29sb3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdXBkYXRlVUkoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGZsYXQpIHsKICAgICAgICAgICAgICAgIHNob3coKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gcGFsZXR0ZUVsZW1lbnRDbGljayhlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5kYXRhICYmIGUuZGF0YS5pZ25vcmUpIHsKICAgICAgICAgICAgICAgICAgICBzZXQoJChlLnRhcmdldCkuY2xvc2VzdCgiLnNwLXRodW1iLWVsIikuZGF0YSgiY29sb3IiKSk7CiAgICAgICAgICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2V0KCQoZS50YXJnZXQpLmNsb3Nlc3QoIi5zcC10aHVtYi1lbCIpLmRhdGEoImNvbG9yIikpOwogICAgICAgICAgICAgICAgICAgIG1vdmUoKTsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmhpZGVBZnRlclBhbGV0dGVTZWxlY3QpIHsKICAgICAgICAgICAgICAgICAgICAgIGhpZGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcGFsZXR0ZUV2ZW50ID0gSUUgPyAibW91c2Vkb3duLnNwZWN0cnVtIiA6ICJjbGljay5zcGVjdHJ1bSB0b3VjaHN0YXJ0LnNwZWN0cnVtIjsKICAgICAgICAgICAgcGFsZXR0ZUNvbnRhaW5lci5kZWxlZ2F0ZSgiLnNwLXRodW1iLWVsIiwgcGFsZXR0ZUV2ZW50LCBwYWxldHRlRWxlbWVudENsaWNrKTsKICAgICAgICAgICAgaW5pdGlhbENvbG9yQ29udGFpbmVyLmRlbGVnYXRlKCIuc3AtdGh1bWItZWw6bnRoLWNoaWxkKDEpIiwgcGFsZXR0ZUV2ZW50LCB7IGlnbm9yZTogdHJ1ZSB9LCBwYWxldHRlRWxlbWVudENsaWNrKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGlvblBhbGV0dGVGcm9tU3RvcmFnZSgpIHsKCiAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VLZXkgJiYgd2luZG93LmxvY2FsU3RvcmFnZSkgewoKICAgICAgICAgICAgICAgIC8vIE1pZ3JhdGUgb2xkIHBhbGV0dGVzIG92ZXIgdG8gbmV3IGZvcm1hdC4gIE1heSB3YW50IHRvIHJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHZhciBvbGRQYWxldHRlID0gd2luZG93LmxvY2FsU3RvcmFnZVtsb2NhbFN0b3JhZ2VLZXldLnNwbGl0KCIsIyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChvbGRQYWxldHRlLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdpbmRvdy5sb2NhbFN0b3JhZ2VbbG9jYWxTdG9yYWdlS2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9sZFBhbGV0dGUsIGZ1bmN0aW9uKGksIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRDb2xvclRvU2VsZWN0aW9uUGFsZXR0ZShjKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2goZSkgeyB9CgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25QYWxldHRlID0gd2luZG93LmxvY2FsU3RvcmFnZVtsb2NhbFN0b3JhZ2VLZXldLnNwbGl0KCI7Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGFkZENvbG9yVG9TZWxlY3Rpb25QYWxldHRlKGNvbG9yKSB7CiAgICAgICAgICAgIGlmIChzaG93U2VsZWN0aW9uUGFsZXR0ZSkgewogICAgICAgICAgICAgICAgdmFyIHJnYiA9IHRpbnljb2xvcihjb2xvcikudG9SZ2JTdHJpbmcoKTsKICAgICAgICAgICAgICAgIGlmICghcGFsZXR0ZUxvb2t1cFtyZ2JdICYmICQuaW5BcnJheShyZ2IsIHNlbGVjdGlvblBhbGV0dGUpID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblBhbGV0dGUucHVzaChyZ2IpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlKHNlbGVjdGlvblBhbGV0dGUubGVuZ3RoID4gbWF4U2VsZWN0aW9uU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25QYWxldHRlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VLZXkgJiYgd2luZG93LmxvY2FsU3RvcmFnZSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2VbbG9jYWxTdG9yYWdlS2V5XSA9IHNlbGVjdGlvblBhbGV0dGUuam9pbigiOyIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaChlKSB7IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0VW5pcXVlU2VsZWN0aW9uUGFsZXR0ZSgpIHsKICAgICAgICAgICAgdmFyIHVuaXF1ZSA9IFtdOwogICAgICAgICAgICBpZiAob3B0cy5zaG93UGFsZXR0ZSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3Rpb25QYWxldHRlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJnYiA9IHRpbnljb2xvcihzZWxlY3Rpb25QYWxldHRlW2ldKS50b1JnYlN0cmluZygpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhbGV0dGVMb29rdXBbcmdiXSkgewogICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUucHVzaChzZWxlY3Rpb25QYWxldHRlW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB1bmlxdWUucmV2ZXJzZSgpLnNsaWNlKDAsIG9wdHMubWF4U2VsZWN0aW9uU2l6ZSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBkcmF3UGFsZXR0ZSgpIHsKCiAgICAgICAgICAgIHZhciBjdXJyZW50Q29sb3IgPSBnZXQoKTsKCiAgICAgICAgICAgIHZhciBodG1sID0gJC5tYXAocGFsZXR0ZUFycmF5LCBmdW5jdGlvbiAocGFsZXR0ZSwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHBhbGV0dGVUZW1wbGF0ZShwYWxldHRlLCBjdXJyZW50Q29sb3IsICJzcC1wYWxldHRlLXJvdyBzcC1wYWxldHRlLXJvdy0iICsgaSwgb3B0cyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgdXBkYXRlU2VsZWN0aW9uUGFsZXR0ZUZyb21TdG9yYWdlKCk7CgogICAgICAgICAgICBpZiAoc2VsZWN0aW9uUGFsZXR0ZSkgewogICAgICAgICAgICAgICAgaHRtbC5wdXNoKHBhbGV0dGVUZW1wbGF0ZShnZXRVbmlxdWVTZWxlY3Rpb25QYWxldHRlKCksIGN1cnJlbnRDb2xvciwgInNwLXBhbGV0dGUtcm93IHNwLXBhbGV0dGUtcm93LXNlbGVjdGlvbiIsIG9wdHMpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcGFsZXR0ZUNvbnRhaW5lci5odG1sKGh0bWwuam9pbigiIikpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZHJhd0luaXRpYWwoKSB7CiAgICAgICAgICAgIGlmIChvcHRzLnNob3dJbml0aWFsKSB7CiAgICAgICAgICAgICAgICB2YXIgaW5pdGlhbCA9IGNvbG9yT25TaG93OwogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBnZXQoKTsKICAgICAgICAgICAgICAgIGluaXRpYWxDb2xvckNvbnRhaW5lci5odG1sKHBhbGV0dGVUZW1wbGF0ZShbaW5pdGlhbCwgY3VycmVudF0sIGN1cnJlbnQsICJzcC1wYWxldHRlLXJvdy1pbml0aWFsIiwgb3B0cykpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBkcmFnU3RhcnQoKSB7CiAgICAgICAgICAgIGlmIChkcmFnSGVpZ2h0IDw9IDAgfHwgZHJhZ1dpZHRoIDw9IDAgfHwgc2xpZGVIZWlnaHQgPD0gMCkgewogICAgICAgICAgICAgICAgcmVmbG93KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaXNEcmFnZ2luZyA9IHRydWU7CiAgICAgICAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyhkcmFnZ2luZ0NsYXNzKTsKICAgICAgICAgICAgc2hpZnRNb3ZlbWVudERpcmVjdGlvbiA9IG51bGw7CiAgICAgICAgICAgIGJvdW5kRWxlbWVudC50cmlnZ2VyKCdkcmFnc3RhcnQuc3BlY3RydW0nLCBbIGdldCgpIF0pOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZHJhZ1N0b3AoKSB7CiAgICAgICAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTsKICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZUNsYXNzKGRyYWdnaW5nQ2xhc3MpOwogICAgICAgICAgICBib3VuZEVsZW1lbnQudHJpZ2dlcignZHJhZ3N0b3Auc3BlY3RydW0nLCBbIGdldCgpIF0pOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gc2V0RnJvbVRleHRJbnB1dCgpIHsKCiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRleHRJbnB1dC52YWwoKTsKCiAgICAgICAgICAgIGlmICgodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICIiKSAmJiBhbGxvd0VtcHR5KSB7CiAgICAgICAgICAgICAgICBzZXQobnVsbCk7CiAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHRpbnkgPSB0aW55Y29sb3IodmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKHRpbnkuaXNWYWxpZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0KHRpbnkpOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZU9yaWdpbmFsSW5wdXQodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0SW5wdXQuYWRkQ2xhc3MoInNwLXZhbGlkYXRpb24tZXJyb3IiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdG9nZ2xlKCkgewogICAgICAgICAgICBpZiAodmlzaWJsZSkgewogICAgICAgICAgICAgICAgaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc2hvdygpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzaG93KCkgewogICAgICAgICAgICB2YXIgZXZlbnQgPSAkLkV2ZW50KCdiZWZvcmVTaG93LnNwZWN0cnVtJyk7CgogICAgICAgICAgICBpZiAodmlzaWJsZSkgewogICAgICAgICAgICAgICAgcmVmbG93KCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJvdW5kRWxlbWVudC50cmlnZ2VyKGV2ZW50LCBbIGdldCgpIF0pOwoKICAgICAgICAgICAgaWYgKGNhbGxiYWNrcy5iZWZvcmVTaG93KGdldCgpKSA9PT0gZmFsc2UgfHwgZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaGlkZUFsbCgpOwogICAgICAgICAgICB2aXNpYmxlID0gdHJ1ZTsKCiAgICAgICAgICAgICQoZG9jKS5iaW5kKCJrZXlkb3duLnNwZWN0cnVtIiwgb25rZXlkb3duKTsKICAgICAgICAgICAgJChkb2MpLmJpbmQoImNsaWNrLnNwZWN0cnVtIiwgY2xpY2tvdXQpOwogICAgICAgICAgICAkKHdpbmRvdykuYmluZCgicmVzaXplLnNwZWN0cnVtIiwgcmVzaXplKTsKICAgICAgICAgICAgcmVwbGFjZXIuYWRkQ2xhc3MoInNwLWFjdGl2ZSIpOwogICAgICAgICAgICBjb250YWluZXIucmVtb3ZlQ2xhc3MoInNwLWhpZGRlbiIpOwoKICAgICAgICAgICAgcmVmbG93KCk7CiAgICAgICAgICAgIHVwZGF0ZVVJKCk7CgogICAgICAgICAgICBjb2xvck9uU2hvdyA9IGdldCgpOwoKICAgICAgICAgICAgZHJhd0luaXRpYWwoKTsKICAgICAgICAgICAgY2FsbGJhY2tzLnNob3coY29sb3JPblNob3cpOwogICAgICAgICAgICBib3VuZEVsZW1lbnQudHJpZ2dlcignc2hvdy5zcGVjdHJ1bScsIFsgY29sb3JPblNob3cgXSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBvbmtleWRvd24oZSkgewogICAgICAgICAgICAvLyBDbG9zZSBvbiBFU0MKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHsKICAgICAgICAgICAgICAgIGhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gY2xpY2tvdXQoZSkgewogICAgICAgICAgICAvLyBSZXR1cm4gb24gcmlnaHQgY2xpY2suCiAgICAgICAgICAgIGlmIChlLmJ1dHRvbiA9PSAyKSB7IHJldHVybjsgfQoKICAgICAgICAgICAgLy8gSWYgYSBkcmFnIGV2ZW50IHdhcyBoYXBwZW5pbmcgZHVyaW5nIHRoZSBtb3VzZXVwLCBkb24ndCBoaWRlCiAgICAgICAgICAgIC8vIG9uIGNsaWNrLgogICAgICAgICAgICBpZiAoaXNEcmFnZ2luZykgeyByZXR1cm47IH0KCiAgICAgICAgICAgIGlmIChjbGlja291dEZpcmVzQ2hhbmdlKSB7CiAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV2ZXJ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaGlkZSgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaGlkZSgpIHsKICAgICAgICAgICAgLy8gUmV0dXJuIGlmIGhpZGluZyBpcyB1bm5lY2Vzc2FyeQogICAgICAgICAgICBpZiAoIXZpc2libGUgfHwgZmxhdCkgeyByZXR1cm47IH0KICAgICAgICAgICAgdmlzaWJsZSA9IGZhbHNlOwoKICAgICAgICAgICAgJChkb2MpLnVuYmluZCgia2V5ZG93bi5zcGVjdHJ1bSIsIG9ua2V5ZG93bik7CiAgICAgICAgICAgICQoZG9jKS51bmJpbmQoImNsaWNrLnNwZWN0cnVtIiwgY2xpY2tvdXQpOwogICAgICAgICAgICAkKHdpbmRvdykudW5iaW5kKCJyZXNpemUuc3BlY3RydW0iLCByZXNpemUpOwoKICAgICAgICAgICAgcmVwbGFjZXIucmVtb3ZlQ2xhc3MoInNwLWFjdGl2ZSIpOwogICAgICAgICAgICBjb250YWluZXIuYWRkQ2xhc3MoInNwLWhpZGRlbiIpOwoKICAgICAgICAgICAgY2FsbGJhY2tzLmhpZGUoZ2V0KCkpOwogICAgICAgICAgICBib3VuZEVsZW1lbnQudHJpZ2dlcignaGlkZS5zcGVjdHJ1bScsIFsgZ2V0KCkgXSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZXZlcnQoKSB7CiAgICAgICAgICAgIHNldChjb2xvck9uU2hvdywgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzZXQoY29sb3IsIGlnbm9yZUZvcm1hdENoYW5nZSkgewogICAgICAgICAgICBpZiAodGlueWNvbG9yLmVxdWFscyhjb2xvciwgZ2V0KCkpKSB7CiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgVUkganVzdCBpbiBjYXNlIGEgdmFsaWRhdGlvbiBlcnJvciBuZWVkcwogICAgICAgICAgICAgICAgLy8gdG8gYmUgY2xlYXJlZC4KICAgICAgICAgICAgICAgIHVwZGF0ZVVJKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBuZXdDb2xvciwgbmV3SHN2OwogICAgICAgICAgICBpZiAoIWNvbG9yICYmIGFsbG93RW1wdHkpIHsKICAgICAgICAgICAgICAgIGlzRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaXNFbXB0eSA9IGZhbHNlOwogICAgICAgICAgICAgICAgbmV3Q29sb3IgPSB0aW55Y29sb3IoY29sb3IpOwogICAgICAgICAgICAgICAgbmV3SHN2ID0gbmV3Q29sb3IudG9Ic3YoKTsKCiAgICAgICAgICAgICAgICBjdXJyZW50SHVlID0gKG5ld0hzdi5oICUgMzYwKSAvIDM2MDsKICAgICAgICAgICAgICAgIGN1cnJlbnRTYXR1cmF0aW9uID0gbmV3SHN2LnM7CiAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBuZXdIc3YudjsKICAgICAgICAgICAgICAgIGN1cnJlbnRBbHBoYSA9IG5ld0hzdi5hOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVwZGF0ZVVJKCk7CgogICAgICAgICAgICBpZiAobmV3Q29sb3IgJiYgbmV3Q29sb3IuaXNWYWxpZCgpICYmICFpZ25vcmVGb3JtYXRDaGFuZ2UpIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRQcmVmZXJyZWRGb3JtYXQgPSBvcHRzLnByZWZlcnJlZEZvcm1hdCB8fCBuZXdDb2xvci5nZXRGb3JtYXQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0KG9wdHMpIHsKICAgICAgICAgICAgb3B0cyA9IG9wdHMgfHwgeyB9OwoKICAgICAgICAgICAgaWYgKGFsbG93RW1wdHkgJiYgaXNFbXB0eSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aW55Y29sb3IuZnJvbVJhdGlvKHsKICAgICAgICAgICAgICAgIGg6IGN1cnJlbnRIdWUsCiAgICAgICAgICAgICAgICBzOiBjdXJyZW50U2F0dXJhdGlvbiwKICAgICAgICAgICAgICAgIHY6IGN1cnJlbnRWYWx1ZSwKICAgICAgICAgICAgICAgIGE6IE1hdGgucm91bmQoY3VycmVudEFscGhhICogMTAwKSAvIDEwMAogICAgICAgICAgICB9LCB7IGZvcm1hdDogb3B0cy5mb3JtYXQgfHwgY3VycmVudFByZWZlcnJlZEZvcm1hdCB9KTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGlzVmFsaWQoKSB7CiAgICAgICAgICAgIHJldHVybiAhdGV4dElucHV0Lmhhc0NsYXNzKCJzcC12YWxpZGF0aW9uLWVycm9yIik7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBtb3ZlKCkgewogICAgICAgICAgICB1cGRhdGVVSSgpOwoKICAgICAgICAgICAgY2FsbGJhY2tzLm1vdmUoZ2V0KCkpOwogICAgICAgICAgICBib3VuZEVsZW1lbnQudHJpZ2dlcignbW92ZS5zcGVjdHJ1bScsIFsgZ2V0KCkgXSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB1cGRhdGVVSSgpIHsKCiAgICAgICAgICAgIHRleHRJbnB1dC5yZW1vdmVDbGFzcygic3AtdmFsaWRhdGlvbi1lcnJvciIpOwoKICAgICAgICAgICAgdXBkYXRlSGVscGVyTG9jYXRpb25zKCk7CgogICAgICAgICAgICAvLyBVcGRhdGUgZHJhZ2dlciBiYWNrZ3JvdW5kIGNvbG9yIChncmFkaWVudHMgdGFrZSBjYXJlIG9mIHNhdHVyYXRpb24gYW5kIHZhbHVlKS4KICAgICAgICAgICAgdmFyIGZsYXRDb2xvciA9IHRpbnljb2xvci5mcm9tUmF0aW8oeyBoOiBjdXJyZW50SHVlLCBzOiAxLCB2OiAxIH0pOwogICAgICAgICAgICBkcmFnZ2VyLmNzcygiYmFja2dyb3VuZC1jb2xvciIsIGZsYXRDb2xvci50b0hleFN0cmluZygpKTsKCiAgICAgICAgICAgIC8vIEdldCBhIGZvcm1hdCB0aGF0IGFscGhhIHdpbGwgYmUgaW5jbHVkZWQgaW4gKGhleCBhbmQgbmFtZXMgaWdub3JlIGFscGhhKQogICAgICAgICAgICB2YXIgZm9ybWF0ID0gY3VycmVudFByZWZlcnJlZEZvcm1hdDsKICAgICAgICAgICAgaWYgKGN1cnJlbnRBbHBoYSA8IDEgJiYgIShjdXJyZW50QWxwaGEgPT09IDAgJiYgZm9ybWF0ID09PSAibmFtZSIpKSB7CiAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAiaGV4IiB8fCBmb3JtYXQgPT09ICJoZXgzIiB8fCBmb3JtYXQgPT09ICJoZXg2IiB8fCBmb3JtYXQgPT09ICJuYW1lIikgewogICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICJyZ2IiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVhbENvbG9yID0gZ2V0KHsgZm9ybWF0OiBmb3JtYXQgfSksCiAgICAgICAgICAgICAgICBkaXNwbGF5Q29sb3IgPSAnJzsKCiAgICAgICAgICAgICAvL3Jlc2V0IGJhY2tncm91bmQgaW5mbyBmb3IgcHJldmlldyBlbGVtZW50CiAgICAgICAgICAgIHByZXZpZXdFbGVtZW50LnJlbW92ZUNsYXNzKCJzcC1jbGVhci1kaXNwbGF5Iik7CiAgICAgICAgICAgIHByZXZpZXdFbGVtZW50LmNzcygnYmFja2dyb3VuZC1jb2xvcicsICd0cmFuc3BhcmVudCcpOwoKICAgICAgICAgICAgaWYgKCFyZWFsQ29sb3IgJiYgYWxsb3dFbXB0eSkgewogICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSByZXBsYWNlZCBlbGVtZW50cyBiYWNrZ3JvdW5kIHdpdGggaWNvbiBpbmRpY2F0aW5nIG5vIGNvbG9yIHNlbGVjdGlvbgogICAgICAgICAgICAgICAgcHJldmlld0VsZW1lbnQuYWRkQ2xhc3MoInNwLWNsZWFyLWRpc3BsYXkiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZWFsSGV4ID0gcmVhbENvbG9yLnRvSGV4U3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgcmVhbFJnYiA9IHJlYWxDb2xvci50b1JnYlN0cmluZygpOwoKICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVwbGFjZWQgZWxlbWVudHMgYmFja2dyb3VuZCBjb2xvciAod2l0aCBhY3R1YWwgc2VsZWN0ZWQgY29sb3IpCiAgICAgICAgICAgICAgICBpZiAocmdiYVN1cHBvcnQgfHwgcmVhbENvbG9yLmFscGhhID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgcHJldmlld0VsZW1lbnQuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIiwgcmVhbFJnYik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RWxlbWVudC5jc3MoImJhY2tncm91bmQtY29sb3IiLCAidHJhbnNwYXJlbnQiKTsKICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RWxlbWVudC5jc3MoImZpbHRlciIsIHJlYWxDb2xvci50b0ZpbHRlcigpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAob3B0cy5zaG93QWxwaGEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmdiID0gcmVhbENvbG9yLnRvUmdiKCk7CiAgICAgICAgICAgICAgICAgICAgcmdiLmEgPSAwOwogICAgICAgICAgICAgICAgICAgIHZhciByZWFsQWxwaGEgPSB0aW55Y29sb3IocmdiKS50b1JnYlN0cmluZygpOwogICAgICAgICAgICAgICAgICAgIHZhciBncmFkaWVudCA9ICJsaW5lYXItZ3JhZGllbnQobGVmdCwgIiArIHJlYWxBbHBoYSArICIsICIgKyByZWFsSGV4ICsgIikiOwoKICAgICAgICAgICAgICAgICAgICBpZiAoSUUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTbGlkZXJJbm5lci5jc3MoImZpbHRlciIsIHRpbnljb2xvcihyZWFsQWxwaGEpLnRvRmlsdGVyKHsgZ3JhZGllbnRUeXBlOiAxIH0sIHJlYWxIZXgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2xpZGVySW5uZXIuY3NzKCJiYWNrZ3JvdW5kIiwgIi13ZWJraXQtIiArIGdyYWRpZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTbGlkZXJJbm5lci5jc3MoImJhY2tncm91bmQiLCAiLW1vei0iICsgZ3JhZGllbnQpOwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNsaWRlcklubmVyLmNzcygiYmFja2dyb3VuZCIsICItbXMtIiArIGdyYWRpZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGN1cnJlbnQgc3ludGF4IGdyYWRpZW50IG9uIHVucHJlZml4ZWQgcHJvcGVydHkuCiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2xpZGVySW5uZXIuY3NzKCJiYWNrZ3JvdW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICIgKyByZWFsQWxwaGEgKyAiLCAiICsgcmVhbEhleCArICIpIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGRpc3BsYXlDb2xvciA9IHJlYWxDb2xvci50b1N0cmluZyhmb3JtYXQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHRleHQgZW50cnkgaW5wdXQgYXMgaXQgY2hhbmdlcyBoYXBwZW4KICAgICAgICAgICAgaWYgKG9wdHMuc2hvd0lucHV0KSB7CiAgICAgICAgICAgICAgICB0ZXh0SW5wdXQudmFsKGRpc3BsYXlDb2xvcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChvcHRzLnNob3dQYWxldHRlKSB7CiAgICAgICAgICAgICAgICBkcmF3UGFsZXR0ZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkcmF3SW5pdGlhbCgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdXBkYXRlSGVscGVyTG9jYXRpb25zKCkgewogICAgICAgICAgICB2YXIgcyA9IGN1cnJlbnRTYXR1cmF0aW9uOwogICAgICAgICAgICB2YXIgdiA9IGN1cnJlbnRWYWx1ZTsKCiAgICAgICAgICAgIGlmKGFsbG93RW1wdHkgJiYgaXNFbXB0eSkgewogICAgICAgICAgICAgICAgLy9pZiBzZWxlY3RlZCBjb2xvciBpcyBlbXB0eSwgaGlkZSB0aGUgaGVscGVycwogICAgICAgICAgICAgICAgYWxwaGFTbGlkZUhlbHBlci5oaWRlKCk7CiAgICAgICAgICAgICAgICBzbGlkZUhlbHBlci5oaWRlKCk7CiAgICAgICAgICAgICAgICBkcmFnSGVscGVyLmhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vbWFrZSBzdXJlIGhlbHBlcnMgYXJlIHZpc2libGUKICAgICAgICAgICAgICAgIGFscGhhU2xpZGVIZWxwZXIuc2hvdygpOwogICAgICAgICAgICAgICAgc2xpZGVIZWxwZXIuc2hvdygpOwogICAgICAgICAgICAgICAgZHJhZ0hlbHBlci5zaG93KCk7CgogICAgICAgICAgICAgICAgLy8gV2hlcmUgdG8gc2hvdyB0aGUgbGl0dGxlIGNpcmNsZSBpbiB0aGF0IGRpc3BsYXlzIHlvdXIgY3VycmVudCBzZWxlY3RlZCBjb2xvcgogICAgICAgICAgICAgICAgdmFyIGRyYWdYID0gcyAqIGRyYWdXaWR0aDsKICAgICAgICAgICAgICAgIHZhciBkcmFnWSA9IGRyYWdIZWlnaHQgLSAodiAqIGRyYWdIZWlnaHQpOwogICAgICAgICAgICAgICAgZHJhZ1ggPSBNYXRoLm1heCgKICAgICAgICAgICAgICAgICAgICAtZHJhZ0hlbHBlckhlaWdodCwKICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihkcmFnV2lkdGggLSBkcmFnSGVscGVySGVpZ2h0LCBkcmFnWCAtIGRyYWdIZWxwZXJIZWlnaHQpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZHJhZ1kgPSBNYXRoLm1heCgKICAgICAgICAgICAgICAgICAgICAtZHJhZ0hlbHBlckhlaWdodCwKICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihkcmFnSGVpZ2h0IC0gZHJhZ0hlbHBlckhlaWdodCwgZHJhZ1kgLSBkcmFnSGVscGVySGVpZ2h0KQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRyYWdIZWxwZXIuY3NzKHsKICAgICAgICAgICAgICAgICAgICAidG9wIjogZHJhZ1kgKyAicHgiLAogICAgICAgICAgICAgICAgICAgICJsZWZ0IjogZHJhZ1ggKyAicHgiCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB2YXIgYWxwaGFYID0gY3VycmVudEFscGhhICogYWxwaGFXaWR0aDsKICAgICAgICAgICAgICAgIGFscGhhU2xpZGVIZWxwZXIuY3NzKHsKICAgICAgICAgICAgICAgICAgICAibGVmdCI6IChhbHBoYVggLSAoYWxwaGFTbGlkZUhlbHBlcldpZHRoIC8gMikpICsgInB4IgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gV2hlcmUgdG8gc2hvdyB0aGUgYmFyIHRoYXQgZGlzcGxheXMgeW91ciBjdXJyZW50IHNlbGVjdGVkIGh1ZQogICAgICAgICAgICAgICAgdmFyIHNsaWRlWSA9IChjdXJyZW50SHVlKSAqIHNsaWRlSGVpZ2h0OwogICAgICAgICAgICAgICAgc2xpZGVIZWxwZXIuY3NzKHsKICAgICAgICAgICAgICAgICAgICAidG9wIjogKHNsaWRlWSAtIHNsaWRlSGVscGVySGVpZ2h0KSArICJweCIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB1cGRhdGVPcmlnaW5hbElucHV0KGZpcmVDYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY29sb3IgPSBnZXQoKSwKICAgICAgICAgICAgICAgIGRpc3BsYXlDb2xvciA9ICcnLAogICAgICAgICAgICAgICAgaGFzQ2hhbmdlZCA9ICF0aW55Y29sb3IuZXF1YWxzKGNvbG9yLCBjb2xvck9uU2hvdyk7CgogICAgICAgICAgICBpZiAoY29sb3IpIHsKICAgICAgICAgICAgICAgIGRpc3BsYXlDb2xvciA9IGNvbG9yLnRvU3RyaW5nKGN1cnJlbnRQcmVmZXJyZWRGb3JtYXQpOwogICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzZWxlY3Rpb24gcGFsZXR0ZSB3aXRoIHRoZSBjdXJyZW50IGNvbG9yCiAgICAgICAgICAgICAgICBhZGRDb2xvclRvU2VsZWN0aW9uUGFsZXR0ZShjb2xvcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc0lucHV0KSB7CiAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnQudmFsKGRpc3BsYXlDb2xvcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChmaXJlQ2FsbGJhY2sgJiYgaGFzQ2hhbmdlZCkgewogICAgICAgICAgICAgICAgY2FsbGJhY2tzLmNoYW5nZShjb2xvcik7CiAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnQudHJpZ2dlcignY2hhbmdlJywgWyBjb2xvciBdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVmbG93KCkgewogICAgICAgICAgICBpZiAoIXZpc2libGUpIHsKICAgICAgICAgICAgICAgIHJldHVybjsgLy8gQ2FsY3VsYXRpb25zIHdvdWxkIGJlIHVzZWxlc3MgYW5kIHdvdWxkbid0IGJlIHJlbGlhYmxlIGFueXdheXMKICAgICAgICAgICAgfQogICAgICAgICAgICBkcmFnV2lkdGggPSBkcmFnZ2VyLndpZHRoKCk7CiAgICAgICAgICAgIGRyYWdIZWlnaHQgPSBkcmFnZ2VyLmhlaWdodCgpOwogICAgICAgICAgICBkcmFnSGVscGVySGVpZ2h0ID0gZHJhZ0hlbHBlci5oZWlnaHQoKTsKICAgICAgICAgICAgc2xpZGVXaWR0aCA9IHNsaWRlci53aWR0aCgpOwogICAgICAgICAgICBzbGlkZUhlaWdodCA9IHNsaWRlci5oZWlnaHQoKTsKICAgICAgICAgICAgc2xpZGVIZWxwZXJIZWlnaHQgPSBzbGlkZUhlbHBlci5oZWlnaHQoKTsKICAgICAgICAgICAgYWxwaGFXaWR0aCA9IGFscGhhU2xpZGVyLndpZHRoKCk7CiAgICAgICAgICAgIGFscGhhU2xpZGVIZWxwZXJXaWR0aCA9IGFscGhhU2xpZGVIZWxwZXIud2lkdGgoKTsKCiAgICAgICAgICAgIGlmICghZmxhdCkgewogICAgICAgICAgICAgICAgY29udGFpbmVyLmNzcygicG9zaXRpb24iLCAiYWJzb2x1dGUiKTsKICAgICAgICAgICAgICAgIGlmIChvcHRzLm9mZnNldCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5vZmZzZXQob3B0cy5vZmZzZXQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb250YWluZXIub2Zmc2V0KGdldE9mZnNldChjb250YWluZXIsIG9mZnNldEVsZW1lbnQpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXBkYXRlSGVscGVyTG9jYXRpb25zKCk7CgogICAgICAgICAgICBpZiAob3B0cy5zaG93UGFsZXR0ZSkgewogICAgICAgICAgICAgICAgZHJhd1BhbGV0dGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYm91bmRFbGVtZW50LnRyaWdnZXIoJ3JlZmxvdy5zcGVjdHJ1bScpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZGVzdHJveSgpIHsKICAgICAgICAgICAgYm91bmRFbGVtZW50LnNob3coKTsKICAgICAgICAgICAgb2Zmc2V0RWxlbWVudC51bmJpbmQoImNsaWNrLnNwZWN0cnVtIHRvdWNoc3RhcnQuc3BlY3RydW0iKTsKICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZSgpOwogICAgICAgICAgICByZXBsYWNlci5yZW1vdmUoKTsKICAgICAgICAgICAgc3BlY3RydW1zW3NwZWN0LmlkXSA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBvcHRpb24ob3B0aW9uTmFtZSwgb3B0aW9uVmFsdWUpIHsKICAgICAgICAgICAgaWYgKG9wdGlvbk5hbWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICQuZXh0ZW5kKHt9LCBvcHRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3B0aW9uVmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG9wdHNbb3B0aW9uTmFtZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG9wdHNbb3B0aW9uTmFtZV0gPSBvcHRpb25WYWx1ZTsKCiAgICAgICAgICAgIGlmIChvcHRpb25OYW1lID09PSAicHJlZmVycmVkRm9ybWF0IikgewogICAgICAgICAgICAgICAgY3VycmVudFByZWZlcnJlZEZvcm1hdCA9IG9wdHMucHJlZmVycmVkRm9ybWF0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGx5T3B0aW9ucygpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZW5hYmxlKCkgewogICAgICAgICAgICBkaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICBib3VuZEVsZW1lbnQuYXR0cigiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIG9mZnNldEVsZW1lbnQucmVtb3ZlQ2xhc3MoInNwLWRpc2FibGVkIik7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBkaXNhYmxlKCkgewogICAgICAgICAgICBoaWRlKCk7CiAgICAgICAgICAgIGRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgYm91bmRFbGVtZW50LmF0dHIoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgIG9mZnNldEVsZW1lbnQuYWRkQ2xhc3MoInNwLWRpc2FibGVkIik7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzZXRPZmZzZXQoY29vcmQpIHsKICAgICAgICAgICAgb3B0cy5vZmZzZXQgPSBjb29yZDsKICAgICAgICAgICAgcmVmbG93KCk7CiAgICAgICAgfQoKICAgICAgICBpbml0aWFsaXplKCk7CgogICAgICAgIHZhciBzcGVjdCA9IHsKICAgICAgICAgICAgc2hvdzogc2hvdywKICAgICAgICAgICAgaGlkZTogaGlkZSwKICAgICAgICAgICAgdG9nZ2xlOiB0b2dnbGUsCiAgICAgICAgICAgIHJlZmxvdzogcmVmbG93LAogICAgICAgICAgICBvcHRpb246IG9wdGlvbiwKICAgICAgICAgICAgZW5hYmxlOiBlbmFibGUsCiAgICAgICAgICAgIGRpc2FibGU6IGRpc2FibGUsCiAgICAgICAgICAgIG9mZnNldDogc2V0T2Zmc2V0LAogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgICAgICBzZXQoYyk7CiAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGdldDogZ2V0LAogICAgICAgICAgICBkZXN0cm95OiBkZXN0cm95LAogICAgICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lcgogICAgICAgIH07CgogICAgICAgIHNwZWN0LmlkID0gc3BlY3RydW1zLnB1c2goc3BlY3QpIC0gMTsKCiAgICAgICAgcmV0dXJuIHNwZWN0OwogICAgfQoKICAgIC8qKgogICAgKiBjaGVja09mZnNldCAtIGdldCB0aGUgb2Zmc2V0IGJlbG93L2Fib3ZlIGFuZCBsZWZ0L3JpZ2h0IGVsZW1lbnQgZGVwZW5kaW5nIG9uIHNjcmVlbiBwb3NpdGlvbgogICAgKiBUaGFua3MgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkvYmxvYi9tYXN0ZXIvdWkvanF1ZXJ5LnVpLmRhdGVwaWNrZXIuanMKICAgICovCiAgICBmdW5jdGlvbiBnZXRPZmZzZXQocGlja2VyLCBpbnB1dCkgewogICAgICAgIHZhciBleHRyYVkgPSAwOwogICAgICAgIHZhciBkcFdpZHRoID0gcGlja2VyLm91dGVyV2lkdGgoKTsKICAgICAgICB2YXIgZHBIZWlnaHQgPSBwaWNrZXIub3V0ZXJIZWlnaHQoKTsKICAgICAgICB2YXIgaW5wdXRIZWlnaHQgPSBpbnB1dC5vdXRlckhlaWdodCgpOwogICAgICAgIHZhciBkb2MgPSBwaWNrZXJbMF0ub3duZXJEb2N1bWVudDsKICAgICAgICB2YXIgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7CiAgICAgICAgdmFyIHZpZXdXaWR0aCA9IGRvY0VsZW0uY2xpZW50V2lkdGggKyAkKGRvYykuc2Nyb2xsTGVmdCgpOwogICAgICAgIHZhciB2aWV3SGVpZ2h0ID0gZG9jRWxlbS5jbGllbnRIZWlnaHQgKyAkKGRvYykuc2Nyb2xsVG9wKCk7CiAgICAgICAgdmFyIG9mZnNldCA9IGlucHV0Lm9mZnNldCgpOwogICAgICAgIG9mZnNldC50b3AgKz0gaW5wdXRIZWlnaHQ7CgogICAgICAgIG9mZnNldC5sZWZ0IC09CiAgICAgICAgICAgIE1hdGgubWluKG9mZnNldC5sZWZ0LCAob2Zmc2V0LmxlZnQgKyBkcFdpZHRoID4gdmlld1dpZHRoICYmIHZpZXdXaWR0aCA+IGRwV2lkdGgpID8KICAgICAgICAgICAgTWF0aC5hYnMob2Zmc2V0LmxlZnQgKyBkcFdpZHRoIC0gdmlld1dpZHRoKSA6IDApOwoKICAgICAgICBvZmZzZXQudG9wIC09CiAgICAgICAgICAgIE1hdGgubWluKG9mZnNldC50b3AsICgob2Zmc2V0LnRvcCArIGRwSGVpZ2h0ID4gdmlld0hlaWdodCAmJiB2aWV3SGVpZ2h0ID4gZHBIZWlnaHQpID8KICAgICAgICAgICAgTWF0aC5hYnMoZHBIZWlnaHQgKyBpbnB1dEhlaWdodCAtIGV4dHJhWSkgOiBleHRyYVkpKTsKCiAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgIH0KCiAgICAvKioKICAgICogbm9vcCAtIGRvIG5vdGhpbmcKICAgICovCiAgICBmdW5jdGlvbiBub29wKCkgewoKICAgIH0KCiAgICAvKioKICAgICogc3RvcFByb3BhZ2F0aW9uIC0gbWFrZXMgdGhlIGNvZGUgb25seSBkb2luZyB0aGlzIGEgbGl0dGxlIGVhc2llciB0byByZWFkIGluIGxpbmUKICAgICovCiAgICBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oZSkgewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9CgogICAgLyoqCiAgICAqIENyZWF0ZSBhIGZ1bmN0aW9uIGJvdW5kIHRvIGEgZ2l2ZW4gb2JqZWN0CiAgICAqIFRoYW5rcyB0byB1bmRlcnNjb3JlLmpzCiAgICAqLwogICAgZnVuY3Rpb24gYmluZChmdW5jLCBvYmopIHsKICAgICAgICB2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkob2JqLCBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpKTsKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgKiBMaWdodHdlaWdodCBkcmFnIGhlbHBlci4gIEhhbmRsZXMgY29udGFpbm1lbnQgd2l0aGluIHRoZSBlbGVtZW50LCBzbyB0aGF0CiAgICAqIHdoZW4gZHJhZ2dpbmcsIHRoZSB4IGlzIHdpdGhpbiBbMCxlbGVtZW50LndpZHRoXSBhbmQgeSBpcyB3aXRoaW4gWzAsZWxlbWVudC5oZWlnaHRdCiAgICAqLwogICAgZnVuY3Rpb24gZHJhZ2dhYmxlKGVsZW1lbnQsIG9ubW92ZSwgb25zdGFydCwgb25zdG9wKSB7CiAgICAgICAgb25tb3ZlID0gb25tb3ZlIHx8IGZ1bmN0aW9uICgpIHsgfTsKICAgICAgICBvbnN0YXJ0ID0gb25zdGFydCB8fCBmdW5jdGlvbiAoKSB7IH07CiAgICAgICAgb25zdG9wID0gb25zdG9wIHx8IGZ1bmN0aW9uICgpIHsgfTsKICAgICAgICB2YXIgZG9jID0gZG9jdW1lbnQ7CiAgICAgICAgdmFyIGRyYWdnaW5nID0gZmFsc2U7CiAgICAgICAgdmFyIG9mZnNldCA9IHt9OwogICAgICAgIHZhciBtYXhIZWlnaHQgPSAwOwogICAgICAgIHZhciBtYXhXaWR0aCA9IDA7CiAgICAgICAgdmFyIGhhc1RvdWNoID0gKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyk7CgogICAgICAgIHZhciBkdXJpbmdEcmFnRXZlbnRzID0ge307CiAgICAgICAgZHVyaW5nRHJhZ0V2ZW50c1sic2VsZWN0c3RhcnQiXSA9IHByZXZlbnQ7CiAgICAgICAgZHVyaW5nRHJhZ0V2ZW50c1siZHJhZ3N0YXJ0Il0gPSBwcmV2ZW50OwogICAgICAgIGR1cmluZ0RyYWdFdmVudHNbInRvdWNobW92ZSBtb3VzZW1vdmUiXSA9IG1vdmU7CiAgICAgICAgZHVyaW5nRHJhZ0V2ZW50c1sidG91Y2hlbmQgbW91c2V1cCJdID0gc3RvcDsKCiAgICAgICAgZnVuY3Rpb24gcHJldmVudChlKSB7CiAgICAgICAgICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGUucmV0dXJuVmFsdWUgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmUoZSkgewogICAgICAgICAgICBpZiAoZHJhZ2dpbmcpIHsKICAgICAgICAgICAgICAgIC8vIE1vdXNldXAgaGFwcGVuZWQgb3V0c2lkZSBvZiB3aW5kb3cKICAgICAgICAgICAgICAgIGlmIChJRSAmJiBkb2MuZG9jdW1lbnRNb2RlIDwgOSAmJiAhZS5idXR0b24pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcCgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0MCA9IGUub3JpZ2luYWxFdmVudCAmJiBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcyAmJiBlLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXTsKICAgICAgICAgICAgICAgIHZhciBwYWdlWCA9IHQwICYmIHQwLnBhZ2VYIHx8IGUucGFnZVg7CiAgICAgICAgICAgICAgICB2YXIgcGFnZVkgPSB0MCAmJiB0MC5wYWdlWSB8fCBlLnBhZ2VZOwoKICAgICAgICAgICAgICAgIHZhciBkcmFnWCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBhZ2VYIC0gb2Zmc2V0LmxlZnQsIG1heFdpZHRoKSk7CiAgICAgICAgICAgICAgICB2YXIgZHJhZ1kgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihwYWdlWSAtIG9mZnNldC50b3AsIG1heEhlaWdodCkpOwoKICAgICAgICAgICAgICAgIGlmIChoYXNUb3VjaCkgewogICAgICAgICAgICAgICAgICAgIC8vIFN0b3Agc2Nyb2xsaW5nIGluIGlPUwogICAgICAgICAgICAgICAgICAgIHByZXZlbnQoZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgb25tb3ZlLmFwcGx5KGVsZW1lbnQsIFtkcmFnWCwgZHJhZ1ksIGVdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gc3RhcnQoZSkgewogICAgICAgICAgICB2YXIgcmlnaHRjbGljayA9IChlLndoaWNoKSA/IChlLndoaWNoID09IDMpIDogKGUuYnV0dG9uID09IDIpOwoKICAgICAgICAgICAgaWYgKCFyaWdodGNsaWNrICYmICFkcmFnZ2luZykgewogICAgICAgICAgICAgICAgaWYgKG9uc3RhcnQuYXBwbHkoZWxlbWVudCwgYXJndW1lbnRzKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICBkcmFnZ2luZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gJChlbGVtZW50KS5oZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aCA9ICQoZWxlbWVudCkud2lkdGgoKTsKICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAkKGVsZW1lbnQpLm9mZnNldCgpOwoKICAgICAgICAgICAgICAgICAgICAkKGRvYykuYmluZChkdXJpbmdEcmFnRXZlbnRzKTsKICAgICAgICAgICAgICAgICAgICAkKGRvYy5ib2R5KS5hZGRDbGFzcygic3AtZHJhZ2dpbmciKTsKCiAgICAgICAgICAgICAgICAgICAgbW92ZShlKTsKCiAgICAgICAgICAgICAgICAgICAgcHJldmVudChlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gc3RvcCgpIHsKICAgICAgICAgICAgaWYgKGRyYWdnaW5nKSB7CiAgICAgICAgICAgICAgICAkKGRvYykudW5iaW5kKGR1cmluZ0RyYWdFdmVudHMpOwogICAgICAgICAgICAgICAgJChkb2MuYm9keSkucmVtb3ZlQ2xhc3MoInNwLWRyYWdnaW5nIik7CgogICAgICAgICAgICAgICAgLy8gV2FpdCBhIHRpY2sgYmVmb3JlIG5vdGlmeWluZyBvYnNlcnZlcnMgdG8gYWxsb3cgdGhlIGNsaWNrIGV2ZW50CiAgICAgICAgICAgICAgICAvLyB0byBmaXJlIGluIENocm9tZS4KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb25zdG9wLmFwcGx5KGVsZW1lbnQsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkcmFnZ2luZyA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJChlbGVtZW50KS5iaW5kKCJ0b3VjaHN0YXJ0IG1vdXNlZG93biIsIHN0YXJ0KTsKICAgIH0KCiAgICBmdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBkZWJvdW5jZSkgewogICAgICAgIHZhciB0aW1lb3V0OwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsKICAgICAgICAgICAgdmFyIHRocm90dGxlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsOwogICAgICAgICAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKGRlYm91bmNlKSBjbGVhclRpbWVvdXQodGltZW91dCk7CiAgICAgICAgICAgIGlmIChkZWJvdW5jZSB8fCAhdGltZW91dCkgdGltZW91dCA9IHNldFRpbWVvdXQodGhyb3R0bGVyLCB3YWl0KTsKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGlucHV0VHlwZUNvbG9yU3VwcG9ydCgpIHsKICAgICAgICByZXR1cm4gJC5mbi5zcGVjdHJ1bS5pbnB1dFR5cGVDb2xvclN1cHBvcnQoKTsKICAgIH0KCiAgICAvKioKICAgICogRGVmaW5lIGEgalF1ZXJ5IHBsdWdpbgogICAgKi8KICAgIHZhciBkYXRhSUQgPSAic3BlY3RydW0uaWQiOwogICAgJC5mbi5zcGVjdHJ1bSA9IGZ1bmN0aW9uIChvcHRzLCBleHRyYSkgewoKICAgICAgICBpZiAodHlwZW9mIG9wdHMgPT0gInN0cmluZyIpIHsKCiAgICAgICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHRoaXM7CiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApOwoKICAgICAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzcGVjdCA9IHNwZWN0cnVtc1skKHRoaXMpLmRhdGEoZGF0YUlEKV07CiAgICAgICAgICAgICAgICBpZiAoc3BlY3QpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbWV0aG9kID0gc3BlY3Rbb3B0c107CiAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCAiU3BlY3RydW06IG5vIHN1Y2ggbWV0aG9kOiAnIiArIG9wdHMgKyAiJyIgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRzID09ICJnZXQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gc3BlY3QuZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdHMgPT0gImNvbnRhaW5lciIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBzcGVjdC5jb250YWluZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdHMgPT0gIm9wdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBzcGVjdC5vcHRpb24uYXBwbHkoc3BlY3QsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRzID09ICJkZXN0cm95IikgewogICAgICAgICAgICAgICAgICAgICAgICBzcGVjdC5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlRGF0YShkYXRhSUQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmFwcGx5KHNwZWN0LCBhcmdzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwogICAgICAgIH0KCiAgICAgICAgLy8gSW5pdGlhbGl6aW5nIGEgbmV3IGluc3RhbmNlIG9mIHNwZWN0cnVtCiAgICAgICAgcmV0dXJuIHRoaXMuc3BlY3RydW0oImRlc3Ryb3kiKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgb3B0cywgJCh0aGlzKS5kYXRhKCkpOwogICAgICAgICAgICB2YXIgc3BlY3QgPSBzcGVjdHJ1bSh0aGlzLCBvcHRpb25zKTsKICAgICAgICAgICAgJCh0aGlzKS5kYXRhKGRhdGFJRCwgc3BlY3QuaWQpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAkLmZuLnNwZWN0cnVtLmxvYWQgPSB0cnVlOwogICAgJC5mbi5zcGVjdHJ1bS5sb2FkT3B0cyA9IHt9OwogICAgJC5mbi5zcGVjdHJ1bS5kcmFnZ2FibGUgPSBkcmFnZ2FibGU7CiAgICAkLmZuLnNwZWN0cnVtLmRlZmF1bHRzID0gZGVmYXVsdE9wdHM7CiAgICAkLmZuLnNwZWN0cnVtLmlucHV0VHlwZUNvbG9yU3VwcG9ydCA9IGZ1bmN0aW9uIGlucHV0VHlwZUNvbG9yU3VwcG9ydCgpIHsKICAgICAgICBpZiAodHlwZW9mIGlucHV0VHlwZUNvbG9yU3VwcG9ydC5fY2FjaGVkUmVzdWx0ID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICB2YXIgY29sb3JJbnB1dCA9ICQoIjxpbnB1dCB0eXBlPSdjb2xvcicvPiIpWzBdOyAvLyBpZiBjb2xvciBlbGVtZW50IGlzIHN1cHBvcnRlZCwgdmFsdWUgd2lsbCBkZWZhdWx0IHRvIG5vdCBudWxsCiAgICAgICAgICAgIGlucHV0VHlwZUNvbG9yU3VwcG9ydC5fY2FjaGVkUmVzdWx0ID0gY29sb3JJbnB1dC50eXBlID09PSAiY29sb3IiICYmIGNvbG9ySW5wdXQudmFsdWUgIT09ICIiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaW5wdXRUeXBlQ29sb3JTdXBwb3J0Ll9jYWNoZWRSZXN1bHQ7CiAgICB9OwoKICAgICQuc3BlY3RydW0gPSB7IH07CiAgICAkLnNwZWN0cnVtLmxvY2FsaXphdGlvbiA9IHsgfTsKICAgICQuc3BlY3RydW0ucGFsZXR0ZXMgPSB7IH07CgogICAgJC5mbi5zcGVjdHJ1bS5wcm9jZXNzTmF0aXZlQ29sb3JJbnB1dHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGNvbG9ySW5wdXRzID0gJCgiaW5wdXRbdHlwZT1jb2xvcl0iKTsKICAgICAgICBpZiAoY29sb3JJbnB1dHMubGVuZ3RoICYmICFpbnB1dFR5cGVDb2xvclN1cHBvcnQoKSkgewogICAgICAgICAgICBjb2xvcklucHV0cy5zcGVjdHJ1bSh7CiAgICAgICAgICAgICAgICBwcmVmZXJyZWRGb3JtYXQ6ICJoZXg2IgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9OwoKICAgIC8vIFRpbnlDb2xvciB2MS4xLjIKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZ3JpbnMvVGlueUNvbG9yCiAgICAvLyBCcmlhbiBHcmluc3RlYWQsIE1JVCBMaWNlbnNlCgogICAgKGZ1bmN0aW9uKCkgewoKICAgIHZhciB0cmltTGVmdCA9IC9eW1xzLCNdKy8sCiAgICAgICAgdHJpbVJpZ2h0ID0gL1xzKyQvLAogICAgICAgIHRpbnlDb3VudGVyID0gMCwKICAgICAgICBtYXRoID0gTWF0aCwKICAgICAgICBtYXRoUm91bmQgPSBtYXRoLnJvdW5kLAogICAgICAgIG1hdGhNaW4gPSBtYXRoLm1pbiwKICAgICAgICBtYXRoTWF4ID0gbWF0aC5tYXgsCiAgICAgICAgbWF0aFJhbmRvbSA9IG1hdGgucmFuZG9tOwoKICAgIHZhciB0aW55Y29sb3IgPSBmdW5jdGlvbihjb2xvciwgb3B0cykgewoKICAgICAgICBjb2xvciA9IChjb2xvcikgPyBjb2xvciA6ICcnOwogICAgICAgIG9wdHMgPSBvcHRzIHx8IHsgfTsKCiAgICAgICAgLy8gSWYgaW5wdXQgaXMgYWxyZWFkeSBhIHRpbnljb2xvciwgcmV0dXJuIGl0c2VsZgogICAgICAgIGlmIChjb2xvciBpbnN0YW5jZW9mIHRpbnljb2xvcikgewogICAgICAgICAgIHJldHVybiBjb2xvcjsKICAgICAgICB9CiAgICAgICAgLy8gSWYgd2UgYXJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLCBjYWxsIHVzaW5nIG5ldyBpbnN0ZWFkCiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIHRpbnljb2xvcikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyB0aW55Y29sb3IoY29sb3IsIG9wdHMpOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJnYiA9IGlucHV0VG9SR0IoY29sb3IpOwogICAgICAgIHRoaXMuX29yaWdpbmFsSW5wdXQgPSBjb2xvciwKICAgICAgICB0aGlzLl9yID0gcmdiLnIsCiAgICAgICAgdGhpcy5fZyA9IHJnYi5nLAogICAgICAgIHRoaXMuX2IgPSByZ2IuYiwKICAgICAgICB0aGlzLl9hID0gcmdiLmEsCiAgICAgICAgdGhpcy5fcm91bmRBID0gbWF0aFJvdW5kKDEwMCp0aGlzLl9hKSAvIDEwMCwKICAgICAgICB0aGlzLl9mb3JtYXQgPSBvcHRzLmZvcm1hdCB8fCByZ2IuZm9ybWF0OwogICAgICAgIHRoaXMuX2dyYWRpZW50VHlwZSA9IG9wdHMuZ3JhZGllbnRUeXBlOwoKICAgICAgICAvLyBEb24ndCBsZXQgdGhlIHJhbmdlIG9mIFswLDI1NV0gY29tZSBiYWNrIGluIFswLDFdLgogICAgICAgIC8vIFBvdGVudGlhbGx5IGxvc2UgYSBsaXR0bGUgYml0IG9mIHByZWNpc2lvbiBoZXJlLCBidXQgd2lsbCBmaXggaXNzdWVzIHdoZXJlCiAgICAgICAgLy8gLjUgZ2V0cyBpbnRlcnByZXRlZCBhcyBoYWxmIG9mIHRoZSB0b3RhbCwgaW5zdGVhZCBvZiBoYWxmIG9mIDEKICAgICAgICAvLyBJZiBpdCB3YXMgc3VwcG9zZWQgdG8gYmUgMTI4LCB0aGlzIHdhcyBhbHJlYWR5IHRha2VuIGNhcmUgb2YgYnkgYGlucHV0VG9SZ2JgCiAgICAgICAgaWYgKHRoaXMuX3IgPCAxKSB7IHRoaXMuX3IgPSBtYXRoUm91bmQodGhpcy5fcik7IH0KICAgICAgICBpZiAodGhpcy5fZyA8IDEpIHsgdGhpcy5fZyA9IG1hdGhSb3VuZCh0aGlzLl9nKTsgfQogICAgICAgIGlmICh0aGlzLl9iIDwgMSkgeyB0aGlzLl9iID0gbWF0aFJvdW5kKHRoaXMuX2IpOyB9CgogICAgICAgIHRoaXMuX29rID0gcmdiLm9rOwogICAgICAgIHRoaXMuX3RjX2lkID0gdGlueUNvdW50ZXIrKzsKICAgIH07CgogICAgdGlueWNvbG9yLnByb3RvdHlwZSA9IHsKICAgICAgICBpc0Rhcms6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRCcmlnaHRuZXNzKCkgPCAxMjg7CiAgICAgICAgfSwKICAgICAgICBpc0xpZ2h0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzRGFyaygpOwogICAgICAgIH0sCiAgICAgICAgaXNWYWxpZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vazsKICAgICAgICB9LAogICAgICAgIGdldE9yaWdpbmFsSW5wdXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsSW5wdXQ7CiAgICAgICAgfSwKICAgICAgICBnZXRGb3JtYXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0OwogICAgICAgIH0sCiAgICAgICAgZ2V0QWxwaGE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYTsKICAgICAgICB9LAogICAgICAgIGdldEJyaWdodG5lc3M6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcmdiID0gdGhpcy50b1JnYigpOwogICAgICAgICAgICByZXR1cm4gKHJnYi5yICogMjk5ICsgcmdiLmcgKiA1ODcgKyByZ2IuYiAqIDExNCkgLyAxMDAwOwogICAgICAgIH0sCiAgICAgICAgc2V0QWxwaGE6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2EgPSBib3VuZEFscGhhKHZhbHVlKTsKICAgICAgICAgICAgdGhpcy5fcm91bmRBID0gbWF0aFJvdW5kKDEwMCp0aGlzLl9hKSAvIDEwMDsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKICAgICAgICB0b0hzdjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBoc3YgPSByZ2JUb0hzdih0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iKTsKICAgICAgICAgICAgcmV0dXJuIHsgaDogaHN2LmggKiAzNjAsIHM6IGhzdi5zLCB2OiBoc3YudiwgYTogdGhpcy5fYSB9OwogICAgICAgIH0sCiAgICAgICAgdG9Ic3ZTdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgaHN2ID0gcmdiVG9Ic3YodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYik7CiAgICAgICAgICAgIHZhciBoID0gbWF0aFJvdW5kKGhzdi5oICogMzYwKSwgcyA9IG1hdGhSb3VuZChoc3YucyAqIDEwMCksIHYgPSBtYXRoUm91bmQoaHN2LnYgKiAxMDApOwogICAgICAgICAgICByZXR1cm4gKHRoaXMuX2EgPT0gMSkgPwogICAgICAgICAgICAgICJoc3YoIiAgKyBoICsgIiwgIiArIHMgKyAiJSwgIiArIHYgKyAiJSkiIDoKICAgICAgICAgICAgICAiaHN2YSgiICsgaCArICIsICIgKyBzICsgIiUsICIgKyB2ICsgIiUsICIrIHRoaXMuX3JvdW5kQSArICIpIjsKICAgICAgICB9LAogICAgICAgIHRvSHNsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGhzbCA9IHJnYlRvSHNsKHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IpOwogICAgICAgICAgICByZXR1cm4geyBoOiBoc2wuaCAqIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sLCBhOiB0aGlzLl9hIH07CiAgICAgICAgfSwKICAgICAgICB0b0hzbFN0cmluZzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBoc2wgPSByZ2JUb0hzbCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iKTsKICAgICAgICAgICAgdmFyIGggPSBtYXRoUm91bmQoaHNsLmggKiAzNjApLCBzID0gbWF0aFJvdW5kKGhzbC5zICogMTAwKSwgbCA9IG1hdGhSb3VuZChoc2wubCAqIDEwMCk7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5fYSA9PSAxKSA/CiAgICAgICAgICAgICAgImhzbCgiICArIGggKyAiLCAiICsgcyArICIlLCAiICsgbCArICIlKSIgOgogICAgICAgICAgICAgICJoc2xhKCIgKyBoICsgIiwgIiArIHMgKyAiJSwgIiArIGwgKyAiJSwgIisgdGhpcy5fcm91bmRBICsgIikiOwogICAgICAgIH0sCiAgICAgICAgdG9IZXg6IGZ1bmN0aW9uKGFsbG93M0NoYXIpIHsKICAgICAgICAgICAgcmV0dXJuIHJnYlRvSGV4KHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IsIGFsbG93M0NoYXIpOwogICAgICAgIH0sCiAgICAgICAgdG9IZXhTdHJpbmc6IGZ1bmN0aW9uKGFsbG93M0NoYXIpIHsKICAgICAgICAgICAgcmV0dXJuICcjJyArIHRoaXMudG9IZXgoYWxsb3czQ2hhcik7CiAgICAgICAgfSwKICAgICAgICB0b0hleDg6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gcmdiYVRvSGV4KHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IsIHRoaXMuX2EpOwogICAgICAgIH0sCiAgICAgICAgdG9IZXg4U3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICcjJyArIHRoaXMudG9IZXg4KCk7CiAgICAgICAgfSwKICAgICAgICB0b1JnYjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB7IHI6IG1hdGhSb3VuZCh0aGlzLl9yKSwgZzogbWF0aFJvdW5kKHRoaXMuX2cpLCBiOiBtYXRoUm91bmQodGhpcy5fYiksIGE6IHRoaXMuX2EgfTsKICAgICAgICB9LAogICAgICAgIHRvUmdiU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9hID09IDEpID8KICAgICAgICAgICAgICAicmdiKCIgICsgbWF0aFJvdW5kKHRoaXMuX3IpICsgIiwgIiArIG1hdGhSb3VuZCh0aGlzLl9nKSArICIsICIgKyBtYXRoUm91bmQodGhpcy5fYikgKyAiKSIgOgogICAgICAgICAgICAgICJyZ2JhKCIgKyBtYXRoUm91bmQodGhpcy5fcikgKyAiLCAiICsgbWF0aFJvdW5kKHRoaXMuX2cpICsgIiwgIiArIG1hdGhSb3VuZCh0aGlzLl9iKSArICIsICIgKyB0aGlzLl9yb3VuZEEgKyAiKSI7CiAgICAgICAgfSwKICAgICAgICB0b1BlcmNlbnRhZ2VSZ2I6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4geyByOiBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9yLCAyNTUpICogMTAwKSArICIlIiwgZzogbWF0aFJvdW5kKGJvdW5kMDEodGhpcy5fZywgMjU1KSAqIDEwMCkgKyAiJSIsIGI6IG1hdGhSb3VuZChib3VuZDAxKHRoaXMuX2IsIDI1NSkgKiAxMDApICsgIiUiLCBhOiB0aGlzLl9hIH07CiAgICAgICAgfSwKICAgICAgICB0b1BlcmNlbnRhZ2VSZ2JTdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKHRoaXMuX2EgPT0gMSkgPwogICAgICAgICAgICAgICJyZ2IoIiAgKyBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9yLCAyNTUpICogMTAwKSArICIlLCAiICsgbWF0aFJvdW5kKGJvdW5kMDEodGhpcy5fZywgMjU1KSAqIDEwMCkgKyAiJSwgIiArIG1hdGhSb3VuZChib3VuZDAxKHRoaXMuX2IsIDI1NSkgKiAxMDApICsgIiUpIiA6CiAgICAgICAgICAgICAgInJnYmEoIiArIG1hdGhSb3VuZChib3VuZDAxKHRoaXMuX3IsIDI1NSkgKiAxMDApICsgIiUsICIgKyBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9nLCAyNTUpICogMTAwKSArICIlLCAiICsgbWF0aFJvdW5kKGJvdW5kMDEodGhpcy5fYiwgMjU1KSAqIDEwMCkgKyAiJSwgIiArIHRoaXMuX3JvdW5kQSArICIpIjsKICAgICAgICB9LAogICAgICAgIHRvTmFtZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gInRyYW5zcGFyZW50IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuX2EgPCAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBoZXhOYW1lc1tyZ2JUb0hleCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iLCB0cnVlKV0gfHwgZmFsc2U7CiAgICAgICAgfSwKICAgICAgICB0b0ZpbHRlcjogZnVuY3Rpb24oc2Vjb25kQ29sb3IpIHsKICAgICAgICAgICAgdmFyIGhleDhTdHJpbmcgPSAnIycgKyByZ2JhVG9IZXgodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYiwgdGhpcy5fYSk7CiAgICAgICAgICAgIHZhciBzZWNvbmRIZXg4U3RyaW5nID0gaGV4OFN0cmluZzsKICAgICAgICAgICAgdmFyIGdyYWRpZW50VHlwZSA9IHRoaXMuX2dyYWRpZW50VHlwZSA/ICJHcmFkaWVudFR5cGUgPSAxLCAiIDogIiI7CgogICAgICAgICAgICBpZiAoc2Vjb25kQ29sb3IpIHsKICAgICAgICAgICAgICAgIHZhciBzID0gdGlueWNvbG9yKHNlY29uZENvbG9yKTsKICAgICAgICAgICAgICAgIHNlY29uZEhleDhTdHJpbmcgPSBzLnRvSGV4OFN0cmluZygpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudCgiK2dyYWRpZW50VHlwZSsic3RhcnRDb2xvcnN0cj0iK2hleDhTdHJpbmcrIixlbmRDb2xvcnN0cj0iK3NlY29uZEhleDhTdHJpbmcrIikiOwogICAgICAgIH0sCiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKGZvcm1hdCkgewogICAgICAgICAgICB2YXIgZm9ybWF0U2V0ID0gISFmb3JtYXQ7CiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCB0aGlzLl9mb3JtYXQ7CgogICAgICAgICAgICB2YXIgZm9ybWF0dGVkU3RyaW5nID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBoYXNBbHBoYSA9IHRoaXMuX2EgPCAxICYmIHRoaXMuX2EgPj0gMDsKICAgICAgICAgICAgdmFyIG5lZWRzQWxwaGFGb3JtYXQgPSAhZm9ybWF0U2V0ICYmIGhhc0FscGhhICYmIChmb3JtYXQgPT09ICJoZXgiIHx8IGZvcm1hdCA9PT0gImhleDYiIHx8IGZvcm1hdCA9PT0gImhleDMiIHx8IGZvcm1hdCA9PT0gIm5hbWUiKTsKCiAgICAgICAgICAgIGlmIChuZWVkc0FscGhhRm9ybWF0KSB7CiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yICJ0cmFuc3BhcmVudCIsIGFsbCBvdGhlciBub24tYWxwaGEgZm9ybWF0cwogICAgICAgICAgICAgICAgLy8gd2lsbCByZXR1cm4gcmdiYSB3aGVuIHRoZXJlIGlzIHRyYW5zcGFyZW5jeS4KICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICJuYW1lIiAmJiB0aGlzLl9hID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9OYW1lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b1JnYlN0cmluZygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICJyZ2IiKSB7CiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvUmdiU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gInByZ2IiKSB7CiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvUGVyY2VudGFnZVJnYlN0cmluZygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICJoZXgiIHx8IGZvcm1hdCA9PT0gImhleDYiKSB7CiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSGV4U3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gImhleDMiKSB7CiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSGV4U3RyaW5nKHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICJoZXg4IikgewogICAgICAgICAgICAgICAgZm9ybWF0dGVkU3RyaW5nID0gdGhpcy50b0hleDhTdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAibmFtZSIpIHsKICAgICAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9OYW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gImhzbCIpIHsKICAgICAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9Ic2xTdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAiaHN2IikgewogICAgICAgICAgICAgICAgZm9ybWF0dGVkU3RyaW5nID0gdGhpcy50b0hzdlN0cmluZygpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZm9ybWF0dGVkU3RyaW5nIHx8IHRoaXMudG9IZXhTdHJpbmcoKTsKICAgICAgICB9LAoKICAgICAgICBfYXBwbHlNb2RpZmljYXRpb246IGZ1bmN0aW9uKGZuLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBjb2xvciA9IGZuLmFwcGx5KG51bGwsIFt0aGlzXS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmdzKSkpOwogICAgICAgICAgICB0aGlzLl9yID0gY29sb3IuX3I7CiAgICAgICAgICAgIHRoaXMuX2cgPSBjb2xvci5fZzsKICAgICAgICAgICAgdGhpcy5fYiA9IGNvbG9yLl9iOwogICAgICAgICAgICB0aGlzLnNldEFscGhhKGNvbG9yLl9hKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKICAgICAgICBsaWdodGVuOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5TW9kaWZpY2F0aW9uKGxpZ2h0ZW4sIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBicmlnaHRlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihicmlnaHRlbiwgYXJndW1lbnRzKTsKICAgICAgICB9LAogICAgICAgIGRhcmtlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihkYXJrZW4sIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBkZXNhdHVyYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5TW9kaWZpY2F0aW9uKGRlc2F0dXJhdGUsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBzYXR1cmF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihzYXR1cmF0ZSwgYXJndW1lbnRzKTsKICAgICAgICB9LAogICAgICAgIGdyZXlzY2FsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihncmV5c2NhbGUsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBzcGluOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5TW9kaWZpY2F0aW9uKHNwaW4sIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKCiAgICAgICAgX2FwcGx5Q29tYmluYXRpb246IGZ1bmN0aW9uKGZuLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShudWxsLCBbdGhpc10uY29uY2F0KFtdLnNsaWNlLmNhbGwoYXJncykpKTsKICAgICAgICB9LAogICAgICAgIGFuYWxvZ291czogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKGFuYWxvZ291cywgYXJndW1lbnRzKTsKICAgICAgICB9LAogICAgICAgIGNvbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlDb21iaW5hdGlvbihjb21wbGVtZW50LCBhcmd1bWVudHMpOwogICAgICAgIH0sCiAgICAgICAgbW9ub2Nocm9tYXRpYzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKG1vbm9jaHJvbWF0aWMsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBzcGxpdGNvbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlDb21iaW5hdGlvbihzcGxpdGNvbXBsZW1lbnQsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICB0cmlhZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKHRyaWFkLCBhcmd1bWVudHMpOwogICAgICAgIH0sCiAgICAgICAgdGV0cmFkOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5Q29tYmluYXRpb24odGV0cmFkLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgIH07CgogICAgLy8gSWYgaW5wdXQgaXMgYW4gb2JqZWN0LCBmb3JjZSAxIGludG8gIjEuMCIgdG8gaGFuZGxlIHJhdGlvcyBwcm9wZXJseQogICAgLy8gU3RyaW5nIGlucHV0IHJlcXVpcmVzICIxLjAiIGFzIGlucHV0LCBzbyAxIHdpbGwgYmUgdHJlYXRlZCBhcyAxCiAgICB0aW55Y29sb3IuZnJvbVJhdGlvID0gZnVuY3Rpb24oY29sb3IsIG9wdHMpIHsKICAgICAgICBpZiAodHlwZW9mIGNvbG9yID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHZhciBuZXdDb2xvciA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpIGluIGNvbG9yKSB7CiAgICAgICAgICAgICAgICBpZiAoY29sb3IuaGFzT3duUHJvcGVydHkoaSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gImEiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbG9yW2ldID0gY29sb3JbaV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2xvcltpXSA9IGNvbnZlcnRUb1BlcmNlbnRhZ2UoY29sb3JbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb2xvciA9IG5ld0NvbG9yOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRpbnljb2xvcihjb2xvciwgb3B0cyk7CiAgICB9OwoKICAgIC8vIEdpdmVuIGEgc3RyaW5nIG9yIG9iamVjdCwgY29udmVydCB0aGF0IGlucHV0IHRvIFJHQgogICAgLy8gUG9zc2libGUgc3RyaW5nIGlucHV0czoKICAgIC8vCiAgICAvLyAgICAgInJlZCIKICAgIC8vICAgICAiI2YwMCIgb3IgImYwMCIKICAgIC8vICAgICAiI2ZmMDAwMCIgb3IgImZmMDAwMCIKICAgIC8vICAgICAiI2ZmMDAwMDAwIiBvciAiZmYwMDAwMDAiCiAgICAvLyAgICAgInJnYiAyNTUgMCAwIiBvciAicmdiICgyNTUsIDAsIDApIgogICAgLy8gICAgICJyZ2IgMS4wIDAgMCIgb3IgInJnYiAoMSwgMCwgMCkiCiAgICAvLyAgICAgInJnYmEgKDI1NSwgMCwgMCwgMSkiIG9yICJyZ2JhIDI1NSwgMCwgMCwgMSIKICAgIC8vICAgICAicmdiYSAoMS4wLCAwLCAwLCAxKSIgb3IgInJnYmEgMS4wLCAwLCAwLCAxIgogICAgLy8gICAgICJoc2woMCwgMTAwJSwgNTAlKSIgb3IgImhzbCAwIDEwMCUgNTAlIgogICAgLy8gICAgICJoc2xhKDAsIDEwMCUsIDUwJSwgMSkiIG9yICJoc2xhIDAgMTAwJSA1MCUsIDEiCiAgICAvLyAgICAgImhzdigwLCAxMDAlLCAxMDAlKSIgb3IgImhzdiAwIDEwMCUgMTAwJSIKICAgIC8vCiAgICBmdW5jdGlvbiBpbnB1dFRvUkdCKGNvbG9yKSB7CgogICAgICAgIHZhciByZ2IgPSB7IHI6IDAsIGc6IDAsIGI6IDAgfTsKICAgICAgICB2YXIgYSA9IDE7CiAgICAgICAgdmFyIG9rID0gZmFsc2U7CiAgICAgICAgdmFyIGZvcm1hdCA9IGZhbHNlOwoKICAgICAgICBpZiAodHlwZW9mIGNvbG9yID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIGNvbG9yID0gc3RyaW5nSW5wdXRUb09iamVjdChjb2xvcik7CiAgICAgICAgfQoKICAgICAgICBpZiAodHlwZW9mIGNvbG9yID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIGlmIChjb2xvci5oYXNPd25Qcm9wZXJ0eSgiciIpICYmIGNvbG9yLmhhc093blByb3BlcnR5KCJnIikgJiYgY29sb3IuaGFzT3duUHJvcGVydHkoImIiKSkgewogICAgICAgICAgICAgICAgcmdiID0gcmdiVG9SZ2IoY29sb3IuciwgY29sb3IuZywgY29sb3IuYik7CiAgICAgICAgICAgICAgICBvayA9IHRydWU7CiAgICAgICAgICAgICAgICBmb3JtYXQgPSBTdHJpbmcoY29sb3Iucikuc3Vic3RyKC0xKSA9PT0gIiUiID8gInByZ2IiIDogInJnYiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY29sb3IuaGFzT3duUHJvcGVydHkoImgiKSAmJiBjb2xvci5oYXNPd25Qcm9wZXJ0eSgicyIpICYmIGNvbG9yLmhhc093blByb3BlcnR5KCJ2IikpIHsKICAgICAgICAgICAgICAgIGNvbG9yLnMgPSBjb252ZXJ0VG9QZXJjZW50YWdlKGNvbG9yLnMpOwogICAgICAgICAgICAgICAgY29sb3IudiA9IGNvbnZlcnRUb1BlcmNlbnRhZ2UoY29sb3Iudik7CiAgICAgICAgICAgICAgICByZ2IgPSBoc3ZUb1JnYihjb2xvci5oLCBjb2xvci5zLCBjb2xvci52KTsKICAgICAgICAgICAgICAgIG9rID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZvcm1hdCA9ICJoc3YiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGNvbG9yLmhhc093blByb3BlcnR5KCJoIikgJiYgY29sb3IuaGFzT3duUHJvcGVydHkoInMiKSAmJiBjb2xvci5oYXNPd25Qcm9wZXJ0eSgibCIpKSB7CiAgICAgICAgICAgICAgICBjb2xvci5zID0gY29udmVydFRvUGVyY2VudGFnZShjb2xvci5zKTsKICAgICAgICAgICAgICAgIGNvbG9yLmwgPSBjb252ZXJ0VG9QZXJjZW50YWdlKGNvbG9yLmwpOwogICAgICAgICAgICAgICAgcmdiID0gaHNsVG9SZ2IoY29sb3IuaCwgY29sb3IucywgY29sb3IubCk7CiAgICAgICAgICAgICAgICBvayA9IHRydWU7CiAgICAgICAgICAgICAgICBmb3JtYXQgPSAiaHNsIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGNvbG9yLmhhc093blByb3BlcnR5KCJhIikpIHsKICAgICAgICAgICAgICAgIGEgPSBjb2xvci5hOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBhID0gYm91bmRBbHBoYShhKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgb2s6IG9rLAogICAgICAgICAgICBmb3JtYXQ6IGNvbG9yLmZvcm1hdCB8fCBmb3JtYXQsCiAgICAgICAgICAgIHI6IG1hdGhNaW4oMjU1LCBtYXRoTWF4KHJnYi5yLCAwKSksCiAgICAgICAgICAgIGc6IG1hdGhNaW4oMjU1LCBtYXRoTWF4KHJnYi5nLCAwKSksCiAgICAgICAgICAgIGI6IG1hdGhNaW4oMjU1LCBtYXRoTWF4KHJnYi5iLCAwKSksCiAgICAgICAgICAgIGE6IGEKICAgICAgICB9OwogICAgfQoKCiAgICAvLyBDb252ZXJzaW9uIEZ1bmN0aW9ucwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvLyBgcmdiVG9Ic2xgLCBgcmdiVG9Ic3ZgLCBgaHNsVG9SZ2JgLCBgaHN2VG9SZ2JgIG1vZGlmaWVkIGZyb206CiAgICAvLyA8aHR0cDovL21qaWphY2tzb24uY29tLzIwMDgvMDIvcmdiLXRvLWhzbC1hbmQtcmdiLXRvLWhzdi1jb2xvci1tb2RlbC1jb252ZXJzaW9uLWFsZ29yaXRobXMtaW4tamF2YXNjcmlwdD4KCiAgICAvLyBgcmdiVG9SZ2JgCiAgICAvLyBIYW5kbGUgYm91bmRzIC8gcGVyY2VudGFnZSBjaGVja2luZyB0byBjb25mb3JtIHRvIENTUyBjb2xvciBzcGVjCiAgICAvLyA8aHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1jb2xvci8+CiAgICAvLyAqQXNzdW1lczoqIHIsIGcsIGIgaW4gWzAsIDI1NV0gb3IgWzAsIDFdCiAgICAvLyAqUmV0dXJuczoqIHsgciwgZywgYiB9IGluIFswLCAyNTVdCiAgICBmdW5jdGlvbiByZ2JUb1JnYihyLCBnLCBiKXsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICByOiBib3VuZDAxKHIsIDI1NSkgKiAyNTUsCiAgICAgICAgICAgIGc6IGJvdW5kMDEoZywgMjU1KSAqIDI1NSwKICAgICAgICAgICAgYjogYm91bmQwMShiLCAyNTUpICogMjU1CiAgICAgICAgfTsKICAgIH0KCiAgICAvLyBgcmdiVG9Ic2xgCiAgICAvLyBDb252ZXJ0cyBhbiBSR0IgY29sb3IgdmFsdWUgdG8gSFNMLgogICAgLy8gKkFzc3VtZXM6KiByLCBnLCBhbmQgYiBhcmUgY29udGFpbmVkIGluIFswLCAyNTVdIG9yIFswLCAxXQogICAgLy8gKlJldHVybnM6KiB7IGgsIHMsIGwgfSBpbiBbMCwxXQogICAgZnVuY3Rpb24gcmdiVG9Ic2wociwgZywgYikgewoKICAgICAgICByID0gYm91bmQwMShyLCAyNTUpOwogICAgICAgIGcgPSBib3VuZDAxKGcsIDI1NSk7CiAgICAgICAgYiA9IGJvdW5kMDEoYiwgMjU1KTsKCiAgICAgICAgdmFyIG1heCA9IG1hdGhNYXgociwgZywgYiksIG1pbiA9IG1hdGhNaW4ociwgZywgYik7CiAgICAgICAgdmFyIGgsIHMsIGwgPSAobWF4ICsgbWluKSAvIDI7CgogICAgICAgIGlmKG1heCA9PSBtaW4pIHsKICAgICAgICAgICAgaCA9IHMgPSAwOyAvLyBhY2hyb21hdGljCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgZCA9IG1heCAtIG1pbjsKICAgICAgICAgICAgcyA9IGwgPiAwLjUgPyBkIC8gKDIgLSBtYXggLSBtaW4pIDogZCAvIChtYXggKyBtaW4pOwogICAgICAgICAgICBzd2l0Y2gobWF4KSB7CiAgICAgICAgICAgICAgICBjYXNlIHI6IGggPSAoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIGc6IGggPSAoYiAtIHIpIC8gZCArIDI7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBiOiBoID0gKHIgLSBnKSAvIGQgKyA0OyBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaCAvPSA2OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHsgaDogaCwgczogcywgbDogbCB9OwogICAgfQoKICAgIC8vIGBoc2xUb1JnYmAKICAgIC8vIENvbnZlcnRzIGFuIEhTTCBjb2xvciB2YWx1ZSB0byBSR0IuCiAgICAvLyAqQXNzdW1lczoqIGggaXMgY29udGFpbmVkIGluIFswLCAxXSBvciBbMCwgMzYwXSBhbmQgcyBhbmQgbCBhcmUgY29udGFpbmVkIFswLCAxXSBvciBbMCwgMTAwXQogICAgLy8gKlJldHVybnM6KiB7IHIsIGcsIGIgfSBpbiB0aGUgc2V0IFswLCAyNTVdCiAgICBmdW5jdGlvbiBoc2xUb1JnYihoLCBzLCBsKSB7CiAgICAgICAgdmFyIHIsIGcsIGI7CgogICAgICAgIGggPSBib3VuZDAxKGgsIDM2MCk7CiAgICAgICAgcyA9IGJvdW5kMDEocywgMTAwKTsKICAgICAgICBsID0gYm91bmQwMShsLCAxMDApOwoKICAgICAgICBmdW5jdGlvbiBodWUycmdiKHAsIHEsIHQpIHsKICAgICAgICAgICAgaWYodCA8IDApIHQgKz0gMTsKICAgICAgICAgICAgaWYodCA+IDEpIHQgLT0gMTsKICAgICAgICAgICAgaWYodCA8IDEvNikgcmV0dXJuIHAgKyAocSAtIHApICogNiAqIHQ7CiAgICAgICAgICAgIGlmKHQgPCAxLzIpIHJldHVybiBxOwogICAgICAgICAgICBpZih0IDwgMi8zKSByZXR1cm4gcCArIChxIC0gcCkgKiAoMi8zIC0gdCkgKiA2OwogICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICB9CgogICAgICAgIGlmKHMgPT09IDApIHsKICAgICAgICAgICAgciA9IGcgPSBiID0gbDsgLy8gYWNocm9tYXRpYwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIHEgPSBsIDwgMC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzOwogICAgICAgICAgICB2YXIgcCA9IDIgKiBsIC0gcTsKICAgICAgICAgICAgciA9IGh1ZTJyZ2IocCwgcSwgaCArIDEvMyk7CiAgICAgICAgICAgIGcgPSBodWUycmdiKHAsIHEsIGgpOwogICAgICAgICAgICBiID0gaHVlMnJnYihwLCBxLCBoIC0gMS8zKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB7IHI6IHIgKiAyNTUsIGc6IGcgKiAyNTUsIGI6IGIgKiAyNTUgfTsKICAgIH0KCiAgICAvLyBgcmdiVG9Ic3ZgCiAgICAvLyBDb252ZXJ0cyBhbiBSR0IgY29sb3IgdmFsdWUgdG8gSFNWCiAgICAvLyAqQXNzdW1lczoqIHIsIGcsIGFuZCBiIGFyZSBjb250YWluZWQgaW4gdGhlIHNldCBbMCwgMjU1XSBvciBbMCwgMV0KICAgIC8vICpSZXR1cm5zOiogeyBoLCBzLCB2IH0gaW4gWzAsMV0KICAgIGZ1bmN0aW9uIHJnYlRvSHN2KHIsIGcsIGIpIHsKCiAgICAgICAgciA9IGJvdW5kMDEociwgMjU1KTsKICAgICAgICBnID0gYm91bmQwMShnLCAyNTUpOwogICAgICAgIGIgPSBib3VuZDAxKGIsIDI1NSk7CgogICAgICAgIHZhciBtYXggPSBtYXRoTWF4KHIsIGcsIGIpLCBtaW4gPSBtYXRoTWluKHIsIGcsIGIpOwogICAgICAgIHZhciBoLCBzLCB2ID0gbWF4OwoKICAgICAgICB2YXIgZCA9IG1heCAtIG1pbjsKICAgICAgICBzID0gbWF4ID09PSAwID8gMCA6IGQgLyBtYXg7CgogICAgICAgIGlmKG1heCA9PSBtaW4pIHsKICAgICAgICAgICAgaCA9IDA7IC8vIGFjaHJvbWF0aWMKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHN3aXRjaChtYXgpIHsKICAgICAgICAgICAgICAgIGNhc2UgcjogaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgZzogaCA9IChiIC0gcikgLyBkICsgMjsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIGI6IGggPSAociAtIGcpIC8gZCArIDQ7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGggLz0gNjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgaDogaCwgczogcywgdjogdiB9OwogICAgfQoKICAgIC8vIGBoc3ZUb1JnYmAKICAgIC8vIENvbnZlcnRzIGFuIEhTViBjb2xvciB2YWx1ZSB0byBSR0IuCiAgICAvLyAqQXNzdW1lczoqIGggaXMgY29udGFpbmVkIGluIFswLCAxXSBvciBbMCwgMzYwXSBhbmQgcyBhbmQgdiBhcmUgY29udGFpbmVkIGluIFswLCAxXSBvciBbMCwgMTAwXQogICAgLy8gKlJldHVybnM6KiB7IHIsIGcsIGIgfSBpbiB0aGUgc2V0IFswLCAyNTVdCiAgICAgZnVuY3Rpb24gaHN2VG9SZ2IoaCwgcywgdikgewoKICAgICAgICBoID0gYm91bmQwMShoLCAzNjApICogNjsKICAgICAgICBzID0gYm91bmQwMShzLCAxMDApOwogICAgICAgIHYgPSBib3VuZDAxKHYsIDEwMCk7CgogICAgICAgIHZhciBpID0gbWF0aC5mbG9vcihoKSwKICAgICAgICAgICAgZiA9IGggLSBpLAogICAgICAgICAgICBwID0gdiAqICgxIC0gcyksCiAgICAgICAgICAgIHEgPSB2ICogKDEgLSBmICogcyksCiAgICAgICAgICAgIHQgPSB2ICogKDEgLSAoMSAtIGYpICogcyksCiAgICAgICAgICAgIG1vZCA9IGkgJSA2LAogICAgICAgICAgICByID0gW3YsIHEsIHAsIHAsIHQsIHZdW21vZF0sCiAgICAgICAgICAgIGcgPSBbdCwgdiwgdiwgcSwgcCwgcF1bbW9kXSwKICAgICAgICAgICAgYiA9IFtwLCBwLCB0LCB2LCB2LCBxXVttb2RdOwoKICAgICAgICByZXR1cm4geyByOiByICogMjU1LCBnOiBnICogMjU1LCBiOiBiICogMjU1IH07CiAgICB9CgogICAgLy8gYHJnYlRvSGV4YAogICAgLy8gQ29udmVydHMgYW4gUkdCIGNvbG9yIHRvIGhleAogICAgLy8gQXNzdW1lcyByLCBnLCBhbmQgYiBhcmUgY29udGFpbmVkIGluIHRoZSBzZXQgWzAsIDI1NV0KICAgIC8vIFJldHVybnMgYSAzIG9yIDYgY2hhcmFjdGVyIGhleAogICAgZnVuY3Rpb24gcmdiVG9IZXgociwgZywgYiwgYWxsb3czQ2hhcikgewoKICAgICAgICB2YXIgaGV4ID0gWwogICAgICAgICAgICBwYWQyKG1hdGhSb3VuZChyKS50b1N0cmluZygxNikpLAogICAgICAgICAgICBwYWQyKG1hdGhSb3VuZChnKS50b1N0cmluZygxNikpLAogICAgICAgICAgICBwYWQyKG1hdGhSb3VuZChiKS50b1N0cmluZygxNikpCiAgICAgICAgXTsKCiAgICAgICAgLy8gUmV0dXJuIGEgMyBjaGFyYWN0ZXIgaGV4IGlmIHBvc3NpYmxlCiAgICAgICAgaWYgKGFsbG93M0NoYXIgJiYgaGV4WzBdLmNoYXJBdCgwKSA9PSBoZXhbMF0uY2hhckF0KDEpICYmIGhleFsxXS5jaGFyQXQoMCkgPT0gaGV4WzFdLmNoYXJBdCgxKSAmJiBoZXhbMl0uY2hhckF0KDApID09IGhleFsyXS5jaGFyQXQoMSkpIHsKICAgICAgICAgICAgcmV0dXJuIGhleFswXS5jaGFyQXQoMCkgKyBoZXhbMV0uY2hhckF0KDApICsgaGV4WzJdLmNoYXJBdCgwKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBoZXguam9pbigiIik7CiAgICB9CiAgICAgICAgLy8gYHJnYmFUb0hleGAKICAgICAgICAvLyBDb252ZXJ0cyBhbiBSR0JBIGNvbG9yIHBsdXMgYWxwaGEgdHJhbnNwYXJlbmN5IHRvIGhleAogICAgICAgIC8vIEFzc3VtZXMgciwgZywgYiBhbmQgYSBhcmUgY29udGFpbmVkIGluIHRoZSBzZXQgWzAsIDI1NV0KICAgICAgICAvLyBSZXR1cm5zIGFuIDggY2hhcmFjdGVyIGhleAogICAgICAgIGZ1bmN0aW9uIHJnYmFUb0hleChyLCBnLCBiLCBhKSB7CgogICAgICAgICAgICB2YXIgaGV4ID0gWwogICAgICAgICAgICAgICAgcGFkMihjb252ZXJ0RGVjaW1hbFRvSGV4KGEpKSwKICAgICAgICAgICAgICAgIHBhZDIobWF0aFJvdW5kKHIpLnRvU3RyaW5nKDE2KSksCiAgICAgICAgICAgICAgICBwYWQyKG1hdGhSb3VuZChnKS50b1N0cmluZygxNikpLAogICAgICAgICAgICAgICAgcGFkMihtYXRoUm91bmQoYikudG9TdHJpbmcoMTYpKQogICAgICAgICAgICBdOwoKICAgICAgICAgICAgcmV0dXJuIGhleC5qb2luKCIiKTsKICAgICAgICB9CgogICAgLy8gYGVxdWFsc2AKICAgIC8vIENhbiBiZSBjYWxsZWQgd2l0aCBhbnkgdGlueWNvbG9yIGlucHV0CiAgICB0aW55Y29sb3IuZXF1YWxzID0gZnVuY3Rpb24gKGNvbG9yMSwgY29sb3IyKSB7CiAgICAgICAgaWYgKCFjb2xvcjEgfHwgIWNvbG9yMikgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICByZXR1cm4gdGlueWNvbG9yKGNvbG9yMSkudG9SZ2JTdHJpbmcoKSA9PSB0aW55Y29sb3IoY29sb3IyKS50b1JnYlN0cmluZygpOwogICAgfTsKICAgIHRpbnljb2xvci5yYW5kb20gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGlueWNvbG9yLmZyb21SYXRpbyh7CiAgICAgICAgICAgIHI6IG1hdGhSYW5kb20oKSwKICAgICAgICAgICAgZzogbWF0aFJhbmRvbSgpLAogICAgICAgICAgICBiOiBtYXRoUmFuZG9tKCkKICAgICAgICB9KTsKICAgIH07CgoKICAgIC8vIE1vZGlmaWNhdGlvbiBGdW5jdGlvbnMKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIFRoYW5rcyB0byBsZXNzLmpzIGZvciBzb21lIG9mIHRoZSBiYXNpY3MgaGVyZQogICAgLy8gPGh0dHBzOi8vZ2l0aHViLmNvbS9jbG91ZGhlYWQvbGVzcy5qcy9ibG9iL21hc3Rlci9saWIvbGVzcy9mdW5jdGlvbnMuanM+CgogICAgZnVuY3Rpb24gZGVzYXR1cmF0ZShjb2xvciwgYW1vdW50KSB7CiAgICAgICAgYW1vdW50ID0gKGFtb3VudCA9PT0gMCkgPyAwIDogKGFtb3VudCB8fCAxMCk7CiAgICAgICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTsKICAgICAgICBoc2wucyAtPSBhbW91bnQgLyAxMDA7CiAgICAgICAgaHNsLnMgPSBjbGFtcDAxKGhzbC5zKTsKICAgICAgICByZXR1cm4gdGlueWNvbG9yKGhzbCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2F0dXJhdGUoY29sb3IsIGFtb3VudCkgewogICAgICAgIGFtb3VudCA9IChhbW91bnQgPT09IDApID8gMCA6IChhbW91bnQgfHwgMTApOwogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgaHNsLnMgKz0gYW1vdW50IC8gMTAwOwogICAgICAgIGhzbC5zID0gY2xhbXAwMShoc2wucyk7CiAgICAgICAgcmV0dXJuIHRpbnljb2xvcihoc2wpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdyZXlzY2FsZShjb2xvcikgewogICAgICAgIHJldHVybiB0aW55Y29sb3IoY29sb3IpLmRlc2F0dXJhdGUoMTAwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaWdodGVuIChjb2xvciwgYW1vdW50KSB7CiAgICAgICAgYW1vdW50ID0gKGFtb3VudCA9PT0gMCkgPyAwIDogKGFtb3VudCB8fCAxMCk7CiAgICAgICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTsKICAgICAgICBoc2wubCArPSBhbW91bnQgLyAxMDA7CiAgICAgICAgaHNsLmwgPSBjbGFtcDAxKGhzbC5sKTsKICAgICAgICByZXR1cm4gdGlueWNvbG9yKGhzbCk7CiAgICB9CgogICAgZnVuY3Rpb24gYnJpZ2h0ZW4oY29sb3IsIGFtb3VudCkgewogICAgICAgIGFtb3VudCA9IChhbW91bnQgPT09IDApID8gMCA6IChhbW91bnQgfHwgMTApOwogICAgICAgIHZhciByZ2IgPSB0aW55Y29sb3IoY29sb3IpLnRvUmdiKCk7CiAgICAgICAgcmdiLnIgPSBtYXRoTWF4KDAsIG1hdGhNaW4oMjU1LCByZ2IuciAtIG1hdGhSb3VuZCgyNTUgKiAtIChhbW91bnQgLyAxMDApKSkpOwogICAgICAgIHJnYi5nID0gbWF0aE1heCgwLCBtYXRoTWluKDI1NSwgcmdiLmcgLSBtYXRoUm91bmQoMjU1ICogLSAoYW1vdW50IC8gMTAwKSkpKTsKICAgICAgICByZ2IuYiA9IG1hdGhNYXgoMCwgbWF0aE1pbigyNTUsIHJnYi5iIC0gbWF0aFJvdW5kKDI1NSAqIC0gKGFtb3VudCAvIDEwMCkpKSk7CiAgICAgICAgcmV0dXJuIHRpbnljb2xvcihyZ2IpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRhcmtlbiAoY29sb3IsIGFtb3VudCkgewogICAgICAgIGFtb3VudCA9IChhbW91bnQgPT09IDApID8gMCA6IChhbW91bnQgfHwgMTApOwogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgaHNsLmwgLT0gYW1vdW50IC8gMTAwOwogICAgICAgIGhzbC5sID0gY2xhbXAwMShoc2wubCk7CiAgICAgICAgcmV0dXJuIHRpbnljb2xvcihoc2wpOwogICAgfQoKICAgIC8vIFNwaW4gdGFrZXMgYSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBhbW91bnQgd2l0aGluIFstMzYwLCAzNjBdIGluZGljYXRpbmcgdGhlIGNoYW5nZSBvZiBodWUuCiAgICAvLyBWYWx1ZXMgb3V0c2lkZSBvZiB0aGlzIHJhbmdlIHdpbGwgYmUgd3JhcHBlZCBpbnRvIHRoaXMgcmFuZ2UuCiAgICBmdW5jdGlvbiBzcGluKGNvbG9yLCBhbW91bnQpIHsKICAgICAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpOwogICAgICAgIHZhciBodWUgPSAobWF0aFJvdW5kKGhzbC5oKSArIGFtb3VudCkgJSAzNjA7CiAgICAgICAgaHNsLmggPSBodWUgPCAwID8gMzYwICsgaHVlIDogaHVlOwogICAgICAgIHJldHVybiB0aW55Y29sb3IoaHNsKTsKICAgIH0KCiAgICAvLyBDb21iaW5hdGlvbiBGdW5jdGlvbnMKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gVGhhbmtzIHRvIGpRdWVyeSB4Q29sb3IgZm9yIHNvbWUgb2YgdGhlIGlkZWFzIGJlaGluZCB0aGVzZQogICAgLy8gPGh0dHBzOi8vZ2l0aHViLmNvbS9pbmZ1c2lvbi9qUXVlcnkteGNvbG9yL2Jsb2IvbWFzdGVyL2pxdWVyeS54Y29sb3IuanM+CgogICAgZnVuY3Rpb24gY29tcGxlbWVudChjb2xvcikgewogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgaHNsLmggPSAoaHNsLmggKyAxODApICUgMzYwOwogICAgICAgIHJldHVybiB0aW55Y29sb3IoaHNsKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmlhZChjb2xvcikgewogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgdmFyIGggPSBoc2wuaDsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICB0aW55Y29sb3IoY29sb3IpLAogICAgICAgICAgICB0aW55Y29sb3IoeyBoOiAoaCArIDEyMCkgJSAzNjAsIHM6IGhzbC5zLCBsOiBoc2wubCB9KSwKICAgICAgICAgICAgdGlueWNvbG9yKHsgaDogKGggKyAyNDApICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmwgfSkKICAgICAgICBdOwogICAgfQoKICAgIGZ1bmN0aW9uIHRldHJhZChjb2xvcikgewogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgdmFyIGggPSBoc2wuaDsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICB0aW55Y29sb3IoY29sb3IpLAogICAgICAgICAgICB0aW55Y29sb3IoeyBoOiAoaCArIDkwKSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sIH0pLAogICAgICAgICAgICB0aW55Y29sb3IoeyBoOiAoaCArIDE4MCkgJSAzNjAsIHM6IGhzbC5zLCBsOiBoc2wubCB9KSwKICAgICAgICAgICAgdGlueWNvbG9yKHsgaDogKGggKyAyNzApICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmwgfSkKICAgICAgICBdOwogICAgfQoKICAgIGZ1bmN0aW9uIHNwbGl0Y29tcGxlbWVudChjb2xvcikgewogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgdmFyIGggPSBoc2wuaDsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICB0aW55Y29sb3IoY29sb3IpLAogICAgICAgICAgICB0aW55Y29sb3IoeyBoOiAoaCArIDcyKSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sfSksCiAgICAgICAgICAgIHRpbnljb2xvcih7IGg6IChoICsgMjE2KSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sfSkKICAgICAgICBdOwogICAgfQoKICAgIGZ1bmN0aW9uIGFuYWxvZ291cyhjb2xvciwgcmVzdWx0cywgc2xpY2VzKSB7CiAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMgfHwgNjsKICAgICAgICBzbGljZXMgPSBzbGljZXMgfHwgMzA7CgogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgdmFyIHBhcnQgPSAzNjAgLyBzbGljZXM7CiAgICAgICAgdmFyIHJldCA9IFt0aW55Y29sb3IoY29sb3IpXTsKCiAgICAgICAgZm9yIChoc2wuaCA9ICgoaHNsLmggLSAocGFydCAqIHJlc3VsdHMgPj4gMSkpICsgNzIwKSAlIDM2MDsgLS1yZXN1bHRzOyApIHsKICAgICAgICAgICAgaHNsLmggPSAoaHNsLmggKyBwYXJ0KSAlIDM2MDsKICAgICAgICAgICAgcmV0LnB1c2godGlueWNvbG9yKGhzbCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIGZ1bmN0aW9uIG1vbm9jaHJvbWF0aWMoY29sb3IsIHJlc3VsdHMpIHsKICAgICAgICByZXN1bHRzID0gcmVzdWx0cyB8fCA2OwogICAgICAgIHZhciBoc3YgPSB0aW55Y29sb3IoY29sb3IpLnRvSHN2KCk7CiAgICAgICAgdmFyIGggPSBoc3YuaCwgcyA9IGhzdi5zLCB2ID0gaHN2LnY7CiAgICAgICAgdmFyIHJldCA9IFtdOwogICAgICAgIHZhciBtb2RpZmljYXRpb24gPSAxIC8gcmVzdWx0czsKCiAgICAgICAgd2hpbGUgKHJlc3VsdHMtLSkgewogICAgICAgICAgICByZXQucHVzaCh0aW55Y29sb3IoeyBoOiBoLCBzOiBzLCB2OiB2fSkpOwogICAgICAgICAgICB2ID0gKHYgKyBtb2RpZmljYXRpb24pICUgMTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXQ7CiAgICB9CgogICAgLy8gVXRpbGl0eSBGdW5jdGlvbnMKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIHRpbnljb2xvci5taXggPSBmdW5jdGlvbihjb2xvcjEsIGNvbG9yMiwgYW1vdW50KSB7CiAgICAgICAgYW1vdW50ID0gKGFtb3VudCA9PT0gMCkgPyAwIDogKGFtb3VudCB8fCA1MCk7CgogICAgICAgIHZhciByZ2IxID0gdGlueWNvbG9yKGNvbG9yMSkudG9SZ2IoKTsKICAgICAgICB2YXIgcmdiMiA9IHRpbnljb2xvcihjb2xvcjIpLnRvUmdiKCk7CgogICAgICAgIHZhciBwID0gYW1vdW50IC8gMTAwOwogICAgICAgIHZhciB3ID0gcCAqIDIgLSAxOwogICAgICAgIHZhciBhID0gcmdiMi5hIC0gcmdiMS5hOwoKICAgICAgICB2YXIgdzE7CgogICAgICAgIGlmICh3ICogYSA9PSAtMSkgewogICAgICAgICAgICB3MSA9IHc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdzEgPSAodyArIGEpIC8gKDEgKyB3ICogYSk7CiAgICAgICAgfQoKICAgICAgICB3MSA9ICh3MSArIDEpIC8gMjsKCiAgICAgICAgdmFyIHcyID0gMSAtIHcxOwoKICAgICAgICB2YXIgcmdiYSA9IHsKICAgICAgICAgICAgcjogcmdiMi5yICogdzEgKyByZ2IxLnIgKiB3MiwKICAgICAgICAgICAgZzogcmdiMi5nICogdzEgKyByZ2IxLmcgKiB3MiwKICAgICAgICAgICAgYjogcmdiMi5iICogdzEgKyByZ2IxLmIgKiB3MiwKICAgICAgICAgICAgYTogcmdiMi5hICogcCAgKyByZ2IxLmEgKiAoMSAtIHApCiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIHRpbnljb2xvcihyZ2JhKTsKICAgIH07CgoKICAgIC8vIFJlYWRhYmlsaXR5IEZ1bmN0aW9ucwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyA8aHR0cDovL3d3dy53My5vcmcvVFIvQUVSVCNjb2xvci1jb250cmFzdD4KCiAgICAvLyBgcmVhZGFiaWxpdHlgCiAgICAvLyBBbmFseXplIHRoZSAyIGNvbG9ycyBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CiAgICAvLyAgICBgYnJpZ2h0bmVzc2A6IGRpZmZlcmVuY2UgaW4gYnJpZ2h0bmVzcyBiZXR3ZWVuIHRoZSB0d28gY29sb3JzCiAgICAvLyAgICBgY29sb3JgOiBkaWZmZXJlbmNlIGluIGNvbG9yL2h1ZSBiZXR3ZWVuIHRoZSB0d28gY29sb3JzCiAgICB0aW55Y29sb3IucmVhZGFiaWxpdHkgPSBmdW5jdGlvbihjb2xvcjEsIGNvbG9yMikgewogICAgICAgIHZhciBjMSA9IHRpbnljb2xvcihjb2xvcjEpOwogICAgICAgIHZhciBjMiA9IHRpbnljb2xvcihjb2xvcjIpOwogICAgICAgIHZhciByZ2IxID0gYzEudG9SZ2IoKTsKICAgICAgICB2YXIgcmdiMiA9IGMyLnRvUmdiKCk7CiAgICAgICAgdmFyIGJyaWdodG5lc3NBID0gYzEuZ2V0QnJpZ2h0bmVzcygpOwogICAgICAgIHZhciBicmlnaHRuZXNzQiA9IGMyLmdldEJyaWdodG5lc3MoKTsKICAgICAgICB2YXIgY29sb3JEaWZmID0gKAogICAgICAgICAgICBNYXRoLm1heChyZ2IxLnIsIHJnYjIucikgLSBNYXRoLm1pbihyZ2IxLnIsIHJnYjIucikgKwogICAgICAgICAgICBNYXRoLm1heChyZ2IxLmcsIHJnYjIuZykgLSBNYXRoLm1pbihyZ2IxLmcsIHJnYjIuZykgKwogICAgICAgICAgICBNYXRoLm1heChyZ2IxLmIsIHJnYjIuYikgLSBNYXRoLm1pbihyZ2IxLmIsIHJnYjIuYikKICAgICAgICApOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBicmlnaHRuZXNzOiBNYXRoLmFicyhicmlnaHRuZXNzQSAtIGJyaWdodG5lc3NCKSwKICAgICAgICAgICAgY29sb3I6IGNvbG9yRGlmZgogICAgICAgIH07CiAgICB9OwoKICAgIC8vIGByZWFkYWJsZWAKICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0FFUlQjY29sb3ItY29udHJhc3QKICAgIC8vIEVuc3VyZSB0aGF0IGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3IgY29tYmluYXRpb25zIHByb3ZpZGUgc3VmZmljaWVudCBjb250cmFzdC4KICAgIC8vICpFeGFtcGxlKgogICAgLy8gICAgdGlueWNvbG9yLmlzUmVhZGFibGUoIiMwMDAiLCAiIzExMSIpID0+IGZhbHNlCiAgICB0aW55Y29sb3IuaXNSZWFkYWJsZSA9IGZ1bmN0aW9uKGNvbG9yMSwgY29sb3IyKSB7CiAgICAgICAgdmFyIHJlYWRhYmlsaXR5ID0gdGlueWNvbG9yLnJlYWRhYmlsaXR5KGNvbG9yMSwgY29sb3IyKTsKICAgICAgICByZXR1cm4gcmVhZGFiaWxpdHkuYnJpZ2h0bmVzcyA+IDEyNSAmJiByZWFkYWJpbGl0eS5jb2xvciA+IDUwMDsKICAgIH07CgogICAgLy8gYG1vc3RSZWFkYWJsZWAKICAgIC8vIEdpdmVuIGEgYmFzZSBjb2xvciBhbmQgYSBsaXN0IG9mIHBvc3NpYmxlIGZvcmVncm91bmQgb3IgYmFja2dyb3VuZAogICAgLy8gY29sb3JzIGZvciB0aGF0IGJhc2UsIHJldHVybnMgdGhlIG1vc3QgcmVhZGFibGUgY29sb3IuCiAgICAvLyAqRXhhbXBsZSoKICAgIC8vICAgIHRpbnljb2xvci5tb3N0UmVhZGFibGUoIiMxMjMiLCBbIiNmZmYiLCAiIzAwMCJdKSA9PiAiIzAwMCIKICAgIHRpbnljb2xvci5tb3N0UmVhZGFibGUgPSBmdW5jdGlvbihiYXNlQ29sb3IsIGNvbG9yTGlzdCkgewogICAgICAgIHZhciBiZXN0Q29sb3IgPSBudWxsOwogICAgICAgIHZhciBiZXN0U2NvcmUgPSAwOwogICAgICAgIHZhciBiZXN0SXNSZWFkYWJsZSA9IGZhbHNlOwogICAgICAgIGZvciAodmFyIGk9MDsgaSA8IGNvbG9yTGlzdC5sZW5ndGg7IGkrKykgewoKICAgICAgICAgICAgLy8gV2Ugbm9ybWFsaXplIGJvdGggYXJvdW5kIHRoZSAiYWNjZXB0YWJsZSIgYnJlYWtpbmcgcG9pbnQsCiAgICAgICAgICAgIC8vIGJ1dCByYW5rIGJyaWdodG5lc3MgY29uc3RyYXN0IGhpZ2hlciB0aGFuIGh1ZS4KCiAgICAgICAgICAgIHZhciByZWFkYWJpbGl0eSA9IHRpbnljb2xvci5yZWFkYWJpbGl0eShiYXNlQ29sb3IsIGNvbG9yTGlzdFtpXSk7CiAgICAgICAgICAgIHZhciByZWFkYWJsZSA9IHJlYWRhYmlsaXR5LmJyaWdodG5lc3MgPiAxMjUgJiYgcmVhZGFiaWxpdHkuY29sb3IgPiA1MDA7CiAgICAgICAgICAgIHZhciBzY29yZSA9IDMgKiAocmVhZGFiaWxpdHkuYnJpZ2h0bmVzcyAvIDEyNSkgKyAocmVhZGFiaWxpdHkuY29sb3IgLyA1MDApOwoKICAgICAgICAgICAgaWYgKChyZWFkYWJsZSAmJiAhIGJlc3RJc1JlYWRhYmxlKSB8fAogICAgICAgICAgICAgICAgKHJlYWRhYmxlICYmIGJlc3RJc1JlYWRhYmxlICYmIHNjb3JlID4gYmVzdFNjb3JlKSB8fAogICAgICAgICAgICAgICAgKCghIHJlYWRhYmxlKSAmJiAoISBiZXN0SXNSZWFkYWJsZSkgJiYgc2NvcmUgPiBiZXN0U2NvcmUpKSB7CiAgICAgICAgICAgICAgICBiZXN0SXNSZWFkYWJsZSA9IHJlYWRhYmxlOwogICAgICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7CiAgICAgICAgICAgICAgICBiZXN0Q29sb3IgPSB0aW55Y29sb3IoY29sb3JMaXN0W2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYmVzdENvbG9yOwogICAgfTsKCgogICAgLy8gQmlnIExpc3Qgb2YgQ29sb3JzCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLyNzdmctY29sb3I+CiAgICB2YXIgbmFtZXMgPSB0aW55Y29sb3IubmFtZXMgPSB7CiAgICAgICAgYWxpY2VibHVlOiAiZjBmOGZmIiwKICAgICAgICBhbnRpcXVld2hpdGU6ICJmYWViZDciLAogICAgICAgIGFxdWE6ICIwZmYiLAogICAgICAgIGFxdWFtYXJpbmU6ICI3ZmZmZDQiLAogICAgICAgIGF6dXJlOiAiZjBmZmZmIiwKICAgICAgICBiZWlnZTogImY1ZjVkYyIsCiAgICAgICAgYmlzcXVlOiAiZmZlNGM0IiwKICAgICAgICBibGFjazogIjAwMCIsCiAgICAgICAgYmxhbmNoZWRhbG1vbmQ6ICJmZmViY2QiLAogICAgICAgIGJsdWU6ICIwMGYiLAogICAgICAgIGJsdWV2aW9sZXQ6ICI4YTJiZTIiLAogICAgICAgIGJyb3duOiAiYTUyYTJhIiwKICAgICAgICBidXJseXdvb2Q6ICJkZWI4ODciLAogICAgICAgIGJ1cm50c2llbm5hOiAiZWE3ZTVkIiwKICAgICAgICBjYWRldGJsdWU6ICI1ZjllYTAiLAogICAgICAgIGNoYXJ0cmV1c2U6ICI3ZmZmMDAiLAogICAgICAgIGNob2NvbGF0ZTogImQyNjkxZSIsCiAgICAgICAgY29yYWw6ICJmZjdmNTAiLAogICAgICAgIGNvcm5mbG93ZXJibHVlOiAiNjQ5NWVkIiwKICAgICAgICBjb3Juc2lsazogImZmZjhkYyIsCiAgICAgICAgY3JpbXNvbjogImRjMTQzYyIsCiAgICAgICAgY3lhbjogIjBmZiIsCiAgICAgICAgZGFya2JsdWU6ICIwMDAwOGIiLAogICAgICAgIGRhcmtjeWFuOiAiMDA4YjhiIiwKICAgICAgICBkYXJrZ29sZGVucm9kOiAiYjg4NjBiIiwKICAgICAgICBkYXJrZ3JheTogImE5YTlhOSIsCiAgICAgICAgZGFya2dyZWVuOiAiMDA2NDAwIiwKICAgICAgICBkYXJrZ3JleTogImE5YTlhOSIsCiAgICAgICAgZGFya2toYWtpOiAiYmRiNzZiIiwKICAgICAgICBkYXJrbWFnZW50YTogIjhiMDA4YiIsCiAgICAgICAgZGFya29saXZlZ3JlZW46ICI1NTZiMmYiLAogICAgICAgIGRhcmtvcmFuZ2U6ICJmZjhjMDAiLAogICAgICAgIGRhcmtvcmNoaWQ6ICI5OTMyY2MiLAogICAgICAgIGRhcmtyZWQ6ICI4YjAwMDAiLAogICAgICAgIGRhcmtzYWxtb246ICJlOTk2N2EiLAogICAgICAgIGRhcmtzZWFncmVlbjogIjhmYmM4ZiIsCiAgICAgICAgZGFya3NsYXRlYmx1ZTogIjQ4M2Q4YiIsCiAgICAgICAgZGFya3NsYXRlZ3JheTogIjJmNGY0ZiIsCiAgICAgICAgZGFya3NsYXRlZ3JleTogIjJmNGY0ZiIsCiAgICAgICAgZGFya3R1cnF1b2lzZTogIjAwY2VkMSIsCiAgICAgICAgZGFya3Zpb2xldDogIjk0MDBkMyIsCiAgICAgICAgZGVlcHBpbms6ICJmZjE0OTMiLAogICAgICAgIGRlZXBza3libHVlOiAiMDBiZmZmIiwKICAgICAgICBkaW1ncmF5OiAiNjk2OTY5IiwKICAgICAgICBkaW1ncmV5OiAiNjk2OTY5IiwKICAgICAgICBkb2RnZXJibHVlOiAiMWU5MGZmIiwKICAgICAgICBmaXJlYnJpY2s6ICJiMjIyMjIiLAogICAgICAgIGZsb3JhbHdoaXRlOiAiZmZmYWYwIiwKICAgICAgICBmb3Jlc3RncmVlbjogIjIyOGIyMiIsCiAgICAgICAgZnVjaHNpYTogImYwZiIsCiAgICAgICAgZ2FpbnNib3JvOiAiZGNkY2RjIiwKICAgICAgICBnaG9zdHdoaXRlOiAiZjhmOGZmIiwKICAgICAgICBnb2xkOiAiZmZkNzAwIiwKICAgICAgICBnb2xkZW5yb2Q6ICJkYWE1MjAiLAogICAgICAgIGdyYXk6ICI4MDgwODAiLAogICAgICAgIGdyZWVuOiAiMDA4MDAwIiwKICAgICAgICBncmVlbnllbGxvdzogImFkZmYyZiIsCiAgICAgICAgZ3JleTogIjgwODA4MCIsCiAgICAgICAgaG9uZXlkZXc6ICJmMGZmZjAiLAogICAgICAgIGhvdHBpbms6ICJmZjY5YjQiLAogICAgICAgIGluZGlhbnJlZDogImNkNWM1YyIsCiAgICAgICAgaW5kaWdvOiAiNGIwMDgyIiwKICAgICAgICBpdm9yeTogImZmZmZmMCIsCiAgICAgICAga2hha2k6ICJmMGU2OGMiLAogICAgICAgIGxhdmVuZGVyOiAiZTZlNmZhIiwKICAgICAgICBsYXZlbmRlcmJsdXNoOiAiZmZmMGY1IiwKICAgICAgICBsYXduZ3JlZW46ICI3Y2ZjMDAiLAogICAgICAgIGxlbW9uY2hpZmZvbjogImZmZmFjZCIsCiAgICAgICAgbGlnaHRibHVlOiAiYWRkOGU2IiwKICAgICAgICBsaWdodGNvcmFsOiAiZjA4MDgwIiwKICAgICAgICBsaWdodGN5YW46ICJlMGZmZmYiLAogICAgICAgIGxpZ2h0Z29sZGVucm9keWVsbG93OiAiZmFmYWQyIiwKICAgICAgICBsaWdodGdyYXk6ICJkM2QzZDMiLAogICAgICAgIGxpZ2h0Z3JlZW46ICI5MGVlOTAiLAogICAgICAgIGxpZ2h0Z3JleTogImQzZDNkMyIsCiAgICAgICAgbGlnaHRwaW5rOiAiZmZiNmMxIiwKICAgICAgICBsaWdodHNhbG1vbjogImZmYTA3YSIsCiAgICAgICAgbGlnaHRzZWFncmVlbjogIjIwYjJhYSIsCiAgICAgICAgbGlnaHRza3libHVlOiAiODdjZWZhIiwKICAgICAgICBsaWdodHNsYXRlZ3JheTogIjc4OSIsCiAgICAgICAgbGlnaHRzbGF0ZWdyZXk6ICI3ODkiLAogICAgICAgIGxpZ2h0c3RlZWxibHVlOiAiYjBjNGRlIiwKICAgICAgICBsaWdodHllbGxvdzogImZmZmZlMCIsCiAgICAgICAgbGltZTogIjBmMCIsCiAgICAgICAgbGltZWdyZWVuOiAiMzJjZDMyIiwKICAgICAgICBsaW5lbjogImZhZjBlNiIsCiAgICAgICAgbWFnZW50YTogImYwZiIsCiAgICAgICAgbWFyb29uOiAiODAwMDAwIiwKICAgICAgICBtZWRpdW1hcXVhbWFyaW5lOiAiNjZjZGFhIiwKICAgICAgICBtZWRpdW1ibHVlOiAiMDAwMGNkIiwKICAgICAgICBtZWRpdW1vcmNoaWQ6ICJiYTU1ZDMiLAogICAgICAgIG1lZGl1bXB1cnBsZTogIjkzNzBkYiIsCiAgICAgICAgbWVkaXVtc2VhZ3JlZW46ICIzY2IzNzEiLAogICAgICAgIG1lZGl1bXNsYXRlYmx1ZTogIjdiNjhlZSIsCiAgICAgICAgbWVkaXVtc3ByaW5nZ3JlZW46ICIwMGZhOWEiLAogICAgICAgIG1lZGl1bXR1cnF1b2lzZTogIjQ4ZDFjYyIsCiAgICAgICAgbWVkaXVtdmlvbGV0cmVkOiAiYzcxNTg1IiwKICAgICAgICBtaWRuaWdodGJsdWU6ICIxOTE5NzAiLAogICAgICAgIG1pbnRjcmVhbTogImY1ZmZmYSIsCiAgICAgICAgbWlzdHlyb3NlOiAiZmZlNGUxIiwKICAgICAgICBtb2NjYXNpbjogImZmZTRiNSIsCiAgICAgICAgbmF2YWpvd2hpdGU6ICJmZmRlYWQiLAogICAgICAgIG5hdnk6ICIwMDAwODAiLAogICAgICAgIG9sZGxhY2U6ICJmZGY1ZTYiLAogICAgICAgIG9saXZlOiAiODA4MDAwIiwKICAgICAgICBvbGl2ZWRyYWI6ICI2YjhlMjMiLAogICAgICAgIG9yYW5nZTogImZmYTUwMCIsCiAgICAgICAgb3JhbmdlcmVkOiAiZmY0NTAwIiwKICAgICAgICBvcmNoaWQ6ICJkYTcwZDYiLAogICAgICAgIHBhbGVnb2xkZW5yb2Q6ICJlZWU4YWEiLAogICAgICAgIHBhbGVncmVlbjogIjk4ZmI5OCIsCiAgICAgICAgcGFsZXR1cnF1b2lzZTogImFmZWVlZSIsCiAgICAgICAgcGFsZXZpb2xldHJlZDogImRiNzA5MyIsCiAgICAgICAgcGFwYXlhd2hpcDogImZmZWZkNSIsCiAgICAgICAgcGVhY2hwdWZmOiAiZmZkYWI5IiwKICAgICAgICBwZXJ1OiAiY2Q4NTNmIiwKICAgICAgICBwaW5rOiAiZmZjMGNiIiwKICAgICAgICBwbHVtOiAiZGRhMGRkIiwKICAgICAgICBwb3dkZXJibHVlOiAiYjBlMGU2IiwKICAgICAgICBwdXJwbGU6ICI4MDAwODAiLAogICAgICAgIHJlYmVjY2FwdXJwbGU6ICI2NjMzOTkiLAogICAgICAgIHJlZDogImYwMCIsCiAgICAgICAgcm9zeWJyb3duOiAiYmM4ZjhmIiwKICAgICAgICByb3lhbGJsdWU6ICI0MTY5ZTEiLAogICAgICAgIHNhZGRsZWJyb3duOiAiOGI0NTEzIiwKICAgICAgICBzYWxtb246ICJmYTgwNzIiLAogICAgICAgIHNhbmR5YnJvd246ICJmNGE0NjAiLAogICAgICAgIHNlYWdyZWVuOiAiMmU4YjU3IiwKICAgICAgICBzZWFzaGVsbDogImZmZjVlZSIsCiAgICAgICAgc2llbm5hOiAiYTA1MjJkIiwKICAgICAgICBzaWx2ZXI6ICJjMGMwYzAiLAogICAgICAgIHNreWJsdWU6ICI4N2NlZWIiLAogICAgICAgIHNsYXRlYmx1ZTogIjZhNWFjZCIsCiAgICAgICAgc2xhdGVncmF5OiAiNzA4MDkwIiwKICAgICAgICBzbGF0ZWdyZXk6ICI3MDgwOTAiLAogICAgICAgIHNub3c6ICJmZmZhZmEiLAogICAgICAgIHNwcmluZ2dyZWVuOiAiMDBmZjdmIiwKICAgICAgICBzdGVlbGJsdWU6ICI0NjgyYjQiLAogICAgICAgIHRhbjogImQyYjQ4YyIsCiAgICAgICAgdGVhbDogIjAwODA4MCIsCiAgICAgICAgdGhpc3RsZTogImQ4YmZkOCIsCiAgICAgICAgdG9tYXRvOiAiZmY2MzQ3IiwKICAgICAgICB0dXJxdW9pc2U6ICI0MGUwZDAiLAogICAgICAgIHZpb2xldDogImVlODJlZSIsCiAgICAgICAgd2hlYXQ6ICJmNWRlYjMiLAogICAgICAgIHdoaXRlOiAiZmZmIiwKICAgICAgICB3aGl0ZXNtb2tlOiAiZjVmNWY1IiwKICAgICAgICB5ZWxsb3c6ICJmZjAiLAogICAgICAgIHllbGxvd2dyZWVuOiAiOWFjZDMyIgogICAgfTsKCiAgICAvLyBNYWtlIGl0IGVhc3kgdG8gYWNjZXNzIGNvbG9ycyB2aWEgYGhleE5hbWVzW2hleF1gCiAgICB2YXIgaGV4TmFtZXMgPSB0aW55Y29sb3IuaGV4TmFtZXMgPSBmbGlwKG5hbWVzKTsKCgogICAgLy8gVXRpbGl0aWVzCiAgICAvLyAtLS0tLS0tLS0KCiAgICAvLyBgeyAnbmFtZTEnOiAndmFsMScgfWAgYmVjb21lcyBgeyAndmFsMSc6ICduYW1lMScgfWAKICAgIGZ1bmN0aW9uIGZsaXAobykgewogICAgICAgIHZhciBmbGlwcGVkID0geyB9OwogICAgICAgIGZvciAodmFyIGkgaW4gbykgewogICAgICAgICAgICBpZiAoby5oYXNPd25Qcm9wZXJ0eShpKSkgewogICAgICAgICAgICAgICAgZmxpcHBlZFtvW2ldXSA9IGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZsaXBwZWQ7CiAgICB9CgogICAgLy8gUmV0dXJuIGEgdmFsaWQgYWxwaGEgdmFsdWUgWzAsMV0gd2l0aCBhbGwgaW52YWxpZCB2YWx1ZXMgYmVpbmcgc2V0IHRvIDEKICAgIGZ1bmN0aW9uIGJvdW5kQWxwaGEoYSkgewogICAgICAgIGEgPSBwYXJzZUZsb2F0KGEpOwoKICAgICAgICBpZiAoaXNOYU4oYSkgfHwgYSA8IDAgfHwgYSA+IDEpIHsKICAgICAgICAgICAgYSA9IDE7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYTsKICAgIH0KCiAgICAvLyBUYWtlIGlucHV0IGZyb20gWzAsIG5dIGFuZCByZXR1cm4gaXQgYXMgWzAsIDFdCiAgICBmdW5jdGlvbiBib3VuZDAxKG4sIG1heCkgewogICAgICAgIGlmIChpc09uZVBvaW50WmVybyhuKSkgeyBuID0gIjEwMCUiOyB9CgogICAgICAgIHZhciBwcm9jZXNzUGVyY2VudCA9IGlzUGVyY2VudGFnZShuKTsKICAgICAgICBuID0gbWF0aE1pbihtYXgsIG1hdGhNYXgoMCwgcGFyc2VGbG9hdChuKSkpOwoKICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IGNvbnZlcnQgcGVyY2VudGFnZSBpbnRvIG51bWJlcgogICAgICAgIGlmIChwcm9jZXNzUGVyY2VudCkgewogICAgICAgICAgICBuID0gcGFyc2VJbnQobiAqIG1heCwgMTApIC8gMTAwOwogICAgICAgIH0KCiAgICAgICAgLy8gSGFuZGxlIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGVycm9ycwogICAgICAgIGlmICgobWF0aC5hYnMobiAtIG1heCkgPCAwLjAwMDAwMSkpIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQoKICAgICAgICAvLyBDb252ZXJ0IGludG8gWzAsIDFdIHJhbmdlIGlmIGl0IGlzbid0IGFscmVhZHkKICAgICAgICByZXR1cm4gKG4gJSBtYXgpIC8gcGFyc2VGbG9hdChtYXgpOwogICAgfQoKICAgIC8vIEZvcmNlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMQogICAgZnVuY3Rpb24gY2xhbXAwMSh2YWwpIHsKICAgICAgICByZXR1cm4gbWF0aE1pbigxLCBtYXRoTWF4KDAsIHZhbCkpOwogICAgfQoKICAgIC8vIFBhcnNlIGEgYmFzZS0xNiBoZXggdmFsdWUgaW50byBhIGJhc2UtMTAgaW50ZWdlcgogICAgZnVuY3Rpb24gcGFyc2VJbnRGcm9tSGV4KHZhbCkgewogICAgICAgIHJldHVybiBwYXJzZUludCh2YWwsIDE2KTsKICAgIH0KCiAgICAvLyBOZWVkIHRvIGhhbmRsZSAxLjAgYXMgMTAwJSwgc2luY2Ugb25jZSBpdCBpcyBhIG51bWJlciwgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIGl0IGFuZCAxCiAgICAvLyA8aHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83NDIyMDcyL2phdmFzY3JpcHQtaG93LXRvLWRldGVjdC1udW1iZXItYXMtYS1kZWNpbWFsLWluY2x1ZGluZy0xLTA+CiAgICBmdW5jdGlvbiBpc09uZVBvaW50WmVybyhuKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBuID09ICJzdHJpbmciICYmIG4uaW5kZXhPZignLicpICE9IC0xICYmIHBhcnNlRmxvYXQobikgPT09IDE7CiAgICB9CgogICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHN0cmluZyBwYXNzZWQgaW4gaXMgYSBwZXJjZW50YWdlCiAgICBmdW5jdGlvbiBpc1BlcmNlbnRhZ2UobikgewogICAgICAgIHJldHVybiB0eXBlb2YgbiA9PT0gInN0cmluZyIgJiYgbi5pbmRleE9mKCclJykgIT0gLTE7CiAgICB9CgogICAgLy8gRm9yY2UgYSBoZXggdmFsdWUgdG8gaGF2ZSAyIGNoYXJhY3RlcnMKICAgIGZ1bmN0aW9uIHBhZDIoYykgewogICAgICAgIHJldHVybiBjLmxlbmd0aCA9PSAxID8gJzAnICsgYyA6ICcnICsgYzsKICAgIH0KCiAgICAvLyBSZXBsYWNlIGEgZGVjaW1hbCB3aXRoIGl0J3MgcGVyY2VudGFnZSB2YWx1ZQogICAgZnVuY3Rpb24gY29udmVydFRvUGVyY2VudGFnZShuKSB7CiAgICAgICAgaWYgKG4gPD0gMSkgewogICAgICAgICAgICBuID0gKG4gKiAxMDApICsgIiUiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG47CiAgICB9CgogICAgLy8gQ29udmVydHMgYSBkZWNpbWFsIHRvIGEgaGV4IHZhbHVlCiAgICBmdW5jdGlvbiBjb252ZXJ0RGVjaW1hbFRvSGV4KGQpIHsKICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGQpICogMjU1KS50b1N0cmluZygxNik7CiAgICB9CiAgICAvLyBDb252ZXJ0cyBhIGhleCB2YWx1ZSB0byBhIGRlY2ltYWwKICAgIGZ1bmN0aW9uIGNvbnZlcnRIZXhUb0RlY2ltYWwoaCkgewogICAgICAgIHJldHVybiAocGFyc2VJbnRGcm9tSGV4KGgpIC8gMjU1KTsKICAgIH0KCiAgICB2YXIgbWF0Y2hlcnMgPSAoZnVuY3Rpb24oKSB7CgogICAgICAgIC8vIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXZhbHVlcy8jaW50ZWdlcnM+CiAgICAgICAgdmFyIENTU19JTlRFR0VSID0gIlstXFwrXT9cXGQrJT8iOwoKICAgICAgICAvLyA8aHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy12YWx1ZXMvI251bWJlci12YWx1ZT4KICAgICAgICB2YXIgQ1NTX05VTUJFUiA9ICJbLVxcK10/XFxkKlxcLlxcZCslPyI7CgogICAgICAgIC8vIEFsbG93IHBvc2l0aXZlL25lZ2F0aXZlIGludGVnZXIvbnVtYmVyLiAgRG9uJ3QgY2FwdHVyZSB0aGUgZWl0aGVyL29yLCBqdXN0IHRoZSBlbnRpcmUgb3V0Y29tZS4KICAgICAgICB2YXIgQ1NTX1VOSVQgPSAiKD86IiArIENTU19OVU1CRVIgKyAiKXwoPzoiICsgQ1NTX0lOVEVHRVIgKyAiKSI7CgogICAgICAgIC8vIEFjdHVhbCBtYXRjaGluZy4KICAgICAgICAvLyBQYXJlbnRoZXNlcyBhbmQgY29tbWFzIGFyZSBvcHRpb25hbCwgYnV0IG5vdCByZXF1aXJlZC4KICAgICAgICAvLyBXaGl0ZXNwYWNlIGNhbiB0YWtlIHRoZSBwbGFjZSBvZiBjb21tYXMgb3Igb3BlbmluZyBwYXJlbgogICAgICAgIHZhciBQRVJNSVNTSVZFX01BVENIMyA9ICJbXFxzfFxcKF0rKCIgKyBDU1NfVU5JVCArICIpWyx8XFxzXSsoIiArIENTU19VTklUICsgIilbLHxcXHNdKygiICsgQ1NTX1VOSVQgKyAiKVxccypcXCk/IjsKICAgICAgICB2YXIgUEVSTUlTU0lWRV9NQVRDSDQgPSAiW1xcc3xcXChdKygiICsgQ1NTX1VOSVQgKyAiKVssfFxcc10rKCIgKyBDU1NfVU5JVCArICIpWyx8XFxzXSsoIiArIENTU19VTklUICsgIilbLHxcXHNdKygiICsgQ1NTX1VOSVQgKyAiKVxccypcXCk/IjsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmdiOiBuZXcgUmVnRXhwKCJyZ2IiICsgUEVSTUlTU0lWRV9NQVRDSDMpLAogICAgICAgICAgICByZ2JhOiBuZXcgUmVnRXhwKCJyZ2JhIiArIFBFUk1JU1NJVkVfTUFUQ0g0KSwKICAgICAgICAgICAgaHNsOiBuZXcgUmVnRXhwKCJoc2wiICsgUEVSTUlTU0lWRV9NQVRDSDMpLAogICAgICAgICAgICBoc2xhOiBuZXcgUmVnRXhwKCJoc2xhIiArIFBFUk1JU1NJVkVfTUFUQ0g0KSwKICAgICAgICAgICAgaHN2OiBuZXcgUmVnRXhwKCJoc3YiICsgUEVSTUlTU0lWRV9NQVRDSDMpLAogICAgICAgICAgICBoc3ZhOiBuZXcgUmVnRXhwKCJoc3ZhIiArIFBFUk1JU1NJVkVfTUFUQ0g0KSwKICAgICAgICAgICAgaGV4MzogL14oWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkkLywKICAgICAgICAgICAgaGV4NjogL14oWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkkLywKICAgICAgICAgICAgaGV4ODogL14oWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pJC8KICAgICAgICB9OwogICAgfSkoKTsKCiAgICAvLyBgc3RyaW5nSW5wdXRUb09iamVjdGAKICAgIC8vIFBlcm1pc3NpdmUgc3RyaW5nIHBhcnNpbmcuICBUYWtlIGluIGEgbnVtYmVyIG9mIGZvcm1hdHMsIGFuZCBvdXRwdXQgYW4gb2JqZWN0CiAgICAvLyBiYXNlZCBvbiBkZXRlY3RlZCBmb3JtYXQuICBSZXR1cm5zIGB7IHIsIGcsIGIgfWAgb3IgYHsgaCwgcywgbCB9YCBvciBgeyBoLCBzLCB2fWAKICAgIGZ1bmN0aW9uIHN0cmluZ0lucHV0VG9PYmplY3QoY29sb3IpIHsKCiAgICAgICAgY29sb3IgPSBjb2xvci5yZXBsYWNlKHRyaW1MZWZ0LCcnKS5yZXBsYWNlKHRyaW1SaWdodCwgJycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgdmFyIG5hbWVkID0gZmFsc2U7CiAgICAgICAgaWYgKG5hbWVzW2NvbG9yXSkgewogICAgICAgICAgICBjb2xvciA9IG5hbWVzW2NvbG9yXTsKICAgICAgICAgICAgbmFtZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjb2xvciA9PSAndHJhbnNwYXJlbnQnKSB7CiAgICAgICAgICAgIHJldHVybiB7IHI6IDAsIGc6IDAsIGI6IDAsIGE6IDAsIGZvcm1hdDogIm5hbWUiIH07CiAgICAgICAgfQoKICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggc3RyaW5nIGlucHV0IHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCiAgICAgICAgLy8gS2VlcCBtb3N0IG9mIHRoZSBudW1iZXIgYm91bmRpbmcgb3V0IG9mIHRoaXMgZnVuY3Rpb24gLSBkb24ndCB3b3JyeSBhYm91dCBbMCwxXSBvciBbMCwxMDBdIG9yIFswLDM2MF0KICAgICAgICAvLyBKdXN0IHJldHVybiBhbiBvYmplY3QgYW5kIGxldCB0aGUgY29udmVyc2lvbiBmdW5jdGlvbnMgaGFuZGxlIHRoYXQuCiAgICAgICAgLy8gVGhpcyB3YXkgdGhlIHJlc3VsdCB3aWxsIGJlIHRoZSBzYW1lIHdoZXRoZXIgdGhlIHRpbnljb2xvciBpcyBpbml0aWFsaXplZCB3aXRoIHN0cmluZyBvciBvYmplY3QuCiAgICAgICAgdmFyIG1hdGNoOwogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5yZ2IuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IHI6IG1hdGNoWzFdLCBnOiBtYXRjaFsyXSwgYjogbWF0Y2hbM10gfTsKICAgICAgICB9CiAgICAgICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLnJnYmEuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IHI6IG1hdGNoWzFdLCBnOiBtYXRjaFsyXSwgYjogbWF0Y2hbM10sIGE6IG1hdGNoWzRdIH07CiAgICAgICAgfQogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oc2wuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IGg6IG1hdGNoWzFdLCBzOiBtYXRjaFsyXSwgbDogbWF0Y2hbM10gfTsKICAgICAgICB9CiAgICAgICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLmhzbGEuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IGg6IG1hdGNoWzFdLCBzOiBtYXRjaFsyXSwgbDogbWF0Y2hbM10sIGE6IG1hdGNoWzRdIH07CiAgICAgICAgfQogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oc3YuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IGg6IG1hdGNoWzFdLCBzOiBtYXRjaFsyXSwgdjogbWF0Y2hbM10gfTsKICAgICAgICB9CiAgICAgICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLmhzdmEuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IGg6IG1hdGNoWzFdLCBzOiBtYXRjaFsyXSwgdjogbWF0Y2hbM10sIGE6IG1hdGNoWzRdIH07CiAgICAgICAgfQogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oZXg4LmV4ZWMoY29sb3IpKSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgYTogY29udmVydEhleFRvRGVjaW1hbChtYXRjaFsxXSksCiAgICAgICAgICAgICAgICByOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMl0pLAogICAgICAgICAgICAgICAgZzogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzNdKSwKICAgICAgICAgICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFs0XSksCiAgICAgICAgICAgICAgICBmb3JtYXQ6IG5hbWVkID8gIm5hbWUiIDogImhleDgiCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oZXg2LmV4ZWMoY29sb3IpKSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzFdKSwKICAgICAgICAgICAgICAgIGc6IHBhcnNlSW50RnJvbUhleChtYXRjaFsyXSksCiAgICAgICAgICAgICAgICBiOiBwYXJzZUludEZyb21IZXgobWF0Y2hbM10pLAogICAgICAgICAgICAgICAgZm9ybWF0OiBuYW1lZCA/ICJuYW1lIiA6ICJoZXgiCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oZXgzLmV4ZWMoY29sb3IpKSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzFdICsgJycgKyBtYXRjaFsxXSksCiAgICAgICAgICAgICAgICBnOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMl0gKyAnJyArIG1hdGNoWzJdKSwKICAgICAgICAgICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFszXSArICcnICsgbWF0Y2hbM10pLAogICAgICAgICAgICAgICAgZm9ybWF0OiBuYW1lZCA/ICJuYW1lIiA6ICJoZXgiCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgd2luZG93LnRpbnljb2xvciA9IHRpbnljb2xvcjsKICAgIH0pKCk7CgogICAgJChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCQuZm4uc3BlY3RydW0ubG9hZCkgewogICAgICAgICAgICAkLmZuLnNwZWN0cnVtLnByb2Nlc3NOYXRpdmVDb2xvcklucHV0cygpOwogICAgICAgIH0KICAgIH0pOwoKfSk7Cg==
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTYgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyAtLQovLyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQovLyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQWdlbnQgPSBDb3JlLkFnZW50IHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAqIEBtZW1iZXJvZiBDb3JlLkFnZW50CiAqIEBhdXRob3IgT1RSUyBBRwogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgYXBwb2ludG1lbnQgY2FsZW5kYXIgZnVuY3Rpb25zLgogKi8KQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8vIEFwcG9pbnRtZW50IGRheXMgY2FjaGUgYW5kIHJlYWR5IGZsYWcKICAgIHZhciBBcHBvaW50bWVudERheXNDYWNoZSwKICAgICAgICBBcHBvaW50bWVudERheXNDYWNoZVJlZnJlc2hlZCA9IGZhbHNlLAogICAgICAgIEFKQVhDb3VudGVyID0gMCwKICAgICAgICBDdXJyZW50VmlldzsKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMgLSBIYXNoIHdpdGggZGlmZmVyZW50IGNvbmZpZyBvcHRpb25zLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5DaGFsbGVuZ2VUb2tlbiAtIFVzZXIgY2hhbGxlbmdlIHRva2VuLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5BbGxEYXlUZXh0IC0gTG9jYWxpemVkIHN0cmluZyBmb3IgdGhlIHdvcmQgIkFsbC1kYXkiLgogICAgICogQHBhcmFtIHtCb29sZWFufSBQYXJhbXMuSXNSVEwgLSBJcyBjdXJyZW50IGxvY2FsZSBpcyByaWdodCB0ZXh0IGJhc2VkPwogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLk1vbnRoTmFtZXMgLSBBcnJheSBjb250YWluaW5nIHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgZWFjaCBtb250aC4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5Nb250aE5hbWVzU2hvcnQgLSBBcnJheSBjb250YWluaW5nIHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgZWFjaCBtb250aCBvbiBzaG9ydGggZm9ybWF0LgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkRheU5hbWVzIC0gQXJyYXkgY29udGFpbmluZyB0aGUgbG9jYWxpemVkIHN0cmluZ3MgZm9yIGVhY2ggd2VlayBkYXkuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuRGF5TmFtZXNTaG9ydCAtIEFycmF5IGNvbnRhaW5pbmcgdGhlIGxvY2FsaXplZCBzdHJpbmdzIGZvciBlYWNoIHdlZWsgZGF5IG9uIHNob3J0IGZvcm1hdC4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5CdXR0b25UZXh0IC0gQXJyYXkgY29udGFpbmluZyB0aGUgbG9jYWxpemVkIHN0cmluZ3MgZm9yIGVhY2ggd2VlayBkYXkgb24gc2hvcnQgZm9ybWF0LgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5CdXR0b25UZXh0LnRvZGF5IC0gTG9jYWxpemVkIHN0cmluZyBmb3IgdGhlIHdvcmQgIlRvZGF5Ii4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQnV0dG9uVGV4dC5tb250aCAtIExvY2FsaXplZCBzdHJpbmcgZm9yIHRoZSB3b3JkICJNb250aCIuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkJ1dHRvblRleHQud2VlayAtIExvY2FsaXplZCBzdHJpbmcgZm9yIHRoZSB3b3JkICJXZWVrIi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQnV0dG9uVGV4dC5kYXkgLSBMb2NhbGl6ZWQgc3RyaW5nIGZvciB0aGUgd29yZCAiRGF5Ii4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQnV0dG9uVGV4dC50aW1lbGluZSAtIExvY2FsaXplZCBzdHJpbmcgZm9yIHRoZSB3b3JkICJUaW1lbGluZSIuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkJ1dHRvblRleHQuanVtcCAtIExvY2FsaXplZCBzdHJpbmcgZm9yIHRoZSB3b3JkICJKdW1wIi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRmlyc3REYXkgLSBGaXJzdCBkYXkgb2YgdGhlIHdlZWsgKDA6IFN1bmRheSkuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkRlZmF1bHRWaWV3IC0gRGVmYXVsdCB2aWV3IHRvIGRpc3BsYXkgKG1vbnRofGFnZW5kYVdlZWt8YWdlbmRhRGF5fHRpbWVsaW5lTW9udGh8dGltZWxpbmVXZWVrfHRpbWVsaW5lRGF5KS4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5IZWFkZXIgLSBBcnJheSBjb250YWluaW5nIHZpZXcgYnV0dG9ucyBpbiB0aGUgaGVhZGVyLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5IZWFkZXIubGVmdCAtIFN0cmluZyB3aXRoIHZpZXcgbmFtZXMgZm9yIGxlZnQgc2lkZSBvZiB0aGUgaGVhZGVyLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5IZWFkZXIuY2VudGVyIC0gU3RyaW5nIHdpdGggdmlldyBuYW1lcyBmb3IgaGVhZGVyIGNlbnRlci4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuSGVhZGVyLnJpZ2h0IC0gU3RyaW5nIHdpdGggdmlldyBuYW1lcyBmb3IgcmlnaHQgc2lkZSBvZiB0aGUgaGVhZGVyLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkRpYWxvZ1RleHQgLSBBcnJheSBjb250YWluaW5nIHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgZGlhbG9ncy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5FZGl0VGl0bGUgLSBUaXRsZSBvZiB0aGUgYWRkL2VkaXQgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VUaXRsZSAtIFRpdGxlIG9mIHRoZSBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGV4dCAtIFRleHQgb2YgdGhlIG9jY3VycmVuY2UgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VBbGwgLSBUZXh0IG9mICdhbGwnIGJ1dHRvbiBpbiBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlSnVzdFRoaXMgLSBUZXh0IG9mICdqdXN0IHRoaXMnIGJ1dHRvbiBpbiBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5EaXNtaXNzIC0gVGV4dCBvZiAnRGlzbWlzcycgYnV0dG9uIGluIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5PdmVydmlld1NjcmVlbiAtIE5hbWUgb2YgdGhlIHNjcmVlbiAoQ2FsZW5kYXJPdmVydmlld3xSZXNvdXJjZU92ZXJ2aWV3KS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc0J1dHRvbiAtIElEIG9mIHRoZSBzZXR0aW5ncyBidXR0b24uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkNhbGVuZGFyU2V0dGluZ3NEaWFsb2dDb250YWluZXIgLSBJRCBvZiB0aGUgc2V0dGluZ3MgZGlhbG9nIGNvbnRhaW5lci4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc1Nob3cgLSBTaG93IHRoZSBzZXR0aW5ncyBkaWFsb2cgaW1tZWRpYXRlbHkuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzIC0gQXJyYXkgY29udGFpbmluZyBuYW1lcyBvZiB0aGUgY2FsbGJhY2tzLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRNYXNrU3ViYWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBtYXNrIHN1YmFjdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRWRpdFN1YmFjdGlvbiAtIE5hbWUgb2YgdGhlIGVkaXQgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5BZGRTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBhZGQgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIC0gTmFtZSBvZiB0aGUgcHJlZmVyZW5jZXMgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5MaXN0QWN0aW9uIC0gTmFtZSBvZiB0aGUgbGlzdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkRheXNTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBhcHBvaW50bWVudCBkYXlzIHN1YmFjdGlvbi4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuVGlja2V0QXBwb2ludG1lbnRUeXBlcyAtIE9iamVjdCB3aXRoIHRpY2tldCBhcHBvaW50bWVudCB0eXBlcy4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuV29ya2luZ0hvdXJzIC0gT2JqZWN0IHdpdGggd29ya2luZyBob3VyIGFwcG9pbnRtZW50cy4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuUmVzb3VyY2VzIC0gT2JqZWN0IHdpdGggcmVzb3VyY2UgcGFyYW1ldGVycyAob3B0aW9uYWwpLgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcy5BcHBvaW50bWVudCAtIE9iamVjdCB3aXRoIGFwcG9pbnRtZW50IHNjcmVlbiByZWxhdGVkIGRhdGEgKG9wdGlvbmFsKS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUgLSBBdXRvIG9wZW4gYXBwb2ludG1lbnQgY3JlYXRlIHNjcmVlbiBwYXJhbWV0ZXJzIChvcHRpb25hbCkuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLlN0YXJ0IC0gU3RhcnQgZGF0ZSBvZiBuZXcgYXBwb2ludG1lbnQgKG1vbWVudCByZWFkeSkuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLkVuZCAtIEVuZCBkYXRlIG9mIG5ldyBhcHBvaW50bWVudCAobW9tZW50IHJlYWR5KS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuUGx1Z2luS2V5IC0gTmFtZSBvZiB0aGUgcGx1Z2luIG1vZHVsZSB0byB1c2UuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLlNlYXJjaCAtIFNlYXJjaCBzdHJpbmcgZm9yIHRoZSBwbHVnaW4gbW9kdWxlIHNlYXJjaC4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuT2JqZWN0SUQgLSBPYmplY3QgSUQgZm9yIHRoZSBwbHVnaW4gbW9kdWxlIHNlYXJjaC4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50SUQgLSBBdXRvIG9wZW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4gd2l0aCBzcGVjaWZpZWQgYXBwb2ludG1lbnQgKG9wdGlvbmFsKS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGVCdXR0b24gLSBJRCBvZiB0aGUgYWRkIGFwcG9pbnRtZW50IGJ1dHRvbi4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuQ2FsZW5kYXJzIC0gT2JqZWN0IHdpdGggY2FsZW5kYXIgcGFyYW1ldGVycy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxlbmRhcnMuU291cmNlcyAtIEFycmF5IG9mIGNhbGVuZGFyIHNvdXJjZXMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdHN9IFBhcmFtcy5DYWxlbmRhcnMuU3dpdGNoZXMgLSBBcnJheSBvZiBjYWxlbmRhciBzd2l0Y2ggZWxlbWVudHMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdHN9IFBhcmFtcy5DYWxlbmRhcnMuTGltaXQgLSBNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXIgc3dpdGNoZXMuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgSW5pdGlhbGl6ZXMgdGhlIGFwcG9pbnRtZW50IGNhbGVuZGFyIGNvbnRyb2wuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoUGFyYW1zKSB7CiAgICAgICAgdmFyICRDYWxlbmRhck9iaiA9ICQoJyNjYWxlbmRhcicpLAogICAgICAgICAgICAkRGF0ZXBpY2tlck9iaiA9ICQoJzxkaXYgLz4nKQogICAgICAgICAgICAgICAgLnByb3AoJ2lkJywgJ0RhdGVwaWNrZXInKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdIaWRkZW4nKQogICAgICAgICAgICAgICAgLmluc2VydEFmdGVyKCQoJyNjYWxlbmRhcicpKSwKICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50ID0gW107CgogICAgICAgIGlmICghUGFyYW1zLkNoYWxsZW5nZVRva2VuKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIFBhcmFtcy5SZXNvdXJjZXMgPSBQYXJhbXMuUmVzb3VyY2VzIHx8IHsKICAgICAgICAgICAgUmVzb3VyY2VDb2x1bW5zOiBudWxsLAogICAgICAgICAgICBSZXNvdXJjZVRleHQ6IG51bGwsCiAgICAgICAgICAgIFJlc291cmNlU2V0dGluZ3NCdXR0b246IG51bGwsCiAgICAgICAgICAgIFJlc291cmNlU2V0dGluZ3NEaWFsb2dDb250YWluZXI6IG51bGwsCiAgICAgICAgICAgIFJlc3RvcmVEZWZhdWx0U2V0dGluZ3M6IGZhbHNlLAogICAgICAgICAgICBSZXNvdXJjZUpTT046IG51bGwKICAgICAgICB9OwoKICAgICAgICAvLyBJbml0aWFsaXplIGNhbGVuZGFyCiAgICAgICAgJENhbGVuZGFyT2JqLmZ1bGxDYWxlbmRhcih7CiAgICAgICAgICAgIGhlYWRlcjogUGFyYW1zLkhlYWRlciwKICAgICAgICAgICAgY3VzdG9tQnV0dG9uczogewogICAgICAgICAgICAgICAganVtcDogewogICAgICAgICAgICAgICAgICAgIHRleHQ6IFBhcmFtcy5CdXR0b25UZXh0Lmp1bXAsCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBTaG93RGF0ZXBpY2tlcigkQ2FsZW5kYXJPYmosICREYXRlcGlja2VyT2JqLCAkKHRoaXMpLCBQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGVmYXVsdFZpZXc6IFBhcmFtcy5EZWZhdWx0VmlldywKICAgICAgICAgICAgYWxsRGF5VGV4dDogUGFyYW1zLkFsbERheVRleHQsCiAgICAgICAgICAgIGlzUlRMOiBQYXJhbXMuSXNSVEwsCiAgICAgICAgICAgIGNvbHVtbkZvcm1hdDogJ2RkZCwgRCBNTU0nLAogICAgICAgICAgICB0aW1lRm9ybWF0OiAnSEg6bW0nLAogICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6ICdISDptbScsCiAgICAgICAgICAgIHRpdGxlRm9ybWF0OiAnRCBNTU0gWVlZWScsCiAgICAgICAgICAgIHdlZWtOdW1iZXJzOiB0cnVlLAogICAgICAgICAgICB3ZWVrTnVtYmVyVGl0bGU6ICcjJywKICAgICAgICAgICAgd2Vla051bWJlckNhbGN1bGF0aW9uOiAnSVNPJywKICAgICAgICAgICAgZXZlbnRMaW1pdDogdHJ1ZSwKICAgICAgICAgICAgaGVpZ2h0OiA2MDAsCiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLAogICAgICAgICAgICBzZWxlY3RhYmxlOiB0cnVlLAogICAgICAgICAgICBmaXJzdERheTogUGFyYW1zLkZpcnN0RGF5LAogICAgICAgICAgICBtb250aE5hbWVzOiBQYXJhbXMuTW9udGhOYW1lcywKICAgICAgICAgICAgbW9udGhOYW1lc1Nob3J0OiBQYXJhbXMuTW9udGhOYW1lc1Nob3J0LAogICAgICAgICAgICBkYXlOYW1lczogUGFyYW1zLkRheU5hbWVzLAogICAgICAgICAgICBkYXlOYW1lc1Nob3J0OiBQYXJhbXMuRGF5TmFtZXNTaG9ydCwKICAgICAgICAgICAgYnV0dG9uVGV4dDogUGFyYW1zLkJ1dHRvblRleHQsCiAgICAgICAgICAgIHNjaGVkdWxlckxpY2Vuc2VLZXk6ICdHUEwtTXktUHJvamVjdC1Jcy1PcGVuLVNvdXJjZScsCiAgICAgICAgICAgIHNsb3REdXJhdGlvbjogJzAwOjMwOjAwJywKICAgICAgICAgICAgZm9yY2VFdmVudER1cmF0aW9uOiB0cnVlLAogICAgICAgICAgICBub3dJbmRpY2F0b3I6IHRydWUsCiAgICAgICAgICAgIHRpbWV6b25lOiAnbG9jYWwnLAogICAgICAgICAgICByZXNvdXJjZUFyZWFXaWR0aDogJzIxJScsCiAgICAgICAgICAgIHZpZXdzOiB7CiAgICAgICAgICAgICAgICBtb250aDogewogICAgICAgICAgICAgICAgICAgIHRpdGxlRm9ybWF0OiAnTU1NTSBZWVlZJywKICAgICAgICAgICAgICAgICAgICBjb2x1bW5Gb3JtYXQ6ICdkZGRkJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFnZW5kYURheTogewogICAgICAgICAgICAgICAgICAgIHRpdGxlRm9ybWF0OiAnRCBNTU0gWVlZWScsCiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzOiBmYWxzZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lTW9udGg6IHsKICAgICAgICAgICAgICAgICAgICBzbG90RHVyYXRpb246ICcyNDowMDowMCcsCiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9udGhzOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lV2VlazogewogICAgICAgICAgICAgICAgICAgIHNsb3REdXJhdGlvbjogJzAyOjAwOjAwJywKICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogewogICAgICAgICAgICAgICAgICAgICAgICB3ZWVrOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RkZCwgRCBNTU0nLAogICAgICAgICAgICAgICAgICAgICAgICAnSEgnCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lRGF5OiB7CiAgICAgICAgICAgICAgICAgICAgc2xvdER1cmF0aW9uOiAnMDA6MzA6MDAnLAogICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRheXM6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNsb3RMYWJlbEZvcm1hdDogWwogICAgICAgICAgICAgICAgICAgICAgICAnZGRkLCBEIE1NTScsCiAgICAgICAgICAgICAgICAgICAgICAgICdISDptbScKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGxvYWRpbmc6IGZ1bmN0aW9uKElzTG9hZGluZykgewogICAgICAgICAgICAgICAgaWYgKElzTG9hZGluZykgewogICAgICAgICAgICAgICAgICAgICQoJy5DYWxlbmRhcldpZGdldCcpLmFkZENsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICQoJy5DYWxlbmRhcldpZGdldCcpLnJlbW92ZUNsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHZpZXdSZW5kZXI6IGZ1bmN0aW9uKFZpZXcpIHsKCiAgICAgICAgICAgICAgICAvLyBBZGQgY2FsZW5kYXIgd2VlayBudW1iZXIgdG8gdGltZWxpbmUgdmlldyB0aXRsZXMKICAgICAgICAgICAgICAgIGlmIChWaWV3Lm5hbWUgPT09ICd0aW1lbGluZVdlZWsnIHx8IFZpZXcubmFtZSA9PT0gJ3RpbWVsaW5lRGF5JykgewogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJENhbGVuZGFyT2JqLmZpbmQoJy5mYy10b29sYmFyID4gZGl2ID4gaDInKS5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdmYy13ZWVrLW51bWJlcicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQoVmlldy5zdGFydC5mb3JtYXQoJyAjVycpKQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHZpZXcgc2VsZWN0aW9uCiAgICAgICAgICAgICAgICBpZiAoQ3VycmVudFZpZXcgIT09IHVuZGVmaW5lZCAmJiBDdXJyZW50VmlldyAhPT0gVmlldy5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IFBhcmFtcy5DaGFsbGVuZ2VUb2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIDogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIDogJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJ2aWV3U2NyZWVuOiBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gPyBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gOiAnQ2FsZW5kYXJPdmVydmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0VmlldzogVmlldy5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5EZWJ1Zy5Mb2coJ0Vycm9yIHVwZGF0aW5nIHVzZXIgcHJlZmVyZW5jZXMhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQ3VycmVudFZpZXcgPSBWaWV3Lm5hbWU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNlbGVjdDogZnVuY3Rpb24oU3RhcnQsIEVuZCwgSlNFdmVudCwgVmlldywgUmVzb3VyY2UpIHsKICAgICAgICAgICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICAgICAgICAgIFN0YXJ0OiBTdGFydCwKICAgICAgICAgICAgICAgICAgICBFbmQ6IEVuZCwKICAgICAgICAgICAgICAgICAgICBKU0V2ZW50OiBKU0V2ZW50LAogICAgICAgICAgICAgICAgICAgIFZpZXc6IFZpZXcsCiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2U6IFJlc291cmNlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coUGFyYW1zLCBEYXRhKTsKICAgICAgICAgICAgICAgICRDYWxlbmRhck9iai5mdWxsQ2FsZW5kYXIoJ3Vuc2VsZWN0Jyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50Q2xpY2s6IGZ1bmN0aW9uKENhbEV2ZW50LCBKU0V2ZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBTdGFydDogQ2FsRXZlbnQuc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgRW5kOiBDYWxFdmVudC5lbmQsCiAgICAgICAgICAgICAgICAgICAgQ2FsRXZlbnQ6IENhbEV2ZW50CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coUGFyYW1zLCBEYXRhKTsKICAgICAgICAgICAgICAgIEpTRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50RHJvcDogZnVuY3Rpb24oQ2FsRXZlbnQsIERlbHRhLCBSZXZlcnRGdW5jKSB7CiAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBDYWxFdmVudDogQ2FsRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgUHJldmlvdXNBcHBvaW50bWVudDogQ3VycmVudEFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgICAgIERlbHRhOiBEZWx0YSwKICAgICAgICAgICAgICAgICAgICBSZXZlcnRGdW5jOiBSZXZlcnRGdW5jCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgVXBkYXRlQXBwb2ludG1lbnQoUGFyYW1zLCBEYXRhKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRSZXNpemU6IGZ1bmN0aW9uKENhbEV2ZW50LCBEZWx0YSwgUmV2ZXJ0RnVuYykgewogICAgICAgICAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgQ2FsRXZlbnQ6IENhbEV2ZW50LAogICAgICAgICAgICAgICAgICAgIFByZXZpb3VzQXBwb2ludG1lbnQ6IEN1cnJlbnRBcHBvaW50bWVudCwKICAgICAgICAgICAgICAgICAgICBEZWx0YTogRGVsdGEsCiAgICAgICAgICAgICAgICAgICAgUmV2ZXJ0RnVuYzogUmV2ZXJ0RnVuYwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFVwZGF0ZUFwcG9pbnRtZW50KFBhcmFtcywgRGF0YSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50UmVuZGVyOiBmdW5jdGlvbihDYWxFdmVudCwgJEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciAkSWNvbkNvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAkSWNvbjsKCiAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQuYWxsRGF5CiAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQucmVjdXJyaW5nCiAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQucGFyZW50SWQKICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC5ub3RpZmljYXRpb24KICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC50aWNrZXRBcHBvaW50bWVudFR5cGUpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGNvbnRhaW5lciBhbmQgaWNvbiBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgJEljb25Db250YWluZXIgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ0ljb25zJyk7CiAgICAgICAgICAgICAgICAgICAgJEljb24gPSAkKCc8aSAvPicpLmFkZENsYXNzKCdmYScpOwoKICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGFwcG9pbnRtZW50IHdpdGggYXBwcm9wcmlhdGUgaWNvbihzKQogICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5hbGxEYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEljb24uY2xvbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1zdW4tbycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQucmVjdXJyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJY29uLmNsb25lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZmEtcmVwZWF0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5wYXJlbnRJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWxpbmsnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50Lm5vdGlmaWNhdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWJlbGwnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LnRpY2tldEFwcG9pbnRtZW50VHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWNoYXItJyArIFBhcmFtcy5UaWNrZXRBcHBvaW50bWVudE1hcmtzW0NhbEV2ZW50LnRpY2tldEFwcG9pbnRtZW50VHlwZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUHJlcGVuZCBjb250YWluZXIgdG8gdGhlIGFwcG9pbnRtZW50CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQuZmluZCgnLmZjLWNvbnRlbnQnKQogICAgICAgICAgICAgICAgICAgICAgICAucHJlcGVuZCgkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50UmVzaXplU3RhcnQ6IGZ1bmN0aW9uKENhbEV2ZW50KSB7CiAgICAgICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQuc3RhcnQgPSBDYWxFdmVudC5zdGFydDsKICAgICAgICAgICAgICAgIEN1cnJlbnRBcHBvaW50bWVudC5lbmQgPSBDYWxFdmVudC5lbmQ7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50RHJhZ1N0YXJ0OiBmdW5jdGlvbihDYWxFdmVudCkgewogICAgICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50LnN0YXJ0ID0gQ2FsRXZlbnQuc3RhcnQ7CiAgICAgICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQuZW5kID0gQ2FsRXZlbnQuZW5kOwogICAgICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50LnJlc291cmNlSWRzID0gQ2FsRXZlbnQucmVzb3VyY2VJZHM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50TW91c2VvdmVyOiBmdW5jdGlvbihDYWxFdmVudCwgSlNFdmVudCkgewogICAgICAgICAgICAgICAgdmFyICRUb29sdGlwT2JqLAogICAgICAgICAgICAgICAgICAgIFBvc1ggPSAwLAogICAgICAgICAgICAgICAgICAgIFBvc1kgPSAwLAogICAgICAgICAgICAgICAgICAgIFRvb2x0aXBIVE1MID0gJCgnI0FwcG9pbnRtZW50VG9vbHRpcFRlbXBsYXRlJykuaHRtbCgpIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIERvY3VtZW50VmlzaWJsZUxlZnQgPSAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgKyAkKHdpbmRvdykud2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFZpc2libGVUb3AgPSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSArICQod2luZG93KS5oZWlnaHQoKSwKICAgICAgICAgICAgICAgICAgICBMYXN0WFBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgIExhc3RZUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgJEljb25Db250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgJEljb247CgogICAgICAgICAgICAgICAgaWYgKCFKU0V2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgSlNFdmVudCA9IHdpbmRvdy5ldmVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChKU0V2ZW50LnBhZ2VYIHx8IEpTRXZlbnQucGFnZVkpIHsKICAgICAgICAgICAgICAgICAgICBQb3NYID0gSlNFdmVudC5wYWdlWDsKICAgICAgICAgICAgICAgICAgICBQb3NZID0gSlNFdmVudC5wYWdlWTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSlNFdmVudC5jbGllbnRYIHx8IEpTRXZlbnQuY2xpZW50WSkgewogICAgICAgICAgICAgICAgICAgIFBvc1ggPSBKU0V2ZW50LmNsaWVudFggKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDsKICAgICAgICAgICAgICAgICAgICBQb3NZID0gSlNFdmVudC5jbGllbnRZICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEluY3JlYXNlIHBvc2l0aW9ucyBzbyB0aGUgdG9vbHRpcCBkbyBub3Qgb3ZlcmxhcCB3aXRoIG1vdXNlIHBvaW50ZXIKICAgICAgICAgICAgICAgIFBvc1ggKz0gMTA7CiAgICAgICAgICAgICAgICBQb3NZICs9IDEwOwoKICAgICAgICAgICAgICAgIGlmIChUb29sdGlwSFRNTC5sZW5ndGggPiAwKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgcGxhY2Vob2xkZXJzIHdpdGggYXBwb2ludG1lbnQgaW5mb3JtYXRpb24KICAgICAgICAgICAgICAgICAgICBUb29sdGlwSFRNTCA9IFJlcGxhY2VBcHBvaW50bWVudEluZm9ybWF0aW9uKFRvb2x0aXBIVE1MLCBDYWxFdmVudCk7CgogICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0b29sdGlwIG9iamVjdAogICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqID0gJCgnPGRpdi8+JykuYWRkQ2xhc3MoJ0FwcG9pbnRtZW50VG9vbHRpcCBIaWRkZW4nKQogICAgICAgICAgICAgICAgICAgICAgICAub2Zmc2V0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogUG9zWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IFBvc1gKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgLmh0bWwoVG9vbHRpcEhUTUwpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygnYm9keScpOwoKICAgICAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgdG9wIHBvc2l0aW9uIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgICAgIExhc3RZUG9zaXRpb24gPSBQb3NZICsgJFRvb2x0aXBPYmouaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKExhc3RZUG9zaXRpb24gPiBEb2N1bWVudFZpc2libGVUb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSA9IFBvc1kgLSAkVG9vbHRpcE9iai5oZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouY3NzKCd0b3AnLCBQb3NZICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgbGVmdCBwb3NpdGlvbiBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICBMYXN0WFBvc2l0aW9uID0gUG9zWCArICRUb29sdGlwT2JqLndpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKExhc3RYUG9zaXRpb24gPiBEb2N1bWVudFZpc2libGVMZWZ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFBvc1ggPSBQb3NYIC0gJFRvb2x0aXBPYmoud2lkdGgoKSAtIDMwOwogICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iai5jc3MoJ2xlZnQnLCBQb3NYICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIGFwcG9pbnRtZW50IGljb25zCiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LmFsbERheQogICAgICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC5yZWN1cnJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQucGFyZW50SWQKICAgICAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQubm90aWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IENhbEV2ZW50LnRpY2tldEFwcG9pbnRtZW50VHlwZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGNvbnRhaW5lcgogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbkNvbnRhaW5lciA9ICRUb29sdGlwT2JqLmZpbmQoJy5JY29ucycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGljb24gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbiA9ICQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGFwcG9pbnRtZW50IHdpdGggYXBwcm9wcmlhdGUgaWNvbihzKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQuYWxsRGF5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1zdW4tbycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQucmVjdXJyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1yZXBlYXQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LnBhcmVudElkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1saW5rJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5ub3RpZmljYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJY29uLmNsb25lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWJlbGwnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LnRpY2tldEFwcG9pbnRtZW50VHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEljb24uY2xvbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZmEtY2hhci0nICsgUGFyYW1zLlRpY2tldEFwcG9pbnRtZW50TWFya3NbQ2FsRXZlbnQudGlja2V0QXBwb2ludG1lbnRUeXBlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBTaG93IHRoZSB0b29sdGlwCiAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouZmFkZUluKCdmYXN0Jyk7CgogICAgICAgICAgICAgICAgICAgIC8vIENvbGxhcHNlIGZpZWxkc2V0IGxlZ2VuZCBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqLmZpbmQoJ2ZpZWxkc2V0JykuZWFjaChmdW5jdGlvbiAoSW5kZXgsIEZpZWxkc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKEZpZWxkc2V0KS5maW5kKCc6dmlzaWJsZScpLmxlbmd0aCA8PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEZpZWxkc2V0KS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRNb3VzZW91dDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKCcuQXBwb2ludG1lbnRUb29sdGlwJykuZmFkZU91dCgiZmFzdCIpLnJlbW92ZSgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudHM6IFBhcmFtcy5Xb3JraW5nSG91cnMsCiAgICAgICAgICAgIHJlc291cmNlczogUGFyYW1zLlJlc291cmNlcy5SZXNvdXJjZUpTT04sCiAgICAgICAgICAgIHJlc291cmNlQ29sdW1uczogUGFyYW1zLlJlc291cmNlcy5SZXNvdXJjZUNvbHVtbnMsCiAgICAgICAgICAgIHJlc291cmNlTGFiZWxUZXh0OiBQYXJhbXMuUmVzb3VyY2VzLlJlc291cmNlVGV4dAogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0aWFsaXplIGRhdGVwaWNrZXIKICAgICAgICAkRGF0ZXBpY2tlck9iai5kYXRlcGlja2VyKHsKICAgICAgICAgICAgc2hvd09uOiAnYnV0dG9uJywKICAgICAgICAgICAgYnV0dG9uVGV4dDogUGFyYW1zLkJ1dHRvblRleHQuanVtcCwKICAgICAgICAgICAgY29uc3RyYWluSW5wdXQ6IHRydWUsCiAgICAgICAgICAgIHByZXZUZXh0OiBQYXJhbXMuQnV0dG9uVGV4dC5wcmV2RGF0ZXBpY2tlciwKICAgICAgICAgICAgbmV4dFRleHQ6IFBhcmFtcy5CdXR0b25UZXh0Lm5leHREYXRlcGlja2VyLAogICAgICAgICAgICBmaXJzdERheTogUGFyYW1zLkZpcnN0RGF5LAogICAgICAgICAgICBzaG93TW9udGhBZnRlclllYXI6IDAsCiAgICAgICAgICAgIG1vbnRoTmFtZXM6IFBhcmFtcy5Nb250aE5hbWVzLAogICAgICAgICAgICBtb250aE5hbWVzU2hvcnQ6IFBhcmFtcy5Nb250aE5hbWVzU2hvcnQsCiAgICAgICAgICAgIGRheU5hbWVzOiBQYXJhbXMuRGF5TmFtZXMsCiAgICAgICAgICAgIGRheU5hbWVzU2hvcnQ6IFBhcmFtcy5EYXlOYW1lc1Nob3J0LAogICAgICAgICAgICBkYXlOYW1lc01pbjogUGFyYW1zLkRheU5hbWVzTWluLAogICAgICAgICAgICBpc1JUTDogUGFyYW1zLklzUlRMLAogICAgICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24oRGF0ZVRleHQpIHsKICAgICAgICAgICAgICAgICRDYWxlbmRhck9iai5mdWxsQ2FsZW5kYXIoJ2dvdG9EYXRlJywgbmV3IERhdGUoRGF0ZVRleHQpKTsKICAgICAgICAgICAgICAgICQoJyNEYXRlcGlja2VyT3ZlcmxheScpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgJERhdGVwaWNrZXJPYmouaGlkZSgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBiZWZvcmVTaG93RGF5OiBmdW5jdGlvbihEYXRlT2JqZWN0KSB7CiAgICAgICAgICAgICAgICBpZiAoQXBwb2ludG1lbnREYXlzQ2FjaGVSZWZyZXNoZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2hlY2tEYXRlKERhdGVPYmplY3QpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3RydWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBvbkNoYW5nZU1vbnRoWWVhcjogZnVuY3Rpb24oWWVhciwgTW9udGgpIHsKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF5cygkRGF0ZXBpY2tlck9iaiwgWWVhciwgTW9udGgsIFBhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgUGFyYW1zLkNhbGVuZGFycy5Td2l0Y2hlcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQ2FsZW5kYXJTd2l0Y2hJbml0KCQodGhpcyksIFBhcmFtcyk7CiAgICAgICAgfSk7CgogICAgICAgIGlmIChQYXJhbXMuQXBwb2ludG1lbnQpIHsKCiAgICAgICAgICAgIC8vIEF1dG8gb3BlbiBhcHBvaW50bWVudCBjcmVhdGUgc2NyZWVuCiAgICAgICAgICAgIGlmIChQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUpIHsKICAgICAgICAgICAgICAgIFRhcmdldE5TLk9wZW5FZGl0RGlhbG9nKFBhcmFtcywgewogICAgICAgICAgICAgICAgICAgIFN0YXJ0OiBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuU3RhcnQgPyAkLmZ1bGxDYWxlbmRhci5tb21lbnQoUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLlN0YXJ0KSA6ICQuZnVsbENhbGVuZGFyLm1vbWVudCgpLmFkZCgxLCAnaG91cnMnKS5zdGFydE9mKCdob3VyJyksCiAgICAgICAgICAgICAgICAgICAgRW5kOiBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuRW5kID8gJC5mdWxsQ2FsZW5kYXIubW9tZW50KFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZS5FbmQpIDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KCkuYWRkKDIsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKSwKICAgICAgICAgICAgICAgICAgICBQbHVnaW5LZXk6IFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZS5QbHVnaW5LZXkgPyBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuUGx1Z2luS2V5IDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBTZWFyY2g6IFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZS5TZWFyY2ggPyBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuU2VhcmNoIDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRDogUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLk9iamVjdElEID8gUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLk9iamVjdElEIDogbnVsbAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEF1dG8gb3BlbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbgogICAgICAgICAgICBlbHNlIGlmIChQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRJRCkgewogICAgICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coUGFyYW1zLCB7IENhbEV2ZW50OiB7IGlkOiBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRJRCB9IH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZUJ1dHRvbikpCiAgICAgICAgICAgICAgICAub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykKICAgICAgICAgICAgICAgIC5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5PcGVuRWRpdERpYWxvZyhQYXJhbXMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQ6ICQuZnVsbENhbGVuZGFyLm1vbWVudCgpLmFkZCgxLCAnaG91cnMnKS5zdGFydE9mKCdob3VyJyksCiAgICAgICAgICAgICAgICAgICAgICAgIEVuZDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KCkuYWRkKDIsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKQogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGlmIChQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc0J1dHRvbikgewogICAgICAgICAgICBDYWxlbmRhclNldHRpbmdzSW5pdChQYXJhbXMpOwogICAgICAgIH0KCiAgICAgICAgaWYgKFBhcmFtcy5SZXNvdXJjZXMuUmVzb3VyY2VTZXR0aW5nc0J1dHRvbikgewogICAgICAgICAgICBSZXNvdXJjZVNldHRpbmdzSW5pdChQYXJhbXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgU2hvd0RhdGVwaWNrZXIKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkQ2FsZW5kYXJPYmogLSBDYWxlbmRhciBjb250cm9sIG9iamVjdC4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRGF0ZXBpY2tlck9iaiAtIERhdGVwaWNrZXIgY29udHJvbCBvYmplY3QuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEp1bXBCdXR0b24gLSBEYXRlcGlja2VyIGJ1dHRvbiBvYmplY3QuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUGFyYW1zIC0gSGFzaCB3aXRoIGRpZmZlcmVudCBjb25maWcgb3B0aW9ucy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBTaG93IGRhdGUgcGlja2VyIGNvbnRyb2wuCiAgICAgKi8KICAgIGZ1bmN0aW9uIFNob3dEYXRlcGlja2VyKCRDYWxlbmRhck9iaiwgJERhdGVwaWNrZXJPYmosICRKdW1wQnV0dG9uLCBQYXJhbXMpIHsKICAgICAgICB2YXIgQ3VycmVudERhdGUgPSAkQ2FsZW5kYXJPYmouZnVsbENhbGVuZGFyKCdnZXREYXRlJyksCiAgICAgICAgICAgIFllYXIgPSBDdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVknKSwKICAgICAgICAgICAgTW9udGggPSBDdXJyZW50RGF0ZS5mb3JtYXQoJ00nKTsKCiAgICAgICAgJCgnPGRpdiAvPicpLnByb3AoJ2lkJywgJ0RhdGVwaWNrZXJPdmVybGF5JykKICAgICAgICAgICAgLmFwcGVuZFRvKCQoJ2JvZHknKSkKICAgICAgICAgICAgLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICREYXRlcGlja2VyT2JqLmhpZGUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIEFwcG9pbnRtZW50RGF5cygkRGF0ZXBpY2tlck9iaiwgWWVhciwgTW9udGgsIFBhcmFtcyk7CgogICAgICAgICREYXRlcGlja2VyT2JqLmRhdGVwaWNrZXIoJ3NldERhdGUnLCBDdXJyZW50RGF0ZS50b0RhdGUoKSkKICAgICAgICAgICAgLmNzcyh7CiAgICAgICAgICAgICAgICBsZWZ0OiBwYXJzZUludCgkSnVtcEJ1dHRvbi5vZmZzZXQoKS5sZWZ0IC0gJERhdGVwaWNrZXJPYmoub3V0ZXJXaWR0aCgpICsgJEp1bXBCdXR0b24ub3V0ZXJXaWR0aCgpLCAxMCksCiAgICAgICAgICAgICAgICB0b3A6IHBhcnNlSW50KCRKdW1wQnV0dG9uLm9mZnNldCgpLnRvcCAtICREYXRlcGlja2VyT2JqLm91dGVySGVpZ2h0KCkgKyAkSnVtcEJ1dHRvbi5vdXRlckhlaWdodCgpLCAxMCkKICAgICAgICAgICAgfSkuZmFkZUluKCdmYXN0Jyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ2hlY2tEYXRlCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7RGF0ZU9iamVjdH0gRGF0ZU9iamVjdCAtIEEgSlMgZGF0ZSBvYmplY3QgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IEZpcnN0IGVsZW1lbnQgaXMgYWx3YXlzIHRydWUsIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgQ1NTCiAgICAgKiAgICAgICAgICAgICAgICAgIGNsYXNzLCB0aGlyZCBlbGVtZW50IGEgZGVzY3JpcHRpb24gZm9yIHRoZSBkYXRlLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIENoZWNrIGlmIGRhdGUgaGFzIGFuIGFwcG9pbnRtZW50LgogICAgICovCiAgICBmdW5jdGlvbiBDaGVja0RhdGUoRGF0ZU9iamVjdCkgewogICAgICAgIHZhciBEYXRlTW9tZW50ID0gJC5mdWxsQ2FsZW5kYXIubW9tZW50KERhdGVPYmplY3QpLAogICAgICAgICAgICBEYXlBcHBvaW50bWVudHMgPSBBcHBvaW50bWVudERheXNDYWNoZVtEYXRlTW9tZW50LmZvcm1hdCgnWVlZWS1NTS1ERCcpXSwKICAgICAgICAgICAgRGF5Q2xhc3MgPSBEYXlBcHBvaW50bWVudHMgPyAnSGlnaGxpZ2h0JyA6ICcnLAogICAgICAgICAgICBEYXlEZXNjcmlwdGlvbiA9IERheUFwcG9pbnRtZW50cyA/IERheUFwcG9pbnRtZW50cy50b1N0cmluZygpIDogJyc7CgogICAgICAgIHJldHVybiBbdHJ1ZSwgRGF5Q2xhc3MsIERheURlc2NyaXB0aW9uXTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBBcHBvaW50bWVudERheXMKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRGF0ZXBpY2tlck9iaiAtIERhdGVwaWNrZXIgY29udHJvbCBvYmplY3QuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IFllYXIgLSBTZWxlY3RlZCB5ZWFyLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBNb250aCAtIFNlbGVjdGVkIG1vbnRoICgxLTEyKS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMgLSBIYXNoIHdpdGggZGlmZmVyZW50IGNvbmZpZyBvcHRpb25zLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIENhY2hlcyB0aGUgbGlzdCBvZiBhcHBvaW50bWVudCBkYXlzIGZvciBsYXRlciB1c2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEFwcG9pbnRtZW50RGF5cygkRGF0ZXBpY2tlck9iaiwgWWVhciwgTW9udGgsIFBhcmFtcykgewogICAgICAgIHZhciBTdGFydFRpbWUgPSAkLmZ1bGxDYWxlbmRhci5tb21lbnQoWWVhciArICctJyArIE1vbnRoLCAnWVlZWS1NJykuc3RhcnRPZignbW9udGgnKSwKICAgICAgICAgICAgRW5kVGltZSA9ICQuZnVsbENhbGVuZGFyLm1vbWVudChZZWFyICsgJy0nICsgTW9udGgsICdZWVlZLU0nKS5hZGQoMSwgJ21vbnRocycpLnN0YXJ0T2YoJ21vbnRoJyksCiAgICAgICAgICAgIERhdGEgPSB7CiAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogUGFyYW1zLkNoYWxsZW5nZVRva2VuLAogICAgICAgICAgICAgICAgQWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLkxpc3RBY3Rpb24sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuRGF5c1N1YmFjdG9uLAogICAgICAgICAgICAgICAgU3RhcnRUaW1lOiBTdGFydFRpbWUuZm9ybWF0KCdZWVlZLU1NLUREJyksCiAgICAgICAgICAgICAgICBFbmRUaW1lOiBFbmRUaW1lLmZvcm1hdCgnWVlZWS1NTS1ERCcpCiAgICAgICAgICAgIH07CgogICAgICAgICREYXRlcGlja2VyT2JqLmFkZENsYXNzKCdBSkFYTG9hZGluZycpOwogICAgICAgIEFwcG9pbnRtZW50RGF5c0NhY2hlUmVmcmVzaGVkID0gZmFsc2U7CgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXlzQ2FjaGUgPSBSZXNwb25zZTsKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERheXNDYWNoZVJlZnJlc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgJERhdGVwaWNrZXJPYmoucmVtb3ZlQ2xhc3MoJ0FKQVhMb2FkaW5nJyk7CgogICAgICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggdGhlIGRhdGUgcGlja2VyIGJlY2F1c2UgdGhpcyBjYWxsIGlzIGFzeW5jaHJvbm91cwogICAgICAgICAgICAgICAgICAgICREYXRlcGlja2VyT2JqLmRhdGVwaWNrZXIoJ3JlZnJlc2gnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHVibGljCiAgICAgKiBAbmFtZSBTaG93V2FpdGluZ0RpYWxvZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFNob3dzIHdhaXRpbmcgZGlhbG9nLgogICAgICovCiAgICBUYXJnZXROUy5TaG93V2FpdGluZ0RpYWxvZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZygnPGRpdiBjbGFzcz0iU3BhY2luZyBDZW50ZXIiPjxzcGFuIGNsYXNzPSJBSkFYTG9hZGVyIiB0aXRsZT0iJyArIENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc0xvYWRpbmcnKSArICciPjwvc3Bhbj48L2Rpdj4nLCBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNMb2FkaW5nJyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFJlcGxhY2VBcHBvaW50bWVudEluZm9ybWF0aW9uCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUmVwbGFjZUhUTUwgLSBTdHJpbmcgY29udGFpbmluZyAlcGxhY2Vob2xkZXJzJS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBDYWxFdmVudCAtIENhbGVuZGFyIGFwcG9pbnRtZW50IG9iamVjdC4KICAgICAqIEBmdW5jdGlvbgogICAgICogQHJldHVybnMge1N0cmluZ30gU3RyaW5nIHdpdGggcmVwbGFjZWQgcGxhY2Vob2xkZXJzLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFJlcGxhY2VzIHBsYWNlaG9sZGVycyBpbiBzdXBwbGllZCBzdHJpbmcgd2l0aCBjYWxlbmRhciBhcHBvaW50bWVudCBpbmZvcm1hdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gUmVwbGFjZUFwcG9pbnRtZW50SW5mb3JtYXRpb24oUmVwbGFjZUhUTUwsIENhbEV2ZW50KSB7CiAgICAgICAgdmFyIFBsYWNlaG9sZGVyLAogICAgICAgICAgICBTZWFyY2hQbGFjZWhvbGRlciwKICAgICAgICAgICAgUmVwbGFjZVZhbHVlOwoKICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHByb3BlcnRpZXMKICAgICAgICBmb3IgKFBsYWNlaG9sZGVyIGluIENhbEV2ZW50KSB7CiAgICAgICAgICAgIFNlYXJjaFBsYWNlaG9sZGVyID0gbmV3IFJlZ0V4cCgnJScgKyBQbGFjZWhvbGRlciArICclJywgJ2cnKTsKICAgICAgICAgICAgUmVwbGFjZVZhbHVlID0gQ2FsRXZlbnRbUGxhY2Vob2xkZXJdOwoKICAgICAgICAgICAgLy8gU3BlY2lhbCBwcm9wZXJ0aWVzCiAgICAgICAgICAgIGlmIChQbGFjZWhvbGRlciA9PT0gJ3JlY3VycmluZycpIHsKICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5wYXJlbnRJZCkgewogICAgICAgICAgICAgICAgICAgIFJlcGxhY2VWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoUGxhY2Vob2xkZXIgPT09ICdzdGFydCcgfHwgUGxhY2Vob2xkZXIgPT09ICdlbmQnKSB7CiAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQuYWxsRGF5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFBsYWNlaG9sZGVyID09PSAnZW5kJykgewogICAgICAgICAgICAgICAgICAgICAgICBSZXBsYWNlVmFsdWUgPSAkLmZ1bGxDYWxlbmRhci5tb21lbnQoUmVwbGFjZVZhbHVlKS5zdWJ0cmFjdCgxLCAnZGF5Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFJlcGxhY2VWYWx1ZSA9ICQuZnVsbENhbGVuZGFyLm1vbWVudChSZXBsYWNlVmFsdWUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBSZXBsYWNlVmFsdWUgPSAkLmZ1bGxDYWxlbmRhci5tb21lbnQoUmVwbGFjZVZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChQbGFjZWhvbGRlciA9PT0gJ3BsdWdpbkRhdGEnKSB7CiAgICAgICAgICAgICAgICAkLmVhY2goQ2FsRXZlbnQucGx1Z2luRGF0YSwgZnVuY3Rpb24gKEtleSwgVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IFZhbHVlLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpOwogICAgICAgICAgICAgICAgICAgIFJlcGxhY2VIVE1MID0gUmVwbGFjZUhUTUwucmVwbGFjZSgnJScgKyBLZXkgKyAnJScsIFZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERlZmF1bHQgSlNPTiB2YWx1ZXMKICAgICAgICAgICAgaWYgKFJlcGxhY2VWYWx1ZSA9PT0gbnVsbCB8fCBSZXBsYWNlVmFsdWUgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBSZXBsYWNlVmFsdWUgPSAnJzsKICAgICAgICAgICAgfSBlbHNlIGlmIChSZXBsYWNlVmFsdWUgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIFJlcGxhY2VWYWx1ZSA9IENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1llcycpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBSZXBsYWNlIG5ld2xpbmVzCiAgICAgICAgICAgIGlmIChSZXBsYWNlVmFsdWUucmVwbGFjZSkgewogICAgICAgICAgICAgICAgUmVwbGFjZVZhbHVlID0gUmVwbGFjZVZhbHVlLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBSZXBsYWNlIHBsYWNlaG9sZGVycwogICAgICAgICAgICBSZXBsYWNlSFRNTCA9IFJlcGxhY2VIVE1MLnJlcGxhY2UoU2VhcmNoUGxhY2Vob2xkZXIsIFJlcGxhY2VWYWx1ZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gUmVwbGFjZUhUTUw7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHVibGljCiAgICAgKiBAbmFtZSBPcGVuRWRpdERpYWxvZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcyAtIEhhc2ggd2l0aCBjb25maWd1cmF0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkRpYWxvZ1RleHQgLSBBcnJheSBjb250YWluaW5nIHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgZGlhbG9ncy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5FZGl0VGl0bGUgLSBUaXRsZSBvZiB0aGUgYWRkL2VkaXQgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VUaXRsZSAtIFRpdGxlIG9mIHRoZSBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGV4dCAtIFRleHQgb2YgdGhlIG9jY3VycmVuY2UgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VBbGwgLSBUZXh0IG9mICdhbGwnIGJ1dHRvbiBpbiBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlSnVzdFRoaXMgLSBUZXh0IG9mICdqdXN0IHRoaXMnIGJ1dHRvbiBpbiBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MgLSBBcnJheSBjb250YWluaW5nIG5hbWVzIG9mIHRoZSBjYWxsYmFja3MuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gLSBOYW1lIG9mIHRoZSBlZGl0IGFjdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRWRpdE1hc2tTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBlZGl0IG1hc2sgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtPYmplY3R9IEFwcG9pbnRtZW50RGF0YSAtIEhhc2ggd2l0aCBhcHBvaW50bWVudCBkYXRhLgogICAgICogQHBhcmFtIHtNb21lbnR9IEFwcG9pbnRtZW50RGF0YS5TdGFydCAtIE1vbWVudCBvYmplY3Qgd2l0aCBzdGFydCBkYXRlL3RpbWUuCiAgICAgKiBAcGFyYW0ge01vbWVudH0gQXBwb2ludG1lbnREYXRhLkVuZCAtIE1vbWVudCBvYmplY3Qgd2l0aCBlbmQgZGF0ZS90aW1lLgogICAgICogQHBhcmFtIHtPYmplY3R9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCAtIENhbGVuZGFyIGV2ZW50IG9iamVjdCAoRnVsbENhbGVuZGFyKS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEuUmVzb3VyY2UgLSBDYWxlbmRhciByZXNvdXJjZSBvYmplY3QgKEZ1bGxDYWxlbmRhcikuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2Qgb3BlbnMgdGhlIGFwcG9pbnRtZW50IGRpYWxvZyBhZnRlciBzZWxlY3RpbmcgYSB0aW1lIHBlcmlvZCBvciBhbiBhcHBvaW50bWVudC4KICAgICAqLwogICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2cgPSBmdW5jdGlvbiAoUGFyYW1zLCBBcHBvaW50bWVudERhdGEpIHsKICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IFBhcmFtcy5DaGFsbGVuZ2VUb2tlbiwKICAgICAgICAgICAgQWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gPyBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICBTdWJhY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuRWRpdE1hc2tTdWJhY3Rpb24gPyBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRNYXNrU3ViYWN0aW9uIDogJ0VkaXRNYXNrJywKICAgICAgICAgICAgQXBwb2ludG1lbnRJRDogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmlkIDogbnVsbCwKICAgICAgICAgICAgU3RhcnRZZWFyOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLlN0YXJ0LnllYXIoKSA6IG51bGwsCiAgICAgICAgICAgIFN0YXJ0TW9udGg6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuU3RhcnQubW9udGgoKSArIDEgOiBudWxsLAogICAgICAgICAgICBTdGFydERheTogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5TdGFydC5kYXRlKCkgOiBudWxsLAogICAgICAgICAgICBTdGFydEhvdXI6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuU3RhcnQuaG91cigpIDogbnVsbCwKICAgICAgICAgICAgU3RhcnRNaW51dGU6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuU3RhcnQubWludXRlKCkgOiBudWxsLAogICAgICAgICAgICBFbmRZZWFyOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLkVuZC55ZWFyKCkgOiBudWxsLAogICAgICAgICAgICBFbmRNb250aDogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5FbmQubW9udGgoKSArIDEgOiBudWxsLAogICAgICAgICAgICBFbmREYXk6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuRW5kLmRhdGUoKSA6IG51bGwsCiAgICAgICAgICAgIEVuZEhvdXI6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuRW5kLmhvdXIoKSA6IG51bGwsCiAgICAgICAgICAgIEVuZE1pbnV0ZTogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5FbmQubWludXRlKCkgOiBudWxsLAogICAgICAgICAgICBBbGxEYXk6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyAoQXBwb2ludG1lbnREYXRhLkVuZC5oYXNUaW1lKCkgPyAnMCcgOiAnMScpIDogbnVsbCwKICAgICAgICAgICAgVGVhbUlEOiBBcHBvaW50bWVudERhdGEuUmVzb3VyY2UgPyBbIEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZS5UZWFtSUQgXSA6IG51bGwsCiAgICAgICAgICAgIFJlc291cmNlSUQ6IEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZSA/IFsgQXBwb2ludG1lbnREYXRhLlJlc291cmNlLmlkIF0gOiBudWxsLAogICAgICAgICAgICBQbHVnaW5LZXk6IEFwcG9pbnRtZW50RGF0YS5QbHVnaW5LZXkgPyBBcHBvaW50bWVudERhdGEuUGx1Z2luS2V5IDogbnVsbCwKICAgICAgICAgICAgU2VhcmNoOiBBcHBvaW50bWVudERhdGEuU2VhcmNoID8gQXBwb2ludG1lbnREYXRhLlNlYXJjaCA6IG51bGwsCiAgICAgICAgICAgIE9iamVjdElEOiBBcHBvaW50bWVudERhdGEuT2JqZWN0SUQgPyBBcHBvaW50bWVudERhdGEuT2JqZWN0SUQgOiBudWxsCiAgICAgICAgfTsKCiAgICAgICAgLy8gTWFrZSBlbmQgdGltZSBmb3IgYWxsIGRheSBhcHBvaW50bWVudHMgaW5jbHVzaXZlCiAgICAgICAgaWYgKERhdGEuQWxsRGF5ICYmIERhdGEuQWxsRGF5ID09PSAnMScpIHsKICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkVuZC5zdWJ0cmFjdCgxLCAnZGF5Jyk7CiAgICAgICAgICAgIERhdGEuRW5kWWVhciA9IEFwcG9pbnRtZW50RGF0YS5FbmQueWVhcigpOwogICAgICAgICAgICBEYXRhLkVuZE1vbnRoID0gQXBwb2ludG1lbnREYXRhLkVuZC5tb250aCgpICsgMTsKICAgICAgICAgICAgRGF0YS5FbmREYXkgPSBBcHBvaW50bWVudERhdGEuRW5kLmRhdGUoKTsKICAgICAgICAgICAgRGF0YS5FbmRIb3VyID0gQXBwb2ludG1lbnREYXRhLkVuZC5ob3VyKCk7CiAgICAgICAgICAgIERhdGEuRW5kTWludXRlID0gQXBwb2ludG1lbnREYXRhLkVuZC5taW51dGUoKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIEVkaXREaWFsb2coKSB7CiAgICAgICAgICAgIFRhcmdldE5TLlNob3dXYWl0aW5nRGlhbG9nKCk7CiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChIVE1MKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coSFRNTCwgUGFyYW1zLkRpYWxvZ1RleHQuRWRpdFRpdGxlLCAnMTBweCcsICdDZW50ZXInLCB0cnVlLCB1bmRlZmluZWQsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICAgICAgfSwgJ2h0bWwnCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZXBlYXRpbmcgZXZlbnQKICAgICAgICBpZiAoQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ICYmIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5wYXJlbnRJZCkgewogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93RGlhbG9nKHsKICAgICAgICAgICAgICAgIFRpdGxlOiBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGl0bGUsCiAgICAgICAgICAgICAgICBIVE1MOiBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGV4dCwKICAgICAgICAgICAgICAgIE1vZGFsOiB0cnVlLAogICAgICAgICAgICAgICAgQ2xvc2VPbkNsaWNrT3V0c2lkZTogdHJ1ZSwKICAgICAgICAgICAgICAgIENsb3NlT25Fc2NhcGU6IHRydWUsCiAgICAgICAgICAgICAgICBQb3NpdGlvblRvcDogJzIwJScsCiAgICAgICAgICAgICAgICBQb3NpdGlvbkxlZnQ6ICdDZW50ZXInLAogICAgICAgICAgICAgICAgQnV0dG9uczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VBbGwsCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiAnUHJpbWFyeSBDYWxsRm9yQWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5BcHBvaW50bWVudElEID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnBhcmVudElkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdERpYWxvZygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsOiBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlSnVzdFRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiAnQ2FsbEZvckFjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBFZGl0RGlhbG9nCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6ICdDbG9zZScsCiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsOiBQYXJhbXMuRGlhbG9nVGV4dC5DbG9zZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgRWRpdERpYWxvZygpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBVcGRhdGVBcHBvaW50bWVudAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcyAtIEhhc2ggd2l0aCBjb25maWd1cmF0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkRpYWxvZ1RleHQgLSBBcnJheSBjb250YWluaW5nIHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgZGlhbG9ncy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGl0bGUgLSBUaXRsZSBvZiB0aGUgb2NjdXJyZW5jZSBkaWFsb2cuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZVRleHQgLSBUZXh0IG9mIHRoZSBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlQWxsIC0gVGV4dCBvZiAnYWxsJyBidXR0b24gaW4gb2NjdXJyZW5jZSBkaWFsb2cuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZUp1c3RUaGlzIC0gVGV4dCBvZiAnanVzdCB0aGlzJyBidXR0b24gaW4gb2NjdXJyZW5jZSBkaWFsb2cuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzIC0gQXJyYXkgY29udGFpbmluZyBuYW1lcyBvZiB0aGUgY2FsbGJhY2tzLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBlZGl0IHN1YmFjdGlvbi4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEgLSBIYXNoIHdpdGggYXBwb2ludG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgLSBDYWxlbmRhciBldmVudCBvYmplY3QgKEZ1bGxDYWxlbmRhcikuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgYXBwb2ludG1lbnQgd2l0aCBzdXBwbGllZCBkYXRhLgogICAgICovCiAgICBmdW5jdGlvbiBVcGRhdGVBcHBvaW50bWVudChQYXJhbXMsIEFwcG9pbnRtZW50RGF0YSkgewogICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogUGFyYW1zLkNoYWxsZW5nZVRva2VuLAogICAgICAgICAgICBBY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiA/IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiA6ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgIFN1YmFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5FZGl0U3ViYWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5FZGl0U3ViYWN0aW9uIDogJ0VkaXRBcHBvaW50bWVudCcsCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5pZCwKICAgICAgICAgICAgU3RhcnRZZWFyOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQueWVhcigpLAogICAgICAgICAgICBTdGFydE1vbnRoOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQubW9udGgoKSArIDEsCiAgICAgICAgICAgIFN0YXJ0RGF5OiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQuZGF0ZSgpLAogICAgICAgICAgICBTdGFydEhvdXI6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5zdGFydC5ob3VyKCksCiAgICAgICAgICAgIFN0YXJ0TWludXRlOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQubWludXRlKCksCiAgICAgICAgICAgIEVuZFllYXI6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQueWVhcigpLAogICAgICAgICAgICBFbmRNb250aDogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5tb250aCgpICsgMSwKICAgICAgICAgICAgRW5kRGF5OiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmRhdGUoKSwKICAgICAgICAgICAgRW5kSG91cjogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5ob3VyKCksCiAgICAgICAgICAgIEVuZE1pbnV0ZTogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5taW51dGUoKSwKICAgICAgICAgICAgQWxsRGF5OiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmhhc1RpbWUoKSA/ICcwJyA6ICcxJywKICAgICAgICAgICAgUmVjdXJyaW5nOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucmVjdXJyaW5nID8gJzEnIDogJzAnLAogICAgICAgICAgICBUZWFtSUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC50ZWFtSWRzID8gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnRlYW1JZHMgOiB1bmRlZmluZWQsCiAgICAgICAgICAgIFJlc291cmNlSUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkcyA/IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkcyA6CiAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucmVzb3VyY2VJZCA/IFsgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnJlc291cmNlSWQgXSA6IHVuZGVmaW5lZAogICAgICAgIH07CgogICAgICAgIC8vIEFzc2lnbmVkIHJlc291cmNlIGRpZG4ndCBjaGFuZ2UKICAgICAgICBpZiAoCiAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkCiAgICAgICAgICAgICYmIEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LnJlc291cmNlSWRzCiAgICAgICAgICAgICYmICQuaW5BcnJheSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkLAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQucmVzb3VyY2VJZHMKICAgICAgICAgICAgKSAhPT0gLTEKICAgICAgICApIHsKICAgICAgICAgICAgRGF0YS5SZXNvdXJjZUlEID0gQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQucmVzb3VyY2VJZHM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBVcGRhdGUoKSB7CiAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICBEYXRhLAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2NhbGVuZGFyJykuZnVsbENhbGVuZGFyKCdyZWZldGNoRXZlbnRzJyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLlJldmVydEZ1bmMoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBkaWFsb2cKICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nOnZpc2libGUnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAvLyBNYWtlIGVuZCB0aW1lIGZvciBhbGwgZGF5IGFwcG9pbnRtZW50cyBpbmNsdXNpdmUKICAgICAgICBpZiAoQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmFsbERheSkgewogICAgICAgICAgICBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLnN1YnRyYWN0KDEsICdkYXknKTsKICAgICAgICAgICAgRGF0YS5FbmRZZWFyID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC55ZWFyKCk7CiAgICAgICAgICAgIERhdGEuRW5kTW9udGggPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLm1vbnRoKCkgKyAxOwogICAgICAgICAgICBEYXRhLkVuZERheSA9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQuZGF0ZSgpOwogICAgICAgICAgICBEYXRhLkVuZEhvdXIgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmhvdXIoKTsKICAgICAgICAgICAgRGF0YS5FbmRNaW51dGUgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLm1pbnV0ZSgpOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVwZWF0aW5nIGV2ZW50CiAgICAgICAgaWYgKEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5wYXJlbnRJZCkgewogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93RGlhbG9nKHsKICAgICAgICAgICAgICAgIFRpdGxlOiBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGl0bGUsCiAgICAgICAgICAgICAgICBIVE1MOiBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGV4dCwKICAgICAgICAgICAgICAgIE1vZGFsOiB0cnVlLAogICAgICAgICAgICAgICAgQ2xvc2VPbkNsaWNrT3V0c2lkZTogdHJ1ZSwKICAgICAgICAgICAgICAgIENsb3NlT25Fc2NhcGU6IHRydWUsCiAgICAgICAgICAgICAgICBQb3NpdGlvblRvcDogJzIwJScsCiAgICAgICAgICAgICAgICBQb3NpdGlvbkxlZnQ6ICdDZW50ZXInLAogICAgICAgICAgICAgICAgQnV0dG9uczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VBbGwsCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiAnUHJpbWFyeSBDYWxsRm9yQWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5BcHBvaW50bWVudElEID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnBhcmVudElkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5SZWN1cnJpbmcgPSAnMSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZURlbHRhID0gQXBwb2ludG1lbnREYXRhLkRlbHRhLmFzU2Vjb25kcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5zdGFydC5kaWZmKEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LnN0YXJ0LCAnc2Vjb25kcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09IERhdGEuVXBkYXRlRGVsdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQuZGlmZihBcHBvaW50bWVudERhdGEuUHJldmlvdXNBcHBvaW50bWVudC5lbmQsICdzZWNvbmRzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0gRGF0YS5VcGRhdGVEZWx0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5VcGRhdGVUeXBlID0gJ0JvdGgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQuc3RhcnQuZGlmZihBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQsICdzZWNvbmRzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0gRGF0YS5VcGRhdGVEZWx0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5VcGRhdGVUeXBlID0gJ1N0YXJ0VGltZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5VcGRhdGVEZWx0YSA9IERhdGEuVXBkYXRlRGVsdGEgKiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQuZGlmZihBcHBvaW50bWVudERhdGEuUHJldmlvdXNBcHBvaW50bWVudC5lbmQsICdzZWNvbmRzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0gRGF0YS5VcGRhdGVEZWx0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5VcGRhdGVUeXBlID0gJ0VuZFRpbWUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VKdXN0VGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdDYWxsRm9yQWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnBhcmVudElkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6ICdDbG9zZScsCiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsOiBQYXJhbXMuRGlhbG9nVGV4dC5DbG9zZSwKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLlJldmVydEZ1bmMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVXBkYXRlKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIENhbGVuZGFyU3dpdGNoSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRDYWxlbmRhclN3aXRjaCAtIGNhbGVuZGFyIGNoZWNrYm94IGVsZW1lbnQuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUGFyYW1zIC0gSGFzaCB3aXRoIGRpZmZlcmVudCBjb25maWcgb3B0aW9ucy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiAtIE5hbWUgb2YgdGhlIGVkaXQgYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIC0gTmFtZSBvZiB0aGUgcHJlZmVyZW5jZXMgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLk92ZXJ2aWV3U2NyZWVuIC0gTmFtZSBvZiB0aGUgc2NyZWVuIChDYWxlbmRhck92ZXJ2aWV3fFJlc291cmNlT3ZlcnZpZXcpLgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcy5DYWxlbmRhcnMgLSBPYmplY3Qgd2l0aCBjYWxlbmRhciBwYXJhbWV0ZXJzLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGVuZGFycy5Tb3VyY2VzIC0gQXJyYXkgb2YgY2FsZW5kYXIgc291cmNlcy4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0c30gUGFyYW1zLkNhbGVuZGFycy5Td2l0Y2hlcyAtIEFycmF5IG9mIGNhbGVuZGFyIHN3aXRjaCBlbGVtZW50cy4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0c30gUGFyYW1zLkNhbGVuZGFycy5MaW1pdCAtIE1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhciBzd2l0Y2hlcy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBjYWxlbmRhciBjaGVja2JveCBiZWhhdmlvciBhbmQgbG9hZHMgbXVsdGlwbGUgY2FsZW5kYXJzIHRvIHRoZQogICAgICogICAgICBGdWxsQ2FsZW5kYXIgY29udHJvbC4KICAgICAqLwogICAgZnVuY3Rpb24gQ2FsZW5kYXJTd2l0Y2hJbml0KCRDYWxlbmRhclN3aXRjaCwgUGFyYW1zKSB7CgogICAgICAgIC8vIEluaXRpYWxpemUgZW5hYmxlZCBzb3VyY2VzCiAgICAgICAgaWYgKCRDYWxlbmRhclN3aXRjaC5wcm9wKCdjaGVja2VkJykpIHsKICAgICAgICAgICAgJCgnI2NhbGVuZGFyJykuZnVsbENhbGVuZGFyKCdhZGRFdmVudFNvdXJjZScsIFBhcmFtcy5DYWxlbmRhcnMuU291cmNlc1skQ2FsZW5kYXJTd2l0Y2guZGF0YSgnaWQnKV0pOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVnaXN0ZXIgY2hhbmdlIGV2ZW50IGhhbmRsZXIKICAgICAgICAkQ2FsZW5kYXJTd2l0Y2gub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoJCgnLkNhbGVuZGFyU3dpdGNoIGlucHV0OmNoZWNrZWQnKS5sZW5ndGggPiBQYXJhbXMuQ2FsZW5kYXJzLkxpbWl0KSB7CiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJTd2l0Y2gucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dBbGVydChDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNUb29NYW55Q2FsZW5kYXJzSGVhZGxpbmUnKSwgQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zVG9vTWFueUNhbGVuZGFyc1RleHQnKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBDYWxlbmRhclN3aXRjaFNvdXJjZSgkQ2FsZW5kYXJTd2l0Y2gsIFBhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBDYWxlbmRhclN3aXRjaFNvdXJjZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRDYWxlbmRhclN3aXRjaCAtIGNhbGVuZGFyIGNoZWNrYm94IGVsZW1lbnQuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUGFyYW1zIC0gSGFzaCB3aXRoIGRpZmZlcmVudCBjb25maWcgb3B0aW9ucy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiAtIE5hbWUgb2YgdGhlIGVkaXQgYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIC0gTmFtZSBvZiB0aGUgcHJlZmVyZW5jZXMgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLk92ZXJ2aWV3U2NyZWVuIC0gTmFtZSBvZiB0aGUgc2NyZWVuIChDYWxlbmRhck92ZXJ2aWV3fFJlc291cmNlT3ZlcnZpZXcpLgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcy5DYWxlbmRhcnMgLSBPYmplY3Qgd2l0aCBjYWxlbmRhciBwYXJhbWV0ZXJzLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGVuZGFycy5Tb3VyY2VzIC0gQXJyYXkgb2YgY2FsZW5kYXIgc291cmNlcy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBlbmFibGVzL2Rpc2FibGVzIGNhbGVuZGFyIHNvdXJjZSBpbiBGdWxsQ2FsZW5kYXIgY29udHJvbCBhbmQgc3RvcmVzCiAgICAgKiAgICAgIHNlbGVjdGlvbiB0byB1c2VyIHByZWZlcmVuY2VzLgogICAgICovCiAgICBmdW5jdGlvbiBDYWxlbmRhclN3aXRjaFNvdXJjZSgkQ2FsZW5kYXJTd2l0Y2gsIFBhcmFtcykgewogICAgICAgIHZhciBDYWxlbmRhclNlbGVjdGlvbiA9IFtdOwoKICAgICAgICAvLyBTaG93L2hpZGUgdGhlIGNhbGVuZGFyIGFwcG9pbnRtZW50cwogICAgICAgIGlmICgkQ2FsZW5kYXJTd2l0Y2gucHJvcCgnY2hlY2tlZCcpKSB7CiAgICAgICAgICAgICQoJyNjYWxlbmRhcicpLmZ1bGxDYWxlbmRhcignYWRkRXZlbnRTb3VyY2UnLCBQYXJhbXMuQ2FsZW5kYXJzLlNvdXJjZXNbJENhbGVuZGFyU3dpdGNoLmRhdGEoJ2lkJyldKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkKCcjY2FsZW5kYXInKS5mdWxsQ2FsZW5kYXIoJ3JlbW92ZUV2ZW50U291cmNlJywgUGFyYW1zLkNhbGVuZGFycy5Tb3VyY2VzWyRDYWxlbmRhclN3aXRjaC5kYXRhKCdpZCcpXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBHZXQgYWxsIGNoZWNrZWQgY2FsZW5kYXJzCiAgICAgICAgJC5lYWNoKCQoJy5DYWxlbmRhclN3aXRjaCBpbnB1dDpjaGVja2VkJyksIGZ1bmN0aW9uIChJbmRleCwgRWxlbWVudCkgewogICAgICAgICAgICBDYWxlbmRhclNlbGVjdGlvbi5wdXNoKCQoRWxlbWVudCkuZGF0YSgnaWQnKSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFN0b3JlIHNlbGVjdGlvbiBpbiB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IFBhcmFtcy5DaGFsbGVuZ2VUb2tlbiwKICAgICAgICAgICAgICAgIEFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIDogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIDogJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgIE92ZXJ2aWV3U2NyZWVuOiBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gPyBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gOiAnQ2FsZW5kYXJPdmVydmlldycsCiAgICAgICAgICAgICAgICBDYWxlbmRhclNlbGVjdGlvbjogSlNPTi5zdHJpbmdpZnkoQ2FsZW5kYXJTZWxlY3Rpb24pCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5EZWJ1Zy5Mb2coJ0Vycm9yIHVwZGF0aW5nIHVzZXIgcHJlZmVyZW5jZXMhJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgTG9jYXRpb25MaW5rSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRMb2NhdGlvbk9iaiAtIGxvY2F0aW9uIGZpZWxkLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRMb2NhdGlvbkxpbmtzIC0gbG9jYXRpb24gbGlua3MuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgbG9jYXRpb24gbGluayBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuTG9jYXRpb25MaW5rSW5pdCA9IGZ1bmN0aW9uICgkTG9jYXRpb25PYmosICRMb2NhdGlvbkxpbmtzKSB7CiAgICAgICAgdmFyIExvY2F0aW9uVmFsdWUgPSAkTG9jYXRpb25PYmoudmFsKCkgfHwgJExvY2F0aW9uT2JqLnRleHQoKTsKCiAgICAgICAgJExvY2F0aW9uTGlua3MuZWFjaChmdW5jdGlvbiAoSW5kZXgsIEVsZW1lbnQpIHsKICAgICAgICAgICAgdmFyICRMaW5rT2JqID0gJChFbGVtZW50KSwKICAgICAgICAgICAgICAgIEJhc2VVUkwgID0gJExpbmtPYmouZGF0YSgnYmFzZVVybCcpOwoKICAgICAgICAgICAgLy8gVXBkYXRlIGxpbmsgVVJMIGFuZCBzaG93IGl0IGlmIGxvY2F0aW9uIGlzIHNldAogICAgICAgICAgICBpZiAoTG9jYXRpb25WYWx1ZS5sZW5ndGggPiAwICYmIExvY2F0aW9uVmFsdWUgIT09ICctJykgewogICAgICAgICAgICAgICAgJExpbmtPYmouYXR0cignaHJlZicsIEJhc2VVUkwgKyBlbmNvZGVVUklDb21wb25lbnQoTG9jYXRpb25WYWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgLmZhZGVJbignZmFzdCcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBPdGhlcndpc2UsIGhpZGUgdGhlIGxpbmsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGlua09iai5mYWRlT3V0KCdmYXN0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gUmVnaXN0ZXIga2V5IHVwIGV2ZW50IGhhbmRsZXIKICAgICAgICAkTG9jYXRpb25PYmoub2ZmKCdrZXl1cC5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2tleXVwLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuTG9jYXRpb25MaW5rSW5pdCgkTG9jYXRpb25PYmosICRMb2NhdGlvbkxpbmtzKTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIEFsbERheUluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkQWxsRGF5IC0gYWxsIGRheSBjaGVja2JveCBlbGVtZW50LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGFsbCBkYXkgY2hlY2tib3ggYmVoYXZpb3IuCiAgICAgKi8KICAgIFRhcmdldE5TLkFsbERheUluaXQgPSBmdW5jdGlvbiAoJEFsbERheSkgewogICAgICAgIGlmICgkKCcjU3RhcnRNb250aDpkaXNhYmxlZCcpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gU2hvdy9oaWRlIHRoZSBzdGFydCBob3VyL21pbnV0ZSBhbmQgY29tcGxldGUgZW5kIHRpbWUKICAgICAgICBpZiAoJEFsbERheS5wcm9wKCdjaGVja2VkJykpIHsKICAgICAgICAgICAgJCgnI1N0YXJ0SG91ciwjU3RhcnRNaW51dGUsI0VuZEhvdXIsI0VuZE1pbnV0ZScpLnZhbCgnMCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCB0cnVlKQogICAgICAgICAgICAgICAgLnByb3AoJ3JlYWRvbmx5JywgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJCgnI1N0YXJ0SG91ciwjU3RhcnRNaW51dGUsI0VuZEhvdXIsI0VuZE1pbnV0ZScpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wcm9wKCdyZWFkb25seScsIGZhbHNlKTsKICAgICAgICB9CgogICAgICAgIC8vIFJlZ2lzdGVyIGNoYW5nZSBldmVudCBoYW5kbGVyCiAgICAgICAgJEFsbERheS5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFRhcmdldE5TLkFsbERheUluaXQoJEFsbERheSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBSZWN1cnJpbmdJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge09iamVjdH0gRmllbGRzIC0gQXJyYXkgd2l0aCByZWZlcmVuY2VzIHRvIHJlY3VycmluZyBmaWVsZHMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJpbmcgLSBmaWVsZCB3aXRoIHJlY3VycmluZyBmbGFnLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZVR5cGUgLSBkcm9wIGRvd24gd2l0aCByZWN1cnJlbmNlIHR5cGUKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlIC0gUmVjdXJyZW5jZSBwYXR0ZXJuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0RpdiAtIEN1c3RvbSB0eXBlIGRyb3AtZG93bgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUludGVydmFsVGV4dCAtIGludGVydmFsIHRleHQKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgLSBjb250YWlucyB3ZWVrIGRheXMgdGFibGUKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IC0gY29udGFpbnMgbW9udGggZGF5cyB0YWJsZQogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiAtIGNvbnRhaW5zIG1vbnRocyB0YWJsZQogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2IC0gbGF5ZXIgd2l0aCByZWN1cnJlbmNlIGxpbWl0IGZpZWxkcy4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VMaW1pdCAtIGRyb3AgZG93biB3aXRoIHJlY3VycmVuY2UgbGltaXQgZmllbGQuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYgLSBsYXllciB3aXRoIHJlY2N1cmVuY2UgY291bnQgZmllbGQuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYgLSBsYXllciB3aXRoIHJlY2N1cmVuY2UgdW50aWwgZmllbGRzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGF5IC0gc2VsZWN0IGZpZWxkIGZvciByZWNjdXJlbmNlIHVudGlsIGRheS4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyByZWN1cnJlbmNlIGZpZWxkcyBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuUmVjdXJyaW5nSW5pdCA9IGZ1bmN0aW9uIChGaWVsZHMpIHsKCiAgICAgICAgZnVuY3Rpb24gUmVjSW5pdChGaWVsZHMpIHsKICAgICAgICAgICAgdmFyIERheXMgPSBbXSwKICAgICAgICAgICAgICAgIE1vbnRoRGF5cyA9IFtdLAogICAgICAgICAgICAgICAgTW9udGhzID0gW10sCiAgICAgICAgICAgICAgICBJbmRleDsKCiAgICAgICAgICAgIGlmICgkKCdpbnB1dCNEYXlzJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBEYXlzID0gJCgnaW5wdXQjRGF5cycpLnZhbCgpLnNwbGl0KCcsJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQoJ2lucHV0I01vbnRoRGF5cycpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgTW9udGhEYXlzID0gJCgnaW5wdXQjTW9udGhEYXlzJykudmFsKCkuc3BsaXQoJywnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJCgnaW5wdXQjTW9udGhEYXlzJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBNb250aHMgPSAkKCdpbnB1dCNNb250aHMnKS52YWwoKS5zcGxpdCgnLCcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBEYXlzLmxlbmd0aDsgSW5kZXgrKykgewogICAgICAgICAgICAgICAgaWYgKERheXNbSW5kZXhdICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgJCgiI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uW3ZhbHVlPSIgKyBEYXlzW0luZGV4XSArICJdIikKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTW9udGhEYXlzLmxlbmd0aDsgSW5kZXgrKykgewogICAgICAgICAgICAgICAgaWYgKE1vbnRoRGF5c1tJbmRleF0gIT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAkKCIjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgYnV0dG9uW3ZhbHVlPSIgKyBNb250aERheXNbSW5kZXhdICsgIl0iKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBNb250aHMubGVuZ3RoOyBJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9udGhzW0luZGV4XSAhPSAiIikgewogICAgICAgICAgICAgICAgICAgICQoIiNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IGJ1dHRvblt2YWx1ZT0iICsgTW9udGhzW0luZGV4XSArICJdIikKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZVR5cGUudmFsKCkgPT0gMCkgewogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJpbmcudmFsKDApOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0Rpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYuaGlkZSgpOwoKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUNvdW50RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGl2LmhpZGUoKTsKCiAgICAgICAgICAgICAgICAvLyBTa2lwIHZhbGlkYXRpb24gb2YgUmVjdXJyZW5jZVVudGlsIGZpZWxkcwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEYXkuYWRkQ2xhc3MoJ1ZhbGlkYXRpb25JZ25vcmUnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChGaWVsZHMuJFJlY3VycmVuY2VUeXBlLnZhbCgpID09ICdDdXN0b20nKSB7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmluZy52YWwoMSk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICBpZiAoRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZS52YWwoKT09IkN1c3RvbURhaWx5IikgewogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VJbnRlcnZhbFRleHQuZmluZCgnc3BhbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuVGV4dERheScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlLnZhbCgpPT0iQ3VzdG9tV2Vla2x5IikgewogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0LmZpbmQoJ3NwYW4nKQogICAgICAgICAgICAgICAgICAgICAgICAuaGlkZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnLlRleHRXZWVrJykKICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUudmFsKCk9PSJDdXN0b21Nb250aGx5IikgewogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0LmZpbmQoJ3NwYW4nKQogICAgICAgICAgICAgICAgICAgICAgICAuaGlkZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnLlRleHRNb250aCcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlLnZhbCgpPT0iQ3VzdG9tWWVhcmx5IikgewogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0LmZpbmQoJ3NwYW4nKQogICAgICAgICAgICAgICAgICAgICAgICAuaGlkZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnLlRleHRZZWFyJykKICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VMaW1pdERpdi5zaG93KCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VMaW1pdC5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCQodGhpcykudmFsKCkgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDb3VudERpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3VtZSB2YWxpZGF0aW9uIG9mIFJlY3VycmVuY2VVbnRpbCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEYXkucmVtb3ZlQ2xhc3MoJ1ZhbGlkYXRpb25JZ25vcmUnKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUNvdW50RGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdmFsaWRhdGlvbiBvZiBSZWN1cnJlbmNlVW50aWwgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGF5LmFkZENsYXNzKCdWYWxpZGF0aW9uSWdub3JlJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkudHJpZ2dlcignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKTsKCiAgICAgICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmdEaXYpOwogICAgICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZShGaWVsZHMuJFJlY3VycmVuY2VMaW1pdERpdik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmluZy52YWwoMSk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VMaW1pdERpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0Rpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYuaGlkZSgpOwoKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS52YWwoKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUNvdW50RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdW1lIHZhbGlkYXRpb24gb2YgUmVjdXJyZW5jZVVudGlsIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERheS5yZW1vdmVDbGFzcygnVmFsaWRhdGlvbklnbm9yZScpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB2YWxpZGF0aW9uIG9mIFJlY3VycmVuY2VVbnRpbCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEYXkuYWRkQ2xhc3MoJ1ZhbGlkYXRpb25JZ25vcmUnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KS50cmlnZ2VyKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpOwogICAgICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZShGaWVsZHMuJFJlY3VycmVuY2VMaW1pdERpdik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgVGFyZ2V0TlMuUmVjdXJyaW5nSW5pdChGaWVsZHMpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVR5cGUub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBSZWNJbml0KEZpZWxkcyk7CiAgICAgICAgfSkudHJpZ2dlcignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIE5vdGlmaWNhdGlvbkluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBGaWVsZHMgLSBBcnJheSB3aXRoIHJlZmVyZW5jZXMgdG8gcmVtaW5kZXIgZmllbGRzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kTm90aWZpY2F0aW9uIC0gZHJvcCBkb3duIHdpdGggc3lzdGVtIG5vdGlmaWNhdGlvbiBzZWxlY3Rpb24uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYgLSBjdXN0b20gc2VsZWN0aW9uIG9mIHN5c3RlbSBub3RpZmljYXRpb24gZGF0ZQogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRoZSByZW1pbmRlciBzZWN0aW9uIGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5Ob3RpZmljYXRpb25Jbml0ID0gZnVuY3Rpb24gKEZpZWxkcykgewogICAgICAgIHZhciBOb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYgPSBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0Rpdi5hdHRyKCdpZCcpOwoKICAgICAgICBpZiAoRmllbGRzLiROb3RpZmljYXRpb25UZW1wbGF0ZS52YWwoKSAhPT0gJ0N1c3RvbScpIHsKCiAgICAgICAgICAgIC8vIGhpZGUgdGhlIGN1c3RvbSBmaWVsZHMKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYuaGlkZSgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgIC8vIGN1c3RvbSBmaWVsZCBpcyBuZWVkZWQKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYuc2hvdygpOwoKICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBtb2Rlcm4gZmllbGRzIG9uIGN1c3RvbSBzZWxlY3Rpb24KICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5Jbml0U2VsZWN0KCQoJ3NlbGVjdC5Nb2Rlcm5pemUnKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBkaXNhYmxlIGVuYWJsZSB0aGUgZGlmZmVyZW50IGN1c3RvbSBmaWVsZHMKICAgICAgICBpZiAoRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0LnByb3AoJ2NoZWNrZWQnKSkgewoKICAgICAgICAgICAgLy8gZW5hYmxlIHJlbGF0aXZlIGRhdGUgZmllbGRzCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dC52YWwoMSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkucHJvcCgncmVhZG9ubHknLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0LnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHRoZSBjdXN0b20gZGF0ZSB0aW1lIGZpZWxkcwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQudmFsKCcnKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZURheS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGgucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVllYXIucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUhvdXIucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1pbnV0ZS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgIC8vIGVuYWJsZSB0aGUgY3VzdG9tIGRhdGUgdGltZSBpbnB1dAogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQudmFsKDEpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQucHJvcCgnY2hlY2tlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lRGF5LnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGgucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVZZWFyLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSG91ci5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1pbnV0ZS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKCiAgICAgICAgICAgIC8vIGRpc2FibGUgcmVsYXRpdmUgZGF0ZSBmaWVsZHMKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0LnZhbCgnJyk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50LnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkucHJvcCgncmVhZG9ubHknLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBUT0RPOiBXb3JrYXJvdW5kIGZvciBJbnB1dEZpZWxkcyBidWcgaW4gdGhlIGZyYW1ld29yayAoZGlzYWJsZWQgYXR0cmlidXRlIG5vdCBjaGVja2VkIGFmdGVyIGluaXRpYWxpemF0aW9uKQogICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuRGVhY3RpdmF0ZSgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihOb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYpKTsKICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdikpOwoKICAgICAgICAvLyBSZWdpc3RlciBjaGFuZ2UgZXZlbnQgaGFuZGxlcgogICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uVGVtcGxhdGUub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBUYXJnZXROUy5Ob3RpZmljYXRpb25Jbml0KEZpZWxkcyk7CiAgICAgICAgfSk7CgogICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dC5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyBoYW5kbGUgcmFkaW8gYnV0dG9ucwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQucHJvcCgnY2hlY2tlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKCiAgICAgICAgICAgIC8vIHByb2Nlc3MgY2hhbmdlcwogICAgICAgICAgICBUYXJnZXROUy5Ob3RpZmljYXRpb25Jbml0KEZpZWxkcyk7CiAgICAgICAgfSk7CgogICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvLyBoYW5kbGUgcmFkaW8gYnV0dG9ucwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQucHJvcCgnY2hlY2tlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKCiAgICAgICAgICAgIC8vIHByb2Nlc3MgY2hhbmdlcwogICAgICAgICAgICBUYXJnZXROUy5Ob3RpZmljYXRpb25Jbml0KEZpZWxkcyk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBUZWFtSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRUZWFtSURPYmogLSBmaWVsZCB3aXRoIGxpc3Qgb2YgdGVhbXMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFJlc291cmNlSURPYmogLSBmaWVsZCB3aXRoIGxpc3Qgb2YgcmVzb3VyY2VzLgogICAgICogQHBhcmFtIHtTdHJpbmd9IENoYWxsZW5nZVRva2VuIC0gVXNlciBjaGFsbGVuZ2UgdG9rZW4uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFRlYW1WYWx1ZU9iaiAtIGZpZWxkIHdpdGggcmVhZCBvbmx5IHZhbHVlcyBmb3IgdGVhbS4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkUmVzb3VyY2VWYWx1ZU9iaiAtIGZpZWxkIHdpdGggcmVhZCBvbmx5IHZhbHVlcyBmb3IgcmVzb3VyY2VzLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRlYW0gZmllbGRzIGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5UZWFtSW5pdCA9IGZ1bmN0aW9uICgkVGVhbUlET2JqLCAkUmVzb3VyY2VJRE9iaiwgQ2hhbGxlbmdlVG9rZW4sICRUZWFtVmFsdWVPYmosICRSZXNvdXJjZVZhbHVlT2JqKSB7CiAgICAgICAgJFRlYW1JRE9iai5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBDaGFsbGVuZ2VUb2tlbiwKICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ1RlYW1Vc2VyTGlzdCcsCiAgICAgICAgICAgICAgICBUZWFtSUQ6ICRUZWFtSURPYmoudmFsKCkKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRvZ2dsZUFKQVhMb2FkZXIoJFJlc291cmNlSURPYmosIHRydWUpOwoKICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICBEYXRhLAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFNlbGVjdGVkSUQgPSAkUmVzb3VyY2VJRE9iai52YWwoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuVGVhbVVzZXJMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSZXNvdXJjZUlET2JqLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChSZXNwb25zZS5UZWFtVXNlckxpc3QsIGZ1bmN0aW9uIChJbmRleCwgVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBOZXdPcHRpb24gPSBuZXcgT3B0aW9uKFZhbHVlLCBJbmRleCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcndyaXRlIG9wdGlvbiB0ZXh0LCBiZWNhdXNlIG9mIHdyb25nIGh0bWwgcXVvdGluZyBvZiB0ZXh0IGNvbnRlbnQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoVGhpcyBpcyBuZWVkZWQgZm9yIElFLikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld09wdGlvbi5pbm5lckhUTUwgPSBWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHNlbGVjdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNlbGVjdGVkSUQgJiYgU2VsZWN0ZWRJRC5pbmRleE9mKEluZGV4KSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3T3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVzb3VyY2VJRE9iai5hcHBlbmQoTmV3T3B0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGN1c3RvbSByZWRyYXcgZXZlbnQgZm9yIElucHV0RmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgICRSZXNvdXJjZUlET2JqLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFRvZ2dsZUFKQVhMb2FkZXIoJFJlc291cmNlSURPYmosIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9KTsKCiAgICAgICAgZnVuY3Rpb24gQ29sbGFwc2VWYWx1ZXMoJFZhbHVlT2JqLCBWYWx1ZXMpIHsKICAgICAgICAgICAgJFZhbHVlT2JqLmh0bWwoJycpOwogICAgICAgICAgICAkLmVhY2goVmFsdWVzLCBmdW5jdGlvbiAoSW5kZXgsIFZhbHVlKSB7CiAgICAgICAgICAgICAgICB2YXIgQ291bnQgPSBWYWx1ZXMubGVuZ3RoOwoKICAgICAgICAgICAgICAgIGlmIChJbmRleCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICAkVmFsdWVPYmouaHRtbCgkVmFsdWVPYmouaHRtbCgpICsgVmFsdWUgKyAnPGJyPicpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZXMuc3BsaWNlKC1Db3VudCwgMik7CiAgICAgICAgICAgICAgICAgICAgJCgnPGEgLz4nKS5hdHRyKCdocmVmJywgJyMnKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0RpYWxvZ1Rvb2x0aXBMaW5rJykKICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQoJysnICsgKENvdW50LTIpICsgJyBtb3JlJykKICAgICAgICAgICAgICAgICAgICAgICAgLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRUb29sdGlwT2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1ggPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1kgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvb2x0aXBIVE1MID0gJzxwPicgKyBWYWx1ZXMuam9pbignPGJyPicpICsgJzwvcD4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50VmlzaWJsZUxlZnQgPSAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgKyAkKHdpbmRvdykud2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFZpc2libGVUb3AgPSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSArICQod2luZG93KS5oZWlnaHQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0WFBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RZUG9zaXRpb247CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgZXhpc3RpbmcgdG9vbHRpcHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5EaWFsb2dUb29sdGlwJykucmVtb3ZlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEV2ZW50LnBhZ2VYIHx8IEV2ZW50LnBhZ2VZKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWCA9IEV2ZW50LnBhZ2VYOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1kgPSBFdmVudC5wYWdlWTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRXZlbnQuY2xpZW50WCB8fCBFdmVudC5jbGllbnRZKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWCA9IEV2ZW50LmNsaWVudFggKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NZID0gRXZlbnQuY2xpZW50WSArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmNyZWFzZSBwb3NpdGlvbnMgc28gdGhlIHRvb2x0aXAgZG8gbm90IG92ZXJsYXAgd2l0aCBtb3VzZSBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NYICs9IDEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSArPSA1OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0b29sdGlwIG9iamVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmogPSAkKCc8ZGl2Lz4nKS5hZGRDbGFzcygnQXBwb2ludG1lbnRUb29sdGlwIERpYWxvZ1Rvb2x0aXAgSGlkZGVuJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2Zmc2V0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBQb3NZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBQb3NYCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaHRtbChUb29sdGlwSFRNTCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3NzKCd6LWluZGV4JywgNDAwMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3NzKCd3aWR0aCcsICdhdXRvJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJ2JvZHknKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgdG9wIHBvc2l0aW9uIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdFlQb3NpdGlvbiA9IFBvc1kgKyAkVG9vbHRpcE9iai5oZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMYXN0WVBvc2l0aW9uID4gRG9jdW1lbnRWaXNpYmxlVG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSA9IFBvc1kgLSAkVG9vbHRpcE9iai5oZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iai5jc3MoJ3RvcCcsIFBvc1kgKyAncHgnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgbGVmdCBwb3NpdGlvbiBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RYUG9zaXRpb24gPSBQb3NYICsgJFRvb2x0aXBPYmoud2lkdGgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMYXN0WFBvc2l0aW9uID4gRG9jdW1lbnRWaXNpYmxlTGVmdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1ggPSBQb3NYIC0gJFRvb2x0aXBPYmoud2lkdGgoKSAtIDMwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqLmNzcygnbGVmdCcsIFBvc1ggKyAncHgnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaG93IHRoZSB0b29sdGlwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iai5mYWRlSW4oJ2Zhc3QnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0b29sdGlwIG9uIGFueSBvdXRzaWRlIGNsaWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISQoRXZlbnQudGFyZ2V0KS5jbG9zZXN0KCcuRGlhbG9nVG9vbHRpcExpbmsnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5EaWFsb2dUb29sdGlwJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJFZhbHVlT2JqKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gQ29sbGFwc2UgcmVhZCBvbmx5IHZhbHVlcwogICAgICAgIGlmICgkVGVhbVZhbHVlT2JqLmxlbmd0aCkgewogICAgICAgICAgICBDb2xsYXBzZVZhbHVlcygkVGVhbVZhbHVlT2JqLCAkVGVhbVZhbHVlT2JqLmh0bWwoKS5zcGxpdCgnPGJyPicpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRSZXNvdXJjZVZhbHVlT2JqLmxlbmd0aCkgewogICAgICAgICAgICBDb2xsYXBzZVZhbHVlcygkUmVzb3VyY2VWYWx1ZU9iaiwgJFJlc291cmNlVmFsdWVPYmouaHRtbCgpLnNwbGl0KCc8YnI+JykpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBDYWxlbmRhclNldHRpbmdzSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcyAtIEhhc2ggd2l0aCBkaWZmZXJlbnQgY29uZmlnIG9wdGlvbnMuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzIC0gQXJyYXkgY29udGFpbmluZyBuYW1lcyBvZiB0aGUgY2FsbGJhY2tzLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLlByZWZTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBwcmVmZXJlbmNlcyBzdWJhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gLSBOYW1lIG9mIHRoZSBzY3JlZW4gKFJlc291cmNlT3ZlcnZpZXcpLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5DYWxlbmRhclNldHRpbmdzQnV0dG9uIC0gSUQgb2YgdGhlIHNldHRpbmdzIGJ1dHRvbi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc0RpYWxvZ0NvbnRhaW5lciAtIElEIG9mIHRoZSBzZXR0aW5ncyBkaWFsb2cgY29udGFpbmVyLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5DYWxlbmRhclNldHRpbmdzU2hvdyAtIFNob3cgdGhlIHNldHRpbmdzIGRpYWxvZyBpbW1lZGlhdGVseS4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBjYWxlbmRhciBzZXR0aW5ncyBiZWhhdmlvci4KICAgICAqLwogICAgZnVuY3Rpb24gQ2FsZW5kYXJTZXR0aW5nc0luaXQoUGFyYW1zKSB7CiAgICAgICAgdmFyICRDYWxlbmRhclNldHRpbmdzT2JqID0gJCgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc0J1dHRvbikpLAogICAgICAgICAgICAkQ2FsZW5kYXJTZXR0aW5nc0RpYWxvZyA9ICQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUGFyYW1zLkNhbGVuZGFyU2V0dGluZ3NEaWFsb2dDb250YWluZXIpKTsKCiAgICAgICAgLy8gQ2FsZW5kYXIgc2V0dGluZ3MgYnV0dG9uCiAgICAgICAgJENhbGVuZGFyU2V0dGluZ3NPYmoub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coJENhbGVuZGFyU2V0dGluZ3NEaWFsb2csIENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1NldHRpbmdzJyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUsCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zU2F2ZScpLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogJ1ByaW1hcnknLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRTaG93bkFwcG9pbnRtZW50cyA9ICQoJyNTaG93bkFwcG9pbnRtZW50cycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBQYXJhbXMuQ2hhbGxlbmdlVG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIDogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLlByZWZTdWJhY3Rpb24gPyBQYXJhbXMuQ2FsbGJhY2tzLlByZWZTdWJhY3Rpb24gOiAnVXBkYXRlUHJlZmVyZW5jZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVydmlld1NjcmVlbjogUGFyYW1zLk92ZXJ2aWV3U2NyZWVuID8gUGFyYW1zLk92ZXJ2aWV3U2NyZWVuIDogJ0NhbGVuZGFyT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93bkFwcG9pbnRtZW50czogJFNob3duQXBwb2ludG1lbnRzLnZhbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuU2hvd1dhaXRpbmdEaWFsb2coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArICdBY3Rpb249QWdlbnRBcHBvaW50bWVudCcgKyAoUGFyYW1zLk92ZXJ2aWV3U2NyZWVuID8gUGFyYW1zLk92ZXJ2aWV3U2NyZWVuIDogJ0NhbGVuZGFyT3ZlcnZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwgdHJ1ZSk7CgogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gU2hvdyBzZXR0aW5ncyBkaWFsb2cgaW1tZWRpYXRlbHkKICAgICAgICBpZiAoUGFyYW1zLkNhbGVuZGFyU2V0dGluZ3NTaG93KSB7CiAgICAgICAgICAgICRDYWxlbmRhclNldHRpbmdzT2JqLnRyaWdnZXIoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgUmVzb3VyY2VTZXR0aW5nc0luaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMgLSBIYXNoIHdpdGggZGlmZmVyZW50IGNvbmZpZyBvcHRpb25zLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcyAtIEFycmF5IGNvbnRhaW5pbmcgbmFtZXMgb2YgdGhlIGNhbGxiYWNrcy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiAtIE5hbWUgb2YgdGhlIGVkaXQgYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIC0gTmFtZSBvZiB0aGUgcHJlZmVyZW5jZXMgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLk92ZXJ2aWV3U2NyZWVuIC0gTmFtZSBvZiB0aGUgc2NyZWVuIChSZXNvdXJjZU92ZXJ2aWV3KS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMuUmVzb3VyY2VzIC0gT2JqZWN0IHdpdGggcmVzb3VyY2VzIHBhcmFtZXRlcnMuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLlJlc291cmNlcy5SZXNvdXJjZVNldHRpbmdzQnV0dG9uIC0gSUQgb2YgdGhlIGVsZW1lbnQgZm9yIHNldHRpbmdzIGJ1dHRvbi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuUmVzb3VyY2VzLlJlc291cmNlU2V0dGluZ3NEaWFsb2dDb250YWluZXIgLSBJRCBvZiB0aGUgZWxlbWVudCB3aXRoIGRpYWxvZyBjb250ZW50LgogICAgICogQHBhcmFtIHtCb29sZWFufSBQYXJhbXMuUmVzb3VyY2VzLlJlc3RvcmVEZWZhdWx0U2V0dGluZ3MgLSB3aGV0aGVyIHRvIGRpc3BsYXkgcmVzdG9yZSBzZXR0aW5ncyBidXR0b24uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgcmVzb3VyY2Ugc2V0dGluZ3MgYmVoYXZpb3IuCiAgICAgKi8KICAgIGZ1bmN0aW9uIFJlc291cmNlU2V0dGluZ3NJbml0KFBhcmFtcykgewogICAgICAgIHZhciAkUmVzb3VyY2VTZXR0aW5nc09iaiA9ICQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUGFyYW1zLlJlc291cmNlcy5SZXNvdXJjZVNldHRpbmdzQnV0dG9uKSksCiAgICAgICAgICAgICRSZXNvdXJjZVNldHRpbmdzRGlhbG9nID0gJCgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihQYXJhbXMuUmVzb3VyY2VzLlJlc291cmNlU2V0dGluZ3NEaWFsb2dDb250YWluZXIpKSwKICAgICAgICAgICAgJFJlc3RvcmVTZXR0aW5nc09iajsKCiAgICAgICAgLy8gUmVzb3VyY2Ugc2V0dGluZ3MgYnV0dG9uCiAgICAgICAgJFJlc291cmNlU2V0dGluZ3NPYmoub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coJFJlc291cmNlU2V0dGluZ3NEaWFsb2csIENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1NldHRpbmdzJyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUsCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zU2F2ZScpLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogJ1ByaW1hcnknLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRMaXN0Q29udGFpbmVyID0gJCgnLkFsbG9jYXRpb25MaXN0Q29udGFpbmVyJykuZmluZCgnLkFzc2lnbmVkRmllbGRzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvd25SZXNvdXJjZXMgPSBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogUGFyYW1zLkNoYWxsZW5nZVRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiA/IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiA6ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIDogJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IFBhcmFtcy5PdmVydmlld1NjcmVlbiA/IFBhcmFtcy5PdmVydmlld1NjcmVlbiA6ICdSZXNvdXJjZU92ZXJ2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbUlEOiAkKCcjVGVhbScpLnZhbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNKUXVlcnlPYmplY3QoJExpc3RDb250YWluZXIpICYmICRMaXN0Q29udGFpbmVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCgkTGlzdENvbnRhaW5lci5maW5kKCdsaScpLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvd25SZXNvdXJjZXMucHVzaCgkKHRoaXMpLmF0dHIoJ2RhdGEtZmllbGRuYW1lJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5TaG93blJlc291cmNlcyA9IEpTT04uc3RyaW5naWZ5KFNob3duUmVzb3VyY2VzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuU2hvd1dhaXRpbmdEaWFsb2coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwgdHJ1ZSk7CgogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLlNldEFsbG9jYXRpb25MaXN0KCk7CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFJlc3RvcmUgc2V0dGluZ3MgYnV0dG9uCiAgICAgICAgaWYgKFBhcmFtcy5SZXNvdXJjZXMuUmVzdG9yZURlZmF1bHRTZXR0aW5ncykgewogICAgICAgICAgICAkUmVzdG9yZVNldHRpbmdzT2JqID0gJCgnPGEgLz4nKS5hdHRyKCdpZCcsICdSZXN0b3JlRGVmYXVsdFNldHRpbmdzJykKICAgICAgICAgICAgICAgIC5hdHRyKCdocmVmJywgJyMnKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zUmVzdG9yZScpKQogICAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8aSAvPicpLmFkZENsYXNzKCdmYSBmYS10cmFzaCcpKTsKCiAgICAgICAgICAgIC8vIEFkZCBpdCB0byB0aGUgY29sdW1uIGhlYWRlcgogICAgICAgICAgICAkKCd0ci5mYy1zdXBlciArIHRyIC5mYy1jZWxsLWNvbnRlbnQnKS5hcHBlbmQoJFJlc3RvcmVTZXR0aW5nc09iaik7CgogICAgICAgICAgICAkUmVzdG9yZVNldHRpbmdzT2JqLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogUGFyYW1zLkNoYWxsZW5nZVRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiA/IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiA6ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5QcmVmU3ViYWN0aW9uIDogJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IFBhcmFtcy5PdmVydmlld1NjcmVlbiA/IFBhcmFtcy5PdmVydmlld1NjcmVlbiA6ICdSZXNvdXJjZU92ZXJ2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgUmVzdG9yZURlZmF1bHRTZXR0aW5nczogJ1Nob3duUmVzb3VyY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgVGVhbUlEOiAkKCcjVGVhbScpLnZhbCgpCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIEV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBUb2dnbGVBSkFYTG9hZGVyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWxlbWVudCAtIE9iamVjdCByZWZlcmVuY2Ugb2YgdGhlIGZpZWxkIHdoaWNoIGlzIHVwZGF0ZWQKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gU2hvdyAtIFNob3cgb3IgaGlkZSB0aGUgQUpBWCBsb2FkZXIgaW1hZ2UKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBTaG93cyBhbmQgaGlkZXMgYW4gYWpheCBsb2FkZXIgZm9yIGV2ZXJ5IGVsZW1lbnQgd2hpY2ggaXMgdXBkYXRlcyB2aWEgYWpheC4KICAgICAqLwogICAgZnVuY3Rpb24gVG9nZ2xlQUpBWExvYWRlcigkRWxlbWVudCwgU2hvdykgewogICAgICAgIHZhciAkTG9hZGVyID0gJCgnI0FKQVhMb2FkZXInICsgJEVsZW1lbnQuYXR0cignaWQnKSksCiAgICAgICAgICAgIExvYWRlckhUTUwgPSAnPHNwYW4gaWQ9IkFKQVhMb2FkZXInICsgJEVsZW1lbnQuYXR0cignaWQnKSArICciIGNsYXNzPSJBSkFYTG9hZGVyIj48L3NwYW4+JzsKCiAgICAgICAgLy8gRWxlbWVudCBub3QgcHJlc2VudAogICAgICAgIGlmICghJEVsZW1lbnQubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIFNob3cgb3IgaGlkZSB0aGUgbG9hZGVyCiAgICAgICAgaWYgKFNob3cpIHsKICAgICAgICAgICAgaWYgKCEkTG9hZGVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJEVsZW1lbnQuYWZ0ZXIoTG9hZGVySFRNTCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkTG9hZGVyLnNob3coKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkTG9hZGVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJExvYWRlci5oaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBQbHVnaW5Jbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFBsdWdpbkZpZWxkcyAtIGZpZWxkcyB3aXRoIGRpZmZlcmVudCBwbHVnaW4gc2VhcmNoZXMuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gQ2hhbGxlbmdlVG9rZW4gLSBVc2VyIGNoYWxsZW5nZSB0b2tlbi4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBwbHVnaW4gZmllbGRzIGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5QbHVnaW5Jbml0ID0gZnVuY3Rpb24gKCRQbHVnaW5GaWVsZHMsIENoYWxsZW5nZVRva2VuKSB7CgogICAgICAgIGZ1bmN0aW9uIEluaXRSZW1vdmVCdXR0b25zKCkgewogICAgICAgICAgICAkKCcuUmVtb3ZlQnV0dG9uJykub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgJFJlbW92ZU9iaiA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgUGx1Z2luS2V5ID0gJFJlbW92ZU9iai5kYXRhKCdwbHVnaW5LZXknKSwKICAgICAgICAgICAgICAgICAgICAkUGx1Z2luRGF0YU9iaiA9ICQoJyNQbHVnaW5fJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBsdWdpbktleSkpLAogICAgICAgICAgICAgICAgICAgIFBsdWdpbkRhdGEgPSBKU09OLnBhcnNlKCRQbHVnaW5EYXRhT2JqLnZhbCgpKSwKICAgICAgICAgICAgICAgICAgICBMaW5rSUQgPSAkUmVtb3ZlT2JqLmRhdGEoJ2xpbmtJZCcpLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgJFBhcmVudCA9ICRSZW1vdmVPYmoucGFyZW50KCk7CgogICAgICAgICAgICAgICAgUGx1Z2luRGF0YS5zcGxpY2UoUGx1Z2luRGF0YS5pbmRleE9mKExpbmtJRCksIDEpOwogICAgICAgICAgICAgICAgJFBsdWdpbkRhdGFPYmoudmFsKEpTT04uc3RyaW5naWZ5KFBsdWdpbkRhdGEpKTsKCiAgICAgICAgICAgICAgICAkUGFyZW50LnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBBZGRMaW5rKFBsdWdpbktleSwgUGx1Z2luVVJMLCBMaW5rSUQsIExpbmtOYW1lKSB7CiAgICAgICAgICAgIHZhciAkUGx1Z2luQ29udGFpbmVyT2JqID0gJCgnI1BsdWdpbkNvbnRhaW5lcl8nICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUGx1Z2luS2V5KSksCiAgICAgICAgICAgICAgICAkUGx1Z2luRGF0YU9iaiA9ICQoJyNQbHVnaW5fJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBsdWdpbktleSkpLAogICAgICAgICAgICAgICAgUGx1Z2luRGF0YSA9IEpTT04ucGFyc2UoJFBsdWdpbkRhdGFPYmoudmFsKCkpLAogICAgICAgICAgICAgICAgJEV4aXN0aW5nTGlua3MgPSAkUGx1Z2luQ29udGFpbmVyT2JqLmZpbmQoJy5MaW5rXycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihMaW5rSUQpKSwKICAgICAgICAgICAgICAgICRMaW5rQ29udGFpbmVyT2JqID0gJCgnPGRpdiAvPicpLAogICAgICAgICAgICAgICAgJFVSTE9iaiA9ICQoJzxhIC8+JyksCiAgICAgICAgICAgICAgICAkUmVtb3ZlT2JqID0gJCgnPGEgLz4nKSwKICAgICAgICAgICAgICAgIExpbmtVUkwgPSBQbHVnaW5VUkwucmVwbGFjZSgnJXMnLCBMaW5rSUQpOwoKICAgICAgICAgICAgaWYgKCRFeGlzdGluZ0xpbmtzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgUGx1Z2luRGF0YS5wdXNoKExpbmtJRCk7CiAgICAgICAgICAgICRQbHVnaW5EYXRhT2JqLnZhbChKU09OLnN0cmluZ2lmeShQbHVnaW5EYXRhKSk7CgogICAgICAgICAgICAkTGlua0NvbnRhaW5lck9iai5hZGRDbGFzcygnTGlua18nICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoTGlua0lEKSk7CgogICAgICAgICAgICAkVVJMT2JqLmF0dHIoJ2hyZWYnLCBMaW5rVVJMKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RhcmdldCcsICdfYmxhbmsnKQogICAgICAgICAgICAgICAgLnRleHQoTGlua05hbWUpCiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJExpbmtDb250YWluZXJPYmopOwoKICAgICAgICAgICAgJFJlbW92ZU9iai5hdHRyKCdocmVmJywgJyMnKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdSZW1vdmVCdXR0b24nKQogICAgICAgICAgICAgICAgLmRhdGEoJ3BsdWdpbktleScsIFBsdWdpbktleSkKICAgICAgICAgICAgICAgIC5kYXRhKCdsaW5rSWQnLCBMaW5rSUQpCiAgICAgICAgICAgICAgICAuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhIGZhLW1pbnVzLXNxdWFyZS1vJykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkTGlua0NvbnRhaW5lck9iaik7CgogICAgICAgICAgICAkTGlua0NvbnRhaW5lck9iai5hcHBlbmRUbygkUGx1Z2luQ29udGFpbmVyT2JqKTsKICAgICAgICAgICAgSW5pdFJlbW92ZUJ1dHRvbnMoKTsKICAgICAgICB9CgogICAgICAgICRQbHVnaW5GaWVsZHMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkRWxlbWVudCA9ICQodGhpcyksCiAgICAgICAgICAgICAgICBQbHVnaW5LZXkgPSAkRWxlbWVudC5kYXRhKCdwbHVnaW5LZXknKSwKICAgICAgICAgICAgICAgIFBsdWdpblVSTCA9ICRFbGVtZW50LmRhdGEoJ3BsdWdpblVybCcpOwoKICAgICAgICAgICAgLy8gU2tpcCBhbHJlYWR5IGluaXRpYWxpemVkIGZpZWxkcwogICAgICAgICAgICBpZiAoJEVsZW1lbnQuaGFzQ2xhc3MoJ3VpLWF1dG9jb21wbGV0ZS1pbnB1dCcpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEVsZW1lbnQuYXV0b2NvbXBsZXRlKHsKICAgICAgICAgICAgICAgIG1pbkxlbmd0aDogMiwKICAgICAgICAgICAgICAgIGRlbGF5OiA1MDAsCiAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uIChSZXF1ZXN0LCBSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBVUkwgPSBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50QUpBWE51bWJlciA9ICsrQUpBWENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogQ2hhbGxlbmdlVG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50UGx1Z2luU2VhcmNoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpbktleTogUGx1Z2luS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVybTogUmVxdWVzdC50ZXJtICsgJyonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4UmVzdWx0czogMjAKICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbChVUkwsIERhdGEsIGZ1bmN0aW9uIChSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIERhdGEgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSByZXN1bHQgaXMgZnJvbSB0aGUgbGF0ZXN0IGFqYXggcmVxdWVzdAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQUpBWENvdW50ZXIgIT09IEN1cnJlbnRBSkFYTnVtYmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChSZXN1bHQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAgdGhpcy5LZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuVmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UoRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0OiBmdW5jdGlvbiAoRXZlbnQsIFVJKSB7CiAgICAgICAgICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICBBZGRMaW5rKFBsdWdpbktleSwgUGx1Z2luVVJMLCBVSS5pdGVtLmtleSwgVUkuaXRlbS5sYWJlbCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgIEluaXRSZW1vdmVCdXR0b25zKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBFZGl0QXBwb2ludG1lbnQKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBEYXRhIC0gSGFzaCB3aXRoIGNhbGwgYW5kIGFwcG9pbnRtZW50IGRhdGEuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuQ2FsZW5kYXJJRCAtIEFwcG9pbnRtZW50IGNhbGVuZGFyIElELgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkFwcG9pbnRtZW50SUQgLSBBcHBvaW50bWVudCBJRC4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5BY3Rpb24gLSBFZGl0IGFjdGlvbi4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdWJhY3Rpb24gLSBFZGl0IHN1YmFjdGlvbi4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5UaXRsZSAtIEFwcG9pbnRtZW50IHRpdGxlLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkRlc2NyaXB0aW9uIC0gQXBwb2ludG1lbnQgZGVzY3JpcHRpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuTG9jYXRpb24gLSBBcHBvaW50bWVudCBsb2NhdGlvbi4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdGFydFllYXIgLSBBcHBvaW50bWVudCBzdGFydCB5ZWFyLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLlN0YXJ0TW9udGggLSBBcHBvaW50bWVudCBzdGFydCBtb250aC4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdGFydERheSAtIEFwcG9pbnRtZW50IHN0YXJ0IGRheS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdGFydEhvdXIgLSBBcHBvaW50bWVudCBzdGFydCBob3VyLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLlN0YXJ0TWludXRlIC0gQXBwb2ludG1lbnQgc3RhcnQgbWludXRlLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkVuZFllYXIgLSBBcHBvaW50bWVudCBlbmQgeWVhci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5FbmRNb250aCAtIEFwcG9pbnRtZW50IGVuZCBtb250aC4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5FbmREYXkgLSBBcHBvaW50bWVudCBlbmQgZGF5LgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkVuZEhvdXIgLSBBcHBvaW50bWVudCBlbmQgaG91ci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5FbmRNaW51dGUgLSBBcHBvaW50bWVudCBlbmQgbWludXRlLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkFsbERheSAtIElzIGFwcG9pbnRtZW50IGFuIGFsbC1kYXkgYXBwb2ludG1lbnQgKDB8MSk/CiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2Qgc3VibWl0cyBhbiBlZGl0IGFwcG9pbnRtZW50IGNhbGwgdG8gdGhlIGJhY2tlbmQgYW5kIHJlZnJlc2hlcyB0aGUgdmlldy4KICAgICAgKi8KICAgIFRhcmdldE5TLkVkaXRBcHBvaW50bWVudCA9IGZ1bmN0aW9uIChEYXRhKSB7CiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhckFnZW5kYU92ZXJ2aWV3JykpIHsKICAgICAgICAgICAgJCgnLk92ZXJ2aWV3Q29udHJvbCcpLmFkZENsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgfQoKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICBEYXRhLAogICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnI2NhbGVuZGFyJykuZnVsbENhbGVuZGFyKCdyZWZldGNoRXZlbnRzJyk7CgogICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBkaWFsb2cKICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nOnZpc2libGUnKSk7CgogICAgICAgICAgICAgICAgICAgIC8vIFJlbG9hZCBwYWdlIGlmIG5lY2Vzc2FyeQogICAgICAgICAgICAgICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJBZ2VuZGFPdmVydmlldycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoUmVzcG9uc2UuRXJyb3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9OwoKICAgIHJldHVybiBUYXJnZXROUzsKfShDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIgfHwge30pKTsK
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTYgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyAtLQovLyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQovLyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQWdlbnQgPSBDb3JlLkFnZW50IHx8IHt9OwpDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIgPSBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIgfHwge307CgovKioKICogQG5hbWVzcGFjZSBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuTWFuYWdlCiAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICogQGF1dGhvciBPVFJTIEFHCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBhcHBvaW50bWVudCBjYWxlbmRhciBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4KICovCkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5NYW5hZ2UgPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgdmFyIFJ1bGVDb3VudCA9IDA7CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0VGlja2V0QXBwb2ludG1lbnRzCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLk1hbmFnZQogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBJbml0aWFsUnVsZUNvdW50IC0gRnJvbSB3aGljaCBydWxlIHRoZSBjb3VudCBzaG91bGQgc3RhcnQgKG9wdGlvbmFsKQogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluaXRpYWxpemUgdGhlIHRpY2tldCBhcHBvaW50bWVudCBmaWVsZHMgYmVoYXZpb3IuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXRUaWNrZXRBcHBvaW50bWVudHMgPSBmdW5jdGlvbiAoSW5pdGlhbFJ1bGVDb3VudCkgewogICAgICAgIHZhciAkQWRkUnVsZU9iaiA9ICQoJyNBZGRSdWxlQnV0dG9uJyksCiAgICAgICAgICAgICRUZW1wbGF0ZU9iaiA9ICQoJyNUaWNrZXRBcHBvaW50bWVudFJ1bGVzVGVtcGxhdGUnKTsKCiAgICAgICAgaWYgKEluaXRpYWxSdWxlQ291bnQpIHsKICAgICAgICAgICAgUnVsZUNvdW50ID0gcGFyc2VJbnQoSW5pdGlhbFJ1bGVDb3VudCwgMTApOwogICAgICAgIH0KCiAgICAgICAgJEFkZFJ1bGVPYmoub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBSdWxlSUQgPSArK1J1bGVDb3VudCwKICAgICAgICAgICAgICAgICRSdWxlT2JqID0gJCgkVGVtcGxhdGVPYmouaHRtbCgpKSwKICAgICAgICAgICAgICAgICRDb250YWluZXJPYmogPSAkQWRkUnVsZU9iai5wYXJlbnRzKCdmaWVsZHNldCcpOwoKICAgICAgICAgICAgJFJ1bGVPYmoKCiAgICAgICAgICAgICAgICAvLyBSdWxlIG51bWJlcgogICAgICAgICAgICAgICAgLmZpbmQoJy5SdWxlTnVtYmVyJykKICAgICAgICAgICAgICAgIC50ZXh0KFJ1bGVJRCkKICAgICAgICAgICAgICAgIC5lbmQoKQoKICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGRhdGUgZmllbGQgYW5kIGxhYmVsCiAgICAgICAgICAgICAgICAuZmluZCgnI1N0YXJ0RGF0ZScpCiAgICAgICAgICAgICAgICAuYXR0cignaWQnLCAnU3RhcnREYXRlXycgKyBSdWxlSUQpCiAgICAgICAgICAgICAgICAuYXR0cignbmFtZScsICdTdGFydERhdGVfJyArIFJ1bGVJRCkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKQogICAgICAgICAgICAgICAgLnByZXYoJ2xhYmVsJykKICAgICAgICAgICAgICAgIC5hdHRyKCdmb3InLCAnU3RhcnREYXRlXycgKyBSdWxlSUQpCiAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgLmVuZCgpCgogICAgICAgICAgICAgICAgLy8gRW5kIGRhdGUgZmllbGQgYW5kIGxhYmVsCiAgICAgICAgICAgICAgICAuZmluZCgnI0VuZERhdGUnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ0VuZERhdGVfJyArIFJ1bGVJRCkKICAgICAgICAgICAgICAgIC5hdHRyKCduYW1lJywgJ0VuZERhdGVfJyArIFJ1bGVJRCkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKQogICAgICAgICAgICAgICAgLnByZXYoJ2xhYmVsJykKICAgICAgICAgICAgICAgIC5hdHRyKCdmb3InLCAnRW5kRGF0ZV8nICsgUnVsZUlEKQogICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgIC5lbmQoKQoKICAgICAgICAgICAgICAgIC8vIFF1ZXVlcyBmaWVsZCwgbGFiZWwgYW5kIGVycm9yCiAgICAgICAgICAgICAgICAuZmluZCgnI1F1ZXVlSUQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ1F1ZXVlSURfJyArIFJ1bGVJRCkKICAgICAgICAgICAgICAgIC5hdHRyKCduYW1lJywgJ1F1ZXVlSURfJyArIFJ1bGVJRCkKICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgLmZpbmQoJ2xhYmVsW2Zvcj0iUXVldWVJRCJdJykKICAgICAgICAgICAgICAgIC5hdHRyKCdmb3InLCAnUXVldWVJRF8nICsgUnVsZUlEKQogICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAuZmluZCgnI1F1ZXVlSURFcnJvcicpCiAgICAgICAgICAgICAgICAuYXR0cignaWQnLCAnUXVldWVJRF8nICsgUnVsZUlEICsgJ0Vycm9yJykKICAgICAgICAgICAgICAgIC5lbmQoKQoKICAgICAgICAgICAgICAgIC5pbnNlcnRCZWZvcmUoJENvbnRhaW5lck9iaik7CgogICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKCRSdWxlT2JqKTsKCiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgcnVsZSBidXR0b25zCiAgICAgICAgICAgIFRhcmdldE5TLkluaXRUaWNrZXRBcHBvaW50bWVudFJ1bGUoUnVsZUlELCAkUnVsZU9iaik7CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0VGlja2V0QXBwb2ludG1lbnRSdWxlCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLk1hbmFnZQogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBSdWxlSUQgLSBJRCBvZiB0aGUgcnVsZSAoMSwgMiwgMy4uLikKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkUnVsZU9iaiAtIFJ1bGUgb2JqZWN0CiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgSW5pdGlhbGl6ZSB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUgYnV0dG9ucyBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdFRpY2tldEFwcG9pbnRtZW50UnVsZSA9IGZ1bmN0aW9uIChSdWxlSUQsICRSdWxlT2JqKSB7CiAgICAgICAgdmFyICRSZW1vdmVPYmogPSAkUnVsZU9iai5maW5kKCdsZWdlbmQgLlJlbW92ZUJ1dHRvbicpLAogICAgICAgICAgICAkUmVtb3ZlUGFyYW1PYmogPSAkUnVsZU9iai5maW5kKCcuRmllbGQgPiAuUmVtb3ZlQnV0dG9uJyksCiAgICAgICAgICAgICRBZGRQYXJhbU9iaiA9ICRSdWxlT2JqLmZpbmQoJy5BZGRCdXR0b24nKSwKICAgICAgICAgICAgJFBhcmFtT2JqID0gJFJ1bGVPYmouZmluZCgnLlNlYXJjaFBhcmFtcycpLAogICAgICAgICAgICAkVGVtcGxhdGVPYmogPSAkKCcjVGlja2V0QXBwb2ludG1lbnRTZWFyY2hQYXJhbVRlbXBsYXRlJyk7CgogICAgICAgICRQYXJhbU9iai52YWwoJFBhcmFtT2JqLmZpbmQoJ29wdGlvbjplbmFibGVkJykuZmlyc3QoKS5hdHRyKCd2YWx1ZScpKTsKCiAgICAgICAgJFJlbW92ZU9iai5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJFJ1bGVPYmoucmVtb3ZlKCk7CiAgICAgICAgICAgIFVwZGF0ZVJ1bGVDb3VudCgpOwoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAkUmVtb3ZlUGFyYW1PYmoub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkU2VhcmNoUGFyYW1PYmogPSAkKHRoaXMpLnBhcmVudCgpLAogICAgICAgICAgICAgICAgUGFyYW1OYW1lID0gJFNlYXJjaFBhcmFtT2JqLmZpbmQoJ2lucHV0LlNlYXJjaFBhcmFtJykuZGF0YSgncGFyYW0nKTsKCiAgICAgICAgICAgICRTZWFyY2hQYXJhbU9iai5yZW1vdmUoKTsKICAgICAgICAgICAgJFBhcmFtT2JqLmZpbmQoJ29wdGlvblt2YWx1ZT0iJyArIFBhcmFtTmFtZSArICciXScpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgLnZhbCgkUGFyYW1PYmouZmluZCgnb3B0aW9uOmVuYWJsZWQnKS5maXJzdCgpLmF0dHIoJ3ZhbHVlJykpCiAgICAgICAgICAgICAgICAudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgJEFkZFBhcmFtT2JqLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgJFNlYXJjaFBhcmFtT2JqID0gJCgkVGVtcGxhdGVPYmouaHRtbCgpKSwKICAgICAgICAgICAgICAgICRTZWFyY2hQYXJhbUNvbnRhaW5lck9iaiA9ICRSdWxlT2JqLmZpbmQoJy5TZWFyY2hQYXJhbXNDb250YWluZXInKSwKICAgICAgICAgICAgICAgICRSZW1vdmVQYXJhbU9iaiA9ICRTZWFyY2hQYXJhbU9iai5maW5kKCcuUmVtb3ZlQnV0dG9uJyksCiAgICAgICAgICAgICAgICBQYXJhbU5hbWUgPSAkUGFyYW1PYmoudmFsKCk7CgogICAgICAgICAgICBpZiAoIVBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW1PYmouZmluZCgnb3B0aW9uW3ZhbHVlPSInICsgUGFyYW1OYW1lICsgJyJdJykKICAgICAgICAgICAgICAgIC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpCiAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgIC52YWwoJFBhcmFtT2JqLmZpbmQoJ29wdGlvbjplbmFibGVkJykuZmlyc3QoKS5hdHRyKCd2YWx1ZScpKQogICAgICAgICAgICAgICAgLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJyk7CgogICAgICAgICAgICAkU2VhcmNoUGFyYW1PYmoKCiAgICAgICAgICAgICAgICAvLyBMYWJlbAogICAgICAgICAgICAgICAgLmZpbmQoJ2xhYmVsJykKICAgICAgICAgICAgICAgIC5hdHRyKCdmb3InLCAnU2VhcmNoUGFyYW1fJyArIFJ1bGVJRCArICdfJyArIFBhcmFtTmFtZSkKICAgICAgICAgICAgICAgIC5maW5kKCdzcGFuJykKICAgICAgICAgICAgICAgIC5hZnRlcignICcgKyBQYXJhbU5hbWUgKyAnOicpCiAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgIC5lbmQoKQoKICAgICAgICAgICAgICAgIC8vIElucHV0IGZpZWxkIGFuZCBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICAuZmluZCgnaW5wdXQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ1NlYXJjaFBhcmFtXycgKyBSdWxlSUQgKyAnXycgKyBQYXJhbU5hbWUpCiAgICAgICAgICAgICAgICAuYXR0cignbmFtZScsICdTZWFyY2hQYXJhbV8nICsgUnVsZUlEICsgJ18nICsgUGFyYW1OYW1lKQogICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAuZmluZCgnI1NlYXJjaFBhcmFtRXJyb3InKQogICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ1NlYXJjaFBhcmFtXycgKyBSdWxlSUQgKyAnXycgKyBQYXJhbU5hbWUgKyAnRXJyb3InKQogICAgICAgICAgICAgICAgLmVuZCgpCgogICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRTZWFyY2hQYXJhbUNvbnRhaW5lck9iaik7CgogICAgICAgICAgICAgICAgJFJlbW92ZVBhcmFtT2JqLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICRTZWFyY2hQYXJhbU9iai5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1PYmouZmluZCgnb3B0aW9uW3ZhbHVlPSInICsgUGFyYW1OYW1lICsgJyJdJykKICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpCiAgICAgICAgICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgICAgICAgICAudmFsKCRQYXJhbU9iai5maW5kKCdvcHRpb246ZW5hYmxlZCcpLmZpcnN0KCkuYXR0cigndmFsdWUnKSkKICAgICAgICAgICAgICAgICAgICAgICAgLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJyk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIFVwZGF0ZVJ1bGVDb3VudCgpIHsKICAgICAgICB2YXIgJFJ1bGVOdW1iZXJPYmogPSAkKCcuUnVsZU51bWJlcjp2aXNpYmxlJyk7CgogICAgICAgICRSdWxlTnVtYmVyT2JqLmVhY2goZnVuY3Rpb24gKEluZGV4LCBFbGVtZW50KSB7CiAgICAgICAgICAgICQoRWxlbWVudCkudGV4dChJbmRleCArIDEpOwogICAgICAgIH0pOwoKICAgICAgICBSdWxlQ291bnQgPSAkUnVsZU51bWJlck9iai5sZW5ndGg7CiAgICB9CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5NYW5hZ2UgfHwge30pKTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgdmFyOjpwYWNrYWdlc2V0dXA6Ok9UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok5vdGlmaWNhdGlvbkV2ZW50JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAopOwoKPWhlYWQxIE5BTUUKCk9UUlNCdXNpbmVzcy5wbSAtIGNvZGUgdG8gZXhlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb2RlSW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlSW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPl9BcHBvaW50bWVudEZ1dHVyZVRhc2tzVXBkYXRlKCk7CiAgICAkU2VsZi0+X0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uQWRkKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVSZWluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHJlLWluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVJlaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVSZWluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+X0FwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKTsKICAgICRTZWxmLT5fQXBwb2ludG1lbnROb3RpZmljYXRpb25BZGQoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGUoKQoKcnVuIHRoZSBjb2RlIHVwZ3JhZGUgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGUoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5fQXBwb2ludG1lbnRGdXR1cmVUYXNrc1VwZGF0ZSgpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+X0FwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUoKTsKCiAgICByZXR1cm4gMTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWl0ZW0gX0FwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKQoKVXBkYXRlIHBvc3NpYmxlIGNoYW5nZXMgb24gdGhlIGNhbGVuZGFyIGFwcG9pbnRtZW50IGZ1dHVyZSB0YXNrcy4KCj1jdXQKCnN1YiBfQXBwb2ludG1lbnRGdXR1cmVUYXNrc1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGEgbG9jYWwgYXBwb2ludG1lbnQgb2JqZWN0CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CgogICAgIyB1cGRhdGUgdGhlIGZ1dHVyZSB0YXNrcwogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKTsKCiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCB1cGRhdGUgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCkKCkRlbGV0ZSBhbGwgY2FsZW5kYXIgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzLgoKPWN1dAoKc3ViIF9BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYSBsb2NhbCBhcHBvaW50bWVudCBvYmplY3QKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRGdXR1cmVUYXNrc0RlbGV0ZSgpOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IGRlbGV0ZSBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uQWRkKCkKCkFkZCBiYXNpYyBhcHBvaW50bWVudCBub3RpZmljYXRpb24gZm9yIHJlbWluZGVycy4KCj1jdXQKCnN1YiBfQXBwb2ludG1lbnROb3RpZmljYXRpb25BZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlQXBwb2ludG1lbnROb3RpZmljYXRpb25zID0gKAogICAgICAgICdBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UeXBlICAgICAgID0+IFsnQXBwb2ludG1lbnQnXSwKICAgICAgICAgICAgICAgIFZpc2libGVGb3JBZ2VudCAgICAgICAgPT4gWzFdLAogICAgICAgICAgICAgICAgVmlzaWJsZUZvckFnZW50VG9vbHRpcCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1lvdSB3aWxsIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZWFjaCB0aW1lIGEgcmVtaW5kZXIgdGltZSBpcyByZWFjaGVkIGZvciBvbmUgb2YgeW91ciBhcHBvaW50bWVudHMuJwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIEV2ZW50cyAgICAgICAgICAgICAgICA9PiBbJ0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uJ10sCiAgICAgICAgICAgICAgICBSZWNpcGllbnRzICAgICAgICAgICAgPT4gWydBcHBvaW50bWVudEFnZW50UmVhZFBlcm1pc3Npb25zJ10sCiAgICAgICAgICAgICAgICBTZW5kT25PdXRPZk9mZmljZSAgICAgPT4gWzFdLAogICAgICAgICAgICAgICAgVHJhbnNwb3J0cyAgICAgICAgICAgID0+IFsnRW1haWwnXSwKICAgICAgICAgICAgICAgIEFnZW50RW5hYmxlZEJ5RGVmYXVsdCA9PiBbJ0VtYWlsJ10sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gewogICAgICAgICAgICAgICAgJ2RlJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0JvZHknID0+ICdIYWxsbyAmbHQ7T1RSU19OT1RJRklDQVRJT05fUkVDSVBJRU5UX1VzZXJGaXJzdG5hbWUmZ3Q7LDxiciAvPgo8YnIgLz4KVGVybWluICZxdW90OyZsdDtPVFJTX0FQUE9JTlRNRU5UX1RJVExFJmd0OyZxdW90OyBoYXQgc2VpbmUgQmVuYWNocmljaHRpZ3VuZ3N6ZWl0IGVycmVpY2h0LjxiciAvPgo8YnIgLz4KQmVzY2hyZWlidW5nOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9ERVNDUklQVElPTiZndDs8YnIgLz4KU3RhbmRvcnQ6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0xPQ0FUSU9OJmd0OzxiciAvPgpLYWxlbmRlcjogPHNwYW4gc3R5bGU9ImNvbG9yOiAmbHQ7T1RSU19DQUxFTkRBUl9DT0xPUiZndDs7Ij7ilqA8L3NwYW4+ICZsdDtPVFJTX0NBTEVOREFSX0NBTEVOREFSTkFNRSZndDs8YnIgLz4KU3RhcnR6ZWl0cHVua3Q6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1NUQVJUVElNRSZndDs8YnIgLz4KRW5kemVpdHB1bmt0OiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9FTkRUSU1FJmd0OzxiciAvPgpHYW56dMOkZ2lnOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9BTExEQVkmZ3Q7PGJyIC8+CldpZWRlcmhvbHVuZzogJmx0O09UUlNfQVBQT0lOVE1FTlRfUkVDVVJSSU5HJmd0OzxiciAvPgo8YnIgLz4KPGEgaHJlZj0iJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDsiIHRpdGxlPSImbHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OyI+Jmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDs8L2E+PGJyIC8+CjxiciAvPgotLSAmbHQ7T1RSU19DT05GSUdfTm90aWZpY2F0aW9uU2VuZGVyTmFtZSZndDsnLAogICAgICAgICAgICAgICAgICAgICdDb250ZW50VHlwZScgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgJ1N1YmplY3QnICAgICA9PiAnRXJpbm5lcnVuZzogPE9UUlNfQVBQT0lOVE1FTlRfVElUTEU+JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZW4nID0+IHsKICAgICAgICAgICAgICAgICAgICAnQm9keScgPT4gJ0hpICZsdDtPVFJTX05PVElGSUNBVElPTl9SRUNJUElFTlRfVXNlckZpcnN0bmFtZSZndDssPGJyIC8+CjxiciAvPgphcHBvaW50bWVudCAmcXVvdDsmbHQ7T1RSU19BUFBPSU5UTUVOVF9USVRMRSZndDsmcXVvdDsgaGFzIHJlYWNoZWQgaXRzIG5vdGlmaWNhdGlvbiB0aW1lLjxiciAvPgo8YnIgLz4KRGVzY3JpcHRpb246ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0RFU0NSSVBUSU9OJmd0OzxiciAvPgpMb2NhdGlvbjogJmx0O09UUlNfQVBQT0lOVE1FTlRfTE9DQVRJT04mZ3Q7PGJyIC8+CkNhbGVuZGFyOiA8c3BhbiBzdHlsZT0iY29sb3I6ICZsdDtPVFJTX0NBTEVOREFSX0NPTE9SJmd0OzsiPuKWoDwvc3Bhbj4gJmx0O09UUlNfQ0FMRU5EQVJfQ0FMRU5EQVJOQU1FJmd0OzxiciAvPgpTdGFydCBkYXRlOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9TVEFSVFRJTUUmZ3Q7PGJyIC8+CkVuZCBkYXRlOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9FTkRUSU1FJmd0OzxiciAvPgpBbGwtZGF5OiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9BTExEQVkmZ3Q7PGJyIC8+ClJlcGVhdDogJmx0O09UUlNfQVBQT0lOVE1FTlRfUkVDVVJSSU5HJmd0OzxiciAvPgo8YnIgLz4KPGEgaHJlZj0iJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDsiIHRpdGxlPSImbHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OyI+Jmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDs8L2E+PGJyIC8+CjxiciAvPgotLSAmbHQ7T1RSU19DT05GSUdfTm90aWZpY2F0aW9uU2VuZGVyTmFtZSZndDsnLAogICAgICAgICAgICAgICAgICAgICdDb250ZW50VHlwZScgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgJ1N1YmplY3QnICAgICA9PiAnUmVtaW5kZXI6IDxPVFJTX0FQUE9JTlRNRU5UX1RJVExFPicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ3NyX0N5cmwnID0+IHsKICAgICAgICAgICAgICAgICAgICAnQm9keScgPT4gJ9CX0LTRgNCw0LLQviAmbHQ7T1RSU19OT1RJRklDQVRJT05fUkVDSVBJRU5UX1VzZXJGaXJzdG5hbWUmZ3Q7LDxiciAvPgo8YnIgLz4K0LLRgNC10LzQtSDRmNC1INC30LAg0L7QsdCw0LLQtdGI0YLQtdGa0LUg0YMg0LLQtdC30Lgg0YLQtdGA0LzQuNC90LAgJnF1b3Q7Jmx0O09UUlNfQVBQT0lOVE1FTlRfVElUTEUmZ3Q7JnF1b3Q7LjxiciAvPgo8YnIgLz4K0J7Qv9C40YE6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0RFU0NSSVBUSU9OJmd0OzxiciAvPgrQm9C+0LrQsNGG0LjRmNCwOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9MT0NBVElPTiZndDs8YnIgLz4K0JrQsNC70LXQvdC00LDRgDogPHNwYW4gc3R5bGU9ImNvbG9yOiAmbHQ7T1RSU19DQUxFTkRBUl9DT0xPUiZndDs7Ij7ilqA8L3NwYW4+ICZsdDtPVFJTX0NBTEVOREFSX0NBTEVOREFSTkFNRSZndDs8YnIgLz4K0JTQsNGC0YPQvCDQv9C+0YfQtdGC0LrQsDogJmx0O09UUlNfQVBQT0lOVE1FTlRfU1RBUlRUSU1FJmd0OzxiciAvPgrQlNCw0YLRg9C8INC60YDQsNGY0LA6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0VORFRJTUUmZ3Q7PGJyIC8+CtCm0LXQu9C+0LTQvdC10LLQvdC+OiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9BTExEQVkmZ3Q7PGJyIC8+CtCf0L7QvdCw0LLRmdCw0ZrQtTogJmx0O09UUlNfQVBQT0lOVE1FTlRfUkVDVVJSSU5HJmd0OzxiciAvPgo8YnIgLz4KPGEgaHJlZj0iJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDsiIHRpdGxlPSImbHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OyI+Jmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDs8L2E+PGJyIC8+CjxiciAvPgotLSAmbHQ7T1RSU19DT05GSUdfTm90aWZpY2F0aW9uU2VuZGVyTmFtZSZndDsnLAogICAgICAgICAgICAgICAgICAgICdDb250ZW50VHlwZScgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgJ1N1YmplY3QnICAgICA9PiAn0J/QvtC00YHQtdGC0L3QuNC6OiA8T1RSU19BUFBPSU5UTUVOVF9USVRMRT4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdzcl9MYXRuJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0JvZHknID0+ICdaZHJhdm8gJmx0O09UUlNfTk9USUZJQ0FUSU9OX1JFQ0lQSUVOVF9Vc2VyRmlyc3RuYW1lJmd0Oyw8YnIgLz4KPGJyIC8+CnZyZW1lIGplIHphIG9iYXZlxaF0ZW5qZSB1IHZlemkgdGVybWluYSAmcXVvdDsmbHQ7T1RSU19BUFBPSU5UTUVOVF9USVRMRSZndDsmcXVvdDsuPGJyIC8+CjxiciAvPgpPcGlzOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9ERVNDUklQVElPTiZndDs8YnIgLz4KTG9rYWNpamU6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0xPQ0FUSU9OJmd0OzxiciAvPgpLYWxlbmRhcjogPHNwYW4gc3R5bGU9ImNvbG9yOiAmbHQ7T1RSU19DQUxFTkRBUl9DT0xPUiZndDs7Ij7ilqA8L3NwYW4+ICZsdDtPVFJTX0NBTEVOREFSX0NBTEVOREFSTkFNRSZndDs8YnIgLz4KRGF0dW0gcG/EjWV0a2E6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1NUQVJUVElNRSZndDs8YnIgLz4KRGF0dW0ga3JhamE6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0VORFRJTUUmZ3Q7PGJyIC8+CkNlbG9kbmV2bm86ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0FMTERBWSZndDs8YnIgLz4KUG9uYXZsamFuamU6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1JFQ1VSUklORyZndDs8YnIgLz4KPGJyIC8+CjxhIGhyZWY9IiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7IiB0aXRsZT0iJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDsiPiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7PC9hPjxiciAvPgo8YnIgLz4KLS0gJmx0O09UUlNfQ09ORklHX05vdGlmaWNhdGlvblNlbmRlck5hbWUmZ3Q7JywKICAgICAgICAgICAgICAgICAgICAnQ29udGVudFR5cGUnID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAgICAgICAgICdTdWJqZWN0JyAgICAgPT4gJ1BvZHNldG5pazogPE9UUlNfQVBQT0lOVE1FTlRfVElUTEU+JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJVZhbGlkTGlzdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICBteSAlVmFsaWRMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVZhbGlkTGlzdDsKCiAgICBteSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnKTsKCiAgICAjIEdldCBhbGwgbm90aWZpY2F0aW9ucyBvZiBhcHBvaW50bWVudCB0eXBlLgogICAgbXkgJU5vdGlmaWNhdGlvbkxpc3QgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkxpc3QoCiAgICAgICAgVHlwZSA9PiAnQXBwb2ludG1lbnQnLAogICAgKTsKICAgIG15ICVOb3RpZmljYXRpb25MaXN0UmV2ZXJzZSA9IHJldmVyc2UgJU5vdGlmaWNhdGlvbkxpc3Q7CgogICAgTkVXTk9USUZJQ0FUSU9OOgogICAgZm9yIG15ICROb3RpZmljYXRpb25OYW1lICggc29ydCBrZXlzICVBcHBvaW50bWVudE5vdGlmaWNhdGlvbnMgKSB7CgogICAgICAgICMgRG8gbm90IGFkZCBuZXcgbm90aWZpY2F0aW9uIGlmIG9uZSB3aXRoIHRoZSBzYW1lIG5hbWUgZXhpc3RzLgogICAgICAgIG5leHQgTkVXTk9USUZJQ0FUSU9OIGlmICROb3RpZmljYXRpb25MaXN0UmV2ZXJzZXskTm90aWZpY2F0aW9uTmFtZX07CgogICAgICAgICMgQWRkIG5ldyBldmVudCBub3RpZmljYXRpb24uCiAgICAgICAgbXkgJElEID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25BZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJE5vdGlmaWNhdGlvbk5hbWUsCiAgICAgICAgICAgIERhdGEgICAgPT4gJEFwcG9pbnRtZW50Tm90aWZpY2F0aW9uc3skTm90aWZpY2F0aW9uTmFtZX0tPntEYXRhfSwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkQXBwb2ludG1lbnROb3RpZmljYXRpb25zeyROb3RpZmljYXRpb25OYW1lfS0+e01lc3NhZ2V9LAogICAgICAgICAgICBDb21tZW50ID0+ICcnLAogICAgICAgICAgICBWYWxpZElEID0+ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHJldHVybiBpZiAhJElEOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
JVBERi0xLjQKJaqrrK0KNCAwIG9iago8PAovQ3JlYXRvciAoQXBhY2hlIEZPUCBWZXJzaW9uIDEuMSkKL1Byb2R1Y2VyIChBcGFjaGUgRk9QIFZlcnNpb24gMS4xKQovQ3JlYXRpb25EYXRlIChEOjIwMTYxMDI3MTUwNDExKzAyJzAwJykKPj4KZW5kb2JqCjUgMCBvYmoKPDwKICAvTiAzCiAgL0xlbmd0aCAxMiAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeJydlndYU+cex99zTvZgJCFsCHuGpUAAkRGmgAzZohCSAAESICQM90BUsKKoyFIEKYpYsFqG1IkoDori3g1SBJRarOLC0USep/X29t7b2+8f53ye3/v7vef9jfd5DgCkgEyuMBdWAUAokogj/L0ZsXHxDOwAgAEeYIA9ABxubrZXWFgwkCvQl83IlTuBf9GrmwBSvK8xFXuB/0+q3GyxBAAoTM6zePxcrpyL5JyZL8lW2CflTEvOUDCMUrBYfkA5ayg4dYatP/vMsKeCeUIRT86Rcs7mCXkK7pXzhjwpX86IIpfiPAE/X87X5WycKRUK5PxGESvkc+Q5oEgKu4TPTZOznZxJ4sgItpznAIAjpX7ByV+whF8gUSTFzsouFAtS0yQMc64Fw97FhcUI4Odn8iUSZhiHm8ER8xjsLGE2R1QIwEzOn0VR1JYhL7KTvYuTE9PBxv6LQv3Xxb8pRW9n6EX4555B9P4/bH/ll9UAAGtKXpstf9iSqwDoXAeAxt0/bMZ7AFCW963j8hf50BXzkiaRZLva2ubn59sI+FwbRUF/1/90+Bv64ns2iu1+Lw/Dh5/CkWZKGIq6cbMys6RiRm42h8tnMP88xP848K/PYR3BT+GL+SJ5RLR8ygSiVHm7RTyBRJAlYghE/6mJ/zDsT5qZa7mojR8BLdEGqFymAeTnfoCiEgGSsFu+Av3et2B8NFDcvBj90Zm5/yzo33eFyxSPXEHq5zh2RCSDKxXnzawpriVAAwJQBjSgCfSAETAHTOAAnIEb8AS+YB4IBZEgDiwGXJAGhEAM8sEysBoUg1KwBewA1aAONIJm0AoOg05wDJwG58AlcAXcAPeADIyAp2ASvALTEARhITJEhTQhfcgEsoIcIBY0F/KFgqEIKA5KglIhESSFlkFroVKoHKqG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K0b1R5vHHMaOjfuNX3my8MnI0+yn0xPFP6v+XPvM/Nl3v3j+0j8ZOznyXPz806+bXmi+2Pdy9sueqbCph6+Er6Zfl7zRfLP/Lett37uYd6PT+e+x7ys/WHzo/hj08f4n4adPvwHJ4vTiCmVuZHN0cmVhbQplbmRvYmoKNiAwIG9iagpbL0lDQ0Jhc2VkIDUgMCBSXQplbmRvYmoKNyAwIG9iago8PAogIC9UeXBlIC9NZXRhZGF0YQogIC9TdWJ0eXBlIC9YTUwKICAvTGVuZ3RoIDEzIDAgUgo+PgpzdHJlYW0KPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz48eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIj4KPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KPHJkZjpEZXNjcmlwdGlvbiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHJkZjphYm91dD0iIj4KPGRjOmxhbmd1YWdlPmVuPC9kYzpsYW5ndWFnZT4KPGRjOmZvcm1hdD5hcHBsaWNhdGlvbi9wZGY8L2RjOmZvcm1hdD4KPGRjOmRhdGU+MjAxNi0xMC0yN1QxNTowNDoxMSswMjowMDwvZGM6ZGF0ZT4KPC9yZGY6RGVzY3JpcHRpb24+CjxyZGY6RGVzY3JpcHRpb24geG1sbnM6cGRmPSJodHRwOi8vbnMuYWRvYmUuY29tL3BkZi8xLjMvIiByZGY6YWJvdXQ9IiI+CjxwZGY6UERGVmVyc2lvbj4xLjQ8L3BkZjpQREZWZXJzaW9uPgo8cGRmOlByb2R1Y2VyPkFwYWNoZSBGT1AgVmVyc2lvbiAxLjE8L3BkZjpQcm9kdWNlcj4KPC9yZGY6RGVzY3JpcHRpb24+CjxyZGY6RGVzY3JpcHRpb24geG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiByZGY6YWJvdXQ9IiI+Cjx4bXA6Q3JlYXRlRGF0ZT4yMDE2LTEwLTI3VDE1OjA0OjExKzAyOjAwPC94bXA6Q3JlYXRlRGF0ZT4KPHhtcDpDcmVhdG9yVG9vbD5BcGFjaGUgRk9QIFZlcnNpb24gMS4xPC94bXA6Q3JlYXRvclRvb2w+Cjx4bXA6TWV0YWRhdGFEYXRlPjIwMTYtMTAtMjdUMTU6MDQ6MTErMDI6MDA8L3htcDpNZXRhZGF0YURhdGU+CjwvcmRmOkRlc2NyaXB0aW9uPgo8L3JkZjpSREY+CjwveDp4bXBtZXRhPjw/eHBhY2tldCBlbmQ9InIiPz4KCmVuZHN0cmVhbQplbmRvYmoKMTAgMCBvYmoKPDwKICAvTmFtZSAvSW0xCiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDE0IDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDI1MDAKICAvSGVpZ2h0IDg4NQogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSAvRGV2aWNlR3JheQo+PgpzdHJlYW0KeJzsnXuh6yAMxpEwCZUwCUiYBCRMAg4moRImAQmTUAmTsHu287h7lD4gIYF+vz/v3VmTlNGvgQRjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB62B/P107aCFp2t6F3nbQVAAAAAABMdK6/3r5w0obQcrj79KXjDjtpSwAAAAAAqDmcLrcfemlbaOl//bpdvJU2BgAAAACAjO54vj0xSNtDy/Ds2/XskI4DAAAAQAPY04vIudNJ20RJ9+7d7eL30kYBAAAAAGSw+9kB94aTtouS44iDt+F0kLYLAAAAACCJzp3H5M0XZ2nTKIk5ee2xqgoAAACA2uiOl4i2ucsbaesoGUs0/olVyDhQkL21R+9P4YvxYXm9/1fvvbcW6/0AgDl21h6+JozzfeYYnVOG7ynlaG0nbSsgY1LA3Wno+WGnPYWMA+x01vk+zPzmRriE89fU29CPEQBAwu6u3GKvglGujxmlkzYe5LH/rGH44ChtJB2n+YENGQeY+BJvCdrtnSGcjhZjFABwn1POIXNGuZz9Ae+GdTKbgfsmSNtJx7InKGQcoKU7+DDkTLMfXMPJYd4FYKvsv94IVybeJsGEUh0LBdwdaVPJ2C0e0GcnbStog92Bdqp9AfMuAJvDHvv8fP4Y14DG97WwWy7gvmim84ZbM5z7ZtwGQnSuH1bOouu5njHvArANdodTYJ5QoOMqINpGJMJJ2mAq+nV+DyesqYJEiui3PwI6VQPQNgWnlPOxk/YWTLF2aecibTAVq9e08GAEKdgTz1rHFNez66T9BgBwsDuUfCW8M5zw9NNLWHs7O2mLadiv9bup1nigDDt3Ztv/Noeeg+P2AeThUkMvbXgC3j+6IFpLNwBbYu/LvxLegYxTS7/2Xjppi2nwa/1uqCIXFCF+3EkplMy7c50YwRw+NfTShmdyuUs6h0aIvxRPwL2gZDoBb6zWMo0ct7X6ZcZLWwxqYufC2hHGgoZ5FxouF58aemnDyfgScxtvQRs5wrwslyO2havjsPYutrGm2K0evVbaZFAP4hm4ZwbfyUYDGi4Xnxp6acOp2WwL2oOaGaW30rEAr6yfX620yRSs6SzyDd4/wDL2Ct6X3wiinaqh4XLxqaGXNpyH0B8t3fDUz0HXjDKg770uVt/BJrqLrH6rGaQtBlWwczJbjue49nLpC2i4XHxq6KUNZ+Ry2kbtdbfgCMzSXKVT++CZ1Qq/ie4iq73upS0GFdDpemF+5eKEogINl4tPDb204cwM52PjK6tKttV+0nfSoQG/hNV3r5M2OZ/VuwBbKccFjNj1v6WyXL3IIgg0XC4+NfTShhfg2jebj+tOil8JoeLUcFp975y0yfmsd7rx1z2QjRtWDyoBJCZeaLhcfGropQ0vxOVk6YarFqyaMoYYUHE6WN1cpIXuIsNan9uoxgVc7I6rh5QUZ1s6ONBwufjU0EsbXo7WzrTGKyFYyvoJtn49s/qQBnT4BRPsvOY1jw+CLRseaLhcfGropQ0vSjsyrqIJRWZ7Bnhmfae0+ruLHNePVGmTgVoqmnB/KavioOFy8amhlza8NNcWupfVNaFcnXS8wPq7Vn13kfXtH6y0yUArVU24f5RUcdBwufjU0EsbLoB4S+tM6lJwdy5WOmZbZ72gqb1X2m79MEXCGIxSx7aVMcptZYGGy8Wnhl7acBnO9a6p1qfg7vR4PoqSUP3SSducx/pDGproiQfIsTob+i7kVGjmhYbLxaeGXtpwKYY6z/WsU8F9ca1XNbfA+sLU21Ha5jzWq9bqV48BA5364v8ZrmV+yNBwufjU0EsbLsf11NGN4EK4ShXcnXOVorkR1ve7rb1Kc73DTtpkoI5dwsuPOgZbIFLQcLn41NBLGy5KZY0v7CAdsCyQipNjfaONyreHJYjWTtpmoI3DkPC7UUiB92douFx8auilDRemIhXXBelgZYNUnBgJd8tJ25xDv9rd2os4ADXVL6P+h39BFRouF58aemnDxalExTWR1L8NOM1IiIR92VWfAL9+00HV7gJ6jhVvXPkkME+90HC5+NTQSxuugFKVOzm0ktSvfad8tSSkFGo+qiHhiYKRCZ5oYNnjDc8aL2i4XJLvj7ThGrgmR68Qu3aS+lhPlSEljVvx/sX1593jwHvwRFtJuG8unEMcGi4Xnxp6acN1UKRyJ5m25hPWmQRESNjjX3OzjWG1szVnHQEx7SXhvmHMNUPD5eJTQy9tuBb0poeam09QnypAwompFe/yTyjDPUvbDNRQcwunaULHFTNouFx8auilDVdDoVaIqzk0OJ8oDXXTpNynajOmCUupXtpmoISWdq58wPYCDQ2Xi08NvbThiuB7R0mn0fkENYDFCQm3qdrF1GG9r1baZqCDfcLgqQmmHzU0XC4+NfTShmtC3yJfs/OJ3qXrVukT7lKtJ4imLBxL2wx0cEwYO3Vx6TjiBg2Xi08NvbThulB2NHsTPeHGueiKdPskPZs6aavTSPC18pPFAA27PuVnUhksuQpouFx8auilDVeGpia0ja6j/gARV5akObbSjYsJDY29tM1AAfuEkVMjnj500HC5JN8UacO1cXV0wzqPZtdRf4CIK8ou6R5JW51EylKqlTYayGMbrB8bh34vCzRcLj419NKG60PJfvt269t/gYgrypByjzppq1NIWTaWthnI0/5WuP+Qb4qDhsvFp4Ze2nCFBA3aIqE7QnVAxJUkaWW+ysXUhAUxbIcDfcoPpFquxLuGoOFy8amhlzZcI/InCbS9Fe4PiLiCJBXI1KhtUpZSq+2iAojYbWQr3H8cafyg4XLxqaGXNlwl1O8oa9nMfAIRV46U07ZutwpvUMqSmLquQqAs3Vam3CdIk+zQcLn41NBLG64TWRHXejXDE3Vumq+SlPQU9ct6EVKexhVKVUDIvvndx2NQbv2GhsvFp4Ze2nCtOLrRvZZNzSdKKki2QNKwqu8Y0RStileJbbOpKfcJwtkXGi4Xnxp6acPV4uiG9zq2U+D+ADuRShGS7k91GaqUpVQMwk3jkn4ZLUC3mQUaLhefGnppw/XiqEb3OjY3nwjFeXuknfrhpM1eS8pSKrbDbZnNTblPkIk4aLhcfGropQ1XjMieuA3OJ+JVwBshraihtsXUpG1/1SUbAR0bnHKfoBJx0HC5+NTQSxuuGInChi3OJ1c8QYuQVtRQm75JyTZiO9yG2eKU+wyRiIOGy8Wnhl7acM2UF3HbnE/wCC1D2kZLJ232OoYEF7Edbrtsc8p9hkbEQcPl4lNDL224akq3L9vqfIJnaBFC0s2pazF1n+IitsNtlq1Ouc+QPOag4XLxqaGXNlw3ZTNESc+fJsBDtARpRQ11nZmadEZdZcvFgAxIuDsUIg4aLhefGnppw5VTsn3ZVpsU3bAlrgxpRQ11nZk6JDiItfytAgn3DYGIg4bLxaeGXtpw7bjswb2UDUu4Os/lrI7EooaaJE5SKttLWw1kgIT7Jf83Dg2Xi08NvbTh2ilW17CZM1LHqSrZUytD2r3ppO1eTp/in5W2Goiw3b0rn2QvOEHD5eJTQy9tuHpK1TVsW8Ldrl2ZMG+ac9q9qUhfJ+WypY0GImx64eODXBEHDZeLTw29tOH6KVM02Uu7KQ1WU/lJLGqoZzE1accfRt4m6SDhXvB54YSGyyX5BkgbXgEliiZTDnlsjIqyPbWSOs920oYvpU/xzktbDQTY+N6VEVxWPKHhcvGpoZc2vAIKFE3iB4Da1BIk3ppa+vftkryz0mYDASDhPsja+o1HWC4+NfTShtcAe4MRpPXvlOzjslESH1yDtN0LSaszlLYaCNCn/RKaJqt+DxouF58aemnDq8BmjO0l4J3wAXeYQZ94ZwRODk4hqWajrnMoAAnYuzJGTv0eNFwuPjX00oZXAXMeIqm3fIPUs3e+VlIbYtWxmJrW/w77MLdHYrfr5sko74GGy8Wnhl7a8DpIDu8SMKH84jjDDNI7Yl2lDV9EWnKlkhwjoENJV5Fr+I8OizJe1qDhcvGpoZc2vA4499vvpH++TzOJsCUDyhqYSR1rVRxom7QloQ55CgiRLUm9ht47a0fMsvboz0HStowfOjRcLj419NKGVwLjYlJi49VsHlPJZxJCdCbxfGEGd1Lvaw31JmlJxho8A6RIzbi3ofd2/jW1s/4s9l6fXNcADZeLT4w8NNxCutQAzyGxuzb4w6w/IjMJ+oswk9jl93ar4MakbSt10maDwsjUM1xOhzW/oc71g4ydib90aLhcfFrgoeGWwvW6XrytSDiueNP6mknK2ueZwgy+SZ5pnbTl86SN1E7abFAWgVNSr2eXooz2R4lF38QnHTRcLj4t8NBwi+lSIzxNKOnDtV/1LvjN/jQUtLCCfE/VpN4Y/QdSpZUG1dL6DhCxG1J/Aqn0GZtJOwEZ55IshYbLxacOEmnDq4EnEVeyJvWcPJfsT8WycZ4wuOCT5EdCJ235HGm7nOromgLIKLwZ7pKUgXumKzf5fpO2JQ4aLhefOkKkDa+HLjXEE5SrSR2OeXOJK/Q+iEQcL8m9CL205TOknbNVR8EtIKPsZriepnGNC0WtTurTCQ2Xi08dHtKG1wPHG3up7r6B4FFlQxFT0XKVleTEr/ZFx8SHM14ZNkXJzXBXTze4Ck2+P6Q86qDhcvGpg0Pa8HpgyBAVmlGCpTG3yESiXStUTmK66qb+JLS0PLH+bX6AknK7yygV3J2iKs4m2FfQvDbxqUND2vCKcKkxjhJKmE2l4O4cBn57sbrFSvJTTHcjtcTXIS9tNyhJuVMNiRXcnYIqLqHZOjRcLj51YEgbXhHkx3mWKGgYHKnJu+QGY4tBaoSVPvW+6N6pmOgWDtraEsV0xrljsd8NpRxY/8IGDZeLTx0W0obXBPWEP/CbfCJ/8O7ZlyM6apPBE6nH3itvEZdWHISDtrZEqbYig2XzgP8V+ofVqyHQcLn41FEhbXhNEK8mpT9Nl3LhSDPsuBck0O6Bky75vmhOkCb+ls7SdoOCFFpJZVhG/Q//K/Q3q1dTd1YCnjLjo4gvXeqYUB0D/+AcgvSx8N8Qv7UP3PbSJ+G+cby3A8kRVobkG9NJmx4npHnkpO0G5SiTKRq4l+cLpeLqeJPmuadW2q111BKDnT34PrBYuxzS7fbcv8UrX3HAnlfEoaqBkz75vnhp06OkJhc7acNBOYbkgb+Cnn/X6L6II3UIGWg4U4+G+6E7nAKLyYsgXUxlzi2yrKP+0rFm9LHCxUn6Er7eti+Jq2R6HQLklMhfXV0JT3ZFzpqo4scBDWeq03AP7EniLOAb7Sof8264C+/74I71DqiugKyd9A1xehOkQ5o/dawXAQoyhv1iWN+bnyly2oQv5EwO0HCmTg1nZM4CvpE+xAZWQ9mbebGKOMdt/aYZku+L1gRpapMetZoUkBOSR/1izuXePQ8ldoh3xdxJBhrOVKvhvuj8wGL8FHTSiDcNV6AfK6eI06oV2qBPvzFKE6Spa0vSdoNi8DcBKNsEu8SmOM2F6D9Aw5maNdwXh8Bifhy6PQKsacQis0nH+CqoVCu0QcbjTOdhtqnLZHhV2Aw7/rxV4d8G726Wb/TnqaHhTOUarvRZwHTpZdY690LPJsbqVFfGg22SsTNI5z7n1N3qOhUpYIC/NZwr7VIBEafz5/4MNJypXsOVVnFU037PaCNzOcN/+NYnkCHhJGPyt9K2jzEkOtNJGw4KwV/Q4Mo7VUDE+fJerQMazjSg4dhbzr5AJC4455SC51r2bD4Uc2GLZCQlNB58n1rRoD/LAIgI6SN+GU7CK34Rp/uMZAMN96CFGJTpl/OASFxw9iqyNCYugW8S0b8To2JSRc8dhZN66q8fnUW2AvsJDU7GL34Rp/Gd7RloONOGhitUav2ApgPQwGegJzFwIXsuL/B8ZWSXcWP07SFLzmnjPWErDBkDfglOyjF+EddJubYMaDjTioZjPjjgCUdhbU4iZIbC9eBcCcVLWTc2RsaPRd8CZPLKsLThoBDcfUUE32vYRZzy/iLQcKYZDVdsPZUkQdTz2ddR2Lec3cDkh8I1u3bIUd5W2vh3UlPwqJvZCGxz1A+i643MR1cr/L2/AA1n2tFwvKWe/6F4L2FsVuQJzFsFV0oRC12M5Mx82qRPcpJF36owYIH5oFThTBXbdhYd7s0ADWda0nCFRByBoXy5/aF8+irweIINcZzk3JlO2vhXQiN+ACaY2/sW6+QUg3ul2Ar7Nwk0nGlKw5URcQRFDXzLvi7fuLUw1XxhQxwnOSPQSxv/QnIaAgNsI/Cm4a6ljrmPw9y/WHUiDhrOtKXhGMXRf/IX+XLKAqcR2XAeeHyRcGUzHDNujK6qhj7VDSR6twFzGs5J+2eYz23UrWig4UxjGq7EGXI+20q+qlSXbVsCTIk4K+HLVsjqMe2krX8i/QltpU0HReBNw6l4E2CWqZoTcdBwpjENx3oO+w/5e7p7LtOEMiSBxRlsOedkyLgzmub05IQiTgLZBrz6Rnwz3DeMvaruWGn/4kDDmdY0HPdovlE8wdhmFZ8fvxR4Yq69Q3jd9Dm3ppO2/j8DhheYgjcNJ78Z7hveLXGaXtregIYzzWk4/i1x2S/wfMXgHUH8Uhg4nMGec06ydLce/ZPuhpM2HZSANw2nZq2AuQWelfYvCjScaU/DMe8NuOVvtmd7MxTr3MXjkZQ3myCrrkbPSdgh2Qc1LgBOWNNwivJTvF3iFDn6BjScaU/DZZXcLSI3f85Wd+EowpdC1g75KFrWKdok5NwaLfmH9IGHLO824Hyjv3bS3j3Bu5qqdi6GhjMNajj2A44znePrLCKXWmBZwMZJDZxkvepoaS/SJ3ugRYUCVlj733pp757hXU3Vs3viDWg406KG4+5bnakt2KouBBPeLCH3cv5sgLzFFx36OmPfhNrEAqBkyBrl02h5kfmBqcXTD520exGg4UyLGo47EefzrGPboZFpVw4suUVtB3M2xpBzb3RskEnPJSp7/gIeWLsUWGnv3mCt5vPS3kWAhjNNajjmRJzPsy5w2WUpYpcIx/yhQyc0S94Gmk7a/DtDsvkqWrMCbkLWGJ9G3Ssma29UPWVMr0DDmSY1HHNpaub8z2YXTfDSYCkkkXSoffJyFBo2yGS8q1lp20EBeGqtvlFV0PANaw2uk/ZuHGg406SG4zsI4UFefoitCFy00o5ltpR0aAPk3RwF7+Uh2Xgc0rAJ+rwhPomXdu4T1rIGpbsPoOFMmxpOc7McttYnsrn9gcEjK+pR8+Stf3tp83Ombw1ZRMAN53qMyrVF1k1EVtq7UaDhTJsajreqIU/D9VxmeZrQKXLLinrUPHkzvvx7eZ9uvI6yWsALZ6dQnb1pBkaPdb73QMOZRjUca8PDPA0XuMySnVU4XgF1zpPNkLn+7So2X2MSBVAz5A3wKeTfYEZhrcNV+aOBhjONajjWXjl5Go7NLEsTukQ4NsR5UY/aJ+/AEOmTDjLe09SVFAIGOB8CTtq5CIHRZ5Wv1NBwplENx6eUbpnvYHylUpYodIkw7D3xsh41T+ZakxU1PmezkxO1HJShzxveUyhNw/HqVpVOQ8OZVjVcYHHrhxzD+H5kHVHoEgn0HqFBHC+ZpT+ytyenkUInajkoAt+ZhppfAtgO474peKqPAA1nWtVwrK1ydBpGFTo9jkHDMTPk3Z+uUtulV4FBCRgrGlQWpX7DWZqqsaoBGs60quFYN3fmGMZXbUEVukQYIg4Nx0zmYJSc03OeVSo39gBiGDNSXtq3CQY+tzVKV2g406qG4+zQnaWWgkqrCGDoyadyA0ZL5E6AnZzpQ51mg1Jw9ghVqGX+4EzEOWnnPoGGM61qONaihhy7BpVWUdCgS82TWYjixQzPmbrxarAFGNtLaVxT/IOzsbHChRFoONOshgssfj3IegbwmUUVuVQY1i6kXWqePu/+yC2uhAyrcd79FmCUMp20b5Nw9kbtpJ37ABrONKvh8g4SmiTnbYRxjZcsdImE9lxqntxNjF7I7qyZey9kNCgI44ZohdmoZzi3EenbSQoNZ5rVcIyFqTm/Ycb+PR1V6BJheP8T9mgDZGYrpJYlc97QsJS6Bfq8gT2Fk/ZtBsb0hb6Kbmg4Aw23HqUazlKFLhGGiAt7tAH6zDvkRKzOSjVgKXUL8C2lXqVdm4OzJ0Mn7dw70HCmWQ3HKJZyNByjtLRUoUuEYeoQ9mgD5FaxySS1+hyTsZS6ARh1jP53gIHPeXWLqdBwBhpuPTmnLTJqOEcVukQYIi7s0QbIbmbvBIzOSsNhKXUL9LnjOk4n7dssjA8ZdYup0HAGGm49PsMsxp9XjlkUMDRkQsqEndzNMxKTep9jsOrGEIAIvqVUdSrmE86qhk7auTeg4UyzGo5xHPsMsxj3m4o/nAI50HDsZLcEtcVNzssdHorbC4rDuJSqbjVxhLAd96HhTLMajrERW84wDnxmKS95ByrJXkwtP+yyctnqd6QDAvrcUR1H8xkNvzCe1aAtDQkNZ6DhyjoX+MzC7jGQQHZm2BY2OK8RvXi2GhSAbyk1ZzN0MbJfzCbopJ17BRrOQMOVdS7wmYXdYyCB7Hf20om4vC2lWErdAIxLqU7at0Uwbtlx0r69Ag1noOHWk2NV4DNL268LVEH+O7sta29WjgVLqVuA8bipGpZSWRdTlSUioeEMNNx6cqwa+MzCMhFIIfudvWwiLi8Nh9/IFhhyh3QUZQomBudiqrRvr0DDGWi41WQ9stisuqHzFUgi/529K2htXhoOS6lbgKHL0S9O2reFMC6m6voJQcOZZjUcX3+4rFcxNqvudESxA1si/529ZHIrLw2HpdQtcMwe0VHqWEplXUzVdU4FNJyBhluNzzGLzao72nr3gCroswdeV8zWzDScrucP4CFkD+gY2jprRGFcTNW13AMNZ6DhVpOVS2az6k41MwzQRH4VX7lEXOY5Jyjd3gCM+qWet+QLXxA6ad+egYYzzWo4vvLyrOcAm1X5poGtkt9NqytkaWYaTlcKAfDA2FmkngmWcT3ZSfv2DDScaVbD8R1MmmUWm1UPUHUHEuirGXiZv2ospW4Bvs4iFb0DMNZ1qKrNhYYz0HBryeukwGXVN9dattwCTRAkLroihmam4SpKo4B0+JYRa3pHHtiioKowCBrONKvhAotft9x3+YHLrG88TfDAtsgflWWebpkvZhWlUUAyXfZgjuKkfVtBzxcGTa9C0HAGGm4tee1x2Mz6Bok4kADB6lNXwMzcNByWUrcAY1uNmmZXxjBoquyAhjPNajgWt+50WWYFNru+8STBA9uCYPNMicMacvdHdAVsBNL0+YM5QlV1/4zVuZo2xEHDmVY1HFtCPXM9JnDZ9cO1Iwkf2BZD/siz7EbmpuGqegSDVAjGcoS68rh82wI1bYiDhjOtaji2+vLMjT+MZ6B8o+kdCdQCQScC/kRcbhpO0xIQ4IJxO5yuU6bm4CvP1bQhDhrOtKrh2MpSM3/HfC1PiAwEW4TiwWeZbcxNw2EpdRMwdoeraTscayAUvQ1Bw5lWNVxgceuW/Tvm13AoawDrCfkDjzsRl/vTKbFjD4jDl36qbC2ecUOcoh4r0HCmVQ3H4tUt/3fM+HJEZSLYIBRVbJbVwuw0nGM1DygB3eF+GdgioahJDzScaVTDsZ2WmptF5jvG9T+1zTVAHoqXdt5EV59rHvLTm4BgIEdw0q6tpOcLhZ7fEjScaVTDsSXUu0zDGBPc/3EEEQTbolc+7rJ37OHNZhMwviQr2sm/CMYOcXo2XUPDmUY13MDiFcU6JZNhr7j8CIJtQbHIz7nE0ucap+exAxjh23CsqaPGIhiPTPXSvv0BDWfa1HBsoze/ICdwmfaCy48h2BaD6mGXnYar7gkMkuBr3lRfTQxbKBTFAhrOtKnh1C6lsm5SeMZlGwq2BcVvZmDbJ5P9aK6rPytIZSAYxuN4addWE9hioeeNCBrOtKnhBhanSEo++ZuLfOPzTQVbgqQ3qmcyLn+mrm0zE0gCHX6fYHzWdNK+/QINZ5rUcGwNPFy+bSUKUx+c9dQOgRqgaMrA1Zww5BqmqBsCYISxd1Mn7dtqGIOhRtBCw5kmNRzXngiKJ1SRwtQHF6QewApIytg8i2n5E7WizvKAEcbUk7Rr69lCUQM0nGlRw7Hl00naE/D1oHznigcXWE52E90HHYdpg06zgDpQ0vAMWzD0RAMazrSo4XoWl25EDwI260YIJBaDbUAyMjnasOVnCM8MVgGFDPkjOEKNRTGBLRpqihqg4UyDGo4tDUfz7sHYeXEEj11xYCE00yH9Cv5uyDbKkRsFNMK4U6XGRQ2+s2PVnNQADWca1HA9i0dkTpXbEPdgcCRWgw0wUAw4+lWW/D1OarIGgBfGijEr7VsCx/bDAQ1n2tNwbD9jqtK2chvivrlYIsNB49BM+ZbYKoJ9ejhnayMwihYtiac1MEpaL+3bD9Bwpj0NxyaRHJGBjAnuCEFNJTjQDE2KmLqNR59vEiq0NwLf3FplKpdxzUfLaxE0nGlOw7EVl5M9mhgrvuPGuxpfI0FhaKr6HKlNBNtb0RxuK4T8wRJBTSHmKkhKzVXHAxrOtKbh+ASSI7NxYLNxguupI3MANApNU1DaRr8h36Aat6ODFPg0S41lqaync0u79gM0nGlMw+3YVlIJ3zvKL6Z+c0EyDkwzkAw0T2gRxRyNYb8RGNcOvbRvSfR8AVHyo4KGM41puJ7FG2KPJBZTfzhDxoEJiHYidHQWEbyUoTncVkBZ6huMx1ZYad++gYYzbWk4vrIk0ufAwGbmEk8g40AMokQG3a+FopsiKnq2AmNZap1lMYyiVskGBWg405SGY2yf21Hayfh2tIhwJHUHtENPM8IskTkU53+homEz4LTUN9o/MRUazrSk4aoZsGwnSSxn6A9Ix4EPiKbEC5E5FA9lT2QLUE8gGC7j1PoiwBYQLYWp0HCmIQ235ytKGoj1Dt/JzGu4nLDKBN4YaMaWIzGG5GWnIzEFVABf+3QlimU1fM9Eqte0TKDhTDsa7sA3XMndYdymsJJwQj4OPEG0pYimvwjFuw4qGrYDwXCJoKWl7VoCX0ikXfsGGs40o+E4j5Kn7w00MFq7msvJdeQegjqh2IF2h+I3QzI/I9e8GRj3qHhp3xJhXPHR8e4PDWda0XCcPdeoV1INr+JMYuiPdVZeAWJ6ohFFMJwGAjNq3cgE1tN+FeZqmm8uAg1n2tBwu8DiBaMzA6fBiVyD53AVVAVVZVD+DiKSZV2fHxFQCYxvxlbat0QYu63oSHBDw5kmNBznVjimp4C6RNwv2CC3dQLRSMqd42lWdTuKkIAqaD7ptB7G1KSX9u0BNJxpQMPteKs8mepvBlaj87hAx20YqteL3C0IPYURqGjYECQjZhxp11Jh1HA6TpCFhjP1a7gjaxLudu14zFabiPsBOm6zUP2gfJYVNGu6OhZ8QBECyZAZRdq1ZPhCoqPdCjScqV3DuYHF/gKe8PUyIgM6bpOQLUl1OVYECgtQ0bAl+KZUJc3QEmALCTScHmqOAbuCY6xH0tMjbhLouM1B1qIhZ5anyVN7qpiACiAZMqPo0CspDHxBkXbtATScqVjD7Y4Di+3PcLZ21HFYwxKg47ZFTzVw0lcyidrUdXRBAeohGTKj1KvhAl9QpF17AA1nqtVwh57F8FdYU+gd70Y+Yi4nyxkMoAiyeTG9rIGm3yMqGrZENedllyTwBaWT9u0ONJypU8Md+iL658KbfWIshecB/eM2AtnGIp9oANHj2BLGBGin+T4aKbTebwUaztSn4fbHUouQDOczvFJBWcMHAec5tA9d0XSXZkAguTgqGjbFgWTQjOKlfUsGGq5a15ZTUQz2Bx/KLUBe2cUKY/Kfk+sZ56s2zkA1VtI2EhF1l6/1gCSQROtyJQnGoHhp3+5Aw5kaNNzO2oP3oXDWil/CVbia+seAMoeWoRuYLuHqRAUNV4zQTQENN0LrC8zQcIZJw10CDXKrjSUkHOuOU36Cx7JqoxCpqFuakOppLs1ZVA70QTRsxrDSviUDDZeClXZrHSwxqJ4yEq6y2tRPrj3ScU3Skw2R9UfyUE3LHX1YgGIC0bgZod5JjlHDqWi4Ag1noOFGuZTKMDHuwy1FOHaFggWKQdbnN2E+JEq+q3jEgHIEmnEzhrRr6RD+kN9R8QODhjPQcGMwNxV5pt4tcU8MaB7XGnTF32ubLFL9IhxHWIBeGDfeSLuWAV9QoOG0wBKDugklU+dB2lsarj2OF28JwrnRr7ow1fYCNBbZGjTjZhRp1zLgC8pV2rU70HAGGu6TsnuhdzV2iRvlenb17hsBb9ANy2u35rqB6KqeJyxALUQDZ4R6j7xvXtlCwxlouA9c4Ruwr7yu4QXIuFag6/O7atGFbIMoxuHWoBo5n6hYNUxk4AuLtGt3oOEMNNwbhQpSn2lKxH3JOCyqNsFANySWjwiypiZoLLI1Wt+9n0jgC4u0a3eg4Qw03CtFt8L9QpjyUAH2xrUA4ahc3iSO5qz7GxqLbI/Wu2gkEvjCoqE9KDScgYZ7wcvcg9ZE3L1StZMJJaCCrs/v8qwY2Yxc81MXJAENN0rgC4uV9s1Awz1giUGdDFbqJrQn4m63C7bG1Q1l2xu77JID1fWQCN4crZ9IkEjgC4uV9s1Awz1giUGV9IKao0UR9xVRKxdRkAtlIm5Y9NsiU41oLLI9oOFGoWv0+IGV9s1Awz1giUGFDLKv7m2KuNtwRDKuWnrCgbDkyK092dUcd2iAOo5ko+cDL+1bBoxN5K20bwYa7gFLDOrjJK01GhVxt1uvYesrSIC00m/BKCBrSbe8hgI0A6NY8dK+ZcAYFiftm4GGe8ASg9q4WOnb0LCIuwUnHVuQRE84COb7pNIlUjx/aIA2oOFGaTws0HAGGu6Lq5O+CQ/aFXG3wSMzUiGkiTg/dzG67XddgdgAZTQuVlJpPCzQcAYa7msoatEXtq1mvy9c0WykQkg3RM+spgayC6G/7xZpXKyk0nhYoOEMNFzfSd+B/zR2YsMbmiINFkE6Q06vphJuSccGzC3CKFaO0r5lAA2XgJV2ax0sMagGZbpiR3fSuEaURRvMEihvv5+4EOFKas0dWUEyjRdgpgINl4CVdmsdLDGoBH2aYtdLx4QXfREHU9BOkRMJMsJVW1ssOkAR0HCjQMMlYKXdWgdLDGrg6jvp2I/B2OZIBVBxVREo7318NfVAdxH0990mgW4IvWOlfcuA8Jf1jpf2zUDDPWCJgX4GtSdBtVzZ8AAqriJo50gfuQrlkRCuYHSAHgLdEHrHSvuWQePHV0DDmY1qONWHQHVtb4q7Z0C16mfwQSC99ZHVVMKVVKThNkqgG0PvWGnfMoCGS8BKu7UOlhio5qL+/CfGPQw6UNKRD8xDuxYzvppKeY2aawhBBoFwEL1hpX3LABouASvt1jpYYqCX4VRD54Hm11NvwUrHGCxjIL3vfuQKlCupOGZrqwS6QfSOlfYtA0YNd5b2zUDDPWCJgVLqEHB3dqTdVVXS42lbBcTHh4z8AinHui8eH6CDQDiK3rDSvmXAqOE0NPGBhjMb0nDh2EnHeg2H5lNxWFCtg4H0rn+uppKu1uLFYKsEymH0ipX2LQNouASstFvrYImBNi6nQ3WT+wZScaGTDjKYhzgR59++nnIlFcdsbZdAOIzesNK+ZQANl4CVdmsdLDHQRKhQv32zgVQcdqBXwEB7099WUwPld3ciAQIKIB1Hr1hp3zKAhkvASru1DpYYKOIkHeAMdifp6LGDVJx+iBNxr6uppD2tkYbbLoFyIL1ipX3LgFHDafi1QcOZ9jXc7XYNZ++sdJzTsK33irtdD9IxBnMMtLf8+bWK8JzUG9JwWyZQDqRXrLRvGaC3SAJW2q11sMRAI0Pwh0462us5Nr+gigJV7VCf12P/f3Wg/F4NzQ6AEKQj6RUr7VsG0HAJWGm31sESA7Vcz8da2ov80v6C6qW2W7I5Au0NH/5UO+3pwFYwRECYQDqUmhlX0HAJWGm31sESA9Vcz66TjvoquiAdMmbQZUQ51DPl706aPem3athjDaRgLOO30r5lgDPvE7DSbq2DJQbquVTT7feBDdIBY0bD9lgQJxDf759NkLS7Pa1oiIAsjAcUWmnfMmAMi5f2zUDDPWCJQQ0MVfX8dYN0vHi5YFOcZqinyu8jsWifL0jDbRpGsVJzByRouASstFvrYIlBJZyddPRX0LiKG6pKjG6OQHy774KLeP610jECkjQuVlJpPCzQcGbbGu5LOfiK8j9tq7grRJxiyOfKo9kNpF+INNy2aVyspNJ4WKDhzNY13Jd0gIrTgpMOL4gTiG/2dd/TfqGVjhAQpXGxkkrjYYGGM9BwUHF6cNLRBVFoS0i/GGi/Dmm4jdO4WEml8bBAwxlouDtV9bZouUbVSQcXROmlB8c0Vjo+QJbGxUoqjGHRcMIONJyBhvumqjaz1KtQiqj5dNvG6aTHxiRIw20d2nbRL3hp3zJovOUKNJyBhvvFS9+INXS+1RO4IOLU0kuPjSmsdHSAMI0f7p4KNFylnq2AJQY1UlUqzhhH2x9VDU46sCAC7fH0tCANt3kYNVzNo6vx4yug4Qw03H+q2hVn7kuqih+q6TjpuIIIjK/0uVjp2ABpoOFGCXxhsdK+GWi4BywxqJTacua7JpNxTjqsYJyd2neGmh+ygAZouFECX1g6ad8MNNwDlhjUSqioy8g3LSbj6lrU3hBqE3FWOjJAHMaaG2i4UaRduwMNZ6DhXqnx2E7HuOVBBJzYoBTikxXIqPkZC6hgHGDSrmUQ2o4KNJyBhnujRhFndse21lSrvAlbwEmPjHGsdFyAAhgHmLRrGTA+GaRduwMNZ6Dh3qlUP3SnQTpyhJylwwnGGaRHxhhIwwEDDTcOX1AGadfuQMMZaLgPKhVxxuwbknFeOphgFMaN4+lY6agADQx8I6zWR4LhfL6reHWChjPQcJ9UK+JaknFWOpRglCA9MD5B0hbcCXxDzEr7lg5fUKDhtMASg7qprcXIC43IuGu9QrppFCbiOumYABUEviFmpX1Lhy8oKt6doOEMNNwYXvqm5NG1UOKgYoYAH/TSA+Odqt+4AB2Nn0iQBuM7l5f27Q40nIGGG8VK35VcdvU3HDlIxxCMwdiGK41OOiJAB4zdC720b8lAw6Vgpd1aB0sMaqeJlbxD3auqTdyDBlHW6PckHQ+gBGi4ERg13FHatzvQcAYabpxGVvK6Y8XpuEbuQWvoOnELSh/8wNi80Ev7lgxjUKy0b3eg4Qw0XIR2VvIOp1p3x7VzD5riKD0unvHS0QBawIGpIzAmJ620b3eg4Qw0XISm3u871w/SAU1gaOkeNMQgPTD+09TPFGQBDTcCo4brpH27Aw1noOFitFbutj+eVS2CLcFLBw2Moai/iJOOBVDDjm+YqTiSIImeLyjSrj2AhjPQcFEaPHi9Nh2HLItOgvTA+KXeZyugh3GgSbuWTGg8JtBwBhouSr3580mq0nGtJUMbQU1/EeyYBP8Z+AZatS+TgS0kOp6P0HAGGi6Olb41bNSj4zrpUIExTtLj4hsdjxGghMA30qy0b6kMbCHR8eODhjPQcHF0DFIuOldDvSoScSpR0l/ESscBaAIHNXzCFxIdjRmh4Qw03ARW+t6wY4/nQTrK03TSIQJjqOgvggaC4Bk0+f2k9ZBAwxlouAnaTsT9sjv4oCOtMgYScToZpAfGDfoevAIN9wFjCbmOvajQcIZJw/WekVBsDbDB0tQInTuFUlFdBUpTdaKgv4iOxRygBjSI+4AxJFbatwfQcIZJw1lmo/dlzpDaWBJI5cqql44KGEX8EDeoe/DKnm+w1arhGPc86Pj5QcOZSjXcFzsXWEx/Qcc4LYm6Uge0ANOJeH8RFUduA00wjjZp1xJhXF6Wdu0baDhTr4b7wgYW45/Y5nNip+qIVR37LsA7jI+HJUDbg3cYt/VW+jbfswXkIu3aN9BwpmoN93UHmbXGdh8Uu4OWI1ZRfaiT3SA6LKy0/0AdAcPtDb6IKFldhoYzlWs49mzAdqoaRujK7Dqco9JX4OY5SA4KJY8QoImeb7w5ad/SGNgC4qVd+wYazlSv4cyetS/G5mvfDr143xEnHQMwThAcFJ2080AfaC7yDl9AlGwzgoYz9Ws4s+NcT93uYup/pGUcFlOVIljWsPl3KzACY2a4zrwvY6WulfbtG2g404CG4xVxm15M/ePQM4Z4FiymKkWsrAF9RcAIjJJFyRb+lTC2h1PyC4SGMy1oOFYRhxf+b3ZOrlTVSTsPxhEra1CykAOUwTjkpF1LgrE9nLRrP0DDmSY0HKeIw2LqH3upNVUspmpFqKyhzqQIYGfgG3NVLsic2MKhZW0ZGs60oeFMx6cuusKuaGbnB7Y4T3CV9hvECBLjobYpFpSCcThW2aaSLx5ajjCChjONaDjGhX8s27zgBrZIx7HSXoMIImUNyMuCcVCY+srQfDig4UwrGo4va4wHxhsCKs5L+wxiCJQ1XDtpp4FSHN+o07J4uAq+cFhp136AhjPNaDi+V47yrmjHl94XV+X8uQ0Eyhq8tM9AK4yFqTVujG6/LBUa7k4rMWAbrwK+aGfHt1d2nHyLbb7XYAzG58Q4NT5MK2FvpS3IhXHcaVEtK+BLS6rZogwNZ9rRcGwHrXgBX9SzL9tpJLsozN9u4XToCDwHb5Q+j81KO9wge+tPYbjVX8HFOC1Zad/Ww7fRQc3KCDScaUjDcW2vVjNcdVF0I5TLtXb4/p7hfLT5roNndmVX1rE/lZKddT48CR8t5Yap9HwDz0v7tp7QfjCg4UxDGo5LVahJGyujZCout9PySx+zcDpUuC6iF8ZGop+goIGInT2ewof8rv0ADMaxWOHLw8AWDCft2i/QcKYlDceVEKiyu2MBdj1PvEfIzYV+WDr0DreVipLr6l7a2Qa4595ic6WTNi4Pxt2Z9e3D3PEFQ83kCQ1nWtJwXIl0dIiLUSwDk5kLHZ/MrmdvScKwdRirAd+p70Gqis7687TirnznCKNsqW+vIKOglXbtD2g405SGY9oRV/seEUYOpfZC5S3xTNRnBW8rXz5SQLm9kVba1WrZH+LJt2c6aUPzYMwJV3dSwwZKGqDh7rQUA54SOZzOGGdfSMTZLCvD9JdfsEEuj2JN4irck6SAvTuFxSH20tbm0bONvexNucXhqxjXEwpoONOWhmM6glvGmTooJOKy3oGX5Geh43Io1CSu9h335ekOPqyLceWr1YzbO6p7lx/YQqEnJQkNZ9rScEyjVsqbKigj4nyOiUvn9cvJdTRB2Rw9583/AztTV7Cz/pzy21SzXT0JzrcJad9Wwrg3sJP27Q9oONOYhuM5PwCPjimKiLis5P2aPTLIxyVRpElcdYkQMfauT94YVvn2X8oB94aV9m0dTKtSN1W5Wmg405iG46mQ07P6rxLGg6b/yNlEu3pQQMeth++B8Z+6M0SlSEy//VF5P8xANNhG8NK+rYOvpEHRtlRoONOYhuNZTNVThaOTAmWJObcgKTn7pePI4rMJ+I/cwqvUHLvDiuKFKHUPfMajnCt7DgS2QChamIKGM61pOJ5fsJQ3tRBYov5MzjLakHrRgP5xy+m4V1MH5Ean+NJvRH016l5M5UwIS/u2Dr44KEqIQ8OZ1jQczy+4k3KnEgrshko3Lmt9/Xo+KpqwVMPd8NlKO6gXOv12p+7FVM4uv1VlKLfQ4Rca7kFjMWjMnUrg3w2Vblt2anboHVJACwgEtzmOoj04qqDVbw+qkiofMHb5rWo1fwsdfqHhHjQWA5ZtOV7MnVoIHGF/Jt20geLyl5Mli1WrsK6mojXcGNZzKJa6F1MZN8RVVRgd2MLgpV17AhrONKfhWFZ0qnr/EoHpmLP/JFtGV6qMZdUZerJQf3JF7N/YH7nKSOpeTOVcE+iknVsBXxSstGtPQMOZ5jQcS3eRzOSxCyyoUpY9R9yfSDaM9LV86NF1JApvo0Ak4p7YuX5gjHXVeplzQ5yTdm45fNvhVEl8aDjTnIZj8Sdz1DLtTFC1Q4g7EZdsGPliU0A6bhTuXs8XiLhv9iwLqM+oejtcDWN0VE2502yiOxw03IPWYhA4/Mkzienn5EniRUXP4+QvqWaxaEuk4z7ZcQsLVVuppdi5vsCJGIr68CfAuCFOU0XmDHw/R0Xd4aDhHrQWAxbBlOfPJjQczxEZf6SaxdbxAum4V9glXO177fPZHwsE+UHVQ5tzQ1w1JbuMK8qqBgc0nGlPw7H8gvN+upvQcMwPcY1WDX01Uzo7PWOc//DSXgpyYN0B94aqVMtqGANTzWsE3wGIupK00HCmPQ3Hsnjms0zahobjPTY10Sj2etmz6yiDWCuc61dPOGk/Zdi5vCNQV1NVE40PAl9gVO3nn6JnC4EuGQsNZ9rTcIZjtssbt9vQcJz1YMkajldYfnPxqlYXJCgR5gcbTHx2x1Aquv+persn54khtQxAPs2vKwLQcKZBDRcY/MnbTr0NDcfb5zfRJv6T2B9sfFWV/5iOX7bWJq7cFrhXnLTjOXBuzdWVhYrC+IvUJe+h4UyDGo5jWScvhb4RDcd6YGaiTZwmvXHe7Ilc3F1FntmSiNufhnKBfUVV/4jVMIatksXUni0AyqrDoeFMgxqORUpkWbQRDcdamZpmUrkE0YPLsSONaB2UlHDbaRMnKOBu1UiVCJy7M+tIuPP9JJWVu0DDmQY1HMtdzXr734iGY016pVnUc5o0yuW0oUTRA/7GcG8R3oCIkxVwd6x0CHLgfHWrIkPJGIBO2rdXoOFMgxqOpRQxy6GtaLjA4+eDNIsGRouiDJuScaUlXCVP0QzkBdyt9qMaODPDNbxC9Gzea6tYhoYzDWo4Fo98jkFMG8WybOKAcQkjbepg7jsc57qdGodCVSPPVLKvPInOD+UDOoK2Z/U6esbIOGnnFsCnYbVpe2g406KG40gM+ByDmI4f1vZz4ixqSNtJy1plMcNGZFwvEVt1I5+ITqgKdYxOOhg5cC6mVqBuGd3XtsQADWda1HCBwaGsahwmDaesQojNz3RfhZ+IG5BxhXr7vuOk/WZg5wRSmnGcdDxyYO1VqU3GfNKz+a7rkAYDDfegvRhwPFeg4RbAuHSZtAeKt+vwIhqXccV6+77jpD2n5tBLhTJC3QvWnHJYfWQY5z11GXBoONOihmMpIcgxiEnD6Uvq8/h5x6eYU7izSISGZZyYhKtulp1mfyp7lNYS6u4uwjkyr9qrGhi3kKjLQULDmRY1HMujO8cgrjVGqoCRweTnLVHD9Xz2rOPaZqWqWMnIraVev91xEIxjnKoDzJqCd9LezcC3hUTdUio03J32YsByW3M84jp4nSpgZDD5eUvsLDnw2bOaBhuOlO3t+04jIk7XJrhnlDVzXUnPGBl9SuYFxm3J6pZSoeHutBcDfQ3iOAzKtYkDvhdAm2CNZJpojMZOcZCVcF8irpOOQDYa11D/ULfddhWs+yistHeT9HyO63tvgoYzLWo4fQ3iOAy6KTz2JTA5mjagJDuLRAjtnKlavrfvO5Uf2LBz4hGcRjpAeXCqY9XylnEZWd8ObGi4Ow3GgMMjr82gXJs4CEyOpj1PdK5SndUp7yTkJVzdIs72ilNw31jpGGXRc4ZGXz7qP0ynAt1RuLwODWea1HCBwaOsVy8Og24KDx1i8vOWpuG0PiRbqHDQIOHqFXE7pWUMr3jpMGXBupNCc3sRxmmvk/btE2g4Aw23EI0aTt3eWh43b2nRZ9zam81Q+9Y4JTlOdW8xS7C9dNiWoXrFcJ6BMzadtHdRGLuqaPy1QcOZJjUcR5PfrHZJXE88bWkIJjfTZg/GNQUKzo46+gXppaP3i+aEyCg7N0jHbDHappd1sG6H1TvuBj6nnbRvI0DDmSY1nLomv1xywhIFjAomN9OWdQKbNURc+1rXVHvp0P1H78N0jL3+XXBP1L1zk6uj0zedtHsRGNNwKrs+Q8OZJjUcyzjOed5yaThPFTEa+CqiXII1bMYQcjnWmOsQOiR1nIpEnAvSwVqHlw5YHqzr/VqH3cDnsr7mcAYa7kGDMVDX5JerWZGyHSt8O9BsgjVHJXu2ZuhTfBNF8IStMbx0PJbR+ZpScF9zi7fSIcuE96i9Ttq9UTh/m520c2NAwxlouKXk1FWziRuykJHAN2kmGmRPKsonZxh8R3kXuFEm4XRu03mnljqGby6nQ4354XcGzhgpe3/+gdFlnQ5Dw5kmNZy6BnFsWzMsUcBoYKsiyCjA7dy5gvxHRU3j1Em4CkSc9m6+z1x710nHiwjeqiYr7d4InD9OJ+3cKNBwBhpuKVmF1RwG3dG1RYFt8TKzqL2GdFwtyTiFEk7r4+WHmhZRw7HWMpsxeKsaFB5asBv43FVZ0QAN96DFGHA8srNSyQODQXd0dYhjU0o+27Qa0nFnm+0mO9rOoP3BScclyr6Xjs1Shr6JBdRnetaA6Tu1gDPx6KWdGwcazrSp4QKHT+oMutMRRYwCvrJUS2Lf4TSwWUjDoL1MVfqc+yhOOjLjHIJ0YBbSVgLuF94231dtP9aO89fZSXs3DjScaVPD9Rw+5RjE1o3BE0WMAr6SBrLJcn/UvqqqumecWgmn8wTLStr5NpiA+4X3166tvwhnIb42X3+BhjNtajiWnHKOT2w9wzUtprIJVVInd055z5GLo3SXEsUS7nbVJuJ2dWyDu3htgaOEefemlfbvBdaso9ZRAg1n2tRwLJLJZRjE9/NS9NsauHwkfwc86G6Xf9VZ36BZwmkTcZ3uEfbDuZkS1BgDa/w0vUHz+qqzsYiBhnvQYgxYbqzPMIhvq5ieHDdfFRjH5uG97s1xCusbdEs4VSKuhkKGa19PP5t0mA9N9tL+PcHqqtqxAg1noOEWk9Xggu35p2djLd8cwvRw3nvNm+MGx+N1KqwbpknQIuJskI7ELMNJSay42TGPWj1hZK0Y15VwfAYazrSp4VicykonBw6LHniikGUzcHnI2Jmo01zjoGpJdac4UL+oEHH6S1Hb3gL3BnMiblDzCs36+3TS3kWBhjPQcIvJkhJ8x4RreUXi2/KX2eF3BtUyTk2Vag0SToOIU1+Kejl20jEqCt8ulm+0dFnne8Dc9DxjRoCGM41qOJYnTo5BjAVSjihmmfBVezpu0zXLuMDu/RLqkHDiIk67gtuagLvTM8dUx04x3k54Ttq9ONBwplENF7Q5xbhbQcdLEuO5Nl0J8/XKuMGJr9fUIuFkRZxyBXeWH0cS8B649TXiOmkPDfe2Px1PmHGg4UyjGq5X5xTjj8zRxCyPns29UucS6pVx0hvj6pFwciJu5wdp16cI2xRwd3rm0F4URDaweuik3ZsAGs40quFYdrL6HIsCh0XfaChNZcwzFtxx0h0HPj+y6LtyUXinJgknJOJ0N/Td4hLqf7gTcQraO7FuhlOdhoOGu9NkDFia/GaJicaPIw583pV9JqvtGxds0Tj8py4JJyHiVCu4bQu4Oz13iDn6V66B+TQKJ+zeJNBwplENx3Jns5qLsG467YjClgzfUamcnUUi7JX22Jcpb6hNwhUXcZoV3KCpPY0U/J0Nnah/zM23VafhoOHuNBkDljubtTGLtcZd+iQUzi21IisVh57PoQwE+v7WJ+EKizi9Cm4zjXznYO4RJ1wOzX1+ihP0bR5oONOohuPxKssi1mehcDaf8xR5odr9nQuMTiUz+LKbH2uUcCWfqWprUbdxlNYyuA9rEBVx3L9Q3Wk4aLg7bcaAxausxyfrvlPZAnfO/RiCU4jOCodrSRVXp4Qr9kxVq+A22kckBnsiTq6ujP0XaoUcWwg0nGlVw7GM7CyveLswlmrAMQZrMl+2D7rKrXHlVFytEq6MiNOq4IbNVzG8sxvYgy7UYYT9Fyq9TWcOaDjTqoYLHF7lrU5wWPQfOa3DO0GKb+lxnAvFqZRpNVKvhCsg4uwg7eIoV2yCG4G5cvOOiIjj/4VqH03QcKZVDddzeOWzTGLWAo4kbuvhnUYk84u/qFxTLaDiapZwX2LGccbGBmn/RjmzOl0xgT/2AiKO/xcq3/tuBmg406qGY9kBkTegWXrW/UdqW21g9Uq69dIPVuGaKreKq1vC3TjfavZB2rcxsIYah3cnyzfFZ2D+X6iG9vHTQMOZVjUcS/I8b28A+8F9IiKu53VKzRyyc/okDauK6/T5uxbHFJle2rERrr3l8bYR+hL3oHA7cv5fqJJX6Amg4UyrGo7l1mbWSHL/5CSS+YHXJVWp/P1JXTKOT8Vxd50qgmMIzK6X9mqEC+pQZ+DvL3LjXr9/o8AvVHlfkTvQcKZVDcdzfmeeTbyn2t0ERBx7Ml/bjlp9TeOYVFwTEo5BxGk8lOHaa/uZaIR5K8sPvpg/Bco05B/j80DDmVY1HI9beXMl47nwPxQWcfuB2R+Fhe2dumQch4prRMKRizinLy5IwS2kzN6Ac5m7USQbrGoVJAI0nGlWw7FMtpluDRw2vXDpKGK3EP4HmivozXLU7YzrqZ8bzUg42ueQvnYiSMEtp0RZwxeXEnekwFa4GgoaDDTcg0ZjEDjcytziyd8uvOC22gJvgmq3Y2hr/Uvc9bchCUco4vQVow5Iwa2BfS/LD/yFAMciP1D9BQ0GGu5BozEIHG75PJu4K1PvlNpWWyInUciVFHbKmvRTqjjbkoSjEnH6ilFRiLqSAqc1fBM6Vj+6UMYLVieogIYzzWo4lpxX7rAusghX4sSGXYl3WrVpuG9sXyAGy7lSvTaX2CxdFAIRp66UYfBdvldb41Dq7pD9Fscok4QTPoJ7MdBwBhpuDbmnBpR5PDK/BppSW7sdtxu5dLqe7IOjcKqYhAvFthVml/ooS7reAsmd3h7ljs0LXHtaih0QUsVKKjTcg0ZjwHNvM40q0qTo6xUq72DXOWyZh6/yNNw3uuobBpvvUClbL7tCv4ZbrogrNN4XgzqGVMqNuNvtxLFXsdyKfh0rqdBwDxqNAc+97TKt6lms+uSca2icYi+Cjs0FUnQtqQab502ZLlq376WacrUTGSKuK5e8WcJAW76yMYqtpt7IC41M0RX9SlZSoeEetBoDlX7xt4j74eoJQjjCIZTyoIo03ANdS6pZ8r0vZeV3/XS5R+qQmLtSthHu4jJuLihXm/qAVsUVHYqVrKRCwz1oNQYsfmUP7cBi1hg0u6NeKFqMybseTIuuKtX0VZy+mI3u+4Ll6ifSmu6ouq+3s029seCHYrWp39CpuLJ10Wciq/mBhjPtarjA4ZfPtapk0R+xirNFm6LVsh/jl2JLzAtITcL2xSz8excqlxdJEHGqOsJd+c7G3RLFVkJ+Idm9WPiMvyq6+34DDWeg4VaRrywGDrNi0Km4/amo4fpOSp1n35eN0BQpN5798Nv/PHX76ItddO0GyyL9c5ZCv7lqqxRotP7G5Zh37/bFj/ezNKEuATScaVfDqWwuUnwKuVL0kSou4Oo4qu8DTRvjVhc3FJRwLys1BYs+3Zp4aDoalWFfxHYJAjfwnHyihsDcm7/aVBBoOAMNt45ss0qWt38Tsk7k6ZzEuVIVJfNf2B2H8sGKsK64oaCEey0SLXjhFdtZNfUTCTVtDdVP+Rn4+y4eVy8tyMy9BImKgkDDmXY1HM/NzV/iK5/L/3qcH7sUU/fHfhCw9lZRWdQnirbBr1h/K3hE6vBmVVfwObUwvatpGTW3Wwx4h+fJsIDr+WiXGrl3UnNvXe/P0HAGGq60Y0KvgcPJdSuMtMdTELHzQW0FDa/oKW9YfHhuQQn3WVtQ8OLLRJyiZVQUMjAg8Rr9x6X3tpuybm99HwQNtGVuAhFaH/NFaTYGLI75fLvkZpBr8IeZROLOHr5mEOFnWDUNJmNYNX1hl2VxDpISrmyt4Hy3X0XVqFBwPMj/PIdw9v5on3Hen4L01FvXZjgDDfeg2RiwOEZxfra0QvqcPu7zhz8rmEC+qXgl9Zey7ZymWKADSja8cdIGzIg4PcuoKEVlo+QezMqopzPcN9BwpmENFzgco1jlE03lV0DdK6m/qFFxs93iip2vdYuWhhZtmziVij4MBS2ZAgqOk5LL91WRd7KwANBwpmENx5Mwp7BsYLGsFapfSf2lK97XKcJgp8zsC1pyihlRMvsV7/bbhYJmTAEFx0zJg1Mror65FxrONKzheNJdHYFlJbMO9eEIIqwENadtTvQZ6QuaMbEToaQZsVIPLXcLCo6fksnneqivszo0nGlYw/H8Skl6NQUW09qgyu6+UbSouNiCatGdQZN7bfqChoy+J+yVbJKCgitCL32fFeKkb8p6oOFMwxqO5+56CtOKH9pXD9VtyJhDi4obXVAtKuGmb23ZfeYfbwpaahmg4EoRpG+1Orz0LUkAGs40rOE6Fs9o6naUPDD0kXAyuXq0qLjPBdWiW7vn1HlhEfdqjR1KXjwKFFw5UJz6RpUrINBwpmENx+MZzUEku4HFuPpxJOHVhhIV976gakta9X48w0iUij5UnyXlTr5h2B0ouKJgEn6htq4i30DDmZY1HM8jgcY21EWNEq1brB0lKu5in2wqWlqzJMFa8tStr1j8WVSwxfEEUHClQYeRJyrdxAINZ1rWcEGzazre/JVR56vgMpSouNPfVF20Mm/ZGnnZh+qPTUoaikDBlQci7o9KJRw03J12Y8Cz6YzoEAHp0xo0Uus8shAd2+avP5XVfdGLLtzmWFjEua9LHlX8EHGqlggQcT9UO/VCw5mWNRxPgziqnZ88g69mrrXOI4vRcXZD6L70ZCh6ycUdeQo/VI86knBQcFJgFn5QX2/fX6DhTMsajuf20hQ1GNSmvtNiSeoHKlTc1ReuyXPLA7TBh2rYwsDXCvqt36qeeqHhTMsajqkLG5l9qG1/od55ZBU6Mj9FcWvis7WHarA84wwsY2vjbYSKJRw03J2GY8DiGp1v2IzxjKMKq3pskI51Wdy68GzqoTqsDA4gZ1PjbYyaJRw03J2GYzCw+EZU1GDQYOQZRxbVCjgM0uEuyOrfy3Yeqle6uQQko6O1jBiXmiUcNNydhmMQWHwjbICBLXG/OLqgVoEbpCNeioQaoK2IOLQT0cGmF0SqrUj9BhrONK3heApTB0IL0SXuG0cY0zpQ0i6OnaQy7k2IOBSjqmHDIq5yCQcNd6fhGDB1Me3oLMSZfQ8cXUTrQUe7OGYSO/G0L+JQyqCJzYq42iUcNNydhmPA1KdgcbOrBZQ9XkgpjjCgNdE1n4ZNbqZY9BCJ8gyUcwjIZ6Mv01Uec/8CNJxpWsN1LL7RHuq52TfAP66WMp510XiJasYjope2nZGrJxtAgIhNirj6JRw03J2WY8DiG12X3wcbbGr6QtWV7fm0XNyQ9Yjopa1no699/apNeulxURwnHXICoOFM2xousDh3o52D29/7M0Xdle0EtFvckPmW30vbzwNOZdAKTwmcWtpY/4CGM21rOKb9RsSbWbYs4qrfU0uAivO36MleqOmlPWAAPX0V41p9mxqjkZdnaDjTtoZjerMi3RBntiziGtiQQUGL2+IIbm0v7QM56Ainmv0gPUCKERoZidBwpm0Nx3QQAu2GOLNdEeeoA1ktzaUASBKsvbQXtISOICaAkV2QHiOFoE5DiAENZ9rWcFz1Ah21oZsUcW1syCBi19ZuHKI18paCgn4iNdDSiItybWcoQsOZtjUcU2EqQ/5og2f2tZLNp6IL0neEDrJtju283GAZtQ5s+zPxpZMOMh3QcKZxDTeweEd5ZOovm+sT5+ljWDuHQfqmEEG4zbEREYdl1Gpofj21mXXUO9BwpnENF1i8u10ZTN3Qftob1lHHaWRBlbRSpQURh2XUqmjjVxihoXXUO9BwpnENx/Vr5PgdbKlT+BkLS+O0sKBKXGxcv4jDMmplNPw+3doOFmg407iG45r/edLRPZO12rgeWcLXBtUvqJL3i6lcxGEZtT52J+lRw0N7My80nGlcw3EVpg485lb+tFoIHmqTVL6gytDyr+afxdXRxwPwYwfpkcNAgzMvNJxpXMNxFabemJpcN5zE/6W9V0Fyal5QZenaXK+Iw9motdJeKq7JmRcazrSu4QYW9/hqe3ZMx4OpATvhllBty1+mgzcqrdoeLE84QAkaS8U1mIQz0HAP2o5BYHGPbTH1i2Odj6tl4KG2kEqzAGxnp1Up4jxXNEAZ6t7V8EJj5ah/QMOZ1jUc26/Qspm8b7Y+9erZgtYetsJh4PnCUZ+IazPvsS1q3tXwwqnV5Q9oONO6hmM6MZX3tPaGXv+e6TvGmDWIr022OM5oVCbimtx8tEGqLxO/E5i2bysAGs60ruH2LO59ceV8sWkxFRcsY8DapLIsgGOORk0/Cmz7bIbqXqXeabrDNDScaV3DsRWmMj+xWtsVh41wSdRU2+C4g1FPE+xWNx9tk10vPZ5yaHwDCzScaV7Dsc37gdfurqUC1cHxBqtdqqlTLiFbahFxzW4+2ir1TsbX1s8IgYYzzWu4nsW/O9x7DGrc1D4KFFwOdXQ4uBbZcVNFRgQp5waxQXpYJdH+FmRoONO8huOrD+CsavjGDWzGlwMKLpMa2oyUkXCmhuPokIRrkwpVXPsKDhruQeMx4Dpt6wv+yXpX/X7agJ1B+ahPxV3K1b310r5OgyRcu1Sm4rag4KDhHjQegx2Lfw98CfOrVnG9LRCiDaD8CNVLydST6nO3Wt99tHG6XnqALaX5fXC/QMOZ5jWc4dNArO1F/qhWxV1PXYn4bAPN3WaKSjjNIq5gOhLI0J1qmI2H40YUHDTcg9ZjEFgcfODLeLA7Dnw+cHFxZYKzGdSm4oof626VPkZ94TgACXbqdylvav8KNJxpX8MxPvvKJOLuOMVpmBGuPTIS5ChNxfGX9nxGQqOIQxJuM1jFrUau29gG9wc0nGlfw7GdtnUr+uZte0Y/aDm7cmHZFBpTcV4iEAqPbEA56pbolC6NXNzWhiE0nGlfw3UsDv7QFXSkjiXVy7FkTDaGvlSckwmEtm6/KEfdHLbXlg0etrgBGRrOtK/hGIsabrdzWVf0zRuvQMBxoysVJ3emlK5uv0jCbRKnaE312m9pF9x/oOHMBjRcYPFQyNGdpnnjFQi4EmhKxRXr7DtGL+39H0jCbRYl0/FWBZyBhnvQfAxYUxdD+TdwJfPGK2fXFQ/ERlFzbIPwLn4tPUbOSMJtma/pWHZxZMMCzkDDPWg+BpxFDSJleQrmjReG05YnkfIoObahcFu4T5yG34DccjJQw+E0CA2/i994OXTnOeik3VpH8zHoWDz8Q8ote9KwqnbtkYArjooTVIu3hftEQY+RIB8FoIHuWPy1eug3V4UKQFt0rh8Kzxsvc8j5uPGXQDHk29yepENwR7rHyPUoHQGgiH05HYe5F4BGENJxlxPyb5LshPdEOukAfLMLkkFAW1/wzv7IPh9j7gWgMXYHH8olZi790Up7DER3gynaBNbLRcFL+w50srP+PLAMOcy9ADRL9yXkeCaOP67BOyvtJ/ihC7x3ewJN+SexKIjXdADV2OOJ8M16wNwLwBawjkXJXe4zCJ5ZqhDcDCZSjD1OLxaE29VKOw/U8zUh91lSbgi9P1hpNwAAJdnboz9TvAReviYQZztpf8AnR8myBi05KNn9cDifASykswf/NSUvHq7XEM7+S7t10oYDAATprPX+FJZPHQ+Gx/zhrJU2H0SRrmnQsZ1f/NhUHWEANbG31rrvvlR9+M/p+58OX//bSZsIANDHzv6fO+5vhP/p/f/pA8+kKjiI9xYRPWfrBwX94VDYAAAAAIDFqOjxK99eRL5J3h2k4gAAAACwDCVnbUmnoLScl4pGvwAAAABYgpcWLX+IlqfqCcMtdJKBAAAAAEAN7KW38T8jeFpoL+37M0jFAQAAAGAaRdmnO1I9RqTLcj9AKg4AAAAAcVQl4R7IlKeK9xT5BKk4AAAAAMRQloR7ICHiBE+omACpOAAAAACMoS8J940rHggVPUU+QSoOAAAAAJ9oTMJ948oGQquEuyEVBwAAAIB3tCbhHpxKRsLplXBIxQEAAADgFb1JuAcFG8Vp6ewbA6k4AAAAAPyiOgn34Fyqx4h2CXe7XX2hUAAAAABAOcqTcA8KNYrrpf1cAk5QBQAAAIAxVn0S7kEREddLe7kQL3d+BQAAAABUsDtJ65GlFMg+9dI+Lmaw7MEAAAAAgGLsIK1GlsPd7XfXS3u4hh6pOAAAAGCzqDsVdBpeEafwfK1JrgfOaAAAAABAL6o7oY1xtXzBqE3C3dBmBAAAANgmXZDWIAk4rmhUKOHQZgQAAADYIjU0FBnB8USjSgl3Q20DAAAAsDVqqmV4xXGEo1YJd0NtAwAAALAl6qrAfMPRx0P/ORUT4AhVAAAAYCsca6tleMVTx2NfdzxuAec2AAAAABtgH6Q1Ry49cUAql3BfnLCgCgAAADROPecyTEAq4hqQcLfb1VGGBAAAAADaqK4l3DiEIq4JCXfDgioAAADQMvUvo/5CJuJakXA3LKgCAAAArdLEMuovRCKuIQmHClUAAACgTRpZRv2FRMQ1JeG+uFiKqAAAAABADzZI6wtqCERcaxLui3OXHxYAAAAAaKHqpr4xskVcgxLuC49tcQAAAEAr+CbFSq6Ia1PC3W6DIxk0AAAAABDmMEirCi6yRFyrEu6GbXEAAABAC7TTT2SEDBFX8TH3C8C2OAAAAKBumtwI90SyiGtbwt3QLQ4AAAComV2jG+GeSBRxzUu42+3qSccSAAAAAIrhBmkdUYAkEbcBCXdDcQMAAABQJ3YTOiVJxG1Dwn0RLPmwAgAAAAArXZDWD8VYLeI2I+G+CHuO0QUAAAAAHrpeWjuUZK2IO0sbXJS+4xhhAAAAAKBn56V1Q2HWnfXeS5tbmh4lqgAAAEAFbKAY9QO3Ij59Uct6DUm/K87fAgAAANTjNCi469GVvaBbHJ++tF12KHrFcaDiAAAAAN3oaCcSuuJa0i0MUNFl5uvhfsndqeQ1Y6BdHAAAAKAXHQru+r09rfB5pG5ZhEqadP2tCd2rKIRFuzgAAABAJ0oawv0d1dkVtee6pIlGUQl36f5f+KhhhRsqDgAAAFCIDdIK4cH38uE3ZfuwLRBxh5L2XF52oO001DZAxQEAAADaUKLg3ttY9CWvPSviiq7ufjT0UFHbABUHAAAAaEKLghvsu2VFt/Nfp2svy0q4EQOUNH2BigMAAAB0oEXB3cb6V5TdgTYl4nYlFdR41+FOx4IqVBwAAACgADUKLnIy56GkdJoQcUU357no3RoKWjHB4NAvDgAAAJDE6ahF/WsoMkLRJcwQs6KkhLvaiTumZEEVXX8BAAAAQXT0g7szdSRn0e5oY/vQ7vTlTJiprdCyoAoVBwAAAAihR8F91jK8UHQZc1zE9eUMuMz2ONGyoHq7nrqUgQcAAACAdHZ+kFYAv8yf4lS0OZobMaDgCVuTdRW/6Gj5e6fvVg48AAAAAGSw07Kr6vZ0LsMUfUGD3MfVCxbHLpJwXzewL2fSDGe7ZuQBAAAAIJ2ul37u/2c4zNt7p2SjOPt2bVvu0rHteJ/sQzmrZggL7yEAAAAAcrC99DP/ieXb4gvmwt6KCgoWxi6XcF8chmJ2zYGGcQAAAAA3hyD9vH9i0TLqLyVF3LNdBXv7nlbeTEUr4ihSBQAAABjZ6SlFvc1Wo35QMB/2tCutYFGsW39Di55FNs0V5Q0AAAAAD52itM2SatQPSoq4v4uGYtd0STe1nH3zoLwBAAAAoGffSz/hX0hK2uyHcvb9XLIvdkWXeGPVHJZ255LqBQAAAABGcUH66f5CsGluFFzY/N6bdix1uZnDGaZv7lDKygVcfZfuCQAAAACe2R0H6Sf7C1eX7krZ3WnF6ihyJJxRVdzwRZ/nDAAAAAAe7HtVD/g1/URG2IVidtpyG/AyJZyups03LKkCAAAA+ShbRCU4nKkvZenVltJFA0HiSlPj5huWVAEAAIAsOj2Hov6QuhHumV7aCWoWnq81hzIVhypVAAAAIBFb8qT4RRC18++l/aCFSMIZZSWqXwxHNP4FAAAAVqKtjuGW1BEuQrFq0RLQSTijT8WhvgEAAABYhaozUX84EWqVguducUMq4YxCFXdxSMYBAAAAi1CYglt5NOo8zYg4agn3xWGQduqNK5JxAAAAwDwaU3AkpQyvNCLi+nlPU4IzSPv1DpJxAAAAwCT6ClHvrD3cfhFOVUO0RHgknNGo4m695XIWAAAAqB2nrhD1DlEx6gfFGvDywSbhjEoVNxw7RocBAACAStmfVGoaumLUT49VOrwCTglnVKq429nx+gwAAABUxu5Y7hzRNVyzztWao3IRxyzhjE4Vdz2hwAEAAAD44aByDfVG205kjKpFHL+E++IQpN0c4YI1VQAAAEDhkfZ/ZJ+MusB5rb7PU0TCGYX94h5gTRUAAMDG0VmH+qCAgjMVi7hSEs5oVXFX1KkCAADYLJ3STXB3yig4U62IKyjhvuh6aX9HGbA1DgAAwAbZ6Wwk8k0o+Gzu9ArZOGUlnFGr4rA1DgAAwNbQLOAYDmWYZFefiCsu4e5h8kozljjCAQAAwGY4qK1iuFNYwZkKRZyEhDNKz9F9cIaMAwAA0D66BZyAgjPViTghCXfHqY0UZBwAAICmUS7gZBScqUzECUo4o7VI9QFkHAAAgEbRLuBuvVyVYUUiTlbCGb3lDXcg4wAAALTGzp2VC7hy3UTGA1SLiBOXcEZxecMdyDgAAADtoLqNyA+yCs5UI+I0SLg7ejfG3SDjAAAAtIHmRr6/XE+ddJgqEXFaJNwXVvWLwRl94wAAAFTN/lSBMLl6HVmTCkScIgn3RXdSvKR6b/+LUxwAAADUifoahgfDUYeC+2I3SAdjBl0SztxX6QfpmEwynKx0iAAAAIB1dBVsgbszOOlIPaP87NSLGrX7hO4l1dvt2h80hg0AAAAYw9awgnpHqh1cFNUiTqWE+6LTXKX6AJvjAAAAVMDOVbGCekewHVwUxSJOq4S744J0dOa4YFUVAACAZqyvJAGnpBR1BLUiTrOE+2Kv/9Xh2qPlCAAAAI10+rv4/kdRIcM7SkWccgln7hngCl4gLl5h8rcgnbVH/8vBWvWjCgAAmmd3OA3ST8cVhIN0wKZQKeKuVTxsK0jGPdJxnXSgBLDHUxi7O5ezP3TSxgEAwFaxPpR+DGahcRvcCwpF3FV7zH6pIhm3ud1xs1PEFVUfAABQnP2xogXUO4OSfr6TWOkovVONhLtTRTLudi9WrSmq6SzdYzGcthGPOnCen07ayXRi4XHShukkNgKstGGbp5KH5X+Ckw7ZMpx0oF6pSsKZapJx9xNCpEPFzTpBrXib6tYIXGP+CSvtZDqx8ARpw3QSGwFe2rDNU5eEu6pfRP2PLhFXT9z+UH4M1y8n6TjxkqCl+07aaHAn0A/2D6y0k+nEwgMNN0psBHhpwzaP8g75L1T2iq9JxDnpYKRxqGB4WukgcZJ4DlpFr1oNE0jH+ThW2sl0YuGBhhslNgK8tGGb58jz02agt9KxWoseEeekQ5FMdxykgzeDdIQYyTjJFrk4eQLZGI9jpZ1MJxYeaLhRYiPASxu2efY8P21qhio3z/bSYfvBSQciC90FDu3O+DZkBaaGyqO2ybt/y7DSTqYTC0+7v+gsYiPASxsGND8ffzmrbgY3QS8duQf179hSvKbqpWPDxO6UG5nBSvuwcQLB8J7DSjuZTiw80HCjxEaAlzYM6H06/lBnCu6HXjp6X/TSQaBgd1Rap9rozi87EMTmhFScJIHgFs5hpZ1MJxYeaLhRYiPASxsGlG+Iq28X3CvyErkJCXen84N0LD+5SkeFh+wk3DdDowq3DgLNTZzESjuZTiw80HCjxEaAlzYMaN4Qd6mrEHWMnXT66CIdAUr26tqNnKVDwgHhoHXSvmyYQHYX41hpJ9OJhQcabpTYCPDShgEzsPy287m20fNdWMTpP+d+JQddFQ5H6XgwQHpQXDNp4PoIhLcxhpV2Mp1YeKDhRomNAC9tGFCxZeuTs5OOCxWiIq45CXfHyS9Q/9FJB4MeRyuSQ4tDsAoC6X0cx0o7mU4sPNBwo8RGgJc2DCjqYvZHA2uoT5CmNdZR2wlbS9lpkXGDdCToIZ8PmnyPqIFAfSdHsNJOphMLDzTcKLER4KUNA2bH8+NOpr1zs8VEXKsS7o4OGVd/25Z3GF7pIOJkCPS38gMr7WQ6sfBAw40SGwFe2jBgjPSu+2eufa2t4KaQqhux0o7zokDGNTdaWbLyEHEiBI57+YaVdjKdWHig4UaJjQAvbRgwxvP8uhNoZxPcGzLr1U7abX6kZVxr4oRpoELESRB4buYLVtrJdGLhgYYbJTYCvLRhQE13kbNreKKXEHFO2ukySMq41qZ7tqmgyRYs2glcd/MJK+1kOrHwtPajJiI2Ary0YcCoOG7rcuyko8BL+WTnhpo67JxQw5HGOoswbtxsb+OgfgLb3fyPlXYynVh4oOFGiY0AL20YMPLdRZoXcHdKB3lDEu6BSN+4tmpGWLvgOGnvtkdgvJ2/WGkn04mFBxpulNgI8NKGASPcXWQTAu5O2RW/po5nWMj+NBSNcWudRXrOWLVcI62UwHk/f7DSTqYTCw803CixEeClDQNGsrvIZgScKdzrd6ubyPfHklFua4Fw8avc5eyP9oHzp7A0/bnVISlHSBvVq7DSTqYTCw803CixEeClDQN3YqOZl7PrpB0vSkERd+2knZWjK1fj0FRnkW6RGLt4+/GHC3cjtqV4KyBkDe5lWGkn04mFBxpulNgI8NKGgTtHnt/3FE1XoUZY9pQkYPPrVod+KBFmaTdJCQscPnWRP3YL/rrm532VLLknuVhpJ9OJhQcabpTYCPDShoE7Hc/vO0abjXwXUOrAho2G94W9Z097NtUwY/497uqnXrtsmP2CYXuvbaLs7TwTt/2y4M9txbc0NmCh4UaJDRMvbRh4UHAT0aW5o7RWcCgSYiftphK4V1WdtIOE7GZfL85zj+vD7Ff4Ep6ANdj43Wpdy4SN+p0IftS6Oc3NvkScN1TDMEqJEmDsO3riwFirWnEO4oN+xtfrgtzublYyd+x+gHVAw23O70Riw8RLGwYelDiqYegPLT30EuFXy1trDDdLd+RJx7XUvmVuAlhYVDr3itLU6nMTQMNtzu9EYsPESxsGvhlmJt9cwnHDK6gv9MyRbklZ0MGRjmvpkIYw7eri94K5HZ+W0QeQADTc5vxOJDZMvLRh4BvO9BAScC/w7j1EF64Y5Om4TtojOiae5HdWpHZnRByej8qAhtuc34nEhomXNgx8w7WYet38DrgPeNvEId05xeFEF/yWEp5h0tNVq/MzIs4yeQDSgIbbnN+JxIaJlzYM/DBMzrxphM9+oIC5ONVLe6edpR1pZ2loKXU6DbfymTY9vLEjThfQcJvzO5HYMPHShoEfqBdTLyc0KYvAu5iKRNw8+2PID3Qn7QUd/ZSfq7u6edawdfcTvr5g6k12b5l2/3pnLfsvaffjyqHAtWIwarivO3XwjLfqEcC/u2VX/3VY5ffXte5XOrL2xNtzXeTrXjy+OS1SD2LDxCd92/5pcHRpBk2y+/n+Q9UtDNdBuZj6pd82E7f1TD/issFb5DJyl1UbWkqdbvG9Xl6Eqa/LKJveudPbV196ulqpvfs4+/UaTlznAVr/djHGa03aEb9T6TPJ7uDD8P5t/dHSmX2/wsfvN/SrFn5iw/TT7693vtebFQjH3Q+d698cupwp1rE693kv1kbqQWyY+JXfY4/9xxnL98FPFtDuY5oIGxEkH/c5Dei3GdgP3GpojY+Zncs4kquhME++Vfj13zc5xK+J08PuGNHcFKe+7CYW2Af6puSH2NUu0cPMuKDXcPuJlyOaExYni8wvJ7vwa8Iyv7vI1ShPG+qig/vsMr52aljftzqtGtixr/ErvqObWgAh2TsfjeRlA4d7EiymBg/9NsvEIKZhy+fdr6dz5zRR3UlbTscw4WbS+ViT53a5z89HPmn/f6Lrp75ymDwFbJbDXMHy4Ltl3xRTRM+f2flh6lrB5biyGmIN100798XZ5hm8n9/Oeu0XXSMs8XvyCLnp0+emLuJfrjE5/q5LB987C06pGVa8M8S+w8/+5Q9RefXE5Zj1S56+W333/5OR99a/e7+Lf88yC+NfwLfJLG8x9UqS990ABU7bwmrqSvbH9TquoaXUySHpkr5yWDc8I5+0v/8/reAenFLn/p2bMvaP5/k/zryG2/nZoTbY6PfTQ6rhbL8klINLN9ct3AAxLNACYd7v2UOAZ1Vc5Av8imt8fXr94O7mx9mPt27hN0aNW/bny8bGF31y2ns+kv9niTkNZ+IC2C0yJtru/Jrq3gKG2ehGuPR0a9mtM38sJQFO2ssKWavjGlpK7SfcTHwfmJSF3cfHIx+0P/+9aAfp1SdZuvRR9/VsWfAgndVwbtHlZo+mpYNQwy0QIz+kqtRlcvub+RxZzNw/v7slDSWH6bRK5CL+7xoxK16dWZm7WfDS8+SBW/SdsT/3s39p1oyNL4Jd5+2Pz0vu1l8gZzVcfApbVloftYbzKMyUxdRr8Nsp+6CgyMG0qVuOts4aHddJG0vHlM828TvDxHd+yt/Jiy/up3hZ/yZ5GBZ+953rvG6f0XDzB8r+XsqudiURMg23SjbcQpdg6soipLn7FWb8PiycDCYfypGL+J//Xqbpb8veIH7ZrS2bm9Gh38T+2M/+pdlHohAlYXgc192tWQ03MS0uMSe+lMqZ75quThtxV6SOqm5m+uFTgSZcySzUcQ2tV0/lzJJXjKcOTv380sgH7f3/5k7vesavM3JZDuSJ2UfLtIbbD8sv5da5kgyVhluez/xmgSB+ZZfw+jut6sO038uvN3U2TuQi/vt/+xW+LBZxS7XnMwtEU+xP/dwfpty5tcvHu7D4m78L4+c1XNzqJYo3OqsOq/xay/LXHMpK4E3B2xruP1ba0apZoOOctI109CxuDhPf+jE9T4ziNRLua2JaM/MvfXN/4joTkEkNZ1ddb+ZKVNBouC5hYlu3YGyH9Ve4TQuMMOl3v+IqE/oqcpGHXYvTsnMXeWbdl/4xr6ljfzkV4juJd25YozDWvB19i7h5DRcvEFjSHqmP/THvJpzJarI/JyHf0lkUYQqSqgnBE/vjVN+Rllarp9xM/9ap5Rz3/uHI5+xaCbdmPTXxWTc9f09puLXVTB9RYoFEwy1eEXxhzVM6uanmenn17XdPdJXIRbxZf+jiIhG37kXhmTlNHfs7P/1n6e1Ql6udlU73cbOex3z09iyZFqMWdYu9SmFmMXUI/sBrQOsUKWj4hnPj5GboXKzVVUajWm1M1aNnuDk1mXx8beRzdrWE+5pfFwqDVW/uz0ym+iY03HpXbFLgV0Kh4VI3+S7e9Zeot78vEh0QIfIXd7/7lVeJ/lIiF/EJ11iyRSYnSzCjqWN/5qf+KOfOLd4DOLVxI2byAg0Xj+X8Ymr0hY17m1M03uF0ROlCPjnjeS1IltJwbwj/GV0rbRYdU7N+ziCaSDJ8vMdGPmfXZioeX77I6PR0xWQ6JK7hElp7F0n25mu4nMe0W3aFrC0o0QERIn8QUqRQLGkUuYhPUr6zmal+/Xc+Mf3Tif2VZ7tzC5ePE9p12SUaLl6WMP9u28f+1C3xKIMRPXs/lKNjvuxWKFTQ8E1D/cvksW8b5Hj3pZZl4gmc5ebUY7B7+2zkYzYpwbNExK1+c39m4skS13ApD7MS2d5sDZf3mHbsV4gPiBD5fEjplRoT3JGL+KRGoXPt2/uE73xh6nbE/sbz3blFIm59gvt+txZouPjUOL+YGrOJszncg+e1vms4Qb3RMqwfaxk01MBMBc8Lqy3FdmJUZmmIqcVU9/bZyMcS1+jmN4NmSbipJ0tUw6XtCrI5N2AZuRou9zE9vyyVLQRiIi5EPh52Q8JFIj+WyEV82r6a6ZW4PuUrX3Hxb4/9iWe8cwtEXFog+yUaLi6z50Zt9CWA/7Wsf7hx9s6yX2p7MJ91/w6O3GLA+ntCrqWKhimplXcozBD/4vfdmsRDf058ZEq4iZk4pogSD8Ep0MEmU8NlP6Zns6YEQiDygw2RT4e0d4du1PzIRXziArSdiFSf9pWvxG9H7C88552bF3GJFwmRf3757qg8nJNi0RHEv8Wpc9j2xgX7WffvoEkcD51z0iYQMrWkkzcX9PEvflcH1EPfTxqWsviy8AIxRTQkXsdm3YElZGq4kOjYf+aypiSbiEd3loTIhxOHx/hzPXKRIe0aU5M6TY4grqljf+Fjf0DTSGtmUxBxZuR1zEel2NyS6BD5u5Y24WyQnnawLcBKuwz0MzEHZk44U9mut48WHfokL1ORC1BveeVfesnTcD2Bj9PvmkTP6LE6/UDz1X+sSval0sUCRXUQdzTxFfsDzzg27kz+BvJOef8kLPz26SWK6N+1tAlnexQtaPgGTeLALBNpjkwBMTW9dq8fLTr0SdIDkeV08l85+084S8NlL0o/mHqwkQXUfn53oPruH0b9oL6IjwSKbpknpqlXWkQzNu64ifFB3TQ/LPz66bkxmr/rJv8M6KbUCQ3PeGmngXoC3/CZGJl28ScTidtOdGLx+JOOXMO5zHswS46GI9INEzt3k6oLRhlZkgtU3x2/BP1FYslxwutENHXs455zbNyZGB/kTfPDwu+fXkwdln07qIpiJzS80Em7DbQzMXps5leH+Ff7xUY8cTk5e9+tY78rS9KG/rTKup69fVTjWzt5TsctEh1yDce+qTVHw02/l/7ers6OtlhcdKE5wX2/XbsllxhTJnN/sZpuxIMiF5l/vgz90dpFNyOqmWIf96OfnrvI/x/zMdZI/Y/o+JitSb2cDvef827RlDFyqXiLuKnF1GidmJv4I6Ccgic0PAPdD6aJT1L5bwB9/Kv96ycXDOWrfzXnEKY/H1nsmEzs9G8Tc3ea+NmOJkQWabjzX9Mm6/qZiYG9n1SGhpvSDcPxdRV458LEp9164+7XcLvllxhZ/Z78+O81Tr89GrrDaZj58JgbKy9iZwXNaJZsOut17V8LFXZu+iLjLw6xT/uxD0+vpA7H7tV8P/0zGAvsnenNkh9TRj/58QfvYz661WRqMTX2w2ipn8H2IFrAWU1edwjQPFNPydzvnphh36bK+YHsP6c/O/0g6tbadB75i1gr0IdJI18/r+HehMfX83T68cXdjCBdw03ohqsbu9IQD0rkElN3eOyQ9snj1T8+HyY+/M2b9jF2+k/GnuvrL7KfrsQdFVj95AVGpMNhmPoLO3aN2If9yGcncxZjd243qeIi4mc6M3L6/KMuTP3BnfcxH9WiUy9XsWHb0AmN24O6emYxKGsAk0w8wrNP+piolFup4SInOU6+GY1OmPFueNfI6078UK6xB8uchht9fE0+s7kr2dI1XB/9w8g5l7v4X/jRP5hK5lxGh8TEJT6FYpj4+jtjov4wJRvGfjHkFxnTu1PDLnIo7W7qxzOqqWMf9iOfnUqQhRGPv+imBPvYNaavEnF7bs35Y8xHb0U8PRKdZMZNAlUQZkYOH17adaCaiTkteyF+4sny9pCYGcTRdgeTKzbdyB/00UuMffpBvJucX+XyxFWiVt34392TNVz8vdRF/ybq6HiiZZiIZGxITMTy/akb4h+NuzHZXHDk8zMXGZfokxcZ8XziIvEeuVM/njHfY5/1nx+dSpDFB3Qf/6P146OLXGSmOeTHmI8aFfcjNqeiOVzFULXuSaGTdh5oZuJVdqyl1iqmjoB4/eT0ED7Hk8lTM/KI/VGLprrBR68x8mCZ1nDRq0xk4ri3tCZruBD7MzfxR1FHx7TMhMiYuF999I/en7pRDybdmLrFdkWYJi8ytXDzeZGpZHrKwB6XG7HP+s+PrtyB8Eu/7s/Sxse0iPsY89E7EV9MDQmuA+UMU6OGGZQ1gAkSZ9tlTAzLxR+cOW1nYh4fmWT7lEvEr+E+Pjqp4eIbG6byFlOWEZCq4dJq76IlJWOiIb64Nnm/on/2PiBC3PUpNyYWIUf+aPIi8YXyid/l5x/10c9OD+yJ3IL9/HTso/7jkxPDeTqtHHdkLBEXf/OZPMBt8jf6OeaH2Edji6nRMrFu0negmcIHpb6BsgYQR7+GmynmmnDgY+THdMfcmZ0h8nefwmPy+WDjV5iQosw7WlM1XB/5o5nsbfRyn9NU3LLpo6DjOay32xzirk/1dJlQKP7z01MXmQjwmotMbPKcDNTUTooR/5c7HR/NcxmFEP1L9xmi6GdnnnmTm/WWxygmR2PeZ+8vBmII9RX5BWUNIE6IDxyf/eUTo3K39IOz7yBxDz4m2djkPVc3sHyT8pSGm0xBxOeIj2vQkqjhYg/Q2T0/seTJp2joo4bNDInoH/rXz4W465MvDnENMKJ8Ji4ymZiJX+TjtsQ/Ovv+Hrfu07bYJ/3HJ+OZ0LlnUbzW+VMBxZXi3B7SieqJzzEf/fHHFlNjI9zNWAX00sdHTBG8dACAXkJ83NjsL5+YK1+/fGL0zja5nchCvH90GP/c/AtyH7nCx8NiSsN1U1eIL9DZqT/LJ1HDxbITs9ZGb9f74z2eZplL5kQv8TaWQtx1n/T9Y5ZNXGRSaqxwf1hhzmJXPt9rYp/07x+MJ0Lni6zjmcGPXHl0KXVWKa4b89HrjCvk6I1DLqVapnZ2l6GTDgFQS4gPG1vuy7MGbzwN8eZBbPvPvKPRRdj3D048HaaTA/Hnnp+1LotEDReR5wt23/aRq70/3+Nplm7uEiHyh8Oyj81eIvpusu5Ar+mLxCXK2wfjQ2c2UBM/ns+EauyT/v2D0feRJYWZQ+yPPxbpo25/GPRBiP7tyACODsTxX3Ts42gOVy/x8VIK9vN6QLVMjE5b7svjn1sw88X3KrxN+/34p5Y8WWIP1PdX8QlFNLOutaaDCSVpGi6mGxZsvo1dkKRD/jfRZM7rx0LU85kZM/7W8PnZ+EVm0r/xjNTbB6OSaYlqiKf7uvePxj7o3z84xD7pFhgUVUzvP9PowF1wGkJ80I+N+Whd+uh3L50qQDWQn6CYgJUOAtBK4Bw1i788/rluwWX62B+/PSUjc/GSLrqxFN77Y3JiH/7MFaKSxS8wL4M0DRdRMYtOBhsil3t79EbN6mavEF36eF2PC9FLuOnvj8fs87Pxi8yMu3h67e2DQ+xzdi5Od/rF5sU+6N8+F43+sv5oUXe6189FhfQS6Rq9yNiY72MfHpVlkVkGzeHqJTpaCoKKGBAhxEeNLffleSM3vlvhRRbEnryLTrNaODPHn+5zyfDoI4k5i56m4SKriYvWi2J5o9cnYtSuJc2Shsjf2pdPhajnc5mc6B9+fjR+kS71Iq/WxXsezkXpQVQqfsQ59kH/9rloAvH9g+NE04pvojLEPrfk9xy1cWx0RUM0Ntxjb3vZ3TaBFJOd5IvBfWAPqJUQHzT5yf8h/uX25YOZAze6P+nlKjm5o2iarHv9WFwRzXmSpVkySNJwsRU4t+SKsUfi6xMxqmmXXCN2t+zLp0LsErPqZ4j95af4i15kdtxF//LVi+gTZuGkH/Xl/YOxz/m3z0Uzyt0ie6KK6e1lZt0K5xtR4Ts65ocVl+qznAf6iPa0LMuCLQJgk0ycEOCzv3xiRC78YLfoOsve/MP4Z5ZppNiT0r1+LK6I7MwF1j1V6EjScLFkw6KUZuzp+6qcQsyqJVNZZ8fpll1iNp0Y/Uu7/KOz+dXoT/P1In3sY8tuRjzv9e5L7HP+7XMxcfWvvXMvcJ0FoviVUAmRUAlIWAmRUAk4qIRIqAQkrIRIqIS92321STjDAJPm0fP76/vu8hgIDScDDNrVxF6VH/5edGcHUCXRMQ/fL26aVjW4yYZYNrzvHXpySZR1x/hVvvZ1n+5VzURTxuiHlbNTagTKuEYNh+Z9XZVInAzU2RO6I6A6fCqnWvfUVAJ/msNKkBNaK5ngZQ1jP56yIVBcaeegDhXQPKaC41bnfkSVRIdXRpNQb7bKxpO1sXB43weapbuCrJJ1azjteXzNpz966SuXjEEVo3c+nFnSMypqwxo1XKgyFY0595AGynJf01hVKxQ7QZXySqwkOe6UlaBU2n2U8GTq+MeH0vlhMqgJW6VBcHF40O6MRxADudbiQziA1NNfNVL3XAjbKh0aaE+H16aSGIKGqx4y0pHsYUqUSruPEy47PaRBb+3Oq+hVDanY1RaKc1ZRpOFAhl7XlR3I7h9q0E3kdaAeT69CWmi4ZEOgGBrkrBe7PShg/PiVFcG+Ua7tKlsEq9FVoo1w8w0cjZM29fF0DO+1VZYP73vHLd0ZZI0IZ27m1HCj7SG1g1YzbwhXldcwfIvDJqcXkgLIuUINN9N77dHxA5+ooUMjoDqSOWGnOX0lyYboKtEpPQnNB9ANlMwPk3XK4jCogIFjMIBEyiVk5H2Mj3m4njb+WVfETSSrpEOjcQG4qZJEEKZw3YFNARyldPyqRMm0E7ZmIguqn0k2bmAI7E6fbAOyb4UabqaYl4/1BZDGMswWquM5Gs6oEih2G203aD1aKJnXNVg/jtEOv0EJtdXkZe9A8vFwBB+K1a9SshBrCO97p126O8gKwZFEMz6cAYLna7TXptYC2IqHxVjh8tYa/MCQ19Bwgjiv4XGmC7k2FYDqSH/ubkHDqbtBu2yNkvlhsh4k0z+5AEroNYm01YD8IDt8FqPFVNB4HincKmiYLQPji5AIwohxlUUHXLRXGaF/7SvqUf1I8hm2pOK0XAA5V6jh5jpt/1AFSmI5GwZQR7rHDTRc2qGoq6S8/NzGoGS+KJmASpai1U1tNSGeHT37HlQ3HI/oW1K7FZCsjHW54Wa/tIdskh4PmNrI0MKh7HaYEqTSyxfFG135K8llaGPG5D4mqCowZ00arrlXgZJ4w6YHUMdTNJxVJeXl/wKd2KNNXCiZL0omoNJwtdWEeHbUbcimoVQGDmruY9oqYJQsxrVZukfI+gh4wGgjewCkne9umBSk0p/mQq24v5Lx5d51vKKGQ6bW4v5qgE+rNWw6asaLaThbcQZ/9a3aHri4W2A0BIgy1G2wWQMXG9ivwWuSNopw4m8hKudkskeETWuVn4/woMGHdru0V9cVQAn3V/JcXnFqODtc2iqHbCoANWMXGi7jZY/q8SXJDJ6cqgil0ZBMDQf7+XExFQk97mLaKD0aZcvRLN0nZHVInxp17x5BHY4364BkXl1XACXMr+GGTaGGq8GlrXLIpgJQMzal4VAir+0FarhH4GNB78nH3z9YSmVwuI2yPjccA/2SKdLB1LqoRsJB0PFbDSTz6rpCcsTPtjt1YAc1XA0ubZVDNhWAmkENFy1Cl2yvGg6GiHtYTAVvvFbdcrIqejTIlsQt3StkdQjDpeoQoLQdzutsGCfDBFACNVyKNWk4n7bKGTYdNYMaLlqELtnSGk7r9MrVcDBE3P0lCd54DA63UdbohqMjjkwJeLhUBVSVfgFulBYk89WNoIZLQQ03gRouWoQu2bM0XABptD+XLjc7sur+kgRvPG5D3yaHHo3DZWmX7hiyNqRAETVxjeAVPh/T+KMgmVdXFkAJ1HApqOEmbErD9SCR1/bCi2o4kF/I3oMa/16S4I3H4HDbZK4ISrVYXlVDdoEkbio+IaWl1MmLEqTTr+WGZE3UcHHWpOHe0lY5w6ajZmxKw5WX/weqx5ckM3hy8ED7oxpC7dbeTwH2rgndhub037cUiIfDKXebwA2Qi9Mu3TVkbQhjteJuD+krZhIvCaSrv57noQTd7yOb4W6X19Bwkou1Bpe2yvLy8ADqeDENB2PxjX6mKJkvSiYAXx2PiTqUqNFVAnIL3Ya+Sn9FGlhKZXC4bbJWNxxv3CITpBm5LS61F0qdrC6AdPX3NMyv4V4xPtxcrzf3VwM8Le0Nmx5AHS+m4bSNQcl8UTIBlYaDiRwodQgaYFK3oYP2P68z8B5t1O0mK2K9bjjeuEXGSIcPihcC8goFCfUnuhSjHSU5uSqGevS1Ndx7XVe6h+9LZNNu7ku1qqRDqdTd8CQNp9+XoWoSiMWmneDQ+0l6LCjPWWo4g8Ntk/W64eiII2PEW6jawkJ7oczpPIxSamuDm+/8PU0ASVxhC6O8hoYrmQAzybapgPIeX5GGUzmtRGAJzTAdSuatGpxVAuwdnWhCiw+SlehF+f1NCnbxtepmkxWxZjccHXFkjLSYWuiIE0PrTA9qoZROWR18obf3NAEkMd2v8hoaDuUxvNsbrVtZ7hAv7/EVaTj4S5uaAoD3qYzSoWRe12C9U12xMUL48tTVo6pjTAcyHfEfGRxum6zZDffBBXoyQhRcRRJHDK0TmYZR0lZZn2ZzDErjSxqIeA0NB+dPO7NQb1jePVne4yvScJrPl7JuUF6IN/4Bwd+i9snB0TWsCDpKNMde4NFX8bGgXGdsD4PDbZJ1u+E4rMgYacAWrb2LXzERVYiSanc/daiA5p4GKVXTDSuvoeHggLETWJVb1s8hyvBZl/f4ijQcVDzqnYOogLGFKJ0fJqt2DCpVaUDJNPNbp230kD6e6aZ2gb7TNpqsCmM33Em4d7KMZukeIuuik0ZLgcaR7mCNTvQoqXZxDv5EFEYZLgC+jIZDtjozs6AS8KrsvaZF5T2+Ig0H9bR2XKuPACvTQbPH5SGU8h0uASu+OnHwSvmxoDqP6B3K4HCbxNgNd/l3tPbr0RFHBkjxeAt25R7Er47Y6IOJdY4d6IsYvJFRotzmSbyIhpt/XRoqC5U0QQNi6Jsq7/E1aTi4m1XpFIUHPMdrkiidV6arvEFh/EOFy6GK7R8dzCsbiV6UZySlx31DNoGtG+72UQF/ZaU0S/cRWRdBHIK5l8V04uBzkRwwcauqEDptBnM2amTMoFJeRMOh+dNwXRp+uGqkCbJvOLuX9/iaNBycb9pkDaKBk45G6XxpgXF0H2TSh2efqkj4Zk08FvB12qNvjkbVZLIujN1wXx9DwbRIOuLICGEi/+Q9b5uT/MkRfUnC1HWBAobT2DMONbyIhkPzrOEpPN0zBXSqp1De42vScJVBNqCemSwDooR+lA4ucrYqg3QfZP+k8EVji8YEmDP1WJBxx3ijZ/7tknmwdcN9j1vzUxJu2T4iayOIwyVLxImnXMHQw8k1NeMAd81jsidExHgVDZcKWW8A/BLQPK4e5B2mKu/xNWm4Oo8l7ufJmQiU0I/SlZ35/CMom421YmoYSh+ZCRvhIn0f/edW1WKyLmzl1q9XGK/9l8HvAzJAdsTliLiEhIuPPJzeK6qEn00jVwL6aTaqhh1SVwvceBUNh7pc6eE/pm+8wOtdaZ2IXpejBpX3+Ko0HPRY+mQV/wRv1iREh7oaOAU2CnvgRsiJj1eYFMX3lXjiKvVYOmBc/F8ZT3+LJKawTNxvsda3TDvcAvKKBHm8vDfKclJuaBfNhdMrXoP4s2mkKDqQzKtaFv/sb4aJXkXDoXlQN2vFvRkjxw88GJPWieht6YfJQn67f1iVhoNTjuZh4MyTpCilHyeEk1VV1I9pZsFdItQkHxFMPZYsbwr3LG2SPucZp7i/1cSgqQXQEUcGJBxxH1enKeWQ+tYA407I4ZOVYtk4ciWg969KeMSV4nhh71U0HHzPeU2d8Sc28q/hFa+UIw668NwwXSho9zer0nB4K4FP1oHnq6n+UNeCdU7ahYqH4zR0bwfTCvIpEeUh+Vh6MXvKZLJ+TN1wjxNEao7NxS3VQ2SdJD2957TScX2qkCaesSDLHw1+KY8tRil9unuAG64d9wAyxSUrCCDnOjUcUlgaPRx/YuM99KUxvPBQHruWQmH5K9NwWMtcm1Qd+Ptn2hKU0k9Swl9kutEBtiWjg25c4gOxTex1Sloo7MIbw+Bwm6TXP+E0g6+WjLGjgY44MkCQQj/0ic/KQ5ccdSh2fM1IDTDn5GAe/A0V+wfGE8XLaDiosBTXA8RXSf04Gf6qkAOAQTfQ2DcTCtr9zbo0HH6EqUrw1rCMC/H8JCWeq1Kh27DzNTauepj61oJxN33SJL9Uk49Fjl+eNJmsHVM3nB8Ubb2a6hbpILJaFFEIg8PZDz59mgcGbhJzybtKhG+bdpwWCo/kmQ2wAjMx7WU0HHb+tKkaQc5Gb5kYsRBvjxx/g4SSdsumuUnSZ1TSo5QJD7MQjDvjQrxpHUL8NflrSRBITSR5YrrtRnmac/oVlX4s+muTYiaTtWN5LdZ4q03GB4AGOuLIkKAZlKe42nGd5jy2Q1XL2VrBaOE1Hll96VDaRCwttIlm0qDX0XAwXyokdBfPFnkCPbRMiuIK38ET11IoabfceDdJ+oxKhB9BK1QgSLjYkjhK66dJsbtLHB3CXrX4D7THDf/Odfqr7nhSnQtMPxZ1xH3TS/zIkzDdtDYZ7Mb3sLoFOoismPRq6hfvfhRQ49iqBJy0tpDI6GFG6Us8Up2w6iR54tAmmukL/3U0nLBzyQm5oG6IZBIeLnacdjCP17ZgcxpO0jItLF+6Es9H0mekFQaVIOKk4wbTNt/QrHu9h0/UzpX0Y8FHSEa0yaLI+gjax6vAT4u39PLREUfG6HcCXEM4+xsX/dtRWrBMZQUblOUdeE0kR8DWwbkF19JO0r6QhhMyepjpDU3T0bp6XAWQAgfUizHXEkq7PQ0n/XLRVoSj8MuNnkxBiX0kLWr1rWy0rVY6boB6qxcaXoTi16aN88XgcBvE0g0Xc8Qar6a6Z/cPWTmd7QAbIq2iJDPHNij/c6J+jM5dwk4ddPC27aFREZNQ2pj9QwLIuVYNJ83T7y6aQ9hSHs0gvlB9LEOP00/HA2rA9jScqGXiD0Nc1fGxHDmJxakq+kUmHzdocvuoFMWvTRkijsHhtohlIN7ohGe7mkpHHBkira5U0woVa0arG+U5dnKGJlqTdLz72k1+dQes4KLhn15Jw0l6+CO0k4laemCgKtQnX/TtuClS8kicDZR8gxpO1jLdOIc4rFFQDJTaxxKLYRSuvhklbzqxAXgXhnXwe82vTbdzhMHhNoj4TsvEx6uwnWPdM3uHbADzi3nveKleVQn9+e1XFxycT/0UwGdwooX9ub3rOCdvg4697l9Jw6U+KS+n+8bJ5g3cKCl3T2KL5sOISFUQG38BJN2ghktpmf58fxbp3f2xCjI1XOpN8jk4/pImf8xC0EHrN5bm16YK8xU5UUVWT2c3ktCRFtvVVDriyIhEFPNy5JWFjDF7Q5EOvvY1KyFflSR7IuYqfykNpwl3pNtRDkeHJuCNast67CRrQCWWd5pbphKdlnlXDWvo9ULJfTS1+nemSCe5tEpXU4GO1fzaVLMwg8NtEEs3HNw6ZLua2jyxe8gmMN5z+Usidod9hTiYaGdUQ/Ql/VIazmywCH4W1Cu5xGQAKnuLGi7vIk8RFLgFpffx5J2ZQbIcKpsSzyCb6temWQ5Lhw0nq8NQXnlci+lqKrddkjGmYap/ScXQNa9QeBUbbfqLz3SvpeH0sbJkBD+L0VpZ9E0XQOJNajizi3zg2SOUwceTm22uTb08uqIyazScYtgzONwGMVyYl56/rZ+keVbvkM0wg4gTg6/dsK5QvCjSZr04PtO9mIazcbaIn5ImL7y4DAgg9TY1nJXLskX2oAwepFfGm0yRvvQ1/1zDp06t0XCKEHGpS8XICjH6JL0humFNV1PpiCMTzPfEpUeZcYWJ8JoWy07gHf1qGs7C2ZLwsxh8UwDXUgDJN6rhbBxfHtqTncPkRZK69uNGl1toC+dR3a8trRoZHG6D9LnjCOLlikxXU5tndA3ZFsYiTrG7F2UtHOsp0VgvC1ANr6bhDIRDcpKuf1ouXnAAyTeq4UxEnPDTQVk8zGHh0m+T/fQvW8TdyqzScMmvwMT+X7JG7FagUivppqupdMSRKaZx4lpFhSivHMUXkX4P1/5a4Sv65TRc9VhR+Flqn1YLyg0g/VY1nMHvVpoPUB6Ps9TPim2ym77IWgX7KrNKwyVDxDE43Aaxm/VcqirL1VThRBh5Yaw2SH/0qvNZKLcr2WWa2gN9o25ywTW8noarFA6apbLKp9WiYgPIsFkNVy3ixE96lMkLeeDdajrEq3cHHHt1md8jrk7DJd6PDA63Qezu/EivPGnCMqnx8/cN2SCVL99fwEWnY1B2V7Cuq5Fw8uWMFY16QQ1XJRxUEq5qNMLrOfeo4aT7YhW0oj0ol5cyVe3LUI6O75YrXRu/P946DZdYDGNwuA1iduUHCs7ziOUlcXTEkSgHgyEtzJ9DUAEufxJInoH9Qf/hPkZyVryihqvw2uq8tP8qnpZUQwB5NqzhajzoKacXyufFXBUKX/tT/qEJ6SLv9y7XabjE9ncGh9sedvF9naY6s5WuDx6CJoi3vnJodep3MCrB/csVcfoNnoUi9dpKhb6mhiv1k2VM0oeuqAbRDxyK271iDVfssywOAOQT+Ur3/qTKneK6RBPbpFXaMS9uwIvfN0tWTWLs6NGdZ7G8JI7jjQAOvmacTS6pF0BlfBWR4YORBdaYktkuyJ/YL6rhigTxNe/zseCTIlFDKG73mjVc2ceJ4peDsvpUxmOJK+69yJfV+B62sBuUWKnhRK8N/SLbw0xTaVc27S5WUZ/8IS9Ioffjk77NqQeV4r6t0E5Kue/9Q65DOyk7XlXDFUisS5NpqXbHk7qGUNzuVWu4z5zZoknjMkd5fTrrKXeCzNT3jxxPl2lt72c3Slap4cRDjE2x8WQpzOL7ttoazfbf0RFHJJoiX9x7m1cLKsf9/F01B5S895suo1VXn5zpXlfD/fvX9hl9meOl/SPraaVrCMXtXrmGy3wWH12TLrFKw2W69BU/NJnGnXwXvul86yJJgIZT78UQPigYHG6D9BnjU0L/0rRcTXXzdQzZPodTnzmgLi63juTQVHjM9LvvBjSd8qekmlheWcNlKIciBXdD/bQ0NZT3+Oo13OezQBWPueoUXJ2Gu6m4XmlQf3rGOTvwQvHa/ILfpp3PajITZiubjb5Ow6u9Zp4kyOZx2pnzk/dTk18BKszdk8iz9/VcUOsPh5Ni6enSqsp6bQ2nGyl9xbP6fFpt+mkpayjv8Q1ouH//jmfFrza01QePvLaAN8Xq0bVTtq6WUNkY/LthcLgNAoZDNn6JSj94EpqkeTv3ipEUSgTcP5WGk2bvi34iitOcgtCqq778gwOkCziCnDP/OqHFpTW/ddJIeT/Xt0d+Wvoayns84zE/pRKEO0uC93NcN+qiPgsDZJRxaEWN33fPu98AdIzaAKzhePfR9rC6/CpvY5rhlVscdERB054DHkTX4F1x0ajQcYmfc8D43RvObzZLL85fIu/10J34iZPLbaRM5+o+eKNH9e/rafXz1rATDm8+THtqwXF9jL5GruGcJSirUb5xIHjxje+L7dHBp5mHy6vW8MqtZo5uIXvk6LwPg0khhIs/ZfgGYmT9JNynCd+85fgAVDT3wr3P8XiQCc6d/P1JzTGzHV37V0M7t8Ny0xzd219PndYwrh8HR+vc0+tHLhB1z8Dpl2cEt8ehUDiNyfWGGV655efoF0K0oIHpljaMELJDwH5y/V62wMl0Pxj5w/IvvbK7cosXbpFFQQPTLW0YIWSHgOMV6mM8OMZvM6PVZB76WgX1TZtfs12QuILKCTEDjUu3tGGEkJWC3hqKcwlo8cxr64aeG0Z52B5GgUVKHr1dkDiu4ZMlQePSLW0YIWSloLeGYlcSCs2lPZbawKm3rWkRWYSgV0oSRRty7YLEPe9MNyET0LB0SxtGCFkpAbw1FFuDepC1qaya25I2iHj3rZ5zWe0llwlHoQeYLAgalm5pwwghKwXuJWpTOVuQUbse1cGJlHG6tkfurdlxStW7XZC4xrRXCMkBjUq3tGGEkJWCw3skplO4CUnnSjkKrhNX3yzyXIy2pBUvZdpIyA9+P5AlQaPSLW0YIWSl4MAMXs4IHXixHU3ncHmMb3gUL6LlxvLtgZyyeZSvZNoda+A6PlkMNCjd0oYRQtYKnvyclA1uI48qsJAzi/o5mklmxWZDWlNugI2I/ODoIwuCBqVb2jBCyFrBwbWuwhlBPGW2seQhZxZt5mkomQ+bMLuFBxq+yRpiAvQCk8VAg9ItbRghZK0Icb2uLcqEY/LHd6WHjEmURwO3R5fxfDOHjhazYw0ML0KWAo1Jt7RhhJDV0gvzWWhiOY4B5zhF6xAy8H21fWyuSm3rjLA61sBvCLIUaEy6pQ0jhKwWOUBqmLglXCckBytRQT+Fci1re5jE2K3VTmbHGhqLLiEkHzQk3dKGEULWSy9PadfLyf2ucrm2k1O7eBVBP4O2T2o1sSMxgnQU3dDwiNWxBoYXIQuBhqRb2jBCyHrR3XQZgsLPgXalB+38yZWsDWJyosFAOelHmQivCSELgYakW9owQsiKwUdTM3lHs19QF+Ge2XBiQmcwdCyEk83pWLqCyVKgEemWNowQsmIOvc3ch4ORBG0RVeElyCKYnGiIn4XJpLOwhFsyyVKgEemWNowQsmaONtvB8Y6moJ09uYy1PSxONNjIJqtjDc7EGkIy4YAkhJRgsgrV4vKDrgQpqjBZK73B2HE2puC4hVnwVANZhJl/HoSQvVJ/pu8qxUYNujLaZzWX2GGh/81OsvQGxnzw0lSyDGg8uqUNI4SsnLZyGUp2oQVVGe2T2kos6eoGzheNlTFGxxpMducRkgkaj25pwwgha6duT1yQPRdBU0b7nIYSUyz2oBmeZFGNtCQ81UCWAI1Ht7RhhJDVc6iY/nyibEXR4losWS0GkXUtA7I19ebccHYWEaKFw5EQUs6p0KUSv1X1kWBQBlkl72Vj5hFvaY/Ntak81UAWAA1Ht7RhhJAt0HQF013fpgsOqTLohNsox4IRM374pgYZxRfhqQbyfNBodEsbRgjZBseQOddpFFxKwwVVGWSNGLi9jPW7TXwRnmogzweNRre0YYSQrZDli9MpOFHDhVMzZ3PIvNR7vcxvyO2rTfrgqQayBGg0uqUNI4Rsh8NJt8fp2jltkW/edyGMJtc+dCd1CWSVvNXopJnmJ4NTFh/SpSOEzIQDcGWfEJJD014SDpb3sysr+uet1FiaS5biUq2VLvZGhWqjPniqgRBCyIY5tufoZHgNZ7rPyBcG19039laZBPq1DHhCCCGEPJ+Dc/7Oif4z8kj9dfeG4X3v1HsHPxhymhBCCCH7pTo43DzeLpNAv+9zWEYIIYQQsjz1weH8PIZ19RJullVeQgghhJAVUB0cbq5NZyaBfmdZ5iWEEEIIWZxqpdTOZZlFoF+GiCOEEELILqkODjefSjJxxPECOEIIIYTskerjn+18ttWfmGWIOEIIIYTskurgcLOe/OwNRBxDxBFCCCFkf1TfaeVWbd0HQ8QRQgghZI+ESoVkftn9kL5ewzFEHCGEEEJ2R3UgXTevfdUnLj4YIo4QQggh+6P21MDMbrh6P+HHbCGICSGEEEIWo6/UR25uA129hmOIOEIIIYTsjNp7ti7zmxjqRdxxfisJIYQQQp5I7T1bzfwmGjjieN8WIYQQQvZFXyeOnhI/N1RruOszzCSEEEIIeRa1S6nNM4w0cMTxvi1CCCGE7ImuTho96RqrUK3heN8WIYQQQvZE5Z3yzXOsrPUWcjGVEEIIIbuiMoDu07xbXbWI42IqIYQQQvZDpTZqnmVn9WUSz4iBQgip4eic/6V1jhGBCCFEom4p9YmbzLpqEXd4nrGEkCyO7Tn00x/tNXTeNUsbRwghq6RyKbV5nqX1jrj2ecYSQtQcTxf5W/J68W5pIwkhZHV0VaroqWc9L1WmfnAx9YW4L8hV8eZezXeLesLNV6XretXP93ppX+1plAN/AEsbRggxpW4ptXmmqfUx4jgFvAq+eqz8cg3+lTZloW7wM9XX+D7naXRuJjv2BvwBLG0YIcSSuqXUJ4dcC1XGfnAx9XWw03A3rq8jHVAX+Flqa7rsZ9HTGaeBGo6QlyD/HfpI81xjqx1xXEx9FWw13MfrSAfUfj9DXQUK7sbVv8ajqIIajpCXoGop9ek3H4Qaa2/w5f8imGu4V5EOqPXevKbDufhR9K25NXuDGo6QV6BuKdU929xqR1z7bIvJMsyg4T6lwwtEiUZt99YVvVV9PobG2p6dQQ1HyCvQVb1Hn29vqLH3g4upL8MsGu5z/OzeFYda7m2rOdQeMr+ebA3aG9RwhLwCVd/C7vn2Vjvidj8Hky9m0nAf17274lDDvWktx77+UexfT9dADUfIC1C1lLqAG+7fv/caiz+4mPoqzKXh5guysRKe0uy2LqLRD++vFPMlF2o4Ql6AruYV6pawuK2x+IOLqa/CfBru+Sd5ngpqtTeso/ZH/MuVIg5CDUfIC1DzOfy+jMl9hck3uADzEsyo4fYt4lCjvV0VVhKOIk6AGo6Q/VO1lNouY3PtBLCQ2eS5zKnhdi3iUJu9WQ12Eo4iDkMNR8j+6Srenv1SRvcVRn/se/4lf8yq4fa8J272JltKuE8RR796HGo4QvZPzVJqu5TRpwqjP7kuZTd5JvNquI/9nk5FLfZG5R9NjjPceaeIi0INR8juOVa8Ohdzw/07VE4C+51+yZ2ZNdy1WbqBc4Fa7G2KP/TWj+JsY9jeoIYjZPeU33Wz6GpS5fTMxdRXYGYNt0xgnWeAGuxtiq8N7RuBH2UxqOEI2T19+XtzyW0oh3KzbyznQSTPY24Nt9uzMai93qT0urv94nBLXAxqOEL2Ts1Sql/S8K7C8E94lO0FmF3D7VU5oPZ6i8LtV1JvcDU1AjUcIXunZpprljS8qTD8g6/8l2B2DbfXs6mzNlfzVK7h4m9cQtA+isbCtp1BDUfI3qm4tmrhPWV1m2oWCk5Mnsn8Gm6njjjUXG9QdvI4Un92g149uNNFcYSJW1ynUMMRsnNqvFnNsqa7CtOXt548gfk13E53xKHWeoOyEw8luGiut/QnW2Ng3M5wHrC0YYQQGyrirC1+KC+U2/7JaWnzyewIciGg2e2XLqjC1+zTn4ta6w3KFru1dzBf0yUeBbdHEEJejYoFSbe07XWx3heXoGR2BA3nFdmbVvHz2OXhmJpeSyAeSu3EpWnXi0+CgbsJIS9GRYSOFUTnkF/pKfa5k4k8UKnhPjn4lDdul96fyl6T6IS+TG1pO8iamjHiCCGvRYUrq13a9toLt9qlzSdzU6/hkrphn4up1b2GETSx4lRCJz0KnmoghLwW4itRZA0LF3UXbvGNv3ssNFzyU2GP/lyDXgMIJ5FUl55K5+hXsDRACCFPpFwE+aVNv1FzT9gqVCiZFRsNlxBxe1zBs+i1OEJfOk3+RnplNdXmEULIdqi49GYV3oe6OL+73I1OHjDScPLJn6ySNsJ8bcVdqTxkJAnqtto8QgjZDuV+rJUsRFbF+fVLW09mxkrDic6fy0zGL8l8P5kA+7FVltDjR7HL8yWEEAIQXocJmqVN/6Yqzu8ud6OTB6w0nPixs8cgNTa9llOy3i0uOOL2+CgIIQRQft/9al6WfXETPlayHkzmw0zDSYv2e9xXadNrOSXrr38S4iHxUAMh5IUoj82xmn3cVXF+26WtJ/NipuHE45DZZh2c+74E6c25Jju3guNnBaevGtrP/yrY92nUaxHLDLpReBYlJjXOtV999dlVc3/VHb4efDt7PbPw2VFvv8N2lr3Ev6O2tS///ov4NN4ZF07IUhTfd7+e792q8CIr2dRH5sJOw0mLqTnluFMXxj+m4N+s5vRj6y/j8r/ruHzOjPpyjHptirD5QV2G8FTzjGnefOhHJYTuNNNZp+Pp4fa2fjVfwRqa9jzpqGs4n5xVBcfPCqblt019yZ/6PETmuffg7awnZCHKL2lY0V2jNeFF9rgKRh6w03DSCW5tGc0JH8F5902eQRETJ9PgtJazUi0a9doUCw0nPIsM+eXO8BP2emmtHWWN74178lkc2k74Tg71ileqoD/XFP+GH/E3n7+HWusJWZDidcjripYCqsKLMLrIvrHTcNLhGVUBhzYkBuN7hXA4aG52/UalT4x6bYrQj+rWC+uxTllEc+4T3dTpigIjbLRf+NjFexK3xGsqn5Y6rh3+AFSN++QtPa76c6MtraSCvvDrRvmLuHaUcWSzdKpBHmFVa5A14UX80saTWbHTcMJefM182CSvXb1x9WUq7ih5SiLVdE1pa32RfQ8IGk4/l+IynM6IoOmmoDFIo+GaDvZkjypXnZlHue/LJHUa7nCC9o2a26rKm1bQqipIj9cxut/bD/1pRT4JQjIo3krWLG35IzXhRRhdZN+sRMMdOu2AvOaa9U+rSIakZkWUr8C8kbGCTepCcBlOY4K6v0K6OIWGi8sJ//U3vBOkSTcEevHueWs03CFLB7WKEsfoK+iyVFZUNEuUfjwRsijF4mc1gUW+6Uvb8cHoIjtnHRouZy786F2eXceQUfhj+8WhD3PlGRcxF1t0bWoL19Bk9VdSOyQ13BFsyfLff4U1K7YcIwH48GVaoeHazE/83IH7T+eD++GasQU76/f2az1XVMn2KD4NsLLhXh4hZXVNIbY8RcMlDmm7PnNM5vgcDuVHenppMyjK5PWmZZb88ZQLLw7CiIhyTbwhUhruDekJ//33vqIz0Ib9NmleWsPlSd0fk5u0zeUVBGXpSDQnref3PNkapZFF1hNY5Jua8CKr2tlHrHmKhhPd0iUiS1RXA459ful32vzWeq1l2SXfmP3XWDK/y5I6oeHwsTEv5v9QLBHA01wPOUs13KnonZoSvHUVXFtNwbnuwzv6nx0hq6D4QKdf2vIxXWlL1qdHiSlP0XCS8ih0CrQ6m6oCXIvVoBw+o8fiBMmg93mn0TKP/XsjFClrOEHA++8U+C3clrbm0YNXpuEOxefElCq8sAJF6bl+1kcyJCghK6B4Alidz7n8yrCVHc8gxthpOOGLRyip2Cmgury9Zr76pkVFowyZvRahky3KP4KoRn+yZMRVUJaihpM0o/8pAIr8pGAJIGObNk/WcKWrkTfeNbNDsfs4pEqviRb6wYt7yLYo/dZa4fJjxTunXdp2MiNPiQ+Hv94rdmoqfmVdeel/tKBslD6z1yIkPx2VgdmyOZS/JQQRJ2k4san+pwA4RlIByGGE9kedU6LhjjVX32hEnCuvIFF6rWNaHV+QkBVQ+kNySxs+peKn+4R91GQx7DScIMcalKcrH5YKEVfvhbsB1AlKntlrERRbOPpTU13NhAoJJ4k4QcPJWsgn+yOxsodeeoM3WoGGq5NwChFXJbTE0mvCTH0juVwJWRel432NO8gqTjXwuq09Y6fhuvwfBM6iIiHiql0O34AIiSh5Zq/F6FVmWV9aWnWvsjC3Yw13kBvqf0soXUxF6yitwjxBw9VKuLl9ZULplc/4i351O4UIAZTuHGiXNjxGV/6j5YfXjrHTcHh6QFNt5dacRISw+qn2h3g/5KXOQtsvfae821VDlRfuBgpehzVcop3+twTo4U18LaMBMOi0bA1nMa7EyOnV3x5Y2tbc2KMonpB1UfhSW9NVqXcqTjVkxI4kW8NMwwnXrIMlLwM/mRMMqtUkf8R/0Ch1Xq9FyTkPb3UnebWEg/4fqOFS6xw+3R/i5yUakcPNIbkazqCjPsQTOQYa0YOi61dSv3BSrxOyGkoji6z0M6X81cMNcTvGTMMFWA5YjLeYUITvJZvNcF+0sfJR4rxey+3LKMG76iotPDTxNx/UcCFRnP8rAr67xMPJHcjUasyDGi5ltRKovBsL97Gb1fY1bhYiZEqpm2ClS4/lXg9uiNsxVhou+5ZPk7kKRw9OfIG9n1vXfBvuTufE90105Qslzuo1QIG8DXXb42wUb1SYIA2XfCH5vyJgUnFNsgeZhro/U8NZfRrArw8TN1+8dHEt5vaLcF/JnPNdLxbfSt1OyFoo/DJd6yXxFdtZV6pKiQFGGk7anh4fPkZLnWihvxPyXM/NKHUjXyAZmxFR2pxegxS9e66XYh1XEz/y0YJYRyENF1Kl+b8iYJAQKXglatNoWSFPwxl11AdcrqneI/pNdO2kE6wZd+Tx3OPUdMSRTVCoedql7UYIv+AE3BC3X4w0nDC44q4y2Z/Rd6cvp8Ah6RMAO+klN1z0aigxvG3Mv4TS5vQapNhJ+anjXH51iQOiwb+5mzo8ujcfxJQxYQKedLqF/l4G1LTCqwmpoVZlHtBwiS+P6+e4/e6pNuXcja93yh7Y68U7dxu9zp0SrrJY6bDL45d/tLiGqO2ErIvC7TrrPNFwo/wTkhvi9ouJhhMFkIvlkAbj9TyaUo5S8fHBKQSra0EjhLW9WE/kpM2nasku+Ex/nOT8eW+Hb7RDK4kTZ9gUfy8DPhvhJl5k5ugFnaXh5LaEodZvTr2YOlK+KKbHoZ1F53HEVQZ/cygYCb7va6V7vgl5pNCpveLRXbx6xQ1x+8VCwzlpZMVn2SBUG5lRGmFx0cXK72HyFjajy2oDND/dXxqEDtJwvbT6j0lBUPcxF6RwP1pkJ4mFhsOLqbCVyBM71vw5Gk50j/ZumkG8tz6SXuirSzNNfsj69cLEWPGjnx1nBLIBChXPiveOlZ9qWHGjSB31Gs514thpYnlwIBJ0pzsevDGBhZdShUZhJ8gCGs4gGuu79jKHAIs4xyXSAedoJ4ktNBxeTJ3W9wPyxI4z5Gi4TrD2Eu2qRphGpp/7eNiiy+ZxIJLpghDqQ8HtAH8SnBHI6sFffiJrPdFwo7BJH9wQt2PqNNzBSVufcSEwU3Sv2hdYxLlpYhwVVvJOwSpie7jzGpyPSYjii1PUBHeNIOHwT1Az067Sa7hrOHvvnGu970I/6En4aOA+jwDqGA+ADA0nbrIEZghyd+pD7FDK9wY1Ew8TP06K5GSLyv6H+50zAlk9hU6rVY/trqxN3BC3Y4QZNniZ8DnPpoivpMIfl7QTIWdPVMkeeOkjJ5IYJfVSDTkIQZMzCG2yogCyijdjQv/SpD6lhrtMvIaP/w8fDVrVQxkmIyxDw3XYejxwhZjA466CGlG6mwuKuIlaRaU7XDg8B8EZgayeDv7yRFZ7ouFGcVRVbn/YLYahcCOAyacHyeXNpB2qZao1UAWJ3yecbiNpUVIv1pCDsO0sh+DkauBbQcwH13onilo1wiaxLcZAVZ55CcgkuV7DCesY0sDFm+jGQqgD6eTrVeG3zfh7BaVzUunApjWvNxHyRY9GvMiKTzTcKGvUB7c/7JdZNRw4pI08TImrwOHmnOmvDhkkHGO8AYVCJC1K6uUqcrC68TW2Hf5OALkSSwpQOozfFYoRJhsoVwdeueBRTr9G9RoON0RWNPiM9DAdcsOJ/tB/+AGOlrXhyZVWKhz1u2wSIYtTGIjDLW23TPGEveolYlLBnBoO7eIJIH3qSwHNJxOpCH+9vrAzImkLq8hC2hGfw1X4/SLlkJC7+CmORVVyhAnb7h5AehbEm1Ual/PMe9iARjYdZnQqS1IvX7gEOywe+lvFdVGUK9FkQpZGiC8lsPb41aVXwHL7w26ZUcMhtxoaheLll1/0IGc7Sle2PLg+DWcWtv8jNLk1JF3vqJPHrq7UCEMnkUd0KH80O3L1TuWi+pnjnSg+YbpytbOPJ0ovW3ag+KFgxfaLDwDkcUmrCFmUsou2/NJmpwhFzVq/OCWlzKfhoCRDqiG9lxRNhuNPDHgcoCnsjEhalNQnW5GF61FFeVwdqAD4txS7QgKoaqSTEiMssYD+B3ym0XHWgV6YplQ/c1Ck4uUI9w4OOhk10CW7Bi7CDlJhDad9BIRsCDjeRZqlzU5RHCKuWdpyMg9zabhYxNMf+ngOzV5SNBmOJqHGARLFQ69XJC1K6hXNyEK+ylVPGy0dKQeFcwy9TEYPUh5h+nttUDdE/VR6ZarWcPAxtEnTO5AzKBJpPp+Rx2GgpoUTbTh0CSEbpewEZ3ILyeIURw5tl7aczMM8Gu7qcY1os5pmV5TyDsxS1nUu9Zemy+h5gTZWOChb5XgHL5ORs0seYfrTUsDS6PdlxhjTaji4x1JxaB9+Oj8mAr2p2YqMhPhAskrhQaUNk4RskbJtKO3SZqfpihqm2atENskcGu4auy7rD7DVVBW/Bk2kNufB8ZdbJDFK6k1MGWKk4tpI0X08qer3jqwa6jJxhHl9J8DF1Ij+AO/v2BjTajiYTtEEuA/5IQ0afCqRC/TfUIkjI76Ttpp6CNkKRefBthBFrTRwKOMB7ZQZNNxJXh4L8Vy6YzN9PLPJfk0hGmskNUrqLUyZ2uZBy7NoJ+XWOEXhy8QPUkkjLOu5ZSym9vGUMamv1XABpWsqTH/4pQA7dJMKWkwd2JaY1K5nRpAiu6HsVqqVB4f7pi9q2sqDF5NiZtBw105UACCXV5nbgdxNfU8IEm55Dffvdi9t/ca4yYNB5+9VP3f0mhzuKZFGWJvTAR0qZWIs8nvFxqVWw6Fkqq/bI9if+WB5iBev+7RBi7XtY6IONeGPvmv5nie7oMxbtYnPmNJgBW5pw8kszLMfTliZQWtGTmWuarIqQrwVIZIeJfXVlgg2lh2XvzOJZAYKVPrHgOod+o6EEZbnPoVv5XacMme5Xqnh4Dq7z2oDpqp4JFpVB1+HvHftJiYyQiSKhM424m+UhojzSxtOZmGuc6kw6hfy/DQqc9HaX+V+zebUi62JZEFJfZ0lKd7qvHFjrxFotvJ0liq2nDDC2ry2A2OnviqgLaMLJUoNBwOGurw2IJBGVC1qw8XawePOONAW/BsdcmTL9OrB/oBf2modhaHf13/mlpQwX3y4Nl5hB5J7HSB3xfA8vPnkbyKSDSX15ZYoOfqQ7n3ESOyCVO+6h4HsGAgPYYRl6gRt6Be0xhvVQ0oN1ynrLgVpxE73JHqNdbANUfruRIcc2ShlvqpmabN1lN1AsYkDGySfGe9piO8PDbPUVTQ8nfuUISrnRCQzSupLLMnm7Vx6DZcb9EBhIQkGfYBHWO7tLzC8x0icgQX3+BhRargAUlkd9rK6kGPEQIU1+S7c4J1RAwl5IkWRcLfiqCpdTOU32S6Z877UqIibqa4Ml07jTv4S+pzSM9rhy55DPk3bZbXhh4HoKI75LTMQZ3iEtblN7kFBo4EGNvnFvymUGk511UIFAfZSFU7XVpHLqTFqJCFPoisZ6e3SVmsp3BfdLm03mYM5NVw0PulMVTlNY49v/lLkv8poh695GrkcT5ds30r7kH+mpz/4nsV1NLnNRc6qkYcNpHLRMpUaDqXyuW0AlLpVE3ibWt4Zd4Rsir5kmG9mD2jhtzej/O6SWTVcZNqcafUuqeEObzW7yCIFoqS+/pnkcTzl+eMez17NtII30FRwhOWvf8PF1IHCAOcvwZkznYbTLuMWg8qvxA9rKb6n57P7EmEfCVkP8PcqsYngcF+UBb9jlN99Mq+Gm96GOZeG81Ijy3eP/RAps8iQuWhy/HHuni/UdQvk0TY4wgp2n/SgqMEHZqdIozBvkAoOWxcvNRtUfiXjPj7WnGruGqPGEjIvRbv+rb7HnkBX9gte2mwyB1L0riCgFEWTT5vna7i32qBqH+vXcDfUUUcenkmo75ooj9K95pKqMchvOPCxgW4Aq4GVGq7Jb0SMwg/rJBOdXCXiqOLINih552/p2GbhfVtuabvJDAgazieyHjXuLaevrwpgrM0dVZvQcP9uMk7TmId3VbDonAjuwSj4xAvuWYdLJE0yDQrfqdNw2tscSpnr02bq6zxWuaSv3qjBhMxIyZfKdpZS/5U1sOiVS1ZPhYa70ZwTg2k8icyl4eJxKk7111N9ESkaJdX02nwcEsGKv7h7pIJN90xwDybBJ+7GxivoQVkPLyfgq0P7efet4SLK9VC3CfK9MWoyIXNRtB1uU8d2uqIfb240J7IFKjVcekpo1PVVEdtcVedyeCRSOEqq67UZaftUa+4mBqsOGuEe7DHVcGify8Nu3T6eAr2h963hova5OlfchrYNkdekZDvcNu7Z+qVsMXVbbSQ6qjXc55QgOrtGHuonarjCaNYxIq1GSbW9Nh+HVB/fv8Z6uy4a4B7MMZU/MLrl3w68zKXUV9RwGp0v0Ro1mpB5KNkOt7HAG2UrTDxbvkMMNJy8T3q0U/R5Gq7LLwT6JyKNRknVvTYjx15u5l/CkN9HKtyDMbbyBz2i9jcBUO7wDf2SGu5TxYWKQlujVhMyCyUCZ1NLqaWLqW5ps4k9FhpOduwOl16epuG6/CKanJkaJdX32owcgtjSv3RysnLcgy228gc5V/98i0DkwTf0i2q421bWvrjUjc135LUo2Q63tdhpZW8Mv7TZxB4TDSfGih0uphoucA4Ya7guM//77UKhxTXcwSFyZ01xNaH5TRUye0mLe7DEVv6kFlPB3/FGkJfVcP9u4aELd8b1XJMh66Vkktnckc2+5IfLQw07xEbDHYQBNZw+nxREIecykj74t4PcGZEmo6QZvTYF905uQNyDNDu731RB1UH5uAdLjOUPatePuxc8eLzZpVLDNWWtmIDKryS5ifnwVnTr7qbiMJAXo2Q7XLO00bkUHS/noYYdYqPhRM3UPCZ8ToxfnTO9D2f/5jSdEWmxzpBMcO9ku/qljna/iYKqn/JxD4YYazj0jf2jKsDrG7sxdebB8e3ipWaDyq9EJf2bNv8eE6t2E2JOwXa4rS2lFsZP4aGGHWKk4aSfzWBDHBx5cBVRRzOwJqSG8vu5jUzrK9Zw+YpH6AP3mwY1uKt8Gqp7Gsq6CC2mfp+dAfcdCJ+flfc0zH1f6qnuQeiX4J3PuK6t6KI0Qp5CibrZ3FJq4WKqW9pqYo6VhhM8u8NyUCrDNiVWUq/dG/ga2ZWGEzrB/aZBDbacoa23kgWpUeB0jRA3oFLD+cJWZLXqWRxP2vvaeKyBrJaS7XDN0kbnU7SY6pe2mphjpeHgXvOxIECThDNsVC8M4r7F+das4VxuWcIVnH9loQPFa9ZwSJt+6bQu/jdBcOjMg51ptUk4gPKf7h84nnS7iTYWTou8DgXb4ba3lFq4mMqNrPvDSsMJumm4kBVAKmfXJsEDdRXnxMU1nKCE2+zCcFnuNwnSjJZbX601HJJTXzbHvxCk5ijNQ6msXv7IDG9Ufhaacw7cHU1WSsF2uA0upZYtpm5RrBIZMw0neHYH6br5f0X4O6yXV4AW13CC7sr/gAqwLJesr6oRQ8zDcqDHe4SaVBpbSvMCSqbbJBzi+L8E6Ltjqe/mY3JVtVnIMkJESvxTm9zqX7SYurTRxBwzDSfE+R0IJ7RZwW5tBi8iXhs55/IaDk+c13TmEQGW5f7SoPOIhrudzDUckjsn+FZr6s3rUDKnMRn5V/1fCjTxLHh2IHGVg1vOMkIwBdvhthk2rSjGg1vaamKNmYbTbL+6gQae3WSF1aRL5OxQxkham14bE3AvZp+A7GFRzV8a1GLDe83NNRwaae+oyeL6gdI8ODGovj3QkGzvSax7yQIX789v/JKWEYIo2A7XLm1zGSVXirVLG02sMdNwgmRoB+lQqvmblFyXChm2GfXaCME9ni1ycVH3NPN7RWe44gC9pBvgzLLYAwkXaFT7wtBjfXB3BpDEZXePIYcONZsajqyUAmWzyaXUsjtTeRZpd9hpuKAsCKVzVk2ChjTFOSNpjXpthBQVxeUVhbeF9OlEhltf7TUc6qQWKNLGwjw4M2iWndGStcIOn9k5xnSo2UsbRkiUgu1w21xKTdxTDmBgx91hp+GwC2lY0OyuHzRhpnUJbEFGWl9lu3AwNVdX4efx+MrqQZqmqhmP2Gs4tJh6iT95ud+05sEVGsW4RU/18X2K9hgYqenGx0nlw7foMUoBWSM51yz+0C5tcykli6lL20yssdNwuKRhQeg7SRmsoInGo39MgcxITrZ4S18ksVGvjemhDXbBXh7L6UAa5THh6MNoBklmuC4+b8eL3BSteXBquKYXYlAdgxGJ3seNqksOifsykERMFgzbzUUZskY6NGAxzdI2l1LQ1u02lgDsNJz6vvYeJNPto4/6Wgb6r7g92DUdSVxci0wHbfjIW00VTmc9FoParFPUcT0+FE0zaLi8NYRGLEtrHhb4bdLeHuQcjPgOJNJppbjX9d509OUkd47Ubq+yi5Dngn5smO3GTCtZTHVLG02MWUDDoUU+1Up9vJbBPFc8eDvYgkhilNRrWoERf5VXfciPo+BmHyRE6VpNLfEeawZpZtBwWWsIiTe02jzo/OtTjjjoyhqkQk9e4ef7VFrRHnlsOijdJYvuQU6vMIuQJyPtRgFsMsDvF0IwCIhf2mhijJ2Gw7vJRuIM/sqcopIQzfmobeC4ThaPlUFGa72iEWVGfGSIOLyNabyDtwOpNI64uKAePe45NBwyOkbiDa02D++z8XIN8FmMtlKjJ58o/ov4d1H7kKK48FBhFiFPpmA7XLO0zeUUxFHZ6gEOglhAw8FZIenQQOYOXC3wXFLqc0v49We01ifbICMH377qFpwbdK7jRjtICrsr3RAgToblz6LhctYQGrkovXlYXRfe/tEO08EnnxbuwAf++HsK8SRpqV7lqCXkueRfXrDdpdQixbrl5pIYhhoO6oaxhoMDL3nUDeRsB4lK29PjroikLq0lRWot4KxYWnOiM29UQEDpUtLhEH/g47W/OTRcxmJq6pWlNw//VN6lZ4L3GIxywScvFn8DLJwPfk4dKNwlyi53axPyfKSv1zjbXUotW0xd2mZijKGGC6igyTVRPUqZ2L8NJNxINaDCE/vtpCtaIslRUp/opSSdYMdXa9tEAVJg1o+pUMYHLmURByTc5BnOouFSnXQn9YbWmyeoa2FoNVBuTr5YYKMSIxftfXSPidDwTmlcODw2GheV7JoCUdMsbXMN+ZLV8h5FsgYMNRxemx+nxB5g0ROH3OQj1QALF2cdPNdGGiDU4tMdJZPelNufhJY0PuGjmvyEe5RSFHFH9PZoRgln0XD6xdSxOWMyzOtwLR16IkjpfkQcWcKpIGnotuCBD5Vf6RaDALIpQwER8kzyT2pue22x4HJYw3sUyRow1HC4qEnSHibFsxXe49UoC5caJMy1sQbMqOFUPqZLG+2nQ5vc5Dr16Qh7KvD8joTDVIXPouHUi6nJN3SGeZLMB+udxz7HsoATQzmNva7tMCG0xEndA+cIhvglK0SYzwB+aZOrKDiG65e2mdiyjIYTZMM1rhsO2L00nk0CLBv7lWQJ91wNJ3oE77x3p8dous75TuNYd9MKhWwhkvxmYoA5mnHaeTRcp2jqjeRmlxzzpAkietrkJDzKdppceiGDfZBtjzKMHWVws7fkbsWuwYj5hCxNEH5CcTa+tAh//xAeTN0ZhhoOC7Ppz0RSG71vxsnFBcJxanwyCW4OhwuDP0SyoKS5vRYhyz/+Hj7RJ4/9gPFE/UmYahMnOPum7pl5NJxo8wPJXVs55kkRWyJ6F+urD7AWKR2qu3aTn9FBqmH83IR7JKHQhd5Wbocjq0T4AcXZ+p6A1zqHSyIYajg8rbqMtN/D7PzW/CY9OC8qrImZgpOvj390Se6SLyJ51OYUEBLmlHNtYvV1cp7L6X5pU9N2vZR4Wv48Gk75/Zn+5swyL7Hb5t2735THtpMHlYuVHw/V+0d/bu8D2J3EdfPpmrnkbm2i1gjzA5dSyQrRftrd2fqVcfkt5sHUnbGQhtN8PlyDxsU0DSonbhHomokporvkm0hrUdLcXouhXE0tACxUK+r78vf1qVSR1s+k4XTfn22ynDzz0jE1r6p+QuJSsyX762eRfGLTrxUxllTnxsnlwzGT5IQsT/4Wf7e0ybXkzxUbXz0mI56i4SLKIbEBTU9kG5Jc9OXk7kmT7pJvIq1FSXN7LUrJPXgaUJAKq/piUZpn0nDC0uAD5ffRx83TqF0NcX/ov7JbrGPE3Avy76Lv7k6+lO9bdy8eIU8m+96CSdyrzdHlNpkHU3eGoYbDexFiJUkXemYQ82coPsaCzpnxS6NvbHavRck/XqUBX72Zv6siistpSmUX9Qp7FNt3M80rWLqI0SJzjL5toleeKGzvVb5vfsqTdZI9qWx/T0D+VQ1+aZOJKU/RcNEfSsE1IVOic1XBeesETt/Y7F6L05m3QT6AGCwqiLZ9Lg2nkZ1tuphc80yGrTBz2HzbxJ+0kVLf/iYisk/y3/zb90nlRzXevm4ljzxFw8VXXix8TfG5qjMoeYDTNza71wDmbZAVjYX/J/MxV3aQZjFVcXgy27yupGuGiJdnWaxrg4OmVhsYFBcbE/J88j+wdjCSQ26buRFiX1hqODhDgE0HXe7gm9DGCzZ3xEW+1lDS7F5DdNaNAJ31Q73/B8zsc2k4xWKqJhJSvnldUe88ADfDfVPv6YMf2kYbGLiSSlZJtqN5D7HS8s9xLG0xMcVSwwVYFPja6bJHn9JC6+1kkYqybcqms21Dm6iudn5HK7Wzabj0CzvV5ELzurIO+iVxD229iBMmJpPtfJpuJeT5ZPuZ26UtNkB3uuuRHTgfyR1LDYcnVQdydNnD7xG8rm926vWHSFdkJC2l4C48SFI41Io4WMFsGi797tK8q0rM68q66BvFk6gTceJKrcF2Pq/oVUIWIHssN0tbbEGf22q3tMXEEksNhzUHLKrGYSZtrC7TI1d0ND2ygwCVkd1rAs4sTtx7o6iuRvliZTKbhkt+dasWSorMqxi2IMz0kLeKB3+RlWu1iOOOaLJSsr3M+7iyIHsFuV3aYmKJpYbDPyG8i1K4zadqIJZMVf0RtSByIQsqJLvXJA6hoBkRlOcI8f3pKQSNOJ+GS/kpW00hZeYVi6ygW8c49oXlpyVW5YeBqlMJWYDsTyu/tMUmZJ+C8ktbTCyx1HDCKWecKXVVKSDpzsgXce8HvDw3LR+lzO61RDMMXHG9U1eXvHUsTicok/k0XOroikouFZrXlA1bdVCOQ3a00i+ubbroQtO/y99+LAayW7J/Mzs5nJPbbB5M3RWWGk5Y3JJe/SULU4kFoxu5Iu5rekV/dJPiUcr8XpORLq1UcfU5W1ibUFCDOLHPp+FSF3Koyig2T7yKKk6GmC5z9QXdpFS8FBy/V5WQVZD7i9n+JQ3f5GrXfSwhkx9MNRyWG+J8mq0bdHNh1nrUT5FIFUz7AhU0TVlL0+X0zZjIBbEyiutjRzXIGnFGDScvpraqMsrNa3JfnVliukC9X0FYuIjpIbPozPIJeT7ZIaX2srUz+/Db0gYTS0w1nLAw34gZXcgYgH2rNEe/HnX9bSuaNqdfLqgoP0lZT7GKu2YruE8OWR6mpOtnRg0nv7R1iqnGvKxhW/Aosp57nr81y/SC8gl5NtnbZ/ayMSA7ukiztMXEEFMNJ2yIS33yOK3eUiu4r1JVW38eZieoQidKBSX0GebpOfhe2T+PXXUqnHUPJ21tnUsWNqOGExdTleE768xznbajmqIGNp1ST+crLPUv7oueCo6snOxdJ7sZ0n1mw93SBhNDTDWctDDvUnkbhUy5KjTDkLeQKvPSPiSHKnSiCFBCn2mgmuM53T8P9OeqDbtvnaIK3yhKmlPDSYsIyo/sWvM0w/a9VEx/cmgV3yGDMaymOWlPN1z24rEgOyZ3F8h+tvZ3eQ2/NEsbTAxpHKQxLU2jKI5naVLpu7eSqbARtE/ftaMij8j+cbGGvabmeAq6H+m7rz9xdWhFH5C6Cjgmqi38tBGPN23xBubJwzacmvyGDU0UH/v1Mh7DOUW3XZ8aS2cKOLIN8r5z97O9Mye6yHv1+4gQicObD9Pf4TWc26a80M+ZajLLVha5GO40bcsj/cU7s8qO7TnEq9jNMoQNt2E7Vbzvds/C+UvksYfuVC/Wm8+yI0/58zmH88nVm07I83jT7j7Y064wYRPT6CddtzpDiJaje/O/nEw8NrepqrUucjGOzvsQBpN6CMH7NzdDZQfnTn9P403lUH1R3H2I+Tk8so1zjz8LWx3tHn5zt9Ib09IJeRZKGRcJ3L5ZdPu+O767CSGEELJqNDJOHW97A6QjPl47bokghBBCyAZIyrg9aZrETbEUcIQQQgjZELKMW9o6U4SGcg8cIYQQQjbHGzypup/IIjdQVC+LCAWEEEIIIQtw9NEd//uJLHIjGinzwjAihBBCCNkyTTv1U+3LPzW5drDnFjhCCCGE7IHRquqeIovcGDQuGISNJIQQQghZCc3p7o5LXeC9Nbq/HXC8V4UQQggh+8P9XIzXLm2IMe33Auom7x4ihBBCCFFwePvUcXu7LLChfiOEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII2SH/AePch+wKZW5kc3RyZWFtCmVuZG9iagoxMSAwIG9iago8PAogIC9OYW1lIC9JbTIKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMTUgMCBSCiAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAvU3VidHlwZSAvSW1hZ2UKICAvV2lkdGggMjUwMAogIC9IZWlnaHQgODg1CiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIFsvSUNDQmFzZWQgNSAwIFJdCiAgL1NNYXNrIDEwIDAgUgo+PgpzdHJlYW0KeJzs3U2rZveZ5envk6Me10A4QVm2MyTZenUGslWWwRgNbNwCJ4K2wWBDYzAamKQnSc5SUw1F9qhA4/pObqkiWqEInTjnef/d/72vi/UB7L3ufThbC+L8/e8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDdv/7P//Xt1P9z2It/+x8/eSH1/yIAAAAAAAB4cT+1pXJ7391S7aoAAAAAAABU7plQbanc2P1bqlEVAAAAAACAaztkP7WlcnsHbql2VQAAAAAAAC7r2AnVnMotnTCkGlUBAAAAAAA42Tn7qS2VWzpzSzWqAgAAAAAAcIhLTai2VG7mUluqXRUAAAAAAIDvuviEakvlZq6xpRpVAeB8//DuLyekfgwAAMDG5V89PnwArud6E6o5ldu46pBqVAWAB+X/xcB/bQAAAG4g/37x1QNwS7eZUG2p3MDNtlSjKgD8fdn/euA/NQAAAEfJP0x88gAkbjyh2lK5gdtvqUZVAPYj/8afkLoEAADg6vLvDp88AK1qQrWlcm3hkGpRBWCT8q/4+akrAgAALiD/spiZuhaAW8snVHMq15YPqUZVADYg/1pfN3V1AADAofLPh+VSNwZwXflyakvlNvL91KgKwKLyr/Ltpa4UAAB4Uf6ZsJnUTQJcXr6c2lK5jXw2taUCsJb8A3wnqXsGAID9yj8Htp26XoCLyZdTcyo3kG+mhlQAlpB/a+85dfncIb8KETk/9Q+SQ+UPSpZLfbOwtvwV3lvqwgHOlc+mtlRuIJ9NbakATJZ/Wcu3U58Dz+THICLnp/5Bcqj8Qcn2Uh81TJS/mFKfAMCJ8tnUlsoN5LOpLRWAgfLvaLk/9YHgHRHZQuofJIfKH5TsJ/Wxw63lL53cmfouAI6Tz6a2VK4t30xtqQBMk384y1Gp72W/8upF5PzUP0gOlT8o2XPq84dryV8ueTD1jQAcKp9NzalcW76Z2lIBGCL/UpYzU1/Q7uSNi8j5qX+QHCp/UCLfpH4b4Fz5SyQnpL4agIfls6ktlavKN1NDKgCt/LtYLpv6oHYk71pEzk/9g+RQ+YMSeVnqlwMOlb8scn7qIwK4Tz6b2lK5qnw2taUCUMm/heV6qY9rF/KWReT81D9IDpU/KJFDUr8ocLf81ZDLpj4ogLvls6k5levJN1NbKgCJ/PtXbpb61rYsL1dEzk/9g+RQ+YMSOTb1SwN+cm489X0BvCjfTG2pXE++mdpSAbix/JtXktR3t015rSJyfuofJIfKH5TIyanfHvYoP3u5WepbA3gm30xtqVxPvpkaUgG4jfwjVyakPsOtyQsVkfNT/yA5VP6gRM5P/RqxC/mdS5L67gC+lm+mtlSuJN9MbakA3ED+YSvTUp/kduRVisj5qX+QHCp/UCIXTP0+sUH5VcuE1GcI7F2+mZpTuZJ8M7WlAnBV+cesTE59nluQlygi56f+QXKo/EGJXCP1i8UW5Gcso1LfI7B3+WZqS+Ua8s3UlgrA9eSfsbJE6jtdW16fiJyf+gfJofIHJXLV1G8YS8rvVsamvk1gv/LN1JbKxeWDqS0VgCvJP11ludQ3u6q8OBE5P/UPkkPlD0rkBqnfM5aR36oskfpOgT3KN1NzKheXD6aGVAAuLv9claVT3+968spE5PzUP0gOlT8okVumfuGYKz9OWSv1wQK7kw+mtlQuLt9MbakAXFD+lSrbSH3Ii8n7EpHzU/8gOVT+oERun/q1Y5z8JmXR1JcL7Eg+mNpSubh8M7WlAnAR+ZepbC/1US8jb0pEzk/9g+RQ+YMSqVK/fIyQ36GsnvqEgb3IB1NzKpeVD6a2VAAuIv8mlQ2nvu4F5B2JyPmpf5AcKn9QIm3qV5BMfnuypdTnDOxCPpjaUrmgfDA1pAJwpvw7VPaQ+synywsSkfNT/yA5VP6gRCakfhG5qfzeZJOp7xrYvnwwtaVyQflmaksF4Bz5F6jsKvW9z5VXIyLnp/5Bcqj8QYnMSf06cgv5mcmGU183sHH5YGpL5VLywdSWCsDJ8g9P2Wfqwx8q70VEzk/9g+RQ+YMSGZX6jeSK8uuSnaS+dGCz8sHUnMql5IOpLRWA0+Tfm7Lz1G/AOHkjInJ+6h8kh8oflMjA1O8ll5cflewq9b0D25SvpbZULiUfTA2pABwr/8wUeZL6VZglr0NEzk/9g+RQ+YMSGZv67eQy8kOSfaY+fGCD8rXUlspF5IOpLRWAY+UfmCIvpH4npsiLEJHzU/8gOVT+oEQmp35BOVd+QrLn1OcPbFA+mJpTOV8+mNpSAThc/l0p8rLUL8cIeQsicn7qHySHyh+UyPzUrymnyM9G5B/89AAuLV9LbamcLx9MbakAHCj/ohS5P/Ur0ssrEJHzU/8gOVT+oESWSP2mcpz8YES+nfqFALYjX0ttqZwpX0sNqQAcKP+QFDkw9btSyh++iJyf+gfJofIHJbJQ6veVg+R3IvLd1K8FsBH5WmpO5Uz5YGpLBeBB+fejyLGpX5pM/uRF5PzUP0gOlT8okbVSv7LcJz8PkXtSvx/AFuRTqS2VM+WDqS0VgPvlX44ip6V+dRr5YxeR81P/IDlU/qBElkv91nK3/DBEHkz9lgDLy6dSWyrnyNdSWyoA98u/GUXOTP0O3Vr+wEXk/NQ/SA6VPyiRFVO/uLwoPwmRA1O/K8Dy8rXUnMrJ8rXUkArAPfKvRZGLpH6Tbip/2iJyfuofJIfKH5TIuqlfX57KL0HkqNRvDLC2fCq1pXKyfDC1pQLwMvl3osgFU79Pt5M/ahE5P/UPkkPlD0pk6dRv8N7lByByWupXB1hYPpXaUjlNvpbaUgG4U/55KHKN1C/WjeTPWUTOT/2D5FD5gxJZPfVLvF959SLnpH6BgFXlU6k5ldPka6ktFYDvyj8MRa6X+vW6hfwhi8j5qX+QHCp/UCIbSP0e71FeusiZqd8hYFX5TmpL5TT5WmpLBeAF+VehyLVTv2RXlz9hETk/9Q+SQ+UPSmQbqV/lfcnrFrlI6jcJWFU+ldpSOVY+lRpSAXhB/j0ocpvUr9p15Y9XRM5P/YPkUPmDEtlM6rd5L/KiRS6Y+n0ClpRPpeZUjpWvpbZUAL4t/xIUuXHqd+5a8gcrIuen/kFyqPxBiWwp9Qu9fXnFIhdP/VYB68l3Ulsqx8rXUlsqAN/IvwFFktRv3lXkT1VEzk/9g+RQ+YMS2Vjqd3rL8nJFrpT63QIWk++ktlSOkk+ltlQAvpF//YmEqd+/y8sfqYicn/oHyaHyByWyvdSv9TbltYpcNfUbBqwk30nNqRwln0oNqQA8kX/3ieSp38ILy5+niJyf+gfJofIHJbLJ1G/21uSFilw79UsGLCbfSW2pHC5fS22pAPzdf1gQ+f9Tv4uXlD9METk/9Q+SQ+UPSmSrqV/u7cirFLlN6lcNWEm+k9pSOVA+ldpSAfi7/7Ag8nzqN/Ji8icpIuen/kFyqPxBiWw19cu9EXmPIrdM/cIBy8h3UnMqB8qnUlsqAPmHnsjA1O/lZeSPUUTOT/2D5FD5gxLZcOr3e3l5gyK3T/3aAWvIR1JbKgfKp1JDKsDO5Z94ImNTv50XkD9DETk/9Q+SQ+UPSmTbqV/xheXdiSSp3zxgDflIakvlEPlUaksF2Ln8+05kcuoX9ALyZygi56f+QXKo/EGJbD71W76kvDWRMPX7B6wh30nNqTwon0ptqQB7ln/ZicxP/ZqeK3+AInJ+6h8kh8oflMgeUr/o68krE2lTv4LAAvKR1JbKg/Kp1JAKsFv5N53IKqlf1rPkT09Ezk/9g+RQ+YMS2UPqF30xeV8ieeq3EFhAPpLaUrlfPpXaUgF2K/+gE1kr9St7uvzRicj5qX+QHCp/UCI7Sf2uLyNvSmRI6ncRmC4fSc2p3C+fSm2pAPuUf8qJrJj6xT1R/txE5PzUP0gOlT8okf2kft0XkHckMir1GwlMl4+ktlReJt9JbakAu5V/x4ksmvrdPUX+0ETk/NQ/SA6VPyiR/aR+3afLCxKZlvqlBKbLR1JbKi+T76SGVIB9yj/iRJZO/QYfLX9iInJ+6h8kh8oflMiuUr/xo+XtiAxM/V4Co+UjqTmVl8mnUlsqwA7ln28iG0j9Hh8nf1wicn7qHySHyh+UyK5Sv/Fz5dWIzEz9agKj5QupLZU75TupLRVgh/JvN5FtpH6Vj5M/LhE5P/UPkkPlD0pkb6lf+onyUkQmp35BgbnyhdSWyp3yndSWCrA3+VebyJZSv9BHyJ+ViJyf+gfJofIHJbLD1O/9LHkdIvNTv6bAXPlIak7lu/Kd1JAKsCv595p8O0rcRi77kl5P/qBE5PzUP0gOlT8okR2mfu9nyevYbZS1UC7+3gGbkS+ktlRekO+ktlSAvcm/13Yb5W47N+j3fPlTEpHzU/8gOVT+oET2mfrVnyIvYifR4wZy7RKBReULqTmVF+Q7qS0VYFfyL7VdpW5b3btr/EH5IxKR81P/IDlU/qBE9pn61R8hb2HD0ez20nYKjJXPo7ZUXpDvpLZUgP3IP9P2kLrkl8qfzB5Sl/yw/BGJyPmpf5AcKn9QIrtN/fb38gq2l7rSO+TPZEupywSGyhdSWyrfyEdSQyrAfuQfaBtO3e1x8se17dT1PiB/PiJyfuofJIfKH5TIblO//bH8+W8mdZOHyh/UBlJ3CAyVL6TmVL6R76S2VID9yD/QNpm61bPkT2+rqYu9T/5wROT81D9IDpU/KJE9p/4BkMmf/DZS13ii/Lktnbo9YKJ8HrWl8kQ+ktpSAfYj/zTbWOo+Lyx/nhtL3ed98ocjIuen/kFyqPxBiew59Q+ATP7kl07d3mXkj3HR1L0BE+XzqC2VJ/KR1JYKsBP5d9mWUpd5Rfmz3VLqMl8qfzIicn7qHySHyh+UyM5T/wwI5M983dTVXV7+SJdL3RgwUT6PmlN5Ih9JDakAO5F/l20jdY03kj/nzaRu8m75YxGR81P/IDlU/qBEdp76Z0Agf+Yrpi7tuvLHu1bquoCJ8nnUlko+ktpSAXYi/yLbQOoOA/kz30bqGu+QPxMROT/1D5JD5Q9KZOepfwbcWv7Al0vd2I3kz3mh1F0BE+XzqDmVfCS1pQLsQf45tnrqAmP58189dYF3yJ+JiJyf+gfJofIHJSL1j4Gbyp/2WqnrurX8ga+SuihgnHwbtaWSj6SGVIDNyz/Elk7d3hR5EaunLvBF+QMRkfNT/yA5VP6gRKT+MXA7+aNeKHVXmfzJL5G6JWCcfBu1pe5cPpLaUgH2IP8QWzd1dePkjSydur3n5E9DRM5P/YPkUPmDEpH6x8Dt5I96ldRF9fIKhqfuB5gon0fNqXuWj6S2VIDNy7/CFk3d22h5O4um7o2byu9tQuoSmCI/xTx1A438scsLqS/iFvKHvETqlgbJuxieuh9gnHwbtaXuVr6Q2lIB9iD/BFsxdWkLyDtaNHVv3E5+bBNSl8AU+SnmqRsYJO9iz6nLv4X8Ic9PXdE4eSOTU5cDjJNvo7bU3coXUkMqwObl31/LpW5sJXlZK6YujdvJj21C6hKYIj/FPHUDc+XV7Cp121eXP+H5qSsaKu9lcupygFnybdSculv5SGpLBdi2/MtrudSNLSlvbbnUjXEj+aVNSF0CU+SnmKduYAF5RztJ3fN15Y93cupypssLGpu6GWCcfBu1pe5QvpDaUgE2L//yWit1XQvLu1sudWPcQn5mE1KXwBT5KeapG1hJXta2U9d7RfmznZy6nDXkNc1MXQswTr6NmlN3KF9IDakA25Z/di2UuqstyEtcK3Vd3EJ+ZhNSl8AU+SnmqRtYUt7aJlO3ekX5sx2bupmV5GXNTF0LMEs+jNpS9yZfSG2pANuWf3AtlLqr7cirXCt1XVxdfmMTUpfAFPkp5qkbWFje3fZSV3oV+VMdm7qZ9eSVDUzdCTBLPozaUvcmX0htqQDbln9wrZK6qK3JC10odVdcXX5jE1KXwBT5KeapG1he3uCWUpd5FflTHZu6mSXlrU1LXQgwTr6NmlN3JV9IbakAG5Z/ba2SuqhtymtdKHVXXFd+YBNSl8AU+SnmqRvYiLzHbaSu8fLyRzo2dTMLy7sblboNYJx8GLWl7kc+jxpSAbYt/9paInVLW5aXu1Dqrrii/LompC6BKfJTzFM3sB15lRtI3eHl5Y90Zupa1pbXNy11IcAs+TBqTt2PfCG1pQJsWP6dtUTqlrYvr3iV1EVxRfl1TUhdAlPkp5inbmBr8kJXT13gheXPc2DqTrYgL3FU6jaAWfJV1Ja6E/k8aksF2Lb8O2t+6or2Ii96ldRFcS35aU1IXQJT5KeYp25gg/JOl07d3iXlD3Ng6k62I69yTuoqgHHyYdSWugf5PGpIBdiw/CNrfuqK9iWve4nULXEt+WlNSF0CU+SnmKduYJvyWtdNXd0l5Q9zYOpOtiOvclTqNoBZ8mHUnLoH+UJqSwXYqvzzan7qivYoL32J1C1xFfldTUhdAlPkp5inbmDL8nJXTF3axeRPcmDqTrYmL3RO6iqAWfJV1Ja6efk8aksF2LD882p46n72K69+fuqKuIr8riakLoEp8lPMUzewcXm/y6Vu7GLyJzkwdScblHc6JHUPwDj5MGpO3bZ8HrWlAmxV/m01P3VFu5a3Pz91RVxeflQTUpfAFPkp5qkb2L684uVSN3YZ+WOclrqQbcprHZK6B2CcfBW1pW5Yvo0aUgE2LP+2Gp66H5yoE92d/KgmpC6BKfJTzFM3sAt5y2ulrusC8mc4LXUhW5aXOyF1CcA4+SpqS92wfB61pQJsVf5hNTx1PzyVX8Lw1P1wYflFTUhdAlPkp5inbmAX8pbXSl3XBeTPcFrqQrYsL3dI6h6AWfJV1Jy6Vfk2aksF2LD8q2py6nJ4Jj+G4an74cLyi5qQugSmyE8xT93AXuRFL5S6qwvIn+Go1G1sX17xhNQlAOPkq6gtdZPybdSQCrBV+SfV8NT98Jz8Hoan7odLys9pQuoSmCI/xTx1AzuSd71K6qIuIH+Go1K3sX15xRNSlwCMk6+i5tRNyudRWyrAVuWfVJNTl8Md8quYnLocLik/pwmpS2CK/BTz1A3sS173EqlbOlf+AKelLmQX8pbz1A0A4+STqC11e/Jt1JYKsFX599Tk1OVwt/wwhqfuh4vJb2lC6hKYIj/FPHUD+5LXvUTqls6VP8BRqdvYi7zoPHUDwDj5JGpO3Z58G7WlAmxV/j01NnUz3Cc/j8mpy+Fi8luakLoEpshPMU/dwO7kjS+RuqWz5E9vVOo29iIvekLqEoBx8knUlrol+TBqSAXYsPxjamzqZnhAfiGTU5fDZeSHNCF1CUyRn2KeuoE9ykufn7qi0+WPblrqQnYk7zpP3QAwTj6J2lK3JN9GbakAW5V/SY1N3QwPy49kcupyuIz8kCakLoEp8lPMUzewR3np81NXdLr80Y1K3ca+5HXnqRsAxsknUXPqZuTDqC0VYMPyL6mZqWvhUPmpTE5dDheQX9GE1CUwRX6KeeoGdirvfXjqfk6XP7pRqdvYl7zuPHUDwET5JGpL3YZ8GDWkAmxV/hk1NnUzHCG/lrGpm+EC8iuakLoEpshPMU/dwE7lvQ9P3c/p8kc3KnUbu5M37t6AafJJ1Jy6Dfk2aksF2Kr8M2pm6lo4Tn4wk1OXw7nyE5qQugSmyE8xT93ATuW9D0/dz+nyRzcndRV7lJfu5IBp8j3UlroB+TBqSwXYqvwbamzqZjhafjNjUzfDufITmpC6BKbITzFP3cB+5dVPTl3OifLnNip1G3uUl+7kgIHySdScurp8GDWkAmxV/g01M3UtnCI/m7Gpm+Fc+QlNSF0CU+SnmKduYL/y6ienLudE+XMblbqNncp7d3XANPkeaktdWj6M2lIBtir/ehqbuhlOlF/O2NTNcJb8fiakLoEp8lPMUzewa3n7Y1M3c6L8uY1K3cZO5b27OmCafA+1pS4tH0ZtqQBblX89zUxdC2fJ72dm6lo4S34/E1KXwBT5KeapG9i1vP2xqZs5Uf7cRqVuY6fy3l0dME2+h5pT15WvorZUgA3Lv54Gpu6Ec+UnNDZ1M5wuP54JqUtgivwU89QN7Fre/tjUzZwof26jUrexU3nvrg4YKN9DbamLyldRQyrAVuWfTjNT18IF5Fc0M3UtnC4/ngmpS2CK/BTz1A3sXX4AM1PXcor8oU1LXch+5dW7OmCafA81p64oX0VtqQAbln86DUzdCZeRH9LM1LVwuvx4JqQugSnyU8xTN7B3+QHMTF3LKfKHNi11IfuVV+/qgGnyMdSWuqJ8FbWlAmxV/t00M3UtXEx+SzNT18KJ8suZkLoEpshPMU/dwN7lBzAzdS2nyB/aqNRt7FrevsMDBsr3UHPqcvJV1JAKsFX5d9PM1LVwMfktzUxdCyfKL2dC6hKYIj/FPHUDe5cfwMzUtZwif2ijUrexa3n7Dg8YKB9DbalryVdRWyrAhuXfTQNTd8KF5Rc1M3UtnCI/mwmpS2CK/BTz1A3sXX4AM1PXcor8oY1K3cau5e07PGCgfAw1p64lX0VtqQBblX80zUxdCxeWX9TM1LVwivxsJqQugSnyU8xTN4Aj3MhZ5g9tVOo29i4/AIcHDJSPobbUVeSTqCEVYMPyj6aBqTvh8vKjmpm6Fk6Rn82E1CUwRX6KeeoGcIQbOcv8oY1K3cbe5Qfg8ICB8jHUnLqKfBW1pQJsWP7RNDB1J1xFflczU9fC0fKbmZC6BKbITzFP3QCOcAtnmT+xaakL2bv8ABweMFC+hNpSl5BPorZUgA3Lv5gGpu6Ea8lPa2bqWjhafjMTUpfAFPkp5qkbwBFu4SzzJzYwdSe7lrfv6oCZ8jHUljpfPokaUgE2LP9iGpi6E64ov66BqTvhaPnNTEhdAlPkp5inbgBHuIWzzJ/YwNSd7FrevqsDZsrHUHPqcPkkaksF2Lb8i2la6kK4rvzAZqauhePkBzMhdQlMkZ9inroBHOEWzjJ/YgNTd7JrefuuDpgpX0JtqcPlk6gtFWDD8s+lgak74eryGxuYuhOOkx/MhNQlMEV+innqBnCEWzjL/IkNTN3JruXtuzpgpnwJNadOlu+hhlSAbcs/lwam7oSry29sYOpOOE5+MBNSl8AU+SnmqRvAEW7hLPMnNjB1J7uWt+/wgLHyJdSWOlY+idpSAbYt/1aalroQbiE/s5mpa+EI+bVMSF0CU+SnmKduAEe4hbPMn9jA1J3sXX4ADg+YKV9Czakz5XuoLRVg2/IPpYGpO+FG8ksbmLoTjpBfy4TUJTBFfop56gb4Wn4G01IXcrT8iQ1M3QkA3CGfQW2pM+V7qCEVYNvyL/SBqTvhRvJLG5i6E46QX8uE1CUwRX6KeeoG+Fp+BtNSF3K0/IkNTN0JANwtX0LNqdPke6gtFWDz8i/0aakL4XbyY5uZuhYOlZ/KhNQlMEV+innqBvhafgbTUhdytPyJzUxdCwDcIZ9BbanT5HuoLRVg2/Jv84GpO+Gm8nsbmLoTDpWfyoTUJTBFfop56gb4Wn4Go1K3cYr8oc1MXQsA3CGfQc2po+RjqCEVYPPyb/OBqTvhpvJ7G5i6Ew6Vn8qE1CUwRX6KeeoG+Fp+BqNSt3GK/KHNTF0LANwtn0FtqXPke6gtFWDz8m/zaakL4dbykxuYuhMOlZ/KhNQlMEV+innqBvhafgajUrdxivyhzUxdCwDcLZ9BzalD5GOoLRVg8/IP84GpOyGQX93A1J1wkPxOJqQugSnyU8xTN4Aj3MJN5g9tbOpmAOAO+QZqSx0iH0MNqQCbl3+VD0zdCYH86gam7oSD5HcyIXUJTJGfYp66ARzhFm4yf2hjUzcDAHfLZ1Bzai4fQ22pAHuQf5VPS10IjfzwBqbuhIPkdzIhdQlMkZ9inroBHOEWbjJ/aGNTNwMAd8s3UFtqLh9DbakAm5d/kg9M3QmZ/PYGpu6Eh+VHMiF1CUyRn2KeugEc4RZuMn9ok1OXAwB3y2dQc2ooX0INqQB7kH+PD0zdCZn89gam7oSH5UcyIXUJTJGfYp66ARzhFg4yf26TU5cDAHfLN1BbaigfQ22pAHuQf49PS10Ipfz8BqbuhIflRzIhdQlMkZ9inroBHOEWDjJ/bsNT9wMAd8g3UHNqJV9CbakAO5F/jE9LXQix/AKnpS6Eh+VHMiF1CUyRn2KeugEc4RYOMn9uw1P3AwB3yzdQW2oiX0INqQB7kH+JD0zdCbH8Agem7oQH5BcyIXUJTJGfYp66ARzhFg4yf27zU1cEAHfIN1Bz6u3lS6gtFWAn8s/wgak7IZZf4MDUnfCA/EImpC6BKfJTzFM3gCPcwkHmz21+6ooA4A75AGpLvb18CbWlAuxE/hk+LXUh9PIjHJi6Ex6QX8iE1CUwRX6KeeoG9i4/gFGp2zhd/uiWSN0SANwh30DNqbeUz6CGVID9yL/Bp6UuhBHyO5yWuhAekF/IhNQlMEV+innqBvYuP4BRqds4Xf7olkjdEgDcIR9Abam3lC+htlSAncg/wAem7oQR8jscmLoT7pOfx4TUJTBFfop56gb2Lj+AUanbOF3+6FZJXRQAvCgfQM2pN5PPoLZUgP3Iv74Hpu6EEfI7HJi6E+6Tn8eE1CUwRX6KeeoG9i4/gFGp2zhd/ugWSt0VALwoH0BtqbeRz6CGVID9yD+9p6UuhCnyUxyYuhPuk5/HhNQlMEV+innqBvYuP4A5qas4S/70FkrdFQC8KB9Azak3kM+gtlSAXck/vaelLoRB8muclroQ7pOfx4TUJTBFfop56gZ2LW9/VOo2zpI/vbVS1wUAz8nXT1vqDeQzqC0VYFfy7+5pqQthkPwaB6buhJfKb2NC6hKYIj/FPHUDu5a3Pyp1G2fJn95yqRsDgOfkA6g59aryDdSQCrAr+Rf3wNSdMEh+jQNTd8JL5bcxIXUJTJGfYp66gV3L25+TuooLyJ/hcqkbA4Bn8vXTlnpV+QxqSwXYlfxze1rqQpglP8iBqTvhpfLbmJC6BKbITzFP3cB+5dWPSt3GBeTPcMXUpQHAM/kAak69knwDNaQC7E3+rT0tdSGMk9/ktNSF8FL5bUxIXQJT5KeYp25gv/LqR6Vu4wLyZ7ho6t4A4Kl8/TSnXkk+g9pSAfYm/9CelroQxslvclrqQnip/DYmpC6BKfJTzFM3sF959XNSV3EZ+WNcN3V1APC1fPq0pV5DvoHaUgH2Jv/EHpi6E8bJb3Jg6k64W34YE1KXwBT5KeapG9ipvPdRqdu4jPwxrp66QAAwp25QvoEaUgH2Jv+4Hpi6E8bJb3Jg6k64W34YE1KXwBT5KeapG9ipvPdRqdu4jPwxbiB1hwDsXT592lIvK99AbakAO5R/WU9LXQgT5Wc5MHUn3C0/jAmpS2CK/BTz1A3sUV76qNRtXFL+MDeQukMAdi2fPs2pl5VvoLZUgB3KP6unpS6EofLLnJa6EO6WH8aE1CUwRX6KeeoG9igvfVTqNi4pf5ibSd0kAPuVT5+21EvJB1BDKsA+5R/U01IXwlD5ZU5LXQh3yw9jQuoSmCI/xTx1A7uTNz4qdRsXlj/PjaXuE4A9yqdPc+pF5AOoLRVgn/Lv6IGpO2Go/DIHpu6EO+RXMSF1CUyRn2KeuoHdyRsflbqNC8uf5/ZSVwrAHuXTpy31fPkAakgF2Kf8I3pg6k4YKr/Mgak74Q75VUxIXQJT5KeYp25gX/K6R6Vu4yryp7rJ1K0CsC/59GlOPVM+gNpSAXYr/3wemLoThsovc2DqTrhDfhUTUpfAFPkp5qkb2Je87lGp27iK/KluOHW3AOxFvnvaUs+UD6C2VIDdyj+cp6UuhLny4xyYuhPukF/FhNQlMEV+innqBnYk73pU6jauJX+we0hdMgDbl0+f5tST5eunIRVgz/Lv5WmpC2G0/D6npS6EO+RXMSF1CUyRn2KeuoG9yIuelrqQK8qf7U5S9wzAluW7pzn1ZPkAaksF2LP8S3la6kIYLb/PaakL4Q75VUxIXQJT5KeYp25gF/KWp6Uu5Lryx7u31IUDsE357mlLPUG+ftpSAfYs/zoemLoTRsvvc2DqTnhRfhITUpfAFPkp5qkb2IW85WmpC7mu/PHuNnXzAGxKvnuaU0+Qr5+GVIA9yz+KB6buhNHy+xyYuhNelJ/EhNQlMEV+innqBrYvr3ha6kJuIX/IO0/dPwBbkI+ettRj5eunLRVg5/Jv4YGpO2G0/D4Hpu6EF+UnMSF1CUyRn2KeuoGNy/sdmLqTW8gfsjxJfQgArC3fPc2ph8unT0MqAPkn8LTUhTBdfqIDU3fCi/KTmJC6BKbITzFP3cCW5eUOTN3JjeTPWb6b+igAWE8+etpSD5evn7ZUAPLP3mmpC2EB+ZVOS10IL8pPYkLqEpgiP8U8dQOblTc7M3Utt5M/anlZ6tMAYCX57mlOPUQ+fdpSAfi7/w7g65vj5Vc6LXUhvCg/iQmpS2CK/BTz1A1sU17rzNS13FT+tOXA1JcCwGj56GlOPUQ+fRpSAfi7/w7gc5vj5Vc6LXUhvCg/iQmpS2CK/BTz1A1sUN7pzNS1BPJnLsemPhkAxskXT1vqg/Lp05YKwN/9FwCf2Jwkv9KBqTvhOfk9TEhdAlPkp5inbmBr8kLHpm4mkD9zOSf1+QAwRT56mlPvl0+fhlQA/u6/APis5iT5lQ5M3QnPye9hQuoSmCI/xTx1A9uRVzk5dTmZ/MnLRVLfEQClfPG0pd4jnz5tqQA8kX+3DkzdCQvIr3Rg6k54Tn4PE1KXwBT5KeapG9iIvMfJqcsp5Q9frpH6rAC4tXz0NKfeKd89bakAfCP/UB2YuhMWkF/pwNSd8Jz8HiakLoEp8lPMUzewvLzB4an76eUVyFVT3xcAt5AvnubUO+W7pyEVgG/kH6fTUhfCGvJDHZi6E56T38OE1CUwRX6KeeoG1pbXNz91Rb28ArlZ6lsD4IryxdOW+oJ897SlAvBt+QfptNSFsIz8VqelLoTn5PcwIXUJTJGfYp66gVXlxS2RuqUp8iLk9qmPDoALyxdPc+oL8t3TkArAt+UfodNSF8Iy8ludlroQnpPfw4TUJTBFfop56gbWk1e2SuqiBsm7kDb1AQJwAfncaUv9tnz3tKUC8IL8w3Na6kJYRn6r01IXwnPye5iQugSmyE8xT93AMvKm1kpd1zh5IzIk9SUCcLp88TSnPpGPnrZUAL4r/9iclroQlpHf6rTUhfCc/B4mpC6BKfJTzFM3sIC8o+VSNzZRXopMS32SABwtnzvNqU/ko6chFYAX5B+YA1N3wjLyWx2YuhOeyY9hQuoSmCI/xTx1A3Pl1ayburqh8l5kbOrbBOBQ+dxpS81HT1sqAN+Vf1QOTN0Jy8hvdWDqTngmP4YJqUtgivwU89QNzJLXsYHUHY6WtyPzUx8pAPfJ505zaj56GlIB+K78Q3Jg6k5YRn6rA1N3wjP5MUxIXQJT5KeYp24glj//jaXuc7q8IFkr9cECcId87tzzlpqPnrZUAO6UfzwOTN0Jy8hvdWDqTngmP4YJqUtgivwU89QN3EL+kHeSuuc15DXJoqkvF4Cn8rlzt3NqvnjaUgF4mfyDcWDqTlhGfqsDU3fCM/kxTEhdAlPkpyiyjdSv8krysmTp1PcLsHf51rnbOTVfPA2pALxM/p04MHUnLCO/1YGpO+GZ/BgmpC6BKfJTFNlA6vd4MXlfspnUtwywU/nWucMtNV88bakA3CP/NhyYuhOWkd/qwNSd8Ex+DBNSl8AU+SmKrJ76JV5S3ppsLPVFA+xLvnXucE7NF09DKgD3yD8Jp6UuhJXk5zowdSc8kx/DhNQlMEV+iiJLp36DF5Z3J5tMfdcAe5FvnbvaUvPF05YKwP3yL8FpqQthMfnFTktdCM/kxzAhdQlMkZ+iyLqpX9/l5Q3KhlNfN8DG5VvnfubUfO40pALwoPwDcFrqQlhMfrHTUhfCM/kxTEhdAlPkpyiyYuoXdyPyHmUnqS8dYJvyrXMnc2q+eNpSAXhQ/tE3LXUhLCa/2GmpC+GZ/BgmpC6BKfJTFFku9Vu7KXmbsqvU9w6wKfnQuYctNZ87bakAHCL/1puWuhAWk1/stNSF8Ex+DBNSl8AU+SmKrJX6ld2gvFPZW+qTB9iOfOvc9pyab52GVAAOkX/iDUzdCYvJL3Za6kJ4Jj+GCalLYIr8FEUWSv2+blberOwz9eEDLC8fOrc9p+Zzpy0VgEPkX3YDU3fCYvKLHZi6E57KL2FC6hKYIj9FkSVSv6nbl1cse059/gCrylfODW+p+dZpSAXgQPkH3cDUnbCY/GIHpu6Ep/JLmJC6BKbIT1FkfurXdC/yokXqlwBgPfnQudU5NZ87bakAHCj/jhuYuhMWk1/swNSd8FR+CRNSl8AU+SmKDE/9ju5LXrfIP3jrAY6Rr5ybnFPzrdOQCsDh8i+4gak7YTH5xQ5M3QlP5ZcwIXUJTJGfosjY1G/nTuW9i3yT+m0AWEO+cm5sS823TlsqAEfJP9wGpu6ExeQXOzB1JzyVX8KE1CUwRX6KIjNTv5q7lrcv8u3ULwTAdPnKubE5Nd86bakAHCX/ZBuYuhMWk1/swNSd8FR+CRNSl8AU+SmKTEv9UvK1/AxEXkj9TgCMlq+cm9lS86HTkArAsfKPtYGpO2Ex+cUOTN0JT+WXMCF1CUyRn6LInNSvI8/J70HkztRvBsBE+cq5jTk1HzptqQCcIP9GG5i6ExaTX+zA1J3wVH4JE1KXwBT5KYoMSf0ucof8KkRelvrlABgnXzk3MKfmQ6chFYAT5F9nA1N3wmLyix2YuhOeyi9hQuoSmCI/RZE89VvIffLzELkn9fsBMEg+ca6+peZDpy0VgNPk32UDU3fCYvKLHZi6E57KL2FC6hKYIj9FkTD1+8dB8jsRuT/1KwIwRb5yrjun5iunIRWAk+VfZANTd8Ji8osdmLoTnsovYULqEpgiP0WRJPWbx3HygxF5MPVbAtDLJ85159R86LSlAnCy/FtsYOpOWEx+sQNTd8JT+SVMSF0CU+SnKHLj1O8cp8uPR+TB1G8JQCyfOFfcUvOV05AKwDnyr7CBqTthMfnFDkzdCU/llzAhdQlMkZ+iyM1Sv21cQH5FIoekflEAMvnEudycmq+ctlQAzpR/fw1M3QmLyS92YOpOeCq/hAmpS2CK/BRFrp36JePC8osSOTD1uwLQyCfOtebUfOU0pAJwpvzLa2DqTlhMfrEDU3fCU/klTEhdAlPkpyhyvdSvF1eUX5fIIalfFIBAvm8utKXmK6ctFYDz5Z9dA1N3wmLyix2YuhOeyi9hQuoSmCI/RZGLp36ruJH80kQOTP2uANxaPnEuMafmE6ctFYCLyD+4BqbuhMXkFzswdSc8lV/ChNQlMEV+iiKXSv0yEcivTuTw1K8LwO3k++YSc2o+cRpSAbiI/FNrYOpOWEx+sQNTd8JT+SVMSF0CU+SnKHJm6neIXn6EIgemflcAbiffN4dvqfnEaUsF4FLy76yBqTthMfnFDkzdCU/llzAhdQlMkZ+iyGmpXx1myQ9S5PDUrwvALeT75uQ5Nd83DakAXFD+hTUwdScsJr/Ygak74an8EiakLoEp8lMUOTz168J0+YmKHJj6XQG4hXzfHDun5hOnLRWAC8o/rwam7oTF5Bc7MHUnPJVfwoTUJTBFfooi96d+RVhMfrEih6d+XQCuKx83Z26p+b5pSAXgsvIPq4GpO2Ex+cUOTN0JT+WXMCF1CUyRn6LICanfG6bLT1TkwNTvCsB15fvmtDk13zdtqQBcXP5VNTB1Jywmv9iBqTvhqfwSJqQugSnyUxS5SOo3iYnysxQ5MPW7AnAt+bg5bU7N901DKgAXl39PDUzdCYvJL3Zg6k54Kr+ECalLYIr8FEUunvqtYpD8GkUOTP2uAFxLPm7OmVPzfdOWCsA15B9TA1N3wmLyix2YuhOeyi9hQuoSmCI/RZGrpn7DGCG/Q5FDUr8oAFeRL5tDttR83DSkAnAl+ZfUwNSdsJj8Ygem7oSn8kuYkLoEpshPUeQ2qV81evkRijyY+i0BuIp83Jwwp+b7pi0VgCvJP6MGpu6ExeQXOzB1JzyVX8KE1CUwRX6KIjdO/c4Ryy9Q5MHUbwnAheXLZj6n5uOmIRWA68k/oAam7oTF5Bc7MHUnPJVfwoTUJTBFfooiSeo3j1h+gSL3p35FAC4sXzbDLTUfN22pAFxV/vU0MHUnLCa/2IGpO+Gp/BImpC6BKfJTFGlTv4KU8vMTuSf1+wFwSfmyWc2p+bJpSAXg2vJPp4GpO2Ex+cUOTN0JT+WXMCF1CUyRn6LIhNQvIqX8/ERelvrlALikfNlMko+btlQAri3/bhqYuhMWk1/swNSd8FR+CRNSl8AU+SmKzEn9OlLKz0/kztRvBsDF5LPm7fOrv/0/+bhpSAXg2vKPpoGpO2Ex+cUOTN0JT+WXMCF1CUyRn6LIqNRvJLH8AkW+m/q1ALiYfNy8ZT7+4stXXnv9V2//KJ84bakAXFX+xTQwdScsJr/Ygak74an8EiakLoEp8lMUGZj6vSSWX6DIC6nfCYDLyPfNW+b7P//wv/3373+VPzx+O185DakAXE/+uTQwdScsJr/Ygak74an8EiakLoEp8lMUmZn61aSXH6HIt1O/EACXkU+ct8njP//lyZD6Vf7pn3/46Qfv5VunLRWAK8m/lQam7oTF5Bc7MHUnPJVfwoTUJTBFfooik1O/oIyQ36HIk9SvAsAF5CvnDfLRZ59/M6Q+yU/eeD3fOg2pAFxJ/qE0MHUnLCa/2IGpO+Gp/BImpC6BKfJTFBme+h1livwURf7BTyRgE/Kt86r5+IsvX338/gtb6lf59btv5ounLRWAa8i/kgam7oTF5Bc7MHUnPJVfwoTUJTBFfooi81O/pgySX6NI/RIAnCufO6+at373yXeH1K/yvR/88E/vv5OPnoZUAC4u/0QamLoTFpNf7MDUnfBUfgkTUpfAFPkpiqyS+mVllvwgZc+pzx/gXPnieaV8+G//fueQ+iSPHj3Kd09bKgAXl38fDUzdCYvJL3Za6kJ4Jj+GCalLYIr8FEUWSv2+MlF+lrLP1IcPcJZ89LxGPv7iy1dee/2eLfWr/OLNH+XTpyEVgIvLv4+mpS6ExeQXOy11ITyTH8OE1CUwRX6KImulfmUZKr9M2WHqqwc4Sz59Xjzf//mH9w+pT/LJv7ydD6C2VAAuK/84mpa6EBaTX+y01IXwTH4ME1KXwBT5KYosl/qtZbT8PmU/qY8d4Fz5+nnBvPv7Px4ypD75w6mffvBevoEaUgG4oPzjaFrqQlhMfrHTUhfCM/kxTEhdAlPkpyiyYuoXlwXkVyp7SH3mAGfJB9BL5aPPPj9wSH2SN19/LZ9BbakAXFD+ZTQwdSesJD/XaakL4Zn8GCakLoEp8lMUWTT1u8sy8luVbac+cICz5DPo+fn4iy//8e13jtpSv8qv3l7+D6fWtwPAIPln0cDUnbCS/FynpS6EZ/JjmJC6BKbIT1Fk0dTvLuvJj1a2mvq0AU6XL6Hn59GvPjp2SH2SPzxe+w+n1rcDwCD5N9HA1J2wkvxcp6UuhGfyY5iQugSmyE9RZN3Ury+ryk9XNpb6ogHOko+h5+Txn/9y2pC6+h9Ora8GgFnyb6KBqTthGfmtDkzdCc/kxzAhdQlMkZ+iyNKp32DWlh+wbCb1LQOcLt9DT85Hn33+ymuvn7ylLv2HU+urAWCW/INoYOpOWEZ+qwNTd8Iz+TFMSF0CU+SnKLJ66peYjcgvWVZPfcIAp8tX0RPy8Rdfvvr4/XOG1HX/cGp9LwCMk38NDUzdCcvIb3Vg6k54Jj+GCalLYIr8FEVWT/0SszX5ScuiqS8X4HT5MHpC3vjNb88fUhf9w6n1vQAwTv41NDB1Jywjv9WBqTvhmfwYJqQugSnyUxTZQOr3mM3Kb1vWSn2wAKfLt9Gj8rO//u1SQ+pyfzi1vhQAJso/hQam7oRl5Lc6MHUnPJMfw4TUJTBFfooi20j9KrNx+YXLKqlPFeB0+UJ6YM7/M6lL/+HU+kwAmCj/DhqYuhOWkd/qwNSd8Ex+DBNSl8AU+SmKbCP1q8yO5Ncuk1OfJ8Dp8pH0kFzqz6Qu+odT6xsBYKj8O2hg6k5YRn6r01IXwnPye5iQugSmyE9RZDOp32b2KD97GZj6KgFOl0+lD+aCfyZ1uT+cWl8HAKPl30HTUhfCMvJbnZa6EJ6T38OE1CUwRX6KIptJ/Tazd/krIENSXyLA6fKp9P5c9s+kLveHU+vrAGC0/DtoYOpOWEN+qNNSF8Jz8nuYkLoEpshPUWRLqV9oeCp/F6RNfYAAp8sH05flGn8mdaE/nFrfBQDT5R9BA1N3whryQ52WuhCek9/DhNQlMEV+iiJbSv1Cwx3y90Jun/roAE6Xb6Z35uMvvvzHt9+59pD6JL94c+IfTq3vAoDp8o+ggak7YQ35oU5LXQjPye9hQuoSmCI/RZGNpX6n4QH5OyK3SX1oAKfLl9Pv5tGvPrrNkPokn/zLrD+cWl8EAAvIv4AGpu6ENeSHOi11ITwnv4cJqUtgivwURTaW+p2GI+Tvi1wv9XEBnCUfT7+dx3/+yy2H1P/2v/9w6l9++m4+odpSAThc/gU0MHUnLCC/0oGpO+E5+T1MSF0CU+SnKLK91K81nCh/d+SyqQ8K4HT5fvpNfvkf/3njIfVJHj169OkH7+UrqiEVgAPlnz8DU3fCAvIrHZi6E56T38OE1CUwRX6KeeoGRsvbWTR1b3AZ+askZ6a+IICz5Cvqv/7vP5P6ymuvJ1vqV/npj9/Ih1RbKgAHyj9/BqbuhAXkVzowdSc8J7+HCalLYIr8FPPUDawhr2m51I3BheXvlJyQ+moAzpIPqV/l+z//sBpSn+TX775pSAVgFfkX0LTUhbCA/EqnpS6EF+UnMSF1CUyRn2KeuoHF5H2tkroouKL8/ZLDUx8LwFnaIfWt333SDqlP8qf33zGkArCE/PNnYOpOmC4/0WmpC+FF+UlMSF0CU+SnmKduYEl5a/NTVwQ3kr9rcn/qAwE4Szik/uyvf8tX1Cf53g9+WP3h1Lp/ABaTf/4MTN0J0+UnOi11IbwoP4kJqUtgivwU89QNLCzvbnjqfuDW8pdO7kx9FwBnSYbUjz77PPwzqd/No0ePDKkAzJd/+wxM3QnT5Sc6LXUhvCg/iQmpS2CK/BTz1A2sLa9vcupyoJS/gPJN6lsAONeNh9SPv/jy1cfv5/vpC/nFmz+ypQIwXP7tMzB1J0yXn+i01IXwovwkJqQugSnyU8xTN7C8vMGxqZuBEfI3UeoTADjXjbfUR7/6KF9O78zH771lSAVgsvzbZ2DqThgtv8+BqTvhRflJTEhdAlPkp5inbmAL8hLHpm4GBsnfxz2nLh/gXDcbUt/9/R/zzfRl+d4Pfvin99+xpQIwVv7hMzB1J4yW3+fA1J3wovwkJqQugSnyU8xTN7AReY8zU9cC4+Rv5T5T1w5wrtsMqR/+27/ng+n9+ad//uGnH7xnSAVgrPzbZ1rqQhgtv89pqQvhDvlVTEhdAlPkp5inbmA78ioHpu4E5spfz12lbhvgAq49pH702eevvPZ6vpY+mDdff82QCsBY+bfPwNSdMFd+nNNSF8Id8quYkLoEpshPMU/dwKbkbQ5M3QmMlr+hO0ndM8BlXG9I/fiLL199/H6+kx6YX7z5I1sqADPl3z4DU3fCXPlxTktdCHfIr2JC6hKYIj/FPHUDW5MXOi11IbCG/FXdfOqGAS7gelvqo199lC+kR+Xj994ypAIwUP7hMzB1J8yVH+e01IVwh/wqJqQugSnyU8xTN7BBeaejUrcBK8lf2A2n7hbgMq4xpL77+z/m2+gJ+dP779hSAZgm//AZmLoT5sqPc1rqQrhDfhUTUpfAFPkp5qkb2Ka81jmpq4D15K/tJlO3CnAZFx9SP/y3f89X0dPyvR/88NMP3jOkAjBK/uEzMHUnDJVf5sDUnXCH/CompC6BKfJTzFM3sE15raNStwHryV/b7aWu9AI2838EONMFh9SPPvv8lddez1fRk/Po0aNLzal1q8AU/+//8d+/Sv2/grXl3z4DU3fCRPlZTktdCHfLD2NC6hKYIj/FPHUDm5U3Oyd1FbCq/OXdWOo+z7XJ/1PAaS4ypH78xZevPn4/30PPzE9//IYtFTjNk9n0Zan/17Gw/MNnYOpOmCg/y2mpC+Fu+WFMSF0CU+SnmKduYLPyZuekrgLWlr/Cm0nd5Lk2/38QONxFttTv//zDfAm9SH797puGVOB+98+mtlQuK//wGZi6EybKz3Ja6kK4W34YE1KXwBT5KeapG9iyvNwhqXuA5eVv8TZS13iWvf3/BR505pD61u8+yTfQC+aTf3nblgp844Tl1JzKBeUfPgNTd8JE+VlOS10Id8sPY0LqEpgiP8U8dQNblpc7J3UVsLz8Ld5A6g7Psuf/78DLnDyk/uyvf8vXz8vmez/44Z/ef8eQCrt1qfHUlspF5B8+A1N3wjj5TQ5M3Ql3yw9jQuoSmCI/xTx1AxuX9zskdQ+wEfm7vHTq9k7nOQB3Om1I/eizz/Pp8xr5p3/+4acfvGdIhT240nJqS+VS8g+fmalrYZb8IKelLoSXym9jQuoSmCI/xTx1AxuX9zskdQ+wHfnrvHTq9k7kmQAvc+yQ+pvP/+uV117Pd88r5dGjR7ZU2KSbjafmVC4l//AZmLoTZskPclrqQnip/DYmpC6BKfJTzFM3sH15xRNSlwCbkr/R66au7kSeD/AyRw2pH3/x5auP388Xz6vmpz9+w5AKGxCOp7ZULiL/8BmYuhNmyQ9yWupCeKn8NiakLoEp8lPMUzewfXnFE1KXAFuTv9SLpu7tFJ4VcL/Dt9RHv/oo3zpvkF+/+6YtFZaTb6a2VC4r//AZmLoTZskPclrqQnip/DYmpC6BKfJTzFM3sAt5yxNSlwBbk7/UK6Yu7RT5Q1v0ucGuHDKkvvW7T/KV82b55F/eNqTCcPlIak7lqvJf4Aem7oRB8mscmLoTXiq/jQmpS2CK/BTz1A3sQt7yhNQlwAbl7/VyqRs7Rf7QNvAMYfMeHFJ/9te/5fvmLfO9H/zwT++/Y0iFafJV1JbKLeW/tw9M3QlT5Kc4LXUh3Cc/jwmpS2CK/BTz1A3sQt7yhNQlwDblr/Zaqes6Wv7ENvY8YcPuGVI/+uzzfNxM5tRPP3jPlgq5fAm1pVLJf1cfmLoTpshPcVrqQrhPfh4TUpfAFPkp5qkb2Iu86Dx1A7BZ+du9UOqujpY/sa0+WNiklw2pr7z2er5sJnn06NGdc2pdFGxcPn2aUxki/xV9YOpOmCI/xWmpC+E++XlMSF0CU+SnmKduYC/yovPUDcCW5S/4KqmLOlr+xPbwkGEzvjukfvzFl68+fj/fNMP85I3XbalwA/nWaUtloPzX8oGpO2GK/BSnpS6E++TnMSF1CUyRn2KeuoG9yIuekLoE2Kz87V4ldVHHyR/X3h44bMALW+r3f/5hvmbm+emP3zCkwjXk+6YtleHyX8Vnpq6FXn6E01IXwgPyC5mQugSmyE8xT93AjuRd56kbgC3LX/AlUrd0nPxx7fnhw7q+GVLf+M1v8x1zSD5+7y1DKlxEvmmaU1lL/hv4wNSd0MuPcFrqQnhAfiETUpfAFPkp5qkb2JG86zx1A7Bx+Ts+P3VFx8kflxZgRU+G1Md//ku+YI7Kv/7kLVsqnCzfMSekLoEl5b94D0zdCb38CKelLoQH5BcyIXUJTJGfYp66gR3Ju85TNwAbl7/j81NXdIT8WWkE1vV//uH/yrfLafn5n//vf/2f/6tuBlaSb5fTUhfCkvJftmemroVYfoHTUhfCA/ILmZC6BKbITzFP3cCO5F3nqRs4Xf7ohqTugYflRzI8dT9HyJ+VdmBRT/4x2zdffy2fL+fk+z//8Jt/+rjuB0bL98rhqfthPfkv2DNT10IpP79pqQvhYfmRTEhdAlPkp5inbmBf8rod22nyRzckdQ88LD+S4an7OUL+rNQEK3oypH6Vv/z03e/94If5iDkhr7z2+m8+/69vtlRzKnxXvlGukroolpT/aj0wdSeU8vOblroQHpYfyYTUJTBFfop56gb2Ja/bsZ0mf3RDUvfAQfI7mZy6nEPlD2pO6ipgJd8MqU/y63ffzHfMCXn393/89pBqS4Un8l1yxdSlsaT81+mBqTuhlJ/ftNSF8LD8SCakLoEp8lPMUzewL3ndeeoGTpQ/tyGpe+Ag+Z1MTl3OofIHNTB1J7CAF7ZU/9LvV3n18fsvDKnmVHYunyNXT10g68l/i56ZuhYa+eENTN0JD8uPZELqEpgiP8U8dQP7ktedp27gRPlzG5K6Bw6Vn8rY1M0cKn9Qk1OXA0N9d0j1L/1+lY8++/zOLdWcyt7kE+RmUjfJkvLfnwem7oRGfnjTUhfCQfI7mZC6BKbITzFP3cC+5HXnqRs4Uf7chqTugUPlpzI2dTMHyZ/SQqm7ginuHFL9S7/f/dd9zansSj47bjJ1qywp/515YOpOaOSHNy11IRwkv5MJqUtgivwU89QN7E7euHs7Qf7chqTugUPlpzI2dTMHyZ/SiqlLg9I9Q+qe/6Xfl/3rvuZUNi9fGzefumHWk/+qPDN1LQTyq5uWuhAOkt/JhNQlMEV+innqBnYnb9y9nSB/bkNS98AR8muZmbqWg+RPaenU7cGtPTik7vZf+v3lf/znIVuqOZXNyBfG/aSumvXkvyHPTF0Lt5af3MDUnXCQ/E4mpC6BKfJTzFM3sDt54+7tBPlzG5K6B46QX8vM1LUcJH9Km0ndJFzdIUPqPv+l37d+98mBQ6o5ldXlw+IOU3fOkvJfjAem7oRby09uWupCOFR+KhNSl8AU+SnmqRvYnbxx93aC/LkNSd0DR8ivZWbqWh6WP6JNpm4VruLwIXVv/9LvP779zsdffHnUlmpOZTn5nrjn1OWzpPz34Zmpa+Gm8nublroQDpWfyoTUJTBFfop56gZ2J288T93AKfKHNiR1DxwnP5iBqTt5WP6Itp26XriYY4fUr/LpB+/t5F/6Pfxf9zWnspx8RpQnqQ+B9eS/Bs9MXQu3kx/bwNSdcKj8VCakLoEp8lPMUzewO3njeeoGTpE/tCGpe+A4+cEMTN3Jw/JHtJPUPcNZThhSn+STf3k7HzqvnWP/dV9bKkvIp0N5IfVFsKT8F+CZqWvhRvJLm5a6EI6QX8uE1CUwRX6KeeoG9igv3ckdK39oQ1L3wHHygxmYupMH5M9nh6k7h1OcvKV+lZ+88Xo+d14vp/3rvuZUxsoXQ3lZ6tNgSfnvvTNT18KN5Jc2LXUhHCG/lgmpS2CK/BTz1A3sUV66kztW/tCGpO6B4+QHMzB1Jw/In8+eU5cPhzpnSH3yL/3+0z9v9l/6Pflf9zWnMko+FMohqc+E9eS/7s5MXQu3kJ/ZwNSdcIT8WiakLoEp8lPMUzewR3npTu5Y+UMbkroHjpMfzMDUnTwgfz7yD+OPhJ07c0h9kj883ua/9HvOv+5rTmWCfByUo1LfC+vJf8sdm7oZri6/sWmpC+E4+cFMSF0CU+SnmKduYI/y0p3csfKHNiR1DxwnP5iBqTu5T/5w5IXUFwEvusiQ+iS/ePNH+fR52bz6+P0z/3VfcyqhfBaUE1JfDUvKf7+dmboWris/sIGpO+E4+cFMSF0CU+SnmKduYI/y0p3csfKHNiR1Dxwtv5lpqQu5T/5w5GWpTwO+dsEh9UkePXqUD6AXzEeffX7BIdWcym3ka6Cck/p8WFL+a+3Y1M1wRfl1DUzdCcfJD2ZC6hKYIj/FPHUDe5SX7uSOlT+0Ial74Gj5zUxLXch98ocjD6a+Efbr4kPqV/nT++987wcb+cOp7/7+jxcfUs2pXE8+AsqlUp8S68l/mx2buhmuKL+uaakL4Wj5zUxIXQJT5KeYp25gj/LS89QNHC1/YkNS98DR8puZlrqQ++QPRw5PfSzsyzWG1Cf59btv5jPo+Xn18ftXGlLNqVxcvv3JZVMfFEvKf4+dmboWriU/rYGpO+Fo+c1MSF0CU+SnmKduYI/y0vPUDZwif2hDUvfAcfKDmZa6kJfKn4yclvpw2L7rDalP8pM3Xs/H0HPyymuvX+Nf9zWncln55CdXSn1ZLCn/9XVs6ma4ivyuBqbuhKPlNzMhdQlMkZ9inrqBncp7d3XHyh/akNQ9cJz8YKalLuSl8icjZ6a+ILbp2kPqV/n0g/eW/pd+H//5L9ceUs2pnCxf+uTaqU+MVeW/uM5MXQuXlx/VwNSdcIr8bCakLoEp8lPMUzewU3nvru5Y+UMbkroHjpMfzKjUbdwnfzhykdR3xKbcYEh9kj88fjufRE/L93/+4W2GVHMqx8o3PrlZ6ltjSfmvrGNTN8OF5Rc1MHUnnCI/mwmpS2CK/BTz1A3sVN67qztW/tCGpO6B4+QHMyp1G/fJH45cNvVBsbybDalP8os3f5QPo8fmldde//iLL2+5pZpTeVC+68ntUx8dS8p/Ux2buhkuLL+ogak74RT52UxIXQJT5KeYp25gp/LeXd2x8oc2JHUPHCc/mFGp23ip/MnI9VIfF6u68Zb6VR49epTPo0flw3/79xsPqbZU7pEvelKlPj1Wlf+OOjZ1M1xMfksDU3fCifLLmZC6BKbITzFP3cBO5b27umPlD21O6io4Qn4to1K38VL5k5Frpz4xFnP7IfWr/OWn7y70h1Pf+t0ntx9Szal8Vz7kyYTUZ8iS8t9Ox6ZuhovJb2lg6k44UX45E1KXwBT5KeapG9ipvHdXd6z8oc1JXQVHyK9lVOo2Xip/MnKz1LfGApIh9Uk+fu+tfCQ9JK8+fv/2/7qvOZUX5PudzEl9jCwp/6V0cupyuID8igam7oTT5cczIXUJTJGfYp66gZ3Ke89TN3C0/InNSV0Fh8pPZVrqQl4qfzJy+9RHx1DhkPokP/3xG/lU+mA++uzzcEg1p5IvdzIt9UmyqvzX0bGpm+EC8isamLoTTpcfz4TUJTBFfop56gZ2Ku89T93A0fInNid1FRwqP5VpqQt5qfzJSJX69JglH1K/yqcfvDf8D6c+/vNf8iHVnLpP+WAnM1MfJgvLfxGdnLoczpLfz8zUtXC6/HgmpC6BKfJTzFM3sFN573nqBo6WP7E5qavgUPmpjErdxkHypyRV6tOjl6+o3+RP778z9g+nfv/nH+YTqjl1h/K1Tgamvko2Iv8VdGzqZjhLfj8DU3fCWfL7mZC6BKbITzFP3cB+5dU7vKPkT2xU6jY4SH4no1K3cZz8cUmS+u7I5PvpC5n5h1Nfee319s+kmlN3KB/sZFTqe2SD8l8+J6cuhxPllzMzdS2cJb+fCalLYIr8FPPUDexXXr3DO1b+0OakroKD5HcyKnUbp8sfndw+9dFxU/lyemcG/uHUX/7Hf+bLqTl1J/LNTuakPkY2Lv+dc3LqcjhFfjYzU9fCufITmpC6BKbITzFP3cB+5dU7vGPlD21O6io4SH4no1K3cQH5M5Qbp744biHfTF+WaX849d3f/zHfTM2pe5AvdzIk9SWyI/kvnJNTl8PR8puZmboWzpWf0ITUJTBFfop56gb2K6/e4R0rf2ijUrfBA/ILmZa6kAvLn6fcMvW5cS35YHp/5vzh1Fcfv5+vpebUzcvHO8lT3yA7lf+eOTx1Pxwhv5axqZvhXPkJTUhdAlPkp5inbmC/8uod3rHyhzYqdRs8IL+QaakLuZb8wcrNUt8aF5ZPpYdkwh9OfeW113/z+X/lU6k5dcPyCU/a1AcIfp/3C/BG5NcyM3UtXEB+RRNSl8AU+SnmqRvYr7z6PHUDR8uf2KjUbfCA/EJGpW7jFvKHLLdJfWhcRj6SHp78D6d++G//no+k5tRNyic8CVNfHzwn//VyeOp+OEh+J2NTN8MF5Fc0IXUJTJGfYp66gf3Kq89TN3C0/IlNS10I98nPY1TqNm4tf+Byg9RXxunyefSotH849a3ffZLPo+bU7cmHPKlSnx68VP6L5eTU5XCQ/E5mpq6Fy8gPaULqEpgiP8U8dQP7lVefp27gaPkTm5a6EF4qv41pqQvJ5E9erp36xDhavo2ekOoPpy7xZ1LNqWvJtzy5feqjg4Pkv1IOT90PD8gvZGzqZriM/JAmpC6BKfJTzFM3sF959XnqBk6RP7RpqQvhbvlhTEtdSC+vQK6a+r44VL6KnpxP/uXtGw+pr7z2+sdffJmvoubUzcgXPblx6ouD4+S/TM5PXREvld/G2NTNcDH5LU1IXQJT5KeYp25g1/L23d6x8oc2LXUh3C0/jFGp25glr0Oumvq+uE++h56ZX7z5o1tuqb/8j//M91Bz6jbko57cMvW5wenyXyPnp66Iu+WHMTZ1M1xMfksTUpfAFPkp5qkb2LW8fbd3rPyhTUtdCHfIr2Ja6kKGynuR66U+Lu6QL6EXyc3+cOq7v/9jvoSaUzcg3/XkZqlvDS4g/wVyfuqKuEN+FWNTN8Ml5ec0IXUJTJGfYp66gV3L23d7x8of2sDUnfCi/CSmpS5kurwguVLqy+KZfAO9VD794L0b/OHU7//8w3wDNaeuLp/25DapDw0uLP/tcX7qinhOfg+TU5fDJeXnNCF1CUyRn2KeuoFdy9vPUzdwtPyJDUzdCc/J72Fg6k6WkTclV0p9WXuXD6CXzZ/ef+eqQ+o/vv3O0n8m1Zyay9c9uUHqK4NryX9pXCJ1SzyVX8Lk1OVwYflFTUhdAlPkp5inbmDX8vbz1A2cIn9oA1N3wjP5MUxLXciS8tbkGqnPaqfy6fMa+fW7b15vS/3os8/z6dOcuqJ83ZMbpL4yuIX8N8YlUrfE1/IzmJy6HC4sv6gJqUtgivwU89QN7Frefp66gVPkD21m6lr4Wn4GA1N3sra8Prl46pval3z0vF5++uM3rjGk/uyvf8tHT3PqcvKBT66d+sTgpvLfFZdI3RIO1X3uS35UE1KXwBT5KeapG9i1vP08dQOnyB/azNS18LX8DAam7mQj8h7lsqkPahfyufOq+fSD9x49enTZIfWN3/w2nzvNqWvJNz65aur7gkz+i+ISqVvatbz94an74fLyo5qQugSmyE8xT93AruXt56kbOEX+0Mambmbv8gMYmLqTDco7lQumvqYty7fOG+QvP333ez/44aWG1Fcfv7+9P5NqTr2efOaT66U+LujlvyKukrqoncp7H566H64iv6sJqUtgivwU89QN7Frefp66gVPkD21s6mZ2LW9/ZupatiwvVy6V+pQ2KF85b5Y/PH77IkPqK6+9/pvP/ytfOc2pq8jHPrlG6rOCWfLfD1dJXdTu5I3PT10RV5Hf1YTUJTBFfop56gb2Lj8A53eC/LmNTd3MfuXVz0xdy/blFcsFU1/TRuT75o3z63ffPH9L/eV//Ge+b5pTl5DvfXLx1DcFQ+W/Fi6Uuqsdybuen7oiriU/rQmpS2CK/BTz1A3sXX4AeeoGTpE/tMmpy9mjvPSZqWvZl7xuuVTqU1pbvmwm+emP3zhnSH3857/ky6Y5db588pOLp74pmC7/nXCh1F3tQt7yEqlb4lry05qQugSmyE8xT93A3uUHkKdu4BT5Q5ucupzdyRsfm7qZncp7l4ukvqMl5ZtmlU8/eO/Ro0enDalv/Oa3+aZpTh0un/zksqkPCpaR/za4Vuq6Ni7vd4nULXFF+XVNSF0CU+SnmKduYO/yA8hTN3Ci/LlNTl3OjuRdT05dzt7lByDnpz6ileSDZpu//PTd7/3gh8cOqa8+fv/jL77MB01z6lj56icXTH1NsKT8V8G1Ute1WXmzq6QuiivKr2tC6hKYIj/FPHUDe5cfQJ66gRPlz2146n52IW95cupyeCq/BDk/9REtIJ8yJ+RP779z1JD6ymuv/+bz/8qnzAmp73eifPiTS6U+JVhe/nvgWqnr2qC801VSF8V15Qc2IXUJTJGfYp66gb3LDyBP3cCJ8uc2P3VF25dXPDl1ObwoPwk5M/UFzZWPmHPy8XtvHb6lfvTZ5/mIOSf1FQ+Sb39yqdSnBBuR/wa4XOrGNiVvc6HUXXFd+YFNSF0CU+SnmKduYO/yA8hTN3Ci/LktkbqlLcvLHZ66H+6WH4acmfqCxsnny2n5xZs/OmRI/dlf/5bPl9NS33Iv3/7kIqnvCDYo//VvudSNbUTe40Kpu+Lq8hubkLoEpshPMU/dwN7lB5CnbuB0+aNbInVLG5R3Oj91RTwsPxI5J/X5TJEPlzPz5uuv3T+kvvGb3+bD5czUF53J5z+5SOo7gs3Kf/FbMXVpy8sbXCh1V9xCfmYTUpfAFPkp5qkb2Lv8APLUDZwuf3SrpC5qU/I2l0jdEkfIr0VOTn07sXyyHJtPP3jv0aNHLxtSv//zD/PJcnLqu761fP6T81MfEexC/lvfiqlLW1je3Vqp6+IW8jObkLoEpshPMU/dAI5w1SPMn9tCqbvaiLzHJVK3xCnys5GTU99OI98rh+dP77/zvR/88LtD6quP3//4iy/zvXJ46uu+nXwElDNTXxDsS/4r36Kpe1tM3tdyqRvjRvJLm5C6BKbITzFP3QCOcOEjzB/dQqm7Wl7e4Cqpi+Is+f3IaakP56bypXKJ/OHx2y8Mqa+89vpHn32eL5VLpL7xq8tHQDkn9fnATuW/7K2burpl5E2tmLo0biS/tAmpS2CK/BTz1A3gCBc+wvzRrZW6rlXlxS2UuisuIz8kOS314dxCvlEulI/fe+vbW+ov/+M/841yodSXfi35DijnpD4f2Lv8N711U1e3gLyjFVOXxu3kxzYhdQlMkZ9inroBHOHCR5g/uuVSN7aevLK1UtfFJeXnJKelPpwrytfJ5fKLN3/0ZEj92V//lq+Ty6W+9wvLd0A5OfXtAE/lv+OtnrrAofJeFk3dGzeV39uE1CUwRX6KeeoGcIRrH2H+9JZL3dgy8qaWS90Y15Kflhyb+mSuIt8lF81P3nj9jd/8Nt8lF0199Zfx/7F3fz12XmXa4D/IK3kUFCjsStlV5U4yJiRO/CfmjSHBOAFrAkybhhak1S8KRK9ER5wEqdUaBdEHM7QU9QGIPiKaHCCBNEcjzuc7eRwVchy7qrz/PM+67rWe30/Xce9732s9Re1c7drxKlA2TvruAI+K/47Xe9IHWE78RPpN+uhoKn7fKiR9CFQRv4rxpE8Al7DvSxjfXqdJn1t18QPqMelDY17xCybrJn1lphRvJLtOvJHsPenrv5V4GygbJH1rgNPEf8EbIOkzLCF+Cl0nfXq0Fr9yFZI+BKqIX8V40ieAS9j3JYxvr9+kj66o+Ll0mvS50U78sslaSd+XCcS7yN4T7yIHSPoh2ES8EJQNkr41wJPFf7UbJumTjIlvvvekD5CA+K2rkPQhUEX8KsaTPgFcwu7vYXx7XSd9eoXEz6LrpE+P1uJXTtZK+r5sLl5E9p6jNca7yAGSfRDWEi8EZYOkbw2whvjvdSMlfZhNxbc9RtLHSED81lVI+hCoIn4V40mfAJ+KX4N40iewlfj2ek/6APPiR9B70gdITPzuyVpJ35e1xYvI3vPwMuNd5ABJPQirixeCsm7SVwbYUPyXusGSPs/ZxTc8TNInSUb84lVI+hCoIn4V40mfAJ+KX4N40iewrfgCB0j6DAPiOx8m6ZMkLH4DZa2k78uq4kVk73l8pfEucoC0fxBWF68FZa2k7wuwlfivc0MmfaqziG91pKQPk5j43auQ9CFQRfwqxpM+AT4VvwbxpE9gW/EFDpP0STYS3/NISR8mhcRvo6yY9E15sngR2XtOWmy8ixwgLR+EFcVrQVkr6fsCTCP+69yoSR/sZOKbHC/pIyUmfvcqJH0IVBG/ivGkT4BPxa9BPOkTmEB8hyMlfZhziS92yKRPlXLid1JWTPqmHC/eQg6Q0zcc7yIHSJtnYRXxWlDWSvq+ABOL/y43dtLHu6H43kZN+mBJil+/CkkfAlXEr2I86RPgU/FrEE/6BCYQ3+GQSZ/qNOJrHDjps6Wu+OWUFZO+KZ8TbyEHyCp7jneRA2TuZ2EV8WZQVkz6pgAziv8it4SkD3kl8S2NnfTxEha/gRWSPgSqiF/FeNInwKfi1yCe9AlMIL7DsZM+3rXFN7aQpM+Z6uJXVFZM+qZ8Kt5CjpFVVh0vIsfI3E/EKeLloKyY4CUB2oj/CreopE/7UfGFLCTpcyYvfgkrJH0IVBG/ivGkT4BPxa9BhaQPYQLxHS4h6UM+TXw5S0v6wOlJ/LrKKgnekHgFOUZWX3i8iBwj8z0RJ4mXg7Ji2t8NICX++9sy47iXk9RZU0f8ElZI+hCoIn4V40mfAJ+KX4MKSR/CBOI7XFoc95KTPX06Fb+38sRELka8ghwj6649XkSOkTmeiJPE+0FZJS2vBFBE/Pc3OTfPL7HxNyVzHCvdid/DCkkfAlXEr2I86RPgb+I3IZ70CUwjvsYlx7EuKvMdN8OL3155Ylreh3gFOUY2W368iBwm0z4Uj4v3g7JK5r4GQGXxX95Exkv6saaK+FWskPQhUEX8KsaTPgH+Jn4T4kmfwDTiaxRZQtIPOiOIX2N5Yhpcg3gFOUa2OYJ4CzlMpnooHhHvB2WVzHT6QEfiv7aJDJb0M00h8dtYIelDoIr4VYwnfQL8TfwmxJM+gcnENykydtKPOEOJ32c5PbOefryCHCPbH0S8hRwm25/FI+IVoTwxkx860K/4r20iIyX9QFNI/DZWSPoQqCJ+FeNJnwB/E78J8aRPYErxZYoMnPTzzYDit1pOzxyHHq8gx8hUxxFvIYfJVCcSrwjliZnqrIGRxH9nExkj6UeZWuIXskLSh0AV8asYT/oE+Jv4TaiQ9CFMJr5JkVGTfrgZWfx6y+mZ8KzjFeQYmfBE7qlTK9Wp8ZZQTs/2RwwMLP4Lm0jvST/ElBO/kxWSPgSqiF/FeNInwN/Eb0KFpA9hSvFlioyX9GPNIsTvuZyS7c833j8Ok+3P4nHxFnKYbHwE8ZZQTs+EjxswsPgvbCL9Jv34UlH8WlZI+hCoIn4V40mfAH8TvwkVkj6EKcWXKTJe0o81CxK/7XJKNj7WeP84UiZ83B6IV5AjZd3lx1tCOT1zPHHAwOK/rYn0mPSDS1Hxm1kh6UOgivhVjCd9AvxN/CZUSPoQJhbfp8hIST/QLFH82sspWfc04+XjSJnjcTsSryAHy4prjxeFckrme9yAgcV/TxPpLumnlrril7NC0odAFfGrGE/6BPhM/DLEkz6BicX3KTJM0k8zixa//3JSVj/EePk4UuZ71o7E+8fBcvq240WhnJK5nzVgbPHf00Q6Svp5pbT4/ayQ9CFQRfwqxpM+AT4TvwzxpE9gevGVigyQ9HMMn4o/CHJSnnh28fJxpDR41u6pU1vVqfGuUE5KmwcNGF78lzSRXpJ+WCktfj8rJH0IVBG/ivGkT4DPxC9DhaQPYXrxlYp0nfQTDJ8TfyLkpJx0ZPHycaS0fNbi/eNgeWS98a5QTkrLpwxYgvhvaCL1k35MqS5+RSskfQhUEb+K8aRPgM/EL0OFpA9hevGVinSd9BMMx4g/F3JsHj+pePk4Uto/aPH+cbA8WGy8LpRj0/4RAxYi/huaSOWkH1A6EL+lFZI+BKqIX8V40ifAZ+KXoULShzCL+FZFOk362YXTxB8QOTZHpxNvHgdL6imL94+DJV4XyrFJPV/AcsR/PROpmfSjSR/iF7VC0odAFfGrGE/6BPhM/DJUSPoQ5hJfrEh3ST+1sJL4kyKPJ948DpbsIxbvH4fJj3/xq1985b/He0N5ONmHC1iU+K9nItWSfijpRvyuVkj6EKgifhXjSZ8An4lfhgpJH8KM4rsV6Sjp5xXWE39k5EF2b9554dnn37/9eryCHCPpZ+tT8Ray9/zs47+8ffPON5958X5+vP/Knw7yHaKknypgieK/pInUSfpxpCfx61oh6UOgivhVjCd9AnxO/D5USPoQ5hJfrEgvST+ssKH4syO71289tbP7vzy9cz+vv/jih2+/Ge8iu076kfpMvI7sNz/+xa9uX7x2VKQe5QcXXv7jYb5MXGzSDxOwaPFf1UQqJP0g0pn4ja2Q9CFQRfwqxpM+AT4nfh8qJH0IM4rvVqR+0o8pbCv+EC02u1e+ftSiPsgzu3s/f+NmvJHsNOkn6VHxUrK7PPzPUR/JW3sv/UGdqkUFFin+C5tINulHkP7EL22FpA+BKuJXMZ70CfA58ftQIelDmFd8vSKVk35AYTLxp2lp+fJzLz5SpD7IjUtf8Q9Uey9Sj8TbyY7y+D9HfTy/uXg9Xi8uJ+mnB+Az8V/bRFJJP3x0KX5vKyR9CFQRv4rxpE+Az4nfhwpJH8Ls4hsWqZn0owkTiz9TC8nut+7uXLx0UpF6lC/unPunm1+LF5S9JP3onCbeUdbPKf8c9fF8cHgtXjIOn/RDA3CM+O9vIu2TfuzoVfzqVkj6EKgifhXjSZ8AnxO/D0WSPod5xdcrUjDp5xLmEn+4xs4zb3zv6b3D04vUB3n52ef9A9Wui9Qj8bKycv75w/944j9HfSTvHVz900G+cBwy6WcF4DTx3+JEWib9wNGx+O2tkPQhUEX8KsaTPgE+J34fiiR9DrOLb1ikVNJPJMwu/pQNmd2bd57a2V2xSPUPVMcoUo/EK8uCee/Pf/3+m3+/Vov6ID+48LI6VYsKLFD8dzmRBkk/Z3QvfocrJH0IVBG/ivGkT4DPid+HIkmfQwvxJYsUSfpZhHbij9tI2b3y9XWLVP9AdYwi9Ui8uyyVDf456iN5a++lPxzmK8gBkn4yANYT/41OZNaknzBGEL/GFZI+BKqIX8V40ifAo+JXokLSh9BIfM8i8aSfQgiIP3cD5OxXr23WovoHqmMUqUfiDWaFvPfnv/7DP767TYv6cJ36m4vX411k10k/EwAbiv9qJzJH0g8Wg4jf5ApJHwJVxK9iPOkT4FHxK1Ek6XNoJL5nkWDSzx/ExJ++frP7rbtffu7FLYtU/0B1gCL1SLzKzObd33/87Rdem6RIfZAPDq/FG8kek34UALYV/x1PZNqkHynGEb/MFZI+BKqIX8V40ifAo+JXokjS59BOfNUikaSfPMiLP4bdZfdbd5/eO5yqSPUPVHsvUo/EC81UfvTTf5m2RX2Q9w6u+vpULSqwQPHf9ESmSvphYijx+1wh6UOgivhVjCd9AjwqfiWKJH0OTcW3LdIy6QcOaok/kr1k9+adjb8g1T9QHbVIPRKvNRvnZx//5e2bd2YqUo/ygwsv/9HXpypSgeWJ/74nsn3SjxGjiV/pCkkfAlXEr2I86RPgUfErUSTpc2gtvnCRNkk/alBU/Nksnt0rX5+vSF3yP1BNX/zJxPvNZvnnD//j9sVrsxapD74+9T8PfX2qFhVYnPhvfSIbJ/30MKb4xa6Q9CFQRfwqxpM+AR4VvxJ1kj6K1uILF5k76YcMSos/oWXz5UuvzNqiPpwbl76ynH+gmr7yE4u3nHPnvT//9e73ftKgRX04v7moTtWiAksU//VPZN2kHxqGFb/bFZI+BKqIX8V40ifAMeK3okjS5xAQ37nIfEk/XtCH+KNaKrvfurtz8VKzIvUoz+zu/fyNm/GiU5G6gXjdOV/e/f3H337htcZF6lHeO7gary/rJH3HAdqJ/x4osnrSjwsji1/vCkkfAlXEr2I86RPgGPFbUSTpc8iIr11k8qSfKuhP/LGtkN2bd57eO2xcpD7IWy9fjtedWtQNxEvPOfLjX/wq0qI+yA8uvPyng3yPqUUFaCz+26DIE5N+Shhf/JJXSPoQqCJ+FeNJnwDHiN+KIkmfQ0x88yITJv08Qa/iD282u9dvzf0FqU/M4fn992+/Hq8+FanrilefE+a9P//17Zt3skXqUd7ae+kPh/lCU4sK0F7810KRk5J+OFiE+D2vkPQhUEX8KsaTPgGOEb8VdZI+ipj45kUmSfpJgu7Fn+JIdi9/LduiPsgXd85999rVeAGqSF1XvAOdJD/97e9uX7wWb1EfzgK/PjV9lwFKiP9yKPJ40o8FSxG/6hWSPgSqiF/FeNInwDHit6JO0kcRFt+/yMZJPz0wlPgT3Sy737r75edejFeoj+TlZ5//8O03402oInUt8SZ0y/zop/8Sb06PzXK+PjV9hQFqif+WKPIg6aeBZYlf+ApJHwJVxK9iPOkT4BjxW1En6aPIix+ByAZJPzcwoPhz3SDPvPG94BekPvEfqP78jZvxPlSRupZ4H7pZfvbxX+5cvRXvTE/J8F+fmr65AHXFf10UST8ELE78zldI+hCoIn4V40mfAMeLX4w6SR9FXvwIRFZP+nGBwcWf8flS4QtSn5jXX3wx3ooqUtcSL0bXzT9/+B/V/q7vsRn461PTdxaguvgvjbLYpO8+CxW/+RWSPgSqiF/FeNInwPHiF6NO0kdRQvwURFZJ+kGBpYg/7JPn7FevxXvSFXN4fv9X37kVr0cVqauL16Or5x/+8d14SbpW/u3wWrz61KICRMR/e5SlJX3lWa745a+Q9CFQRfwqxpM+AY4Xvxh1kj6KQuJnIXJS0g8HLE78qZ8qu9+6u3PxUrwhXStf3Dn3Tze/Fi9JFamri5ekT8x7f/5r8b/re1LeO7g6wN/7Td9QgF7Ff5OUJSR9zVm6+CNQIelDoIr4VYwnfQIcL34xSiV9GoXEz0LkkaSfCVi0+E+ALbN7807ZL0h9Ym5c+sqHb78Zb0sVqSuKt6Wn5Ke//V0Xf9f3pPzgwstd/73f9N0E6Fv890kZO+kLDn7KeRL5TPwqxpM+AY4Xvxilkj6NcuInInKU9KMAfCr+o2Cz7F75ev0vSD09h+f337/9erwzVaSuKN6ZHpsf/fRf4mXo9nlr76XfHl6Pt6JaVICU+C+WMl7Slxr+Jv4sVEj6EKgifhXjSZ8Ax4tfjGpJH0g58RORhSf9BACfE/+ZsG6+fOmVeBM6Sb64c+6HN67Hm1NF6orizenDee/Pf3375p14DTph3j+8Gq9HFakAQfHfMGWMpC8yfE78iaiQ9CFQRfwqxpM+AU4Uvxulkj6NouLnIgtM+tYDJ4r/fFglu9+62+/f9T0ppf7eb/oaVhevUI/y7u8//vYLr8Xbz8nz4/1X6n99avoOAows/qumdJ30/YVjxJ+LCkkfAlXEr2I86RPgRPG7USrp06grfjSynKQvO/Bk8R8Up2f3a2/2/nd9T0qRv/ebvoB9iBep73zw63jpOV/e2nvpPwv/vd/07QNYhPjvnNJj0tcWjhd/NCokfQhUEb+K8aRPgBPF70a1pA+ktPjpyNhJX3BgPfEfGsdm9/LX4o3nrIn/vd/0vetJ8O/63v3eT+J1Z4N8cHgtXptqUQGy4r98Si9JX1U4TfwBqZD0IVBF/CrGkz4BThS/G9WSPpAOxM9Ixkv6UgMbiv/0eDi737q7c/FSvOtsk9dffFGR2ovGRerPPv7Lnau34i1ns5T6e7/puwawXPFfRKVy0tcTniz+mFRI+hCoIn4V40mfACeK342CSZ9JB+JnJMMkfZeBCcR/ktzP7s07Xzh3Pl5xtszh+f1ffeeWIrULzYrUn/72d7cvXov3m43z9vmX/3CoRQWgxC+lUirpKwmrij8sFZI+BKqIX8V40ifAieJ3o2DSZ9KN+ElJ10nfX2BK2Z8nw/9d35PyxZ1zP3/jpiK1Cw2K1B/99F/itWYw/5b7e7/pywXA58Q/6kqFpK8hrCf+yFRI+hCoIn4V40mfAKeJX4+CSZ9JT+KHJd0lfWeBubT/ebKov+t7Ut56+bIitQvztajv/fmv33/z7+NtZjz/4+BK47/3m75TAJwo/rFXUklfPdhE/MGpkPQhUEX8KsaTPgFOE78eBZM+k/7Ej0zqJ31JgUaa/VRZ4N/1PSkvP/v8h2+/qUitb44i9d3ff7yoL0g9PW+ff/k/D69rUQE4Ev8ULM2SvmuwlfgTVCHpQ6CK+FWMJ30CnCZ+PWomfSy9ih+cFEz6VgKtNfjBsti/63tSDs/vv3/7dS1qfb4gtUE+mPnv/aYvEQBri38olvmSvlwwgfhzVCHpQ6CK+FWMJ30CnCZ+PWomfSx9ix+fVEj6GgJhM/1s8Xd9T8oXd879082vKVLrm6pI/fEvfhVvLcvmx/uvzPT3ftPXB4DNxT8jy7RJXyiYTPxpqpD0IVBF/CrGkz4BThO/HmWTPpnuxU9QUklfPaCKyX+8+Lu+T8wkX5+avjjj2/4LUu9+7yfxvrJ43tp7adq/95u+NQBMJv6RWbZJ+vrA9OKPVYWkD4Eq4lcxnvQJ8ATxG1Iz6WMZR/wopU3SFw0oaqofMv6u74rZ8utT0/dlKbYpUn1B6up5//CqIhWAk8Q/RMvqSV8WmFH8+aqQ9CFQRfwqxpM+AZ4gfkPKJn0yQ4mfpsyU9M0COrDlzxl/13fdbPz1qembsjjrFqnv/v5jX5C6bn5w4eU/HmpRAThR/DO1nJL07YAW4g9ahaQPgSriVzGe9AnwBPEbUjnpwxlQ/ExlkqTvEdCfzX7a7H7tzad2duPtZHfZ4OtT0xdkoVYvUt/54NeK1M3y1t5Lv7m4yd/7Td8OAJqKf8qWB0nfBWgq/sRVSPoQqCJ+FeNJnwBPEL8hlZM+nJHFD1fWTfrKAN1b98fO2a9ei5eSXee7164qUutbpUj9h398N95I9p73Dq7+6UCLCsBK4p++l5n0sUNG/NGrkPQhUEX8KsaTPgGeIH5DKid9OEsRP2g5JenbAQxlxZ88z7zxvaf3DuNd5AC5cekrT/z61PSl4LQ69b0///Xu934SLyLHyNvnX/7DCn/vN30dACgk/nl8CUkfMgAAdCb+O7wcJX0RgMGd/iNo98rX/V3fCXN4fv+kOjV9EfjMSUXqnau34hXkYPng8JoWFYANxD+nj5T0YQIAwCDiv9svLekDB5bl2B9Eu9+6++XnXoyXj+Plizvn3r/9uiK1uEeK1Hd//7EvSJ0pP95/5Y+P/QPV9PkD0JP45/cekz40AAAYXPx3/iGTPlWAz/1437155wvnzsdrx1HzxZ1zP7xxXZFa31GR+s4Hv1akzpq39l76zcXrWlQAthf/aF826ZMBAIBFi38i6DTpcwM4xtEPqLNfvRZvG5eQ71y9qkit7/9673/Gq8Yl5NsvvPbBf/zn//x//7/0gQMwmvhnf//NAQAAeFz8I0PNpI8F4MmO/pnkWy9fjveMw+fpvcPdb931vw7FHf1Lyd8eXn9r76V42zhwvv/m37/3578++IvK6WMHYHDx/zjgPzgAAACPi3+s8CkG4Ike/vrO92+/fnh+P144jpovP/fiUZHqfzjKeuTrO/9w+Orb51+Od47j5fbFa+988OtHvp1WowpAe/H/jOA/OAAAAMeKfwbx+QXg3udb1Af58O03X3/xxXjtOF6+fOkV/7NS3CNF6lH+dPDqDy6oU6fMnau3fvbxX44tUtWpAFTjPzUAAABl6UkBZnVskfog/3Tza1/cORfvH4fJ7pWv+1+f4o4tUh/kvYOr8QpyjPzop/9ySouqTgUAAAAAALJOb1Ef/geqlw7/Lt5C9p6ndnZ3b97x/8xT3OlF6lH+7fBavIjsOrcvXvvpb3+3SpGqUQUAAAAAACJWLFIf5LvXrsbryH7z9N7hM298z99GKG6VIvUovz28/tbeS/FSssd8/82/f+/Pf12rSFWnAgAAAAAALa1bpB7l/duvP7O7F+8lu8uXn3tx91t3/an54lYvUo/yh0Nfn7p2fvyLX23QompUAQAAAACANjZrUR/+e783Ln0l3k52lLNfvebLu+tbt0g9yp8OXv3x/ivxgrKLfPuF1979/cdbFqnqVAAAAAAAYD5bFqkP8sMb17+4cy5eUxbPp1+QeuXrGxep6tQ2NmtRH877h1fjTWXx3P3eTzb7u74aVQAAAAAAoIGpWtQH+dV3bh2e34/3lWXzhXPnd2/e2bJIVafObfsi9Si/uejrU4/P7YvX3vng19O2qOpUAAAAAABgQpMXqQ/y+osvxlvLgvni/rPrfkGqOrW9qYrUB1+f+vZ5X5/6udy5emuqv+urUQUAAAAAACY3X4v6IP9082v+3u/D+fKlVyZsUdWpM5m2SPX1qY9njr/rq04FAAAAAACm0qBI9fd+H84kX5CqTm1gjiL1QT44vBbvMbOZ9e/6alQBAAAAAIAtNWtR/b3fB5nwC1LVqbOatUg9ym8Pl/v1qW3+rq86FQAAAAAA2EykSF343/ud/AtS1akzaVCkHuWPh6/+4MLivj615d/11agCAAAAAABrCbaoS/57v2e/eq1Ni6pR3VKzIvUofzp49b2Dq/F+s1l+/ItfxVtUdSoAAAAAAHCseIv6cBby934//YLU67faF6nq1A00LlIf5DcXr8dbzrnz7RdeC/5dX40qAAAAAABwinhzemyG/3u/T+8dNviCVHXqJFJF6lH+cPjq2+eH/Xu/b9+8U+Hv+mpUAQAAAACAR8QL09Mz8N/7/fJzLzb7glR16payReqDv/f7Pw6uxHvPyfOjn/5LvCpVpwIAAAAAAI+LV6Ur5salr8Srz2mze+Xr8QpVnbqKeIX6SP7t8Fq8/Zwqty9e++lvfxcvSTWqAAAAAADAI+L16Lr54Y3rY/y93y+cOx//u77q1BXFm9NjM8bf+71z9dbPPv5LvBtVpwIAAAAAAI+IF6Ob5f3brz+zuxcvQ7fJzsVLRf6urzr1ieKd6Snp/e/93v3eT4p/QapGFQAAAAAAFijeh26ZD99+8+Vnn49Xoptl9/LX4m2pOnVF8bZ0lXT6937f+eDX8SZUnQoAAAAAADwi3oROlbdevhwvRtdK2b/rq049VrwkXT19/b3f2xevvfv7j+MdqEYVAAAAAAB4WLz9nDw/f+NmL1+fWvzv+qpTHxGvR9fNnw5efe/garwnfWLuXL3V+9/11agCAAAAAMBg4qXnfPnVd24dnt+PV6Wnp4u/66tOfSBejG6c31y8/tbeS/HC9KTc/d5P4nWnOhUAAAAAAHhYvO6cOx++/eaNS1+JF6bHpq+/66tOvddzkXqUPx6++oMLFf/e7zBfkKpRBQAAAACAMcRbzpb57rWr8eb0kfT4d30XXqfGm9Cp8sHhtXh5+iBDfkGqRhUAAAAAAPoVbzYjef/260W+PvWpnd1+/67vYuvUeAE6bf7z8Prb5/P/QHXsL0hVpwIAAAAAQHfinWYwH779ZvzrU5/eO+z97/ousE6NV59z5E8Hr/6PgyvBInUJX5CqUQUAAAAAgF7Eq8wKyX596pcvvTLG3/VdVJ0aLz1nzW8Pr7+191L7InVRX5CqUQUAAAAAgMriDWa1tP/61E//ru/1W/G6U526rnjX2SB/PHz1x/uvNGtRb1+89tPf/i7eXRZM+rIDAAAAAMASxYvLmvn5GzebfX3qF/efHfifow5cp8Zbzpb5t8NrDYrUO1dv/ezjv8Rby8pJ33oAAAAAAFiKeF9ZPL/6zq0GX5+6e/lr8X5TnbqBeLnZPn84fPUHF16er0j9/pt//96f/xovK7tI+voDAAAAAMDI4jVlL/nw7Tdffvb5mVrUp/cOd2/eiTeb6tQNxGvNYD6Y5x+o/sM/vhsvKLtL+jkAAAAAAIABxQvK7vLWy5cnL1K/fOmV5fxd38Hq1HibGc/k/0D1nQ9+He8lO036aQAAAAAAgHHES8l+88Mb16f6+tSndnZ3v/ZmvMqskPQDsYl4j1knk/wD1dsXr737+4/jjWTvST8WAAAAAADQt3gXOUDev/369nXqzsVLC//nqF3XqfH6slq2/Aeqd67e+tnHf4kXkcMk/XwAAAAAAEB/4hXkSPnw7TcPz+9v/s9Rr9+Kd5cFk35EVhUvLstms3+g+v03//69P/813j+Ol/SDAgAAAAAAfYg3j0Pmw7ffvHHpK+sWqV/cf/aZN74Xby3LJv2sPFm8ryyedf+B6t3v/STeOQ6c9OMCAAAAAADVxTvHsfPWy5fX+Oeol78WLyvrJ/3EnCbeVPaSFf+B6jsf/DreNi4h6ecGAAAAAAAqiveMC8kPb1x/4ten+ueoA9Sp8YKyr5z+D1RvX7z209/+Ll4yLirpBwgAAAAAAKqI14tLy/u3Xz+pTvXPUceoU+PVZKf5t8Nrb+299EiR+u0XXnv39x/Hu8VlJv0kAQAAAABAUrxVXGx+9Z1bh+f3HylSn9479M9Rx6hT46Vkv/nj4as/3n/lQZF65+qt9/7813iluPCknycAAAAAAGgtXibKh2+/eenw7x4UqWe/ei1eR/ae9FP1N/E6coD85uL1t/Zeuvu9nyhS6yT9YAEAAAAAQAvxDlEezo1LX/HtqCPVqfEWcpj83wevxttDeTzpJwwAAAAAAGYUrw7l8cT7x8ESfL7i/eNIOVppvDqUYxN8ygAAAAAAYA7xxlCOzdHpxPvHwRJ5xOLl40h5eLHx3lCOTeQpAwAAAACAycXrQjk2jxxTvH8cLI2fsnj5OFKO3XC8OpRj0/hBAwAAAACACcXrQjkpx55XvH8cLM0etHj5OFJOX3W8OpRj0+ZBAwAAAACAqcS7Qjkppx9cvH8cLA2etXj5OFJWWXi8N5STMvezBgAAAAAA24t3hXJKVjzEeAU5UmZ93OLl40hZa/Px3lBOykzPGgAAAAAAbCleFMopWfc04xXkSJnjcbunSA21qA+L94ZyUiZ80AAAAAAAYEvxolBOz2bHGq8gR8q0T9w9RWqBIvVIvDSUUzLJswYAAAAAABuLt4RyerY833gFOVImeeKOxPvHYTLVicRLQzk9Ux00AAAAAACsKN4SyumZ6qDjFeQwmepE4v3jMJnqRB6IN4ZyeiY/cQAAAAAAeFy8JZQnZtoTj7eQw2SS44hXkGNkkrN4XLwulCdmpqMHAAAAAIB4RShPzExHH28hh8mWBxGvIMfIJA/FKeJ1oTwxc98BAAAAAACWI94PyiqZ+xrEW8hhsvERxCvIMTLhQ3G6eF0oT0yzywAAAAAAwJDi/aCsmGZXIl5EjpENNh+vIMfI5E/E6eJdoaySxrcCAAAAAIABxMtBWTHt70a8iBwja+08XkEOkJkeh1XEu0JZJcEbAgAAAABAR+LloKye1CWJF5FjZMVtx1vIATLr47CieFcoqyR9TQAAAAAAqCveDMrqSV8WdWqjOjXeQg6QBo/D6uJdoayY9E0BAAAAAKCKeC0oayV9Xz4TLyLHyCkbjreQA6TZ47C6eEsoqyd9WQAAAAAASIrXgrJW0vflGPEicoCcst54Edl7mj0IG4i3hLJ60pcFAAAAAIDW4rWgrJv0lTlRvIscIMcuNl5E9p7GD8Jm4i2hrJ70ZQEAAAAAoIV4JyjrJn1lnizeRQ6QR1YaLyJ7T+RB2Fi8JZS1kr4vAAAAAABML14IygZJ35o1xLvIAfJgmfEisvcEH4RtxCtCWSvp+wIAAAAAwDTihaBslvTFWVu8ixwg9xSpSy1Sj8T7QVk36SsDAAAAAMDm4m2gbJb0xdlKvI7sOv/bt74f7yK7Tvr6TyPeD8oGSd8aAAAAAABWFa8CZeOk78404o1kp9m7dff6+f/1k4Pr8Uay06Qv/sTi5aBskPStAQAAAADgNPEqUDZO+u5MLN5L9pgLe8/v/LenLz+9p05VpD4QLwdls6QvDgAAAAAAn4n3gLJN0tdnLvFqsq8c/N3lnf/29FHu7D4bryb7Svqyzy7eDMpmSV8cAAAAAICli/eAsmXSN2he8YKylxxcvvmgSD3KO+cvxQvKXpK+5u3Em0HZOOm7AwAAAACwLPEGULZP+hI1Eq8p62f/tTuPFKlH+eX+i/Gasn7SFzwgXgvKxknfHQAAAACA8cUbQNk+6UvUWrysrJy9W3fPntk5tku9cGbno8Mr8bKybNL3OixeC8o2SV8fAAAAAIDRxOs/mSTpexQTryxrZu/W3We+dOHYIvVBnfrJwfV4a1kw6RtdRbwTlG2Svj4AAAAAACOI138ySdL3KC9eXBbM/v4LpxSpR7n89J46VZF6ungnKFsmfYMAAAAAAPoT7/5kqqSvUiHx7rJUDl648cQi9Sh3dp+N15d1kr7FdcULQdky6RsEAAAAANCBePEn0yZ9ocqJN5hFcnDljRWL1KO8c/5SvMSskPT97UC8EJTtk75EAAAAAAAVxVs/mTbpC1VXvMeMZ/+1O2fP7KzVpd7Pvx5cjleZitRexNtAmSTpewQAAAAAkBev/GTypO9UB+JtZjB7t+4+86UL6xap93PhzM5Hh1fihaYitSPxKlAmSfoeAQAAAAAExPs+mSPpa9WTeKeZyoW95zcoUo/y3FPnPjm4Hq81Fal9iVeBMlXSVwkAAAAAYHbxsk9mSvpmdSlea7bPwfNXNy5Sj3JjZz/ebCpSexTvAWXCpG8TAAAAAMDE4k2fzJf05epbvNxsmf1Xb29ZpB7l7t7z8X5TkdqpeAko0yZ9oQAAAAAAthVv+mS+pC/XIOIVZ5tc+MZ3z57ZmaRLvZ9f7r8YbzkVqf2KN4AyedJ3CgAAAABgPfGaT2ZN+n6NJl50zp29W3ef+dKFqYrU+7lwZuejwyvxrlOR2rV4/SdzJH2tAAAAAABOE+/4ZO6kr9iw4nXnrNnff2HCIvUozz117pOD6/HGU5E6gHj9J3Mkfa0AAAAAAD4TL/ikQdK3bHzxxnOmHFy+OXmRepQbO/vx0lOROox49yczJX2zAAAAAIDlird70ibpi7Yg8d5z8uy/dmemIvUo75y/FK8+FakjiRd/Ml/SlwsAAAAAWIR4ryctk75uSxRvPyfM3q27576wO2uXej//enA5XoAqUgcTb/1k1qTvFwAAAAAwoHipJ42TvnGLFu9Ap8qFvefnLlLv58KZnY8Or8RrUEXqkOKtn8ya9P0CAAAAALoXb/SkfdKXjk/Fa9Dtc/D81QZF6lEuP733ycH1eBmqSB1VvPKTuZO+YgAAAABAZ+J1nkSSvnd8TrwM3Sb7r95uVqQe5c7us/E+VJE6tnjfJw2SvmUAAAAAQGnxLk9SSV89jhevRDfL3q27Z8/sNO5S7+fnF16It6KK1OHFyz5pk/RFAwAAAACqiLd4Ekz69vFk8WJ0ky717MX2RepRevzi1PQVY0Pxsk+aJX3XAAAAAICAeIsn2aQvIGuId6NrpeXXpD6e554619cXp6YvF9uK13zSMunrBgAAAADMK97fSYWkryGbiDekK6b916Q+nm+ePYw3pIrUBYrXfNIy6esGAAAAAEwpXt5JkaRvIluJ96RPTOprUh/PO+cvxXtSReoyxTs+aZ/0pQMAAAAANhGv7aRU0veRacTb0id0qbmvSX08/37wSrwtVaQuVrzdk0jS9w4CPCkAAABAX+KFnVRL+koyvXhhelIOXrgR708fzoUzO2W/ODV9iWgn3u5JKumrB7PwvAAAAACdihd2UjDpW8mM4rXp49l/7U68PH08N3b247WpIpV7GtVlJ337YFseGQAAAKBT8apOyiZ9N2khXp4+nL1bd899YTfenB6bal+cmr44hMV7PckmfQFhDZ4XgJPEf0L2lfRx0RMXD4rwMAJjiFd1UjPpi0lr8Qr1s3+Uuv9CvDM9JR8dXolXqIpUHhb/L1qSTfoCwmniD4hHBqgv/oOxr6SPi564eFCEhxEYQ7yzk2pJX0li4i3q/RxcvhlvS0/Pc0+dq/DFqenLQkXx/7QlkaTvHRwv/mh4cIBexH8k9pX0cdETFw+K8DACY4g3d1In6ctIXrZIvfCN7549sxNvS5+Yb549VKRSWfy/cUnLpK8bPCr+UHh8gL7Efxj2lfRx0RMXD4rwMAJjiPd3Ek/6DlJLsEvdO3sx3pOumJ9feEGRSnHx/9IlDZK+ZfA58SfCcwT0KP5jsK+kj4ueuHhQhIcRGEO8yJNg0rePojJ/3ff5q/GGdK1Evjg1fTXoUvw/ecl8SV8u+Jv4s+BpAvoV/wHYV9LHRU9cPCjCwwgMI97oSeOkbxwdaFyk7r92J96NrpvLT+81/uLU9KWge/H/9iWTJ32nYKgfLOldAgsV/+nXV9LHRU9cPCjCwwgMI17tSbOk7xo9afenfW/dPfeF3Xg3ukHu7D6rSKU78f8CJhMmfZtYuvgj4LECBhD/uddX0sdFT1w8KMLDCAwjXvDJ3ElfMXrV6K/7/t3leCu6cf714LIilU7F/1OYbJn0DWLp4o+AhwsYQ/yHXl9JHxc9cfGgCA8jMIx40yfzJX256FuLIvXKG/E+dJtcOLPzXwfXFKl0Lf7fxGSzpC8OyxW//J4vYCTxn3h9JX1c9MTFgyI8jMBI4pWfTJv0hWIcc/9137NnduJ96Ja5sbOvS2UM8f84JmslfV9YqPjN94gBg4n/uOsr6eOiJy4eFOFhBEYS7/5kkqTvEWOar0u9sPd8vAmdJO+cv6RIZSTx/0omqyR9TVii+LX3oAHjif+g6yvp46InLh4U4WEERhIvAWXLpG8Qg/PXfZ+Yjw6vKFIZTPy/lckpSd8Olih+7T1uwJDiP+X6Svq46ImLB0V4GIGRxKtA2Szpi8OCTPwvUr/x3QH+uu/Dee6pc58cXFekMqT4fzSTx5O+FCxO/M574oBRxX/E9ZX0cdETFw+K8DACg4nXgrJ60peFhZrym1LPXoy3n5Pn7t7zilTGFv+vZ/Ig6bvAssQvfIWkDwEYVvznW19JHxc9cfGgCA8jMJh4PyhPTPqOwDR16sELN+K950z514PLilSWIP6f0SR9BViQ+G2vk/RRAGOK/3DrK+njoicuHhThYQQGEy8K5ZSkbwd8xl/3PSUXzuxs+Zd+08cL64n/97RlJn3sLEj8tpdK+jSAMcV/uPWV9HHRExcPivAwAuOJN4bySNI3Ao7nr/uekm+ePVSkskDx/7C2qKRPm6WIX/WCSZ8JMKD4T7a+kj4ueuLiQREeRmA88epQjpK+CPBk/rrvKfn5hRcUqSxZ/D+yDZ/0CbMI8XteNumTAUYT/7HWV9LHRU9cPCjCwwiMJ94hLjzp84f1+Ou+J+XCmZ3/OrimSIX4f20bMulTZSniV71y0ocDDCX+M62vpI+Lnrh4UISHERhPvExcZtLHDhvy131PyY2dfV0qPBD/z24jJX2YLEL8ntdP+oiAccR/oPWV9HHRExcPivAwAkOKF4vLSfqoYQL+uu8pWf0v/aaPEdqJ//e3AZI+Q8bX0fXuaFSAk8R/tegr6eOiJy4eFOFhBIYUbxiHT/qEYWL+uu9JuXBm56PDK4pUOEn8v8X1mPShsQidXuxOxwaI/3bRV9LHRU9cPCjCwwgMKV41Dpn0qcK8ntyl7j0fbzYjufz0niIVnij+H+U6SvqsGF/vV7r3+YEFiv920VfSx0VPXDwowsMIjCrePA6T9ElCO6f9dd8rb8Q7zWDeOX9JkQoriv/XufpJHxGDG+Yyj/EuACbnJyGL4p5DER5GYFTxCrL3pA8QMo4tUvdu3V3gX/d9JMf+pd/0cUF1zaqQvpI+FgY30jX2VAI8zo9BFsU9hyI8jMCo4l1kp0mfG+T5677H5vG/9Js+KOhJs0KkftJHweCGvMbjvSOAbfgxyKK451CEhxEYWLyX7CXpg4JyHi5S91+9He8xi+Thv/SbPiLoWINapHLS62dwo15gzybAA34GsijuORThYQQGFu8oiyd9PlDag7/ue+4Lu/ESs04e/KXf9PnACBqUIwWT3jojG/v2jv3uAFbnZyCL4p5DER5GYGDxsrJg0mcC3TjqUg/+7nK8viyV/37uoiIV5jB3S1Ik6TUzuOFvrycU4J4ulYVxz6EIDyMwtnh3WSHpQ4Be/R///faFMzvx+rJU9l+7c+6tH6VPBkY2d1eSTXq7jGwhV3chbxPgFH4AsijuORThYQTGFu8x9afQr/9n/9WPDq+oUx/k4PLNB18jmz4cWIRZS5NI0htlZMu5ust5p+sa/g1uw3K2Z4d1+On3iCW8x+31u6U697zTBaZY1wP9Pn2PqPMwzm2MdzEfy2FU8U5ThQqdOvpW0Pv55f6L8RKzQg6ev/qgSNWlQnsTfnBLJb1CRra0q7uoN3uKpb3f1S3zPszBDmta+E+/Bb7lDYx0N7LvpffttTTAZZvESE/fI0Z9a6O+rwnZDMsR7zf1p9CdB0XqUX5+4YV4lZnN/v4LDxep6lQImvCTTuOkN8fIlnZvF/6oLvNdP9HCb8W07LC4ZR6QZ3wVs24ptajI/GOsro1hbto25n70iuxkpLezkCPbkrWwQPGuU38K3XmkS72fO7vPxgvNVJ750oW9W3cf71LVqRDX4BOQTw10YYH3ttpbbvPqflIdq8FagvtpOfmQCxzSoo5m7Ad8Ki231H5XjcfufXUj7arxTdtMgyXU2ckA76L9eXVxjR+X3cncrzLAKfc+f2Xx3lN5Cn15vEg9yo2d/Xit2T7nvrB7UpGqS4VS5v5t36+mlLXYe1vqXc/96n5kPa7xTlL7aTPzwAsc0kIOJfJ011zFKVJbarmuZtOOsbfxdtXmmq2r8QaK7KTr+Zd5ZBuosJMGO+/9fLsevr54E6o/hV6cVKTezycH1y8/vRcvN1vm7Jmd/dfunFSkqlOhrJa///vtlLjFXtpSD+ysL+2n1uMiO4msqMG0Yy9wSMMfR+pOll3IseIrarauBnOOtLQhdzX3HVtLagMV1tLp5PFjqnmTH1dnIQ223fvJdj18ffFWVH8KvTilS72fjw6vXDizE684m+XgyhunF6nqVKgv8onAb6e0tORLW+e9z/TSfnY9Lr6TxvuZddQlLHBIA59F/E7WXMsj4mtpvKu5hxxsaaPuar6NrS7+9uNr6W7m+NHEj2x1pbbRZs/9nukSLmRWvCFVnkIXTi9SH9Sp8YqzUZH6wo1VilRdKnSkzqcDmMrCL22dtz/HS6d+ZJW9DPFVRFY035DxvVW7YB0Z9SDit7HsZh6IbyOyrlnHi29s8qWNvavJ17W6+BuvsJmOpo0fR4UlrCi+h8dX0WbD/R5op2P3Jd6ZKk+hvlW61Pv55f6L8aJz7uzvv7BikapOhU4FPxrAhFzaIhuY/HVb/ozq4krEN5Daz0wTxjdW6nZ1Z7xTiF/C4vs5El9CalfzzRbf1RxLm2Ok+H7mW1fLlQ6wmV5GjR9EkT30tas5pmr83uc8qBknbzZ2X5SnwOlWLFKPcnfv+XjdOV+e+dKFtYpUdSr0ruXnApiWG1vksZ32def+odTXxYi/8ex+5hgvvqtm2xvVYEcQv371V9TRluZY10xTxVc008Ymnye+mVnX1WyfYyxnaUP2fl7d7WrywRpvYM6zGmHsvihPgVOsVaQe5ZtnD+Ol5xw594XdvVt3damwWPN9IoDJTX5de7y0RZYw4evO9I46vRvxtxxf0eSDxVfUbHUDG2n/8YtXf0vxdx1f1xwjxZdTf12VdzXhutosc5j9FJ8wvvZqC+lxXdPO1n4JMx/a9DM3GLhfylPgJBt0qZ8cXL/89F68+pw2Z8/s7L92Z4MiVZ0KQ/LbKcXN8QG2x0tbYQkznUXBzHGCg2215hK6WOm0qxvYGMuP37cuFhV/vxXWNfk88bV0sa7iu5pqXQ02OdJ+Ko8XX3jBnXS6rgnHa7+H+Y9Ol9qO5hQ41gZF6lH+6+DahTM78QJ0whxcvrlxkapLheH51ZRqZvr02p059rDuKmaaoWZmOseRVlpwD11sdcK9jW2A5ccvWxe7ir/TIuuadpj4QnpZV/1dTbKuudc42H7KzhZfdc21DL+uSfbZ3Qn2NW3XNKfAsTbuUu/no8Mr8QJ0siL1+avbFKnqVFgUv51SQeojZzXBT99zz1A2Mx3lSPustopetjrV3sbW++bj16yLdcXfY511xefvaFfWNYn4+yq7opqDxZdc+ciGX9f2y+zrBDsadQxqU+AR2xSpR/nl/ovxGnT7XNh7fvsiVZ0Ki+W3U9oLfuQsKL6KmY6jbGY6x5GWaRvZvY2t683H71gXG4u/u1Lrig/f0a6sa3vxd1R5RQWniq+3+JEtZGNbbnKxxzfrqGPQnAIP275IPcqd3WfjZeg2eeZLF/Zu3dWlApPwqyltZD9yVhNfxUzHUTkdHWXXK4q/i073Nrau1x6/YF0sLf7WSu0qPnxHu7Iu25t1S2OPVCdTLWch69p+k70c37SjzjonwJCm6lLv58bOfrwS3Sxnz+xc+MZ3pypS1akAtBH8vFlQfBtzDFA/XZxj7yuKv4Uelza8ftcev11dLC3+vqqtKz55R7uyLqubdUsDz1Mtk+xnOevaco1dHN/kc840JMCoJixS7+eTg+vPPXUuXoxukP1Xb09bpKpTAWgg+HmzoOwH8PkGqJ8uzrHrFcXn73Fpw+t05/F71cXe4u+o4LriY/eyKOuyt462VGqYmtl+RUvb2DY7LH52HQ0JMKppu9T7+ejwyoUzO/FudK0cvHBjjiJVlwrA3LKfNwsa6QN4Ryl+ghViLe2XNrwedx6/VF1c1/h7qbmr+Ni9LMq67G3uRdUZJr7MXo5saRvbeIFlD26mIWeaEGBUkxepR/nl/ovxenSNf5G6/8JMRao6FYC5ZT9vFjTSB/BtRg2+dLXjq7OrXjZTJ1tfqMH1uPP2l6fH69ps5ocnj7xo5bUUSS+3qEg2XldkacHDqrOoOpNUPrItt5Qa+3+G/vdlmwWWPbuZJpx8PICBzVSkHuWd85fiJekqeeZLF/Zu3dWlAtCj+OfNggb7AD7VbHUmSQ1ZYYyyy1l37OBL87Dudl7htlSYITjh6nMWGaPxSCvOmX1165pjXW3m7G6SBhMWGWP4I6s2Z4NJNt5ewYPraDyAgc3apd7PN88exqvS03P2zM6Fb3x31iJVnQrAfOIfNgvK7mSOV5/wpAqO1GC8AYaZb54t56wzyTL1tfBqN6TUMA0WtfF4deaZb5JtZqsziXVts665ZxtmpMkHqzBDF+e15ZHVHG/ukTabLb6WZuNNPhvAwOYuUu/nk4Prl5/eixemp2T/1dsNilR1KgAziX/YLCi7kzleffIzqjlYtXmqTVX5ahUcaSH6WnjBaRcy0vaDFRlpvuVsv6hq81jXACNVHqzCGDU3Y7BSg208Yan9dDEYwPAadKn389HhlQtnduKd6bE5eOFGsyJVlwrAHCp82Kwmu5M5Xn2OAyo4Xp1Jag5W/2rVnGpsHS288pylZqv8HMUHm2k5U22p2lTLXNfGg5Uapv548RmqLaSLCQuONPdsGw9ZcEWTDzbhVADDa1OkHuVfDy7Ha9PHc2Hv+ZZFqjoVgDlU+LBZTXYnc7x6/Q/j209YZIzK43VxtcoONqqOFl58yCLjzXGg064rO9tM+5lwS6Vms64eJ2k8ZIVh4gPMdF7VhpxjmGmXNtOEm825hC1NOBXA8Fp2qffzzvlL8fL04TzzpQt7t+7qUgHoXYUPmwUFdzLHicx3NHWGrDBD8Qm7uFqVZxtSLws3YWSMmdYVHG+O/Uy+pTrjWVd3Y3Q0p/PqbtQ6kzQessg1K7ifSUYCWILGRepRbuzsxyvUo5w9s7P/2p32Rao6FYDJFfmwWU1wJ3OcyKznUmHULhY17ZzZV591Y/UnHEkv2y4+3uRDbjbnAk9z3SHnWNHkW6ozoXV1NENw2vgY/S6ho2knn2G+pc0xaoWlVVvOJPMALEGkSL2fTw6uP/fUuXiRej8HV95IFanqVACmVeTDZjXBtczx0nMfSnzaZS4q++qzbqyLIcfQxZWoPFupUesf5UyjBlc006KKTGhdvQzQ48DDvHqDI6swbYUZgtNWWFq1zUwyD8ASpLrU+/no8MqFMzvhIvXvLmeLVF0qABMq8mGzmuBaejyR+MC9LGrCUYNbarC0LoYcQxdXovJs84267rT1z3G+aVOvO9+iigxpXZEB5ljRrANvNvMw57WQI4sPkJ1244ErzFBzGICFCBapR/nl/ovBInXv7MV4kapOBWBCdT5slhJcS6cnEpx5sYsKvvTcG+tlzgF0cSvKDjbrtOsOXP8c5xs48qJzL6rCkNYV2dJMK5p17OwA3b33zWTH7m5p0w688cwVZphjmC0nAViOeJd6P3d2n40UqWfP7OzduhtvUXWpAExo8k+aY3y8Cq6l0+MIjt3XoiYceN2ZJz+jWZfWy5y9q38ryg5WbeDKhzj3wJEXnXtRFea0ruIvvY344Y7x0v0eWfCl2yytzswVZqg2CcBCxFvUB7n89F77LnX/1dvxClWdCsC0Jv+kOcbHq+Ba+j2O1NhLXlTqdRtsrKNRuzb5rZh82zWnajPzWmNXPsQ6Axe/7fH9zDrDqOvqZUXVJndeG0gN3+nSioxdZIwJJ9lmBoBFiVeoD/JfB9caf3HqwQs34uWpLhWAyU37+W6YT1jBtfR7FpGNLXxXkRdts7GORu3a5Ldi8m3XnKrNzKuPXfkE24zd/hUb7Co+52LXlbpRs+6n2vCpl3ZkGwzf6dKKjD3eGBvPALAo8f70kfz7wSvNitQLe8/Hm1N1KgBzmPbz3TCfsIJr6fos2g9vUZEXbbC0jkbt2uS3Ytpt15yq4NhlT7DZ2O1fscGi4tPGB6g/bV8rmnX+Xl666yNLDd/pxuqcdYUxKswAsBzx5vTYvHP+UoMi9dwXdut8Tao6FYBpTfsxc5hPWMGddH0W7Ye3qMiLNlhaR6N2bfJbMe22a07VcvLGL9d4V+1n7mtR8WnjA9Sftq8VlZp/aa87FZd8LUUmr7DDCnsAWI54bXpSbuzsz92l7r92J16Y6lIBmMm0H+6G+ZAV3EnXB9F+aZ3uqver1WZjfU3bqWlvxeTbLjhS48lXHL7m8RVU9qrXnDY+QP1pO9rP3POv+xYir9vXlS7yFrpeWpHJ4zsssgeAhYgXpqfkk4Prs35xasGvSVWnAjChaT/cDfMhK7iT3g+i5fxd76rrq9VmY31N26lpb8Xk2y44UuPJVxm+7PEV1Neu4tPGB6g/bUf7mXv+dd9C5HX7utJF3kLXS6szeXaSOnsAWIJ4YXp6Pjq8srSvSdWlAjCVaT8gj/EhK7uT3g+i5fxznFR3iRzNWq+7sb6m7VT2TkbG6y6NtzTh8RXU167i08YHKD5tX/tp8C7qv+4AR9b1PZ97OZWHz969IksAWIJ4VbpKfn7hhaV9Tao6FYBJTPvJbozPWdmd9H4QLfc2x0n1mIJHM4m+pu1U8EJGZusxjRc11fHV1Nei4icbH6D4tH3tp8G7qP+6A5xX+3fR9dLqDD/hJOsOU2cJAEsQ70lXzDfPHi7qa1J1qQBMYtpPdmN8zsrupPeDaLm3OU6qxxQ8mkn0NW2nghcyMluPabmoqc6urL521fgizTrA5MuZddoVB44f0CRSbyHyugOcV/t30fvS6gyf2mSdDQAML96Qrp5PDq4/99S5RX1NqjoVgO1N+LFumI9a2Z30fgot9zbHSfWYgkczib6m7VTwQkZm6zEtFzXV2ZXV164aX6RZB5h8ObNOu+LAfe2nwbtY640s50Un556vpc7wE24ycu233wDA8OIN6VqZ6otTe/maVHUqAJOY9pPdAJ+2sgsZ4Aia7W2Ok+ox7c9l9RfdRl/Tdip4ISOz9ZiWi5rq7Mrqa1eNL9KsA0y+nFmnXXHgvvbT4F2s9UaW86KTc8/XUmr49svs/fgAOhLvRjfI9l+c2tfXpOpSAdjehB+yxvi0lV3IAEfQbG9znFSPaX8uq7/oNvqatlPBCxmZrdM0W9RUZ1dWX7tqeYvmHmDy5cw67YoD97WfBu9irTeynBednHu+llLDt19mqbcPMLZ4MbpZtvzi1L6+JlWdCsD2JvxYN8AHrjm2sdZCBjiCNnub6aR6TPtzWf1Ft9HXtJ0KXsjIbJ2m2ZamOruy+tpV/HCtq9krzr2cgm+k/Yu2vyEzcc/XUmr49pew1NsHGFi8Et0423xxao9fk6pLBWBL036s6/0DV3wbAxxBm9XNcVKdpv25rP6i2+hr2k4FL2Rktk7TbEtTnV1Zfe0qfrjW1ewV515OwTfS/kXb35CZNH4jvS+t2vDODmBI8Up0m/z7wSuL+ppUdSoA25j2I3nvn7niqxhg/21WN9O97THtz2X1F91GX9N2KnghI7N1mmZbmursyuprV/HDta5mrzj3cgq+kfYv2v6GzKTxG+l9adWG7/HspnrvAKOKl6Hb553zl9YqUs+e2en3a1J1qQBsY9qP5L1/7IqvYoD9t1ndTPe2x7Q/l9VfdBt9Tdup4IWMzNZpmm1pqrMrq69dxQ/Xupq94tzLKfhG2r9o+xsyk8ZvpPelVRu+5fFVe+8Ao4o3oZPkxs7+Gl+T+urteAeqTgUgZdqPdf1+7JpjD+uuYoD9t1ndTIfVY9qfy+ovuo2+pu1U8EJGZus0zbY01dmV1deu4odrXc1ece7lFHwj7V+0/Q2ZSeM30vvSCg7fZqUF3zjAkOId6FT55OD6hTM7K31N6vNX4+2nLhWAoGk/lff7yWuOPay7igH232Z1Mx1Wj2l/Lqu/6Db6mrZTwQsZma3TNNvSVGdXVl+7ih+udTV7xbmXU/CNtH/R9jdkJo3fSO9LKzh8m5UWfOMA44kXoNPmXw8uP7FIfeZLF+LVpzoVgKxpP5X3++GrwhIGWH6b7c10aXtM+3NZ/UW30de0nQpeyMhsnabZlqY6u7L62lX8cK2r2SvOvZyCb6T9i7a/ITNp/EZ6X1rN4RtsteYbBxhMvP2cPHf3nj/9a1IvfOO78d5TlwpA1rSfyjv98FVkCQMsv832ZjqvHtP+XFZ/0W30NW2nghcyMlunabalqc6urL52FT9c62r2inMvp+Abaf+i7W/ITBq/kd6XVnP4ubda810DDCbee86Uy0/vnfjXfS/fjJee6lQAKpj2g3mPH8GKbGCAzTfb3kxH1l3an8vqL7qNvqbtVPBCRmbrNM22NNXZldXXruKHa13NXnHu5bR5F2u9keW86OT6veeRvdWcfO6V1nzXAIOJl54z5aPDK8d+ceqFvefjdac6FYAipv2k3ONHsCIbGGDzzbY305F1l/bnsvqLbqOvaTsVvJCR2TpNsy1NdXZl9bWr+OFaV7NXnHs5bd7FWm9kOS86uX7vefu9VZ581tnKvmuAYcQbz1nz8wsvPFKknvvC7t6tu/GuU5cKQBHTflLu7iNYnbc/wOabLXCmU+su7c9l9RfdRl/Tdip4ISOzdZpmi5rq7Mrqa1ctb9HcA0y+nFmnXXHgvvbT4F2s9UaW86KT6/eet99b5clnna3mWwYYSbzunDvfPHv4cJe6/+rteNGpTgWgjmk/KXf3QazOe+997S0XuLRbuqX43Q4O3GDaTk17K6bddsGRarKo1fW1q/iDaV3NXnHu5bR5F2u9keW86OT6veft91Z58vlmK/uWAYYRLzob5JOD6889de5vX5P6/NV4xalLBaCaaT8sd/RBbKY3vtl7733zLRfY+64ai9/t4MANpu3UtLdi2m0XHKkmi1pdX7uKP5jWVe0V55B6C5HXHeC82r+Lru958clnGq/s+wUYRrzobJN/P3hl5789/cyXLsT7TXUqAAVN+2G5l49j1d51fIAttdxh77tqrML1Tg3cYNpOTXsrpt12wZFqqnl8NfW1qPjJWle1V5xD6i1EXneAI4u8hU73Vn/smcYr+34BxhCvOFvmh/tfufCN78bLTV0qADVN+6mzi09k1d5yfIAttdxh77tqrML1Tg3cYNpOTXsrJt92zamqKXt8LYdv/HJtFhU/Weuq9opzSL2FyOsOcGSRt9Dp3roYe/Lxir9fgAHE+83GiTeb6lQAypr2U2f9T2Tzvd+N33J8gC21nL/3XTVW4XqnBm4wbaemvRWTb7vmVNWUPb6Wwzd+uTaLip+sdbV80VmX02D+dd9C5HWD73cqvd/zZqvrZebJJ6z8ZgEGEG82G+f+W47XmrpUAMqa/INn5c9lNd9skTF6Gb7TRUV0d7X6mrZT096Kybddc6pqyh5fy8nLvuI24idrXTVfdELB+Zf2ulOJzD/tPWmzul5mnnzCym8WYADxcrN9l3pPnQoAJ5v8s2fZj2Y132mRMXoZvt9dtdfd1epr2k5Neysm33bNqQoqe4LNxi77ituIH6t11XzRCQXnH+B12x9ZavhpX7fB6voaeMIJ679ZgK7Fm81IkXok3mzqUgGoaY6PnwU/nZV9j3Um6WL4fnfVXndXq69pOzXtrZh82zWnKqjsCTYbu+wrbiN+rNZV80Wnkh0+9dKOrMLe5l7d5NPOOvAc09Z8pwC9i5ebqSL13iK7VHUqACsa/jNa5TdYapj6k/e4qJTu7lVf03Zq8sd28m2XHayUyifYYOz2r9hmS/Fjta7Kr7u97OSpl+73vLLDT/vSs25vjlFnPeuZBi74TgG6Fi83s13qvUXWqe2vGQA9GvtjWvG3Vm2e1OSR151vOfNN3vjlWu6qr2k7Ne2tmGPbZQdrM3yzF1rIA77YFW02sHVVft3tZScf46VbHtkw5zXr9maac+6Dnm/sau8UoF/xcjNbpB6Jl5vqVABqGvWTWv33VXCkyNiRl55vP/NN3vjlOr1UDabt1ORP7uTbrjxbg8kbv9zwD/hiV7TZwNbV/nXb7GrysbMDdPfeNxMfe9oB5tjeHBO2OehZJ6/zNgG6Fu8340XqPV0qAJxgvM9rvbyjmlO1Hzv10vOtaI6x279ip5eqwbSdmvzJnWPblWebe+zGL9dsV6lRe9nP5NNuNrB1tX/dNruafOzsANn33ubIKsw8+QzTbm+m8Zqd8tzzF3mbAJ2K95sVitQj8XJTnQpATSN9auvovZQdrPHMqQFmWtFMM7d/xZaL6mvaTsUf3vZDTj7efDO3f8Vmi0rN2ct+Jp92s4GtK/LSDdZVYeBhXr3BeRUZePJrM+EOZ52tzSk3eAvx9wjQr3jFWadLvbe8OnXu2wXAGMb47Nbdu6g8W7OZswPMsaKZBo68aHdbajNtpyZ/eOfYdvHx5ps58qINdhUcsv5yZpp2s4GtK/LSc6+ryLTZAYosobtpJ5+k1EUKHnHLNxJ8jwCdivebpYrUe8vrUtWpAKyo609wnX4CLT5em4HjM8yxqMmnTb1ugxVNPnCDaTs1+bMz07brTzjHtKnXnXVX2Qkrb2bWaTcb2LpSrz7fxiafc+NRswPU2UNfo84xzMazNRimwfkG31HkPQL0KF5xlipSj8TLTV0qADX1+FGux5nbDD/VkLNOW2GSabc005zBl551RXMM3GDaTk17K+bbdhdDTjtq9tXn21V2trJrmXvazQa2rtSrz7S0OYbceM6RBujryAqOtNaczQaY+3DrvLVmbxCgR/GKs2aXek+dCgDHyX6sW/2TXRdDVngj9UetM8yEu5p8yPiKJl/OrAM3mLZTXTw4M41afMIKM0y+q/hgBXfSZtrNBrau4ACT722O8baZMD5DtYX0MuFMU9XPJGdaebcN3iBAj+IVZ80i9Ui839SlAlBQ/NNr/XS37cpDlppqy0XNN1t8hqk202bgBtN2qvJT09eodQabY1Hb76rIVHUW0njazQa2ruAA065uptm2GW+wGXo5ssqzFc8kq6u82zZvEKAv8YqzcpF6b2FdqjoVgNXFP8BWTqerrjlhzdVtM9Ucg1UYY8udNB64wbSdKvi8NJ52+4GrjTTTlraZqs48FbYRmda62gw87QxTLXD4qSrMMPxUzSYsm0lWV3a3bd4dQHfiLWfxLvXewurUqe4VAMOLf4Atm95XXW22yturM0yF5Ww2Q2rgBtN2qs79TE27zeRFxmi8qE4nmXyeDV49OK11tRl42hm2nKrUMLOOV2SM4Y+s5agFM+H2Cu622bsD6Ei84qxfpB6JV5zqVAAKin+GLZjB9hyfp6PtBWcospyNx4gM3GDaTpW6oqmB13oXwZfuZUvZA2q2mS3OJzDtZgNbV3yMDSaMD9B+UUXGKH5e2x9ZauwimXB71Xbb7K0B9CXecnZRpN7TpQLACeIfY0vFkmuuNP4uym6pyBiRgRtM26lSVzQ1cKlY1KyLig+Qmnazga0rPkbZlDqvOpNUzvZHtsy9zbfAOott9tYAOhJvOTvqUu+pUwHgBPFPskViw5VXGn8vNbdUZ5L2AzeYtlPVbmlq5jqxqFm3VGGGyLSbDWxdFSapmVLnVWqYmtl+RcvcW4MdVlhsy7cG0It4y9lRkXokXnHqUgGoKf5htkKst/I+42+n5qLqTNJ+4AbTdqraLQ2OXSG2NPeWiozRftrNBrauIsNUS7XzKjVMzWy/osWursEOs1tt+b4AehFvObsrUu8tqUtVpwKwrvjn2YE/Tcff3Rgrjb+jglsqNUzjgRtM26mCFzU4eTa21GBRRcZoP+1mA1tXnXnqZPvNTL6favNUyyT76XR1E4439xpTK235vgB6ES86e+xS7y2pTp1jewCMLf7pOBKL7Wir8fdVbUvV5mk5cINpO1XzrqYmz8aiGmypziSNp91sYOuqM0+RbL+WOfZTcKQ6mWo5Pa5u2tnabLL9Shu/L4AuxIvOHovUI/GWU50KQFnxz8iNY6vdbTX+7kptqeBIzQZuMG2nyl7X1PCpWFSbLZUapuW0mw1sXaVGimeSncyxnJpTVciEm+ludZMP1nKZzfbZ+E0BdCFedPZbpN7TpQLAqeKflJvFSjvdavw91tlSzanaDNxg2k5VvrGp+dvHopptqdo8zabdbGDrqjZVMFMtZI7NlB1ssCPraHVzTDXkPtu/KYD64l1n113qPXUqADxJ/CPzSJ804292vMXG32aRLdWcqs3ADabtVOUbG3wLLWNRLbdUcKQ20242sHUVHCySCbcxx1oqzzbSkfWyuplGGm+Z7d8RQH3xorP3IvWeLhUAVhD/4DzMJ81pJ49vr8hi42+2wpbKDtZg4AbTdqr4pQ2+izaxqMZbqjlVg2k3G9i6as7WONOuYo6dFB9vmCPrYnXzzTPeJtu/I4D64l3nAF3qPXUqAKwg+9l5mM+Yk88fX2OR3cbfcnxFxcebdeAG03aqi6sbfC+zxpbab6nsYHNPu9nA1lV5wjaZYw+Tb6P+hGMc2VrqvPGuF7uEqwJQR7zoHKNIPRJvOXWpAHSh/WfnwT5gzvEW4sussNhqe2i/pfoTzjdwg2k71cvtDb6dmWJLkS1Vnm3WaTcb2LqKDzl3ZlrC5KvoZc6uz2szFd541+td1G0BiIt3ncMUqfd0qQCwstR/Qxjj0+VMbyS+1Qq7PRJfQmpLXQw508ANpu1URxc4+I5G2s8D8T1EtlR/wpmm3Wxg66o/50yZ7+3PsYeORu36yDaWfdddb3iZFwYgIt51Dtal3lOnAsA64v9VodPPlfO9Het9IL6KyIo6GnXygRtM26nurvGK4s9y5eU8EN9G+y11MeQc0242sHX1Mm1f733yDXQ3cI/nNYnIW+59z64NQBvxrnOwIvVIvOjUpQLQl/h/YejuE+Xcb2rh631Y/NY13lJf0047cINpO9XjTV5d/KGuuZZHxDfTcksdjTrttJsNbF19zdzLu578vfc4c3fvfXLN3mnvq3ZtANqI153jFan3ltGlqlMBmFz8PzV09HGywVtb+IYfEb+BzVbU3cx9Tdupfu/z6hbygG9pIVvqa+D4hq2rjWknr/9+J3/X/U7e0bvuV+8Ld3kAGojXnaN2qfeWUadmNwzAwOL/5aH+B8lmb3CxGz7WEm5gd8P3NW2nBrjYK1rCM7694bfU19jxPVtXS9POX/mdTv5+B3gL9d9sv3rfvCsE0EC87hy1SD0S7zrVqQD0LvLfH7r4CNn4nS5zyacY+BJ29xb6mrZTw1zv1Y36gE9r1C31NX984dYVMe0bKfgGJ3+bw7yRsu+xa70fgbsEMLd43Tl2kXpPlwoA0/GfIB6RetdL2/MqFnsJYQmW/D80a7EliPAzqjuOrKDez8KlAphbvPEcvku9p04FgHn4qFhkA2MveTMLuYGwWB7wVdgSpPg9pDvOK6vIp6oib8EdA3hcvO5cQpF6T5cKAMzD52UAAIBtDPCRSpcKMKt447mQLvWeOhUAmIHPywAAANvo/SPVtEWqz4YAj4s3ngspUo/Eu05dKgAMxudlAACgju4+oXQ38KxvwQdDgMfFG89FFan3dKkAwNR8ZAYAAOro7hNKdwPPN78PhgDHipeeS+tS76lTAYBJ+cgMAADU0V2v19e0s87vgyHA4+KN5wKL1CPxulOXCgDD8JEZAACoo69er6NR557fp0KAY8VLT13qqEkvGAAWxKdmAACgjo7avV7mbDC8T4UAx4o3nostUo/E605dKgCMwadmAACgjo7avSJzrvV/cKYK1UdCgGPFS88lF6n3Ru9S1akA0IwPzgAAQClddHx1Jpy1Ho3vGaBr8d5z4V3qvdHr1PR2AWApfHAGAABKqV/zlRovXqH6SAhwrHjpqUg9Em88dakA0DsfnAEAgFKKN33VZotXqD4PAhwr3nvqUo/EG091KgD0zmdnAACgmpqVX8GRZt2Vz4MAG4uXnorUh8UbT10qAHTNZ2cAAKCaasVfnUna78qHQYANxHtPRerD4o2nOhUAuubjMwAAUFC8CuylhWy5KB8GAVYUrz51qY+IN566VADol4/PAABAQfF+sJcKcox3ATCSeO+pSD1WvPRUpwJAp3yCBgAAaoq3hF20kGO8C4CRxKtPXeqx4o2nLhUAOuUTNAAAUFO8JeyighzjXQAMI957KlJPES89dakA0CMfogEAgLLijWf9CnKYNwIwhnj1qUg9Rbz0VKcCQI98iAYAACqL957F+8dh3gjAGOLtpy71dPHSU5cKAN3xORoAACgu3n5W/tw0zBsBGEC8+lSkriLee6pTAaAvPkoDAAD1xTvQsh+ahnkjAAOIt5+61FXES09dKgD0xadpAACgC/EmtOYnpmHeCEDv4tWnInV18d5TlwoAHfGBGgAA6EW8Dy34WWmk9wLQtXj7qUtdXbz3VKcCQEd8pgYAAPoS70ZLfVAa6b0AdC3efipS1xLvPXWpANALH6sBAIDuxBvSOh+RRnovAP2Kt5+K1HXFe091KgD0wodrAACgU/G2tMKHo5HeC0C/4gWoLnUD8d5TlwoAXfARGwAA6Fq8Oc1+LBrpvQD0K16AKlI3E68+dakAUJ8P2gAAwAAW2KLO8cZT7wKga/ECVJe6sXj1qU4FgPp86AYAAEaykAp1df1ODtCLeAGqSN1GvPrUpQIAAAAAEYvtTwFoJl6A6lK3FK8+1akAAAAAQAWaUwAmFy9AFanbi1efulQAAAAAAADGE+9Adanbi1efulQAAAAAAAAGEy9AFalTibef6lQAAAAAAABGEu9AdalTiVefulQAAAAAAABGEu9AFakTirefulQAAAAAAADGEO9AFanTiref6lQAAAAAAADGEK9BdamTi7efulQAAAAAAAB6F+9AFakziReg6lQAAAAAAAC6Fq9BdakzibefulQAAAAAAAC6Fq9BFanziRegulQAAAAAAAA6Fa9Bdamziheg6lQAAAAAAAA6Fa9BFalzixegulQAAAAAAAB6FG9CdalzixegulQAAAAAAAC6E69BFaltxDtQdSoAAAAAAAB9iTehutQ24gWoLhUAAAAAAIC+xJtQRWoz8Q5UlwoAAAAAAEAv4k2oLrWleAeqTgUAAAAAAKAX8SZUkdpYvAPVpQIAAAAAANCFeBmqS20s3oHqUgEAAAAAAKgv3oQqUiPiNag6FQAAAAAAgOLiZaguNSLegepSAQDgdP/n//6dtZKeF/7/9uwox47cSgLo/lftgeFBW1arpaqXJCMu8xzwU8C7DDJLAAMAAOBC8TJUkZoSr0HVqQAA8JfvNqcKVgAAANgtXobqUoPiHaguFQCAl9vUn+pVAQAAYIl4GapIzYrXoLpUgNc6XB9oK+AzvotN4n+mnAik+IoBAGCWeB+qS82K16DqVIDXipcI2gr4Ct/CWvG/SM4F4ny/AAAwSLwMVaQ2iNegulSAd4rXBwoL+AqfwCrxP0EOCEr4bAEAYJB4H6pLbRCvQXWpAO8Ubw0UFvAVbv5z8b85jgmq+GABAGCQeB+qSC0Rb0LVqQAvFO8L4it9AvAl7vwT8b8zTgoK+VoBAGCKeB+qS+0Rr0F1qQAvFC8LGlb6EODPXPiPxf/COC/o5DsFAIAp4n2oIrVKvAnVpQK8Tbwm6Fnpo4DfcdU/EP+r4sigmY8UAACmiFeiutQq8SZUnQrwNvGOoGqlTwP+kXv+XfG/J/5AQTmfJwAAjBDvQxWpheJNqC4V4FXi7UDbSh8I/JpL/i3xvyT+QEE/3yYAAIwQr0R1qYXiTaguFeBV4tVA4UqfCfyCG/518b8h/kDBCD5MAAAYIV6JKlI7xctQdSrAe8R7gc6VPhb4mev9RfG/Hv5AwRS+SgAA6BevRHWpteJNqC4V4D3ipUDtSp8M/A93+yvifzf8gYJBfJIAANAvXokqUpvFy1BdKsBLxBuB5pU+HPgvF/uP4n8x/IGCWXyPAADQL96K6lKbxctQXSrAS8TrgPKVPh/4f27178X/VvgDBeP4GAEAoFy8ElWklouXoepUgJeIdwH9K31E8G+u9G/E/0r46wQT+RgBAKBcvBXVpfaLl6G6VIA3iHcB/St9RPBvrvRvxP9K+AMFE/kSAQCgXLwV1aX2i5ehulSAN4gXASNW+pTAm/8/iv99iK/0CcBUPkMAAGgWr0QVqVPE+1B1KsD14i3AlJU+KN7OZf6l+F+GhpU+BJjKZwgAAM3iragudYp4GapLBbhevAWYstIHxdu5zL8U/8tQstLnACP5BgEAoFm8FVWkDhLvQ3WpAHeLVwCDVvqseDU3+e8K/wL46wSD+AYBAKBWvBXVpc4S70PVqQB3S738T1zps+LV3OS/6//q/YGCZj5AAACoFW9FFanjxPtQXSrAxU4+9U9f6bPi1dzkv5vyvfsDBQAAAN8SL0Z1qePE+1BdKsDFRj/pn2kotBU0cI1/Mu5L99cJAAAAviLeiipSh4pXoupUgFvd8aS/u6TQVhDnGv9k4jfuDxQAAAD8UbwY1aUOFe9DdakAt7rpPX93T6GqIMg1/sncD9wfKAAAAPiNeDGqSB0q3ofqUgFudd97/r6eomF3vJY7/KPpX/f0+QEAAGCfeDeqS50rXonqUgGudOV7/qaeomR3vJM7/KPpn7Y/UAAAAPBL8WJUlzpavBJVpwJc6dbHfFUFl3GHf3TBd+0PFAAAAPxdvBhVpE4Xr0R1qQD3ufUxf1NPUbI7Xsgd/tEd37U/UAAAAPCTeDeqS50uXonqUgHuc/Fj/o6t9eyOt3GHf3THd+0PFAAAAPwoXowqUu8Qb0XVqQCXufgxf8fWenbH27jDP7rjo/YHCgAAAH4U70Z1qXeIV6K6VIDL3P2Yf/fu/jJ38mOmH/G/dKk/uOmjvmkvf3TBFuLkxgd8en8kn5/c8Z8OADBUvBtVpN4hXonqUgEus/wlv+pd5dbd3bSX5XYcekNc12zkuZtO9qa9/OS+HaWIi2+58u/JWvL50fL/hq5JBgCIiHejutSbxFtRXSrATe5+Qrlpdzv2Et/UKlvDKQlt7uTLTT/KrXuJn+9NH12WiPi6rd/dHVdLOD86cGHmhgMAZMW7UV3qTeKtqDoV4CZ3P5tcsLuT711VZ/dHh5OJhzZu4H3mHuLFe7nvi1u+tTO/uGPySPJnxh4azqYtlO/0Y8L5y/nbMigcAKBEvBtVpF4m3orqUgGucf1rydzdee/6J8FkgqENGnW3icd3cjvT52/b5smBl//K0MzXTh7/lR3Wnmz/fj8gnL/Eb0t5PgBAlXg9qku9TLwV1aUCXOP6R5KJu4s/c7Ud4l/isQRzGzHkGbMO7vx25k7eudljo+74lYmBLx/7zA+dSWZ5OFN2/V3xZErCiYdQng8A0CbejSpSrxQvRtWpAHe4/nlk3O7ir1udRxmPIp5b+XgnDTq1W8U/sZNnd2DIfVHMivpAIKkfKkxm3N6/KJ5GTzLx7ZfnAwAUitejutQrxVtRXSrAHa5/Gxm0u/ijVueBxrdfElrzbOeNOLIrxb+s88e3e8LdOUzJedPMJT9UlcmmtTuBuRGJoi0fAKBWvB5VpF4p3orqUgHucP2ryIjdxR+yas80vvGe0GoHixhxZPeJf1ORE9w624EERoS8b+BjvzUok31rawijIxJFTz4AQK14PapLvVi8GNWlAlzg+ieR/t3Fn7BqjzW+5arQOqdKmXJqN4l/Tanj2zfYme33J7xv4KrfiqdxZm3K4YKIpNGQDwDQLF6P6lIvFi9G1akAF7j7PaR/d/HHq9qTjW+2LbTCkYIGHdwF4h9R9uw2TXVy783xbp226reyURxeO9K4IyJpNFwbAKBTvB5VpN4tXozqUgGmu/sxpHx38Wer2sONb7MwtLZ5smad3Wjxzyd+cDtGOrzx2mzjozbHsu+SnFnLA7kmImlkrw0AUCvekOpS7xYvRnWpANPd/RLSvLv4g1U8gfuS2Rpa1TBxE09woviH03Bky+c5v+vabLeOWvhzkRyCa20mN0UkjZPhAAAjxOtRRer14sWoLhVgurufQWq3Fn+qKsnhvmT2JVY1TIO5RzlF/KspOay1w6S2XBjs7jkLf+58CPG1MJbLIpLGmXAAgCniDaku9Q3i3ag6FWC0u99AOrcWf6TqieLKZDYl1jNJifiBXpPkL8Wz7TmjtZOk9tuW6oE5C3/u8EgNa1Us90UkkDPhAABTxBtSXeobxItRXSrAaBe/gXRuLf5CVZXGxeEsT6xkjB7x07wv0r/E86w6nYVjBDfbluruIWt/8dg8PWtJMldGJJDd4QAAU8TrUUXqe8S7UV0qwFwXP4AU7iv+NlWYycXhrI2rZIwq8QO9Nd54hlUnsnCM7GarUt09Ye0vHpunai0J58p8ZLIvGQBgkHhDqkt9j3g3qksFmOvWB5DCfcUfpgoziYTT89OpiJ6MUeXk2b0n6nhobQcRH37VTnsiPTBh7S+eGaZwPc/n1oj6A0mdwpNkAIBZ4g2pIvU94t2oOhVgritfPzpfdY69Ph1ezUf2wYS1cTXMUCh17W+NPZ5SYf7xyVdtsyfS3eOV/+juSTrXw3wujqgwk4YZHiYDAMwSL0l1qa8S70Z1qQBDXfn6UbipfW9N/zTnsV9sDsdIO86rysl7fv0RRBLozzx+WxZusyTS3bOV/+juSb4+6skffRjR3fn0xNJ2Rk/mAQCmiDekutS3iXejulSAoS57+ih86do61bcGa5jh2GAPRyocrGGGTvsu9pmVzu+/GrbZMMPJkQ7vsSHPA7OV/+jWMZ7MVjLG4cEaxiiJ5bMxykcCAPrFG1JF6gvF61FdKsBEPY9CnXtZsqOqqaqG2TTSk2FqZ2uYodamW31+3Zdh1Tw9k6SuUEmkWwcb8bubZlg11UvmmT5MfIADgy2cCgCoFS9JdakvFK9H1akAE5W8CBXuYtWO2ubZNNUFk5SP1zBDreXHFF93ZHjHSPHLsHaD8Tx3TzXidzfNsPB0ekYqGaNwqqpA9oWzdjYAoE28IVWkvlO8G9WlAkzU8BzUM/mO7bTN0zZYyRjHJmwYY2E4PZZfpIY1N73a2eIDxO9MPM/dU4343R0DLD+XktniA9QOVpjJiNkAgCrxklSX+lrxelSXCjDO8regy1ZVvEtOvG28hhlGTNgwQ7m1J9WzxkV32XiDTv8r/77wrO843Pje1x5KyXjN4cTHq41l7Xg7ZgMAesRLUl3qa8XrUV0qwDjLH4IuWz3xLjnurRN+NmR8gMNDjp6h39rrVLWmhHbfhJcd9/IdVc0z6KfX/vq+m5OdsDyc7IQvSWbHbABAj3hJqkh9s3hDqk4FmGX5K9lNqyrbJcddOGR/RCVDNswwwtor3bbKE9sx3vIhvzvnBUe8dUc982SjyP761suTGnJEOGvnvCmc5tkAgBLxklSX+nLxelSXCjDL2teYm1ZVts+HOTPnd0dtO7IDc46eYYq196pt1Wa1drCeUYee7LFN9QwzLodBVygy54hkLghnUz7l4wEADeIlqSL15eL1qC4VYJa1rzHXrKpgnw9TO23bqR2Yc/QMs6y9XW2rMKVVI7WNOutAI5sqmWTWr8+6QpFRRySzdtTz4WxNqXk2AKBBvCfVpRJvSHWpAIMsf42ZvgqDXTVS4bSdZ7d1ztEzjLP2grWtqoiWDHNs2m8NPOUov6Vn/uwMwRB6jqBz2kHhRKZdeyLHggIA+FG8J9WlEm9I1akAg+x4jZm7CoNdONKZgb81c+fZdc7ZMMNQC6NrWz3JLDmpzoHLD/FjJVvIzhAMYdwtOjztoGTWDnw4n1RcAADxklSRyr90qQB8x6bXmHGrNtW1g1028zEN4TTMMNeOPxolqyGWVcfUOXPt8T3UsJHXDtAQ/ncdHnhWOAsHPpxPMDEA4OXiPakulf+IN6S6VIAp9r3GDFq1qS4f7MDMh8c+oOSyNcww3Y6/Hg0rHsjCMzo289fHLjy4JRr2Ek8ylUBD+N91cuBx4awd+/DPxXMDAN4p3pMqUvmPeEOqSwWYYutTTP8qT3XTeJeNvVXPlWuY4Q47/pLEVzaH5WdUNXbPkS0X3048zFQCQ+/SsZnHJbN27C9OvvYWlWQIALxEvCfVpfKjeEmqTgUY4cxTTPNqTnXHbAfGPj/5JlX3rWGGy+w43+AKbn/H6fSMXXJeO7iBqRka9v6BY2NPDGfh2F+cfOHPdeYJAFws3pPqUvlRvCHVpQKMcP4ppnN1Rrpwqrsn36HtpjXMcKtNZ31+RXa96VB6Jo+f1D7ZTTWEGdn+lXdpraHhHD7WtRepPFsA4DLxnlSRyo/iDakuFWCE7FNM22qLdMk8b5h8odo71jDD9XafftXtmnudDicWP6mtgptqCDOy/Vvv0iqjwzk5+dqLNC5qAGC0eFWqS+Un8ZJUlwrQL/780rZEWhLjSSOSaZjhPeJf0IHDjY/asFJBfXox10ttqiTMyBgle6+144sbt0ZntfV6AAAXiPekulT+Ll6S6lIB+sWfXAqXSOMZbjU0mYYZ3in+Ne043/iQJSuS1bP7uFhqayVhjt57211aZfkXN3TdkdXu2wIATBTvSRWp/F28JFWnAvSLP7N0LpFmM3wuvv3lsTTM8HLxy7PwfONDlqxIVs+u4XqRrZWEOXrvhXdpieVf3NB1X1xbrw0AMEi8KtWl8kvxklSXClAu/rRSu0SaCvDuzBv2uDD514pfpIdHHJ+wZEXO+vHtWyyytZIwR++98C4tsfyLG7ouTmzf5QEARohXpbpUfilekupSAcrFX1SalzwPp/eGnBu2vPAg+FflbZw4c2dQy7N6fN3Wmxtp1d7P/2LndXpubURz1xsS23eLAIBa8Z5Ukco/iZekulSAcvGHlPIlz2PRvSTehr0vPBF+Er9gXzzl+Hgl6/yZrrhl6w2NdNzG1/5i7XV6aG1Ec9d7Qtt0kQCATvGqVJfKb8R7Ul0qQLP4E0r5kuex6F6SakMIC4+G32i+afEPoWcdPsdFl2uxwxvsCfP8yb7hOj2xNp/R623R7bhOAECheFWqSOU34j2pOhWg2bj3kPLnnfhjVM+aeNbNsTTMwGcKb1r8Q+hZh49v0Z1a7OQeq5I8f7LX36WH1l7F0euF6S2/TgBAoXhbqkvl9+I9qS4VoNbox5DCt534S1TPGnG4g2JpmIEnqi5b/EPoWYcPbt2FWuzYHquSPH+yb7hLT6z93Eav1wa49kYBAFXiVakulT+K96S6VIBaFzyDVD3sxN+gelbzgb48lo9nYImGyxb/EHrW4fNad48WO7bHqiTPn+wb7tITaz+30evNMa66TgBAm3hVqkjlj+I9qS4VoNY1byAlrzrxB6ieVXiODeuzWNYm8/EMrBK/bPEPoWedPKx1N2i9M6m2JXn+cF9ynT629h6OXi8P8/n2AYBC8bZUl8pXxKtSdSpAp5seQBqedOKvTz2r6gR71gexLA/n4xlYK3jZ4h9Czzp5TOvuzhYHdtqW5PnDfc91+szCfKYvka5KAADoEW9Ldal8Rbwn1aUCdLrs9SP+pBN/eupZPWdXtb4by458Pp6B5VKXLf4h9KyTZ7Tu4mxxYKdtSZ4/3Pdcp88szGf6EuzyEACArHhVqkjli+I9qS4VoNN9Tx/Z95z4u1PPaji1VbtIxbIpoo9nCMrez912X+CTvzhunTydpbdmvd3BFsZ4/nDfc50+s/YSjl4S3poDAHBevC3VpfJ18apUlwpQ6L53j+xjTvzRqWfFj2zh8JFYCmcICt7PA47d5AO/OG6dPJ2lt2aLrZstjPH84R6+vROtjWjukvOZHACAY+JtqS6Vr4tXpbpUgEJXvnsE33Pij049K3tYa0c9H0vnDEGp+3nM4bu96ecmrpNHs/TKbLF1s4Uxnj/cw7d3orURzV0yj0QBAOwTb0sVqXxdvCpVpwIUuvXRI7Wv+ItTzwqe1POp9g352QAlMwSV3IStTl74Hb81dJ08l6X3ZYt9m+3M8PzhHr69E62NaO5yBA1RAACrxNtSXSrfFa9KdakAbW599Aju66YYd5vyCtcwTMMMQYW3YrmTl//uJNd6W1ab9tuZ4fnDXfiLU27Ud8mnytob6ygB4LXibakule+KV6W6VIA2t754BPd1WZJbTXl2axisYYag/kvy3Mk9Xhzjcm/LatN+OzM8f7gLf3HKjfou+dRae3sdJQC8SrwtVaTyXfGqVJcK0ObiF4/Uvu5LcpNBD24N4zXMEDTlqjx0bI93x7jW27LatN/OACOH+7Yb9V3yGWHhMTlKAHiDeGGqS+UD8bZUlwpQ5eIXj9S+7ktyk0F3r2HChhmyptyWJ07u8eIY17r7yv3S8i3XBhg53IU/ev5SHRh7bjjvtPY+O00AuFK8LdWl8pl4W6pLBahy8XNHamv3JbnDrIvXMGTDDFmDLszHTu7x7iQXemFQy7dcG2DkcBf+6OFLdWbsoeGw9mI7TQC4SbwtVaTymXhbqk4FqHLxc0dqa/clucOsW9cwZ8MMWcvvTGEUJzd4cYxrvTCo5VuuTS9yuAt/9PClOjb2xHD4j7XX22kCwB3ihakulY/F21JdKkCPu587Ulu7L8nlZl25hlEbZsha/jkXRnFydxfHuNY7g9rxuRWmFxmvP5YDk5f8EDss//YdJQBMFy9Mdal8LN6W6lIBetz93JHa2pVhrjXryjWM2jBD1vLPuS2Nw1u7MsMd3hnUps+tLb3UeP3JbB372A+dDIefjPgLAAAcEG9LFak8EW9LdakAPZa/dVQ9d6S2dmWYa82KqGHahhmyln/ObWmc39qVMS73zpQ2fW5t0aUmHBHOvpmrfmucKcmsveRXHiUAvES8MNWl8lC8MNWlApRY/tZR9dyR2troMM/MPCiikq+jYYa4tWfRFsj5fY3O8NjMo1N6YtPnVhVdasIp+WyaufDnFto986BYxl1yAGCHeGGqS+WheGGqTgUosfaho+25I7i1uXmeGXhQPiVfR8MMcWvPoiqTyKbmBnhy5rkpPbTjTrZFl5pwSj6bZi78uYV2zzwomXGXHADYIV6YKlJ5KN6W6lIBSqx96Gh77ghubWiexwYelE/J19EwQ9zas+iJJbidoQGK6IwdN7Mqt+CQg1JaO20kn63hLB/7zK+ciWXiIQIAC8ULU10qz8XbUl0qQIm1r1WFzx2prQ2N9My0s8IpmbZhhgZrj6MhmexeJqZ3eNqJEa2y6XL25BYc8p0pfWvOEeHsmPnMr5yJZeIhAgALxQtTXSpLxAtTXSpAg7VPZIXPHcGtjUv12JyDkun5OhpmaLD8RLLhxDcyLr3zo87KZ61997Mkt+yQU4JKDTkinB0D9/xQTyZnpgUAlosXpopUlogXprpUgAZrn6oKnzuCW5uV6uE5pyTT83U0zNBg+YkEIyrZwqDopuezL5l9tt7SeGjZOUfEFZywP5wd0x5OZkQmB0YFADaJd6a6VJaIF6a6VIAGy5+q2p47slubEuz5Id8Wy/NpG2YoseNcDqdUNfyU6C7IZ1MyW+2+q9nQsnP2xxUfrzmcTXMW/lxDLLtHBQB2iBemulQWinem6lSAuLUPHYXPHdmtjcg2Mt6rYlkyasMMJTYdzZm4OmeOD3B4wtRPL4/lgDM3NhVafM7m0BoGa5jh5JCRWJYHEkwGAKgSL0wVqSwUL0x1qQBxI96pnohvrTnh4GCdgexL5vmoDTP02HdAm3Irn7NkjDPjBX99YSYnnby9hxOLj1obXc9IPZMcmC3106sCmTUhALBbvDPVpbJQvDDVpQLENT9SLRHf2o6En4ccH6ktkN3hPJ+zYYYeW89oSYy1gx0e+LNhtk4VnOFhGinjLnNkaw0zlI9UNczz25Wdpy2NWeMBAGfEO1NdKmvFO1NdKkBW4fPUWg272xHyx/OUTBIf4Hw+D4dsmKHK7pMaujrz7JknO8kHv95g4n0+v7WGGZ4PVjLGyYh6homP8d0oJs4GAJwU70wVqawV70x1qQBZ1794NOxuR8jfmi3404dH+uB0yoPaMdvDlHocOK9xa0SewQGysTw4nLBjd+NwXCXTZvPsP82GK1eYT88kzSMBACnxzlSXynLxzlSXCpB1/aNHye42vS/1rKpAmg/og9mWT/jxDG0OX/L+Jc8d+cQHaDDovFL76pmkcFWdVOdqy2T0MABAg3hnqktlh3htqk4FCLr+0aNkd1tfmeKrNpP4AKuyWjvtxzMUihxi55LnpojiAzQYdF6pffVMUrjaDqttlWfS+esAQLl4Z6pIZYd4Z6pLBQh6w7tHye7OPDqdXwI5k1h8gFrxAy1Z8tyUT8MMDaacV2pTVcNUrefJ3J3Pk4jikzeHAwBkxWtTXSo7xDtTXSpA0BvePXp2F3+Sqjru+OSzEosP0Cx+pvElz335lIwRN+jIIptqm6dkLYnl4nyeRxSfvzkcACAl3pnqUtkk3pnqUgGC3vD0UbW7+MOUNOIrntXDU+sUP9ZxN+o9YfakseR0Umad2vlNFY7UsFbFIp+XBLI8HwAgIt6Z6lLZJ16b6lIBUt7w9NG2u/jblCgm5hYfoF/8ZAddp1eF2RPFkqMJmnJkkR11TpVdCzORzxsC2ZQPAHBevDNVpLJPvDbVpQKkvOH1o3CD8ReqhhCuieJMdPEBRogf7oi79Kowq3J4PkzWoFM7v6PawVJrbSDyuT6QrfkAAIfFa1NdKvvEa1N1KkDKGx5AOjcYf6eKJ3BBDifTiw8wRfx8yy/Sq8JsC2HJPEGzDu7wjppnO7+Wp3FZPi7M4XAAgMPitakula3itakuFSDiDW8gtRuMv1aVnG98RyMCjA8wSPyIa2/Rq8IsTGDVSEGDDu7wdsrHO7l2RHFTPvsiiu+rORwA4Jh4Z6pIZbd4bapLBYh4wzNI8wbjb1YlhxvfV3+G8QFmiZ9y2/15W5id2184Vcqsszu5nf4Jz6xNOcjn1kCy9wcA2CFem+pS2S1em+pSASLe8BJSvsH4y1XJycZ39/uNx2OMDzBR/ObsuIrCPJxS7WAR447v2HZGDHnNwU3M51hE8W2W5wMA7BavTXWpHBBvTnWpAOe95DGkf4/xJ6yGY43v8fe7zoY56yh7xK/QTQcXTyASUfl45407wTN7GTTqBQc3Lp/zEcX3W54PALBPvDZVpHJAvDnVpQKc95L3kBF7jD9kNRxofLO/2Xg20qEHWiJ+l246sngah1Pqn/CwiYd4YC+zph19av8knkNbPvGNl+cDAOwQr011qZwRb051qQDnveRVZNA2449a8aOM7/qfNp4NdvqxNojfq2sOKx7LyZSmzHnM3KPcupeJMw/a9dfFM2mLKJ5AeT4AwFrx2lSXyhnx5lSdCnDeSx5Gxm3T61bh3rMJ33S4WcGrddkxxSM6k9Ksac+Ye5r7NjJ38hH7/a54Pm0RxdMozwcAWCVem+pSOSbenOpSAQ57z/PIxJ163araeDbnW484KPJ9XXk6dwc1cebdpp/pjo2cH37t/OU7/Yx8fhIJZFA+AMBz8dpUkcox8eZUlwpw2HveSUbv9OUPXD0bD6b9hoNOOfN9XX8otwY1evhN7jjZtRuJzL9jI50bfOhAPrMiOhPI0HAAgOfi/akulQPizakWFQB+4+WvW6/dOMd4W15CVhDhu/sjEf3E/3EAwD7xIlWXyj7x/lSFCgDf8uZ3rddunGM8LC8hKEjx6f2ev06/5D84AGAtRSpXUqECAAAAAACwii6Vm6hQAQAAAAAAWE6XygVUqAAAAAAAAOyjSGU0FSoAAAAAAAC76VKZSIUKAAAAAADAMbpUBlGhAgAAAAAAcJ4ulX76UwAAAAAAALIUqdRSoQIAAAAAANBAl0ob/SkAAAAAAABtdKk0UKECAAAAAABQS5dKkP4UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIOX/AI2jFTUKZW5kc3RyZWFtCmVuZG9iagoxMiAwIG9iagoyNTkyCmVuZG9iagoxMyAwIG9iago4NTgKZW5kb2JqCjE0IDAgb2JqCjQ4MzIzCmVuZG9iagoxNSAwIG9iago1MzAzNgplbmRvYmoKMTYgMCBvYmoKPDwgL0xlbmd0aCAxNyAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCniczVNNb9swDL37V/APTCWpD0tAUWBxkmK7FTWwQ9HThm2HZUNP+/t9kpg4ToAOvc0GI/mRenykmJdBiPF+qMtYlL4ehhfDhEYlnyr0sAZTUJckroOZSnY5GwrMaaRDc/4i1eRCYGa9+qxhF0gF2Naf9GX4Dbr74ekZ4LcG/134r6keIfdccI94S51ExyWttp3q9PUeRWuKKzVBXERX/6tmXdzvaHPgmW06ODkpeEbKAQWOTjlWFoTdfDoobf+Ag+nHsJmHm70klInyFCdo/r7MmCD/GDOzV0+axYGRuWim+UBPtxCGlFwFgp0TDG5GPBfYR9jG1sniyt0zzZ+XDJjMMaVSkJt8FJdjLHmM8ZRgC9vB9syCRfAj2q0RTmfJLpKL7wIkLLhEw1IX0ooXXVXts9Pg0YuQsa+dbFcQTpqgR4655H2aWvybuixGrXnAJZuv9Hg58mzuKAa6NRQnZTpvtUVt+wnZ2brveE3Qsk7/uCIpyXlN1ekJ0+hiQXOCnPqhYpc/9Zoaq9hwHAcAClWvmKNL9aBPiUIKGC9fcuaF2Zvufe0/N9F1X7G6r36NnXU3tz/GK9VWBYYKZW5kc3RyZWFtCmVuZG9iago4IDAgb2JqCjw8CiAgL1Jlc291cmNlcyAzIDAgUgogIC9UeXBlIC9QYWdlCiAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAvQ3JvcEJveCBbMCAwIDYxMiA3OTJdCiAgL0JsZWVkQm94IFswIDAgNjEyIDc5Ml0KICAvVHJpbUJveCBbMCAwIDYxMiA3OTJdCiAgL1BhcmVudCAxIDAgUgogIC9Db250ZW50cyAxNiAwIFIKPj4KCmVuZG9iagoxNyAwIG9iago0NDIKZW5kb2JqCjE5IDAgb2JqCjw8CiAgL05hbWUgL0ltMwogIC9UeXBlIC9YT2JqZWN0CiAgL0xlbmd0aCAyMSAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCA0NTAKICAvSGVpZ2h0IDQ1MAogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSAvRGV2aWNlR3JheQo+PgpzdHJlYW0KeJztnemq4zAMhYdCKJRSKKVQSqEUQt7/EafLXbrEkiwfOcs93/+56ViRLB3Jzr9/hBBCCCGEEEIIIYR80myO7bbe487tcdvUe9zsWR8u3ZVjtQcubo/rLof1otoj50uzPXZftNUeuvl+ZEdXLGO5PXdPLGs99/D81DON6GS5v3SvVNsI3x982Vd7eWbDp/munGo9/PPR3YWemEGz7THfjUrP3/Y/neHUTP8CXlnXef4p9fx62fDEOadWcF/l8YvkG7Sr8vwZkPSBS5XHr5MWXFV5/gzYJZewykZ0SD6+xtNnwSa5hFXqiTb19HONp8+CVdKCNVKJvlriQZ1teA6kU4kacWyffPimwtNnQjKO1agnkplwnV14HiST0e4Q/uwm+ex6yvr0SQey+HoiIch0rOdzSK9ifH/imHx0xQ7z5Ekno+GyiJBFsT9hR1jG6JosXYuyns8hnYxGJ4TpIFqrtzUP0slo8G4keD9l7RzSymhwGBWCKGXtHISF7ELnx9JBlNtgFmltMlbbEoIot8E8BAtGFtaC73MbzENIZSLDqBBEuQ3mke6yRoZRIYhyG8xE0NUCw6gQRLkNZiKlMnFhVAii3AZzkSwYFUalIMptMBcplYkq6qUqNOiRMybdIuzCtNF0d57bYD6SPwRpo+nuPLdBB9JyBoVRKf/lNpiP0GAKarYmjtvc4IiMAyGzj5nclAoYjsg4kGJayMCTJANxRMaBMCvThcyNSmGbIzIeRAvi50al5LfOmanZIdX0AcqatO/GzxnPEmHSosMra2L1wgMTLuSNEF0Siu8LLwbyIVoQrawJxSDPDXqRN0JsSZg+ed1RUnMjb4RYmUTUD1hLOJE3Qmh6IeYxlNTcyBZENnxEd2ct4UYMbdBcRspjWEv4EaVRZC4j5jGsJfyI407I/UnMellLFCAGN1x4E/MY1hIlSA0foHeIMzmsJUoQh2U61OzDQhwHYF+iBGmA8wYmz5ffE9YSRQjzf3cgBYW821a603SuKPUEJMuQSwmO+pah1BOQgkIW0DnjVIhSTwAKCrmUoCBTipzoIzJFpWKhIFOIskmVFxSKC1KQKUas1bryDoXchOSgaDlKkCuVTORqnleKAtBkmcKKW3FBBtFyNFmm0E2UXJeqNgClzVvmhJqHU9UGoIbREidUXJCqNgI9jPpDnfZ28PMEENQw2rqrbk3xYRCFoIdRrxNqf5lBFIMeRr1OqLkggygINYw6nVCZKGYQhaGHUZ8Tym0lBlEgmjbqc0L1xaAmCkPVRl1OqO2C1ERxqC0mjxOqLkhNFIjqLg4nVP8mgygQrVPf5aujenrE7jwQpZF+J3PXUl2QI05QtLnRbCfUxhg54gRGj3l59bfWmufBXTS6spY3MaO05jsO28PRS8KcsbVG1wioqIFRNcwup4DT3wcqanD0ktCefBhSWxaDcPTk8eo4xhJOk7Q7KmoBWHIZo7ZmiMgsBgOw5DKtyXUMAZmHBgOw5DIm3zHEY+YxIVhyGUNFoRfzHK8IwqLLGCoKSzRmHhOCxXn0MkA7FXyDn+gJwuI9aqPQUEkwj4nC0mPSBE1LKGYeE4bFf+RkxhSJeWApDFNBISYzhmY/85hITAWF4EOWNIZ9pUhMBYWgzBha/fxQXSymgiKpzFjUcQ4ZxqL31u/0lwOGvm7H+ZhgbFV9oijUT9B0nI8Jx1TV9wubhsnvjqVEOLaqvi8dMbovS4lojE742a43lYIsJeKxOuF7NLSpARxRq4BNWnu3xcImBrArUQGjM73VdbYYymq+ClYnfI6jRrOzK1EFqxM+xVFjDGU1XwmrE/7GUWMMpQtWwuyE+8x/wEHtWlid8CsxscZQ/+1eJBOzEz7qemMMpaBWEbMT3uKo1d50wYqYnbBbW/VQumBdzE7YLkw9pY4uWBnTwMsd02DFDbpgXYwtCjt0wcpYWxRm6IK1ATshXbA6trElM3TB+hjH1mzQBQfAXOdZoAsOgWl+1wZdcBiMgrUBuuAw2AZADbAvOBRmbU2BrfmhsGtrIjzrMhyYsp4DasMBqSg4IzokiLKeY9qDUl5R8KTEsNi79QlYzA+NtQWfgsX80BT2KFjMD09ZMsMLuEZASTLDSmIMlCQzczxzvThup6ZR+JOZiaUxi9V2p0eN+7VJp/16Qkm2W5mx3o0/PMv17vCl46sy/M985eWwmYpa4e31TiGNWax+bPdAc8LXKb72uJ2EFX1tprGnMc16d+oJL8re/XnOpz3tRr8x+tpMI05jrp7XZ7w7yuadSM1Pu3H7oqcoHGsas9wexAJJFiGEl3ncETW/KBylGiO43i+iGZTDku1hM9LQk18Ujm5ruFrP9svFr2EYXuXLOCsN60Hdb8bVVFpuM5IxKXpYM4LT+AJq7sBFO5r/QbM5ZBa0wk/PeJEvh1G5Yn5JOI5yfrk3H3D8RcjBMvOB03Ysu6LtAu5XzkObcLHOdb7vX578k45DeZf9GDKCpWslBv3IYLMp6E0nHcenTl0T1IHfZp8BB8xmmq0jdj6R1Eb9M9DHIeOp9cafTwYp6kvN16Wjh+lDqUnOQxlxUbAg1eftAebr0te5e9KBF4YxYtHpiaomXGxQJz0SyQdihr2+Ect+dcWycF06VvdEQpYBncera8TS166SCZd76Ln//noCdBLoxrFadlp+kLeCCReQze+F3vUFnmq+cqjSAC/eurt4cWYFv72oS4wXAMP0ncs+PJoiDBgrziy2uLPiz/RuhNgLWu6cY6Np8aGJ758Z9SuXEe73+Ml9j/NorDqHONXNK8V8EmPCTciC3rgcElVQszkGOOJlG/OK4wwYMfTU7AKW8kar6V+rCFeMcESkAeESaVT4PNumzpotOqm5OiJ6R8QaEGvCNUp6eaHNqtHcrSvhBxyQqalfzU4BM+EmIvt0dfHW8tCbgxOsRixRs1NATLjYBdjv7B9qWe7BvwcUTCMMiDDhIiB9KW7coY3Y7sqDaYwBi00YYD+QPIk2YumGGGXAMhM28MwBqi6DE5tTSXURZ8ACEzbo8uGMr6JLJnM+Oblbq5EG9JoQHT8vQQ06bJPk4rNhrAFdJgTbr91H9rsa5JbosWG0AfNNCLbfMb4rhxwWyLZhvAFzTbhB2i9KQn6nAfa88mxYw4DXPdq+jEj9pT3UPMoB7Dtn2BCthaawNptWQP0zuJXaQ4OTj6w2rGVAowkboP2qut8vOAn+YqkP6xnQYsJF7oHFNLV2vz5wOoRe4zsN6GyUnxWn2MJeJ5zc7wM3yXOUi9i1b8m23uxHHEJcwXYQaMvNC2yUfC8EE+dU2q0ycN5fmTYhbANsd0MfYfwGlZm2ybNETgM+zvg442/bn2AtUJ/scopSQaA2xEv/puBctO98xPtxmL4lXoMC6NDb3ycocenUE7ycLv47jO2dDN6+/xJUAC1qzoSBGjD42A6dBnzeyLyR701hAwXQwBnaUjAi0+sG5FXSXjMR7059eHqdQBnoKNLPNBgbPlVjbin0bZ/xmvCntl9g0rWR2+8GxobfodQtxHxkId4d7Ottctajb0zAfjcgNnyE0hXMgH5nvoXjBtJSO03DfjcgTbPr/9d9uqzvcJbfhBuIhjbO/DMFpLZo3TtPf5O2TncxwXlS9rsRMfxqJdVlx4/qWxmX/mIFPoBnJT0mUbNB9URaLRw7yB6oHWnOZRATSor96FnV33rk++7qm3BCCWg/0FkuA1p3vbIJTdMHIwfWjTGhj0fUNGH7IY1PE0w5bMIyolTPhIcpb4Cv4KYSZGxjgpVMOL0KUKRKdWid81xWeKHmEkB/qRBK7UErXp05zieA/oKaT0iRc94h2IRzyED7iM1K8w6shJpwNCNoeJZx65Z9aCzsp2jDwhMHN+v8Sv7BTVDP/Z35ZTDvxGilLuk/woST19AsYOYVXnD2buAmnL8DPliAC4vEcLUBzA2zP/wJB3wAdcOSi7KRJvwrDvgA6IZlN53jFLY/5IAPUG5Yej0vyIR/ywEfYNww49aC1O9AFIYzrwFTAGpDxI2SgFdpsnMwpRTXhqCVK6wq5qqCWij83EALWrrSuvAP7oEPANdBIMYwAVH0z+WhDyAyt/htdhOQTMYvKkwY1GnKwp+B6tfPsqUrgeszlRWEuIq+Hd3B+FCQvd5zwSYElff+kBuCG71+XQ2sbP8ZN4QPW3hNCDZg90fcMGTSYjQd3j+gjwZNOzlMGHQ4bua1YdzwdrYJw043Tve0oA7wTs5PMgvDyOOpM5u3/yVgQOaZEU38TvvQZ4r4A712E8ZP3c9QZqtxitBqwiqXWvRd8TdhKh0/s5mw1q0kMwql9Y6AWkxY71qZuYTSqsewdRNWvRdoFllpyGdp02iHCGtf7KRcAD9+kJ9FsSF74QA3c036LNog1zqJJhziarXpbodDXa0mmHCgi8ISF8CPnaijgjpJEw5109vUrqa8UzmBeSVhQrcBEf+XidkQcutBu8FeMOr9a9d9DLIfTOSK5huYBPQmabibGT1TiFvnn7pPAGBU3YnYEGO/r1F29yDER/7n/Uvfh1owl6lMwIagAvCniHK3pN5M6DbgTzUH0pZGbkOQ/Z51fcz3CpbOP/IyurTE/O9GbEPQd+zepoUawEdfvK/Be0YEupfqOM68FFU/fCib5d/tWTgN+JkPoWT68dUWsG+B9qn53tNF7de74H0FetUwVKtsXNffNyj9LDVu6SzlvtIQZ3BPLTFKrR/yC8qvLGFiVbo15HzEyf9vpRF61IbR7seQ1MA+wyvvDf4P8fp2LnmSHyfaD53UoL4a2en7gtOEO9+/U49i4GZfL5vhgikufFo+C+00octZLGdpcM3PgYLpYgPslpouWK53Sb3xehhgA/tUPTNdgj5+/fj5xlewlgntx4KBQyRVHRHqfjnFbR0TZp3rRg4C1XLEFbTTnVfY1jBh7sF8pA3bffikd7OH9t6zhYl4EzpuVoAO5J0j6/zFFnwA3nHSLnpc0Hc1BjArv3KMiaaLDfpqXt8gZawJ3XebYAcr2wN8um2NHvNy2u9frAlLLqeBicMPLsgtcY0sHe747fcv9FMRZVsQrEHzBcaIC7z5yuz3L86EpfcFX4HWWV25EeF73/1HlSdbMSYEGPDKCr1kfiM224hTK5jGZoQJMQb8d6u44JuOI7FZYeu+b2CqA96EMAP+Q4tWD44ZLYxmc4ypm5G9MLQJL+A6GqtcPTjvLPF0tQ9KE1rwkB1WnSn7akUvwN7pL5fDWnrVltuwA+8X/DlIpAkDDHhjHbKe510ilgWFzhsxojvwdtcwPRldIn7/4GPfw6IMiA6fv6BMGGfAGyt8QX31w74nxUTQc+QUCMiE0W25BW4a7JveG+K9p7ME2kNwuwtyx2uNvmoDTmt660Pv4ZAkoe73BcCEtSZUlshCv39lwdJ6nbGPYhOWf7HCDkxjPvX/fWANim9vJSk8ioL49lYOGCMmWuOoi8Nz9B8ARS9eb1YeDMCIifRiUfp3b5y31adXC0yIFENzKDRim/q7xXraAOb7VyKRDmXAG+uDPztNhv6yemIY890oPyI6DEuvBp1MnwvqieNmyHNUvjO6QxvwRuOSotOhw+fX7WHA0zcPXOLMSC47y59jSdQSNxwnqs7xU8YWHF8THdMp6OUuJ54K35XJDKPtsLHzhexSqHYhqLHYmF1RWvSMMHoyNYzrkbufjCSGvrA0jSb19iW+MYbRU6rHOBzZYbQdeu9OsFYTVPHjXIYwOkLr3cjPy4eQY2xcA6oUDOWdSwyjl+N2XJHzF486OsY4+kOTtKIYRIUwetqtR5O1fNJ4qgn0eBqcfisqXzjsCaPtab8Zq+t94+uB12wsefm0ovbevewn5+OoPe+HtcuAXTfKHf2TxXN2o27f2x/bbSby/7v+D70asbKljIrV7jFMqO7ezWm/W409aL7hb/JO7HOdy81+vBl0AY3bgF07hT1i/pSM8s3ylZ4aDlH7icls9jOmbBBz9EXh/CkdVJ5YMjM/vFdo/8BkZmDKr/lkMjMoBZXED0xmhgRxKOgy9H/iL1NWSXyjqP0kENBHZlhRDAXqpMcU2kzzBHaqkhXFMKBckBXFQBQX80+wohgC0GfI7giD7CQKpAuOawb/r4B0QZb1A4B1QTphfbAuyLK+OmgXZKOwNmYXNFuaTlgVswse7eI3nbAmVhe8Opa5B0wnrIjZBVc5N13QCethdcF708F8tpxOWA2rC36NEpqzHnaZamGdMPzWq81xlF2mShj7gj8uZb5uhjthHYx9wadxbKvTciesg9EFn3t+1oEaOmENjCd2X9IS60F7OmENbP70dqTFGkfphPEYZbL3uQljHKUTxmO70vejtLPW9XTCaGwnJXqOBRrrejbro7EJ1X03PhjrejbrY7EJar3zn8YNlE4Yi6maT5zqNPaZRn3f2vQxVfOJw0jGm4M4OxqJKRImr2oyagETuxBpWphu8k1bwHYR8NgucJ4TplJC6PIZxTU2mcKw5CKiqmIrClnVh2FxIbmeMyUzye8akUIspYSSSdqKQlb1QVhUFS2RNMmqU7p4dEpYxGl1WMmWzLCgCMHgPobmkCmZYUERgUUStVwNY0pm2CYMwJDHmPYvUzLDW4ICMHTZbRcaWNr17FDgMegxRk3apOzwdgs4Bj3GqoZZpB3mMnD0PMa86KY2MXMZMHpnKGPMzFJRMJcBozeGcvRoQ0VBXQbLAumCNoWVugwUfeY6T402SKzMZaCoK55ZwBnKevaYkOglXG5DyFDWc2gNiFrBZecdBifkraNA1NwxX0IxOCFLQhhqZ9Ax42noNrJVD0MNoh4VU283siSEoalgrjFrg8DNsUMQqqLmayToTkhlDYS21M6TDroTMoyC0IKot5enOyHDKAQtiLoPG+lOyDAKQXMVfztdbXgwjEJQgmjBeT9dmGEYBaAF0ZK6WxVmGEYBKEG0aKpMdUKGUQBKEC2TvlQnZBgtRtEvCwc7VbGAYbQYRRMtXWGt68F7EYqRl7j4HjR1YoYtpkKUIFp+YFoTfNhiKkQZcSpPNLTZUQ48FSKPOAGWV5tj5MBTGYp0iZjpjBPtyD8t0YAkipq+za9QFCFrz5h5QKWqpyxThLi2oGOaWlVPWaYAeXFReolS1bOeKEDMMmC3misVCyd/CxC9A1apKQUF6wk/siCD25+UgoLn0NyI4Q2oOYdLd38WMc9HJhiy8sP+hBdxf4LuTkqHAvmoP4VYS0ClEuV2CwprTsQEA1tny7kMhTUnUi0B3pvkXIbCmg9xVdFCiZzLgB/2V5BqCXiVLesy3AhdSH0J+M4k6zKsCF1IS4rvF4i5DCtCD9I8dUBqIbdB8M/7A0iDohENH1FF50boQMoOI4Y4xdFijm7nI6UWIROAYvHCHmE+0r4Uc1+W5PS8dzsfIagFLadYEnJYJhshsQiSKcWxQ16Tl4u0nFE9c6kdSXE7F6FjF7YnSV1C1vS5CBJJWGYvKmtRD50twjYYl1RISizHnfIQtsHAZp0URjn3m4ewloHyiBRGmcrkIWyDkZWZEEaZyuSR3gZDV1IKo5HPnR/CNhi6H0lhlKpMDoIvxN4tIYRRqjI5pLfB4CaB8Opw0iKHdJsgOKkXwigbTBkI6xi9G6XfHTaYMkj3BsNnb4UWU/Sj50S6Nxg+7SBkwZyVsZNu88Sn9OlKlLqaneQiVjjAkPZ/JqNm0pOiFRYxPfBEXc1M+rK6Gi2e5FFCnmAykxRGqiT0aTWhxtPnQdILqnR40rIMm7xG0gl9FWkyLSewnDCSdIJKV/MkZRkmo0aS+XwlZTKZSLFNbyRZz1cqqZP1BMsJI8t9Qhep1WPtz6Que/Z47awOPatYrR7rqSfaA9OYXNYfRqy2Db2nUu2B/Xkfq9dwWs0LXsqZy57mK2G5+8ntK17z+fPM85ZVfDnN5niPpxWnHO71zOWw4Rd7YCx3p5rtuXV7pPMRQgghhBBCCCGEEIn/xHJ1ZgplbmRzdHJlYW0KZW5kb2JqCjIwIDAgb2JqCjw8CiAgL05hbWUgL0ltNAogIC9UeXBlIC9YT2JqZWN0CiAgL0xlbmd0aCAyMiAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCA0NTAKICAvSGVpZ2h0IDQ1MAogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSBbL0lDQ0Jhc2VkIDUgMCBSXQogIC9TTWFzayAxOSAwIFIKPj4Kc3RyZWFtCnic7d1rb13VncfxFzJSRqCAycXx8QkhMmnI1XGIc8GxA87kUkyhEEaEEpgKhjLqkIqBUVqqEWqlDpVaQaWRkPIAqah5NILH857OnLDQ7tG57LP3Xpffunw/+j/HXtv6svY1gwEAAAAAAAAAAAAAAAAAAAAAAAAAAN39/H//b3TUP07aPvvxC6Oj/nEAeDQWTypqbyyhFBXIz6xyUlEn6itKToF0NYknIbXXsKLkFEhF23hSUUttK0pOgTh1jicVtdE5oeQUiIR9PKmoDScVJaeAkMOKEtIOqCiQOioq5DahVBSQoKJCVBTIgNuKEtJWSCiQASoqREWBDFBRFU7ngTxQURUqCmSDkEpQUSAbVDQ8EgrkhIqGR0WBnDivKCGdi4oCOaGigTlPKBUFtKhoYCQUyA8hDYmKAvmhosFwOg9kiYoGQ0WBLPmoKCGdioQCWaKiYbARBTJGRQOgokDG2I4GQEWBjFFR30gokDcq6hsVBfLmqaKEtEJFgexRUX98JJSKArGhov6QUKAEnNT7Q0WBElBRTzidBwpBRT2hokA5CKkPJBQoBxV1jo0oUBQq6hwVBYrir6LFhpSKAqWhog6RUKBAbEcdoqJAgaioK54SSkWByFFRV6goUCxC6gQJBYpFRe2xEQVKRkXtUVGgZF4rWkJISSgAKmqDigJgO2qDigKgop35SygVBRJCRTsjoQAMQtoBG1EAFSraARUFUPFd0fxCSkIBjKKibVFRAGMIaStUFMAYKtocCQUwiYo2R0UBTEVIm/CaUCoKJI2KNkFFAcwSoKKph5SEAqhHRetRUQD12I7W8J1QKgpkgIrWIKEA5gpT0URDSkUBNEFFp+J0HkBDbEenIqEAGqKik9iIAmiFkI6hogBaoaKjSCiAtoJVNImQUlEAHVBRI0BCqSiQJbajBgkF0BkVZSMKwAbbUSoKwEbhFSWhAOyVHFIqCsBesRUNk1AqCmQvZEWjCikJBeBKgRVlIwrAodK2oyQUgFtUlIoCsFROSIMllIoCRaGiJBSApRJCykYUgD+BKyoJKRUF4E/2FSWhAHzLO6RUFIBvGVeUhAIII8uQhkwoFQUKR0WpKAAb4SvqO6QkFEBgmYWUigIILKeKklAAEnmENHBCqSiAChWlogAspR5SEgpAS1JRhyGlogDk0q0oCQUQg0S3o+ETSkUBTKWqqGVISSiAeCRXUTaiAKKS1nZUklAqCqBeQiEloQAilEpF2YgCiFb8ISWhAGJGRakoAEsxh5SEAoifsKL1IVUllIoCaIuKklAANiLcjrIRBZCWqEIqTCgVBdCNtqJjISWhAFIUSUXZiAJIVAzbURIKIGnykFJRAEnTJvT1j/+ThAJInSqht+//7ZnzF964skFFASRNVdG1F3eePrN2/Oyzd69tkVAASQuf0Cu/+OUwoWbW19d/c/N5KgogXYET+sofv6wSaualjUskFEDSgiX0zjffndjcGqvocN7d3qSiANIVrKLrr96aTKi5QPrJ9SskFEC6AiT06q8+mZrQ6gIpFQWQNK8JvfWX+8+cv1BT0eG8uun3Aql6gQFkzl9C73zz3emr1+oTauaDq74ukKpXF0ARPFX04u2fNUmo1wuk6qUFUAQfCb1x778aJtTfBVL1ugIoSPjLoZPj/AlS9aICKIjby6FTnw5tMg6fIFWvKIDiuKrorKdDG14gdfWKvXo5AZTIPqH1T4c2vEBq/4q9eiEBFMoyoZMvy3eb689dpKIAEtU5oebboU4qOhybb5CqlxBA0TpXtOED9s2n26P46vUDgC4hbf6Afas7TR0exVcvHgA81CqhbR+wbz5t7zSplw0AfhD+jtKsaXWnSb1sKNTeK69Uo/5ZEJHwd5RmTcOPPqkXDLF40DszOgH+i6MVHZsA/3VEa25Cm3+yyX6avNOkXjBojDVz6vj+GWoqSlELF/6O0qyZ+06TeqkQSJNmBq5ow4RS1GLNSujoP+gZZlbPPTvrTpN6keBRt2yGDGm3ilLUcgS+KV8/s27ZqxcJLrnKZkIVpajZG0tot6/euZrJW/bq5YEDnsoZoKJuE0pRMxb4pnz9jN6yVy8MugtQzgAh9VpRipqT8Dfl6+fO85epaIrClzObilLUDPzc7sOhzuffX76pXhI0oi2n14pKEkpO0zXc+K2ee1YeTzPPnL9w55tvh2FXrwqmkwczTEjlFaWoCTGnzx9c3ZT308zOZ/9dXapVrw3+Th7JkitKTmM2ekP8pY1L8oSuv3pr7LEB9QoVTR5GVUXltSSnqRh7rOg3N5/Xntd/fy7/HRWVk/dQHlJ5JClqEqa+KKQ9r7/6q0+mvgigXqpSyBtIRclpQmpeWn91U3Nev/biTs17/eoFy5k8fbFVVB5Dchq/uR9QWl9fD38uf/v+3+o/kKJettzIi0dFyWm65lb07rWtSM7lCalz8tDFH1J5+shp5Bp+WP6NKxvBEjp5X56Q+iDvGxWNYezXp3ANE2pm48L5MOfyk/flCalD8qylVVF55chpzFol1Dz4dPys9wefRp+xJ6QOyWuWaEjlcaOl0WqbUDPvbvt98Oni7Z91SCghrSePmHxsVk+eNXIap24J9f1C04nNrbbn8oS0hrxd8YzNMsprJh9Xf5A5sUmo1wefbv3lvk1CCWlFXq3YxmYx5RGLZFz9cWbAPqHmwSfnF0iv/OKX9gklpPJexTn2CyuPWDxjv5hJc5JQM3eev+wwofWvKVHRueSZinM8rba8YzGMp7WNnMOEmrn+3EUnCe3waBMhrchLFduEXHx5ymKYkAuu5Tyhn33/4JOTC6Sv/PFLtwktJKTyXkU12mMhT5l8tOsfgI+EurpAevlf3vWR0LxDKk9WJKM+DtPJg0ZLnfOXUPsLpG4vh2YfUnm1Ihn1cWhK3jRy6oTvhJrp9gSpj8uhuYZUHq4YRn0QupM3jZZ2FiahZjpcIPV0OTSzkMrbJR/1EXBJnjVa2krIhH7W/hX7hh++Kzmk8nwRT3/kZaOlcwVOqJnm3yBt9eG7AkMqLxjxDEYeN1o6lSShZprcaTp99VqYy6EphlQeMeIpIY8bLR0lTKiZ+kfxnzl/wcnL8vmFVN4x4hkDed9oqTyhZmruNHX7dmjeIZWnjHhGSJ64Mlsqj2c1s/4Ve4ffG8kmpPKg0c+YyRNXVEvl5RybyXeabD6/nGVL5UEjngmRVy77lsqbOXVGv4qvvaMUW0jlTaOfiZJXLteWymtZM+afDQ32jlL8IZU3jXjmQR66nFoq7+TcefGFLflN+RhCKs8a/cyPPHQZtFReyIYjL6Q8pPKyEc+MyUOXbkvlbWw4wx9VnkdhSOVxo5/lkLcurZbK29g8oYY8j+FDKo8b/SyTvHVJhFTexrYJNeR5DBZSedyIJ+S5i7ml8jZ2ruigjJDKE0c/UZHnLsKWysNok1BDnkd/IZUnjn5iKnnu4mmpPIz2CTXkefQRUnnl6CfmkhdPGFJ5FR0m1JDn0WFL5ZWjn2hFHr3wLZVX0XlCDXkb7UMqrxz9RGfy6AVrqbyKnhJqyNtoE1J56Ogn7Mmj5zuk8ip6TeggtYpWIZWHjn7CLXn3PLVUXkXfCTXkYWw78tbRT/ggj57zeXrlqDyMARJqyMPYcO589c219e2P+6fl0aOf8ESePlfzxFNH/3H3Qv9A7/3Ni/JC+k6oIS/k3HntvbubB08/t//ocN5ZPiWvH/2EP/IG2sy+yzu7F/vDhFZz8ejRe9e25Kn0mlBD3sn6LajpZzWv9U58vawvIf2EP/Iedkno+vZYQs3s37f49qV1eTC9JtSQB3Ny3rj3+2oLOjYvLR3/oq9PIgmFV/Iwtkjo2a1HFvZNJjTaTamnQybPZjXv/PXbm1svTu1nNVcWn/m8vyoPI/2Eb/JCzk/oyfM1/YxzU+rveMn7OZw3f/enWVvQyfn0YOwh9XewUA55J2vG3EtqPjFsSn0fL21Cf/LTtxr2s5po7zf5PlIojTyY41vQyzuP9Q61Smi1KRXevg9zsCT9fOvPX22f2mib0OoyaWz3m8IcKRRIHs8fErq+/ejeAx0SWs2V48dyTagROKGvf/jr5mfxsy6TRnK/KeRhQrHECT15vv5eUsPpH+jdfWEjy4QaYfrZ5EZS89FeJg1/jFAyVUKfWDlh389qHlvY+/LaapYJNQKcxT9/5JyrhGovk6qOEQoXdAva9ULo3FlbedrfLSf1IfIY0tfeu+u2n6rLpOpDhNIFSqj1hVDJLSf1wflB5Gfxsy6ThnmaVH1wgB/4TaijC6Fz5/rpU/kl1Ij8LH7WeP16ifqYAFP4SGjbJ0It5/ihw07O7tWHYgonCbW/F992bi+fdH52rz4UQB2H/dx/6cbUV+N9j/33oNQHoY5NQndu3ArZz2quHXD50r36CACNODiLX90IcxY/dWzu3avXfr5uF0I7P1Efz9m9euGBdqzO4p0+ztR51laezi+hRtsLoYHP4n2c3auXHOgolbP4WTM8u29+mVS92O00vxAqj+fodDi7V680YCuVs/hZMzy7b3KZVL3MXUR7IXTuND+7V68x4Mycfl7eieQsftbUXyZVr253NRdCJ79RH9XM/WC+emkB92YmdMZn6mObWZdJ1etqS/tEqM3UPJmvXlTAo/GEHjsb4Vn8rFnpPzl6mVS9ls6MJrTVN5ZjmPf7p+gnSlOdxS8cXJGHse1UT5OqV9G9CO8lNZyXlo7/zzIJRVmGFXrh1Cl5ErvNwdWLw/8LqJfQvWGFPj24Kk9ih9m5ceudv347/L+AegmBEEavKA43dfv3Lcqr2HweWdi3b327uhyhXktnRs+IP++vXll8Rh7GhrN58PQb934/dl1XvZyAR5O3Zu5d21pbeVqexyaze7G//9KNseu66hV1YPLWzBf9M8NzZHkh5872qY07X30z9RkD9aICXtQ8KfTP62cfW9gr72TNLBxc2Xd5Z+ozBup1tTLrMaGvl8+81jsh72TNvPLmv8593lW9uoAzTV78ufvCRv9AT17LqbPnR6fnvjKgXuMu5j6y/n7/lLyWkzM8i3/zd39q+O6Veo0BB1q9h37l+DF5M0fn4YXQk+cbvnulXul2Gr778+nBuC6TXlvfNjeSWo16sYGOun0T6e1L65Gc3T+698DovaScQtrqPfQv+meuHYjiMmmTs3hCimx0S2h1y2ml/6Q2oY/1Ds26EJp6SDt8EOnr5TO3l08K+9nqLJ6WInU2/Yzk7L7JhdBEQ9ohodV82Ne809TtLJ6QIlGuEqo6u394IXR1wyahMYfUJqGqp0l/8tO3XPWTliJybvs5enYf7N791CdCswmpfUIDPwQ19Yl6Qooseern6Fw86v3fsHviqaOu+hlhSF0lNNjZ/fapjbf+/JW/hNJSxCNAQs28vLbq6ey+1eNMyYXUeT8DnN1X78UHG/VRQqGC9bMaH+/dD8/i2z7OlFBI/SW0Ort3fu/+tffuhuwnIYVK+ISauXdt6/ihw87O4ldOeO2nNqS+E1rNx/3TTjalrh5noqWInKqfo2P/EJSre/HRhjRYQs3Yf8Ak2IVQWgoheTxHx+Yy6WO9Qw7vxUcY0sAJrabze/c3t14MfCGUkCIweTOnTrfLpJZP1McfUlVCzXzeX237uqinJ0JpKeIhr2XNtHpXNMCNJHlLtQk18/Vyi03p6x/+Wp5KWgp/5JFsOE2+8/zEyolu78UnVFF5P1ttSjcPno7nQigthXPyMLadl9dWZ/Xz4aeZzm7JyxkgpPJyNt+U1nymPubxcdSQH3kPO8/Ul+5rvlEvH7cHTt7M5pvSCO8l0VK4Ii+h5Yzebwr/LJMwpPJUNt+U7ty4Jc8gLYUP8gC6GvP1kpi3oM5DKo9kw/mif+bOv/2HvH60FM7Ju+d8Prr5T/I2BgupvI2tZvgDy7tHS+GQPHeexvx28jYGCKm8im0TasijR0thTx46r/2syNvoNaTyKnZLaEUePVqKbuShC5ZQQ95GTyGVV9EyoYa8eLQUrcgrF7ifFXkbnYdUXkUnCa3Ii0dLMZe8cqp+VuRtdBhSeRUd9nOUvHi0FFPJKxdDQg15G52EVB5GTwk15LmjpajI+xZVPyvyNlqGVB5GrwmtyHNHSwsn71uc/Rwlz2PnkMrbGCChFXnuyGmB5H1LIqGGPI8dKipvY8iEVuSto6WFkMctoX5W5IVsFVJ5GyUJNeSho6UZk5ct0X5W5IVsOPI2ChNakYeOnGZGXrYMEmrICzl3eue23+v9SF5IbUIr8srR0tTJm5ZTPyvyTtbM0oXre3YtLPzD7j/0T8o7KU9oRV45WpoiedOy7GdFXsups7ixs//xpWFCh7O0a+HL5dPyWsaQ0Iq8cuQ0CfKgZd/PiryZk9PrHTEJNXNs9+L95VV5MyNJaEWeOFoaLXnQyulnRZ7N0Vk+fGo0oWae29OXZzOqhFbkiSOn8ZDXrMx+VuTx/CGhJy9NJtTMzuJheTxjS2hF3jdyKiRPGf2syBPaO7dt7ijNmg96R0loDXncaGlI8o6R0KmECR29ozRrlnYtaG/Zq49PI/K4kVPf5BGjn/VUFV1aPFyfUDNPPbJXdadJfWTakZeNnDonLxj9bC58QqfeUZo1aws9EtqQPGvk1JK8XTGM+iB0FDKhvTObzRMqudOkPhoOyLNGTluRhyuSUR8HW2ESurixU39HadZ8tHyMhLYlbxo5rSevViSjPg4uhajonoMdEhrsTpP6CHghDxo5HSOvVjyjPhReeE1oq8uhk+P7nSb12vslr1kMI1x/ea9iG+GxCCCey6GTs73vEAm1JE9ZDBNsteWxinCCLb5WPJdDJ8fHo/jq9RaQdyyecb628kxFO86XOnKRXA4NcIFUvdJi8ojFM/aLKc9UnGO/sOmK5HKo1wuk6jWOhbxg8YzNMsp7Fdu4+vtMmoPLoee23SbU4QVS9erGSB4x+disnrxa8YyrP8g8WF4O3fvoPh8VXbB+glS9rlGTp4yKJjqu/gLz0/1c/sljnhK6YPdVfPWKJkPeNCqayrj6k8tYl4TO/naowwukJDQMedySqOigvJA6+esqR9tzeVePNtXP6wdWSGhI8srFnNBBMRW1X6hiNa9oww/fOZnfLp8goeHJi0dF6WeiIjmXH52G3yBVr1y25OmjosQzOZGcy49Okwef1MuWP3kD5Qk15MUjnvGL51x+dOoffFKvWVnkPaSixDN+kZzLj87SroVZ5/Xq1SqXPIxUlHjGLJJz+dGZ+q/Yq9cJD8kLGbKig9RC6vAXR1uRnMvXnNerVwjj5KkMkNBBChV1+/vCRgzn8rPO69Vrgznk5Sywom5/Tbji+335tmPO69WrghbkCXVe0UFMIXX+q8GHjeUj8nj+fTu6eHgYdvWSoKM8EjpQV9THbwR/zOnz9r5D8n4OZ//jSw83xt9fZFAvDGxRUcpZiOpWzrHdi9qE7tm1UCWUiuYkxYoOgoTU00+OkEZviN9fXhWGdJjQ3rntsccG1MsD91JJ6MBbRf39wAhv8uHMP/RPLokeGV0+tj71RQD1IsGjQirq7yeE3NQXhX67fEKQ0MOnZr1OpV4kBBJhRQddQ+r1R0I8al5a/6B3NGRCe70j9a/2q5cKoUWS0EGzivr+GRCnuR9QCnbLfvSmPBXFVFFV1Pd/Ealo8knktYWe74Tu2bWwdOF6k0+eqhcMsQiZUGCWhh+Wv7+8+tQje/2ey0/clCekAOLXsKK+b9nPuilPRQHErHlCvd5pmntHiZACiFPbig5nx/UX8/Y/vtQhoYQUgFyHhDq/09T8jhIVBRCVzgl1e6epd2azc0IJKQAhm4q6utO0fGTNMqFUFICEZUKd3GkyHw51MurlBFAcJxV9YPFO095H9819R4mKAoiTq4Sa6fD1vKlfvSOkAFLhtqJfLp9ue4G07QP2hBRAPNwm1MxHy8da3JTv9IA9FQUQCR8VfdD4Ufwmn2wipACi5SmhDS+Q+rgcSkUBBOM1oU0ukDp5OpSQAlDxXdH6C6QOnw6logDCC5DQB7MvkLp9OpSQAggvWEUfTLtAav+yPBUFIBQyoQ8mXrGv+Qc9CSmAJASu6HDeXjpiErq452D4hBJSAA6FT6iZ5/b0Lb8dSkUBxEBV0fvLqz86fl6VUEIKwAlVQs1oE0pFAdjTVnT4AxBSAOmSJ3RARQGkTJ5Qg5ACSFEMG9EKFQWQnHgSahBSAGmJKqEDKgogKbFtRA1CCiAVESbUoKIA4hdtQgdsRwGkIOaKDtiOAohb5Ak1CCmAaMWf0AEVBRCrJDaiBhUFEKFUEmoQUgBRSSuhAyoKIDLJVXRASAHEJLmEDqgogGikmFCDkAKIQboVHYhC6vDnB5C6pBM6YDsKQC31ig7YjgKQSj2hBhUFIJFHQgdsRwGIZFPRAdtRAMHllNAB21EAwWVW0QHbUQAB5ZdQg5ACCCPLhA6oKIBQcq3oIHhIA/92AGKQcUIHbEcB+Jd3RQdsRwF4lndCB2xHAfiU/UbUoKIAPCkhoQYVBeBcIRtRg+0oAOfKSahBRQG4VVRCB1QUgFOlbUQNQgrAlQITOqCiANwps6IDQgrAhWITOqCiAFwouaKDgCFV/6IAfCk5oQO2owDsFL4RNagogM5I6ICKArBARQ1CCqADElqhogA6oKKjqCiAtkjoKLajAFphIzqJigJojoROoqIAmqOiUxFSAE2Q0FmoKIAmqGgNKgpgLipag+0ogHokdC4qCqAGFZ2LigKoQULnoqIAZmEj2hAhBTAVCW2IigKYioo2R0UBTCKhzbEdBTCGjWhbVBTAKCraFhUFMIqEtkVFAVTYiHZDSAEYJLQbKgrAoKKdUVEAJNQGFQVARW1wUg+AilqiokDhSKglKgqUjI2oE1QUKBYJdYLtKFAsKuoEFQWKRUVdoaJAgUioQ1QUKBAVdYuQAqWhom5RUaAoJNQ5KgoUhYr6QEWBcpBQH9iOAuWgoj5QUaAQnM77Q0WBEpBQf6goUAIq6g8VBUpARb0ipEDeSKhvVBTIGxX1jYoCeaOiAVBRIGMkNAAqCuSKjWgYnNQDuaKiwVBRIEskNBgqCmSJigZDRYH8cDofGBUFMkNCA6OiQGaoaGCc1AOZoaLhUVEgJyQ0PCoKZIONqAQVBbJBRVWoKJAHEqpCRYE8UFEVTuqBDHA6L0RFgQyQUC0qCqSOimpRUSB1VFSLigKpo6JyVBTIAwlVIZ5AZqhoYMQTyBUVDYN4Atkjob4RT6AQVNQT4gkUiIo6RDkBAAAAAAAAAAAAAAAAAAAAAAAAAF79P7/vp0cKZW5kc3RyZWFtCmVuZG9iagoyMSAwIG9iago1OTY4CmVuZG9iagoyMiAwIG9iago2OTU1CmVuZG9iagoyMyAwIG9iago8PCAvVVJJIChodHRwczovL3BvcnRhbC5vdHJzLmNvbS9vdHJzL2N1c3RvbWVyLnBsI1NpZ251cCkKL1MgL1VSSSA+PgplbmRvYmoKMjQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMjU1LjgyIDYyMS44MDUgMzE4LjE1IDYzMS43OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMjMgMCBSCi9IIC9JCgo+PgplbmRvYmoKMjYgMCBvYmoKPDwgL0xlbmd0aCAyNyAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCniczVbNTtwwEL7nKeYFMB7HvxJCKs2mam+oK3GoONGWHlgquPT1O7bHjuMEaG8Iwu6M5/ebb0yeBgRJP2fxwwUFd6fhiXUITsFoWWUsjFJ4Y6VEOEGSUaBM8gOZd1K1ZcmWM45U5V9wMzwOEj4N327J9DtIYeDPILfpmpBfh+umzngq322dbaUjqndc6dPgdKaDsgKDCSGAV6CcUGRzd4LzzycF0+/U1PWaKFYrYdGsCSQheOE9a0knlKHc8fABFCXRWkqpNmI06zQmtZ0/X2yQ429D9XPIFq9Vh0bIYFdfc6gq/U9F6xCxGgn3w9VxOJ8JM5Rw/Lls4khwO8I+aEAkPxM7cXA8wbcLGlaU8PIWjl+Gw3HdlUZhaGPfFeiJVipSRFtPNPHw/ANu4JHU2sjcc/ziEayKLBuIZbqwbMUxl+6nBTkL9NsiR3ajcAYJO28LYMoTaMRy6SOM9HlFT8TUZxD3RuBhdMIFTXGwIj8S9OpDngCO8c8lKBQOLjiB4yTmEjBpowY1p+utdZSTFOMix3XZuo+fYrey5+iKox/YNz66yxZFk7MW+ygXPzmz38y2yPo235x7L3Z9bTFuemIv8379FQnOubGZOXdbu+Gch5fRLOfYYRTlMqvaO+nUlAffTFuHzbRT5om9CjINgknxxhRyh32FDZomi3liHMvyw4yoaHUTS7HDphOHW97G6mzGBrVQERs1MdZTp+cZRz4WnOvZge0LPzu+lHkW+4XhyUMXXMp2lPkkX935zttdK2fJr6A/7XC5tcVlH6pO/jseKSbHL/yqZ5bt9Xqiu/kO2T7XUxEo7O6QHPsuWt45RqSbTtk+1BtO+HHL7lITRThzZgG9LGBVVlR0b13gHxfPOoreGGvvst43qaNVxOZyedszsH5udi3ksmopbSDFINdRrQ6nVzqNkePlj3SoPvaHVIsKe500V9IatNVe1Kb7euXGtzTA/2NGU2PM3HtrriWRY1zPcAVsWqMNWYLZkCV1UqDGvUti6Th+3+LVwpTBLmVrzDqcLoHeyJrLoq5+ASePJdWbXwme75fCkUju0wVPLe/0sCznCnxs13KROytTsjYJlaZ3ZMoRxrCLWWhe0a6Hv4I5o3UKZW5kc3RyZWFtCmVuZG9iagoyNSAwIG9iagpbCjI0IDAgUgpdCmVuZG9iagoxOCAwIG9iago8PAogIC9SZXNvdXJjZXMgMyAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMSAwIFIKICAvQW5ub3RzIDI1IDAgUgogIC9Db250ZW50cyAyNiAwIFIKPj4KCmVuZG9iagoyNyAwIG9iago4MzgKZW5kb2JqCjI5IDAgb2JqCjw8IC9MZW5ndGggMzAgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nM1bT6/ktg2/z6fwF4ij/7KB4AG7780U7W3RBXIIckrb5JBNsb3061eSRYoiZY/9msNidzBjiaQo6keKovy+3vSk0r/v8ldczfTLl9vX2qanaCYbapMPk1Xz4oNSevoylWc9a1Wef0/k7Alp61OAvioJn3+bfrz9cVPTX24//ZxI/zGp2U//vSk5HBH599snomfuVd+snlRTq803rOnXW3QbHEyY9erXdZ0WM5k4m0Tzy5fp+79+MdPbv8ukPvVACc7MQfseQGpal3lZamtqm41PY+fO3yeTBnFOKWXEYyZjLb5Me/venWCVL0XxddgojrTTflZr6H5uovDpika9iKyNmn69ffx8+/6RbKbV9PlfzRPdbMOStFd20jrx+TyTOH3+Mv30Q/r58eXn6fPfbvfP/Yycnn3y1m/K4AVSJsPDhSVBZJn+88/px+mP1Oy82uabfyx6CgYQ5gBhHb5iiU3NamFK/6nVEp2do9cJtEsAY2mbPjEbLX2b9P0hfZJtdUK9TXbVj/T5sP0268vk1imbOPWqNX185XhNH1fbdPrvtjad2z9sy7GpZJhK1s/e2aRRUh9UokN+2FQrgrOK66aeivV7rQroTQET6++4KVkUqQrm6ZXnpdL4KtM1WRraMu8rKi4QuEx+mU3MBvIWFLcfX6a0SD9s0hVVRVfR+fd9+y7D+trua/uj0iry7KttA5m2J3SEJ69m+Z3V13V17dZnTF3hypv5tG466vpBne/k2dd+Mh4sA8oE+rjpW3RZNxMSuy1qtsata1g92u1DHaFqWqQULV8Sj9fzhrkn4zFqsLJvsu2DU7X58NbNkl3rU5t246N1u9bY8xcM3EczLSOZKsON9OnXSPQsDSkwIptPHtshYvM4b3WWQ1uB7n2rqQjVYIkTPNk2xbG9QMdqBDrKLN42XXUs/Kg19xsDWDYNSbDG5q36hq6+pKkm1zE9jmdam1nFFNAiTsBYEs8yaCDUus3cOT6VQJkVqLFOg0KvRKGO/ig2aevmRSUzmrSpgJNBSMHwkZYkO2NZfbBTqB+/b2XCdspcHUMUcoW8vjsqDIJZsuUqdB5MG8XYp/wXNaHui40eEJiXE+SV2CMs4wnwAGBuMEhDH7ODrltGGQZUfOwQ7y+C8DDtgsAGBtygcOsB7YsRtGphKvG7PK4zjbgobGoEiUSIY0xiythxJrojcax2gSUFNR5KbKd5qZ1lApDhlG4ixqWPAR117RfmUS9TLGCxdvNZEzGAZSGvLyn5wdCLwU1T1Hc664ElbA2OBe2co8erMhILKYkRWBCw5pbhPlpMwvwUk4oLqySCM8h5Cg3VJTM20dmcC75esLRMVPSSD3/JOD62DM80My9GZgvQhnuQbWEE6U/EIZTzGPArEhhY/EG+EwGE0j7zPBwbYOY22BXeh8L9mYCCW+StzZZGBmqVXoKBnFYTbgP7OJF8HJURkI1j5JpMZg2EYBNtJTxSqsLh0Sd9btYyWwELauFGPdOpZLcSnw3fLRMDRj2SdoAvJBrGnXcpfz1KUOahweGQ1TX2KFFNdbFXnZuGAIRRTgJiiHoWorTEm6LZOJwC4Iw2PlflCsOaY/kSW86na9ym+4lPauLid/keMTAQiT0RufeiWJ1Fn3Uzibhk0GhgC1nyzprCtcKYETg/P/ZgxxU/w2mwxemSQZR8Ns3tTOsGEy+NMAHb237X7lroMzKh4vbocnq59xu7CLw8S/23U0RGlX5r4EX7QSyAzY/kBX0WSS1E/ZW7aSt/YOZ0b/Kv5gZwpD4+wJmUEwWfDnAaC4p5ov93QepJsQkOf2i4WkFDeUz+8QHQLHq2SxK/xtjlLtWbdJgNgubRt6Epo+rCO/bDMnom60TURxmqeU3Hf3j4E5rfd9oHtY9RlgU8hmQVnRyuHXgqgFwp3GgoH1T2wHEssyBYz4ws6wbyzMgyeeZC6xO7nIwEqxVgeU/ujm5QfdmQzWy3+FndA5I9XjQ9498aCj91eVAWmpjDpdeTLxnKfyr7ZVq3JZHbsdV+dtblOhDW2k1fH64hnqLIDOsC5lSxpVE+Mwjg0VjqSX0LxzCRDqjq6LlvGVFGMV2lqfgknEwqkpleh/GA0Yr6NJ9d8RY4jTmuER5j2RmJ2GPHGQY7qzVRLP1uJutWkooH3nitLAdsZ/IVy5nQDKFnEulxp/GdD03zFtVM3bjINNoxHBEBdfGRbJgOQBvLzXRwzItGGvUdJ4oYF406igN2lXEg7+v19GwgV/iTA+6Z3VT1aRj3oYPwrCHmQKQYhNiNht4vQJ5jHmonAvZtWBSyw/mARQZGD3p2i1sXb704C2H9dCufYpnhzCGm8nTOCm1HJ4nlar28p0dXAJ1HssEcLBgjkKnujrWRoPyMH/1JXh05gPOA+qIlOu0M0e7BLDGEkgREtAIQvKh5HWWrn30+E9gQGspyMraiWdJj8PWmrGbxuDOTPsg24bkACI4svO9putPTAlDpWHhPplrk4zs4pb9aoME573o60fHSJodanXSlzsJ3aU0OUGx/sjsINDgVBRpQIWBrRVGxN5GypoZ4AgcNVuIVtTuURwxhOb0ayFBSp5PlabHhdnrTdGoZjHtpyYFrBHSU6ImzVEsLC9Q4UgpMnpaDcARI/fx2wcPKzUMtxChVE5hBgX2RIyGjVwGZsfhrJlOt5OLbYqDvQYZw6hKH64O5B2TKpSYhp5ZftkoBd9XuwvHnuxRR43DbwI7dsxohOnv+6aRKHXZOQW0Y4j0dl7hVptPCBBXFHJyILhjlagmdGgtzmU4ifaOjm97h5iGh4K2AgiP13meVGry81arqcDaLAoYOYigl8obHYPXMUdhoA5ysEjA2SEk7IJ2TOZihlEBiYSGAl41oVkdn325SauMoZdk3IF5DkfJYyyIlLtJWy3FxbtJWDdJwbMVbA3oHWhHQ7ngseSPl+vWTpW+f3EcyGd35e1PBO8TlyqlM3EfpE215WGk9p+7x6GocR10JgRgFBN61IGbts0KcJXR0J6aO+tzrRsiye0gmRN0RCxt3ykylfWXEw8iAcxk5BQ5jmwfwG1xpLqH5bvIysMVRttQPcR8HgGWVASD2sQNf2huV3jQNAeO6L71zOnfweQcCD++TvFpna10KPcuKmVBeoHqhBElU0SADMl8uwSvV+ZKovlL9510OeWtmFbKRnBtdDuUbxCDPQKP3MAeRFZnf48fIDHkquJsgYFegQTg51YNMZGmOhXVE6ujARo9LXaNQ5dR7hYd6w5EJdgTNF+J4Zx1pft+Wc/+FpyKiOIfwS++cwAf6ia4gIAeNroiiVUvqnr20SxI/7stYaNytql1D2OCI4kOYtU7hRxl75k10k9JYWG82GUMoyTs4dHmAW8n3nO7VVMQsEMbaPUsdezcXRYpBAG13JRvNXuDmdEe7QTen7izIZBA/om1iZie8CMfrbpUq/44PIQ97YWnLDCUo4iJAwRI0OHyDI8E1tifxhl5MQzu5mkWfYK/NwkSBRyxUXVzzJsftLo89iRuD+lPHE1jbaNFJNaWTPQB8N2eWWlIb4ThvxEuf6PZ8QzqOMeNVateCEg6rknBgIa/LjLU0OoazgGpCD3lBpZN4JbBphunQAmrzk2cgPk5hQkphlpBSGBvwBQFNUpgSwcgfWpV3Xl7rCDSdqX8hdpyehJSe+NWtUcULlaOgd677sINn7rTzSe2/I6WHThQeR6pcWEYrNBqqqRqSW+OZ/IOaB/OPbvaj/KObXschMP5sjOIhgElFvQGPDHQ0mWsM11g4bEi5CwPPe9KE8qejn27/A7VhG+YKZW5kc3RyZWFtCmVuZG9iagoyOCAwIG9iago8PAogIC9SZXNvdXJjZXMgMyAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMSAwIFIKICAvQ29udGVudHMgMjkgMCBSCj4+CgplbmRvYmoKMzAgMCBvYmoKMjg1MAplbmRvYmoKMzIgMCBvYmoKPDwgL0xlbmd0aCAzMyAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCniczVpLj9w2DL7Pr9AfiCPqYdlAsEA2s1O0t6AL9FDklL4O3RbppX+/kkxKpCSPZxYpEASLiSWKosiPD9H+cgKl47836SesRn1+OX3BMVDBKDvjkJ+V1dPiZ61Bvaj8DBPo/PxnJG+eCi0+zTSHnMrzH+qn018nrb47/fwpkv6i9OTVvyfdb8dY/nj6yORMs/qblZNLasF8w5J+OQW3wcHME6x+XVe1GGXCZCLN5xf19vsXo85/50N9lECZnZlm8BJAWq3LtCw4Gscm4+PeafJPZeImzmmtTfeYyJoRn4+9/e4eEPn3rFo7bBTXpAM/6XUW/91Ylad7JJIskjRa/X56fD69vUSdgVbPv1VPdJOdlyi9tgogrvPpJEE9v6if30VjLQ+f1PMPp6dneSIHk4/e+k0pPEPKJHi4eYkQWdQ/v6qf1F9x2Hm9nTf9ZwE1G0KYI4QJfIUcm65obVHL5BtdWRv1Ff80PESSqCGnkgaTbp/aUX2JK9/HX9/RWxy9bH+0HtyIe/bCROK6mRAHZvwDJkfi6XEPfG5WugcV9fNuo0nrM23YaG1HnzkPRwfaIGlQV4nKmPhrRrrIskI3emZa6rhL6XXiHfD/M9OCx/FuvzyD585SBTZ+Rf+bnzCAmAjb1cWoZoEQku0IzK4k0VL3yccFpMX9YrhNmzmD5CseaBXT8CQfPTvuuT8EkhnSfD0J0x9ZG4n14/+zDd+CsL9sB3SSDwc7DXGPOSMKGMMgHxeGIMQXSBFGLtOK0OxBhiPHWjs4xIyVAwYYUwIGNEHAuGk5krEQ3RQoCsc2TpSJV0KyMgibn+S/dKDLiIg78vAAzG6CtRyQkclIEQ0MVLlny0rArCnl5fbkk45Om/b0D8p6DuPK+Kkd2PWUDizedWDJJ50fFAQeqTZ76iaf6DujP64NZDnmrkQHFY1ZEsfkD9xTOc6QFtdrT9LD+xpfCWw1iyBHFncN+YEwyYhjgxCWZQjA5Joxq88qFsg8q8dbSSyHkgOZWIyi4o3b2Fufs0kGOAUnndQWB03aOsXGD3gYEvCxOkdWyQe2Lkg+6Yz5YI+bD9Mc0NiMPFfk9X7jZwLyRToazzRp/Ydy4EEZs87TmpBmgh/VMbBMpq1iaKytYWjcEC7o4ElBiCOKECNehITGpy4N5SsClm15oOS8RiknnatpTMFX9g2nRWYr3BYWoUfzLLZxHRHisw45ffEZNuZZfGNhrPAzzH9ZbXOoNdPFHtBLB4k95W7xbZ1Wim9ZvqXGk7wvarlmMFxQDh80i8s0uWihiTJheKlYBvl+mJFEjVfYnmtIoGwpCUZ7ZtUGGcILeC7oa4f6IR/isZuhjZd09WCPFNA4XMSl4iZ1DjcfGD9WrZ3xGxnLDcAYLLspu9/qkusAzKZ5dsiDl920YY8NnJDY4NSy3OQ1fRiciFy2TUQVTqbesghzKUvJGov0gxeQcsnZ5SbKJDO6jhVDdEYQkGM7k0U0XeQkv6zvHgfWRBzE24uHWq7qrWSFqBzzYTPZyJSlhuhiXLt5d78KSIUAyvMMsDWWd8fACgIIegN5uK3y88K0dtFNbGVSXbsN9oU+xOKtU11b6af+Cc8dYxkYoShTy+rXFu98e+FINCEcqciQQH5Gah4NkQsl/EwjtmH2FJHZaFn5lwV7UZoIOiwKOSnZ8EJVsMcqFgSmOIf98r6Q6IHaaknUw2KeO1iMs/peNmd23qmSXomIqxUxLPMUkqKcL3Knaq6UxOm4qexct98UEUQJTOVoWrNEn623cIoJdxTJ14tZo9fJpuzlWFcO+lrvja3toqulHicmByxhtOPXNfXs9Z4XeYTGpeeOW0kGtmabc50qIGe4GDqivSERtvuUSFmHd7Jis/LWe2drDe5QVuT57RbRd9gMdOamDYqMzEzGTuFasUzzPJXS2PEFpazm2mHFReG0E9vKeqtr05UuxqQEzschLwqodiDHlbZn0UaTprkd+Ok5sss4N9BA84IW964XfXnmAToJLKukThfUNG7OPSSs7SFxfLfs7LbbdEBiA+zg52Zyr08LJegwVbUwgFH/yXJBi7G58ncuH0Nu5YLaNlSLHnazfGHJ6izAHnti6zjrtrqAtrIA7g/i2loDYG9i5zsT72H9Na2wYZtrVD56+dzdFQ5Tq5n9BNHuYGeRrii12qQqTIaw4K5X02nuPxEVteC+XnpdwhSi5sE6W0qBg/upbmKHHsSBQ/8Hzepfjqn7rEtXB7Gz1uWCcPxySteE/YRNrXwi0YYkjk1P/riA27lQ2FjVtGq30UmsLmrfZwetG3IPrI63gb0of6kmI3ibUk9Ik+b9bzoe1afZ4T2TwzFZd+/TjPtFy6Q3UJmFHqlBWq6UH6ubZGS61B5mhSAjvMGKgrytpvjE3cXSaHG1YEMkaiouvihTaeIWUKUX74D+CC2DK9emsjm/8jhWohYebcjoziQ8kG8EoQeCsx0QANFsqee2SH8RwYuC/W19C0wbImgM0Bnjfu/QGDm5U+arpR8dmwGCCPq7vK8q58FZaJWI5IWfs7zaOZPktEFZko153uIftbkr+VjY22Jpw+e+FMAX73Ya2kN1BoEGybS1b16C8gWD7wRsGGRV4sWAxXPoMAs1H2rksrR5y96Au83Mh+Hb+cb7B+BeB9kK+3hurmpJjeZiPYNGADl3y9cihc+lX3984eVSiOenashO2ju+qiknQUcYjs/9ScRli5/winkqZWsm28wbXqYt1TWLVDux5lDCgyjZfxQBfZ6+oYh4VRuEQ2SAfWHwOw19tcp3sRbxKawELz8Vwyo/9zLx3XEue+YtntA737ybeVAut0QsVvD5VoatNmqkGep3UJ1MTWsK+EHX+8SKNF/tduC8S59xxlW2NArF6wHHLMF7bLzl3pSq/G1Hdn4aKy6sS4yk+1cCa7KswQ9SqLSF2hWB2vUALglFuYAWuqM2cySF1rvx9Q4JB98PhblT76i3GSx28HcPWGlIkPa7HZpv/byMU8+evfluE2ihfUWRW+Rj0fFIpltfdTXcDhpYnUaa76i4VMBMnIBu271YuKJP4LDlLAom07+Oc8vSGb/rRwwjGq+myp2X7tRMWH6Ryh/7fjz9B37XVPoKZW5kc3RyZWFtCmVuZG9iagozMSAwIG9iago8PAogIC9SZXNvdXJjZXMgMyAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMSAwIFIKICAvQ29udGVudHMgMzIgMCBSCj4+CgplbmRvYmoKMzMgMCBvYmoKMjMzMgplbmRvYmoKMzUgMCBvYmoKPDwgL0xlbmd0aCAzNiAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCniczVbJbtwwDL37K/gDVURqB4IBZnPR3oIOkEOQU9dDJkV66e+XlORt7LpN2kOQGDYlinzkexTmqUHQ/PdGXiERfDw3T3UNIRAYX5ecB6NVdF5rhDNkGxXqbD+w+4XV+1bLd3s1Um9/g9vmsdHwtrm7Z9dPoJWDn42epxuF/NDcjHDKrn61OMdIDdIrRvrUBFvkQF5hcikliAQUFLHPxzNcvTsTHL7nom6mQvGWlEc3FZCGFFWMdZXXFDnOLZsPQJzEWq01zUxxu1hxuezy/m2BNf481CUPxWMNHTqlk598llC99RxE0xCCRsPXZndqrlruGWo4fRkm0SrjI6PXBhD5nJNKApzOcHfNZO0293B63xxP04osKsfT+qoaniVFIg/rI0skwo/PcAuPvGydLvXKR0Tw1CnMdgqb6Cvku2nomgf+H3eN/YwKDlm00ffNMvwEBrbjN/F7yw/3Fln1hvtKsr8t3ygdl2nYD35azspGW2wjNvvofYnR+8g7lXO4LwQVkHQB0jjl0DDIZHuQ7QCC0ga8gesafjeEN5LClnWMfYqZeiK4yMNrOYNPXQrDNZDU5Go9EgRLT/Ij+23Z0kd+2+JndDmLB97fD2cFiABDV2Lms1jWqeYQU/qfP+wGmODr6s0Z9KFmm+wIV8aV4kYVRT2ryMYLL1x0w2MhJhOXpM9r5KA2KkntaHsJjSVCkcH6DHZXAccqrlSFtV9jBnlOnMwzEv0rNVkfVRvkNoAh4wrVw42aHy7b/B8oQRtnpSxxsuSHnVokqVslJJAyMi5ytXWE7AdCMmQaZjrTsi3zmelOgxbns71KVbIqiZgczqgaK/vPNDyr2V3Uvjsj2w930YsE06F1w/zqJT/GQIeKpa24KrYFIRD6WaOWhLDk9/dCIKtVEITW9aczyE4Ix3rR14sZa3OmE5vL3xYpdLLIV1ao63Hkt3rHkjfKcDUx8S+jFXl0ZHVUF3lguBCPrZ6HgYJCeS+otpC6PMsvvWo7hDkXVk8zklb7EsEviSS6WbsWRbLgNxWJzPXoB9BN8wsWm4mYCmVuZHN0cmVhbQplbmRvYmoKMzQgMCBvYmoKPDwKICAvUmVzb3VyY2VzIDMgMCBSCiAgL1R5cGUgL1BhZ2UKICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQogIC9Dcm9wQm94IFswIDAgNjEyIDc5Ml0KICAvQmxlZWRCb3ggWzAgMCA2MTIgNzkyXQogIC9UcmltQm94IFswIDAgNjEyIDc5Ml0KICAvUGFyZW50IDEgMCBSCiAgL0NvbnRlbnRzIDM1IDAgUgo+PgoKZW5kb2JqCjM2IDAgb2JqCjc4OAplbmRvYmoKMzggMCBvYmoKPDwgL1VSSSAoaHR0cDovL2xvY2FsaG9zdC9vdHJzL2luZGV4LnBsP0FjdGlvbj1BZG1pblBhY2thZ2VNYW5hZ2VyKQovUyAvVVJJID4+CmVuZG9iagozOSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA4MC4wIDYwMy40MDUgMzgzLjExIDYxMy4zOTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMzggMCBSCi9IIC9JCgo+PgplbmRvYmoKNDEgMCBvYmoKPDwgL0xlbmd0aCA0MiAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCniczVjNbuQ2DL77KfQC1epfFhAEyIxnivYWdIA9LPa0200PmS2yl75+SYmUZHlmktySxLBM0fz9SNF5mbRQ8Psb3mIy4tt5eiGaFtEIG4jkg7BKzj4opcVZ5GcttcrPz8A+PFVeegq8R5Lq8z/i8/RzUuL36ctXYP0ulPTiv0lt1XUi/5oeOztxV31YO3tLrTYf2NKXKboCBxOkTj6lJGYjTJQGeL6dxac/zkYs/2anHtdACc7IoP0aQEqkWc4zUYEmjQfduPksDChxTillNo/INlB8drvcrzpI8reixjwUjlvWaS9VCqtlEVWf3mPRWgRao8TTtDtNn44QM63E6UerRCdtmMF6ZYXW8J5HT6I4ncWXO0jW/v6rOP05HU5rj5yWHqr1QwU8Q8ogPFyYASKz+PW3+Cx+Atl5VfzFxaxFMIwwxwhb4Svm3tSiFgT89VEDPiuj1wDaOdRgWbgiGLaDu4H7A1wQWw2otxBXs4f1Q1nbBHsJA0x8+I4rF64zDffwOZUkXErfLGyUMTmwQ9esWQ3KUAAmE9a5VnUxKl+4fyxb6kBKdfcMjqgjKV+KE4r48d3Kg2t/L0DzXXENXc2uxyZNkTWsNW8cSdIlrbFZyry9N6gDedAqU7XntxxxtYBB5syQOR+l1xYyl1zN3LFlJgfKk4p9yRKq5Yz1WTWU7ax0vpWlWUGPgyylkFipsuQjKcv+Zx/vhQV0Za+WK/RVTDr6mzLd+NEpvZAjg/ySn0a7nafXbXtD3gbPK+ZMuTt/3ZOrEYmlKHX37iWvskeeMN9ZOspzpkP5rcwdKIJZboFGh4dktnhgDyK9hblbSMpCtXAgTZ5azVBLhq3SalV/Yw1djgpF1d0L6I93TTP662yrq9Infz31DmntNh5ljUeykJugLRejM8eYkMRdghGW+TiGrtAzjTEQ1dB/ckul7DgsWltxdqGHudRzbOIBO3Bs372KWs7ZYaA7jtbTlU6kASypdP16iGT/uBVZwmOka0ceUhYtZptb1M32AwOY9Hi2a2Oqpl2HCcKV0V0VAJqNlwb9XeOw0Tl7+f0e8T3P0MMqfahYpt/ISM9l3la3VRt1xo1nY9XdiEKrjL7yGU128PtazPhwMWMs3xmna71emU230WHepH88/POZRmdfPf+4yFgNJ4LbCLUeNgNp2CBdLK2I+S8VMoLWOrUaKKocP5RypAZ0aVzgVMTWoGBcVTKpNEPpgfezgQnSBSXMDLMS/uBo+APnRdiAbZgqHYYor5/z/FheehZtRXOptA4KeRhOSU4ZUKuoNp3CCFrlM4OBeZsm76ISCbYnvEUzyjK9YDNI7tV3G2cRRxsuWLAivBYAZPaepDeFRKpffZfsKHHvo/4OzZHdz8uN822Mhw/MsS/CF0yK8O2J/47o5jLFPTx0XYVPKx4Cd9R9FyoKAmQGKI/1ltaB5PFZHbqislSEJJcLMIMfgY2FmWhNfaDy7Do9CxVBaPLzZ4Um+kJ+7Wi9p338LMF3saiOrZdkO/fNriy/P/MWOk1j59+Dap9BWPiKuumRZhM61XPh7kmP2/QrowA8EacOyCKnRb/n6j5bH6f/AZrtp/AKZW5kc3RyZWFtCmVuZG9iago0MCAwIG9iagpbCjM5IDAgUgpdCmVuZG9iagozNyAwIG9iago8PAogIC9SZXNvdXJjZXMgMyAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMSAwIFIKICAvQW5ub3RzIDQwIDAgUgogIC9Db250ZW50cyA0MSAwIFIKPj4KCmVuZG9iago0MiAwIG9iagoxMTkyCmVuZG9iago0NCAwIG9iago8PCAvTGVuZ3RoIDQ1IDAgUiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJztWstuWzcQ3esr+ANlOMM3EAiQJatod0ENZFFklb4WcYp009/vkBy+7pVkBzAcoRFsQbrUcJ7nDC/F+2UDQtHfD+nNRxQfHzdfeAyER6EdD1kntJLBOqVAPIp8DRJUvv5E4ourJstXrn7Hmtr1X+L95vNGiR83v34g0d+Eklb8u1Frc4PKXzbvBj/Tt+pq/Rw91YBX7OmXjTcFDugkRBtjFAEFeokk8/FRvPnpEcXh7xzUuxkozqB0YGcAKRGDDIFHaUyiJdvpy08CyYgxSilcXSaxxYjNYZf3swGy/rWqZR2KxCXvwEoV3fSxqGpXX+PRrCJ5o8Sfm7uHzZsj5QyUePijM9FI7QJ5r7QAoHk2ReLFw6P49S0V6377QTz8vLl/mCMyIC2x9aoSniGFCR7GBYJIEP/8Lt6LzzRsrCrxpg8BhMOKMFMRNuHL597Us+YE/Y9ZIzktvQUCbXAtWZpenhy7o3ek9x29KLdAqNeUVzzQ5135nGRVCiKmdNP7nsboc6aVKzry/H2VK4U4VcJAjVNGkzT6WJ3RQIqTglRQ2JKcNOItK/fFMbRbAT6NphEwa+kklaXv53HE07IALJvCUKzzkELYCsr52zIrJ2nUBkVaLcbV8XQMuOdkUsjanLE6xqzWEZzTrXXNSfIS7OnZGnnsyBpMsV4zm8fiYs6ZimSvoUAmv5LcsdtdRjPlGQssBiyYsMLCuhrsKVtp2oA9cevvMmCB503VrKPI73kW8hjHlOS0bRAmPuGCTy5IsGlqDI1Px84XDCUMdBzGvijFuBVON2Azoyrz0udUwuRGfu2KTBpTVRPJ6V1/nbOUE3DX51TdecwRaAxmN3aXiBqijGmu1q1r6PsxoTndh94zUjaT4QQeOCToJyCEgtQiBhU/FadHdsz2a80Vr7XIFfW1mvT9sZhKzErmc93MU44pcsbnqBdyIzPYkrY8r/Gr2UH2PQxSO47Js1X2Gw5bYUzrI4bRptneOVzHFUuAFjtAT+1b20aTrwgnU8WedjLbnhvecx2F3g6yDKhFo1Jzq66eLcp/viVdoiB5J7WmG7FgTc0J6oGDL861nL3Y57ey17ZR+Vft+IXsRU4yxI6qrcL58579CC2ai5QFixKciVFj/E45m71eQO71mOq11Hml76j87pkaUVpUMTrVMJlgcL1MTSJZ/57nXuQcAm1Lsjdwo9zrUw61lSbm28wb4wrj0BrpFa2N2rX7hXE/d32My1uU1BOexzjvaEefAOa+1zvTb0u56KULmqZGvHGucE6DkyHSKgfY+hBcNefS3hE4zqyHZev2pt2X8o8glzmpdZA+L5yIN06+PidpKySDCyRi/I2TzEkfpfI2huBbTtBcMyef2iNmH+5Y/q7busxNUiajol1h8OHGzdfnpkGUyupUNX3jZuGmMSCRdoTB6ZYTtNfMTR0HMBv268l7VeO0VCHS7lebG/e+AfeCkaipjM7GG/cK96zS0hhH2s14AteO+15ywWKCPiVXN4CKjxezrRf4QdSilegtLfvm//DrTDtAnFA3Ee1F/NuKWLSvCWWNk7SgRa9dX8wYGQlBGeaWXc9uU/6Cytru+3A7lDWTCDAxxlkVcsyhfHS3UBwuJ7ucB3YjNS+z3abYDKe8lnE3iGo2OB8sVrNa9cNU9k4PnnkWWWcGYOD08FVtC762gO4J9nrxMbA5qXqd9HVZbViVdSoGGC3jk/XoUs8tyWpGP76u39Twz1jyy5G6a62dsTKGc2QHO+GUxgrh8fGDlvouBSd9PXTmNmz3OVpNEJsY0HVg0bOYy37nuyRGMKzm5qoA+7CefyjR4G4NAK/WANALPiMnoqbPDm2qnrkPhYfa+S8vRyFKp+lWEEz7uVIPR3nfYj2qj7yUlsxj+6dWGwcgTbIC0d9Wm5dYbZxG6ZSPHqAfHtXnNupNVoK5tQMr3WKwPoVSn1iZGlCbWf0fB8sNWWsddZ3zHEYY+FHDm3QeCgDS/mPWy109Gw1sZymQVeMJtdMTTS3IZzzWMk+YbkBHr7lLtVlDt5+6Xpvge8NbtaaxCJcwuhaeF9j100POmBU4Tm8LuDXVdYQKqm1TDBzx6tGvk3flZ6HU0TxrGGPEqqXGX1lnKgS46QLzdYTJcfZqActj96+voiNU1OompyHkoNqvvFWu7VKG+GHYWeSHLN9t/gNPYeQOCmVuZHN0cmVhbQplbmRvYmoKNDMgMCBvYmoKPDwKICAvUmVzb3VyY2VzIDMgMCBSCiAgL1R5cGUgL1BhZ2UKICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQogIC9Dcm9wQm94IFswIDAgNjEyIDc5Ml0KICAvQmxlZWRCb3ggWzAgMCA2MTIgNzkyXQogIC9UcmltQm94IFswIDAgNjEyIDc5Ml0KICAvUGFyZW50IDEgMCBSCiAgL0NvbnRlbnRzIDQ0IDAgUgo+PgoKZW5kb2JqCjQ1IDAgb2JqCjE2MzgKZW5kb2JqCjQ3IDAgb2JqCjw8IC9MZW5ndGggNDggMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nO1aSW9bNxC+61fwD5ThcCdQGLC1FO0tqIEcgpzS7RCnSC/9+50hh3zkoyxLrYM6SmAQ0uMbzvLNwiHlTxsQCv++o4+QtHj/sPnEcyCCFsbzlPPCKBmdVwrEg8jPIEHl5w9IvnpqtPzk6zvm1J7/EG82HzdK/LB5+w5JfxFKOvH3Rs3iOpY/b153etJb9WL17DU1oF+wpp82wZZw0F5CciklEbXQQWqkef8gXv34oMXuz2zU6zFQvNXSgxsDSIkUZYw8i3NSO5RNLz8IjUKsVUrp6ZHIVjMum10+HzWQ+c+s1n4oFKe0AydV8sPXwqo9XaLRyIK0UeL3zd395tUBMQMl7n9bMtFK4yNqr4wAwHWOLAni/kG8/R6/qZt34v6nzf5+tMiCdJitLwrwHFKawsP6iCESxV+/ijfiI05bp4q99CWC8LpGmK0RNsRXyLVpQc0LTKUeNaRT0gBpAaaCBQccexy3iCbiCIBDl6GIdIsj4cD3KuCIyzMY/LzDT7vMg+M5zBqteUSmoUxKC09zu4ysQ9VlT0DdCLBeoIpqz0tIvXgjdJmNrMRt8faxOInCUM5hlsbULDbEziIbIDZkr9oVfcl+hc9kliEccF5vb5BTJFJjClkekCmLbgc22y3Pxha4Mow8D4EhxHfmUETpbRFPMGWITitmeb5REW9Tx7Pph9CHbDFzJkQy5a5o2Tingn0HuLNSWzsArhPL8N1Kx+EDRR99yzT8nOnQw9rdCOOqpYpRyxYe0wdYCnDwAsfJCU9kmnA+clnr1GLuSJYFI4OJCIGFIcsOS5YZvWQBRA4BcvQdK+xKcPcZRMrCtgxaS/Q189b8hswieM2SWacTJnmpsv8gXH3C6LDopF0xg/ia6oHIITeHOUCQ3qcBpzW7Ft+XRhevaRA8mRN1la5UNaMqJ/y0gUMQ+gzP8hl228nSDGTNybwldLadzgAwQYIn7LGCdymQw/AzbjQmdUFk2YIujbIzq3OrR3yXOolxs53sUFKupVjgzyf3HnBJFky1vvpces7NJxXuR7IucrfXIzrgRaoSZhiAOUOy90At+w2Ksp4jYaQ0i8nQ7yET5QiA4vK95JTqdqTSbfWrLwGq5HW/ep3h1VFHtOyBnTDJUB9qfg9v2945cNszOo4zyR2jAt5/V7OqkzWgVLUgirx2r4b9tXd9MpPrc2OxewTwCFU26XzUo0zip8iPS8DQMIeJ55qHY1GWC8j4WnNNa/Wm+nghaSU7TKup8lDKtOjmFdxOtSzqXsUFz8ys25laTLHmHPZ5Y7kd5V4aqWlSuwms7g8l/MxhcrBWbnIwLc07UccCqql0oG8HgTElu+Bu5jby0O07/Yt/lZh18dKB9qKGxran9qwH29UCrCdoDe5a1n9SdGyPz1G2tOutYeijeyAZ9HdjAGrexC3ZRJs29ahhjgHsqqYYeISV5p7AcNdCcdKcb9XSE2l+B1z5eO/PdDuGGfnaJ/t6bbx0EYPcOj10NVv1WbuaJ86/F0hUe3Qj9xM1wtanhekcznV2ywHHrU9rpfTKi4iTUzLF1QFo22mYmE3sbGNNT3dUGo9WGuMDjD37OE87ESKcxNQrfMbeqhd6bpc1Z0N0s7X/0w2AQZOMapXu6Cnk8v1iMtkoLxPh1Jn8/NcHlxzIHjsQ5cQMR6X0x7b1ZcTTulXL+muLI21Sz63pfLJ8GbqChCOHst2Vla/+soPKl+HaU5XLrI6XLkwKGcGkRBfFjNFlJcp4I4FuHB2cfej7ckuUCW629spLVPIy0A1ZZ/K3EvU8JcqCl9ok5O7DcHV6dSVqO5aoDLhV7VeSI6XJUm9NF1zBNWyyxK1a7qsuKlXYxspk0eRgvoJSZb2drb3uUmUjHliyEuZbqXrmUuWwU1V+7BRyN2WvrVTtxlKVf4rqFZxLldNKWsQmJr10Ud0V+2VlylktA/kOob7+MuWcna297jLlgpeGzrmdyV9XmervhKG/q11xOLM0JSdjjAnDyA2lyV1ZaYJVaaJUJ/rM5o7ZzuXJg5Ka7vG6g3DVu151Kf6XlXz7eLI8eaOlSzYFdfYP5l9udfLWTsZeYXHK/zn2evMPdV9K8wplbmRzdHJlYW0KZW5kb2JqCjQ2IDAgb2JqCjw8CiAgL1Jlc291cmNlcyAzIDAgUgogIC9UeXBlIC9QYWdlCiAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAvQ3JvcEJveCBbMCAwIDYxMiA3OTJdCiAgL0JsZWVkQm94IFswIDAgNjEyIDc5Ml0KICAvVHJpbUJveCBbMCAwIDYxMiA3OTJdCiAgL1BhcmVudCAxIDAgUgogIC9Db250ZW50cyA0NyAwIFIKPj4KCmVuZG9iago0OCAwIG9iagoxNTY4CmVuZG9iago1MCAwIG9iago8PCAvTGVuZ3RoIDUxIDAgUiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJzlW8mOJDcOvedX6Acc1r4AjQSqcjE8t8YU4IPhk5eZg8uDnsv8/lAKkUFJkZGRNT3tQhuNRFZooUjq8YlUZH86KCHh3zf5KyQtfn49fKptSgQtjK9Nzgsjp+i8lEq8ivKsJiXL8+8wvHuisfXJY1+VRM//FD8c/jhI8d3hx59g6C9CTk785yDH5ZjIvx8+Mj1zr3y3enJNjdLvWNNPh2BnOGg/qeRSSiJqocOkYczPr+Lb71+1OP+rGPWxBYq3evLKtQCSIsUpxtoKbZN2sHbu/F1oWMRaKaUeHvOwrsUVs+fvmwZW+aOofh/mEVvaKTfJ5Js/Z1H09IhGrYisjRT/ODy/HL69gs+UFC+/LZFoJ+MjaC+NUArmuWxJEC+v4scP8Jc9/iRe/na4vLQWWTU5iNZ35fACKZ3hYX0EiETx71/FD+IPaLZOzvbmP6ISXiPCLCKswVco3LThtSji5HpfJXjMTRnk2aOX+VkZOTdcYcxTHVOfyzhwv3ZHYZz4UHuvdUSAL18/iknNM10de2Hj8wrneTyuovUsZ2UVmKlCnVlXkHavbnlmXqusH2Z9cAZJlNUDelmpfIcqp/ME2ZRm1IHnvQAS456XQoPrC2RDQtcrEGCycHCvcdVZev4Uk05ZKHyeFmfgc9meZ/i2S3tR5Hl2ZHZgceKlysny41FoX1wSq5RHVkQ3PS9bVdy5SMWe5+rcU7aNnLICR6cmH7IlxqJTTFbYgkiVRZbdrdgwxe9HmAlGp9xbZmYTYIQ+5Z5Yms1+ABpbddUdvMLsEXPtF9WnWaXs3eL9G8rOdjNjvRmNtQhglJF1MPj5bHYchQrFMygZLDKy6HwzXB5ZvaAxDRZHD9RcIki/lW4KOmXtxyCugVr+9steUUD3ssIytyA41HWRaFwrK88vMhyjmmtddx/N1Nno/bq3seqD+iMRxUVmWeMi75AJ5DyT9JB7JN+yiVnYRKcjQK7ssa/+wchmfIE8UXYYNa4ssNl3qTKf5jaNfZWDsB3XzW7WV9kwimGftf4SZTmWnmu7q+0XwHMNdV8hH/fQjdJpUiHjX7q9fLMzWOrG7yWHCgLgLDi0Pwzj8HRkgbyQAgaz4ufXZc8IhSBGAPvFJgwSDkKVN061ob4S5gpo3KUIaJRvjvP8PSxVYz070+D+R3kzcdiKe42m4WnXxT6Nr+5GHsX418iA9fnLOPlG9AfwdwAFvTbk7xz5Fxb9K/GUA4TH3EOn/3ZgJQtnW3ZEeiSw5Bc6vv/cuFyJGK0C1K0ypXyfgDsYtk86NBPR+3CavRJhPGLwdGtORKaTQqrFFJpFB629EtkZBwZQZPQ9XGsTJhlgd5xqcX2V/9cceS1WigW2jveLDB1r+0kOZ1jR8zJ/stBHz8jtGIOTEA6vmKLzX0GI/VmZ784jTUc9eTjEko8ExUeU4qnmLcdtHnsI9VBdx4Jy7XibUzzuyiUxblox4C+PHVKy19HKpU5GmX01/gBB8QJinRyM1HDoQZoRQ+DkoFnK+57JgQ7oQg4ASzvXzG+vz3WH2nwb6qcUPNgGYV59NNh9N0uGgJpgRkrGfw2H+TtnGuMB13mMjfFtTAO+dmEyhJtNyuGDV7mHDbhNQlzKwEa8s+5Ff302U8aalDXxW7U2G4opPslqbOEahH6Rhj2p3H2jHlu8NwQtACDYAQDDJm9TI2TfNoTmsCrUeFqoUSLdnWZfaLwTqHSnEAzPq1xUybHJdi5zsPOM5/MRcCbIkoFvc5WFRNpFkBSi2s9VPL+XdG1U4gETYZu3+cvWD1UyJxyHVzmSLqYysvFSpiWeAvGRYGymc+nh4HRmX3UOWNY2TWo1MKln7eaN4sHN7SvymiRh50pht/nNvB0vEVI/xwZWiWERd53bV7T6H31Y5pwl3cSh37qVqAps5iJQRkqxTg9bvp61lXNaTZ7qVinvFHt8RsmPzmty0DGSHx1X5nAanR17O2LtsCaVyE1rGW9u6bmUt03rmBlzH9FFUzMHSSwus1a0WV+vh8FiE3r7PHPAUk43nkKADD5Udq11iwdHyHg7QibI4TLDPm0RYObu7REqziOsYSqbyIKPUVOPHkIDTqA7tyCH8qUBeTPBd43DxtDorX3hIod1KDhDpavmOpENbEKIRG5FUDOQM+nbbOSRI+2Ii+BHXFSmQ4PQehOm0MOf2m44hI9Brm3anFze15xlcwumz5QlIJRwWmEVu8Qrmp7v8muarmai14EOkK5mR7SRKncIn5vPXU3tcdSndRFp8lSxJyUdr2NFzjTDN+d2GaN67eXKPBbYxbkUNiMOYhxxsPL6vXl3dyt8NrNZJ8OU8uscqECbbPYsl2x2s2qm0v2hN2CatWfLbhX5TQ58lpQDP5z/br8ZNwqKcAc5eQpfQRH+uTPiXe/k6lj5xGSc5XKx0pe1Y+7snIHaLKag1XLpdJqxUd5M0R36UUQo4yhFYM/4Bjsvr13Xx4KS5nf0QWNdZwaf02XV1B5ll+ZwKikO72eEFQl3bhT43EeuLdY9xLdR9dqwk+Wev+5X7LQ+Zg+tp/CtPDuhub/7C4MRPN4N4OmVDex43lYWR1q8lGG3FNhHLylrJcv7eBERbiQF1B7GyGtksY2lkgVzFXxRm9o53fsxdHl/qiHUOm1u5dw0JnZ80m5OL5HBiGwybVgPvrOdDHaDvlcO+ntOGUfAhDAAZo09vgmmyyguXYdm2RU1Fp+jj/rOJg8l+TU37MmCBtjno7AJoTrM31nb0XKB8QvvoCvc7rSgfJhMrN7qQqjXqdzuXI/C2SLdbZ1gVNLUuMMbU3vqCE7dk1RKH37pQOblpNSnefyIiphGGolyyayMbAMRpGXmuXVmUJ9c5i2/mlr6m8KAt3dnDbavY4F6a0J+S2tV72VRYwQHrdph4542PbVh+z0o9ev1dvAfjvayS4aqRk/r6yJvWIdREe0Men3lN4RSjRSBKFxJwZcX78vzsqn3t0USa/Pagu5IrrPRNiyr04/kOCPXWqbExln2B+1a6aBkf7VH8JbDzyLobSuOQTBxz2yGzPj2YMuraCeeLXTRCBqn2a7NEsdrNdmoUrK+/aEDK3HeULzcK1aytkm2RcgjBUs3Hy/rSxVQ35CWN6fXKievH8mKzXLHW8isok/BPXCN/5epdm5VLOoMlGspWcYIZTeZqzcHif3viI+H/wIGg2bvCmVuZHN0cmVhbQplbmRvYmoKNDkgMCBvYmoKPDwKICAvUmVzb3VyY2VzIDMgMCBSCiAgL1R5cGUgL1BhZ2UKICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQogIC9Dcm9wQm94IFswIDAgNjEyIDc5Ml0KICAvQmxlZWRCb3ggWzAgMCA2MTIgNzkyXQogIC9UcmltQm94IFswIDAgNjEyIDc5Ml0KICAvUGFyZW50IDEgMCBSCiAgL0NvbnRlbnRzIDUwIDAgUgo+PgoKZW5kb2JqCjUxIDAgb2JqCjIzODgKZW5kb2JqCjUzIDAgb2JqCjw8IC9MZW5ndGggNTQgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nOVayW4kNwy991foB1IjUTsQNNDuJUhugxiYw2BOk+0wnsC55PdD7ZSquspOgqDThlHoErWRFN8TpfLzTjCOf9+EH+uBfX7aPWeZYBaYNFmkDZN8ctpwLtgTi2UxCR7LX7D5UKptc8mUujxSLf/GPuy+7jj7bvfxEzb9ifFJsz93fD4dGfLH3XuiZ6jlN6sn1VQKuGFNn3dWpXAAMwmvvffMAQM7Abb5/MTeff8E7PR7NOp9HyhGwWSE7gOIM+8m57IUZRNonDtUfmGAkyjFOYdZMTQbJDqanX6vGpjHnw81rkNqsaad0BP3pntNQ9XSazTqhwjacPbr7uFx9+6CPhOcPf7SkKgmaRxqzyUTAvvpYIllj0/s47f4Zvaf2OMPu/Njb5ESk0a03pTDY0hBCA9lHIaIY3/8zD6wryhWmid7w4sTzECJMFUirIsvG7lpxWuOuUkPvuLHfegY3tSe4Qz4JgSWzvhc8NHpXVj8RbnQqT6WT/gLuY2gIwSJUEkoZB4pWG/Te5SXWcKvyWWVy9gGDmRkm8Yr2sTxRKrqNFVprDiPyzKfogE9YhiSC/UIZ+AmKQ3C2PkaPqgwBOVRAVnM9XnA8HvIMsjmh0mPra5OTtuS/sGF/CG5Dy5JLkx+P6ayDM+hPdHQQ2oX2oR5w9TRMZDqJNZJILqEcUPbQ3XAQkhoxI8OPGZNcYA8z6LhlKaWcT322BNXw4fasLgyGBiMOYYaF8UydRB5YelCRfvJQkpF7KDhZpNv5WWcFI7Ze5DD4oqyyW5irJFzY1UJPRq8sjz/mh17Jmz0DB1ZzVsGh4Jo4QxlVh0iZM980tHPbHOBQIMxthHhsUEvQs5kOObxI5hNhtspQwqIlbq17+A6wjNDOkQc6D2TuvixAtWMHu7tGuC8MAec08rG8onIV/2zDHrB1eQkxoHTqkO9vjHUP5SooS3iyCo94PLqHtMT2oHJkeWyN495JR3638TRXNZxkx0EZjZa6wjy+6cHIT1aq7wH3IvvjR+EwfTHhyiXQAkCcrCGQKzkYEmgi+xJCkox82ruRXOFqN7lOnwrtfxXsHcCN3vsYKygsI8BekOwl6dUF/u6Kxt98IvJ8+TfbTgDEh/XkRv0/cMZhJlbey9wBulwvxfea1DX4LwFvLIPV7NyvwrALCt7f8w6aZ4g+MKeX+G/mhVQqukXo6OE9eRdW9zHFTq2z96js28R0D55R6i+PM4jLptAdni+1DJoJN8AkD3Mrb0XIEuhcF8WQY9uX54BZe1MPOyiMbEv5ROv5+MylgqmmtxG8XZGF80NxZhQVkWH4ZwO+WgaU9EDr4eHUq4UcM66bhFSsdE2fbhrBBRltrc1jlGWtpRd89Ur6GiVbKRUmD1gM+sEXSdx/n+TDcgtspFIs1wHE/wbyBqk8XNr74ZsvJi4894bqa6TzZ45OaWTYkc6RN6RT5M3YBLZKhm1doGUokz3oE8AJuNdJSiiX0dUTf56wiJ9rxLXgr8qgZG6VSIj7V5EaP2c/4TYlOCYRQWnWtkR2+W2iA1EI7M4htsiLiUl5g3ce+Xs/ROXUnpu7b0QlzJ20s5556Fd3cp6PeYaDKAcKoach+c8AIB3l5xA6KnkKNV4R+B85vV7hig5V86JXnNz8doc51r+V+FniZ2X1vY6JWzQgbOY52AYSaO7g+WtHarKlafLtpp09fn3bkY0kiBX3jtr/f1ThQaYW3svVKGVwhzH4fSNBiFr57JWp4abl19VULRHWXb96t2maRbEcpm1fKUs31DLdc3S9UtOiqo/CdtR1qoMt8Q8q5jXRmIKELXzHeaPN4b5JWzzNHf09GET585MWnnUBt7AxYn2bm7tveDcAMeUwHir+/N4SfvJcQb8pJeOM1S+hf/WOt6e2Cx3vUUUk+26tPWlh5Iqozv4C8ZTgz5zziCW2WEuOR9z9MZy5kLG4HOfXOMoemCh/Wd6XlmZuS4LH/VhFgddDKUREfi2eoQeK6nc1IyS/kcJbTUeiIl8O4K6uYZL71Yb14hEcXfoy22AxFbtZ3j71C/ae/q8j5ap9I8+vu8mH/bMVrXK9lgCUg7KyUER5eembQVy1x/4SipLjCvp8ej0vMnKsf3KRhsAJC/zQMLEYQikuEGJYuXLoVouWcMS1TN8qRuS9fE/K4pFEeZ5XukbxJYOA/HSb4BsSHog99/6B6s+ZMs3nvGDrrRE4zLSw/IM5RhG46mQePzHvPe7vwDFF5BBCmVuZHN0cmVhbQplbmRvYmoKNTIgMCBvYmoKPDwKICAvUmVzb3VyY2VzIDMgMCBSCiAgL1R5cGUgL1BhZ2UKICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQogIC9Dcm9wQm94IFswIDAgNjEyIDc5Ml0KICAvQmxlZWRCb3ggWzAgMCA2MTIgNzkyXQogIC9UcmltQm94IFswIDAgNjEyIDc5Ml0KICAvUGFyZW50IDEgMCBSCiAgL0NvbnRlbnRzIDUzIDAgUgo+PgoKZW5kb2JqCjU0IDAgb2JqCjE2NzUKZW5kb2JqCjU2IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzE4IDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjU3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDgwLjAgNjc5LjYyOSAxMTcuMTkgNjg5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1NiAwIFIKL0ggL0kKCj4+CmVuZG9iago1OSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzQuMjc4IDY3OS42MjkgNTQyLjk1OCA2ODkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDU2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjYwIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzI4IDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjYxIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDgwLjAgNjY3LjYyOSAxNTUuNzA3IDY3Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNjAgMCBSCi9IIC9JCgo+PgplbmRvYmoKNjIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM2LjMyNCA2NjcuNjI5IDU0Mi42ODQgNjc3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA2MCAwIFIKL0ggL0kKCj4+CmVuZG9iago2MyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyOCAwIFIgL1hZWiA3Mi4wIDcwMC44IG51bGxdCj4+CmVuZG9iago2NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2NTUuNjI5IDI5NC41NzggNjY1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA2MyAwIFIKL0ggL0kKCj4+CmVuZG9iago2NSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzUuMzg2IDY1NS42MjkgNTQxLjc0NiA2NjUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDYzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjY2IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzI4IDAgUiAvWFlaIDcyLjAgNjI0LjI3IG51bGxdCj4+CmVuZG9iago2NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2NDMuNjI5IDIyMS40MTMgNjUzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA2NiAwIFIKL0ggL0kKCj4+CmVuZG9iago2OCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzUuOTY2IDY0My42MjkgNTQyLjMyNiA2NTMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDY2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjY5IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzI4IDAgUiAvWFlaIDcyLjAgNDc3LjY5IG51bGxdCj4+CmVuZG9iago3MCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2MzEuNjI5IDMxNy40OTQgNjQxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA2OSAwIFIKL0ggL0kKCj4+CmVuZG9iago3MSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzUuMjAyIDYzMS42MjkgNTQxLjU2MiA2NDEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDY5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjcyIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzI4IDAgUiAvWFlaIDcyLjAgMjI3LjAxIG51bGxdCj4+CmVuZG9iago3MyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2MTkuNjI5IDI0MS45MjYgNjI5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA3MiAwIFIKL0ggL0kKCj4+CmVuZG9iago3NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzUuODAyIDYxOS42MjkgNTQyLjE2MiA2MjkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDcyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjc1IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzI4IDAgUiAvWFlaIDcyLjAgMTI2LjQ4IG51bGxdCj4+CmVuZG9iago3NiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2MDcuNjI5IDE4MC41MzUgNjE3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA3NSAwIFIKL0ggL0kKCj4+CmVuZG9iago3NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzYuMjg4IDYwNy42MjkgNTQyLjY0OCA2MTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDc1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjc4IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzMxIDAgUiAvWFlaIDcyLjAgNjYyLjAgbnVsbF0KPj4KZW5kb2JqCjc5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDU5NS42MjkgMzU5LjQ4MiA2MDUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDc4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjgwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC44NzIgNTk1LjYyOSA1NDEuMjMyIDYwNS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNzggMCBSCi9IIC9JCgo+PgplbmRvYmoKODEgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzEgMCBSIC9YWVogNzIuMCA1NDkuNiBudWxsXQo+PgplbmRvYmoKODIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTgzLjYyOSAyNjkuMjk4IDU5My42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgODEgMCBSCi9IIC9JCgo+PgplbmRvYmoKODMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM1LjkzOCA1ODMuNjI5IDU0Mi4yOTggNTkzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA4MSAwIFIKL0ggL0kKCj4+CmVuZG9iago4NCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszMSAwIFIgL1hZWiA3Mi4wIDQ3MS4yIG51bGxdCj4+CmVuZG9iago4NSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1NzEuNjI5IDI2My4yMSA1ODEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDg0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjg2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNS45ODggNTcxLjYyOSA1NDIuMzQ4IDU4MS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgODQgMCBSCi9IIC9JCgo+PgplbmRvYmoKODcgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzEgMCBSIC9YWVogNzIuMCAzMDQuOCBudWxsXQo+PgplbmRvYmoKODggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTU5LjYyOSAzNTMuODE5IDU2OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgODcgMCBSCi9IIC9JCgo+PgplbmRvYmoKODkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM0LjkxNCA1NTkuNjI5IDU0MS4yNzQgNTY5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA4NyAwIFIKL0ggL0kKCj4+CmVuZG9iago5MCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszNCAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iago5MSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA4MC4wIDU0Ny42MjkgMjA0LjkyOSA1NTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDkwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjkyIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNS45NTYgNTQ3LjYyOSA1NDIuMzE2IDU1Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgOTAgMCBSCi9IIC9JCgo+PgplbmRvYmoKOTMgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzQgMCBSIC9YWVogNzIuMCA3MDAuOCBudWxsXQo+PgplbmRvYmoKOTQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTM1LjYyOSAxNzMuMzgzIDU0NS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgOTMgMCBSCi9IIC9JCgo+PgplbmRvYmoKOTUgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM2LjM0NCA1MzUuNjI5IDU0Mi43MDQgNTQ1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA5MyAwIFIKL0ggL0kKCj4+CmVuZG9iago5NiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszNCAwIFIgL1hZWiA3Mi4wIDYyNi40IG51bGxdCj4+CmVuZG9iago5NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1MjMuNjI5IDE2NC44ODggNTMzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA5NiAwIFIKL0ggL0kKCj4+CmVuZG9iago5OCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzYuNTgzIDUyMy42MjkgNTQyLjk0MyA1MzMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDk2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjk5IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzM0IDAgUiAvWFlaIDcyLjAgNTU4LjAgbnVsbF0KPj4KZW5kb2JqCjEwMCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1MTEuNjI5IDIwOS41MDMgNTIxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA5OSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMDEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM2LjA2IDUxMS42MjkgNTQyLjQyIDUyMS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgOTkgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTAyIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzM0IDAgUiAvWFlaIDcyLjAgNDg5LjYgbnVsbF0KPj4KZW5kb2JqCjEwMyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA0OTkuNjI5IDIyMS43MTkgNTA5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMDIgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTA0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNS45NjIgNDk5LjYyOSA1NDIuMzIyIDUwOS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTAyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjEwNSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszNyAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iagoxMDYgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgODAuMCA0ODcuNjI5IDE0OS4zNjcgNDk3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMDUgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTA3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNi4zNzIgNDg3LjYyOSA1NDIuNzMyIDQ5Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTA1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEwOCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszNyAwIFIgL1hZWiA3Mi4wIDY3OC44IG51bGxdCj4+CmVuZG9iagoxMDkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDc1LjYyOSAxOTguOTU2IDQ4NS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTA4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjExMCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzYuMTQyIDQ3NS42MjkgNTQyLjUwMiA0ODUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEwOCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMTEgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzcgMCBSIC9YWVogNzIuMCA2MDIuNCBudWxsXQo+PgplbmRvYmoKMTEyIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDQ2My42MjkgMTk0LjU5MSA0NzMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDExMSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMTMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM2LjE3OCA0NjMuNjI5IDU0Mi41MzggNDczLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMTEgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTE0IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQzIDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjExNSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA4MC4wIDQ1MS42MjkgMTYxLjc2IDQ2MS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTE0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjExNiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzYuMjc4IDQ1MS42MjkgNTQyLjYzOCA0NjEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDExNCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMTcgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMgMCBSIC9YWVogNzIuMCA2NjcuNjUyIG51bGxdCj4+CmVuZG9iagoxMTggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDM5LjYyOSAzMzUuOTY5IDQ0OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTE3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjExOSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzUuMDU1IDQzOS42MjkgNTQxLjQxNSA0NDkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDExNyAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMjAgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMgMCBSIC9YWVogNzIuMCA2MDUuNDY3IG51bGxdCj4+CmVuZG9iagoxMjEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDI3LjYyOSA0MTcuOTM0IDQzNy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTIwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjEyMiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzQuNDA1IDQyNy42MjkgNTQwLjc2NSA0MzcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEyMCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMjMgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMgMCBSIC9YWVogNzIuMCA1NDMuMjgyIG51bGxdCj4+CmVuZG9iagoxMjQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDE1LjYyOSAzNDYuNTA3IDQyNS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTIzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjEyNSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzQuOTcyIDQxNS42MjkgNTQxLjMzMiA0MjUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEyMyAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMjYgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMgMCBSIC9YWVogNzIuMCA0ODEuMDk3IG51bGxdCj4+CmVuZG9iagoxMjcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDAzLjYyOSAzNDQuNjM1IDQxMy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTI2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEyOCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzQuOTg3IDQwMy42MjkgNTQxLjM0NyA0MTMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEyNiAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMjkgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMgMCBSIC9YWVogNzIuMCA0MTguOTEyIG51bGxdCj4+CmVuZG9iagoxMzAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMzkxLjYyOSAzOTEuODg4IDQwMS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTI5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEzMSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzQuNjEzIDM5MS42MjkgNTQwLjk3MyA0MDEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEyOSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMzIgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMgMCBSIC9YWVogNzIuMCAzNTYuNzI3IG51bGxdCj4+CmVuZG9iagoxMzMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMzc5LjYyOSA0MTEuNTEgMzg5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMzIgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTM0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC40NTcgMzc5LjYyOSA1NDAuODE3IDM4OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTMyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjEzNSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDI5NC41NDIgbnVsbF0KPj4KZW5kb2JqCjEzNiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzNjcuNjI5IDM2MC4yNzMgMzc3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMzUgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTM3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC44NjMgMzY3LjYyOSA1NDEuMjIzIDM3Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTM1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEzOCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDIzMi4zNTcgbnVsbF0KPj4KZW5kb2JqCjEzOSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzNTUuNjI5IDM1Mi41OTMgMzY1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMzggMCBSCi9IIC9JCgo+PgplbmRvYmoKMTQwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC45MjQgMzU1LjYyOSA1NDEuMjg0IDM2NS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTM4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE0MSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDE0Ni4xNzIgbnVsbF0KPj4KZW5kb2JqCjE0MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzNDMuNjI5IDMxMy4xMyAzNTMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE0MSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNDMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM1LjIzNyAzNDMuNjI5IDU0MS41OTcgMzUzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNDEgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTQ0IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ2IDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjE0NSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzMzEuNjI5IDM1Ny43NTQgMzQxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNDQgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTQ2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNS4yMzUgMzMxLjYyOSA1NDEuNTk1IDM0MS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTQ0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE0NyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NiAwIFIgL1hZWiA3Mi4wIDY2Mi4zNSBudWxsXQo+PgplbmRvYmoKMTQ4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDMxOS42MjkgMjk4LjAzOSAzMjkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE0NyAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNDkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM1LjM1NiAzMTkuNjI5IDU0MS43MTYgMzI5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNDcgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTUwIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ2IDAgUiAvWFlaIDcyLjAgNTk4LjkyNSBudWxsXQo+PgplbmRvYmoKMTUxIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDMwNy42MjkgMzkyLjA5NyAzMTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE1MCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNTIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM0LjYxMSAzMDcuNjI5IDU0MC45NzEgMzE3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNTAgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTUzIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ2IDAgUiAvWFlaIDcyLjAgNDk5LjUgbnVsbF0KPj4KZW5kb2JqCjE1NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAyOTUuNjI5IDUwNy40NTEgMzA1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNTMgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTU1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy43MzIgMjk1LjYyOSA1NDAuMDkyIDMwNS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTUzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE1NiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NiAwIFIgL1hZWiA3Mi4wIDQwOS42NzUgbnVsbF0KPj4KZW5kb2JqCjE1NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAyODMuNjI5IDQ3NC43NDkgMjkzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNTYgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTU4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy45NTUgMjgzLjYyOSA1NDAuMzE1IDI5My42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTU2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE1OSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NiAwIFIgL1hZWiA3Mi4wIDMxOS44NSBudWxsXQo+PgplbmRvYmoKMTYwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDI3MS42MjkgNDc5LjIzIDI4MS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTU5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE2MSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuOTE2IDI3MS42MjkgNTQwLjI3NiAyODEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE1OSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNjIgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDYgMCBSIC9YWVogNzIuMCAyMzAuMDI1IG51bGxdCj4+CmVuZG9iagoxNjMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMjU5LjYyOSA0NzguNDkzIDI2OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTYyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE2NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuOTIyIDI1OS42MjkgNTQwLjI4MiAyNjkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE2MiAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNjUgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDYgMCBSIC9YWVogNzIuMCAxNDAuMiBudWxsXQo+PgplbmRvYmoKMTY2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDI0Ny42MjkgNDgxLjIwNCAyNTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE2NSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNjcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjkwNCAyNDcuNjI5IDU0MC4yNjQgMjU3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNjUgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTY4IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ5IDAgUiAvWFlaIDcyLjAgNzA4LjAgbnVsbF0KPj4KZW5kb2JqCjE2OSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAyMzUuNjI5IDQwOC40ODIgMjQ1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNjggMCBSCi9IIC9JCgo+PgplbmRvYmoKMTcwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC40ODEgMjM1LjYyOSA1NDAuODQxIDI0NS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTY4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE3MSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0OSAwIFIgL1hZWiA3Mi4wIDYzMC40OTggbnVsbF0KPj4KZW5kb2JqCjE3MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAyMjMuNjI5IDQ0OC4wOTUgMjMzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNzEgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTczIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC4xNjcgMjIzLjYyOSA1NDAuNTI3IDIzMy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTcxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE3NCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0OSAwIFIgL1hZWiA3Mi4wIDU2NC45OTYgbnVsbF0KPj4KZW5kb2JqCjE3NSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAyMTEuNjI5IDI1MC45OTYgMjIxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNzQgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTc2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNS43MjkgMjExLjYyOSA1NDIuMDg5IDIyMS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTc0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE3NyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0OSAwIFIgL1hZWiA3Mi4wIDQ5OS40OTQgbnVsbF0KPj4KZW5kb2JqCjE3OCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxOTkuNjI5IDQzMy43NjIgMjA5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNzcgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTc5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC4yODEgMTk5LjYyOSA1NDAuNjQxIDIwOS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTc3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE4MCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0OSAwIFIgL1hZWiA3Mi4wIDQzMy45OTIgbnVsbF0KPj4KZW5kb2JqCjE4MSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxODcuNjI5IDQ3Ni4xOTUgMTk3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxODAgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTgyIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC4yOTcgMTg3LjYyOSA1NDAuNjU3IDE5Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTgwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE4MyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0OSAwIFIgL1hZWiA3Mi4wIDM0Mi4wOSBudWxsXQo+PgplbmRvYmoKMTg0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDE3NS42MjkgMzg2Ljc1OSAxODUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE4MyAwIFIKL0ggL0kKCj4+CmVuZG9iagoxODUgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM1LjAwNSAxNzUuNjI5IDU0MS4zNjUgMTg1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxODMgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTg2IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ5IDAgUiAvWFlaIDcyLjAgMjI4LjU4OCBudWxsXQo+PgplbmRvYmoKMTg3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDE2My42MjkgMzkwLjE3NCAxNzMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE4NiAwIFIKL0ggL0kKCj4+CmVuZG9iagoxODggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM0LjYyNiAxNjMuNjI5IDU0MC45ODYgMTczLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxODYgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTg5IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ5IDAgUiAvWFlaIDcyLjAgMTE1LjA4NiBudWxsXQo+PgplbmRvYmoKMTkwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDE1MS42MjkgNDE3LjQ5NiAxNjEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE4OSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxOTEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM0LjQwOSAxNTEuNjI5IDU0MC43NjkgMTYxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxODkgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTkyIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzUyIDAgUiAvWFlaIDcyLjAgNzA4LjAgbnVsbF0KPj4KZW5kb2JqCjE5MyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxMzkuNjI5IDQxMi45OTQgMTQ5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxOTIgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTk0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC40NDUgMTM5LjYyOSA1NDAuODA1IDE0OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTkyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE5NSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs1MiAwIFIgL1hZWiA3Mi4wIDYzMS41MDEgbnVsbF0KPj4KZW5kb2JqCjE5NiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxMjcuNjI5IDQ0Mi4yNDggMTM3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxOTUgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTk3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC4yMTMgMTI3LjYyOSA1NDAuNTczIDEzNy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTk1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE5OCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs1MiAwIFIgL1hZWiA3Mi4wIDU1NS4wMDIgbnVsbF0KPj4KZW5kb2JqCjE5OSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxMTUuNjI5IDQyNC4yNDkgMTI1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxOTggMCBSCi9IIC9JCgo+PgplbmRvYmoKMjAwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC4zNTUgMTE1LjYyOSA1NDAuNzE1IDEyNS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTk4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjIwMSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs1MiAwIFIgL1hZWiA3Mi4wIDQ3OC41MDMgbnVsbF0KPj4KZW5kb2JqCjIwMiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxMDMuNjI5IDQwMi4wODcgMTEzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAyMDEgMCBSCi9IIC9JCgo+PgplbmRvYmoKMjAzIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC41MzEgMTAzLjYyOSA1NDAuODkxIDExMy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMjAxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjIwNCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs1MiAwIFIgL1hZWiA3Mi4wIDQwMi4wMDQgbnVsbF0KPj4KZW5kb2JqCjIwNSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA5MS42MjkgNDAyLjA4NyAxMDEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDIwNCAwIFIKL0ggL0kKCj4+CmVuZG9iagoyMDYgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM0LjUzMSA5MS42MjkgNTQwLjg5MSAxMDEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDIwNCAwIFIKL0ggL0kKCj4+CmVuZG9iagoyMDcgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNTIgMCBSIC9YWVogNzIuMCAzMjUuNTA1IG51bGxdCj4+CmVuZG9iagoyMDggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNzkuNjI5IDM1Ni4wMiA4OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMjA3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjIwOSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzQuODk3IDc5LjYyOSA1NDEuMjU3IDg5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAyMDcgMCBSCi9IIC9JCgo+PgplbmRvYmoKMjEwIDAgb2JqCjw8IC9MZW5ndGggMjExIDAgUiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJzdvcvOLEmSnLmvpzgvME67XwAiga7KzMHMrjENcEFwxbkt2BxwNvP6o2J+Mf3/8JMt0s0iq4lCojLP8S8iPDxcXUxNVfS//Cn+CPa//wn/12f68R//8U//5fqz+KOnH7ldf1TbjxyOUVsI8cc//lj/HY8Y1n//Jzv82389x17/1e6/u17p+e//+8e/+9N//lP48T//6d//Bzv0f/8Rjvrj//tT+Hw795L/25/+3n1O/G34m/2c/pPmmP6GP+l/+VMv588htSPOOuf8MdKP1I9kx/zHf/zxb/6Xf0w/fv1/1kn9/dcfSivpaLF+/QGFH3McY1x/an92pGrvjb/8Tz+SvUkpIYT08Z847Nuf1HXa5///9ASv1/98qe/X4Tzijz5drEeY7cu/ni/1/Jfyib6+BD5N+PF//enP//Cnf/O7fWcx/PiH/3PfieXovdt3P8aPGI2rOJP+4x/+8ce//7d2sQL++eU//PiH//VPv/3D17Mq8ah2x/5NfenrZ5XwEylt2M9k/Ph//48f/+7Hf7Y/LjWc54x/GfFHS/evrNy/si+/sb7i0/7m2o9oP82BL+TLF2jfW7FfdsKHKff3Fn775Ue0n/KssfzAf//Z/hY/fnzm9Rr2T8E3ff57zOd/h2n//N11zPXv8S/n9/929caPbG/S8WrtuWgh25v39bbllx92mvg3XFf7AKFfL17PF92/g3rEgd9By6+vGX+xo4r9xY9/+52cx8j4rP0VnN8Or/mwT4AfHHm8RYeOl7cfGXX8PHLBmdhvgzm+paPGiasQuePr0YYdnyxeUcfb/VHx+vYLYo7v6QgJnz+/X4iP4+3CTTu+c19PH0du9nHIVx+4yfHpC/fph8UTXN35k5/Rx/H9GB2f/v2X/P3waSGq4NNzn2aWI61r27nf2uxHHvj0s1DH218fteLHHLkfTwz56Li6LXEnbM/kww63n1sggRiOgAuMaMQB+UgZ51DIc4gWe3GNW2U/0jwqbmF7Gw5I6ei4zKFyP+qY6jERvkbnbvqY5hFwF5dKAjnZcwbn0LjbPuZ6lCTErZjHUacQuKI9gHvDvRPJj1TKMXGlK3n7xDJMFBqQK3c3xxqPhCvdJvkOtdhz3IAa2Xfopvz4+BVbOPoQAlhs2Z7aQgSLrR8x8SEsdlMsuM51ckEp9nwUXOcSyTu6t6MhaPfKvoM9wiE3aiffYSQ7CFdhkjFj2FO8KGFs2GM8KmFspqMMJYxNe5BXJYxB6eJCF/JRa+uYY+JKp8nd0SnYsxyxu2X2HexpnoUwlkzj1yCEsWTitinyK5lKHor+Ssme6VEIYykVk6pCGEsmxHMVwliytWpNQhhLOR9tCmEsZXusCzIsFXuqKzosFXuqK0IslXZkQYklk/21CGEsVXuoRyGMpVptZSmEMXs+HwHXORTyHEz7pySEsWTiP9sdPdogf9ym/quixlK3h7pd6JgbedLdHuqKGku2Agh2R2PVyQG2BkhFCWO2CChRCWO2Cqh2qcdM5K972lNdUWNp2lPdYveo7Bv0IyhizNbvh32YEFPhzjnbSqAoYizbSqAhdI/OnXMO8+i4oyP3S8rRHuqKFsu2EIh2R48RuB+3PdCPpIixbAuBYtfZhCh5zrYQaIIYy2kc3S5yjIk852zPdEWMZVsHREWMZVsH5CBEsWzrgKKIsWzrgFaEKJaLPdMVMZZrOOzu4aNYtnVAVMRYtnVATkIUy7YQKIoYy7YQaIoYy82e6VmIYtlWAkERY9lWArHzUSzbQkDKhWVbCCAZxkcxWwg0RYvlUc90GB3FbCGw8mFsFLN1QFSkWLZ1QG5KFLN1gJQTK7YO6EGIYiUUKStWbBmAtBgdxYotA5Kixey4IytarNgyoCparCR7pCtarKR8DEWLFVsGSJmxYsuApGixYssAKTNWbBlQFS1Wsj3TFS1Wij3UFS1WbB0QFC1WbCEgZcZsrXoUQYsVpHz+4Jn+BzsT0Pd9hFjff+b4rxS/Z6SxofHxJn8OK1Kfb5btZlibKn/55Uc993d+tX9+C+fWyu/Xvlm8/uwLE9P1t9jx+f37e2cLFNih6fn1U7hX+k4OW8ngiJReyZdEel6J7jy544vdzhO7DI07vtsyJmB9yx2PTDq+X7tW76f+CRTczVjgcmcQQ8fdjJ8R+ZGiKQYcYw92Esi2jME5DPIcTED3Sh46cR9jp6FzgIXHa/1fSKAd2KK0O4IFJjLcFova+z3zlkPHG4QWyeOrLWDsLyxyk8CwFcwK8OQpWHRctyn9kUpFghsbDeQ5l4EEN36l5IWuEQluU1SRu5ORQu9rvzCRN4LF09nWMeRJt3icG9SDPOlmIQrfag7kSbduSxghfCGJ3rIQv5BEH0EIYEiiT1zp+pNY/JmxDkhx85/Ign1OK9aT5zzacW6KFfYdpq1glABm2nlkJYBN9oUnEtt89EohIbHNRy+kziuub6ncjxqp89aF6IXU+ah8qEgow0lC9DJBflyLbPKckz3ElYCKzHlNQvRC5vx6xnI3MjLnownRK5maCVmIXsl0XIpC9ELqPA8heiF1XqsQvZA674r4Qu58KOoroWhGkV+p2sM8Q2lO9h3mocRTpM5rF6IXUuc9r1QEF1uQOp+K/EqonOmoYKrkDdcrase4Q+0xDuWeC/npUTijyC8kzTtu5tnJTz/sMa7IrzRR4ilEC1TPtLnyeCTQr6I8MoAhad7sFzpq5i4DkuZdkV9ImqOk0e5M7hyyif6oyK+M8plzf5Q8aZTP4F5G+ogD7DGuyC9kzc8vqXM3M7LmU5FfFqwPlDLaKZAXzqR/VuQX0uZlCAEMafMmyC9kzYciv5A1v3aEuBCQUT2jyK9s0t++WT6AIWtOfv/IoXQhfiFdPhQBlk3zr8QGG78y6mYUAYZ0eRYEGLLlNQrxC+nypggwpMtHVeKXaf6gCLBsmv9SFuQ5oG5GEWDIl9eixK9Zkc0W4teqEBfiVzHxH4oQv4qJfyn7hYT5lcHnLhwS5lL+CwnzrggwJMwVSVhQNqMIsGLiPykCDPlyKf+FfHlVBBjy5WT+C5nyqQiwgooZRYAVVMwoAgyZcin/hUy5slxDorwrAqzUquW/TIccAwmw0t6BnyecC3I8trZa+2yvGfMPzfCjxT9OrJuiPbPp6IDAb/u38/9X1wRUXD3/f/3579+glcdr3/8QR/96Zt2fvHy7/rt+f9txvV3abxP79VGgdvLH8hiLoIFegPx6cvvVP0h71CR7OFmseyU/V+LTNJ19sF4qB5jims2A2sh3sDssIiGV7dnEAfaoQYYjTvIjlXSUa6FMAtU0HR7haZLAwO/Zbnp7NlGASa45cB3a+xX8BOoRoSoS+SVVe9LgQltY4QA7qOBCl0yes92IrUV7WpJnYLprXIlHDuj2pLHrHEskv9ReTNnZOfdAnnPvR7bldQzkD2nYgwaX2UQ8CeSjQe23UUigmbJDX00nP9K0xw00SI7kOc98xGnv0AL5S5rNlN25NCWBeVS70NEW8hRgN7MpO3uHOriTzqa7Bm5o9m5ASVrADW13BAfEdKQoRLEc65Hthh6myUlgmLITopjdzUe3zz/K4G4He0qashOiGIrSgoXuGDt50jmatBOiWLZHekHoHoE8h9ztSSeEsWzyqxchjJmuO2bkwxhq0sIQwhhq0lIVwliu2fSdEMZybUedfBjLpr56E8JYbvZMz0IYQ0laDEIYs6XjkboQxnK3Z3oRwlju9kyPQhgzOXL0oYSxEdF3K4SxYc/0pIQxVFtMJYxNe6grYixPe6hnJYxNe6orYqyg4KILYQxFaVERYyXYUz0KYayg4EIRYyXaY70KYcxu/WMoaqyg7EJRY6hKi4IaK7YQyIoasxXnURU1VlB1oaixku2pLqgx1KQFRY2hJi0qaqzYOiAraqzYOqAqaqyg6kJRY6XaQ11RY2X1pf/8W/3pUtFuBlM0FY3577+Ql4V2zx+HxdtRYC3psQex1sdIgv3dtSYGgJX271d12pcj7/X4WhB/fY1wrrM/X+PbB4tlHsXC+Cx5vH1E/7LfUXsW99LO9fIb+v3rjvYsnvisWC9TQEO+qJ8hmgOy6Yl+rpc5APmifoZoDrBb/dqX4YCOhFE7QzQHVBMU7Vwvc8CETcwZoilgoASzrfUyd3w1PWHn3BL7BsP0RD8jNAXYs7jjQqdKnrM9i+e1100Cw/TEStxRx6NP1FZ3Z4TmAJPvuM41FRLoJifaGaIpwB7FA7c8QjQH4CDcPuTh3cREPwM0BaRgYuLcwSIBU+9XKQoJNBMTuAqN+6kiJTdwmaEzKQApuSkEsZWSa0IQWym5LAQxpORqEILYSsl1IYitlFwRghj6REMUgthKyQ0hiK2cXBWCGHJyFZEbOpMDTL7jSkNncoDJ9yZEsZWUszt6kDEJObkUhCC2cnJ2oZfOpAAk5YoSxVDtbrd0ZGMGcnJDCWLIyVUliE17pNsdvXQmB5h6n0oYQ07OIvfSmQywcnJZCGPIyU270Gu5zAEm37sQxlZODnc0+0xHTq7gjsZymQNMvitabOXk7I5ey2UOsGe6osVWTs7u6LVcpgDk5BQttnJyFrvXcpkDOmz4+DC2cnJdCGMrJ1eEMIakXFTE2ErKDT6MrZycosWQk2tJCGMrKaeIsZWUa3wYWzk5RYshJ5cVLbZycl0IYysnp6gx5ORGVMIYcnKKGls5uaqEsYGNNiWMISc3lTCGnFxTwhhycooaQ6OoHcCHsZWTU9TYyskVIYwhJ1cVNbZyckMIYysnp6gxdIoGRY2tnJyixlZSTlFjKyknqDHk5LqixlZOTlFjKymnqDEk5ZKgxlZOTlFjKyenqDHk5LqixlZOTlFjyMk9WXYtIYWs3ERzTS7vP/OXrNyon1k5X/5iQTXJ5S839KX85Xmlf6Ki5evB/crhXXk8vOD9Vt/f+rMUxn4OBbVHOb+dp3ujD3Ae5ayHrq/k2/qwRQN6jiRQj44yzVoGCYxjotovN/IjmQSIqB3rgXyHVo80T7c/EhjI+Jw/Nwqw9WHLV9aYA+zmOXtMGgmgobrZTyGSJ20aIOJKt0Ce9ChHxq9xVvKkkUDHlU6FPGlbITaYUtdBnrStEEeqMK/tJNCQ8wkhcaeAlojY7A1q5H7daInIeRUhFxJoR7VIEdG8xwEWJbu9QxncOWOBOIqd8+CuAjoiAu7omMhzjhMZn7NskQJSOrLd0aNX7o5GR0Q9q0G5HzfWh82ucyzkJ7Ll4WhCFENDRMj2BqGz72DhNghRDB0RuQtRDB0RtQhRDMvDHoUohuXhGEIUQ0dEqEIUQ2NESkIUQ2NEnkIUg49QbUIUwwKxZyGKYYE4gxDF0BkRuhDF0BmRihDFOnb6lCg20lGHEsXsoF6VKGbrw5mUKDYTMj58FJv2TG9KFJv2TM9CFMPysAUhimF52LsQxbA8tHUYHcXQFhEVLYa2iDSEKIa2iKJoMawOm6LFsDrsihbD6nAqWgx9EVHRYuiLyIoWQ3dEUbQYlodN0WJYHg5Fi2F9OBUthu6IqGgxtEdkRYuhPaIIWgzLw/T+q/vpcgbrwnTX0L6RL+vC+eJM9Jew14Ux3Gu8X3+xr+ke57B6C7Emw2Lu971ei+U79y9a2aEK4QmcLx/Vv9V3dBWCd7t5+zv6/RuPqxDcFq399Vv5PH4VgtvxNZNvsArBDTChQALITqERtUcOWIXg10QVDkB2Cm1ToZLAyk5hhgD5La1C8H7W3TBAWoXgBtjSmQSQnsJ1mOw7ID1lgKkEDliF4Gi1eb9hXgDkp1bb4SSBlZ9C+1rjgFUIjutgCoEDVn7KYgN5OMrAcfdE8gOtMnA7ZVMhJIAycFyFzr5D3w1PFLDKwHH7cHdPWlXgqyuYu6HTKgM3oBfuhk6rDBwXoZEfaZWBC0EsrTJwA+JkPxLqwIUollYdeLcIk8jbbdWBC1EsrTrwyzmPAlYduBDF0qoDt3eIhTzpVQeuRLFVB46HySBPetWBww6YfPykVQeuRLFVB24Xrgfyhlt14EoUW3Xg9rXa8oUC8qoDF6JYXnXg9g4hcSedVx24EMfyqgMX4lhedeD2tZKRNa8ycCGM5VUGbm9QB3c75FUGLsSxvOrA7Vulj0cZuBDG8ioDH1CV5DmvMnAhjOVVBy6EsbzqwIUwllcduBDG8qoDF8JYXnXgQhjLqw5cCGP2+Y+giLHcIiY58GEMThy5C2EMThxVEWNw4uhRCGNIOA1FjNnnxygHIYzZSiApYgxWHHkqYcxWAlWRY7Di6IocQ8bJLhofxmwhEBQ1lm0hYIKJD2Nw4iiKHIMTRx18GIMRR1fUGDJOMwlhrKxpmEIYK7YOSIoagxNHUdQYnDiaosbgxNEVNYaM01TUWLGVQFTUWIENn6LG4MdRFDUGP46mqDH4cXRFjSHjNBU1VmwpEBU1VmwpkBU1hpRTva1vtGQLMk9PB+Ab+pJ5iuHTuCMiEbStrtNRV+rp96vE4E40tev/rwqD76bXn2mkANf8errJvL2vf7/vbHS2Sa/sR8oDo0lu40qSmAdqtYItTEgiXc5JYb5/ky/EZZ00A3seyXkncYR9g+F2ryQJ555EEmO7h3NEcf5JJFEwD+D03yWJ7aDEAdVZKJFEOdKqxin0ezgTJY5oYbuIk8SyUSKPbdtHnCO6M1IiCXTGXV68JOGslEhieylxwEjbTJwknJsSScxtJ84RM20/cZKo21CcJMZ2FKcINKQ9luIkUbanOEmMbSrOESb9HldxkijbVpwk+vYV54gUtrE4SaBcUIlssGG+rcU5wPTf4y1OEnmbi5NE2+7iJDG3vThHFPrAtg3GSWJuh3GOqGlbjJNE3R7jJDEek3EOaOiWuzziSKJum3GSQL/cZXPJET1uo3GSwODwy+iSJPq2GueIgenh4bS6JAl0zV1elyTRt9s4R8ywJT9J5O03ThKYIn75XVIE0sJBEmwoRHwsx0miHVKsRSVilQQbShEf13GSqNt2nCTm9h3niIRh4uyxdTuPk8TY1uMckeP2HieJss3HSWI87uMcUOK2HyeJsv3HSaJvA3KOqGE7kJNE3hbkJNG3BzlHtLBNyEkibxdykmjbhpwk5vYh54iOueJKZENl4uNEThJzW5FzxEjbi5wk6mNGTgJju5FzxIzbjpwk6vYjJ4mxDckpAiWK5HVAceJjSU4SfXuSc0SM25ScJMp2JSeJ/tiSc0AK25ecJPI2JieJtp3JOSIHMceGKsXHm5wk2jYnJ4m53ck5oqRtT04SVcyxIXEcJMmGWkUtx4ZixSxJtrI6l9O5WSNmWOHm/KTzX9m37HH6dKPCOT7Z42ay4naZWjN7fPNaCssvddUm5vPvHm+pG1QKF6E9qX6358V/+xemtM92o8uv7u3LcG/3IcjjHhf+in5K+LLnhZNE3wPDKQKi/54YTgJ5jwwnib5nhnNEDHtoOEnkPTWcJNozYpQE5p4bzhEp7cHhJNH25HCSmHt0OEfktGeHk0Tdw8NJYuzp4RxR4h4fThJ1zw8nibEHiHNEjXuCOEmUPUKcJPqeIc4RLe4h4iRRniniJND3GHGO6GHPESeJvAeJk0Tbk8Q5YoRnlDgJ5D1LnCTaHiZOEnNPE+eImfY4cZKozzxxEph7oDhFoFLkmShOEnWPFCeJsWeKc0SMe6g4SZQ9VZwkxh4rzhEp7rniJFH2YHGS6HuyOEfksEeLk0Tes8VJou/h4hxRwp4uThL5GS9OAqjXVsIb9H+X1Bv0/5TUG9R8GOVax0jiEmPPH1v+NzSOFzGPi4mFU7bIdYt5SOZbzJuarH/oTtG/H/j71tOp/mLPtrtz6TGveA79FzUo2as8Vdhvp+He6rtEDvZIx8Yzavpe0Q9RjawF1iso6iOJfnRse6HJgiNM8doP5azrIwl7pK/ke2QBfGf3WpEiUoCF+dloQRL2SEf6CLV9JNFQwnS2WpAElqp5NYxxgB0ULdSt6j6SsEc6rjhaxkhi2rown/V9HFESjMzPpjGSsEd6SmeFH0kMWJmfbWMcYUErtsuvmSQq3MzPxjGSGLAzP6v8OMJiXsMl/+nt/kkUGJqfdX4kYc/0szqBvct7PKJd81XpRxLlyLjmqFgmCYthdpevkmWOMMXbphTfTPKOJsW3Yc90u+aoWuaAaY/0IIW3mY9sOm7VLZOEPdOLFN9M8na75JEF4Mw5hhLesN8ZENdRu0wS80i4y1G8zBExHXkq8Q0bntXu8lW+TBLj6FmJb/DntJM+C5hJoh6hK/EN257JIvsqYeaIHLcfPUmUoyKyo4iZJOzpX5X4BpfOmZT4hn1P03pCfMO+Z2pKfMO+p+l9Ib5h37MFJb7Bq7N3Jb7BrHNK+g37nlHSb9j3TEOIb9j2LJJ8w7anPZWF+AbHzi7pN1h2zqbEt5EwD1CJb8Oe/kGKb2NgIqAS36Y9/SX9BtvOEaX4hup5Sb9h2zNWJb5h9zNL+g27n2Uq8Q3enU3SbzDvHFmJb9j9DJJ+w/ZnlPQbtj+zpN+w/Vkl/QYHzybpN3h4Dkm/YfszSPoN259R0m/Y/sySfsP2Z1X0G4w8u6Tf4OQ5JP2G3c8g6bevu59SFmB5ed4NXG/oa74E/jbf8yXN5UtiCEhtLJPxK52R6te/++MMyZ7B446O3/7sX5Y4iUc6M0Px9Xz2O32Q1VU5vpHfLw+K0OvTlsIQqwj92TLnCIv0TwcIRwxX5UgR0b6zpy2FI8qucuSA7qocKSIhdRuu4m2OyK7KkSOQug1X8TZF5LCqHLlj81GethSOaK7KkSMsQjxtKRRhwXRXOXJE21WOHACjjXC1pVBETa7KkSNgtSF9qjpclSNFYDLZU+XIEdVVOXLEcFWOFNGjq3LkiOKqHDmiuypHihiw3JAi2yiuypEjuqtypIgZXJUjR+Rd5cgBzVU5csR0VY4MgZKUXeXIEc1VOXLEPMjrgHzMrnLkiOqqHDliuipHikjJVTlyRN1VjhwwXJUjReToqhw5orgqR44YrsqRIlCGHpTAhnTMrnLkiO6qHCkCZehBCWxIxwxJsqEWZVc5UgTK0CXJhnTMrnLkiOY6iTkCPhxKYEM+RtKRqEUJkmRDFXrKUmBDFbok2ZCPqV0KbGOsTmLqWBSgJymy2aohSJINBejpaUxhCGRiiiTZVh26Io6QiOlNiWxIxExJsq0y9KBENiRikiTZkIgpkmRbdeiSZEMipkuSDYmYKUk2lKFESbIhEZMkyYZETJEkGxIxTZJsqw5dkmzIxExJsqEOJSqSbZWhS5INiZhx271JWYWVh7l9397I1zxM7Z95GD/rGLYoKxGDP7iKzdPfncXnK52yVl+//IhnqfqyAPnFbvLF/PkXW44/Q45dtctTwnK/fPDTj7/8xa9nemYZ/sQzLXOnaeLHwf+iGSwjukLbl+/FvdUHWveYtFf0c4Ex9pw0jsAD4xqURgJ1T0ojibFHpVFExvPinpVGEmUPSyOJvqelcQQeGPe4NJIoe14aSfQ9MI0j8MCY18Q0ksh7ZBpJtD0zjSPQuHQPTSOJvKemkUTbY9NIYu65aRyBB8Y9OI0k6p6cRhJzj07jCDww7tlpJFH38DSSGM/0NA5A2eM9Po0kyp6fRhJjD1DjiB6fCWokUPYINZLoe4YaR4ywh6iRRN5T1EjCFopNim8oAcpSfJv5KEGKbygB6lJ8QwlQUeIbqt5nVOJbQQ3QUOJbQQ1QVeJbiQmO1UJ8g0linUp8Q9V7b0p8Q9X7zEp8K8me/0GJbwU1QF2JbwU1QEWJb7BKbFGJb6h670OIbyh6n1WJb6WgAFiJbwUlQJJ+KygBUvQb7BKbpN+wdoj3hBtNwaLofV458lf0Y/EwztEWH4e5tUOEGchaCPzF/vn12pP9PexxjF+O+jqfI/12if9wLjDOhcTbIMfPndm8Np7Wuvn1U/r3/WD7Nrh/Zb9/6xHWnLfDPUlktEycZdcc0LbFPUlMdExcZdcUAXfO21aVJBrCxVV2zRFz29xzRMO4ymtaB0nUbXRPEhhYec3r4IiOiZXXwA6SqK7LgiMws/Ia2cERI263e5LA1MpraAdJIDRcRtEcMTG3co3tII8v2++eJPo2vKeIFDC48prcQRJ5e96TBEZXnrM7OCCGbXpPEhheeU3vIIm2fe9JAuMrleiWEuZXCtENfSuP8z1JYIKlEt3sJtre9ySBGZZKdEt5bPd7jigYY6lENzSuPP73JIFBlkp0SxWTLJXolmrZFvgk0bcHPke0sE3wSaJsF3yS6NsGnyN62D74JJG3ET5JtO2ETxLzscLngJG3Fz5JtG2GTxJzu+FzxEyPHT4J1O2HTxJjG+JTBBpXHkd8kqjbEp8kxvbE54gYtyk+SZTtik8Sfdvic0SK2xefJLyTDkf07YzPETlsa3ySyNsbnyTaNsfniBK2Oz5J5G2PTxIYdKnEN6Q8W1HiG1KeQ9JvSHlOSb+hcSVWIb7lhmGXSnzLDdMulfiGlGeT9BtSniML8Q19K0GSb+hbiV2Kb7aKyEWKb7aKqJJ+Q8qzDSm+zbAHSZJEgV2JEt9sHREl/VZsHZGbEt+KrSOqpN+Q8uxBiW9IeY6uxDc0rgRJvxVbSCRJvxVMiJD0W8GECEm/IeXZJf2GlOeQ9BsaV4Kk3womREj6zX4cSNfz8a1gQISk35Dy7JJ+Q8pzSvoNjStB0W8FAyIk/YaU595511J9q2DiHo79msx8c+3DWMTv7/Fnn/S0q51XqvIvv/zo5wBh1Cn0nbhMdytKWY0r37IZweIv2ucyStve3s29ywdr54mOjPEz9iN3gkmyKOtvhQQwSfaaZU8C9iA9S4o7S4w9zZ4jMEsWV7Kxb5FgwIyzqCwwTPXX8yCOwDhZOPy3wn4ozJO9J9qTBDwKcRojkgQmyt4z7UkCJoWrpIz9rkrfY+05AlNlccVrYT8Vxso+9y5HtD3ZniTQE4eR6vSvBLso92x7koBLIcqV8GzgiLmn23MEhsviHu+T/VSYLnvPtycJuBRizHliPxUOuifck0TdI+5JAi6FuKMC+x4YMTuV8IYRs00Kb5gxm5Xwhl4+ZOPo8IZWvtivofMkAZNCJb4hXV2jEt+Qrm5DiW9IV4+qxDf08l2NpORdjl6+OJX4hny1hR0hviFfXbMS35Cv7kGJb8hXj67EN3T0haLEN3T0pajEN+Sr81DiG/LVtSrxDfnqnpT4hnz1mEp8Q0tfwG0+K/seGDyblfiGfHUJSnxDvrrafT5GZ+9BzJ5V5BvS1XZnWLCK7I8dw2cl+YaOvmS3eYyTPfEBl0IpwGH+LAL7YK8G5s/iLo+JPXEMoJX0Gzr6dsEGR6DhVYlvyFcXu+KxkB8K6eomyTekq7vd5DF09j0wh1aSb+jri5J8g89Smqc1JUlgFK0k35CubnaTj5bJnxXS1UOSb0hX28HBFhTsmWMcrSTf4LOUoxLekK4uknxDurpJ8g3p6pGU8IZ09VTkG/r6YlPCG2yWsiTfkK2uQQlvSFc3Sb8hXT2KEN7Q1oeHMh/e0NYXJfmGdHWuSnhDurpK8g3p6jaV8IaaF0m9oa0vZCm8wRpEUm/IVmdJvSFbXYsS3pCt7pJ6Q7Z6DCW8obsvSOoN3X2mqIXwhmx1ltQbstVVUm/IVndJvSFbPSX1hu6+IKk3dPdJyTckq4uk3pCs1pJvSFZ3Sb0hWz0l9YbmvqCoN/T2JUm9IVmtZd+QrW6SelvNfbZw/mmw+nlqFyNm7Al6OcS/sK/J6vnmxvQlWT2uzrn81N6icPpyVIp7jMxtU/291nYmV5Xz8nb+bb6j3YTpvfB+Qz+T1cEpU47IS5mGHGmimTLFghVbkxSBur1rYDNL5KVMLUa+X6MXojllyhET1ePXwpsiULf3KFOOQJPpvfDmiOmUKUWgcO9JLHJEdcqUI4ZTphSBwr0nscgRZStTDhimTO/EIkWgbu9RphxRTJleiUUO6E6YUgTK9p7EIkeUIzyJRY7oTplSBMr2nsQiR2SnTDmimTKV4lufTppSBOr2nsQiRzQnTTliOmlKEajbexKLHFGdNOUIe6QMJb4lFO5VJb4lFO4lJb7BEW9LU4qI0aSpEt/giLelKUd0J00pIkWTpkp8SyjcK0J8gyPe3hemiBycNOWIvPeFOaA5ZUoRJbiNYY7IbmOYI5qTphwx3cYwRdTkNoY5orqNYY6YbmOYIlo60pNZ5IjqNoY5YriNYYro8ehPZpEjitsY5gh7/D+ZRYpA4Z6k3+CLV57MIkd0tzFMESjcezKLHJHdxjBHdLcxzBAY1ZifzCJH5L0xzAH2+H8yixwx3cYwRaBu78ksckRzO8McMWHecC69KQBle09mkSOq2xjmCHv6P5lFikDZnqTfMKox3plFDhhuX5giULaXlfAGd7wuyTe44w1JvmFSYyhKeMOkxiTJN7jj5aGEN7jjVUm+wR2vJyW8wR1vSPINoxr3vjBHZLcvzBHN7QtzxHT7whQx0t4X5oDq9oU5Yrp9YYqwdcTeF+aI6vaFOWLsfWEGgEXe3hfmiOL2hTliuH1hioCxtiTf4JH37AtzQBezb7DI65J6g0XelNQbJjVGSb1hUmOS1Bss8rTsGyzymqTeYJGnZd9gkTcl9YZRjVr2DaMas6TeYJGnZd/gkadl3+xXa8/yMpcNn5ZzRhp9jyB6S4+/pNGRB/g8Lrg0OvrckCpfMwfamSq/q76fMQXese4h3q0xPhKU/ah4cXTkvn0a/5pvqcpRzhGgr+xn5rEe4TLUZYlxpMuPlSSQq7TrN3tkPxVylS2fM0BJomPQlh1UM0nYD2viurXJvgeSlRgegBnHJNGPBAf6zAImMcptzUISGT/yZRXLEu3oNa8RxyQwMWbLrsbsJIFU5bw2sEiiHQkmoBhxTBLzKBlXo7PvYRKj4YpjxDFJ1KPjiqfAflfoMb5mDnAEUpUx2nc1CvmpVqoSlxwjjkliYM6WXY9O3uVIVTZcc4w4JglbrcC6FyOOSaIfE9fcniMkgaiXlfiGVGUOSnxbucquxDfkKltR4htylSMq8W0lK4cS35CsjFWJb0hW5qTEt5WsnEJ8W7nKpsQ35CpHVuKbrSIO3ON0fFupSrvL1wh3jkCLcVHiG1KVNSrxbaUqccUxwp0j0GJclfiW0GNsd/ka4U4StlqZUnxDqtIu+RrhThL29M9SfBv29Le7fI1w5wikKrsU39BjXKT4hmnbdpevEe4UsVKVkn5DqrJaZMcIdxKwp78k31aq0i75GuHOEUhVSvINqcqEwD46e+LRHv+4yyP5q1qpSkm9IVXZ7S4fI5C/daQqpyTfVqrSrripavbE0WGsyDekKktSwttKVUrybaUqJfmGVOXMSnhDqjJK8m2lKrsS3pCqLJJ8Q6qyRSW8rVSlJN+QqpxVCW9IVUZJvq1UpSTfVqqySeGto05JCm8DdUpKeEOqUlJvSFXGIoW3iTIlKbwhVTmk8DZRpiSEN6QqhyTeVqpyKuFtpSol9YZUZc5KeEOqsirqbaUqJfWGVOWQ1JuFzyNI6m2lKiX1hlRlltQbUpVVUm8rVSmpt5WqlNRbKShTUsIbUpVJUm8rVSmpN6Qqq6TekKrsknpb/hR9/DxY/TxxV5Z93TXQ5D0F+ZKqjC/WvX/xqUqoqpWqjOcgj9tf1w3w+HLct8rgcqYpkbL8ehwSmcvUoj11w7+fVhf3iJDbwfcjeTjtSx3Xrffy+f37vCQFQw3nfs8r+5YUTOk6iCMaLP7iWa9DErD4i+eGD0nA4i+e9TokAYu/NbZukESHx18463VIAh5/4dzxIQl4/IWzHpEjBjz+cFBjP9WAyV88d3xIAiZ/8axH5IgJk7947viQBEz+4lmPSBIw+Qvnjg9FwAcAezGrHpEkYPIXzh0fkoDJXzjrETkiwuQvnDs+JAGTv3ju+JAETP7iWY/IEQkmf3FtaJMAPP7WhDjyNocPAL7YtaHNERkef2HVI5IALP6U+IakYLkPIglY/CnxDTYAIyrxDTYAcyjxDVnBWJX4hqxgTkp8QwVjmUp8gw1As7t87WhzRIPHnxLfkBZcj2U6viEtaA/uc0ebIzpM/pT4hgpGuxznjjZJwORPim8DJn/x3NEmCZj8SfFtwOTPzhw72hwxYfInxbcJkz8pvk2Y/IWzYIckYPInxDdkBS18ngU7JAGPPyW+IS2Y7TZfBTscEeHxpwQ4GAF0BPZBXg34AAzc5SjY4YgEiz8lviEtaMH9LNghCVj8KfENA35rP5sHSQAWf0p4gw3AjEp4Q1owSPINacEkyTekBW19LoQ3zPetknyDD0BvSniDD8CU5BvSgvhu+fCGtGCS5BvSgqUo4Q1GAE2SbzAC6JJ8gxHArEp4Q1owKvINWUGL1Ep4s3VEkeQbjABalsLbtKe/pN9gBDC7Et5sGRGLEt6QFsySfENasAwlvMEHoEnyDT4Ad280CeRjSuoNacEoqTekBbOk3lDBWCX1BhuAJqk32AAMSb0hLRgk9Ya0YJTUG9KCWVJvqGCsknqDD0CT1BuMAIak3pAWDJJ6Q1owSeptpQXvoctizmvZ1rZ0zsB7zfd9zwuOZUD3eZhPC9rlXkm7Na34N1ePiOb/dP7jqxlXqu+3b29kij9jql3D9/Dylv6tvn/GeEyk+Cd+oG/o96/QondAuhfVS9TxY5fdMcfDCPLZtqWA4oruKKDvmjvmeNgfTGznZPITRQvbAan9+LPr8Un0I2GX3p5YJGFhuyC1P/Dc5Yh8NFzqltgTt/tgl9xxxHQldxQBG8in5I4jmiu544jpSu4oIidXcscR1ZXcccRwJXcUYXF7l9xxRHUldxwxXMkdRdToSu44oriSO47oruSOIlp0JXccUVzJHUf0XXJHAT24kjuOyK7kjiP6LrmjgGHLo36XFHNEdiV3HNFcyR1H2JN63CXFFAFLnGfTliMa+hmU+DanK7ljCJQU56bEN2w57pI7jhhHD0p8w97BLrnjiOpK7jjCnvxRiW8oKd4ldxxhD/+qxDeUFO+aO4rItkCaSnxLubiaO46w539W4htKiktQ4htKinfRHUfY81/Rbtg8mJJ4S9UWSJJ6Q0lxUuQbSop3zR1FtORq7jiiupo7jhiu5o4i4AMZlPiGkuJdc8cRw9XcUQR8IJ+aO44oruaOI7qruaMIDD+V9BtKipOk31BSvGvuGAIlxU3Sb9g8eGruOKAdU5JvGTZqT80dR2RXc8cRzdXcccTcNXcUABc1Sb1h72A+NXccMV3NHUXARe2pueOIumvuOGC4mjuKQGeiJN8yOhMl+ZbhojaU8IaS4izJN5QU75o7juiu5o4iYKPWlPCWUT4mybeMzsSghDeUFGdJvqGkuEryDSXFu+aOI6breKUI9CZWJbyhNVFSbygpzlMKb3BRk9QbSop7lsIbWhODEN4KTNQk8VbQmViU8IaSYi31hpLiOpTwhpJiKfmGvYMpqbcCDzVJvaGkOEnqDSXFRVJvKCluknrD3kGX1Bv2DrTsW0FjoqTeUFKsZd9QUlwk9YaSYi37hr0DLfuGvYMpqbdlIpyL3bM/uz1+nmVfLsIdexU/yb3Gv3xojTWl/OM9vtof1KumOPs6Yoy7u40Pvh13bTLchgcrMwjbhMt7+LNGODlX3tfP417/I7/pxpm/sp8ZUTfOnCQwzhyuyT/7vj7zm26cOUmg1hnjSVtjCTfOnCMqap0xgJE93g0zJwk3zJwkUOmMq9HZ92humjlJoNIZ42UjC7hh5hzRUehsRMcGN0e4aeYkgUJnXI7OfqqBQmdMl2V/t8MNMycJ1DkbkSt74tMNMycJ1Dnjcgz2Hp9umDlFoPo64pK3RH5XqL5+hpmTBOqcjUiV/VQRdc5KdMMYtmeYOUmg0FmJbqi+foaZkwQqnZXohvLrZ5g5SaDSmY9uGML2jDInCTfKnCRQ56xEN1RfP7PMSQJ1zkJ0wwy2Z5Q5R1SUOSvRDcXXzyxzknCzzDmiuVnmJOFmmZOEm2XOEd3NMicJN8ucJNwsc44YbpY5SbhZ5iThZpmThJtlzhHTzTInCTfLnCTcLHOKwBS2Z5Y5SbhZ5iThZplzRHSzzEnCzTIniT3LnAOSm2VOEm6WOUm4WeYckfcscxJws8xJAnXOSnzDELY6lfiGIWxdkm8YwmZ6UohvqL6OknxD9XXqSnxD9XWR5BumsLWoxDdMYeuSfMMUtlmV+Ibq65iU+Ibq6yTJN1Rfl6bEN4xha5J8wxi2EaT4NlDoLMW3gUpnKb5NVDpL8W2i0lmKbxOVzkJ8wxi2Iek3jGFD0ycf31B+HSUBh/LrnIX4hvLrKuk3TGFrkn7DFLYh6TeUXwdJv6H8Okr6DeXXWdJvGMNWJf2GMWxN0m8YwzYk/Yby6yDpN5RfJ0m/ofw6S/oNc9i05BvmsHVJvyGFiiyo/dp/8ql+nk5ECjXaD3OO9B4hXlOo9Z8axJbO6utyVlav1Gm9EqK/eVuG87jUXWr1M1maXPfTyzvvV/ogu/0iAs4tv5Ofic9gv4i7MZsjbKF/Ny5yQLMfxN2YzRFwlAhXZw9FoKMZ3Q6NfQtTRdt4giOmM56gCDQ0P8YTHFGd8QRHDGc8QREtOuMJjqjOeIIjhjOeoIgenfEERxRnPMER3RlPUMQIzniCI4oznuCI7ownKGIGZzzBEdkZT3BEc8YTHDGd8QRDpJCd8QRHNGc8wRHTGU9QREzbeIIDqjOe4IjhjCcoIqVtPMEB1RlPcMRwxhMUkaMznuCI4ownOKI74wmKKNEZT3BEccYTHNGd8QRFVFTsK/ENB23jCY7ozniCItDR3O/WRY7IzniCI5oznuCI6YwnKKInZzzBEc0ZT3DEdMYTFDGSM57giOqMJzhiOOMJikBLs6Lf0qzOeIIjhjOeYIiMlubHeIIjijOe4Ii+jScoAB3Nj/EERxRnPMER3RlPUEQKzniCI/I2nuCA5ownOGI64wmKQEezJN9ybs54giOmM56giPJPLb0+ieqMJzhiOOMJiqjJGU9wRHXGExwxnPEERbTojCc4ojjjCY7ozniCInrcxhMcUJzxBEd0ZzxBESM44wmOyM54giNQsa+Etxmc8QRHZGc8wRHNGU9wxHTGEwyBktbHeIIDqjOe4IjpjCcoIiZnPMER1RlPcMRwxhMUkaIznuCI6ownOGI44wmKQIGfpN4KCvwk9VZyd8YTFIECP0m9FRT4SeqtoMBPUm8FBX6Keiuo8JPU20quPlvESvpxpVafDYK3lOn31OpYHW932HqO8onVnHxidSVM22VhgapT+Nh+G9T1am0x5rHG6yVk8D/fc7/XNw7tXPWV+P69oY0rooINtfjE8bCDqGN1LL5/pE8g//E5fALL4gqZicgBEcOwcQ6FPIeIWdg4h0Z+JHRwnZXlLLDsrXDVyXNIGISNc+ivv64XAHOwcQ6Tu9CwgYi40jUmDsiYgg1vFGw5UMCytrJz7uRJo3nr8aNhgLKMrTDxjjzpgu3ecG25UAAGYOPHlMmTRuNWuP2yKQDjr3EdeiYBTL8WPhGatpZvTibPuS1LK3sCFPYdsM+Ly9DIc+7L0Aq7T+Q5o2GLPBIDr5UAhj6trAQwtGnhCpdK/qwHpl1jF7yRP2t0aVUhWMzlYGX3TSLPeWJfV4lfc/lX8R8JRg8hCfELPg+IRnT8gs1DbkL8gstDzUL8WnPjohC/YIN11uOR8QsWD6vzhI1fcHhIz5YxBWDCtRC/4O9QqxC/YA7dkxC/4A0tfSKTsEsYsfEL1g7ofabj1xoWF4X4BWcHlF7Q8Quu0J28xGjFUhQYHB2CosBg6HDOoO/kOzTMsxYC2JoQp0SLjmnWdsozsEA5piLA1nS4lezI5GUYGGWtBLBhz/G67kzyHAYmWSsBbIajI2qvjA0FYI71vHr0KKAfURFg8HA4o3znbjVYOBRFgMHC4TIZ4C7cGgqnCDCUH6+2hDDJc4gYYM0HMLg3ZEWAwb2hjNXWzYUXmDc0RYDB93kktLlULgRk9qOb5l9dl7mQH900f1bk1xoBF4XoBavnpsgvOD0PQX7BqyFEIXrBqiEq8gtODbkK0QtGDVWRX2v0WxCiFyyehyK/4NJwee+RJ425b0GIXvBoyIr8gkWDaQQheo3kKvYooGLzTYheJv2DIr/gz2CaTYhepv2VBS3MGaoiv2DsfHnucCFgjXtT5BesGc4mPTJ6wZmBzH/BkqEkIYDBkkFKgMHNuSvyC9XEU5Ffa8SbIL/gxpAU+QUzBin/tca7KfILNs5S/gtlxFORXzBikPJf8GFIivyCDUNR5BdcGKT810pyP70hQj4YOe7d6vKSvP6eeMa93/vH63v/BYvv8x7Vdo1e+xUZ/su5Gb9HBOe//PKjnyPdnmFsT0r8NmK4ao2RA1l5kL+76pH7+ZrLBRp/1/Y/f/yu+Uqu3+RTzXwNhZvnULjPdQxMru+hcC/nv8/7g+yuZ+CFfFsC7ZYBCiiuY4ACumsYYIARXL8ABWTXLkABzXULMIAtgXazAAVk1ytAAc21ClDAdJ0CBIAmzN0oQAHVmXRQAETE3QbFALYE2hYdFAARcTdBUcBwFh0MkKLbv6MAUxF3hyd1/HD2HAyQTUQ8/Z0UUJw7BwVASlzdT8zxJThrDgqAkri3NimgH2EKYQxdl9uYgwJMSmQhjKHncttyUACkhBDG0HG5TTkoAFJCCGPot9yWHAzQISWEMIZuy5aEMIZmy+3HwQCYldCUMGZroe3GQQHjyEEJY5iW0JUwNsvRihLGZndeHASANsttxUEB9livfBhDj+X24WAAjEqYQhhDi+W24aAAe6pnPoxhQbQ9OCgguwoNCmjOgYMCpjPgYACMSFDUGForh6LGsCIKihrDiigqagx9lVlRY2irrIoaQ1dlV9QYmiqHosawIoq9XhWHimLHQBvsGJ2r7E/ydUk05sdhvp8yj+OcWf1XWvRgD33VD9X9WuvP2vVPdA2av1/NnP7YP1wWYVsSZTrhccdL9+tVzNT+6bIJ1cTbzfvzO3LfzQc5XeP7C/n5cE+77506vrq2dwoYruudAUw97KZ3Cqi75506friWdwawpeXueKeA4havFDDc4pUBTDzsxSsFFLd4pYDuFq8MYEvLvXilgOwWrxTQ3eKVACAe9uKVArJbvFJAc4tXCphu8coAMbnFKwU0t3ilgOkWrwyQklu8UkB1i1cKGG7xygA57sUrdXx1i1cKGG7xygAlusUrBZS9eKWO727xygA1uMUrBRS3eKWA4RrwlOdWsaBvyv1KV7+oghfxgG6x74f5fGq7ZuH9rYoH7GDG2wHi95evcw3rDs2CfM1vZ+vO8oMce6TSG/mZSIx7ohIH2MrvduTngL7nKVGALUbD7cfPAWVPU+IADDq87KoZANUazywlDsCu8GVWzQFtT1KiANRq3078HJCPdBvxc0DbY5Q4wNZ+lw0/dTxKtW8Xfg7ApvBlws8Bc09QogCUat8W/BxQLX6dDvzc8WNPT6IAe5z023+fA8oensQBpkFv930KqPEZncQdX/bkJA7oe3ASBbSw5yZxQN4LLQ7oe2oSBdha+RmaxAF5z0zigLZHJnHA3BOTKGCkPTCJA9qel8QBc49LooCZ9rQkDqh7WBIHjGdWEnN8WccIUQz9h8+kJA4Ye1ASBcS45yRxQHnGJHHH9z0liQJS2EOSOKDsGUkc0PeIJApAvXbgoxhKN54BSRzQ9nwkCkC9tqLFMEQjKloMpRtZ0WIo3aiKFkPpRlO0GEo3hqLFVqISUh1VQJI4xlrDDp6jjNff1OtaA1Pqvx3m+xPtsVD/ltcat9PcMw/8c61hF+z5Oj/P1p3lB7mau88Cujfy863m039FHT/S7r/iANi3XwV0HDB3/xUFTJi3XwV0HFDtq+OOXO3cZ/0cA+AX/PRfccBq5v75pf4Exu6/ooAYn/4r7njYtV/1cxzQd/8VBSSYtV/1cxxQdv8VB6wm7rN+jgJy2P1XHLB6uMOqn+MA+LRf9XMcMHf/FQUUuLRfBcAc0Hb/FQdg4NpVAEwBNe3+Kw7AuDUhfmFH4+6/oo5vafdfcQDc2YX4hR2Np/+KAjrM2YX4hR2NTl4AbP0lJYCNuPuvOKDs/isO6Lv/igKwlxGEADbz7r/igLb7rxgAWxlP/xUH5N1/xQFt919xwNz9VxQQ0+6/4oC6+684YO7+KwpIafdfcUDd/VccMHb/FQXkuPuvOKDs/isOGE//FXV8ibv/igPK7r/igL77ryight1/xQHkTw7LitsXWtLBa1lxdfS8rhfelhXppXLcLSuKPWn+lpcVKHBYr/vr+Tr3sekv13Hdf2LsxKa/e5Vzc+9xvnwn7rv4+A6hieppfvRGfso0zKFtp/cRB+Cz1dP6iAJgaXcqkEYC0ETt3DXjAGiievoeUQD87HB/wfaIA6CJ6ul6xAGYQNtO0yMKqBBF9fQ84gAMoG3L8og7Hpqono5HFNAwfbaefm4cAE3UTjs3DoAyumqrKAA9DXaVcQx3PIRRPb3cOACDZ9tp5UYBsLDDkDo4uXEAxs4usUb+uGFgZ9cZPm7U8fCvs+u8bNw4ACNn2+nixgEQRvU0ceMADJxtp4cbA8C7rk8hii3vuiZEsWVdl4UotpzrghDFoNVKF6LY8q0rQhRbtnVRiGJIHs8hRLFlWleFKLY865IQxaDVyuSj2DKsa0IUW351WYhiy64uCFEMWu2pEKUAmNUVPootr7ooRDGUncxaLjGoyAdotoYFA+qMXsXYi2bLH6WtUEBbs8W/ZcX2T1Ws4jPc40rWcfd7vYmQx0bg5Tt5vou3lNGz2n/hXlNG7Q/e6C1ltFf7DIDNCnxnWO1Tx1e32qeA4Vb7DIAa2Ge1TwHVrfYpYLjVPgOgCPZZ7VNAcat9Cuhutc8AKIJ9VvsUUNxqnwK6W+0zABJHz2qfArJb7VNAc6t9AliZo3u1Tx2f3WqfAppb7VPAdKt9BkAN7LPapwD2hed2W6EAlL5mIXqt0tc/CpOv+aIuRK+VL7o3W6jj63Zb4YCx3VYoAPmiKkSvVfqahOi1al+DEL1WvqgJ0WvVvj6bLRQw0Gljd/5Pfns/eR6uytfLH+SNe5Ug5aNAdvm1PbvR9v3/TYuQdP7Zfez6ol93pcdA9dRZaf5y1u5sv5MzuSzMC/nxVrO6LAwFDJeFIQBs1O4sDAUUl4WhgO6yMAwQo8vCUEDZWRjq+O6yMAyQgsvCUEB2WRgKaC4LwwA57CwMdXx2WRgKaC4LQwHTZWEYoCSXhaGAurMw1PHTZWEYoCaXhaGA6rIwFDBcFoYBLJDsLAwFFJeFoYDhsjAM0KPLwlBAcVkYCuguC8MAI7gsDAVkl4WhgO6yMAxgontnYSgg7ywMdXxzWRgKmC4LQwAQ3TsLQwHNZWEoYO4sDHO8ae6dhaGAerQhRDEkAEcVohjEd0hCFIP4ti+UjmLQ3rkJUQzau2YhiiH/14MQxZAAHF2IYhDfoQhRDOI7RSGKQXznIUQxiO+qaDFkALuixbBr+xjaSToR8nu0OwP4Sb7K7/ZRM3r+Ku83Kqf8/q+Xl7utuW6R/k9l8Z5yz7rby/6ZvejLxGqms2H15czdGX+Q9ix61OgL+flW/aiPGmUAGPreapQ63h5FjxqlgH6ER40SwPLzfdQoBdij6FGjFNDselxxnDoeI0/uOM4AsPN91CgF2KPoUaMUMG1Vd8dxBoCf761GqePtUfSoUQoYR3/UKAOg3/hRoxRgj6JHjVKALX0fNcoAaDh+1CgFFJR8X3GcAuxZ9KhRBkDH8aNGKQBT2W81SgH2LHrUKAO0cJRHjVJAPloVotgy9k1CFIOZ1Zx8FEOHWGxCFFu+vlmJYvD1DUoUG+loXYli8PUtQhSDrW9UothMRxxKFIOtb1WiGHx9kxDF0CHWJh/F4GQ1mhDFlq1vFqLYsvUNQhRDg1juQhRb5r5FiGLL3DcKUQxeVrs+iwK6ywwyANx9kxDF0CK2M4MU0FxmkAKmywwyANx9FS2GFrGgaLHl7itosWXuq2gxdIhVRYutUs57MqmkXFcp59Op/Em+Lgr6R8Vn8lZWI/z3XRLco/OWq++Vc1+bpx+at/hd1c+zes7mg6uPafYb9vk+yO2Hc+gSBdS4TbM5oOyhcRzQt2k2BZiaeEyzOaBs02wO6Ns0mwJ62KbZHJC3aTYHtKM/u+gUgGV1uHbRGWDkIz676BTQ9tA4DpiuaZEBTE88TYvU8dU1LVLAcE2LBAAb5N20SAHVNS1SwDi47x/7SLtpkQKKa1qkgOGaFhkgRde0SAFlNy1Sx3fXtMgAObimRQrIrmmRArprWmSAElzTIgVk17RIAc01LVLAdE2LDFCTa1qkgOaaFilguqZFBmjJNS1SQHVNixQwXNMiA/S4mxap46trWqSA4ZoWGWBE17RIAcU1LVJAX02LzKEzuKZFCiiujJECuitjJADUbe0yRgrIu4yROr65MkYKmK6MkQFidmWMFNBcGSMFTFfGyAApuTJGCqiujJEChitjZICc/lhwfwLVlTFSwHBljAxga4CmCDBsIg1FgGETaSoCDNbHURBgKODKigDDcjFh8u3q/OPXPfA9Tvnu+/vkXheL47NI/c8WCbtbMKIu7K+7ZPxZ996XUq++P9r693TvFGX7kHktaheH3r5qf3LaoNTws4Iuu5tuz7CXL2Gf+Itgf4xW38g3wf4YrXKAmxLCAW5KCANAsT9GqxzgpoRwgJsSQgHRTQnhgD0lhDveTQmhgOSmhHCAmxLCAXtKCHV8dlNCOCBvo1UOcFNCKKC4KSEc4KaEcICbEsIBbkoIBVQ3JYQD3JQQDnBTQiiguSkhHOCmhHCAmxJCAd1NCeEANyWEA9yUEAoYbkoIB7gpIRzgpoRQwHRTQjhgTwnhjndTQhhgqfcphLGl3psQxiDf7ykh1PHRTQnhADclhAPclBAOcFNCKCC5KSEc4KaEcICbEkIB2U0J4QA3JYQD3JQQCihuSggHuCkhHGBPdUWNQb0nRY0t+a6oMcj3gnzC2kNTpOUp4Mu1Sv0kU3gR8PN9lqP3H8crQQzfxVjLGKNehVgmu1eQrqd0XuL9keW3jF5yP1//hD2VcZVsfX9VP8vRPgZuq0e0f0jX1I5wZahez2V//u8kiuEfhflCfrwVquEfhUkB7Sj4Tkpn38GiyCMxGQDV8Cv7H8nj7Zt4FCYFWBCB8OhIlDAAquEfiUkB9SgQHrmTH6laEHkkJgOgGv6RmBRgK4NHYlLAOOIjMRnAtNAzdJUDbGnwSEwK6Ed7JCYDjLAHyHKArQ0eiUkB/YiPxGQA00LpkZgUYGuDR2JSgK0NHolJAfMYj8QkAKyU5yMxKcDWBo/EpIB55CjEMZRFPpOVOKA+k5W448eerEQBtlJ+JitxQN2TlThgPJOVqONRDh+EMIYJn89kJQ5wY4EpoLixwBzgxgJzgBsLTAHVjQXmADcWmAPcWGAKaG4sMAe4scAc4MYCc4BP+DFA9wk/CvAJPwrwCT8GGD7hRwE+4UcBPuHHANMn/CjAJfyo433CjwBQFrkTfhTgE34U4BJ+zPHRJ/wowCf8KMAn/Bgg+YQfBfiEHwX4hB8F+IQfA2Sf8KMAn/CjAJ/wY4DiE34U4BN+FOATfgxQfcKPAnzCjwJM+qRmP+/x/pF+uvjDSnnXSH+SbyvltWn8uVL+MuYT39FfuTryJ44D99/HX3+xS/VsXeHD/epfJ7jtsXjZJHknBdhaYpX+1nj1IqtWQ/k5gODt+9nfyQeZn+2zN/DzndouZKWA1et+DavgADS7X8MqOADN7tewCg5As/s1rIICVrP7NayCA9Dsfg2r4ABUFl/DKihgdbtfI3c4AN3u18gdDkC3+zVyhwJWt/s1cocD0O1+jdzhAHS7XyN3KGB1u58jd7jj0ex+jdzhADS7XyN3KGA1u18jdzgAze7XyB0OQLP7OXKHOn71ul8jdzgAve7XyB0OQLP7NXKHA9Dsfo3cYYCz2Z2PYmevuxDFzl53IYqdze5CFDub3YUodja7C1HsbHYXotjZ7C5EsbPbXYhiZ7e7EMXObnchip3d7kIUO7vdhSh2drsLUezsdhei2Nntzkexs9ldiGKX3eXPv9WfyofT7vLqiHkhX/Vb+mycgX7zOx35iH9l+UbUGknvbq8X68LTryfy4XH1UfgUnJ/WevG7g+b37/ox5v0x1onl6/W/nMbzod52CO1XdPZevX3/z3f+AZoIqAlfUHsF326fkaL99Ob7O73dPhOFshZdScBEQIu2ZMjc8bb8yVfdHglgSG46fdc4ANup8WyFk75dKKZsX5Ytg97A17snf9YR4u7xs8PitU/4P9zt82ULEhue83r5+4P+rt0WYW3bXQ+Hly92f5kvAuLJSb2RbwLiyUlRAHYH7pwUB9QnJ8UdP3ZOigLwA71zUhxQd06KA8bOSVGA6YcnJ8UBZeekOKDvnBQFlLBzUhxQdk6KA/rOSVFADTsnxQF556Q4wDmjaTcSemFvp+0X8jUEltda5y9zTuJfudL5v1cA/KYfMBbl7sFd+aXfr5B36QQ6ENpP6m7+eft676/0Ja/99GK9cW957acXiwPa7sWiAKTC7l4sDsi7F4sD2u7F4oC5e7EoIKfdi8UB9enF4o6fuxeLAkravVgcUHcvFgeM3YtFAabrOnkBTNE9vVgcMLYdpnI/IJrdFgQv3Gs0q6+FX18mAMS/vv/Xf6d49pdv66H85U2vj3y/EfIpdERrSFJdT9WXr3h/rS9K7fEkeiPflNrjScQBbXsSccDcnkQUAHur25OIA+r2JOKAsT2JKAD+VpcnEXd83Z5EHDC2JxEFlLg9iTigbE8iDuiPJxF1fI3bk4gDyvYk4gAEtnllk6XbAqENC/seXk/+NbS11526L87iJgj+B5Vqv32TavM8/pmDUvcH+pYGquepxbdC27WQfDKgL1/w/lLfUtJ3LdUb+ZqSvmupOGDsWioKQEr6rqXigLprqThg7FoqCkBK+q6l4oCya6k4oO9aKgpASvqupeKAsmupOKDvWioKQEr6rqXigLxrqThgPL3n2s8cgSpc+1+f4GucGq8Z6S8WrBDA/7ri1D8xMjM/+eV7UNMdlN48nNYm+7hTlS/f1/6OPra2bUHW7/3FF/JzL9wWZOXeX6QA+2zx3l+kAFuQjXt/kQFq2lUS1PHVVUlQwHRVEgzQkquSoIDqqiQoYLgqCQbo0VVJUEBxVRIUMFyVBAPYMbtKggKKq5KggO6qJBgADsNPlQQFZFclQQHdVUkQADoLnyoJ6vjsqiQooLkqCQqYrkqCAbAGe6okKKDtKgnq+OmqJBgAS7ApRLG1BGtCFFtLsCxEMaSVnioJ6vjqqiQoYLgqCQbAEiwKUWwtwYYQxdYSrApRbK3BkhDF1hpsClFszXUa8+cn/dNH6ZrsNMKVlvokU3nRNvN1v/CLk2RqR/3nTnfK+dYx0S9qfmOOiL9fr39lrWEn+iyJevjIZmNm2GM4f2sst+x6/fvwk97I91Xcu/jpzZ7O9UoRv3yh+0v8IOeeQ/ZGfj5P0p5DxgF1zyHjgLnnkFHAtN/ik7OngHrkJ2dPAcNWE3fOngBQ4d+fnD0FlGM8OXsKGEd4cvYMAOfjJ2dPAeXId86eOh6zDMKVs2cAGB8/OXsKwDCDcOXsKaDvIRkUAONj8gJkjDG4c/YUYDfg7Z/GAZhjgL/o5KeH5fHtn8YB7TGw5Y6HYdTln0YBsDy+/dM4YLiKEyWS4dkTYWaV4uvv9e3ZU8Pn/OPxzZQq2p3Z1sPhJXgjGn+MCSSXvx/nHm31cGegXz6Z/zTfyWErUizia3tHP94K7rEwa7UVCwlgixA/91k5AGZU17YlCWCLMJ5mZBxgzwkY2zUL+wyQYEZ1/7Y4wJakGByauC8pwYsKYd8WXBwAL6py1ZZxgK1IcaFTJc8ZZlSXKy8HwIzqNHklj7cF6Z125wB7TOA6V5OjFAAzKlznXCIJ2M2Pgro22HewBSlS4NxPO8GKCpc5R/KUYUV1PStIwNajl2k2CdijAtmv3sifKqyocJnREcUB9qjA/UzfDLCiwnVGPKYALB6aEMQSrKjsfh6jkr/tZgubIAQx2C/YMWfbEgfYirQIQSzBispu6Bg7edKwohpKEIMV1V0hywF9V8hSAKyophLFYEV1Vchyx/ddIcsAmEn1VMhyQD5aF6IY3BeG3dKRjBkZVlRRCGIZVlRDCGKYSZXtjh62IiABLP2EMIaZVM3u6NECFwLgvjCaEMYyrKjsQkf7hXBAxtJPCGMYSpW7EMYwlKoWIYzBfqErWgz2C2MIYSzDikrRYhlWVEkIYxhKlRUthqFUdr58GIP9Qle0GOwXZhDCWG5Y+wlhzFT/kRQxBudbW1XTYQxZmqpoMSRnelXC2Ei7BoIDkDgSwtjAAlAJY7YMKIoWQ26mBSWMTVsxKmoMuZlZhDBW7JioqDHkZtIQwhhyM0VRY8jNNEWNITnTFTWG5MxU1FixhUBU1BiSM1lRY0jOFEWNIUXTFDWGFM1Q1BhSNFNRY8WWAlFRY0jRZEWNIUdTFDWGHE0T1BjcF4aixuC+UE+79/dP9PPEBuwXOgqTsDvygr4mdeJH7deyXvjSvvdXL5Z4yxbdFgqL+tW90of94feNg+9teerGxMvTMbpF9ec35r6lD7Ie6So1eAM/32kc5S41oABbdNW71IADip3LtUnHAXbMXWpAAbboinepAQeUI92lBhzQj3KXGlCALbraXWrAAXYr3aUGHNB20y0DYJs+3qUGHJCPdJcacEA7yl1qwAHzaHepAQXEdIyr1IA7HjHpKjXggHnEu9SAAmzVle9SAw6oR7lLDTgAPbRnqQF1fEYL7VVqwAFoob1KDTgALbRXqQEFFPTQXqUGHIAeWj6KYZu+dSGKoQBxFCGKYZs+RCGKra2Sa89QC+HYKkkjnsX0L+TrUzV9Doof4aupERo8/zU9Vb926ypTPpQzfN2xx35vxI59f/9u3ff5QbohbG/kZ8RxQ9g4wA1h4wA3hI0CkhvCxgFuCBsHuCFsHOCGsFFAdkPYOMANYeMAN4SNAoobwsYBbggbB7ghbBRQ9xA27ng3hI0DhkvRSzcSouBsV7Lkk3yNguVzMi6ioF9bYAL8qtqZV2TLZ0FzusfQfolsq1Tp764//Yw1dzHTH/Zu3KVQ/zXj7hkLX5LGprXrvATV57fhvoEPcuxW+DfyMxkcdys8B5TdCs8BfbfCU4Apn6cVngPKboXngL5b4SmghN0KzwF52zNyQNv2jBRg1/+xZ+SAvOexcEDb81g4YO55LBRgweGZx8IBdc9j4YD5zGOhju9pz2PhgLrnsXDA2PNYKMCWxfc8Fu74uuexcMDY81goYMY9j4UDyp7HwgF9z2NhAKyKn3ksHFD2PBYO6HseCwWYInzmsXBA3vNYOKDteSwcMPc8FgowRfjMY+GAtuexcMDc81gowBRhrUIYQ/16T0IYw7p4TCGMQRE+s0s4oO7ZJRxgj/XAhzEIwmd0CQfYU70IYew0+706vyWJgmzzEkNL0n+Sr4qwfo6/xM3u7a6QkadXlvdInH9GqTtWwo/G+/XnK+Mva+Dftpr85ynJF404dlvGy/fjvpMXyfc8UF7ATwHnHygU4B8oDJD9A4UC/AOFAvwDhQGKf6BQgH+gUIB/oDBA9Q8UCvAPFArwDxQK8A8UBmj+gUIB/oFCAf6BwgDdP1AowD9QKMA/UBhg+AcKBfgHCgW4Bwpz/PQPFArwDxQK6HsYFgOgwiAMPoxB8T2zsDjAVolJCGPLB2sKYWz5YDUhjEHxPbOwKCCFPQuLA/KehcUBbc/C4oC5Z2FRAHywhhDGoPieWVgcMPcsLApAY94UwtgywmpCGIPie2ZhUQBygEEIY8sOqwthbCUBn2IVRXEsf+DbGPCFfJV87bVr5Iu9H2xp/7kdi4xsWwKtfBViUvrvG3+n/lY3Yrz+vJz/vl7H/jv9/vO0IH5Ed+vK59fjvpIPcLpaxhfy87meXC0jBVRXy0gBw9UyMoB3yeWA4moZKWC4WkYGwNzAp5aRAsquZaSO766WkQEwNvCpZaSA7GoZKaDvWkbmeEwNfEpgKCC7WkYKaK6WkQKmq2UkABgE71pGCmiulpECpqtlZAD4Aj+1jBRQXS0jBQxXy8gAMAZ+Hg8UUF0tIwUMV8vIADAG7kIYWy5ORQhjy8UpCmFsGQMPIYwtY+AqhLHl4pSEMLaMgacQxpYxcOPD2LI6QP/7UhrKg2tZHYRxlVN9kq/Cob9WJn5x0rSLsO3m/ps/4L+KjGXQ9Ht4RkHFy8LgHiu1TJx+/TqY+eceBfh5PUVAn9+EO/uX/MUz8e+NfMtfPBP/KADpwHvNSR1ftrs6B/Ttrk4BLWx3dQ7Ij7s6d3zb7uocMLe7OgX0vN3VOaBtd3UOmG5LmQFGclvKFFDdljIFDLelzAAzuS1lCqhuS5kChttSJgCkL/aWMgUUt6VMAd1tKTNAjG5LmQKK21KmgO62lBkgBbelTAHZbSlTQHNbygyQw95Spo7PbkuZAprbUqaA6baUGaCkvQNAHd/cDgAFTLcDwAC24Nw7ABRQ3Q4ABZgIwTHp/af60wfj0iDlLiL8JFN70SDjtY7zi+UtfLv+VjRI/vOTNvFH5DMtEr9Yct91nuufcFVc3ckTYu/tJ95KwT26P7899429PAA7PHoyyvFeyLcH4Oh3MooBBmYJ1IkKOxKAUQi+1vL6U3gBYBRi79ByJgEYhVzu5BSwjEIud3IOgFHI5U7OATAKudzJGaAso5DLnZwDYBRyuZNzAJxC7j1qBlhOIVeCjTq+bKN/DoBRyOVOTgHLKORyJ+cAOIVc7uQcAKeQ052cOn4ZhVzu5BwAo5DLnZwDYBRyjV2ggGUVsjycuB93WVYh9q0W8hMtpxA7557Jc15OIfYGoZPvsJxChCi2+hLqXUWhBMxVkWtBeD38P8G3x1kLrwW5X5yRsefyN/M4+8u1lO7XUvllOZ1RuvHr9Xq//tGSGrnwezzYyzfhzv4lKf6sa97It6T4s66hgObWNRzg1jUc4NY1FNDduoYD3LqGA9y6hgKGW9dwgFvXcIBb11DAdOsaDnDrGg5w6xoGWI2F17qGO96tazjArWs4wK1rKCDudQ13vFvXcIBb11BAcusaDnDrGg4Yu7KJAtBYeFc2cUDdlU0cMHZlEwWgsbAJYWw1FmYhjCEp/lQ2UQA6C7sQxlZnYRHC2FqQ3hWU0nMFT3B7tpz9QS/k6yM8vlZQfjEAti+1/809wsvZ17PWoe6/P97nz28x0LRqsMfE2pJ6+QbcWX+QeU+YfiM/36rtCdMUgIEI94RpDsh7wjQHtD1hmgPmM2GaOh7zEO4J0xyAReXVls0BWFRebdkUAHGbr7ZsDsCi8mzL5o7HmvJqy6YAzEO451hwABaVV1s2B2BRebVlUwDmIVzmEtzxZZtLcEDf5hIUgHEIt7kEB+RtLsEBfZtLMADk0GMuwQF5m0twQNvmEhwwt7kEBWAeQhWi2JqHkIQoBkH0mEtQAAYiNCGKrYEIWYhiayBC4KPYGknXhSi2BiIUIYqtgQhRiGLQQ4+5BAeUx1yCO75vcwkKqG5fmQPKNpfggPHHYe+nz2rIoWfw+gv5KofSZ3Xhn795Uv9rlkOnY8QfyqHPb4CVQy/kH8shBvgihyjAyyEK8HKIApwcYo7/IocowMshCvByiAG+yCEKcHKIOt7LIQb4IocowMshCvByiAG8HKKO93KIArwcYoAvcogCvByiAC+HCOCrHKIAL4cowMshCvByiAG+yCEK8HKIArwcYoAvcogCvByiACeHmOO/yCEK8HKIArwcYoAvcogCnByijvdyiAG+yCEK8HKIAsYfhz1SDn2Sr3Iof9ZM/jl8dXNs+W9GDDkBhNdI9eULhCN7uB2cXs7vOacPDr+FcJZ7vHEfbwRj9nEN2OEA/BbCOWCHA1DRew3YYYDlzE4eCUv2cM7X4QATdvmar0MBy5Mdf9HJDw9P9n7N1+EAeLKHNV+HO35uby8KWJbs4fT24oC6vb04YG5vLwpYluzh9PbigLq9vThgbG8vCoAl++3txQFle3txwNjeXhSwLNnPr4kEyvb24oC+vb0oYFmyhyt3TwH58fbiju/b24sCUHqVhfh1OrIL8WtZsnclfi1Ldu7QZcauBDCYsQ8lgC03diWAwY09KQFsubELAQxm7E0IYKcZuxDAlhl7EALYMmPvQgA7zdiFALbM2KMQwE4zdiGALTP2KgSw04xdCGCotTqjPBnATjN2IYCdZuxCAFtm7EEIYKcZuxDAlhl74QPY6cUuBLDlxa4IsNOLXQhgy4xdEWBlDfJuZ+OZID6h3cfsZ2viC3dr99/+4U9/b//7/wG/trwcCmVuZHN0cmVhbQplbmRvYmoKNTggMCBvYmoKWwo1NyAwIFIKNTkgMCBSCjYxIDAgUgo2MiAwIFIKNjQgMCBSCjY1IDAgUgo2NyAwIFIKNjggMCBSCjcwIDAgUgo3MSAwIFIKNzMgMCBSCjc0IDAgUgo3NiAwIFIKNzcgMCBSCjc5IDAgUgo4MCAwIFIKODIgMCBSCjgzIDAgUgo4NSAwIFIKODYgMCBSCjg4IDAgUgo4OSAwIFIKOTEgMCBSCjkyIDAgUgo5NCAwIFIKOTUgMCBSCjk3IDAgUgo5OCAwIFIKMTAwIDAgUgoxMDEgMCBSCjEwMyAwIFIKMTA0IDAgUgoxMDYgMCBSCjEwNyAwIFIKMTA5IDAgUgoxMTAgMCBSCjExMiAwIFIKMTEzIDAgUgoxMTUgMCBSCjExNiAwIFIKMTE4IDAgUgoxMTkgMCBSCjEyMSAwIFIKMTIyIDAgUgoxMjQgMCBSCjEyNSAwIFIKMTI3IDAgUgoxMjggMCBSCjEzMCAwIFIKMTMxIDAgUgoxMzMgMCBSCjEzNCAwIFIKMTM2IDAgUgoxMzcgMCBSCjEzOSAwIFIKMTQwIDAgUgoxNDIgMCBSCjE0MyAwIFIKMTQ1IDAgUgoxNDYgMCBSCjE0OCAwIFIKMTQ5IDAgUgoxNTEgMCBSCjE1MiAwIFIKMTU0IDAgUgoxNTUgMCBSCjE1NyAwIFIKMTU4IDAgUgoxNjAgMCBSCjE2MSAwIFIKMTYzIDAgUgoxNjQgMCBSCjE2NiAwIFIKMTY3IDAgUgoxNjkgMCBSCjE3MCAwIFIKMTcyIDAgUgoxNzMgMCBSCjE3NSAwIFIKMTc2IDAgUgoxNzggMCBSCjE3OSAwIFIKMTgxIDAgUgoxODIgMCBSCjE4NCAwIFIKMTg1IDAgUgoxODcgMCBSCjE4OCAwIFIKMTkwIDAgUgoxOTEgMCBSCjE5MyAwIFIKMTk0IDAgUgoxOTYgMCBSCjE5NyAwIFIKMTk5IDAgUgoyMDAgMCBSCjIwMiAwIFIKMjAzIDAgUgoyMDUgMCBSCjIwNiAwIFIKMjA4IDAgUgoyMDkgMCBSCl0KZW5kb2JqCjU1IDAgb2JqCjw8CiAgL1Jlc291cmNlcyAzIDAgUgogIC9UeXBlIC9QYWdlCiAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAvQ3JvcEJveCBbMCAwIDYxMiA3OTJdCiAgL0JsZWVkQm94IFswIDAgNjEyIDc5Ml0KICAvVHJpbUJveCBbMCAwIDYxMiA3OTJdCiAgL1BhcmVudCAxIDAgUgogIC9Bbm5vdHMgNTggMCBSCiAgL0NvbnRlbnRzIDIxMCAwIFIKPj4KCmVuZG9iagoyMTEgMCBvYmoKMjI3NTIKZW5kb2JqCjIxMyAwIG9iago8PCAvTGVuZ3RoIDIxNCAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCnic5VlLbxw3DL7vr9Af6ESkXiMgMLDZR9HeghrIIcgpfR3iFOmlf7+iRGo00ni9hgPDcGAMPJL4FvkNpf22A6XT30/0L0RUn+9233gOVEBlPE85r4yeZue1BnWn8hgm0Hn8JZF3o0rLIy9rLKmO/1Yfdl93Wv28+/gpkf6u9OTUfzs9qmtE/rZ739hJq/rF2tlaagBfsKXfdsGWdEA/QXQxRjWjwjBhovl8p978cofq+E926v06UbzFyYNbJ5BWcZ7mmWfT3IQu6abFLwqTEmu11jgMiaybcdnt8v9eB1n+KKrfh0JxyTpwk45+9VpE1dFjLFqLIGu0+mv37nb35pxiBlrd/rlUop2Mn5P12iiAxOfIk6Bu79THt+ltvvmkbn/dnW7XHlmYXKrWFxXwnFJI6WH9nFJkVv/+oT6or2naOl38pZcZlEfJMCsZtsqvkLFpiZpXqZTaqCU6PRkgK8DUYB3Sc0wz+xTNFEeA9MREQvGl/3uew/JoYj8sazps0Db8QHvzLj1JB57LPHh+P5SxoWe/PKCLHqIjmZgmDPFgebQpfBhYNlWoZf37svlbaTMrg1OMNsY51gCYEym7USm6b4v5ZCqppnBouEmcSXikVdJryEFy5kArc542hSE/wPaT2DP775axsSVmOZY8D4HjmNbMuVdKO5Sjh+zlPcYWvxtnrR2dtcxVZZANRp7v5seNgpAj00q2IyUFlHY3z9vynrU6ypAbFYuNcfDN++QbEQVXMzmyHN9YThlNSqBYjXumAbaB6bPVR/bmzOtGYrXM5ay2LP+82J3HgWl8wwdLlLLsNMZT0ZV5j2sbySbQrNszTygVmulYR/Vvw68t+Xn+Ymy3AWP2UwATo59jCxjwwgADmSbT9uDBoFFBRGgPDd2h0BovYbkMI6DjZKi0vLevH0cAYfT2tQAJWJOcS1S2aSAeQJI855fqznO+D4bGEUNEGjA25MQ8thK4/mGNM5XGlFqvO4YLJqAEUHAEFsufEzPAmwkINGYLqy7DvizQkIzPvEL/5A4DZjeF/NWF8ANAQwyjt68FGhDi4NxzNBkSvOJelSDtxFPaiydDgGQPe+PFyrYZegyYrXy/CCto4uRof4MLK1hxLwxWLkGH4UjYJiNIz+EhWEGPdN+QOAy+fljBYEdvXw2sRH+vc9mkI5t8ksJNMQ16slJnKJl77hdnXjh1C0tr0FIzhFU4cn1wS2fRsCz4sWVSr2AbUVqCDlrWuhjrrtOV97PZpSE2bUJUoJISnHku9lLNjTJOrMl4ZYooFETpDck75lhP1/HRmukZTBgyxOh5yBArtgEEjl7U9ayYz4iNSbRzTT0yR4aj1cwo1SSX3Sy7o+U8iqOOUT7MD8vP8Hratrjzr/bGK/5LH9RR25kT6bzAReev7M+mNpNGRtf8IVh3khJ1l9cxlsI86/rRQ65qsSLnwcBJ+5kt4OgQBhStY4KgHhJEJ1QPWE11uh4OBESsnbLhFi8puyTJHkpIhYPWbJJiOw0CQrKpMp+R98gW8dZUdLYbMq4IZO+ZFHJGg/g4/SY2BUy07XHrtE77q33CcfvMxsfcLqwguX3iu9ku5LUFi8tjpQHlj1hzDu2aRNKCEsDcgFxqu4yDKWbwsr5tu3Iz8Z3arty5Ol2vYeQUZoRX2rC9rtc2xLuiY/nQ3yWTp8gxs5xKkh4zf03esa0PtmEmNSYu5oq4ug17xubr+paLDXu2nurebsikbqiP6OVDVmrQcA0z7ZyAWC3ZZg3leyxdRMuHiy50nR75inRzbSdS5UgdA7/jBo3jYPlunuu+NjLtWtMOPWRDrq2jbprZDhGaBmnlP+ilh+RYbcWxbQPbvbg2WVZ8jEJlX8bfMFIr1KcH8Amrc0oUXIQzi/Nk6HKKfgls4cwscJalHNi0OenwNajtfbJezoQVyPYMMJK8AjLys4HcM7ePKcAApBVTYGxRd9GIRx1qH0Q163T5pcjBD4Bq17R0I07ZgGOMYNkuueuQ0z1//aH5LAM/yx0Pr8lFpHguRxSha6+aj3rdZTSlmje9KeH7olrtuXKXxAfkQ4B0SCtfTo1u6XykbdHNemPrViu9UIgVWVtsftF/v/sfx2MBnAplbmRzdHJlYW0KZW5kb2JqCjIxMiAwIG9iago8PAogIC9SZXNvdXJjZXMgMyAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMSAwIFIKICAvQ29udGVudHMgMjEzIDAgUgo+PgoKZW5kb2JqCjIxNCAwIG9iagoxNTgxCmVuZG9iagoyMTYgMCBvYmoKPDwKICAvTmFtZSAvSW01CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDIxOCAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAxODg5CiAgL0hlaWdodCA0OTMKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgL0RldmljZUdyYXkKPj4Kc3RyZWFtCnic7cExAQAAAMKg/qlnDQ+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4NSc1a4wKZW5kc3RyZWFtCmVuZG9iagoyMTcgMCBvYmoKPDwKICAvTmFtZSAvSW02CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDIxOSAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAxODg5CiAgL0hlaWdodCA0OTMKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgWy9JQ0NCYXNlZCA1IDAgUl0KICAvU01hc2sgMjE2IDAgUgo+PgpzdHJlYW0KeJzs3fuzHNdhJ3Ymf0d+TX7LqsIr/7DLON7dql1po6rdrS2tSXDLgYpbylZkS07tK+QCZJlkhaQrqk1JTgzBFxAeIimR4AUpCA8asABClCmRJiFAfIhL8WFS5kJW2Yhu4iuKpGHmzqv7dPfpnp65t6dv93w+dSXO9HSfPn3OnIu53zlz5qOPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgF544jduCHzsd1+qc9BLv/uxGfaesSq/8cT2lJMva1zpBireFZstsKRXDgAAAABEZOPhGfLTzkTEQWFBQryUEfGoVZbxygEAAACAiElkmoaGSYg6NUfsTkScVDFMiJcyKBURAwAAAACpaB47yFEzIWImWE13LkbEQSwbbE33Sx8vK/83nihUKTPLOR/2fuw3fiOfcWcP+9jHPhY8Ok5IP5arePUpSutdclz2ktLD43OZC1t/44n04eGDubvVhaRdmmnVYjfKiQEAAABg6SWh5PR9IuFiNiKO7DcuN/JI7Ucjq2BE887iNUyi0t8d7jh6eLRtvGlS8dqnyJ2p9LiytTtKL6m8BZM4O7dreSEV64aIiAEAAACAjBqLOoxyxVz+mIlQR4/lVjAI7ybRZC4jzUyRzQfGmUw381i80PJrS8uYXMsTxYrXOUWm3jWOi15SLpUP72YX/cgt+JEptKKQpJa53DmTh0uHAQAAAICPZlv3t/j1b2EuGp+7mgk0C+s6pKltZLGK4toXE5nItDzsTMuZhLlJ2h09tsYpalatEMMWrzdvuHPufPG70wopVDJbjIgYAAAAAEjUWWgiFv7Wjohj0eeUiDhTp1gYOnNEPI6GR6sWBysu5GbrTj9FbA51jcutke6Gj0XnBtcuREQMAAAAANQWn0Y82JpbJSG7bm9pRBwNmyuj1qopt7mlHWLJbp2IuPDFbrFsu84p6lWtcmJ0VbVnjYjj1y4iBgAAAABqy0XAwZZY9FuRp44fin2TXWXUWrVwb/z78GaPiIM5zvmVL2Y6RWnUG19FuGot4lyLTl1hOL5qcaSQWhFxvaVFAAAAAIAlULmwbcmjkYg4tmfsu9wG4rlz5NjoQ3NExLnvcJu6QsYMs4hjjZZ78GMfiwW6xcPqR8QVhdSLiLO7AAAAAABLLpdpZnLXzBTcyFzWyATkbAA5/WvfwlNkH0yLHBweLJMwW0QcTbML2fa0U9SsWvbB5Pvyotcbab5aEXFpIVMi4sKMagAAAAAAtlN+8Y6paTYAAAAAAL0RXZ1DQgwAAAAAsCRyKbF8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJbdT4FpDCIAAAAAOkpEDFtnEAEAAADQUSJi2DqDCAAAAICOEhHD1hlEAAAAAHSUiBi2ziACAAAAoKNExLB1BhEAAAAAHSUihq0ziAAAAADoqK1GxKfv/sQnPrt6aZZTXlr97CfuPr2FOsNOs6VBNBgRE9UjY6tjZ3O4zjhaAQAAAOi7rUXEw8Tq7runp1ZiYXpt/kE0eJMlGRrDsLhioIiIAQAAANhuW4qIR4FVndhKREyvzTuIMgHxwGCklKe4ImIAAAAAtttWIuIkr8oHT8EH5yePjwz3CmOudM9JAcNHVyeb02KTMmRc7DxzDqJCQlx4NLsARSYiTh4OR1Pl2BnM+J9sjhb+2bvv/mxh1BpxAAAAAL22hYj4dCZuygZS49AqSbTysfDodrBncnMYGo8LSx8vOxfsCPNHxKVP5tzoyL29kr01KqR07AR7jh8vKzwZpUYcAAAAwLKYPyIui4WjgVI0Is5PiUxyqsyM4nyYDDtPAxFxbL85xk5+nBbPFzvciAMAAABYGvNGxMFaEtmPq8fXUo1GxJm8arI1Pt/4p+Hn3iVX7DTzR8QVT+fMICtGxKHoEi6T8RSNiCsKDypnxAEAAAD03pwRcfFrs5IoahtmEUcj4p+mO4qs2GHmjIgjz+bJlvyc3opZxBPT34gpmzAcjYjL6wgAAABAj8wXEUdDo0nSlFuLuN7yEZm1iKNhcvg1WwIrdpZ5I+LM+sFVqwWXr0Vcf8XvtPQphRtxAAAAAEtkroi4ZAXV7FfOZT+iPt4UW0oi+Kj7T8tnEaefevfVWew4c0fEA+lzO8xiw7FxOrIMS3rYtLEzKemzq6uTkTu1cCMOAAAAYFnMN4sYCBlEAAAAAHSUiBi2ziACAAAAoKNExLB1BhEAAAAAHSUihq0ziAAAAADoKBExbJ1BBAAAAEBHiYhh6wwiAAAAADpKRAxbZxABAAAA0FEiYtg6gwgAAACAjpoaEW8A0xhEAAAAAHSUiBi2ziACAAAAoKNExLB1BhEAAAAAHSUihq0ziAAAAADoKBExbJ1BBAAAAEBHiYhh6wwiAAAAADpKRAxbZxABAAAA0FEiYtg6gwgAAACAjpovIn4elsbWx1HZUW8AAAAAwKJse0Q89UDogaYj4ms7z+Ylt10FiPPkXAzt3Am6CZpgZEFDDK6+0rN9pWd7rKGIuO3LgmaJiGFH8eRcDO3cCboJmmBkQUMMrr7Ss32lZ3tMRAxzEBHDjuLJuRjauRN0EzTByIKGGFx9pWf7Ss/2mIgY5iAihh3Fk3MxtHMn6CZogpEFDTG4+krP9pWe7TERMcxBRAw7iifnYmjnTtBN0AQjCxpicPWVnu0rPdtji42Ir77+4uX/9JPshhdfv7qIC4XtJCKOe+nw5z71ucMvJXeS2wNn7/tU5v5g50/dd7Zwb3O/VOYIKFPvhcrwWZZ7aoXbPhU8I8MHwqdp8QmeKaHnz9hp7Zz5FVDcFPklUNx7c0v0l0Cup6KdFj3L8pl1OIwbMPr0noj9Ao/uHRtlxQ71e54Omn9kFX9hlQ+BdKxFful97vBho4ke6l7cVBh3uRdAg8c3B3v8JWLJK8zcL4rob4CuDfCd2LOlvzMj/bK5b9JFg+NyL3yir4WKL25LCg9rlP9nYMd3+k7s2S2a/lfepO/iXdwfi4yIn/6Pn/7Vv/sPfvUf/OtHXx9t+NbezXt/9+/83b3fWuAVwzYQEceNfotG4obhvfsOb/7vbLjzpmDn8Z3wH2Oop8YLleyL9/Fr99zzNHmNltk52bf0xUO4a69fM0xv51iSmI7yyC+Bkog480dTvqcKv1yyf5Ut/S+QGYfDpM8qIuJo30V+25eMsmKnRLsYdrZtGFnJxrLfVMWxVizAaKJ3uhc3xYZw+gooeTTyErHGK8zsa6lOx1E7sWfjvzPj/RI0/tn7Bu/RZV/3RF8LRTqspNOTB3O/9rvwW30n9uwWTf0rL/7Peg8tKCIeTB++fOC3Vv7tE5d/79P/9H8/dXnoq7/16d+7vLnht756+XJHJxNf2Xfzysjtp8p3uXnfldmLLS1wWk1mPXJKqTNXfimIiOOGvzAP3xf/lTp6PzwzSXNz58OT11LJP44SHmY3e3Q5fKlX+Fd+/OyLTIEv5MnRFw99f81QLyGJx7dlvwSmRMSxTskfl94f9+qSq/m7Ou2ll86+VBkRl/4Cz/22Lxtl1aGW3/p0xDaMrOTZXvKkj4y1mSJio4lu6l7cFB9phRFc/Ie1zivMQkbY3Zc2O7Fnp73IzOyUdOZLh+8b9t7kgyDpHxH510JlL25LahD5td+F3+o7sWe3aHpEXPZs6ZvFRMTf+4+fHoWX/+ax733p0yupT3/pe5MNn/6P32ulBbZgkMruOvTWsDEu7l0pyVJfPHDrrQdenK3kzWNW9s7wqyCsyaAq25YSr793/fp769tTVq+IiOOSFz/5356lCdvZwb+3o39oz6YR8U7/bA07ztQnZ+k/5rXmd8Ve9ZlFXCKc7xC0R2XMHh5ciIjTqRplEXF6XK9bv7Za75gU/97IfZiumElF/9QNftuXjrLib/VoF8PONv/Iiv4rU3OsFQswmuid7sVNZX+tDLfH3wofjf46rzDNIm5U9HdmWb8EoeDo3b3M3wnRv3yLHVZa+LX4r/0u/FbfiT27RWYRTywoIp7kwp/6zOf++a8FEfHf/se33faP//YkLW6lBeZ35Su7bj38xjhA3fjxWxdeHQbB+YnFSUR86vbM9s39br/99uy83/GxN9+xZxIR50sbTOu9/fabs3OFMzW5tvHBxbtW9pzKTgFObxerMSlwX3H/5LDIUeNdB4+M67JEc45FxHHpVLLM2+Txf/Qmmc7wndPgjdmd+V4pO9tMEXHyun78gq6Yis0aES/Nuxr1XhAmzZcf7rmHtzEivtb/eH4G2xBklbR2se/C3/alo2zavMe+v9amJ7blzZeSf2XGO0YTgplmERtNdFH34qaSv1YGf8zcl1slIDv6K15hlqw/2+lBvRN7draIOHmdE0wfDqYWR/7ynSUijv/a78Jv9Z3Ys1s0/a+8T0W6rY8WFhH/2q9//o477vj8r//6bXcM3Pbrw/t3fP6224b/ve1T3YuIz+xZufNcMsN2fX1jfX2Qkt4yns47zmnHEfGVfTffcnC4fTDLdxCpDmcKfzvcc/PYlTsvbm544+CulWFEHC1tZdfBNza3fLBRUpNr13508NZdf3Dl2vqrh27d9ZVhZDsIkQ+9un4tXo1xge8V9y+rfFr0qT27bh2eLT1oGYiI48Jfp4OFI5K3X7My78olS0yIiJnfXAtN5D4rFOxR52OAJR9B6reaLwiTD80FL3YrfgkEYhHx9IUmwt2Y/ePwkY2ZcVHZd+Fv+7JR5qPx9MKWR1bkcxWBkrFmoQmWQPfipqp3Wl/KfAtD9HVOsaDoL4qSMjpkJ/bsTAtNjOcPJx9TK9wrvhaq3+llv/a78Ft9J/bsFk35K6/i78S+WVhE/OkvX/rwww8vffnLj3848PiXh/c/vPT448P/Pv5vuxcRn90bWQxi/b3rbxy4ZTzjdpicjlLWM3uCydPDBwbbD/5ocMw40R3OBf7xxrCQC3cNy46XVohh8zWZTFzeLOfOYZC7WfSdFwazjOPVmBRY3L+s8klGfGrPrkNvjI5apoRYRFwi+IU5/Ddv2tvlo9dR931u8vEcETFzmvnr6q5Nviwi93qg8ksrwpcHmX17/TohVPcF4aBN7rvvc2VhSPlEi2JE/NLUr6sb85sjMfuXak2+Qqf42rhG36W/7ctGWXWo9dIO/SoWyNmekfWpkpc69aaZGU30UvfipshrjuzLlNiiMcljkVeY8Zej+Uc6Zyf2bPx3Ztkr/2ujP1UznROLCtPXQvU7vezXfhd+q+/Ent2qaX/lVY3rXllYRPyJ3/69o0eP/t5v//Y9Rwfu+e3h/aO/d889w//e8y+6FxGPk92swbILey4M59vetTLMaUcp69m9K3ddTJpusL5vukbx+Fa4aPE49C0rbUpN0lnFG9++c+WOU6fuWLnz2xvjckurEdu/rPKTjPjUH+zaPNPmUZs3lykhFhGXyP8WDT+KE0imGGb+IX0pshbxp3bkP4rsPPVnt+afWtl/5Sd/0l/LfLIofBYmRcQ+kt97tV8Qhq+gK38J5EZ7EhFXTqQTEVervR5I+efm0qlQU36Bj3fOrqaaH2XF3+rRLoadbRtGVvKvTH5QlI+1YkRsNNE73YubIkM4vzrEpz5X/HK69MH8K8zSl6Pdfpm5E3u29HdmySv/bGCcuRd9LVR8cRsvvPzXfhd+q+/Ent26aX/ljQdmvIv7Y4GziJ//5S9/+fyXv3z8lwPHvzy8/8vnjx8f/vf4v+leRDwISVduCVbkHazDO0hTh+nqqT0rYaj7o4OTfQerC49XeMhGxMPy7hiu6js4eBARl5VWVZNhVUZHXRtkvnft2rNn1+R+VTVi+5dVfnzSXbfsGmbJmzvs2bNniRJiETHsLJ6ci6GdO0E3QROMLGiIwdVXerav9GyPLS4iHibA3/vSlx4bbnnsS6NE+HuPPTb872MdjIgHy0BcvDNZfuHwW4PptRvfvmt0f8/ezRt7zkxS1nDfOy8O1hEuRMSb5b1xeNdwj1t2jb6urqy0SE3eOrRrUpW9F4OFigfzgidzgrNVzlcjtn9Z5YdlDYLp0VoZmzd3rexaooRYRAw7iyfnYmjnTtBN0AQjCxpicPWVnu0rPdtjC4uI/97uPffdd9+e3bs/f9/A53cP79+35/OfH/738/+sgxHxpo0PJq0xWn4h3fLBBx+MvlJu/b3ro8eSfUcZa7I9e2tU2PXro73KS8ubHPpR5ovsxkWEW0qrEdu/rPLJKYOKx+vVUyJi2FE8ORdDO3eCboImGFnQEIOrr/RsX+nZHlvk19V98MEHg6+r+2Bg8HV1g/8Ovq5ueL+Ls4hZXiJi2FE8ORdDO3eCboImGFnQEIOrr/RsX+nZHrPQBMxBRAw7iifnYmjnTtBN0AQjCxpicPWVnu0rPdtji4mI3/7mnf/0k58Y+OQns//9xOT+P73zm2+30gIwhwVExDvQiy++2HYVIM6TczG0cyfoJmiCkQUNMbj6Ss/2lZ7ttwVExD9/78Prf1Pt+ofv/byVrA/msICI+PrOs3nJbVcB4jw5F0M7d4JugiYYWdAQg6uv9Gxf6dkeW0xEDD2znBExAAAAAP0jIoY5LGdE7O1CdixPzsXQzp2gm6AJRhY0xODqKz3bV3q2x0TEMIfljIgBAAAAeub99Z9djfrZ+vtt121htj0iPgfLYQkjYm8XsmN5ci6Gdu4E3QRNMLKgIcswuDb+cumCpuvL0bPLqac9e+lbq/v3rx48fCTj0IH9+/d/9fQP267domx7RAyE+hQRAwAAMJPnT+wfePj8m23XhG2z8e4rLzz33HNXXvvLjbarwrYYDtMjZ36QnUH8gzNHNjef6GUoHiMihkb1KSKe/nbhuxc+84V7bgp+PnP6asXuFw/dc++lYgnHLoY3ppwuu0/1UVMKv3r0gUJ96IjteC/71S9+/IbbTm7njv2zPXMGkgaMt+QSt+82qdVNg2YeC1r75G2jTR//4quR/cNuSY4v7lpeVHrSyh7OniuoafmBuepNTl6yf75u2VNEDovXId6G9JaRZWTRkJ7OSMxYzoi4xz37/usXHjmwf+LAIxdeNz+8+8bDNEpEPDXaEhFDHQuLiP+r//t/nfVn+3+h5KPXl+79wr6j75buXhURz3O62hFxnIh4yUkmF2VKS+uIBTh5WybEGd1OWz7fB+PgJ920uWF8JygpEC1qUEq6cUoAFjtXxdXk86Xx7diTqfwyk9IKdYvVIdqGLDkjq+xRI4tlt5wRcW+9/8PTh3IJ4te+de7JY8eOn7/8F21XjrnlI+Kvfv2Jk0PHju5f/cbZl5ejb0XE0KhFRsT/zfd+v/7PHBFxvVnEYQY7CV3D7cHtQUR86NhovvE4m41P9H3p3vG05GzgPCUiTo4qnDq62wPH7n0grMY9YcXSNHvzoQcuvLV549Kxm3Ll057tmNx1223p3NaPf/GLwWSo3MSocBJsuuNSpJpT2nnYIK/m7hSbPT6LuNgRzGn6cMjmMpN7wdZc/LT53D+Z66zqLooVlXl6xPOv2Lkyh0XPVDgkEHmyxS8zKC+Mp5LEa0q2NT1to/uMrJSRxbbq6YzEkT/77vFkOdPJMqcP/9ErbVdrMXrbsz86e2QcIj509sWrV188+1CSKq4+/v2ft1295vW0Z/MRcfKWzuYDjzz++OHlSIlFxNCoPkXE0+Uy28HdYahbHhHfNIpbi+FtulswuffSsfH+0dMVCh8vc5EcFYuIM7uNA+Fg8nOy56VjyW7DG5v7jEt46/S+mw69tC3tR5Oif58GW4d/Dyd/8QZzocLb2b+Ih4+mh5vrFP69P74Za/ZYRBzrCBZj0vbVQVOY+RTeRcmLFlUjyIqcK/hke9UTo2TueWRzZTVKiplaB+OfIiNrajFGFkvh/defPhbOOF198LSJpp32/jvPnTiaCRHfPP/wkkXEPVUVEZ94/v13nlmKlFhEDI3qU0Q8x1rE+bnB1wuziCcLO4xvV2XF008XzOlNI9w08o2UGe4WXWgi2eGle4c588VDo/R4yhoaLNiM72Un85LCCUrRKVnh7eDv8eIk2OVYHWFqOyftVTU5rHr62ZI0ZZNmGQ7BB7kzYcy0ICucE16McOJFZT8OXzPIynzSvHzeY/FZM56+Hnsall5mSR41pQ4+DL8sjKzkHEYW26unMxJTaUq8ZPlwH3s2XWNiOCV87em3r19/++m1I0cOH1wdL0z80JO97+Q+9uz1ioj40rdWjx47efLktx49sn/10af/rN1qNkxEDI3qU0Q8XVmcWxoRpylrVUQczhyuPl08WL569IGSiDhbQi6yzmbOo0LGQfHkXLHlL9jBghlLxYUOwgRTRDyvcYPl55PFmz2+4oRPFi/MoGeKS4NMHpoy1zG3Z+ZrrMqKmqw6Mvz4euGo6LkKNY4/UHpI7ELKLrPejMXC5+ClWOQYWUYWbNr40yvPjb3w2p+//vSxww+evvxuuLHvOWIvXfrW6mS+cDih9C9ePvuN1SRaNJW4m0oj4usbf3l17I8f7/s31217RPw8LI1li4ifn3kt4tj2+CziwqrFdWcRly00sZVZxIPViYvzn986ve/eQ5PlJkK55S9ow/QnZzDPatrkVRFxqRrtPGyxk0mzxZrdLOKG1eim7HzFscqlRHMfUZ/ywfbqVUmvT3kfYDuDrOIhpXWr+Zn29PhIG9JnRlblIUYW86s1uLonEzcdevyPX7v6p1fCGHEJvruujz2bRsRpSpzNh5ehb/vYs9erIuLMPiLimSPiqQdCDyxhRDxdaZybLsswWLk3XIt4tIpvzbWII2sdN7AWcT7QDtclntwOY2ERcSeUfMC2ZC1iEfH8RtPZ8l/tdz1odmsRty6ewKQDI77QaHSmd/wT6tGi0k6eMlzChzPp0uYDJYeVHlJMp8ous/yz9tE6SLEoMrKMLEjl46axh85+58yRI2e+c/ahvseI/ZQuNDFOiR9cW3twNdfJh07/8P22K8rsRMQDDUXE16DXdmZEPOvPrKeYfxbxOBkeLMvwmdMX7g1nER86llmrIT55eDCtN7KkQ2VEHBxVmMCcX4ZiuNsDx+6dZNFJbcONwz0zq1LclCuf9tR5L3vySdwbbvj4bbflFn/MbBQRl6o9iS7zZ3++2ePrSxQ7gjlN7aa0U/IfRj9Z+k1Z+Wd48kH2sr6KFZUcVD2nsBAw3TD1sKmH5OZqRsqrWgGgWGB5G9JbRpaRRUN6OiPxxScP7Y85cODA8P9Wj3238NnEnulnz77/znMnHz6YT4XT/j16/OnX+x4Q97NnC2NWRCwihpp2YERM49698JnRnGcAAACgl54/ISIWEUNNyxkR9/TtwlqG84p9Ld3OtcxPzkXSzp2gm6AJRhY0xODqKz3bV0vRsy+ee+hIzLGL/V4hRkQMc1jOiBgAAACA/hERwxyWMyJeircL6SZPzsXQzp2gm6AJRhY0xODqKz3bV3q2xxYZEf/kTy9f/nHs5403ri444IOtWc6IGAAAAID+WVREfPWpC7v++2/8yq/Ef/72P3zy0TdayPkW7dTtKzfvuxJ75Mq+m1duP1W9ZbxxpPBQsEvJOcpFz0WV5YyIvV3IjuXJuRjauRN0EzTByIKGGFx9pWf7Ss/22KIi4kf/3SNBJvzYv/jX5/7Dv3r87wQp8Wf2/biFoG+hruy7Ze/hQ7vuiGWxLx64dWXv2eotgyB316G3hm1/cW9Z2Lx53K0HXpytZsVzMcUCIuI6hS9YzUuGxfPkXAzt3Am6CZpgZEFDDK6+0rN9pWd7bFER8WP/Jpw2/IeP//WHH/7g6X8eRMSf/tIrLQR9i3TqjpU7v/3eq4d27Qky4vG04Jvv2DMJaYtbJrt+Zdeth994b314Z+PHb1149cVg/2RicRIRn7o9s31zv9tvvz07Bbn07OFRm4fdXDVteTktZ0QMAAAAQP+0FBE/trnpexc/nYmIf7T4nG+RTu1ZuevbG9fWXz2065bJ/N8r+25ZufPiZnu9cXDXyjCkLW5JnNmzcue59cm99fWN9fXh/uOJxRfvWhlmz6OI+Mq+m285ONw+mHA8iHeHM4W/He4ZPXuxtJVdB9/Y3PLBxiJba8dbzojY24XsWJ6ci6GdO0E3QROMLGiIwdVXerav9GyPLTQiPva5L72wtrb58/JLm5vefu304PYL/9fnH+t/RDwIXw//eJCyrr934c6V0WITw3nBk413DULa4pbU2b2RxSDW37v+xoFbxhN/d/3BlUlEfGbPSmDwwGD7wWEb/+jgrYMNkXPFSzv06nr+tCxnRAwAAADQM+s/+8nbUT/52XrbdVuYhUbET3z5+V8Obfy/m5t+/le/GN754PE/7H1EfOqOlazhROJw2eBRAFzckhonu7mCb19Z2XNhPO93eOioiM2D77qY9NT199aDose3IucqK63Zxumk5YyIvV3IjuXJuRjauRN0EzTByIKGLMPgunZ16YKmjeXo2eXU05599pur+/evHjx8JOOrB/bv33/w5Att125RFrvQxK/+/cf+0T/a/PnDtc1N33vqXw5uP/YPf+2RvkfEg0UmLgYt99bhW3d95cpg0YlbxxOKN/cYhLTFLanhY5M1KgZh7uD76gZR8Lc3xrsHoe6PDk72HawuPF5oIhsRR85VVtoCm6orljMiBgAAYCbff2L/wEPnXm27Jmyba29defaZZ5554eWr19quCttiOEyPnHouO4P4uVNHNjc/8f22a7coLa1FfOzaEq1FfGXfLXsvZpbynSw2sf7eG4d3jWYV77p1vNRDfkt41PWLdyZrRxx+azA3eOPbd43u79m7eWPPmUmoG+575/DkhYg4cq6y0hbaXN2wnBFx3bcLn33kpi/cM/45eCl44NLvJNu/8Mi50bY3z+1ONw5+fufZ7a85vbcd72Vfuf/GG3Yf384d+2d75gwkDRhvySVu321Sq5sGzTwWtPbx3aNNN95/JbJ/2C3J8cVdy4tKT1rZw9lzBTUtPzBXvcnJS/afo271W4beMrKMLBrS0xmJGcsZEfe4Z9df+aOvH9g/ceDrf/SK+eHdNx6mUSLijea/ru67T/2z5YiI19+7Xviut40PRt//tvnYsC2vX78+/kK44pbsYWODfDjc8sEHH4y+Um7z+NFjyb5JueNjMrey5yovjawdGBFf+J//i1l/Zj1FLYN8eBL/brx98L57dp94e3h7kA8n8e+rJ37/pvuGr5EGEXGyf343WCB/ji7KlJbWEQtwfHeSyAzae3Q7bfl8H4xTnHTT5obxnaCkQLSoQSnpxikBWOxcFVcTHhKcMvZkKqvbuEKxus3QMiw3I6tYNyMLBpYzIu6t9RdOHsoliEefePLUo48+du5P3m27cswtHxEffPj4iaFHj+5fffjM5eXo20VFxN/5P44HEXHx55Hf+vrVFoI+mM/OjIg/euC/rP8zR0Rc45IHmXAm4H3z3O7SKPj3D75Z3B4cArVtx+Su3bvTua033n9/MLMpN8spnASb7rgUf8pOaedhg1zJ3Sk2e3wWcbEjmNP04ZDNhib3gq25+GnzuX8811nVXRQrKvP0iOdfsXNlDoueqXBIIPJkq1O3GodMPTW9Y2SljCy2VU9nJI68+dRjyXKmk2VOH/rD8sHXK73t2R+eOTIOER8884O33/7BmQeTVHF17bt/3nb1mtfTns1HxMlbOpsPfGNt7fBypMSLioj/6v97/au/9fiv/Z1YPvyrj/2Le3/4k1/+vIWgD+aznBHxdMW8NzVIj28qZr+RQybpMWyn3OSuwgyn4R+lyZ+vwcSm8Hb2z9vho+nhVX9tL4kgDhjfjDV7LCKOdQSLMWn76qApzPML76LkRYuqEWRFzhV8sr3qiVEy9zyyOV6NyrmO9VsGUkbWhpEFG4MVCZ56NJxxuvq1kyaadtr66888cTQTIr567qEli4h7qioifuL7668/vRQp8aIi4mv/z1+9/9d/8zfxgv7m+oe/sJgBXbKcEfH0S546AThdpngSAkci4rcP3iciZjYzvpedzFwKp2xFpz2Ft4O/x4uTYJfjj9mp7Zy0V2yCWmEKWXQu2ZI0ZZNmGQ5BbJNJaKYFWeGc8GIiFS8q+3H4mkFWJlcqn/dYfNaMp6/HnobxyyxfE7V+y9BrRlZyDiOL7dXTGYmpNCVesny4jz2brjExnBJ+7MKPNzZ+fOHYkSOHD66OFyZ+8FTvO7mPPbtRERE/+83Vo4+eOHHiiUcO71995Kl+BxULi4ihT5YzIp4uzHvT76GL5b2DR0sWmjCLmMYEs6aKCx2ECaaIeF7jBstPDos3e3zFiRorZLI9Bj1TXBpk8tCUuY65PTNfY1VW1GTVkeFnyAtHRc9VqHH8gdJDYhcSnYeZ7JbmbZWH1Kgty8rIMrJg07XXXnhm7NmXf/LKU48e/trJP3kr3Nj3HLGXnv3m6mS+cDih9N3LZx5eTaJFU4m7qTQi3rh29e2x76z1/ZvrRMQwh+WMiOdZizjJe5995KaDl8IHzh0c7lmMiDf3tBYxM6rx5Az+Op0yeVVEXKpGOw9b7HjSbLFmN4u4YfWX5s62c3xd0I3IluO7p3ywvbKo3A7xum1XkFU8JFa36tmMM7QMfWZkVR5iZDG/ZZiReGjt4stvv/Z8GCMuwXfX9bFn04g4TYmz+fAy9G0fe3ajKiLO7CMiFhFD3nJGxLUMlpII5gCndy/9zhfC9Ljs6+pyu8E2KfmAbclaxCLi+Y2mswWrTxaaPdaA1iJeqEiKtREOjPhCo9GZ3vFPqEeLyq5KWtHH4cOZVGnzgZLDSg8pplKxulXPdZylZVhqRpaRBal83DT24JkLp44cOXXhzIN9jxH7KV1oYpwSf+3Ysa+t5jr50MkX1tuuKLMTEQ+IiGEOOzMinvVn1lPUfbswXWJi8ycf/8bWIk42Dn7kw8yhzpNz8kncG264cffu3OKPmY0i4lK1J9Flood8s8fXlyh2BHOqs2T0DVlBBlSyamj+GZ58kL2sr2JFJQeVr5ZaPFdQ25rfwxU7JDdXs6Ju9Q+JnZoeM7KMLBrS0xmJPzh1aH/MgQMHhv+3+ujFt9uuY8P62bPrrz9z4qGD+VQ47d+jjz31St8D4n72bGHMiohz5ouIz8Fy2GkRMQAAAABb8v0nRMQ580XEQKhPEXFP3y6kDzw5F0M7d4JugiYYWdAQg6uv9GxfLUXP/uDJB4/EPHq+3yvEiIihUX2KiAEAAADoHxExNKpPEfFSvF1IN3lyLoZ27gTdBE0wsqAhBldf6dm+0rM9JiKGRvUpIgYAAACgf0TE0Kg+RcTeLmTH8uRcDO3cCboJmmBkQUMMrr7Ss32lZ3tMRAyNmjsivr7zbP5b0HYVIM6TczG0cyfoJmiCkQUNMbj6Ss/2lZ7tMRExNKpPETEAAAAA/bPtEfHzsDSWLSJ+3tuF7FSenIuhnTtBN0ETjCxoiMHVV3q2r/RsjzUREU89EHpgCSNiAAAAgJ55f/1nV6N+tv5+23VbmIYi4mvQa8sZEXu7kB3Lk3MxtHMn6CZogpEFDVmGwbXxl0sXNF1fjp5dTj3t2UvfWt2/f/Xg4SMZhw7s37//q6d/2HbtFkVEDHNYzogYAACAmTx/Yv/Aw+ffbLsmbJuNd1954bnnnrvy2l9utF0VtsVwmB4584PsDOIfnDmyuflEL0PxGBExzGE5I+K6bxdeOnbTF+4Z/xx6abzx3QufCe9ev37x0OYOxy6O7710b3JIuhHq2o73sl/94sdvuO3kdu7YP9szZyBpwHhLLnH7bpNa3TRo5rGgtU/eNtr08S++Gtk/7Jbk+OKu5UWlJ63s4ey5gpqWH5ir3uTkJfvPUbf8IdlaTb0k+sDIMrJoSE9nJGYsZ0Tc4559//ULjxzYP3HgkQuvmx/efeNhGiUiFhFDhR0YEf+r//rCrD8N/EYZ5cNJxnv16AP3fOb01cHNQUS87zOHLrw1fuilex/Y95nxnoN8+N5L4wfeOr3vpgeS3WBhJJOLMqWldcQCnLwtk8iMbqctn++DcYqTbtrcML4TlBSIFjUoJd04JQCLnaviasJDglPGnkxldRtXKFa38pa5njuaJWdkFetmZMHAckbEvfX+D08fyiWIX/vWuSePHTt+/vJftF055paPiL/69SdODh07un/1G2dfXo6+FRHDHHZmRPy7/91H9X/miIhrvF04yISTsHfg3QufGeW9g4j42L2H9h19d7z93kPHxhHx8KFg5vBL935hshvUsx2Tu267LZ3b+vEvfjGY2ZSb5RROgk13XIpUc0o7Dxvk1dydYrPHZxEXO4I5TR8O2Wxoci/YmoufNp/7J3OdVd1FsaIyT4949BM7V+aw6JkKhwQiT7Y6datxSKYKYqylYGSljCy2VU9nJI782XePJ8uZTpY5ffiPXmm7WovR25790dkj4xDxobMvXr364tmHklRx9fHv/7zt6jWvpz2bj4iTt3Q2H3jk8ccPL0dK3E5E/NPLf3Dg7Kn/tJAsDxqwnBHxdPmwt/DQpWOjAPmt08eOXkp2HgTLZg7TsNzkrsIMp+Hfw8mfr8HEpvB29s/b4aPp4f6WDeOA8c1Ys8ci4lhHsBiTtq8OmsIAp/AuSl60qBpBVuRcwSfbq54YJXPPI5vj1aic61hZc7PeKWFkXTey4PpgRYKnj4UzTlcfPG2iaae9/85zJ45mQsQ3zz+8ZBFxT1VFxCeef/+dZ5YiJW4hIv7p5d+9+9B/+9tfXbn7VFdT4iv7br5535VtK+7U7SWlnbp9ZRvOU1rb0vPOYlsK6Z7ljIinv12YzBmOPvSFYxc3/3+wHPHVow8Mb4d5crqCsSnEzGzG97KTmUvhlK3otKfwdvD3eHES7HL8NTu1nZP2ik1QK0whi84lW5KmbNIswyGIbTIJzbQgK5wTXkyk4kVlPw5fM8jK5Erl8x6Lz5rx9PXY0zB+meWrxVa1jDeHloiRlZzDyGJ79XRGYipNiZcsH+5jz6ZrTAynhK89/fb1628/vXbkyOGDq+OFiR96sved3MeevV4REV/61urRYydPnvzWo0f2rz769J+1W82GLToinuTDo5+upsQvHrj11gMvbldpV/5gV7S0K/tu2Xv40K47Tm2x/PX3rl9/b73+eWeyLYV00HJGxNOFqe/o++mSyHf80NWjg+WIX7r30EulU46HqxZLiWlCMGuquNBBmGCKiOc1brD85LB4s8dXnKixQibbY9AzxaVBJg9NmeuY2zPzNVZlRU1WHRl+fL1wVPRchRrHHyg9JHYh0XmYyW5p3lZ5SEnxYGQZWTC08adXnht74bU/f/3pY4cfPH353XBj33PEXrr0rdXJfOFwQulfvHz2G6tJtGgqcTeVRsTXN/7y6tgfP973b65baESczYcnKfHpJ99cbLq3daOIeDA79/bbb17ZdPO+U/vGN65cC7av3D7Od6+MHl6ZzApO97n55lvCB1Kn7li589vvvXpo154kIy6WXPdc+65s/v/tt9++kux5ZV9y3rILuTacx7ySPV1ZIelpt2Pm8463nBHxPGsRJwsLTwLhi4f2HT19bPAddklEfOnYTYOpxamLh3KFwBQ1npzBX6dTJq+KiEvVaOdhi51Mmi3W7GYRN6z+0tzZdq5cFzT3EfUpH2yvXmL0+pT3AbYzyCoeEqtb9TzP8suRYy0VI6vyECOL+S3DjMRDj//xa1f/9EoYIy7Bd9f1sWfTiDhNibP58DL0bR979npVRJzZR0S8fRHxmy8dPXLy3+974p/9+1E+/ND/tO/kvz9w/g9fW2y6t3WjiHjz/1d2HXzjo4/eOnzryi0HRjd2feVKsn3z/q4kSb3z4qDNLt65cssgQE332eyDw7feevit/ETfU3tW7vr2xrX1Vw/tumUSuRZLrnmucW33fnu4/a6VPaeurb+XnLfsQq7su/mWg28N+/ri3uR0JYUMEu2LH43Pu+WZzzveckbEtQzWiwjmACd3w0A4t2UQI4eZsK+rowElH7AtWYtYRDy/0XS2YPXJQrNbi7h1kRTrejgw4guNRmd6xz+hHi0quyppRR+HD2eios0HSg4rPaQYNcXqVj3XsbRlyj+ez3IysowsSOXjprGHzn7nzJEjZ75z9qG+x4j9lC40MU6JH1xbe3A118mHTv/w/bYryuxExAMLjYh//le//ODDDz987Uv3jCLiE49v3vvw/Y3IIgg7WxK63nro1fXR3eRGsH2Q79666w+uXDszins3bXz7rpU9Z4JDrsWXrbiy75Zdh388OGT9vQtJ5Fosue65RrU6+KPB9h8dHO6YnrfsQjaLCkxOV1LI5obx7OKzH3z0wUbzndCunRkRz/oz6ynqvl2YLjGx+ROuOzG8XbwxMEiJrUXM3Oo8OSefxL3hho/fdltu8cfMRhFxqdqT6DLRQ77Z4+tLFDuCOdVZMvqGrCADKlk1NP8MTz7IXtZXsaKSg6rjn0JadMPUw6YekpurWVG3+oeY6rhkjCwji4b0dEbii08e2h9z4MCB4f+tHvvu1bbr2LB+9uz77zx38uGD+VQ47d+jx59+ve8BcT97tjBmRcSNR8RjL/2fd48j4mMLyvO2Wxq6JhFrcCOIfMc3z+5d2Xt2dOj4ZhgLRyLiU3esZI0mEhdLrn+udM/JrbL6Jzc2j7/rYtLdg2nOFYWsv3f9o9E85HDRi97agRExAAAAAFvy/AkR8aIj4n/9rccXlOdtt6kR8cqurwwi3Stf2bVy57n14Qzb0YrCp/asDKfhVkfEg0UmLgYtPVr3YbysRKbk+ueaIyIeFDXKpgfrDI8XmigpZLzHMCi+eNdwynGvLWdE3NO3C+kDT87F0M6doJugCUYWNMTg6is921dL0bMvnnvoSMyxi/1eIWYxEfEbJ0/8j//ha39v+HPr0Rd/evU/v/nWf37zJz97+djjf2+8/aHPP/6fWsn65jF9FvGde0bf43bnxcGaC4Mle3eNpgPvvThcdDiMhdfP3Zn5jrcr+27ZezGzVMNksYliyfXPVUx3k/OWXcj6e9cv3jmexpyeLl7Ii5v77k3WpDj8xnudWz1kNssZEQMAAADQP4uJiL/74DeGK0uMf37lf3vw7/+HB//+HUduDDb+kwdfjGZxO9H6e9evv7c++v/kbnJjuGDvj68P22iS9I6WYUg3JIcMbHzw0Wgdh2Tfwlq+G8P1fYsl1z9Xesbk1uS8ZRcy2SUtq6KQYN+P8l+910PLGREvxduFdJMn52Jo507QTdAEIwsaYnD1lZ7tKz3bY4uJiL/3UCYiTn9uP3P24pn/4Xeffu7xx/7JQy+1kvVtv9jXzzVVcnPnotJyRsQAAAAA9M9iIuKXHz/+K9GIOP058i8ff6OVrG/7ZWYIN1xyc+ei0nJGxN4uZMfy5FwM7dwJugmaYGRBQwyuvtKzfaVne2wxEfH6L/96aml//UtJJ52xgIi4TuELVvOSYfE8ORdDO3eCboImGFnQEIOrr/RsX+nZHltMRAw9s5wRMQAAAAD9IyKGOSxnROztQnYsT87F0M6doJugCUYWNMTg6is921d6tsdExDCH5YyIAQAAAHpm/Wc/eTvqJz9bb7tuCyMihjksZ0Ts7UJ2LE/OxdDOnaCboAlGFjRkGQbXtatLFzRtLEfPLqee9uyz31zdv3/14OEjGV89sH///oMnX2i7douy7RHxOVgOSxgRAwAAMJPvP7F/4KFzr7ZdE7bNtbeuPPvMM8+88PLVa21XhW0xHKZHTj2XnUH83Kkjm5uf+H7btVuUbY+IgVCfIuK6bxc++8hNX7hn/HPwUulD94WvkS79TrL9C4+c285asxS2473sK/ffeMPu49u5Y/9sz5yBpAHjLbnE7btNanXToJnHgtY+vnu06cb7r0T2D7slOb64a3lR6UlLejheq6nnij1rSp9Hc1WstERP1yXS4ZEVO1dQ0+ohGbmOkv3nrVvuLPE2pM96OiMxYzkj4h737Porf/T1A/snDnz9j14xP7z7xsM0SkS8ISKG7bCwiPiG/+XCrD9bu7ISgxA4yXjfPnjfPbtPvD268+qJ3w/j33MHk5R4kA//zrMb6W73LdfLJ3YGUc+iTGlpHbEAx3cnIc6gvUe305bP98E4+Ek3bW4Y3wlKCkSLGpSSbowcFa3V1HNFqhfZMqVi43JLKjZ5qFBidCNLbGeOrGnnqria8JDglLFf0/MOrnzF4r8HoOuWMyLurfUXTh7KJYhHn3jy1KOPPnbuT95tu3LMLR8RH3z4+ImhR4/uX334zOXl6FsRMTRqoRHxFz+a4Wf2iLjG24WDTDgJewfePLc7zYF//+CbsZ0398nMHC7uCVNsx+Su3bvTua033n9/MBkqNzEqnASb7rgUMdGUdh42yJXcnWKzx2cRFzuCOU0fDtlsaHIv2JqLnzaf+8dznVXdRbGiMk+PWP41tVYlZ8pVL1Lh9HLqVCw2xX2wT+GZGd1If3V1ZMXPlTkseqbCIYHIr/F5BlfkLPE2pOd6OiNx5M2nHkuWM50sc/rQHy7JWx+97dkfnjkyDhEfPPODt9/+wZkHk1Rxde27f9529ZrX057NR8TJWzqbD3xjbe3wcqTEImJoVJ8i4unyYW/g2UfK5wYPsmIzh2lYbmJSYYbT8C/V5M/XYC5UeDv75+3w0fRwc53COGB8M9bssYg41hEsxqTtq4OmK9nENfsuSl60qBpBVlmtqs5VrF7ZlrKKTZ/oODoskhoXNkJi542s6Lty1W9xljzBI5vnHFxVZ/EvK/2w/spTj4YzTle/dtJE005bf/2ZJ45mQsRXzz20ZBFxT1VFxE98f/31p5ciJRYRQ6P6FBFPf7swnTNc8Owj+XWJizuM1yI2hZiZzfhedjIvKZygFJ32FN4O/h4vzjNcjqBoajsn7RWboFaYQhadfrYkTdmkWYZDdkGH+kFWOCe8GOHEi8p+HL4q+QlqNfVcxeqVbam6xvKlYrMT4gtTMD1dl0jnR1b+XNF/6coPCSoZOctcg6v0LIUq0m89nZGYSlPiJcuH+9iz6RoTwynhxy78eGPjxxeOHTly+ODqeGHiB0/1vpP72LMbFRHxs99cPfroiRMnnnjk8P7VR57qd1YhIoZG9Skini6cRTy4HUS+FelxpBApMY0IZk1FPkseJJgi4nmNGyw/nyze7PEVJ3yyeGEGPVNcGmTy0JS5jrk9M19jVVbUZNWR4QfLC0fNUato9cq2lJUWBlFp2FY8JLsSa3EjjO3MkVX1bC39rVt/fu8cg6vqLNk2hE669toLz4w9+/JPXnnq0cNfO/knb4Ub+54j9tKz31ydzBcOJ5S+e/nMw6tJtGgqcTeVRsQb166+Pfadtb5/c52IGBrVp4h4nrWI04WFy9ciLkwwPncwVwhMUePJGfx1OmXyqoi4VI12HrbY8aTZYs1uFnHD6i/NnW3n+IqpG5Etx3dPiW0ri8rtMLVW2xgRRytWOclzkr2lxqtLFDbGqkWvdHhkVR1SedgMh8w8uErPEmlDem4ZZiQeWrv48tuvPR/GiEvw3XV97Nk0Ik5T4mw+vAx928ee3aiKiDP7iIhFxDC/PkXEtQzWiwii4ODuqyd+/6ZgpeJzB5P1hy/9zhfCTNjX1dGAkg/YlqxFLCKe3yg9i0yxTJo91oDWIl6oeAKTDoz4QqPRmd7xT6hHi8quShr/WHll5rX1hSaiFas50bF0XrKnKxM7c2RFz5XJazcfqDG/d0reu4XBVbbaBnRbPm4ae/DMhVNHjpy6cObBvseI/ZQuNDFOib927NjXVnOdfOjkC+ttV5TZiYgHRMTQqIVGxDP+zHqKum8XpktM3HNT7tvr0gWHc99PN0iJrUXM3Oo8OdOJfzfu3p37czSzUURcqvYkukz0kG/2+PoSxY5gTnWWjM5Ngg0yoJJJsflnePJB9rK+ihWVHFSy5O+UWs00PbJ0eFZWLPalluXnKNtIP3V0ZJWdK6htzW+4ix2yLYMru4hLSRvSZz2dkfiDU4f2xxw4cGD4f6uPXny77To2rJ89u/76MyceOphPhdP+PfrYU6/0PSDuZ88WxqyIOEdEDFu3sIgYAAAAgC35/hMi4pypETGwRXMMzBb19O1C+sCTczG0cyfoJmiCkQUNMbj6Ss/21VL07A+efPBIzKPn+71CjIgYWjTHwAQAAACAbSQihhbNMTBbtBRvF9JNnpyLoZ07QTdBE4wsaIjB1Vd6tq/0bI+JiKFFcwxMAAAAANhGImJo0RwDs0XeLmTH8uRcDO3cCboJmmBkQUMMrr7Ss32lZ3tMRAwtqhiYAAAAALAYImJoy1bf4wEAAACAxrQdnkH/tT3KAQAAAKBU2+EZ9F/boxwAAAAASrUdnkH/tT3KAQAAAKBU2+EZ9F/boxwAAAAASrUdnkH/tT3KAQAAAKBU2+EZ9F/boxwAAAAASrUdnkH/tT3KAQAAAKBU2+EZ9F/boxwAAAAASk1Nt34KTCMiBgAAAKCjRMSwdXXnEwMAAABA17SdvUEHtD1MAQAAAKApbWdv0AFtD1MAAAAAaErb2Rt0QNvDFAAAAACa0nb2Bh3Q9jAFAAAAgKa0nb1BB7Q9TAEAAACgKVW52KXVz35i4u7T0/as3qPa6bs/8dnVSzMetNWTQl1tD1MAAAAAaEppKHb67iAXHobFFXFsLyNiETQTbQ9TAAAAAGhKSSSWCYgHBnlpeYorIqbX2h6mAAAAANCUeCJWSIgLj2YXoMikqcnDky3DR1cnq1akWXC6491pRBwt/LN33/3ZwmoX6UmzJ9jcdim4PSlidTVfr2AljcnZ03MlZs+u6Z22hykAAAAANCWeiFXN6g3i48HN4X65tDa5NSpkmMSOy0uPTm8Fj5cVHguss6cKTxCcN6hBcN7h1ty5hjfDc5lFzETbwxQAAAAAmhJPxOou/DDZL0lT89OJk0eDabqjHTKniJ4vdngolkuX3M5Ua3ynflVZem0PUwAAAABoSjwRq15oIl2f4RP5WcSZhwqP/jS9nc19g4i4ovBINeaJiMdny8TSYbViJbHc2h6mAAAAANCUkkismBFPtmSy3epZxBPR3DU6i7i68NJit3cWsYiYvLaHKQAAAAA0pSwTC5f3rVotuHwt4nhAm96OrUU8pfBiFWeIiAurIZetRRwe7bvqGGh7mAIAAABAU6pysWFKO5ZmtOlKEJ9dPR1ZnyE9LLaob/72aL/VyZTiqYUHZp1FfPfd2WplzxZZf3j8sJnEtD1MAQAAAKApbWdvi2HNCLak7WEKAAAAAE1pO3tbDBExW9L2MAUAAACAprSdvS2GiJgtaXuYAgAAAEBT2s7eoAPaHqYAAAAA0JS2szfogLaHKQAAAAA0pe3sDTqg7WEKAAAAAE1pO3uDDmh7mAIAAABAU9rO3qAD2h6mAAAAANCUDWCatocpAAAAADSl7ewNOqDtYQoAAAAATWk7e4MOaHuYAgAAAEBT2s7eoAPaHqYAAAAA0JS2szfogLaHKQAAAAA0pe3sDTqg7WEKAAAAAE1pO3uDDmh7mAIAAABAU9rO3qAD2h6mAAAAANCUtrM36IC2hykAAAAANKXt7A06oO1hCgAAAABNaTt7gw5oe5gCAAAAQFPazt6gA9oepgAAAADQlLazN+iAtocpAAAAADSl7ewNOqDtYQoAAAAATWk7e4MOaHuYAgAAAEBT2s7eoAPaHqYAAAAA0JR4IvbO+dUH1i5Xb1kSW73wRTbc4FybVtfWtv+cyXVs6YIKNaxZWttPv7aHKQAAAAA0JZ6IiYgTHYqIGz3VthQ+9/Oq7adf28MUAAAAAJoST8SmRHmX1x4YmWzZfHQ4MXSypbDDRnrkeNPgkPPvlJUWvZ0pZmRcxGR2alDKsPzzZfWIn2JQu/PjksKSyy88eupwz+iM3vgh5VcXb/Dc1QVHXY7VeVCTYYHRa8/1YL6GQQWmPxPKmj1Ww6nNG9le+uxqTtvDFAAAAACaEk/EKiPiy2vj7DLdNkwUw6Qvv0Pi8loSDI9uJDvHD4sUUaxKWkZ2PYRCydELzETEk2MGN/MZZqSq0VPnHo8kpdH8ubShS5qovN1Ka1IZEaf1LGvPGg1Ss9krS6vXKrHyG9P2MAUAAACApsQTsWASaSDJUcPZrdG5oIUdUuNoOEiICwdWR8RT1hyIVam6kGxEnJkO+07u0eg1Fk6d2bO6uoX2iabqNZsokrvmalLj2LIaTil8xr6Ll1b+tJmhFxrR9jAFAAAAgKbEE7GqTDX5mH+wGEJ8uYDcaglJQZtbJglx5sDKDDNXQKHKwVm3EhGnRY+zyHiImqlE1aljKXnkkIqrq99E0RtpabNFxKUXVd0gW4qIy582NXqhUW0PUwAAAABoSjwRmxIRFyLPfERctUjs5r5ra5PlJrZnFnEw+zeaJc4TEdecRRw79ZRZxNFDqq9uwbOIK9uzwVnE5U8bs4gBAAAAoBnTErnIlimrB09dLXawc2YKbsUCv5klcotVGd3Mx5I1ssr4KYKFg2OXVmPZ5Nil5C6g5JDSq6u/XHMs742sRRy99rLmKrbnbA1SPyKufNrU3K0xbQ9TAAAAAGhKPBGbMrs1WROg7GvXCjvkS4/unG58Z7IW8ur585XrNIRR52jD2tpqdoGI6OXETzHIHAfHl15aVVXTU4ebMxurD6lovcJ5a0fE6bFr55NlGSLXnm2iWA1H27KBfM2KZa68RlVL3lfIJPnFNTqa1PYwBQAAAICmLCpjC+QS4h1kgdNSFy+Wk1NT28MUAAAAAJqy4KhtOBl0x8aw/YuI0+nAO7jZO6DtYQoAAAAATWk7e4MOaHuYAgAAAEBT2s7eoAPaHqYAAAAA0JS2szfogLaHKQAAAAA0pe3sDTqg7WEKAAAAAE2JJ2KDbzlbu9xc4tZQ+Vstdvbjm26o7bXNtQ2/Cy/4Trx5zjIuanVtbXzsDmvYtocpAAAAADSlncRNRNyKxTT7HGcpHrLDGrbtYQoAAAAATYknYmlAt3lr9fz5tWSK6Mbl4PbA5v218+PppJNt4+0jk6BvUNJgkmigmApGH8gVODlLcf9MrhitQHIp4SmSS0rmsJYUPq5/2SkKZwxOEBQyqn6sesXbkZNmzzzZHjlFfp+ptZ3a1yViEfFaRTvn2yfo2cvnY7OISxt2YdoepgAAAADQlHgilomIHwhvBreDpDHNJNPEMo1CR7eCkmJzRNMjYo8Gm8Y7xvYv7lW4lHytclUd17Cs8EJGGTtjeHRycclDSVPF2icWEUeC0UwenPRD9hSxfarbZ3pfl4hExFXtXNW9Nbty4doepgAAAADQlHgilptF/E6yNbmd5HZBLpyZwBpOAR1ujEagceHhs+yfCa7DqhYmpmb2DKfRluex0Qfj5ZRmxEFCXK994hdeLD96isI+1e0zva9LVCw0MeWMhUMiF1554KK0PUwBAAAAoCnxRGy2iDjND8cRXiYznBxVIyJOl0YoRoixkDK/f25uc6puBpuLbksKjzVU9JLzFzCJb+u3T1k2nq6DkeudZDJxbJ/q9mk8Ii6esbwZax64KG0PUwAAAABoSjwRmzMi3sos4mA2cq0vL4vtH5/TGytkyizi6sKjZVbPIh7suLaWxLdbnEWcbYYgAA5OEdunun0aj4jLL2RKRNzaEsSJtocpAAAAADQlnojNuNBEcUmAumvtRs44ul2chZvNbKP7V68MXFKByFrE0wqP1qtqLeLCRcV2Tm+liwKXLX0RjW/DU0T3mVLbRiPiyvaptxbx1Io0p+1hCgAAAABNiSdiM84iXltbLSwCkKwPEI2F3wm+Di2zaVjMoLxYMJpZaiCyf+YU+f3LM+pJScF5pxWeq3VuSYTorNfBJN9ge2Tn5KSr589XLYBcuiJH5hSxfaK1jfZvrK+rVr2YHhHHzlg4JD59uvzARWl7mAIAAABAU7YcnrU3s7NbcglxR0+xrNoepgAAAADQlC2HZyLi6YaTd5ttpQWcYpm1PUwBAAAAoCltZ2/QAW0PUwAAAABoStvZG3RA28MUAAAAAJrSdvYGHdD2MAUAAACAprSdvUEHtD1MAQAAAKApbWdv0AFtD1MAAAAAaErz6do751cfWLu8PXtturxWb7/ZS55TpPzBpk2r599Z1Bl3khmqF9l15v5diLaHKQAAAAA0pfl0re2IuGnFmrcQSu8kImIAAAAA6I54IvbO+dXV8+fXHhgJIrvLkW3VG1fX1pIYMNkxkguG26MFpruura3Vq9jkWkYbSy+qUP7ltBHeyR422HA5uL1RjDmTmoweL1RsUN6gTYZbphW+kUxJToooudL8btUNHm+0zfuj806uadAY58cFh3OiKy7qgewZaz83wvbP9m+hR1rQ9jAFAAAAgKbEE7Fh3jhO45LcMBIhTt84igMn2WYa9cXWZsgHleGpE4PyCueL1iFfcslF5V1eS/YZ3hgeNipzFMOmt5NiS2cRR64lKG964WFFK84Y3a26weONNjokOXDYeWnUXe+ipvVL7LmRqVX+mHyPtKDtYQoAAAAATYknYmGiF40rMylidGOS/AVJX8XqvLFgM3pI7uFCyYWFCqLJatViCOMgcpJHhlNXw9uTk1ZFxLFryew/rfDopU9ZySHaNdHdIo02CqqD9wQyE4UnYXHlRU1/whSfG5Hab4T9m+mRFrQ9TAEAAACgKfFErDTxC+UWUgg2ZpO/fP6YX7Uge5bSBDUpLd0SRMTFilWWXJWyjk6anGcLEXH0WmaPiIPLq4qI87ttVDZ4WaMNDimtxqDcqRdV/YQpe26kW4r9m+uRFrQ9TAEAAACgKfFErDTxKyaTUzfGAs3i/NZ5ZhGH85PLZ9XOHBEPHlxbWwsy0xZnEQfzeKcsNFFvUYnMpnjOPFgKuLCkxLyziGd+bsT6N9cjLWh7mAIAAABAU+KJWEmaGl0lePrGUXqZW3WgNCKusRZxfsHeykNmj4izM2m3EhGXLdtbOyLO13n6GdPdqhu8rG7JN/QlU8QLi0ZMuaiZnjDRtYgL/ZvtkRa0PUwBAAAAoCnxRKw0TU2WDgjzuujGyRoHq2trkXUHivFs+G1tyY7l01xr1SFb/+qIOJ/czpXiVrVY9NTTF5oI1opIWjJsq0zzzdLgxUYrZruD/wyKK23tsosqduWU50ZYdKx/wx5pQdvDFAAAAACa0l7qtoO1nEfuHNVfeLdAbfdI28MUAAAAAJrSYuy2Mw1nuO6MXLR9OyIi3gk90vYwBQAAAICmtJm7QUe0PUwBAAAAoCltZ2/QAW0PUwAAAABoStvZG3RA28MUAAAAAJrSdvYGHdD2MAUAAACAprSdvUEHtD1MAQAAAKApWwrO3jm/+sDa5faO74lGmqGyUA0/o7aHKQAAAAA0ZUvBmYh4W4iId7y2hykAAAAANKU8Fbu89sDI6vl3hhsGueLYOF7MJI3J/pMtm4+unj+f3xrsubq2thoWVSh8uEPm0Gyhg5pdDm5vVBQVq0lxz3z1klILV1enJrXapFjyvIVH2zbso+R2dcdR0PYwBQAAAICmlERiQYZ4eW2SUYZZcT5pTB5Otw0D2PExwdHpzWE2OYlJo4UXU8tg6yjgTW+PbpUWVahJbM989fK7BjtOrUntNonM6Z2h8CltOy0irqoFE20PUwAAAABoSjwRmxIXXl7LJ41BTBl5NLdnOBG3eJrY4ZmaJScKb4cVqCwqXmxSq1z1RmXGrm56TWq3STwinlp4OA24uHFS6JQzRi+NvLaHKQAAAAA0JZ6IhalkIFmS4IFI0hgaHlwjDs0FnSWFl9WsNCKuKqpQgfyemRUrkui1cHW1Utx52qTWZWYOmewQbdvpEXHx0shre5gCAAAAQFPiiVgktBxkifkliONzg2OFTJlFXF14rtDpwWxVUdl0tLCoctks4vlqUq9NWp5FbObwdG0PUwAAAABoSkkklltzd+1yPmnMT1uNLI1bMne3xnq5kTmxQcVqT6+NFlWaG8fWKq5awHj6fOa6bTJPRFx7LeJsjYvTqqPlkNP2MAUAAACAppSnYskSBGHAONqwtlacoVrYv3x5h0lJSTnTC09Mz06nFJX/wrl8TdILWTufLT+3FEOdJS9qtkn4jXRzFJ47sLRtV8+fj63zXFlJhtoepgAAAADQlLaztx1MUspE28MUAAAAAJrSdva206Qzi313G4m2hykAAAAANKXt7A06oO1hCgAAAABNaTt7gw5oe5gCAAAAQFPazt6gA9oepgAAAADQlLazN+iAtocpAAAAADSl7ewNOqDtYQoAAAAATWk7e4MOaHuYAgAAAEBT2s7eoAPaHqYAAAAA0JS2szfogLaHKQAAAAA0pe3sDTqg7WEKAAAAAE1pO3uDDmh7mAIAAABAU9rO3qAD2h6mAAAAANCUtrM36IC2hykAAAAANKXt7A06oO1hCgAAAABNaTt7gw5oe5gCAAAAQFPazt6gA9oepgAAAADQlLJMbI0tWGR6yQK0PUwBAAAAoCllmdja2trbzEVE3D9tD1MAAAAAaEpZJiYinpuIuH/aHqYAAAAA0JSyTExEPDcRcf+0PUwBAAAAoCllmZiIeG4i4v5pe5gCAAAAQFPKMjER8dxExP3T9jAFAAAAgKaUZWIi4rmJiPun7WEKAAAAAE0py8QWHhEfvvmGv7X3qZ1Z2mxExO05vvuGG++/UmfjbNoepgAAAADQlLJMrEZEfPjmG1I3H95isNr7iDgMKjdvV6SWW4w0B4Undh+funP1ubYhX23K4EIH1zf578a0iHj+a2l7mAIAAABAU8oysXoR8SSGfWrv37phi5nsEkXEDaeuQfFX7r+xKotuvi6LJiIGAAAAgNmUZWKzRcSje+OpxOH25PbwxuFBkhzsFk5BHu6wd7wtLTecqpzsli+8dmnBbpNpz2V7zq86Ih6ktpmpvemk38nmbKR5//jxINwsHhJNRJN9R3sVZxcPE+RMSRWVyZ2iOFE5N016cjvcd7RreNrszOpc3WLFJQ1YXod8i42OLl7sDNoepgAAAADQlLJMbOaIOM2IyyLiMIEdTjsep7RP7b15c/twhzQ8Ht4a7BUUVRoR1ystLG5wM0iq08e3vGBGdUR8/P4bM4FrEISm2XEYEYexanqrcEjhRFfCu4WdIueaWpkS8T0nt3NB72DHcFNySOTUwcUNdrtxd3pM5eWEaXexPc0iBgAAAICMskysgYg42DmT/RZLm9wOo98pu9UsLSksuVM2LXl+5RFxfjZwNuNN7kQjzTB0LR6SO1FZRBzOvC2cYkplSi4nWlSmtsVJ08mGyosKm2H38Sv3746dpUYdRMQAAAAAUK4sE2s2Ik5n9kZLC27nFpCI7laztMzX61UWuDWVC01kv6gus1hCsgJCZUQcP6R4ovBuUmxx+m7JihCRyuROUVlUSbGZ4Hf6RY3nCyf/Ga/Tka7oXLMOImIAAAAAKFWWiTWyFnFmFnG9iDh8fHDI1OnB5aVFkuQa553dlK+ry0WbVStFlEXE1UvplqxFHJ2+m89ypy5bUdxzWkScOyp6bMlFDcPhZGGJ8b0gIa5ZBxExAAAAAJQqy8Rmi4iHK0KEd9LFfaMRcXz14Eiom1m9eHAnWni90rILUoz2q1jcOFi1uHhzCxFxJiTOrNVbWEshGnhGD4mfaLTOQ+RUaQ3CpLW6MoF4UdnlkifZb3rweAJwcMbsscWLGhxx443hMhmbd8f3Si+nOiLOXGz9r61re5gCAAAAQFPKMrF6EXFu0Yb8I39r7974LOLc4aXfQxeeIr/0RFB4zdKyu423tRARjxdWCALjsXRL9bzc4iG5E8WXoRimoqOtu3eHyXG6Y0VlMqJFBcst35/5xr1cXZNt4bHRi8rluNnJxrE6VEfE4cWKiAEAAABgoCwTqxERE1cSEVM0/8oPC9b2MAUAAACAppRlYiLiuYmIqx3fHa4c0YmEWEQMAAAAQG+VZWIi4rmJiKsFK0rUXuihbW0PUwAAAABoSlkmJiKem4i4f9oepgAAAADQlLJMTEQ8NxFx/7Q9TAEAAACgKWWZ2BpbsMj0kgVoe5gCAAAAQFPazt6gA9oepgAAAADQlLazN+iAtocpAAAAADSl7ewNOqDtYQoAAAAATWk7e4MOaHuYAgAAAEBT2s7eoAPaHqYAAAAA0JS2szfogLaHKQAAAAA0pe3sDTqg7WEKAAAAAE1pO3uDDmh7mAIAAABAU9rO3qAD2h6mAAAAANCUtrM36IC2hykAAAAANKXt7A06oO1hCgAAAABNaTt7gw5oe5gCAAAAQFPazt6gA9oepgAAAADQlLazN+iAtocpAAAAADSl7ewNOqDtYQoAAAAATWk7e4MOaHuYAgAAAEBT2s7eoAPaHqYAAAAA0JSp4dhKPQuI6aAtbQ9TAAAAAGjK1HBsZWVlaiEiYvptASMRAAAAAFoxNRwTEcMCRiIAAAAAtGJqOFYREb/zzjuf/OQnn3zySREx/bbIIQkAAAAAizQ1HCuLiEf58G/+5m/+4he/qIiIr9x/4w0Tu49va2wXP9nwJMmNbSxzYWesU5mKGzRgwaMSAAAAABZmajgWjYjDfPij8oUmBrHljfdfGd87vvuG4F6jFpaXLjiYLZ5OMrwQCx+XAAAAALAgU8OxlZWVJ5988pOf/OQ777wzOiSXD39UGhEf3x3NMzf/P02KkzuDADkz13jwyO7dgznIN96YxKBh6Lx5xObNdLdhyYMdc0UVSs5XMvPoqNSkspkMNtm3WHI4m/fG+++PnHKy86C2xaQ8evm5coqni1Wg7JLzlWcG7Q1QAAAAAGjW1HBsZWXlF7/4xW/+5m+OUuJiPvxRWUSchK2pQkY8uZkPZse30pvpo7mNwW7RVRciJcfqmD1ilL7mikoT72wliws+TK47aIH0Zmwyddnl58upt9BE+UVlK09tLY5QAAAAAGjU1HBstNBEkhIX8+GPKiLiWCQ7mpmbZJjZhDg4LIwy0/2GM2sHmyebcrtFct1CyZnqRB4dBdHjB+JFTVSvCRyLl4PAu7Ia1ddVdd7oRcUqT20tjU4AAAAAaNzUcCxZi3iUEhfz4Y9miIgnOWY6Azi3ysR4LYZ89hvO7E3XWKgRpUZLzlQx9mi4nEW+/OKeNSLi+NoaldXYUkRcdlHRRmC6hY9LAAAAAFiQqeFY9OvqcmZbi3h868b7jydZaWzCcXZBhMEe999/Y5Iv3787LWlKRFyxqkL80cHW3bHywz2mrvxQWo1oRFx5+TNHxJULSZhQPLsFjEQAAAAAaMXUcGwLEXFmneDcIryZxRxyS/VG1w4ezo0trkg8LSKOlRyInzec4ZwUlVu/YbaIuO5axPHLny0ijpUWrTy1LWAkAgAAAEArpoZjK/WUHh8se5CZ2xou5pDZL7bCQ27/wb6RGDb/ZW/5hReiwWju0ULSmt1QuJTJiaZFxOnRg8nQxZpUXn7xuqq2xC+5rB+oo+1hCgAAAABNaTt7Wz7RlSvY2doepgAAAADQlLaztyWRflecb4vroraHKQAAAAA0pe3sDTqg7WEKAAAAAE1pO3uDDmh7mAIAAABAU9rO3qAD2h6mAAAAANCUtrM36IC2hykAAAAANKXt7A06oO1hCgAAAABNaTt7gw5oe5gCAAAAQFPazt6gA9oepgAAAADQlLazN+iAtocpAAAAADSl7ewNOqDtYQoAAAAATWk7e4MOaHuYAgAAAEBT2s7eoAPaHqYAAAAA0JS2szfogLaHKQAAAAA0pe3sDTqg7WEKAAAAAE1pO3uDDmh7mAIAAABAU6KB2POwBETEAAAA8P+3dz+/cVwFAMf/Ii6sekUql0pckLi09oELyhEhcSimiSuZGyeUU6okJSm0ERKIoFKnsFWBCCRUFFW10qoF5OaABBGHJJvgX+u4w+zs7vzYnV2vnX1+nd3PR5YyHs+8mXXmXb56GgNMSsSx7wvCkogBAAAAIJmaiB/AgkokYgAAAADISMQsoUQiBgAAAICMRMwSSiRiAAAAAMhIxCyhRCIGAAAAgIxEzBJKJGIAAAAAyJw+Ed//6PLV9ubfz6TowVwlEjEAAAAAZE6ZiO9/9OONa1/53k9bG5sqcVhbl1588dLW2Zy1NBKJGAAAAAAyp0nEwz7c/1q0Srx16cVW39rmfIetbbaba61c7QXvXl1dvXr3pJc73VlLI5GIAQAAACBz4kRc7cPDSnzrd5+fbeMLp7N3dO/66ur1e0l3Z47D1jXbrEZfuD38v7h94XxNI5aIA0gkYgAAAADInDgRf/7xz9545+VLv/nWy/0+/Na3L73z8tU//P4fZ9v4gsr7am/p79rai/0VvoPlxb2lvqX9xeLfkeXH2bLhS2v9b7cuvTT4WWkp8dZrK6vX7xUheqfb2y6G6R9bvpny/mL82ntotbKzRker3NXySiRiAAAAAMicOBE/+t9+9/Dw8B8Xf9RPxG/fTL87PNjpnG3jCyqvsulGa+X17SS5/Wqr9dLV/sZLl7by/Un/R2ub2Qsj1rMFwfeur/R29I5pnX8/3dHdedDZ2+6vTE6O9oa/qa3XVlrr74393jp7R4P/m9vrrR9uDm8mHf/8H/v7711bGdxDf/zhXZXuIekthO59hJrRirtaXolEDAAAAACZEyfigY9/sjFIxL88o6p3hsqJePXaZ50HDz59vbRx9W6+P7Xz/qutlcubl1dWr/8zq66dz66tts5v9o4Z7KmMWbnK65+OX728Enjl8lb/xK3LK62y8++Wx+/f1VZxD3Vrj/PRSne1rBKJGAAAAAAyz5qIv//bm2dU9c5QJRHXbVR6b/tCa/Vqu7Snt1L3QnukCY8n4s57662V10b+gl2v6K5cu5f93/RXAhdXvH6v+H/r7tytXnHkrgZhecJoc/+NNU0iEQMAAABAZvZEvP3O29945efPZ1+rP7t7/z///vzevz//138/+eXN5wf73/ruzb9HKX5zdqJEvHm+tXrts5331lu9Fzk86L9A4tX3d8YTcev8u5XL7Pzz+mr5ncCba2ubpfXJvXHya3WK8UdvMt8uNefSuXWjzffX1UCJRAwAAAAAmdkT8V/e/EX2ZonB13M/ePPrr7z59R++8dXSzm++2fz6WP6rc1MScfHOhwu3e+8X3un23kHct367uzO6bLiz98dXR/5cXe9FwcVJvZHe30kPWx9899L59VKOLo+fjTKeiNNjbq9Xzp042rJLJGIAAAAAyMyeiP/6ViURF19r77Zvv/u1H//5bzd/9c23Po5S/Oap+ANv3Z10u//n5UY2Kq99GP7dt/KJ5VOGdrq9n1X3lU4antc/rHdkt9sboXzp/Mjy/vK1hicPzp0y2nJLJGIAAAAAyMyeiD+5+evnahNx8fXGd25uRyl+Z81a3IZLJGIAAAAAyMyeiDv7T48d7en+cixQtRa34RKJGAAAAAAysydiWBiJRAwAAAAAGYmYJZRIxAAAAACQkYhZQolEDAAAAAAZiZgllEjEAAAAAJCpDWLvwaKTiAEAAAAgmZCIgbLY0xQAAAAAQond3qABYk9TAAAAAAgldnuDBog9TQEAAAAglNjtDRog9jQFAAAAgFBitzdogNjTFAAAAABCid3eoAFiT1MAAAAACCV2e4MGiD1NAQAAACCU2O0NGiD2NAUAAACAUGK3N2iA2NMUAAAAAEKJ3d6gAWJPUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAHdB44Te5oCAAAAQCix2xs0QOxpCgAAAAChxG5v0ACxpykAAAAAhBK7vUEDxJ6mAAAAABBK7PYGDRB7mgIAAABAKLHbGzRA7GkKAAAAAKHEbm/QALGnKQAAAACEUl/EPrxy7oVRG7f6+3v/FhvP4NZGNu65Kx8+2zj1nvUO07sLdGc0T+xpCgAAAACh1BexY/vqHFpx4AYrETM/sacpAAAAAIRSX8TOIBHPYx1yyPElYgqxpykAAAAAhFJfxCb11dEyPHhXROltEfme4enpkec2Ns6V9tyvvMhi+P6K6ji1Z9WeO3LZfG/lI9Td1QsbV4YjFS24OHCjSMS1g5dvrzhAVV5MsacpAAAAAIRSX8TG30U80l3rVxEX3/S2+rk0G6omNxfH9gLr4IB8c9JZ5YMnjpBduHovtXc16LnF2cVW6eeTBs9v71YlJovEiyj2NAUAAACAUOqL2KyriKtHji7czWtqXTatj8zHnXV8gy2PMNv4+QGVwWuvVHt7pYbMgoo9TQEAAAAglPoidvpEXDaymnfCUJUWO9w74axJ5bh66fFEPPWuytesTcRTBi8OHnv3BQsk9jQFAAAAgFDqi9gcVhGffKiesTXAI2rX9o6u6Z2yirjurqavIp4++PjticSLKPY0BQAAAIBQ6ovYyRJxXlBLp00vtJX9k95FXNtaR95FnF16ZIDJ7yI+rmzXvYv4mMGrvwGJeEHFnqYAAAAAEEp9ETvB0t/BWxhKf7ut9EKGWYYqxpjhrMrBteffqntVxdS7qruTc1euDJcUHzt4+T0T/ljdYoo9TQEAAAAglNjtDRog9jQFAAAAgFBitzdogNjTFAAAAABCid3eoAFiT1MAAAAACCV2e4MGiD1NAQAAACCU2O0NGiD2NAUAAACAUGK3N2iA2NMUAAAAAEKJ3d6gAWJPUwAAAAAIJXZ7gwaIPU0BAAAAIJQd4DixpykAAAAAhBK7vUEDxJ6mAAAAABBK7PYGDRB7mgIAAABAKLHbGzRA7GkKAAAAAKHEbm/QALGnKQAAAACEEru9QQPEnqYAAAAAEErs9gYNEHuaAgAAAEAosdsbNEDsaQoAAAAAodQGsQ8++OBPsBwkYgAAAACW2aRE/OjRo06n8zjzBBZO+ng/fPgwfdQlYgAAAACW2aRE3Ol0njx5km7v7u7uwQJJH+n0we5XYokYAAAAgCU3KRE/fvw43djf3+92u4ewKNLn+eDgIH2w+5VYIgYAAABgyU1JxLu7u91u9+nTp0dHR1/Aokif54ODg/TxlogBAAAAYFIifvLkyd7e3uHhYb8Px75NmJv0ee52u+njLREDAAAAwLGJWB9mwaSPdPpgS8QAAAAAkEjELB+JGAAAAAByJ07ED+7cuNjePtE1Zjxl9pHHjzzRXZ3iI5z43N5xqRvt9uD4/MRnuTrzIBEDAAAAQG4ZE/GzOPVnkYi/NCRiAAAAAMidPhGXU2d5e7t9caC/J/++2kWnHzZYhFs6Ld2TLcktyQcszm23y8ffedD7UfvOYLDe96Mf4cadOzX3Nxywd8XhWTWfZcJHK/bfuLM98us6boTiY8rIoUjEAAAAAJCbdyLeLjfawWbNutnph6U/rcu5F8fPGbur7fbgzMFG1mD7u3qb4+98uJgfn1+z2OydUk7ElUtXDqseVfNbqvu95edVfwnqcFgSMQAAAADkAiTikVo6KRHPclhSxORJi5bHb2CQhke6cJIvLJ69chen1F6osox5wmHTEnH5rLqPSRj9RLy/vy8RAwAAAMC8E3H5HRFjK4FHx5l2WPEiipMl4n7ULS0mLsXbQYed/hEqVXhyIq7cwwyH1Sfismq+JhiJGAAAAABy80/EuZrXKNSpOay09HfGy5X2pJvtdnv8pRFfylXEteVcIg5LIgYAAACA3GyJeNKLegdbxQt0R96dMCkRTz9stNyOLa+dmoiLUwajl/403DEXqnvJ8Jm8i3jWnM48eBcxAAAAAORmXUVcvBSh8haG4a477VL2rLwgojiwUj6nH1Z6C0W7faP6doj6Act7euuIy+t7e0PUvtFiYnYe3l37zugq4sqF8g8xeTFwzbVqR5h8b/WvtuD0JGIAAAAAyM2aiBukXIhr/y7eiYZSZReORAwAAAAAuQVLxNkK3XITPkUiLpYwj75lgoUgEQMAAABAbnoi7na7zUrEMF36PB8dHUnEAAAAANA3JRHv7u4eHBwcHR19AYsifZ6fPn3a7XbTx/vx48cSMQAAAABLbkoiTjf29/cPDg663e4hLIr0eU4f7PTxlogBAAAAYFIi7nQ6/Uq8u7u7R539hoj9e/rSSR/p9MFOH+/0IZeIAQAAAFhykxLxw4cP+5UYFszjTPp4P3r0SCIGAAAAYMlNSsSwJCRiAAAAAJbZLH0MllzsaQoAAAAAocRub9AAsacpAAAAAIQSu71BA8SepgAAAAAQSuz2Bg0Qe5oCAAAAQCix2xs0QOxpCgAAAAChxG5v0ACxpykAAAAAhBK7vUEDxJ6mAAAAABBK7PYGDRB7mgIAAABAKLHbGzRA7GkKAAAAAKHEbm/QALGnKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc7/8e5P0kCmVuZHN0cmVhbQplbmRvYmoKMjE4IDAgb2JqCjkyNQplbmRvYmoKMjE5IDAgb2JqCjI1NzcwCmVuZG9iagoyMjAgMCBvYmoKPDwKICAvTmFtZSAvSW03CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDIyMiAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAxOTE1CiAgL0hlaWdodCA0NDYKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgL0RldmljZUdyYXkKPj4Kc3RyZWFtCnic7cExAQAAAMKg/qlnCy+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgaU6PBHsKZW5kc3RyZWFtCmVuZG9iagoyMjEgMCBvYmoKPDwKICAvTmFtZSAvSW04CiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDIyMyAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAxOTE1CiAgL0hlaWdodCA0NDYKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgWy9JQ0NCYXNlZCA1IDAgUl0KICAvU01hc2sgMjIwIDAgUgo+PgpzdHJlYW0KeJzs3d+P3WZ+J+j6W+beaEB1OTc7V32/2DiWvIEkYL3AYoPJbSdOa6NBI5K1gwUWWSRBqr1tYIHFOo0j/0DaAWJ0pT0YYFFYxyi1250GBj3G6Ca+arnkrZ9WyXPIc0i+JF/y8Jw6LNYpPg8aFuvly5cveQ6rSh+9/T3ffQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBGef8PtgLfe+tXXQ761VvfW6L3klP5g/fXM051rPmke5j4ppjegZFeOQAAAADQu3LYvEQauzGBczBYkDePMnCe3ZUxXjkAAAAA0LssgC0iyDySXZhKbk7gnE8xzJtHGbsKnAEAAACAvkTT3SSVLUWSpZi26FwPnIOQN2gt+hX7m8b/g/drUyqtwK5Gx9/7gz+oJublw773ve8Fe+d56/cqE28/ReO8G44rX1JxeHydda31D94vdqc7K1+2D1K8pKW7Wn8Zpc4AAAAAwFrlEefiPpGoshw4R/rNx43s6bw3Uu8jmp7WryELXt9KO852z9rmTdnEO5+icqbG45qqlDReUvMdzMPxStfmQVoqpAicAQAAAIAedShfMUspK2lmKZCd7avUagi/zIPOSuJaWr5bjZ9LCXFpX3zQ5msrxsiu5f36xLucojTvDsdFL6mS8YdflsubVEqblAZtGSSfZSXFLqXrsmYAAAAAYO2WqZdc/xC+MGWNr6stxaO1ChZFBhwpy1Gv8pEpBbDN0WkxThYN59l59NgOp+g4tVqoW7/eqrRz5XzxLxcNUptkeRiBMwAAAADQky4lNWJRcufAORakLgicS3OKRatLB87zoHlW7TmoLVFZSbz4FLH13R0ut0NWHO6LrlvuPIjAGQAAAAAYSHyJc9JaqQdRrnfcGDhHo+vW4LZtOXCliEUsJ+4SONc+Xi+WlHc5RbeptS7abpv2soFz/NoFzgAAAADAQCqBctASC5Jb0tn5rtjnCbYGt20Fj+OfSrh84Bysv67W+FjqFI3Bcbz6clsN58odXViZOV7tOTJIp8C5WxEVAAAAAIAltRYEbtgbCZxjPWOfqJeIp9iRY6O7VgicK5+kt7AWyBIrnGM3rbLze9+LxcP1w7oHzi2DdAucy10AAAAAANaokpCWUtzS8uDIOtvI4uhynLn4w/fCU5R3FkMmhwcFIZYLnKPZeC0pX3SKjlMr78w/tTB6vZHb1ylwbhxkQeBcW+0NAAAAAMDVVS1TsjAbBwAAAACAqGgdEnkzAAAAAAArqGTO0mYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4Er4CujAcwQAAADAeAicoVeeIwAAAADGQ+AMvfIcAQAAADAeAmfolecIAAAAgPEQOEOvPEcAAAAAjIfAGXrlOQIAAABgPATO0CvPEQAAAADj0WPg/NH973//jZ3PlpnNZztvfP/+R6teC1xBlxo4L3joprvre6ON/Uge8Ez7g37RbwWXeFEAAAAABHoLnNPA6P79xaGRkJlr7RID54UP3aCBcxKG5zNLo+eW517gDAAAALCZ+gqcZ3lRl9RI4My1dnmB8+KHbsDAuRQ3J5J5Np9X4AwAAACwmXoKnPO4qJr7BP+f+mz/TNorTJmKntkA6d6drLkYNh9DxMTVs+pz9MuP/8//7d/FPfzrv/tl/YDGhy5/QJLVz9meaGN5rMizFhz2Uemc5TXL9bi3ljd/Vd37/aaBayft8K0geqXh4G/cv//GwroeAAAAACytn8D5o1LaU86Dgngq3ayGzLPtoGe+mSZa88GK/U3ngith1efoF3/5h6/9Xtxrf/iXv6j1X/zQBQ9QtDEQf9aK5zNfnhw+sm9MpYckgW5lxLZns/KwV8aNnLT5W0HblZYHlzUDAAAA9KKXwLkpZI6GTtHAubq+MY+JSqudq9E0XD2rP0dPd/8ikjm/9of/Pra+udNDl30RbQxFn7Wmp3I+5Bs7H+28keyPlcPo+o9B4cO+5LeChRcVPRwAAACAteohcA6qZpT/n+zxmCcaOJfioqw1vhb6q/D/My955qpZPXD+qp45N6TNXR+6+XMVbayNF/1noFC+hHi68VmaNX+UfmDhR5GPLWz/d6HSyPXAuXbS2PQaL6plcAAAAADWbf2Bcz3MyZOgNaxwjgbOXxUd5UhcMRcKnL8KM+emtLn7Q7fUCuf2p7KQ5Ms7wTrnnUjeHHs4s5ZSUty+wrl1etGLah8cAAAAgHVbe+AcDX2DnCus4dytUEaphnM0BAs/HUyOxNVy0cD5qyRz/ss/+u8b0+bOD92SNZzr/7hT+YjArEOlevMbtQLO+RHFiZqrLDfXcO5e+L0YfcHgAAAAAKzZugPnhlKt5Q/+K5e/mDfFimaE/8/95hXORUUNdVm5ctYQOC/Q9aFLFx9XC02UGnOLy9cEh4SfwZd/MF/TTL9fff7Lj/pHkfo59ZM2TS9yUQsHBwAAAGCd1h04AyWeIwAAAADGQ+AMvfIcAQAAADAeAmfolecIAAAAgPEQOEOvPEcAAAAAjIfAGXrlOQIAAABgPATO0CvPEQAAAADjIXCGXnmOAAAAABgPgTP0ynMEAAAAwHisHDgfAh14jgAAAAAYD4Ez9MpzBAAAAMB4CJyhV54jAAAAAMZD4Ay98hwBAAAAMB4CZ+iV5wgAAACA8RA4Q688RwAAAACMh8AZeuU5AgAAAGA8BM7QK88RAAAAAOOx9sD5UxiNiz9i63uUAQAAAGB4fQTOK48JG0TgDAAAAAAVK6dtTQPOAuffwbUmcAYAAACAOoEzrEDgDAAAAAB1AmdYgcAZAAAAAOoEzrACgTMAAAAA1AmcYQUCZwDqHt/eyt1+vKBfW4fFZ1n5aAAAgH4JnGEFAmcAyp48uLG1dePBk/oXdQJnAADg+hI4XzFP/ur3tzO//1dPOnTv0Gs9RxEQOANQ0pwCp+Hz3DyDDjsXu8tp9e3bN0qtecfbt6NHFz3T0W/cuFE6GgAA4JIMGTj/y5P/8B+e/EvPweBGSdLmmz/5cn6LP/nh9vYPftZ+xOc/vnXrx58ve57VjiIgcAYg1LikOdlRi5nzreCwYu8sRE5aZ1tFY9pzVrcjb6xn2EEHAACASzdY4PwvT/6vP/pvtv/bf/8f+88GN8bP/nj71ju/PT6Yf3l49sm9m3+TLkTO1z1XFyYn0fGbfzzbmYXTxSLpPK6uNGWBc9K8KNImSuAMQGhBmYuiuHORGU97l2Lq1hQ67Fk9V2VwJTcAAIBBDRM4z9Lmqf/uf/9/LyUe3AhP/ubmrZ/85iBoOTw7T+LnJ3/12vYPP0nu+ic/3H6tFDl//uNb29t/+o/TXV++czMNj6ed54ukP7m3/WaaJv/sB9m66XmnWeD8sx+89uPffnd2eLlXeU0InAEIta5wnue/s1IXtcC5JF/X3BI4p9vBWujK4AJnAABgUAMEznnaLHAuCwtd/OwHwYrkv39z+97P01z48Of3tt/8+/Ix830Hv/nJrWQ99MHx+W9//Nr86HSBdBBkT3cmCXMaUydB9fFBdRJ0I3AGoKQh5Y2vTI6ucI4d077CuWHZs8AZAAAY0gCB89/98N/kH4sncA4cfPzD7Zt/PVu/fHiW3ORP7m3/6T/87nf/8KfpH4lgM5VEx/OGeV6dRNVv/uP86DTArldsTlre+eSdm6/55MBVCZwBKCuFx3nx5aAK86zyRWmFc3hQsdlc2LlSwzk+uMAZAAAY1ACB8+H//8X//T//G4Fz3eF/eudWWDLjZ29up2nyP799KyuO8eb2rbf/OTgkXauc7nvy1ze3f/jxQRJJz5Y8J0enQXMYZP/sB0kZ6DSC/ufjf6wW6KAzgTMANaUKGVniWzTevp0lwWEkXFRgzlqigXMxUDFMfHCBMwAAMKgBAuffPXt+cjjPnAXOJUnFi398M1//vf2nn6Qllg+Of/vOzazlvFQGI4mO7/3prILGDz9JOidVN1Jv/ul0I62/cXj25U9ubgcDzNc8H57VakLTkcAZAAAAAOqGCJx/V2TOv/9//H+XkQ5uklkxjZn8A/2SJLrcUuw4Pzs7D/dlA5ydneVt+fGzhuSoNLee9j1Xx3kVAmcAAAAAqBsocP5dmjm/eHl+9k3v0SCsn8AZAAAAAOqGC5xhgwmcAQAAAKBO4AwrEDgDAAAAQJ3AGVYgcAYAAACAOoEzrEDgDAAAAAB1AmdYQd+B828BAAAA4AoTOMMa9R04AwAAAMAmWnvg/DGMg8AZAAAAACrWHjgDIc8RAAAAAOMhcIZeeY4AAAAAGA+BM/TKcwQAAADAeAicoVeeIwAAAADGQ+AMvfIcAQAAADAeAmfolecIAAAAgPEQOEOvPEcA47G3t/cLALgyhv7BCMBICZyhV54jgPHY29v7+uuvDw4Onqe+AYAhTH8SPXv2bPpTaegfjACMlMAZeuU5AhiP6V/tp3/Hn/5Nf7p9dHR0DACXa/rTZ/ozaJY5C5wBGIrAGXrlOQIYj+lf7Z8/fz7dODk5OT09/RYALstZavrTZ/oz6DDNnAXOAAxl5cAZuLihvwEAsE6zwPno6Gj6V/4XL16cn5+/BIBLNP3Rc3p6Ov1JJHAGYEBD520wakN/AwBgnaZ/tZ/+Bf/4+Pjbb7/N0+ahf9QAMCLTnztnZ2fTn0QCZwAGNPTPQxi1ob8BALBOYeAsagbg8k1/+kx/BgmcARjW0D8PYdSG/gYAsIzHt7dyNx48aen55MGNrduPVz/TRY8fSilw/s8/ubW9vX3vk/x7/if3yl/nvnznVmVH0hLr2VF6prlb73zZ0vOCJ7rw8QCsl8AZgKtg6J+HMGpDfwMA6CqJgLfufng29+Hd1sz5l29tb919b/WzXfT4odQC51u37uV57yf3bt2Kp7Np4FyKnC+Q41bS6yR7bsmcBc4A14vAGYCrYOifhzBqQ38DAJj79EevbG298qNPm/Y/vrO1/ejXp8fZ18env360vXVntgg5DaNn5suSS4FxvjA6W7M87X/jwYNqa9Dzxp07+fH1wZPDb9++UT60acz64eWuSWr+ONhumXOHNde1wPnevXtZ2vvlO8kXaTr7yb0spP3ynVvT/bPUtmit5Lj5euVZS7Av2czGn/ZKNud/BCr9S2O1nmg+vXeqrUHPW9klNQ2edoiv6wagBwJnAK6CoX8ewqgN/Q0A4PDw3ZtbN989+unrW1uv//SffvRKNHZO8+ZfHYVNRyenZ2kA/fh2kkWn656TEDpNZYPAOd+d70z3Zsd8eDfPeYuBPri7tTU7vmnwrbsfTJuKALxhzNjhs653Psgaw+15gh6Zc365reqB8yef3Mti4nvvfJKlu59kMfRsI0t9S0F0tpknyHnbLKX+Lot48xg6njcXgn3hWM0nmp0gn2o12/4urBLSNLisGeBSCZwBuAqG/nkIozb0NwCAw3dvbVXc+ttap/fubt19/yhy9GGy2Pns9GS27+j9u7OcuAici6j66OSDu7NEN937weyYz5OYN+uZNR5/8Wh+fOPgH1TC3/iYscOTrtuPvkiPP/rVo2J72mH7rScNc+4mEjh/+c6tJHJN/yiS3HniPP+j1l5qKRLkLJDOEuek9zuztqKpW8IbDNV+onC1c9EzvhS7eXAALskscD45ORE4AzCgoX8ewqgN/Q0A4PDkNFneO3k9iZpfnyTbpye1Tp8/2p5lsQ2CjxOsBM7v3S2F2ekoYcGNfPtJWIWjSIdbBw9Ex4wengbOb/0y75pvv5cEzr9smHM3kcA5XdqcrDxON2+V1iPX4+UsOC6lu6HZAbNEN/3vvGc1i24SDFcPnGsnigbO5Rg5TJ+bBwfgkgicAbgKhv55CKM29DcAgERawPn1SRI6N5RxTlf/PizlrnlR4yTQnRWlSCtQ1APn4qMGz2brjaPhcCljztPn9sED8cA5dninwLk2525igfN8HXI5Rk5XPOf1nUvBbBoZfxJdTlxIWt/J107n65y/+y5SU+PLopBHvXRzfN1y7dDGnh0HB+CSCJwBuAqG/nkIozb0NwCAtIZzEjefnpycpuucb74b6ZQWuQg+NS9Jcme1KJ4EBS6SpLeyhvn4g7Cg8mwrHg6HPe/MlyMvGDzQvGq6evjiwDk2526igXOaxUYXDNeKHhe7ig/aKxVMDotebG/XKzlnX5ZWINdKMwdnj9VwjlVzbu65nZX0aB0cgMuhhjMAV8HQPw9h1Ib+BgAwr6kxK6MRbFYlH5r3YVBqYvvRr2crf49O0iw6dePO3Vn15CD+PT7ND9t+9EV6SEP5i+PTX89HunH37qx10eCF+Krp2OGLA+fYnPMF3a3igXN8xe+8uPN31fasIVKpIli6HObVweLi6hH1g+aN9+7dqgXF9RM1BM7FSPk4iwcH4DIInAG4Cob+eQijNvQ3AIBlHJ9G60wcnWTtp1Nnp8ezptPj6mH55/cFe0s9s5HycRYPHk4iMmbk8KQtn324HXzCYPucm5UC55cv234ABHkzAKyLwBmAq2Don4cwakN/AwBgnfLA+ezs7Pz8vOmbf7oYuPWz/QBgSS9T058+AmcABjf0T0UYtaG/AQCwTrPA+ejo6PT0dPpX/pcAcImmP3pevHhxdnY2/Un0/PlzgTMAQ1k5KPsK6EDgDDAes8B5unFycpKU8Dg7+xYALtH0R8/0Z9D0J5HAGYABCZyhVwJngPGY/tX+4OBgljkfHR0dw6BOGM7QLz7jNf3pM/0ZNP1JNP15JHAGYCgCZ+iVwBlgPKZ/tX/27NkscwaAy/c8Nf1J9PXXXwucARiKwBl6JXAGGI89ALhKhv7BCMBICZyhVwJnAAAAAMZD4Ay9EjgDAAAAMB4CZ+iVwBkAAACA8Vh/4PzZzhvfL3lj57P1p3jJWe5/tN6e0AOBMwAAAADj0U/gHAa8H93vKXNuIWTmyhA4AwAAADAe/QfOs8j5cuNfgTNXhsAZAAAAgPG4jMA5SZzzNc5J+pwK+uRt4VLooDTHvOu05Y37999IG4qzJK07O+Go+XDpaOF8ijGzE6V7d7Lmy16JzQgInAHGY29v7xdDGPq6AQAACpcSOOdNpZg4i3eDOLrYDFZFl46uNc5D5Nl2Vr6jGjIXe+et+WZ6dP2csC4CZ4Dx2Nvb+/rrrw8ODp6nvunZ9ETPnj2bnnTo6wYAAChcauBc2pWHy7GcN1wTXRqmtDL5o/JW8UU0cI6ePT4mrI3AGWA89vb2Dg4Ovvnmm+n20dHRcW+mg09PMcucBc4AAMCVcimBc5juhup1NurrnxtGbgic56eK9iyF2LEMXOBMDwTOAOOxt7f3/Pnz6cbJycnZ2dm3/ZiOfHp6Oj3FYZo5C5wBAIAr5TIC51L9itZEN+/ZuMJ5QeC80gpngTM9EjgDjMcscD46Ojo7O3vx4sW/+osHS/3vZWfn5+enp6fTEwmcAQCAq6b/wDmrq1zZV8qBgxrO9XrLeYfmwLlahTleKKOphrPAmR4JnAHGY29v75tvvjk+Pv7222/Pz8//1V88eOU//l3H/007d/817OXLl2dnZ9MTCZwBAICrpp/AuaS+3LlcTyOsqBE0BuPUPiiwtsL5/v3y8fODY0Uz6h0FzvRI4AwwHmHg/PLly14D5+kpBM4AAMAVtP7A+bKJibnSBM4Al+3x7a3cjQdPWno+eXBj6/bj9Z1Z4AwAACBwhl4JnAEuUxIhb9398Gzuw7utmfMv39reuvve+s4ucAYAABA4Q68EzgBr9OmPXtnaeuVHnzbtf3xna/vRr0+Ps6+PT3/9aHvrznwRc770OVvVXAqca3ufPLhx4/btG2lLt7XQAmcAAIDND5zhShM4A6zHuze3br579NPXt7Ze/+k//eiVaOyc5s2/Ogqbjk5Oz2YB9OPbSRg9X/c8W/YcBM4Ne7fufjBtOj0uhmmz9sD5y3dubZfd+0TgDAAAXGkCZ+iVwBlgLd69tVVx629rnd67u3X3/aPI0YdpGH33g5N05/EHd7e2Hz4JA+fGvR8sTJkDPaxwLkfOt9758rsicD45ORE4AwAAV43AGXolcAZYi5PTZPXx5PUkan59kmyfntQ6ff5oe/uteMXmJ2H1jLTfL4PAuX1vZ72U1PjkXmV5s8AZAAC4ygTO0CuBM8C6pAWcX58koXNDGeej9+eLkwtZ8eVkV54ev3dnqxwpt+/trJ8aztki52x5s8AZAAC4ygTO0CuBM8B6vHszXdt8enJymq5zvvlupNPxF4+2t4JP90s+CHD70RdJWYykUsasNnNR6rmIlNv3dtXXhwami5zz5c0CZwAA4CpbOXAeeuKwGTxHAOuR1tSYldEINquSD/f78G5R6Hn70a9PZ6WZD49P8x13P5w1BpFy+958oXS7vgLn7758516xvPk7HxoIAABcYQJn6JXnCOCyHaflnmeytLm843T+SYBJPJ1tt+8t9WzUW+BcJXAGAACuLIEz9MpzBDAeAmcAAACBM/TKcwQwHnngfHZ21l/gPB35/Pxc4AwAAFxNAmfolecIYDxmgfPR0dHp6en5+fm/+osHS/3vZTfTkV+8eHF2djY90fPnzwXOAADAlSJwhl55jgDGYxY4TzdOTk5OT5Oa0N/2Yzry9BTTEwmcAQCAq0bgDL3yHAGMx97e3sHBwSxzPjo6Ou7mpGbhIdPBp6eYnmh6OoEzAABwpQicoVeeI4Dx2Nvbe/bs2Sxz7tXz1PREX3/9tcAZAAC4UgTO0CvPEcB47A1k6OsGAAAoCJyhV54jAAAAAMZD4Ay98hwBAAAAMB4CZ+iV5wgAAACA8RA4Q688RwAAAACMh8AZeuU5AgAAAGA8BM7QK88RAAAAAOMhcIZeeY4AxmNvb+8XsD5Dv6MBAGAV6w+cn+7uPCyZ7F/a1STnTk6X/XnJp73s8y5n/sLsTCZtk4xfQvOFDXLtl3Cu+nWtelKBM8B47O3tff311wcHB89T38BKpm+hZ8+eTd9OQ7+jAQBgFf0EzmEutz+5vMx5oMB3IwLnjnMTODedS+AMwCJ7e3sHBwfffPPNdPvo6OgYljR920zfPLPMWeAMAMCG6j9wTlt2dp/Ov0jy5/LC52nLZHe+LLroF+mZjrNbO77omS/eDUPCxYeEJ1321OXO6XknLaeLJ5a1ySSnS64l6x+bT2S76U6GI+zs7ocvUOvI9RvbNPOVrz3fme1NrmG/uOdPI30qA9bHL71ayRj7wXYhuNRkM9s57TzdtMIZgOXt7e09f/58unFycnJ2dvYtLGP6njk9PZ2+eQ7TzFngDADAhrqMwHke4ZW2gl5pGlhEi0VrtWdaE6I6UGX0h7XAefEh1cC5YbqRcaqXvOh00cwyMpl0nDD2bbl95cA5cidjk2y/ydW9xY2tu9C1l9Ll/CLyQdKNWJ/2Swhv36yOSO2ofO7By1v0ShoFzgAsbxY4Hx0dnZ2dvXjx4reX6CXXwvn5+enp6fQtJHAGAGBzXUrgHK5VzbPaPEgMs9HWns3LeoOlrfXAeeEh9cXAtaw3Pk7tkhtPV7/q6OmyyVSXGXecT/ROtkyy/SbHbmzdRa89trx8HjTX3wm1k8bHD6893K4Nle1MzrU7yd465TsscAags729vW+++eb4+Pjbb789Pz+/zMB55d/ouFJevnx5dnY2fQsJnAEA2Fwr/z7cOGLbCueiOEJQ4aAUA2ahYaxnNNIsn24/Tw1bUtBSFtsczIZ7Lxo416/6sHKGbqdr7xC9ky2TbL3J0Rtbd5FrP8zWFpd2za4xX+gc67Ng/M6B8/yy0v/Ox6wF7wJnADoLA+eXL18KnFnW9G0zffMInAEA2Ggr/z7cOGI9lyuVZqhHdmEMGK5wrvXc4BXOLUHlelc4R4PWpkm23+R1rXDuFtIGc58ePZlMatl0tHxGdPzugXNW9jpf27wbrJIWOANj8OTBja2SGw+erG/k24/7PuSKWTVw/vmfvLL16tut+1/5k58LnEdA4AwAwDWw8u/DjSNWc7lSNeFIOeKwQHBTmeW2wsULazgvPKRjDeeVA+foVTecrp4nN960+dbTomBx/E62THJhce0lazgvee2VehilJc3190GHSRa3pGvgHNa9fhpUchY4A2Pxy7e2t+5+eJb78O66Iuejk9Oz0+O+D7li+gqcO1j5NzquFIEzAADXwMq/DzeOWBRAmKstd66UUEhiwMlkp1ZyodazrdDErGMyTJfAuRg8Wd4aKyNcmXt74JxHlQtPFylZHJtMLLSv3Mv8NgercpvuZHk+7RPreGPXdO1BRYxw2KezNcfNfcJsuD7+MoFzJdyOFmAROAPXWBo4v1d8/fmj7a07868f356ves5WHT95cOPG7ds3Zi3JFw8e3C7WRT++XVojHS5XzkcKFzDXG0srnKNnz08YXQmdz2A6yXQWpQk3jBnZnna7/WC+9DuL37utvm4PnJNYeSYLl+ctr7z66ixwTlYyJ9tJ25+8Pd/5Jz+fr3Ce/vfVV18tjyBwvmYEzgAAXAMr/z68vilEPznusqyaIvbiopO5jDu5P+n/dpXy5o13Wc8RQNynP3pla+uVH33asLsSOD95uL21/ejzZPPx7enWr8/Ozn79aHsetSadt+5+MG07PZ59cSf5Iu0Rbt95XBp5OtJ8EXUxVLQxmEx+9mLNdXrCamOgOOSDu9OOb/2yMuGmMbPLL7bfmx4/7zrtOZtct9XXbYFzURbj7VdneXG+rjnNneeBcxowlzZmUfPsv/OgORtB4HztCJwBALgGVv59eH1TuPzAOVyEPVzWvf7JXMKdfLq7228UnN6OwV+Udbqs5wig5t2bWzffPfrp61tbr//0n370SjR2TiPZ0N0PT0+Opjse39nafvSrZOvo5IO7QYb8wXF+5PajL9Ivjn71qNh+/+7W9ltPKvlt2lJKbWONQUZ9Z3qidB6Hx9Ozbz/MBpw3hgux58JDvpjOJwuc8wk3jhkNnOddZ0N1rjGyoKRGscS5WLY82zNPkPOmykb433J4LXC+ZmaB88nJicAZAIDNtfLvw0NPHDaD5wgYyru3tipu/W2tU7WGc76KN13lW6hkyLMj01C3up0myb8MOx+fzpZAlz6TMNaYH/IkPNHnYXpcC4czT5L8+/PK3MJuS4yZXEI2VhKgV6LtFm2B89uvbhXrkwXOxAmcAQC4Blb+fXjoicNm8BwBQzk5TQLkyetJpPv6JA2TT2qd6snt3Ht3S0F0uux5xcB5toi59pmE9cb8kCTlzU/03p36gPVpl4LhWOC8xJjZJSRKQfZCCwLnPG8u6mYUTQJnvhM4AwBwLaz8+/DQE4fN4DkCBpQWcH59koTODWWcGwPnpOrEPBt+fDtS8bh74JwfHuyMNwaLooOzZ7U92gPnyiH1PDk6Zl4AZFa+OqzhfOdxqWc3rSU13s4+7+/VfK1zVmPjlVdeETiTUMMZAIBrYOXfh4eeOGwGzxEwmHdvpmubT09OTtN1zjffrfdpDJwPj08/zKpqbD/6Ii1ovFrgHAxUlIiONgbjB/sje6PTLg658yhSMSM6ZlqjeV7X461Hd4MVznfv3ihd+5MHN7LPO2yxoIZzn1b+jY4rReAMAMA1sPLvw8udJvkouMl+uHH1beKccx3nfAnXeNGRN/Hul6zzOQJYSlqyYlZGI9gsCz7Gr+b4NKynUe08/SJrL21Pj0q3g875QGfBuSKNpfGLs0f2xqedHfJFkjO/f1TvVhszKOyR5PLz9rSG8xenzdfeSODMBQmcAQC4Blb+fXi502xieLuJc84JnK+MdT5HADRKliDnH3H46NeLw+FmYQ3n5eSB89nZmcCZZU3fM+fn5wJnAAA23cq/ErcNmmSEc/OoMB5s7k9KvYJ9yebO7tOsV7ZZ6VXazgcrxZOVU6SH7EwmO1lL/KjygelZJtWBYoO334TSIfkltbTEjlvYGBmhaZ4Xvsb65Fte+saXY3e35bzpixUMVRs8fDWvpNWfIwCWkC9VDpYlryhbpL28WeB8dHR0enp6fn5+mYHzSzbf9D3z4sWL6Tt4+hZ6/vy5wBkAgA3VQ+AcBMT1nDmIH4t+2VaaPj49zJLFPIYO8+aGwHk6RCTgzE9RNKZDB/tjsWhl8PSQylTjg7ffhMjFR25HbNjoPLtNPnaf13SN9XO0vvTNL0fLeWfBc/ZvA9HBr3DWnBI4A4zHLHCebpycnJyeJgn4t7CM6Xtm+uaZvoUEzgAAbK4eAudQFopG4sciL60nzvuTdNlrsr+aNzcHzpUstdJYm0njUbUTLT5jeC0dbkL0WlrmvPjqmicfvc9rucYFtS7qV73o5YjPOXqa5lt69QicAcZjb2/v4OBgljkfHR0dX18nV8DQ96AX07fN9M0zfQtN30gCZwAANlRPgXNR7KEpcC5FhXmqPAsS0//OO7TmnNXtptoUQXsloowcVTtRYyhaG3zhTagvMK4e1zBsdJ7LTr4lvV/hGiOTb7jqltGi5y2/RpXEvGHwq0vgDDAee3t7z549m2XOsILnqelb6OuvvxY4AwCwoXoInJNQsLF086KVt0nr7u5OvrZ5t7Z2uClwDs8fDFbd2xRRLig30b4Kd8mb0DaZ9mE7L3Ze2wrn5snEJ99y1YtejgUrnLvd0qtH4AwwHnuwVkO/owEAYBXrD5yrEWJ5IevC2sLpGtZ6JedA0buo4FsZIVoKuF6MuOGo6oU0RNydaiOHNyFsnW/WW2LDRufZcfJL1HBe8hrrk29/6Re+HE09H2a1VVoHv7IEzgAAAACMx/oD51Klh8lkp5wWVksoB+URioODvDgWJ+bjhwugq8UWqqeof4Rfy1Hheeo5an3+kdISkZsQP6RLS3yenSbfdJ/XcY31vW0vfXS0xvNmIwV3b9HgV5TAGQAAAIDx6CNwBnKeIwAAAADGQ+AMvfIcAQAAADAeAmfolecIAAAAgPEQOEOvPEcAAAAAjIfAGXrlOQIYj729vV/A+gz9jgYAgFUInKFXniOA8djb2/v6668PDg6ep76BlUzfQs+ePZu+nYZ+RwMAwCoEztArzxHAeOzt7R0cHHzzzTfT7aOjo2NY0vRtM33zzDJngTMAABtqYwPnp7s7Dyf7xZ8XGaNrt+7nusisVrbCSS/h7vU6wia42s8RAOu0t7f3/Pnz6cbJycnZ2dm3sIzpe+b09HT65jlMM2eBMwAAG2rjA+dLGGOFwHkMBM7dXO3nCIB1mgXOR0dHZ2dnL168+G1vXnJNnZ+fn56eTt9CAmcAADZXL4FzEiTOBXni/mTetrP7dGFLdtx0qJ3JZCdvyTqkjaUVzknP3d3q8ZVD8hPVz1U7db1beq5JyynCaRezCuef95/szm9Sy5Qqh5euMDlsP9g+LOe3+UjRadbn2Xj26C1ddGx64NPDYJSnrXfpWhM4A4zH3t7eN998c3x8/O23356fn/cXOK/8+xtX3MuXL8/OzqZvIYEzAACba+Xfh5uH3J/kIWqRKAbZ4nx/vSU4Mt9Ks+sw1iw6PKwFzg9rh1cPCdPd2KTKx1a7LTpF5HLL8w9uUTZQslmdQ3mcUj4btsfOlYfn84PKl1hrbL8DDdfbcveCQifBe6D84kbPfo2t+hwBsHnCwPnly5cCZ5Y1fdtM3zwCZwAANtrKvw93Gz4LOevRYiRsLBLRIp6sLqPNt2s1nMOesei1su62uVstWl18inCFdrlnPFMNUubSAuDmcarzD7fr96qeDjc0tt+B+PVGj63OPJ9fLW9uurprax3PEQAVTx7c2Lr9uNxw48GTlo61I0q7F3Tr6qKB88//5JVX/uTns/+WWrdefVvgPAoCZwAAroGVfx9uH7Yo3hCpsZCKttTD1ebMs0g2W9LgeG2H2hkbc93mbqW4NVSedmPgXJwii19bx6lOrD1wDquaBNdSb2y/A0sEzrGZz9exV+ppNF3dtXWR5wiABke/erS9/VYRMD95uL396FdH9Y6/fGt76+57yREnp2enx0278715/5WsJ3COtAqcx0LgDADANbDy78PNQwbLd1ty12u1wrmWmi4ROIeRbPM41fkvCpyjp6o3rm2Fc/0a0xnu59NceHXX1qrPEQBt0sT5YZY4Z3lzsj55br5MOQ+QS0uXH9+edbpx585s93xv1r51+/btrPds7XS3lc8tgXOYJefbSZQ8MwuUyyuc53tfefVVgfNoCJwBALgGVv59uHHEakpZTTazzXpLUxnh0qrm1hrOkXR03TWcF52iMu3mkhr1chSLLr9z4FwpXxGt2FEbf8HZW//JIHr3Zuup6+dsenGvqxWfI4DR+/RHr2xtvfKjTxt2h4nzPG9+fHtr+9GvzxK/frQ9y4fzwDlYulz0++Du1lbaOt97fJocePfDs9PTD+7OV1C/dycZO75AuqpthXOROAeB8rzl7VdniXIYOOfrmtPcWeA8EgJnAACugZV/H24ZM6jcMJkUkWJeVCHMIJtamnLObOx85EVpcDHmZDdaxSNIfsunrndbeIoFpSpySeSaXECl5EXLOPMvuq5wrpY0aWqMX0Vs74I16vWXMvznhtXu0jWx8nMEMF7v3ty6+e7RT1/f2nr9p//0o1fisXOROGfrm49Pz05PZmU1jt6/W8mZi8D58Z2tux/M+h1/8Wg7DJyDjeMP7qajP74Tr9UR1V5S4+1Xs5w5j4+LJc5BBJ3+9+1gRXSWRwucr79Z4HxyciJwBgBgc638+/DQE1/eFUo1o3UuuJ6u23ME0L93b21V3PrbSLcscS7Vb86LYmw1Bc5PwirNWTAdyaU/T0dfKm9eVMM5DY6L9Hi6Nd+cbgmcSQicAQC4Blb+fXjoiXdUrLau1tMYksB5RK7FcwRwqU5Ok3IXk9eT1Pj1SbJ9ehLrlyTOd94r8uYkbL7zQV5SoyFwzhc/J7L0ORI4p6PfWSpvXvihgW+/mhRkzsLjPEdOkudq4FyU1AiCaYHztSdwBgDgGlj59+GhJw6bwXMEsIK0gPPrkyR0bi7jXMmE0/D4g1md5SQ3TmswR5Lk4w/ubt14kNZnfnynXMO5VOo5GX1rqbx5YeBcyY6Tr9JPDHx13hz90MCtV17xoYGjoYYzAADXwMq/Dw89cdgMniOApb17M13bfHpycpquc775bkPHUiZ8dJJUZJ65cefu9tadhiR59tGAabe7dysrnNMRt2YfOJhs331/ljc/eXBj1thqYeC8Liv//sYVJ3AGAOAaWPn34aEnDpvBcwSwtLSmxqyMRrAZc3RSfFDg7KuZ06mz0+N5h+PDYCPsWO8235VuP3m4na2YLh/eSODMBQmcAQC4Blb+fXjoicNm8BwBbKJkRfPW9qMvFmbMJXngfHZ2JnBmWdP3zPn5ucAZAIBNt/KvxENPHDaD5whgE6ULnYu10x3NAuejo6PT09Pz8/P+AueXXEfT98yLFy/Ozs6mb6Hnz58LnAEA2FACZ+iV5whgPGaB83Tj5OQkqdZxdvYtLGP6npm+eaZvIYEzAACbS+AMvfIcAYzH3t7ewcHBLHM+Ojo6vr5OroCh70Evpm+b6Ztn+haavpEEzgAAbCiBM/TKcwQwHnt7e8+ePZtlzrCC56npW+jrr78WOAMAsKEEztArzxHAeOzBWg39jgYAgFUInKFXniMAAAAAxmP9gfPT3Z2HFZP9C80xGXHFIS5wKM0u8bZ2PFXe7eq94gJnAAAAAMajn8C5lPglDTu7T1efo8D5qhE4L0HgDAAAAMB4XELgXG7Zn9SXPQeLooPWrOfOZBLJEGvjTAfZ2d2ttGannvYuWnZ2n7ZPMtzOz1PqHz17Ms95S/yo+uFZEF+/A9HLiY7RPrHGxvDCO556uVdk+vXs8sIXYXd+tvBfIFpuZsMi+eicBc4AAAAAMLRLCJzDFc61EDJsa2hN88hKhljaW4wYbZwnwPmu+GrreOBcCqrDELp6FenZg/2RoyJnmg8UuwPRyyndgG4Ta2is38iFp+74ipQvb7qVTzU9bNYp2Yy90MFL2XwHm+YscAYAAACAgfUTOJcVYWmYnBaRaSAMJ/O99Qwx3JuNGU2Mw+g47dWUNzcHzvX+sauoruJuriGyIBGNDdgeurZPbPE973jqha9I5Cyz90KQWJfXoz89XOKl7DhngTMAAAAADKefwDmsRxEtnhBJoks1EsqxYTUnLe3NossFgfOsW2Pe3BhyFvl5GKjWrqKSc0aOCnbF5tB2B6IhaseJNd/z5U7d/oo0naVUv7sUks9H6P5SdpyzwBkAAAAAhtNv4FwpNdG4qrleP2HtK5yTzcmkMW9eHHKWSj9E499YzllfiRxfrtxai7g9RG2f2OJVzR1P3f0VKbdO8j3hvbjICufWOQucAQAAAGA4fQfO9erGjWWWD0sLYleq4dy6Lre02rauGLKYcaVQRLSacUvR5MNY4FwJwaeb0Um2h67dJ9bQWJ/LwlOv8ookG2G2/LBIrzvezPq1t89Z4AwAAAAAw+k/cC5/CF1RC6GIPoPiEJNJvZhFqTGXj9NUB6MePyZrnFvWDOfT2NndDVflPqycKHoVtYoTsaMaD4/cgUUrnLtOrLGxetUdTt3xFWn6WMjkj+TIxum1nLRWUqVpzgJnAAAAABjO+gPnKyvImxlC62cpXl/X7TkCAAAAgGYjCZxLi6wZhsB5458jAAAAAGg3ksAZhuI5AgAAAGA8BM7Qq5UfMQAAAAAYj6FjPNgMQz+pAAAAALABho7xYDMM/aQCAAAAwAa41Mwu+cy/yf5qe/s448rd+pjqUjPp7XiaDP2kAgAAAMAGGDrGCwwYOC87msB5fIZ+UgEAAABgA7RFbEl4OZdlmPuTh5PdefPO7tOWxll7+egwsN3Z3S3tDjuXdicj7gfbLYO3jRl8VU9k2yYWu5y0/yTSrTarw+gI2XXU73ApMO5yjeWeO5PJTjhUbfC0Q8P0aDP0kwoAAAAAG6A5YNuflHLRWUSZBpuz5mSzpTE4Pt8qrRBu3jvbHWwG29XBKwc1j5mk4pFM97DcFB2kc7fIaSMH5/1id3iFa6zc6iJejw4ua17R0E8qAAAAAGyAbmFbntYGgfJsue3TlsZwpW7aGC1JEWnMB6ls5yFqmAVnJ1owZj0+DrRPrGu32Kzqx7bf4fbRGs+bjxw9TexwljT0kwoAAAAAG6A9ZCuqUMRi2yzHjDWWss0sNF5n4BwqDx4fMywxUUue1xY412YVHhsLvKt3uH20hddYC/obBmdpQz+pAAAAALABmgO2YN1yfNltuJg52tjrCufmOszxMctX1lYr4yKBc3OcG5lJ7A63j7bECuf2wVna0E8qAAAAAGyAxnytmm0GS4ur2XO0cWEN54sEzq2DR8esFKjoJXCOzi92Q2eb0TvcPlqX8z6srTCPDc6yhn5SAQAAAGADtCRsQQmKySTIbZMvSiUjoo2HQUWHhZUugo/ES7YXB87B4PVPNoyOWS8PUrnUDoFzPlpjt9qsSqp7I3e4fbTG82YjFa9U6+CS5+UN/aQCAAAAwAZYMnWLfvRe6+fxwbUw9JMKAAAAABtgydRN4MxIDf2kAgAAAMAGGDrGg80w9JMKAAAAABtg6BgPNkP7c/QVAAAAAFwjAmfolcAZAAAAgPEQOEOvBM4AAAAAjIfAGXolcAYAAABgPATO0CuBMwAAAADjIXCGXgmcAQAAABgPgTP0SuAMAAAAwHgInKFXvQfOn+288f26N3Y+mrbf/6j1sJbdS/jofnK6z9Yx1Mz6pgYAAADAJRM4Q69WDZw//F//h//pzx//comHebmctnPvBR3T3ffvX15C3FMcLeUGAAAAWIf1B85Pd3cePnw42c8b9iflry8iGbx5qPa95DeouFGzV+vhzu7Ty5/FKnv7OGOvp149cP5//pff+73fe+1/XCJzHiRwnu29zLRW4AwAAABwhfUTOO/sTPIEc3+ys3NJObDAeYHaDbqCd2zAwLkfFwqcl8qcK5Fp+GVQdiNsmm8nNTHyohjpF0XH/Mt40Yx8lGm/oMe0+Y2dnfJI8cZwbtkA+aDpxk62P91dmU+5x/Sgz4LtuY+qp1w8bNCw3mohAAAAANddP4HzZDLJ1sw+3U2+KOK+dL3zw2zN87Rzsbg2/6LcpzZ4fuBuqV/lqNog9dQxbAm380NL/WMD7iTXVj1/PNvMdxd3ZqdyQOSiKtMtdiej7E/KIzbdurxf9krML7aYUvFPAqVXpGGeyYGT3Xlz3jva2PpCLHgRV7rehW+MlpepbWKru2jg3D1zbgyck/C0CH3nm9lWqQJzeXeQ6TYs/Q1i5lLiPIt9i7One6KNwdzyzVLgnI1a3/tVpEcw5+rsy23twzZdFwAAAAAL9BQ47+9PspINk939Isvdn2Rp4XwryDezzbxPZF1qGAk+rAxVOqB2ouapVreT4HS/tj9yknQOYQZbPypypvlAwbTaL6o8SKkSRrHddtWlxoflkhr5xv4k71M+bWyes4GKfxxoaYxNqeuLuMT1Vg5qHrP1Zer6QixnDYFzmjk/fP+fFzzMTYFzPDLNl/mWFybXQ9eWwLk0chAd10Ph5ItYY/sZPwumV172XB27abtx/PZhw2sBAAAAYAl9Bc7T/86TzXS7FvfVE+da3lzpX48EYytmm0/UONXqdrR/bFalyLI1l1xQ0iE2YDwPzU8Rbuenjl512Fir4Rxe9fzut6Sr+VBBoFxelx5rrE2p64vY5XpbX5T4G6PDy7TghVjOegLnW3/0l7tPFzzMDYHzZ+VQOdw9bf+otl440B44V3uXq2eUa1okI8Uaa+uiSylxNE5eOnBuvaL4sF+FNTUkzwAAAADd9RU4p0ubk3W8s9IIkYQ2ixDnf9bradTKJyyMBNtP1DjV6Hbl7LFZVaLIyFHBrtgUgkHXETg33d5gnHks25juxvPm6jzLsW0W9cYa26e0hsC59UVpPFHzy3Q1A+cuafNXK61wruyOZstNgXO9vaEMx8VWOF88cG69osbAOWOxMwAAAMAyeguc07Wyu5N5lty28DjNEvfzQLG2qrl7JLieFc6BUj2I5pK/jUe19AzWA3fNOXtd4ZwuRp/U8+bYPEtXGP5LQbSx1xXOrS9K/B8ggitrepmuVODcMW3+qnsN51omXETOQWO0rkUgGsSGkXG0SnKtcWEN52gyHCk6vThH7j5suC1wBgAAAFhGf4FzGlVWF51GiwzP1pzW88SlI8FFJ6op9j3N6wVX6jREKyHXa0w3HFWbd1BypDT/5tW5pUHaA9gL1HAOp9Ew8aBDPlB09M737aKB86IXpT5m+8t0BQPn7mnzVy2Bc6myRFM8G8a+RfWJ4OBy6trwWXrzeDYd/P798kDRxnBurXWVy5/+9/3IR/01bdeuaPGwYUUNHxkIAAAAsIQeA+f4+tK8DEKlGEWY/eV9li168DT4bLnaiWLJYV5fIVmNHYTVD+uTrM+qVq0idlTj4UFph8mksvA4PtvFAWz89uanqp+oWvIiMvPIPNMzJl9Uq47UG1tfiAUv4lLXG3tRYm+MtpfpagXOv/jrP/7jne5p89WyVG0OAAAAAK6P9QfObKh43hy18HMVKawaOG80gTMAAADASAmcOZyvAO4eFwuclyBwbm0EAAAA4FoROEOvRhk4AwAAADBSAmfolcAZAAAAgPEQOEOvBM4AAAAAjIfAGXolcAYAAABgPNYfOCefPzfZDzfW7qIjr378/qTbgUudoX7HLniBXQ7v49W5yJiX8LYZiMAZAAAAgPEQOC+ll8C5ftSGBs4XMdbAGQAAAAD4rjFw3p88nJnsp8nhpPg61qdthJ3dp2lDMk75gFImWRttundnd7flvDuTyU44VG3wtEN0ekngnF1SZDLz7foFBp2SzezSph2nm/Wjut+6TmeP3dimU8RvyML7WYy5v9Qh9eta8W1zdQ39pAIAAADABmjM10pLVbNodZasHpY2Y0tZg7Z5v+DI2CLYyGiLzjtLLtO+TYM3ZprJoZXzRSLfyLWlEWx23MNipkljvKTGokuo38S2RcK1WxY/ReMNWXQ/a4Fzx0PqE1zlbXOlDf2kAgAAAMAGaMzX2pPYMEOsF6hYECZm/dtHazxvbL1x2+AtMwi2O0a+WeK8P0nX/s6PrOe0HS8hu/DuZ29piV/yUvez4UIWHlKfzwpvm6tt6CcVAAAAADZAY762ODkM1VLHcsNMcEw9cK6N1iGDrUS3DYNHJHHx0/IgXdcYz7qn/y1qXzTkzIvHrGW87Wev39jmwLnthpSLZjytjL5w/vVD6vNZ4W1ztQ39pAIAAADABmjM15ZY5tp8bCFJGqvVkttHW2KFc/vgEcEoWb+ugXN67O7uTr62eTcb6wqtcF50Q4Zc4bxJq5pDQz+pAAAAALABGvO1BclhvGBw7eBsszpINWXtWtY4WsN50eB1RSAbq/aQlh9uTq3T89YrOXcOnKO3ruPZF97Y6HmbM+3FNZy7HVKf4Cpvmytt6CcVAAAAADZAc8CWhamNRRvy8gjR3LC6dzZc2jCZ1BcV10drPG82Uj5O++BNq5Qnk8rk80Eqq5arnz2YR7iHpaXEwYm637pi5K5nr9yohlMsuNvRySTrtjsFzpFDynfnAm+bq2voJxUAAAAANsDQMd5l2J9sahmHS9W6Jnxth2ysoZ9UAAAAANgAQ8d4l+Dp7u5IMtEVFEuhOy85XuGQ62DoJxUAAAAANsDQMR5shqGfVAAAAADYAEPHeLAZhn5SAQAAAGADDB3jwWYY+kkFAAAAgA0wdIwHm2HoJxUAAAAANsDQMR5shqGfVAAAAADYABeN4Z7u7jyc7A93/DrHzvv3OSk2VPtz9BUAAAAAXCMC5zWMLWemmcAZAAAAgPHoJ3Denzyc2dl9mjYkkezcPJkthbR5/6xlundnd7faGvTcmUx2wqFqg6cdHlZy4Pw8pfbY2VvmVr3AoMOKF8V1JnAGAAAAYDx6CJyD1HV/kkbO8z9KO+u9wrY0Q54fExxdbKZpbtq3afB6ojvtGUm7G87ePLf67taLKg8RuSiuN4EzAAAAAOOx/sB5QX2JLPUtuoXZa31vpWc+cvQ0scNLe+shb/vZF82tMpf4VLNB4hfFNSdwBgAAAGA8egmcY2t3i2oWkWw21JzNlkPaSqTbMHhtbpVaHwvO3rC3coH1GZYmkB0gcB4lgTMAAAAA49FL4FyNUpPYtlqOIr4YODbIghXO7YM3KBW8aDn7orlVWqxwpkbgDAAAAMB4rD9wrlc7rgat1fS1odxxJJuN1HBeNHihUh4jWhe6dvbI3pYLXOmiuN4uEDh/tvPG9wv3P1rYeUGXNR0EAAAAAE16CJwPg0oUQUQ7b5hMdmpBca1/czabjZSPs3jwyLTKnyjYevb63kjjbArlaL3oE7uQ7oux2XArB84f3Q9D5jR8bsuGL5YdS54BAAAAWId+AmdgbtXA+aP7339j57OgYUEmLHAGAAAAYHgCZ+jVqoFz85LmMBwuttOt+/dn5TeyqDpt3Mkqc0w7fhZsF4d/ND+sEnEDAAAAwJIEztCrVQPnr74qcuBy8twcOGeBcV6No9o4306a0638cCucAQAAAFgHgTP06gKBcy5LnkvLkr8qb5ci4yxxjncttgXOAAAAAKyVwBl6tY7AOVVflvxVY+BcC5S/EjgDAAAAcAkEztCrFQPnvCpGoT1Frq5wbsmmBc4AAAAA9ETgDL1aMXAulV/Ovq6WaA4/WTDoX7QuFTj7xEAAAAAALkrgDL1aNXBOBJ8aWAuf520798MVzvfvl/t2DpyzIa1yBgAAAOAiBM7Qq4sEzgAAAACwWQTO0CuBMwAAAADjIXCGXgmcAQAAABgPgTP0SuAMAAAAwHj0FTjvTx7mdnafXiSwe7q783Cyf5ERxqDfu9Q+euveCxx6PQicAQAAABiPPgLnJEQMUsQke75I5jyCTHINBM5XlcAZAAAAgPHoIXDen1Tz5SxVnP65M5nsPMzi6HwZdBA5pml10FrpUzuknliGLeF2seg67B8bMJxk/Kj64dklV+c/G3B3N3KpDYP0cZeq96fjDLNx0vnUxorubX+B2ufZOu2NJXAGAAAAYDzWHzjX8+Zceelz3jGIJIOD89bY7raFsfHAeXpoEa+G8Wh1wNIk40dFzjQfqGn+WWvk5tQG6fcuLTHDYjNNgisjRfc23M/miS374m4ggTMAAAAA49FL4NwlCi5lr9FjssZSaNx+SO0s8WPDU9QGbJxk++XUxQZsX48daentLi2eYXhsfZbRve33c/m918KKzxEAAAAAbKD1B85pfYbmFc716grlkhSlHfVMMn5I41mq25UDYwNWstXIUQuutHn+DfFyQwGS/u5SpxmWp1qNgON72+/n8nuvBYEzAAAAAOOx/sC5vYZzKUqNrtet1bCIr7lt1h7wliYYG7Bp3XLzZXWe/2ornNd7l7rPcLUVzi33c/m914LAGQAAAIDx6CFwrpRqTiPOWHHeUu5b75BsV5ccRw6JKPYVM6kUbIiWKa7PoeGo8EJL4e2i+ccy6tZB1n6XlpnhRWo4L6g93XHvtSBwBgAAAGA8+gicE2GBhDw8rMateaciXgwqWEwm4WfaVQsv1D75LpAPsrO7OwnyzFIdiaY51PLe2FGNh0fmv3DFdWWQPu5S7OZ0mGHWtzhLbKTS3vb7WZ9Y12lvLoEzAAAAAOPRV+AMpDxHAAAAAIyHwBl65TkCAAAAYDwEztArzxEAAAAA4yFwhl55jgAAAAAYD4Ez9MpzBAAAAMB4CJyhV54jAAAAAMZjMwLnp7s7Dyf7q+3t44wrd+tjqkvNpLfjaXKFniMAevbplTH0nQAAAMZrMwLndgMGzsuOJnAen415jgC4sE8//XTl36zWSOAMAAAMaOW/y7QNmoSXc1mGuT95ONmdN+/sPm1pnLWXjw4D253d3dLusHNpdzLifrDdMnjbmMFX9US2bWKxy0n7TyLdarM6jI6QXUf9DpcC4y7XWO65M5nshEPVBk87NEyPNqs/RwBsmlng/LtBCZwBAIBh9RA4709KuegsokyDzVlzstnSGByfb5VWCDfvne0ONoPt6uCVg5rHTFLxSKZ7WG6KDtK5W+S0kYPzfrE7vMI1Vm51Ea9HB5c1r0jgDDAeAmcAAIAeAudQntYGgfJsue3TlsZwpW7aGC1JEWnMB6ls5yFqmAVnJ1owZj0+DrRPrGu32Kzqx7bf4fbRGs+bjxw9TexwliRwBhgPgTMAAEBPgXNRhSIW22Y5ZqyxlG1mofE6A+dQefD4mGGJiVryvLbAuTar8NhY4F29w+2jLbzGWtDfMDhLEzgDjIfAGQAAoIfAOVi3HF92Gy5mjjb2usK5uQ5zfMzylbXVyrhI4Nwc50ZmErvD7aMtscK5fXCWJnAGGA+BMwAAwPoD52q2GSwtrmbP0caFNZwvEji3Dh4ds1KgopfAOTq/2A2dbUbvcPtoXc77sLbCPDY4yxI4A4yHwBkAAGD9gXOpBMVkEuS2yRelkhHRxsOgosPCShfBR+Il24sD52Dw+icbRseslwepXGqHwDkfrbFbbVYl1b2RO9w+WuN5s5GKV6p1cMnz8gTOAONxHQLnvXf/9b/9d/P//fnHv1nfzSn5zx/f/rfvftzT4AAAwKD6CJxjoh+91/p5fHAtCJwBxmNB4PyzH2wHfv+vnly1wPk3H/7lvw5y4I/f7i1zFjgDAMD1JXCGXgmcAcajLXCepc33Psl/BJwfH1xW4Pz49tbM7cezhicPbty4fftG0JL47M/+7V++/Z/DA//L23/+7/5sL91MIuL5yuei5c8/fvvtcuN8nFljPlrekoXMAmcAALi+LitwhpHyHAGMR0vg/ORvbm5vb996+5/LrX/1+9U1z/OmH/ws6DBbDB0ukG5eHl0PnB/f3rrx4Elp68mDG+WsObH3bvN65iCLzrPiNIK+/eF/KR8bZNRZ48dvz7slK6jf/qw0CAAAcO0InKFXniOA8WgJnA8+/mGknsbB8fn8B8KX79yaNr/2V08Ojv/xXtLjzSRxfvLXaUz9k98cpMnzrXe+TPp+cm/WtVvg/Ph2ES1niXMSOFfz5iQfnqXBC3z2Z0XgXFuxHEmSw4XTsWMBAIDrReAMvfIcAYxHW0mNw7N5UpxLFzGX1zjf+vHn054/T7rd/Jsn87z53j8eH8y2St78+06BcylbTkppNAbOaYmMlorNH2fVM/51e+BcHSSvpxHU2RA4AwDA9SVwhl55jgDGY8GHBqahc2K2nPnm3/wsTZtn65bTMDoNnLPE+a+f/P2bSd7888Pf/e7zH9/Ke86dHa55hXNbDeckNA6KOS+7wrmWLQucAQDg+hI4Q688RwDjsShwzqRB8vYPP/6HN/NlzfMaz2ng/LvD/5Qk0jdfey3JmP9TEixnFTn++GeLxq4Fzk01nOuBc1pjOciBkyXNs+XK1Wy5tkq52K58zmDSmNdwLko9C5wBAOD6EjhDrzxHAOPREjiHn/g3X6t8dnh4lhfZeO3mrSJw/t3Bb35ya9bvJ785yBZHz9ZFL/rYwHrgnAbNM1nI3BA4J/beLcpfBMUx0ix61vjun80i5XjgfBjU0AhLN5dbBM4AAHB9CZyhV54jgPFoCZyzahpz58cH5ebz8/OgOf80wbzhd+EnDFb3LAqcAQAALo/AGXrlOQIYj64lNfokcAYAAIYlcIZeeY4AxkPgDAAAIHCGXnmOAMZD4AwAALD+wPnp7s7Disn+heaYjJgNMd3e2X265HHhAFyCS7jzFx358t4TAmeA8RA4AwAA9BM4l5K8pKFzSLxgxGXy5pYp0S+Bc0DgDDAeAmcAAIBLCJzLLfuT+rLnYFF00Jr13JlM8uOnbZPdUv6cZ9nTXdPNJJFO+icjzc9bOWNtAu0TDrfzQ0v9YwPmc2g8qn54diH1u5HG7LuRG3dY352Msj8pj7jMmItfi3zU2EtZaU/v3iTSr+nYZe5Jy5uq8Y7F3lTxmxO8ghcjcAYYD4EzAADAJQTO9VS43Ctva2hNM8I8LJ5u5MucZ0nhbNe8MW2qZpKxYdtWuMYD59nJq/sjA4ZzaDgqcqb5QLG7kQ5Y3I3qGu/gfJU7Usy845hdXotq18h1LZp566vQ/Z40v6aLzhu8qRpvzrrWPwucAcZD4AwAANBP4FxWBKRhWloksYG8Mdwb5oDp4dmf+5N0GWuyL9hVz4qj0Wt8AuUDG48NJ1wbsLr4trkIyIK6DrEB4/Fufopwu2nCXcY8bH4tZmO23sloSY2Or8LS92TRSxD7J4OG00RfwYsSOAOMx8dXg8AZAAAYUD+Bc1iDIsw8i+oS9SS6VNWgnPjtl0PlrCH9b1E3ozlpLEWO8Qk0XkJ1u3JgbMBKXBk5KtgVm0Lb3Vg1cO4+ZqRnqTZHHjg338nFgXPrscvdk0UvQUNB6TB9bn/7XZDAGQAAAIDx6DdwrhYnaFrVXK86EVuMGrTNaznnMfRutmtx4NwhSFy4+rdUmqG2tymurK84jvSM3Y2LBs7dx+zyWuRjNt/JxWfpcGzXe7LoJViwwnnRzbkwgTMAAAAA49F34FyvaNxWAvhpUe65Xm63FCymjfVKzguXtkbLFdcU+4rZVyo3RMsC16+o4ajIzZptRu/GBQPn7mN2ei3aCj9XL6th5q2vwtL3pMObKtbzYbZsvv3mXJjAGQAAAIDx6D9wnoe2QUBbLaQQ1JyYTOoFLOaN5VILQRwarlFtSBrDTLo2gVi6mE8pWDxdK7wwt2DAhqMaD4/cjQuX1Og+ZsNrkU0yWVZeLydSD+6zG94485Zjl78n7S9BqWflTdVl8IsSOAMAAAAwHusPnLnG1prEjoTnCAAAAIDxEDizSLEEuPFjFmnmOQIAAABgPATO0CvPEQAAAADjIXCGXnmOAAAAABgPgTP0ynMEAAAAwHgInKFXniMAAAAAxmP9gXPyEXOT/XCju+KQ+QfV+Yw6Np3AGQAAAIDxWH/gnLtI4LzCsXAlCZwBAAAAGI/1B87zrHh/8nAmzY3zr0oxcrlP5FgLnNl4AmcAAAAAxqO3wDlcpbw/ySLlcOXytHUWKJcLaVjhzLWy8iMGAAAAAOPRmK/FA+f6WuWwMUukBc5cO0M/qQAAAACwARrztWhoPP8MwLBKRlFlo2gXOHPtDP2kAgAAAMAGaMzX2kPjYl1zUWej67GwgYZ+UgEAAABgAzTma/XQuFI8I9suZc+Vas4CZ66LoZ9UAAAAANgAjfla+SMAH6bbQfmMMEbOm7MMuh44S57ZcEM/qQAAAACwAYaO8WAzDP2kAgAAAMAGGDrGg80w9JMKAAAAABtg6BgPNsPQTyoAAAAAbIChYzzYDEM/qQAAAACwAYaO8WAzDP2kAgAAAMAGGDrGg80w9JMKAAAAABtg6BgPNsPQTyoAAAAAbIChYzzYDEM/qQAAAACwAYaO8WAzDP2kAgAAAMAGGDrGg80w9JMKAAAAABtg6BgPNsPQTyoAAAAAbIChYzzYDEM/qQAAAACwAYaO8WAzDP2kAgAAAMAGGDrGg80w9JMKAAAAABtg6BgPNsPQTyoAAAAAbIChYzzYDEM/qQAAAACwAYaO8WAzDP2kAgAAAMAGGDrGg80w9JMKAAAAABtg6BgPNsPQTyoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMB/be/OcRuGgSiA3v9M6dmzVq8yhU8Qa6OGiwPDcRbE7zURV0vtx2ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8Be9AwAAAADAM/x24A0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwGu4TOktSNPl+39zzvXPXN8hz3efjm98HJvzW21ZaD7t2Ds6DwAAAADAl12mFNLfevRdvhA4L8nyubcereMwrK49vqz6wp/5XAAAAACA13AjcD5Lhvda4S26vU4f6+vfsm2bXY6ntJ1plsKdOQ8C55xDzfEZHDdZdBtVN69/X+D8M2XcAAAAAACvZthSIwS32+Oe3c45pePhujFs2zYsl5Vkul4KMyW1ju9wrsWEu8mbB6XQVQTdBc6jlhpVAw49NQAAAAAAnmXUVaLKdbdEd526THmal4cy12TV5bLhUrmzb6mRy3hf27bXAfLg5J0Vzt2xcEC5MwAAAADAcwzbGHcVznu3jLzGzPkq9tUYXdZHvFWbjK7C+Zgou7Y2G92rPdrDuazUEXOXaAMAAAAA8Kgb/zev7uG8bywNlru2zPvGeFmzFGaWPs9d4JzSoPHFsPo4Vk83afEnPZzP6+J55c0AAAAAAP/fjSQcAAAAAADutxYhi5sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBfyAcLDJK8KZW5kc3RyZWFtCmVuZG9iagoyMjIgMCBvYmoKODUwCmVuZG9iagoyMjMgMCBvYmoKMjA2ODEKZW5kb2JqCjIyNCAwIG9iago8PAogIC9OYW1lIC9JbTkKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMjI2IDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDk5OAogIC9IZWlnaHQgNDQ0CiAgL0JpdHNQZXJDb21wb25lbnQgOAogIC9Db2xvclNwYWNlIC9EZXZpY2VHcmF5Cj4+CnN0cmVhbQp4nO3BMQEAAADCoP6pZwwfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgali2KHQplbmRzdHJlYW0KZW5kb2JqCjIyNSAwIG9iago8PAogIC9OYW1lIC9JbTEwCiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDIyNyAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCA5OTgKICAvSGVpZ2h0IDQ0NAogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSBbL0lDQ0Jhc2VkIDUgMCBSXQogIC9TTWFzayAyMjQgMCBSCj4+CnN0cmVhbQp4nOzdB1TbVsPGcfKme++99x5J995N9x5J2ia0TffeM23atBnde7fpbjqSJs0kbDBCCCEkhJCFEBJCCGGMhOMI47ruZ0wAA3YCLW3ox/M797w1sq5kzpsDf24uzp9/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBQamxsXOsJAAAAAACwDqHYAQAAAACGMxQ7AAAAAMBwhmIHAAAAABjOUOwAAAAAAMMZih0AAAAAYDhDsQMAAAAADGf/arEvmXb++VM+KVvD0/2fTXrwn1H2yZTzu0xbsrYz13zGmv2LnxQAAAAA/Mf9i8Uez9xp01Kn7jot9o6fJrpfWbzd15DkKHYAAAAA+Lf8e8XeWblrat11WOy9er1Dx+tMfV8UOwAAAAD8W/5qsXMrPn/9heRmfriI6z+hO3L71mpHLHduRJnW80zSg72v9UnXHpaEp3umLel1z96r5v17uV+wN/Z99vxUF+5309Qvb82faeLFp0ybNmWtW3MAAAAAYET4q8We+/4911+T3PX3vJ/b7/wlvRq1d8X2VPDqJ5IeTJB4tPe5PY/iT/ccWjJtSkx8SkcR97nimta8E2q+ex9+71v1uWmKl7eWz7T3xRHrAAAAALDaX98VU5f9TpJov/6eV5OtsKeo9H7H4x8kPZgocctKdzL3Xffuqt/Vl5zyyZJPpnQ8n2xHy0B3qSRcds037f/y1vpJJZ0OAAAAACPe39rH3jfaU+R6rzdh6bUDpHecrk7WpAf7Xa/XFpQlSW7SvYgde1AWj/Ul8d96XZLkd1/XvCum15X7F3u/myZ7eSk/qTVcHAAAAADg7//maU+0p8r1ZAna3a9/fY09abEnCd2OQP8kYaX9k6RvVtM/2buO9ErtNa+xr/HlJf2k1nxxAAAAAIAhea+Yuuz3778hZa6nWMBOqPO/to+9XxL3/T3TrhP67GCf0m8Te/eMnhul3mmeeh978oxP3Enf/5Nay8UBAAAAAP6Fd3dMsUe8O1a7toXEl7/77hXpdbBb8iRuTHjjlYQpfd4lZg1bxPu/bUviS+mYuSRhj0vqm6Z6eUk+qbVeHAAAAABGun++2AEAAAAA4K9DsQMAAAAADGcodgAAAACA4QzFDgAAAAAwnKHYAQAAAACGMxQ7AAAAAMBwhmIHAAAAABjOUOwAAAAAAMPWqlWr1lzsqwAAAAAAYJ1CsQMAAAAADGcodgAAAACA4QzFDgAAAAAwnKHYAQAAAACGMxQ7AAAAAMBwhmIHAAAAABjOUOwAAAAAAMMZih0AAAAAYDhDsQMAAAAADGcodgAAAACA4QzFDgAAAAAwnKHYAQAAAACGMxQ7AAAAAMBwhmIHABg55k1K6zZp3lrOW9MJa7/LX54NAAB9odgBAEYGdsaYtLQxM9j+H/SHYgcAGE5Q7AAAI0LqjI7X+2qrIz7x5J6ne+f+pEljeh3tPnHSpKSze86MX33MmDG9ZgMAQEoodgCAkSDlonrHE/06vftRwrSeZzsrvONo56Oeg/EzO7fedB/s/0NAwgkAADAAKHYAgJFgLTtVeja490R37Oxenb/GjE88s++9+lwcu2YAAAYJxQ4AMBKscY19dUB37lbpV+y9dK+sr6HY448TVuP7XBzFDgAwSCh2AIARIUUmJ18bT7rGnmzOmtfYUyy8o9gBAAYHxQ4AMDL0f6+YnlX0nkzvvcaeOKnnYerN7X32sSe/OIodAGCQUOwAACNGr00uXcncc7DnTV4SmzrhPdwT3/+lf3wne6+YZBdHsQMADBKKHQAAAABgOEOxAwAAAAAMZyh2AAAAAIDhDMUOAAAAADCcodgBAAAAAIYzFDsAAAAAwHCGYgcAAAAAGM7+WrHXAAAAAADAP+8vFzsAAAAAAPw7UOwAAAAAAMMZih0AAAAAYDhDsQMAAAAADGcodgAAAACA4QzFDgAAAAAwnKHYAQAAAACGMxQ7AAAAAMBwhmIHABg5SJLMBQCA/5RVKHYAgJEkVuyO47S2tgbiVgIAwLC3CsUOADCSxIo9luudX/9d120DAIBhbxWKHQBgJIkVeyAQiD0IhULt7e2/AwDAsLfmXEexAwD8P9NZ7K7rhsPhSCTyxx9/RAEAYHhDsQMAjCixYl+5cmVbW9vvv//enetr/V4AAADD2br+3gIAAEMpsdjR6gAA/z+s6+8tAACDMW9SWrcxM9g1nMnOGJM2ad5fv9Pfnb+u9Cp25YsJY8eOnZrX/TU/b2rvj7vVzpnQ54mOI8nOHKD4nVabMKd2DWf+zRv97fkAAMPfuv7eAgAwUB0NnZa+MLzawvQ1Rjs3a2xa+vy/fre/O39d6VfsEyZM7Q7mvKkTJiTP23ix92r2vxHCffK/I97XEO0odgCAtVnX31sAAFYrnX54Wtrh00tTPT9vctrY2UJ7W9fHbe3C7LFpkzuXweM132n1wniv4u5emu9aNY+dP2bGjL5HE84cM3ly9/z+F++YPmnSmN5TU12z//Tep3b82DEv4fEaXvMAVv37FfvUqVO7crl2TscH8byNVfTqyo0Fb+z5zuztOdonhLtXzDuPJDzX8bDr+rGzOh6u/k+CPuf3utYab7T65c3pezThzAldn1Kqi8dPSP43CwAA/xFr+9oPAPDPmzs+bfxc96eJaWkTf6Jj4Z6s2+PBzruJh9xQezhe8LG4jcV8fOW9o+LjWZtQ7N1Pdz8Zf7ZrzsL07lDuudCC9Fgrx+enunha+oLYoZ6fIFJcM9n0zlMnL+g6mPh49Y8gSV5z96e7Rv2LPdbhXZ09dU5eVx7ndXV854OubO5V8l0PuxO8+1hn5v/Z1cjdHZ882HskPJd4rdQ36rxB90vt+8PBn4kbfVJdHLEOAP95g/y2CgAw9OZOSOtjwo/9Tpqfnpb+q5tk9qqO5fZwe6jzOffX9M7Q7in2ntZ3Q7EQn9zd8ws651R0dHLXmV0H2ypnr56f8uIL+tRz8msmm95x6tjZlfH5Lj+753HshLGz2BSveWCSFHusWjuaNf6fnhReneyr/9PveK8jPQneVfRdyd5x9pzOYz2HBpbICZda840S19t7zkz+lwGpLw4A8B824G8CAAD/lFB7xwLzLxM7Wn3iLx2P20P9Too1cGfMppDwO6l9in1+eq+fBuJXSdwz0/2YTdxI05PXa7x4gqTXTDo9XuyzuO5Tux/P7yh2LsVrHpgkxR5fXO9Y+44/nNBrRbx/n3eVd688TtQ5oTOJ4/+7+sy+MZ9KwuX6F3u/GyUt9t4dnpjvqS8OAPAfNtDvAQAA/6T4JvaJv3RUe4qt7PH155m9wrV7Y3dHEXfuK4lvIulf7D2/rxruXPFOWte9Ir0739d88QTJiz3Z9AEVe7/XPDDJin31SnjvDo+vuXfvce9VtvHmzku6oN2j4+ic7tX77pX2P/9Msi2mtmcvTv/t68lXzvtNTXnmAC8OAPAfNtDvAQAA/5y54+Or6+2hUHt8pX383CQnxfepJPzqZUcKd24nYRP2qHSkcp9V9LYFiZvKOx8lr+vEMyevXhBfy8UTpF637zt97cWe7DUPTNJi73m7lr4B3G/jd89TPb+t2WvTeOK+lbFj++9m7/ow2XvFJL17sn3syXa0pz5zbNeunDVeHADgv2vA3wQAAP4x8W0xnTthEh721fGblwsTdot0vHNMqHOrdzzmV7/HS3rnDvKEfm5r754WS/z4lBQ7WDrffyZ+nfT0zqNru3iP5Ov2yaavvdiTvea/+l4xvZaa+66lJ4nhngNJNpskLJ73eZeYPmGc4v3Ye97Npfs9XpK/V0yyHyX6vvi+7xWztosDAPxXDey7KQDA8NDWnnSriBvqOt4eE39HlV7vrNI9rfuXQBOe7XVm15W6r7P2iye+iCTXTDK941j3q098nPBrqmt+zakN4t88TQh2AAAYzgb4TRIAAP4Tuos91vp//PFHqi/+iW+aCAAAw9y6/t4CAABDqbPYXddtb2+PFXsUAACGvcbGRhQ7AMDI0VnssQehUKhjF044/DsAAAxvKHYAgBElVuytra2d0e66bhvAOhWCdWdd/58Pg4BiBwAYUWLFbtt2Z7QDAMB/AoodAGBEIQEA4L8GxQ4AAAAAMJyh2AEAAAAAhjMUOwAAAADAcIZiBwAAAAAYzlDsAAAAAADDGYodAAAAAGA4Q7EDAIwof360zzoZ6/rzBgD4D0OxAwCMKLF4dhyntbU1EPdP/6sfsRvZto1iBwD4O1DsAAAjSiyeO//B09hj13X/uX9TO3bx2C06ox3FDgDwd6DYAQBGlFg8BwKB2INQKBQOh3//Z8Su3N7eHrvFqni0o9gBAP4OFDsAwIjSWeyu68aiOhKJ7PPOjEGN6ID98ccfsWiP3QjFDgDwN6HYAQBGlFg8xxK6ra3t999/j0V1LMIPL1w0wBE7ec3fMhLFoj32Q0HsRih2AIC/CcUOADCiJBZ7LKr/0WKP3QLFDgDw96HYAQDWgXmT0rqNmcGu4Ux2xpi0SfOG7s4odgCA/xwUOwDAv6yjwdPSF4ZXW5i+xmjnZo1NS58/dHdHsQMA/Oeg2AEAhlbp9MPT0g6fXprq+XmT08bOFtrbuj5uaxdmj02bvHoZvXvxvWtdvVex93s2Vv9jJk0aEz8ysNV4FDsAwH8Oih0AYMjMHZ82fq7708S0tIk/0bFwT9bt8WDn3cRDbqg93FnwsSKP1fzqlffOhfeEYk/xbFr6go43U2zrucyaDHmxy++euXVv9y5HsQMADCUUOwDAUJk7Ia2PCT/2O2l+elr6r26S2aviNZ++IBR/sm1BetrYmWxisad8dsFaMz3BP7DG3rvZz3xXTlhjD4VCKHYAgL8JxQ4AMFRC7R3r379M7Gj1ib90PG4P9TupYvbYsbOS71pnEzfAxM/jEop9zc8O2D+yK2b5vX0W2FHsAABDCMUOADCE4pvYJ/7SUe0ptrK7v65eHu/RtQG946nu/J4/Oa13k6/52QH7Z/axdy2zdy2wo9gBAIYQih0AYMjMHR9fXW8PhdrjK+3j5yY5qa1y9ti0hF8R7fht0rGzKzt2tnRsdln9tjHd2917mnzNzw7UP/Wbp/Fl9u4FdhQ7AMDQQrEDAAyN+LaYzp0wCQ/76vgN0Y63dOzS8c4xndvTV7W1dz+RvrDzYEKTr/nZAb5z+z/2XjHyu/f2LLD/id88BQAYUih2AIB/W1t7uFtXrvd+outdX3q9A8wan11H7xWTCoodAGAIodgBAEYOFDsAwH8Rih0AYOToLvZwOPzPFXvsyn/88QeKHQBgqKDYAQBGjs5id123vb09FtWxCB/UiA5M7MqRSCT2Q0HsRoFAAMUOAPA3odgBAEaOzmKPPQiFQrFoj0X17/+M2JVjt4jdCMUOAPD3odgBAEaOWDy3trZ2Rrvrum0DE+pnrVNiF4/dInaj2O1Q7AAAfxOKHQBg5IjFs23bndH+jwrExW7kOA6KHQDgb0KxAwCMHLF4XidjXX/eAAD/bSh2AICRgyTJXAAA6G1df21eOxQ7AMDIESv2NX/ZB/j/pLS0dF2/BPgPiH1hXNdfm9duzZ/Cun51AAAwlFDsMKKg2GEgUOwAADCsoNhhREGxw0Cg2AEAYFhBscOIgmKHgUCxAwDAsIJihxEFxQ4DgWIHAIBhBcUOI0rSYr8NhrF/5/+vPrdAsQMAwLCCYocRJVWx/xGN/h6Ntkf/aIv+sSr6x8roH63RP+zoHy3RSHM00hSNNEYjDdFIffT3uujvavR3Jfp7TfT36mjYGw1XRcOV0XBFNMxG28uj7WXR9tJoe0m0vTgaKoqGCqOh/GgoLxrKiYayom0rom3Lo21Lo22Lo22/Rd2FUffXqDsv6v4cdX+Mrvohuuq76Kpvoqu+jq76Mhr8Ihr8LBr8JBr8KBr8IBp8L7ry3ejKt6Mr34yufD268tVoYHY0MDMaeDkaeCkaeDHaOi3a+ly09dlo69PR1iejzhNR57Go80jUeSjqPBB17ova90Ttu6L2nVH79qg9JdpyS7QlPdoyKdpyY7RlYtQ/Ieq/Puq/Luq/Juq/Ktp8RbT5smjzJdHmi6PNF0Z946K+86K+c6K+s6K+M6K+06JNp0abTo42nRhtOj7adGzUGhu1jo5aR0WtI6LWYdHGQ6KNB0UbD4g27hdt3Cdq7h0194yau0fNXaPmzlFzx2jD9tGGbaMN20Qbtoo2bBE1Nosam0SNjaLGBlFjvWj96Gj9qGh9qmL/c4O0IRwodgAAGOZSFXvaICXO3WGQEuceOkiJc08//bRBjcS5Vw5S4twpt04Z1OjVHlOmDGokzn3i8ScGNRLnzh6kxLmfDlLi3HmDlDg3Z5CS/LFOXey/RyLtkUhb5PdVkd9XRn5vjfxuR373R35vjoSbIuHGSLghEq6PhOsi7WqkXYm0y5H26ki7NxKqioQqI6GKSIiNhJhIW1mkrTTSVhJpK460FUXcwoibH3FzI25OxM2OuJmRVRmRVcsiq5ZEVi2KrFoYCS6IBOdHgr9Egj9FgnMjK7+PrPw2svLryMqvIivnRAKfRwKfRgIfRwIfRgLvRwLvRlrfibS+FWl9I9L6WqT1lYgzK+LMiDgvRZzpEeeFiP18xJ4asZ+J2E9F7CciLY9HWh6NtDwcaXkw0vJApOW+iP+eiP+uiP/OiP/2iH9KpPmWSHN6pHlSpPnGSPPEiG9CxHd9xHdtxHd1xHdlpOnySNOlkaaLI00XRZouiFjnR6xzI9bZEevMiHV6xDo10nhKpPGkSOMJkcbjIo3HRMwxEfOoiHlkxDw8Yh4aaTg40nBgpOGASMN+kYZ9IsbeEWPPiLF7xNg1YuwcMXaM1G8fqd82Ur9NpH6rSP0WEX2ziL5JRN8oom8Q0deL1I2O1I2K1KUs9q3ThnCg2AEAYJj7h4p9jwHrX+wnDVj/Yr/66qsGOPoX+30D1r/YZ7w8Y4Cjf7HPnDFjgKN/sc/5Ys4AR/9iXzZg/Yu9fMD6F3vjgPUv9iR/UlMYbLG3h8Nt4fCqcPvKcHtruN0Ot/vD7b5we1M41BgONYRD9eFQXTikhtuUcJscbpPCbd5wmxh2hbDLh10u7JaH3bLwKjq8igqvIsOriPAqTzhYEA7mhYM54WB2OJgZDmaEVy4Lr1wSXrkovHJheOWv4cD8cOCXcOCncGBuOPBDuPW7cOs34davwq1fhlu/CDufhZ1Pws5HYeeDsPNe2HknbL8dtt8M26+H7VfD9uxwy8xwy8vhlunhlhfDLdPC/ufC/mfD/qfD/ifD/ifCzY+Hmx8NNz8cbn4w3Hx/uPnesO/usO/OsO+OsO+2sO/WcNPN4abJ4aabwk03hJsmhK3xYeu6sHVN2LoqbF0Rbrws3HhJuPGicOOF4cZxYfP8sHlu2Dw7bJ4ZNk8Pm6eGG04JN5wUbjgh3HBcuOGYsDEmbBwVNo4MG4eHjUPD9QeH6w8M1+8frt83XL93WN8rrO8R1ncL67uE9Z3C+o7huu3DdduG67YJ120VrtsirG0W1jYJaxuFtQ3C2nphdXRYHRVWUxb7bmlDOFDsAAAwzKHYO6HYR3ixt4VCq0KhlaG21lCbHWrzh9p8oTYr1NYYchtCrhFy9ZCrhdza0Kqa0Krq0CpvaJUYWiWEgnwoyIWC5aFgWShYGlpJhVaSoZVEaKUntLIgFMgLBXJDgexQICsUWBEKLA+1Lg21Lg61/hZqXRBqnR9y5oWcn0POjyHnh5DzXcj+JmR/FbLnhOwvQvbnoZZPQy0fh1o+DLW8H2p5N9Tydsj/Vsj/Rsj/Wsj/Ssg/K9Q8I9T8Uqj5xVDzC6Hm50O+qSHfMyHf0yHfkyHf46Gmx0JNj4SaHgo1PRBqui/UdE/Iuitk3RGybg9ZU0LWLaHG9FDjpFDjjaHGiaHG8SHz+pB5Xci8JmReFTKvCDVcFmq4JNRwUajhwlDDuJBxXsg4J2ScFTLOCBmnhYxTQsbJIePEkHF8yDg2ZBwTqh8Tqj8qVH9kqP7wUP2hIf3gkH5gSN8/pO8b0vcO1e0VqtsjVLdbqG6XUN1OobodQtp2IW2b+NgqpG0RUjcLqZuE1I1C6gYhdb1Q7ehQ7ahQbcpiPyBtCAeKHQAAhjkUeycU+wgv9lWuu9J1W91VtrvK767yuaua3FWN7irTDRpuUHeDmhusdYM17spqd6XXXVnlrhTclbwb4NxAuRsocwO0G6Dc1hK3tdhtLXJbC93WfNfJdZ1s18l0nRWus9x1lrr2Ytde5NoLXftX157ntvzitvzktsx1W753W751/V+7/i9d/xeu/3PX/6nb/LHb/KHb/IHb/J7b/I7b/Jbre9P1ve76XnV9s13fTLfpZbdputv0gts0zW16zm161m16xm16ym16wm16zLUeda2HXetB17rfte51rbvdxjvdxtvdxtvcxlvdxptdM901J7nmja450TXHuw3Xuw3Xug1Xuw1Xug2Xu8alrnGxa1zoGhe4xvlu/blu/Tlu/Vlu/Rlu/Wlu/SmufrKrn+jqx7v6sa4+1q072q070q07wq07zK07xNUOdrUDXW1/V9vX1fZ21b1cdQ9X3c1Vd3HVnVx1B7d2O7d2G7d2a7d2S7d2C1fZzFU2cZWNXGUDV1nPrRnt1oxya1IW+5i0IRwodgAAGOZQ7J1Q7CO82FcGg63BoB1c2RJc2Rxc2RRc2Rhc2RBcaQQDejCgBQO1wUBNMFAdbPUGW6uCrUKwtTLYWhF02KDDBB066FBBhwzaxUG7KGgXBu38oJ0XbMkJtmQFW1YEWzKCLcuCLUuCLYuCLQuDLb8GW+YFW34O+n8K+n8M+n8I+r8L+r8JNn8VbJ4TbP482PxZsPmToO+joO+DoO+9oO/doO/toO/NYNMbwabXgk2vBJtmBZtmBK2XgtaLQWta0Ho+aE0NNj4TbHw62PhksPHxYOOjQfORoPlQ0HwgaN4XNO8JmncFG+4INtwWH7cGG24OGpODxk1B44agMSFoXB+svy5Yf02w/qpg/RXB+suC+qVB/eKgfmFQvyConx+sOzdYd3aw7sxg3enBulODdScHtZOC2olB7figdmxQGxtUjw6qRwbVI4LqYUH1kGDtQcHaA4K1+wVr9wnW7h1U9goqewSV3YLKLkFlp6CyQ7Bmu2DNNsGarYM1WwZrNg/KmwblTYLyRkF5g6C8XrB6dLB6VLA6ZbGfmjaEA8UOADD02BljerfimBns0F150rx/esowg2LvhGIf4cXeGgjYgUBLoLU50NoUaG0MtDYEWusDrXrA0QJObcCpCTjVAUcK2GLAFgI2H7ArAjYbsJmATQdsKmCTAbs40EIEWjyBloJAS16gJSfgzwr4VwT8ywP+ZQH/koB/caD5t0DzgkDz/EDzL4HmnwK+HwO+HwK+7wK+bwK+rwNNXwaavgg0fRZo+jTQ9HHA+jBgvR+w3g1YbwesNwPWG4HG1wONrwYaZwcaZwYaXw6Y0wPmCwHz+YD5XMB8NtDwTKDhqUDDE4GGxwINjwSMhwPGgwHj/oBxb8C4O2DcGai/I1B/W6B+SqD+lkB9ekCfFNBvDOgTA/r4gH5doO7aQN01gbqrAnVXBOouC2iXBLSLAtoFAW1cQDsvoJ4TUM8OqGcG1NMD6qkB9eRA7UmB2hMCtccFao8J1I4JKEcFlCMDyhEB5bCAckig5qBAzQGBmv0CNfsEavYKyHsG5N0D8m4BeZeAvFNA3iFQvV2geptA9daB6i0D1ZsHqjcNVG8SqN4oUL1BoHq9gDQ6II0KSCmLfVzaEA4UOwDA0ONmjU1LXxjutjB9qJrdDbWH29v+6SnDDIq9E4p9hBe74zgtjtPsOE2O0+g4DY5T7zh1jqM5dq1jK44tO7bk2KLTIjgtvNPCOS2s08I4/jLHX+r4Sxx/seMvcpo9TnOB05znNOc4zdmOL9PxZTi+ZY5vqeNb7Ph+c5oWOE3znaZ5TtPPTtOPjjXXsb53rG8d62vH+tJp/MJp/Mxp/NRp/MRp/MgxP3DM9xzzHcd8yzHfcMzXnIZXnYZXnIZZTsMMp+Elx3jRMaY5xnOOMdUxnnHqn3bqn3TqH3fqH3XqH3b0hxz9AUe/z9HvcfS7Hf1Op+52p26KU3erU3ezUzfZ0W5ytBscbaKjjXe06xz1Wke92lGvdNTLHfVSp/Zip/ZCp/YCp3acU3ueU3uOU3uWU3uGU3uaU3uKU3uSo8TGCY5ynKMc4yhjnJqjnJojnJrDnZpDnZqDHfkgRz7Akfdz5H0ceS+nek+nenenelenemeneienegdH2s6RtnGkrR1pS0fa3PFu6ng3drwbOd4NHO96jjjaEUc5YspivyptCAeKHQBg6MWLfX7PxxWzx6ZNXv3xvEmr+7Fr3ZudMWbMpEljOo90fDBjxqSelfl5CY9X9V4w775S4hJ6/4O91tiT3r37hknX4rtfQexFxl9Frxec4ppJHsdOmzRj9V8+dP38MrD1fxR7JxT7CC/2Fttutu0mu6XRbmmwW+rtljq7RbNbVNuv2H7Z9ku2X7T9gt3M280VdjNrN5fbzWW2r9T2ldi+YttXZPsK7abYyLebcu2mbLsp07YybGuZbS2xrcW2tci2FtqNv9qN8+zGn+3GH+3GH2zze9v8zja/sc2vbHOO3fC53fCp3fCx3fCR3fChbbxvG+/axtu28aZtvG4br9r1r9j1s+36mXb9y3b9dFt/wdaft/Wptv6srT9t1z1l1z1h1z1m1z1i1z1kaw/a2v22dq+t3WNrd9naHbZ2m63damu32Fq6rU2y1Zts9QZbnWCr19vqtXbtNXbtVXbtFXbt5XbtpbZysa1caCvjbOV8WznXrjnbrjnTrjnDrjnNrjnFrjnJlk+05eNt+VhbHmvLY+zqo+zqI+zqw+3qQ+3qg23pQFva35b2s6V9bGkv27un7d3d9u5qe3e2vTva3h1scTtb3MYWt7bFLW1xc7tqU7tqY7tqQ7tqA7tqPVsYbQujbCFlsd+UNoQDxQ4A8BeUTj88Le3w6aUpnu5T7OzMsWljZ1d0PIxl69jZQjgcFmIR39mqHSenpS+IHWtv6/xgcscH8TMSH0+e1+vKsSutXsbvuVTSgwkvpvvuPav+8Rv2PZigZ8qC9NiJs7g+LzjVNbs+/Z7H82PzV58aO7PzxQ1s/R/F3gnFPsKLvdnvb/L7G/3NDf7men9znb9Z8zfX+psVv0/2+yS/T/T7BL+v0t9U4W9i/U2Mv6nM31Tqt0r8Fum3CL/l8VsF/sZ8f2OuvzHb35jpb1zhN5f7zaV+c7HfXOQ3F/rNX/0N8/0Nv/gbfvI3zPU3fO83vvMb3/iNr/zGl37jC3/9Z/76T/z1H/nrP/TXv+/X3/Pr7/j1t/z6G379Nb/+ir9utr9upr9uhr/uJX/di/66af665/x1z/rrnvHXPe3XnvRrj/u1R/3aw37tQb/6gF+9z6/e61fv9qt3+tXb/bVT/LW3+Gtv9tem+2sn+ZUb/cpEvzLer1znV67x11ztr7nKX3OFv+Yyf80lfvkiv3yBXz4/Ps71V5/trz7TX326v/pUf/XJ/uqT/NKJful4v3SsXxrrl472e4/0ew+Pj0P93oP94oF+cX+/uK9f3Nsv7uWv2tNftbu/ald/1c7+qh39Vdv7hW39wjZ+YWu/sKVf2Nxfuam/cmN/5Yb+yg38lev5K0f7K0f5K1MW+51pQzhQ7AAAgzN3fNr4ue5PE9PSJv5Ex8I9WbfHmzZR+sL2kBt7Yt7kWLPyHY/cUKyAeyJ8QVv3zLGzK+MfuPzsnse/psdqme0TwPEjvbI32cGEyJ8cu1H8daxqi9197MyuC64+mPhXAaslTqmMvZ6uYu9+wSmvmbTYV5/aeakBbxNCsXdCsY/wYm/y+Rp9vgZfU72vSfc1ab6mWl9Tja9J9lmSzxJ9VpXPqvRZFb5G1tfI+BppX2Opr5HymaTPJHymx2cW+Mw8X0OuryHH15Dla1jha1juM5b6jMU+Y5HP+M1nLPAZ8331v/jqf/LVz/XV/+Cr/86nf+vTv/bpX/r0L3z6Zz79U5/+sU//0Kd/4NPf89W946t721f3pq/udV/dq7662T5tlk+b4dNe9mnTfdoLPvV5nzrVpz7jU5/2qU/5ap/w1T7mq33EV/uQr/YBn3K/T7nPp9zjU+7yKXf4lNt8Nbf6am7x1dzsq5nsq7nJJ9/gkyf45Ot98nU++Rpf9dW+6it91Zf7qi/1VV/sky7ySRf4pPN90nk+6Ryf9yyf9wyf93Sf91Sf92Sf90SfeIJPPM4nHuMTx/rEo33ikT7xcJ94mE88xCce7Ks60Fe1v69qX1/V3r6qPX3CHj5hd5+wq0/Y2Sfs6BO291Vu66vcxle5ta9yS1/l5j5+Ux+/sY/f0Mdv4OPX81WM9lWM8lWkLPZH0oZwoNgBAAZl7oS+HTjhx34n9d3H3r2OHF9n7tEnwjtnxqu47+N4inOJJ7e1dy7Cd+heGU92sHsKm3ijisT87lfXXdiOHyAq+ry2xNMGcc2OT6HrWh0/gfT52WANUOydUOwjvNgbLavBsuqtRt1q1KzGWquxxmqstholy/RaZpVlVlpmhWWyVgNjNZRZDaVWA2U1kJZBWIbHMgosI98ycq36HKs+y6pfYdUvt+qXWfVLrPpFVv1Cq36BVT/fqp9n6T9b+o+W/oOlf2fp31h1sfGVVTfHqvvcqvvU0j62tI8s7QNLe9/S3rXUty31TUt9w1Jfs9RXLHWWVTvTqn3Zqp1u1b5o1U6zlOcs5VlLedpSnrKUJ62ax62aR62ah62aB62a+y05Nu615Lst+U5Lvt2Sp1jVt1rVN1vV6Vb1JKv6RkuaaEkTLOl6S7rWkq62vFdZ3iss72WW91LLe7HlvdDyjrO851necy3vOZZ4liWeYYmnWeIplniSJZ5oVZ1gVR1nVR1jVY2xqo6yhCMt4XBLOMwSDrGEg6zKA6zK/a3Kfa3Kva3KPS1+D4vfzeJ3sfidLX5Hi9/eqtjWqtjaqtjKqtjSqtjc4ja1uI0tbkOLW9/i1rPY0RY7ymJTFvtzaUM4UOwAAIMSau8o8F8mdhTgxF/iNR7qd1L/9F0tVq2JJR9feP+Lxd65jN7vF1v7H+ye0pHJ3TeaP7n/Bfu/7F5lnazYB3HNrk+hQ6+fBNYKxd4JxT7Ci73BNOtNUzcbNLOh1myoMRuqzQZvxzCqTKPSNCpMgzWNcrO+zKwvNetLzHrSrCdMvcjUC00939RzTT3b1LNMPdPUM0x9makvMesWmXW/mXULzLpfzbp5Zt3Ppvajqc01te9N7VtT+9pUvzLVOab6hal+ZqqfmLUfmbUfmLXvm7XvmbXvmMpbpvKGqbxmKq+aymxTmWnWzDBrXjJrXjRrXjBrnjflqab8jCk/ZcpPmvITZvVjZvUjZvVDZvUDZvX9pnSfKd1jSneZ0h2mdJspTTG9t5jedNM72fTeZHpvML0TTe9403ud6b3G9F5lilea4hWmeJkpXmKKF5lVF5hV48yq88yqc82qs03hTFM43RROM4VTTOEkUzjBrDzerDzWrDzGrBxjVh5l8keY/GEmf6jJH2LyB5kVB5gV+5kV+5gVe5sVe5rcHia3m8ntYnI7mdyOJre9yW5rslub7FYmu4XJbm6Wb2qWb2yWb2iWr2+Wr2eWjzbLR5nlKYt9dtoQDhQ7AMBgxTexT/ylo9pTbGVPWewdG0dWx/W8SUl2fQ+82LunJzyZ/GDCsnzC3bu256y52PtM6R/kSa/ZvYencwt/4j72yfN6nTkwKPZOKPYRXuz1hqEbhmbU1xr1NUZ9tVEvGfWiUV9l6JWGXmHorKGXG3qZoZcaeomhF8dHkVFXaNTlG3W5Rl2OUZdlaJmGlmFoywxtiaEtNtTfDHWBoc431HmG+ouh/mTUzjVqvzdqvzVqvzFqvzKULw3lC0P5zFA+NZSPjZoPjZr3jZp3jZp3jJq3DflNQ37dkF815NmGPMuQZxjVLxvV043qF4zqaUb1c4b0rCE9bUhPGtIThvS4IT1qSA8b0oOGdL8h3Wd47zW8dxveOw3v7Yb3NsN7qyHebIiTDXGSId5oiDcYVROMquuNqmuNqmuMqqsM4UpDuNwQLjWEiw3hIqPyAqPyfKPyXKPyHKPybIM/0+BPN/hTDf5kgz/J4E8wKo43Ko41KsYaFUcbFUcZ3BEGd5jBHWpwBxvcQQZ7gMHuZ7D7GOxeBrunwe5hsLsZ7C4Gu5PB7mCw2xvl2xrlWxvlWxnlWxjlmxvMpgazscFsaDDrG8x6Rtloo2yUUZay2N9PG8KBYgcAGJy54+Or6+2hUHt8pX383P7npCz2VW3tC7s2xoydXRnf1P3Xij3hQj3b5JMeTLh+wvNJnk36snumTJ6dZNNL0mvG96l3Hhoza3Z6whp7evqYXp873isGxY5i7ydVsdfpuqbrtXpdjV5XrddJep2o1wl6XaVeV6HXcXpduV5XpteV6lqJrpG6Ruhaka4V6mq+rubpao6uZunqCr02Q69drtcu1WsX67W/6coCXflVV+bpyi+68pOuzNVrftBrvtNrvtFrvtJr5uhybHyuy5/q8se6/KFe/YFe/Z5e/Y5e/bZe/aYuvaFLr+nSK7o0S5dm6tLLuvSSLr2oS9N06Xldmqp7n9G9T+neJ3Tv47r3MV18RBcf0sUHdPF+XbxXr7pHr7pLr7pDr7pdr5qiV92iC+m6MCk+btSFiXrleL3yOr3yWr3yar3ySp2/Qucv0/lLdf5inb9QrxinV5ynV5yrV5yjV5ylc2fo3Gk6d6rOnaxzJ+rc8Tp3nM4dq3Njde5onTtSZw/X2cN09lCdPVhnD9TL99fL99PL99HL99LL99CZ3XVmN53ZRWd20pkddGZ7vWxbvWxrvWwrvWwLvWwznd5UpzfW6Q11en2dXk8vHa2XjtJLUxb7nLQhHCh2AIDBie866dwJk/CwtzW9BUpbe+KWmL4nxz7oOt7rcWxW/HHCyd0XCifcK8nBXtfvuXuSZ5O/7K4plR2h/qvb/7R+10zYm9Pxg83q4/F97JXtqT/3lFDsnVDsI7zYNU2r1bQaTavWNK+miZomaBqvaRWaymlquaaWaWqpppZotaRWS2i1Hq22UKst0JQ8TcnRlCxNWaEpGVrNcq1mqVazWKtZpNUs1ORfNXmeJv8cHz9q8g9a9Xda9Tda9dda9Zda9Rea9LkmfaZJn2jSR5r0geZ9T/O+q3nf1rxvad43NO9rmvdVzTtb887UvC9r3pc0cbomvqCJz2viVE18Vqt6Wqt6Uqt6XKt6TKt6VBMe1oQHNeF+TbhPE+7RKu/WKu/UKm/XKm/TKm/VKm/W+MkaP0njb9L4GzR+glZxvVZxnVZxjVZxlVZxhcZdrnGXadwlGneRxl2gceM07jyNO0fjzta4MzX2DI09TWNP0diTNPZEjT1eKz9OKz9GKx+jlR+tlR+pMYdrzKEac4jGHKwxB2pl+2tl+2pl+2hle2lle2j07hq9q0bvotE7afQOGr2dVrqtVrq1VrqVVrqFVrqZRm2qURtr1IYatb5GraeVjNZKRmklKYv9p7QhHCh2AABILfFfbx07W/g7/xJT4j72wfmHin1QEuceOkiJc2MRPqiROPfKQUqcG4vwQY1e7TFlyqBG4txYhA9qJM6dPUiJcz8dpMS58wYpcW7OICX5Y5262GtVtUZVq9Var1orqrWCWsurtVzHUMpVpUxVSlWFUhVSrSHUGo9aU6jWFKg1eaqco8pZqpypyhmqvEytXqpWL1GrF6nVC9XqX1Vpnir9oko/qdKPqvSDKn2ver9VvV+r3i9V7xzV+7nq/Uz1fqJ6P1K9H6re91XxXVV8WxXfUsU3VfF1tepVteoVtWqWWjVDrXpJrZquCi+qwjRVeE4VnlWFZ9TKp9TKJ9TKx9TKR9XKR1T+IZV/QOXvU/l7Vf5uteIuteIOteJ2tWKKWnGLWpGucpNV7iaVu1HlJqrceJW7XuWuVbmrVe5KlbtCZS9X2UtV9mKVvUhlL1DLz1fLz1XLz1HLz1bLz1SZ01XmVJU5RWVOUpkTVOY4texYtewYtWyMWnaUWnaESh+u0oeq9CEqfZBKH6iW7q+W7quW7q2W7qWW7qFSu6vUriq1s0rtpFI7qNR2KrWNSm2tUlup1BYqtZlasqlasrFasqFasr5asp5KjlbJUSqZstiXpA3hQLEDAEBq3YvlCQvjf1HXXxMMXqpiB/h/KVWx1yhKtaJ4lRpRqRGUGl6p4ZQaVqkpV+QyRS5VZEqRSUUmlGqPUl2oVOcr1XlKdY4iZStSpiJlKNIyRVqqeJco3kWKd6HiXaB45yveXxTvT4r3R8U7V/F+r3i/VcSvFfErRZyjiJ8r4qdKVWx8rFR9qFS9r1S9pwjvKMJbivBGfLymVL6iVM5SKmcqlS8rldOVyhcUPjaeV/ipCv+Mwj+tVDypVDyuVDyqVDyiVDyscA8q3P0Kd5/C3aNwdyncnQp3u8LdpnC3KtzNCpeusJMU9kaFvUFhJyjseKX8OqX8GqX8KqX8SqX8coW5TGEuUZiLFeZChRmnlJ2nlJ2rlJ2tlJ2llJ2h0Kcr9KkKfbJCn6jQJyj0cUrpsUrpWKV0jFJ6lFJ6hEIdplCHKtQhCnWQQh2gUPsr1L4KtbdC7alQeygluysluyolOyslOyolOygl2ynkNgq5tUJupZBbKORmSvEmSvHGSvGGSvH6SvFohYiNUQqRstjz04ZwoNgBAGCYQ7HDiJKq2Ktl2SvLolwtyNW8XM3J1axczcjVZbJUKkuULJGyRMiSR/YWyt582Zsre3Nkb7YsZspihiwuk8WlsrhYFhfJ4kJZXCCL82XxF7nqZ7nqR7nqB7nqe7nqO7nqG1n4ShbmyMIXsvCZLHwiV34sV34kV34gV74nV74j82/L/Jsy/7rMvybzr8oVs+WKmXLFDLniJbniRblimsw9L3PPydyzMve0zD0ls0/I7GMy+0h8PCSzD8jsfTJ7r8zeLbN3yuV3yOW3y+VT5PJb5PJ0uXyyzNwkMzfIzESZmSAz18tl18plV8tlV8llV8hll8n0pTJ9iUxfJNMXyPQ4ufQ8ufQcufSs+DhDpk6TqVNk6mSZOlGmjpepY+NjrEwdLVNHytQRcslhcskhcsnBcslBcskBMrmfTO4jk3vL5J4yubtcvJtcvKtcvLNcvKNcvINcvJ1MbCMTW8XHFjKxmVy0iVy0sVy0oVy0vlw0WvbExijZk7LY6bQhHCh2AAAY5lDsMKKkKnavJFVJkiB5ecnLSV5W8jKSl5a8pZJISSIpiYQkeiSxUKrKl6pypaocqSpbqsqUqjKkquVS1VKparFUtUgSfpOEBZIwXxLmScLPUuWPUuUPUuX3UuV3UuU3UuVXEv+lxH8h8Z9J/KcS/7FU8ZFU8YFU8b5U8a5U8bbEvSlxb0jcaxL3qsTNlthZEjtDYl+S2OkS+4LEPi+xz0nsVIl9RmKfktgnpfLHpfJHpfKH4+NBiblfYu6VmHsk5i6JuUMqu10qu00qu1Uqu1kqS5fKJkn0jRI9MT7GS/R1Uuk1UunVUumVUunlUullEnWpRF0sURdK1AUSdb5EnStR50jUWRJ1pkSdLpWcJpWcIpWcJJWcIJUcL5UcK5HHSOQYiTxaIo+UyMOl4sOk4kOk4oOl4gOl4gMkYj+J2Eci9pKIPSVid6loN6loV6loZ6loR6loe6loO8mzjeTZSvJsKXm2kDybSZ5NJM/GkmdDybO+5BktFcbGKKkwZbGLaUM4UOwAADDModhhRElV7FWiKIgiL1ZxYlW5WMWIVbRYRXUMgRQFQhQ8olAoCvmikCsKOaKQJQqZopAhVi4XK5eKlYvFykVi5UKRXyDy80V+nsj/LPI/ihVzxYrvxYpvxYpvxIqvxYovRe4Lkftc5D4VuY9F7iOR/VBk3xfZd0X2HZF9Syx/Qyx/XSx/VSx/RSyfJZbPFMtfFsuni+UviuXTxPLnRGaqyDwrMk+LzJMi84RY9phY9ohY9lB8PCDS94n0PSJ9t0jfKdK3i6WxMUUsvUUsTRdLJ4ulN4nUDSI1UaQmiNT1InWtSF0jUleJ1BUidblIXSqWXCKWXCSWXCiWjBNLzhPJc0XybJE8UyTPEMnTxeJTxeKTxeKTxOITxOLjxOJjReIYkRgjEkeJxJEicbhYdKhYdIhYdLBYdKBYtL/o2U/07CN69hI9e4qe3UXPbqJnF9Gzs+jZUfRsL3q2FQu3EQu3Egu3FAu3EAs3Ews2EQs2Egs2FAvWFwtGi/mxMUrMT1nsdWlDOFDsAAAwzKUq9ts3TxvU6DX3uLRBjV7fi28dNaiROPeYW0YNaiTOHXXLqEGN3nOPG9RInJt2622DGr3mHn/boEavudvcNqiROPf4bW8b1Oj1Z2OH2wY1es3d6rhBjWR/rlMWe6Ug8ILACZXlQiUjVNJCJSVUlgiVpFBJCJUeobJQqMwXKnMFPkfgswR+RXwsFyqWChWLhYpFQsVCoeJXgYuNeQL3s8D9JHBzBfZ7gf1WYL8R2K8F9kuBnSOUfy6UfyqUfyKUfySUfyAw7wvMewLzjsC8JTBvCszrAvOqwLwiMLMFZqZQ9rJQ9pJQ9qJQNk0oe14omyrQzwr00wL9lEA/IdCPCaWPCqUPC6UPxsf9AnWvQN0jUHcJ1B0CdZtQEhu3CiU3CyXpQskkoeRGoeQGoWSCUDJeKLlOKLlWIK8WyCsF8gqBvEwgLxGKLxaKLxKKLxCKzxeKzxOIcwTiLIE4UyDOEIjThKJThKKThaIThaLjhaLjhKJjBM9YwTNG8BwleI4QPIcLnkMFz8GC5yDBc6Dg2V8o3Fco3Eco3Eso3EMo3F0o2E0o2EUo2Eko2FEo2F4o2FbI30bI30rI31LI31zI30zI20TI20jI21DIW1/IGy3kxsYoITdlsbekDeFAsQMAwDC3hmKftfVAR/9inzVuoKN/sc98aaCjf7GfO32go3+x/2/6QEeSYp8+bqCjf7G/PHOgo3+xXzhzoKN/se80c6CjX7FfsMvMAY7+xT5rj5kDHP2LfdYO4wY4BlvsPM9zPF/O8wzP0zxP8XwJzxfzPMFXePiKQr4in6/I5StyeC6L51bwXAbPLee5pTy7hGcX8exCnl3As/P58nl8+c98+U98+Vy+/Hue+Y5nvuGZr+JjDs98zjOf8cwnPPMRz3zIM+/zZe/xZe/wZW/zZW/yZa/z9Gs8/QpPz4qPGXzpS3zpdL70Bb70eb70Ob70WZ56hqee4qkneepxnnqUL3mEL3mIL3kgPu7jS+7hS+7mS+7kS27nS27jySk8eQtPpvPkZJ68iSdv4Isn8sXj+eLr+eLr+OJreOIqnriSJy7niUt54hK+6GK+6EK+aBxfdD5fdC7vOZv3nMV7zuA9p/Oe03jPKbznJN5zIu85nvccy3uO4QvH8oVH84VH8oVH8IWH8QWH8AUH8wUH8QUH8AX78/n78vl78/l78fl78Pm78Xm78nm78Hk78Xk78Hnb83nb8rlb87lb8blb8rmb87mb8bmb8Lkb8bkb8rnr87mj+Zz/8Tmj+JyUxd6eNoQDxQ4AAMMcir0Tin2EFzvHceUcV8ZxNMdRHEdyXDHHFXGch2MLOTafY3M5Nodjs7jyFVx5Ble+jCtfypUv4ZhFHLOQYxZwzHyO+YUri42fuLK5XNkPXNl3XNk3XNnXXNmXXNkcruxzruwzjv6Eoz/m6A85+n2Ofo8rfZcrfZsrfZMrfYMrfY2jXuWo2Rw1k6NmcNTLXMl0ruQFrmQaV/IcV/IsV/IMRz7NkU9y5BMc+RhHPsKRD3Pkgxx5f3zcyxXfzRXfxRXfwRXfxhVP4YhbOeJmjkjniEkccSNH3MAVTeCKrueKruOKruWKruY8V3GeKzjPZZznUs5zMVd4EVd4AVc4jis8jys8lys8mys8kys8gys8nSs8lSs4mSs4iSs4gSs4jis4lisYy+WP4fKP5vKP5PIP5/IP4/IO4fIOio8DuLz9uNx9udy9udw9udw9uNzduNxdudxduNyduNwduNztudxtuZytuZytuJwtuZzNuZzNuOxNuOyNuOwNuez1uezRXNb/uKxRXFaqYg//mTaEA8UOAADDHIq9E4p9hBd7OcuWsSzNllNsOcmWF7PlRWx5Ycdg8lkml2VyWCaLZVawZRls2TK2bEl8LGLphSy9gKXns/QvLP0zS//E0nNZ+geW/o6lv2FLv2ZLv2RL57ClX7Cln7Gln7DUxyz1IUt9wFLvsdQ7bMnbbMlbbMkbbMnrbMmrLDmbJWex5AyWfJklX2KLX2SLp7HFz7PFU9niZ9jip9nip9jiJ9jix9niR9nih1niIZZ4gCXui4972KK72KI72aLb2aIpbNGtrOcW1pPOeiaznptYzw2sZyJbOJ4tvJ4tvI4tvIYtvIotvJItvJwtvIwtvIQtvIgtuJAtuIAtOJ8tOI8tOIfNP4vNP5PNP53NP43NP5XNO5nNO5HNO4HNO47NO4bNG8vmjmFzj2Jzj2RzD2dzD2VzDmFzDmJzDmRzDmBz9mNz9mFz9mZz9mRzdmdzdmOzd2Wzd2azd2Kzd2Czt2Ozt2WztmaztmKztmSzNmezNmUzN2EzN2IzN2Qz12czR7Mr/seuGMWuSFXsLX+mDeFAsQMAwDCHYu+EYh/hxV7GMKUMQzFlJFNGMGVFTFkhU1bAlOUzdC5D5zB0FkOvYOgMpnQZU7qEKV3MlC5iShcypQuY0vlM6S9M6c9M6Y8MNZehfmCo7xjqW4b6min5kimZw5R8zpR8xpR8ypR8zJAfMuQHDPkeQ77LkG8zxW8xxW8yxa8zxa8yxa8wxCyGmMEQLzPESwzxIkO8wBDPM8RUhniWIZ5miKeYoieZoseZoseYokeYoocYz4OM537Gc2983M0U3skU3sEU3sYUTmEKb2EKbmYKJjMFk5iCG5mCG5iCCUzB9UzBdUzBtUzB1UzBVUz+FUz+ZUz+pUz+xUz+RUzehUzeOCbvfCbvXCbvbCb3LCb3DCb3tPg4hck5ick5kck5nsk5jsk5hskZw+QczeQcxeQcweQczuQcymQfzGQfxGQfyGTvz2Tvx2Ttw2TtxWTtyWTtzmTtxmTuymTuzGTuxGTuwGRux2Ruy6zYmlmxZXxszqzYlMnYhMnYiMnYgMlYn8kYzWT8j8kYxWSkKva6P9OGcKDYAQBgmEOxd0Kxj/BiL6XpEpom6VKCLi2iSwvp0ny6NI8uzaWpbJrKoqkVNJVBU8vokiV0yWK65De6ZCFdsoAumU+XzKNLfqZLfqRL5tLkDzT5HU1+S5Nf0+RXdPEcuvhzuvgzuvhTuvhjuvgjmviAJt6jiXdp4m2aeIsuepMuep0ueo0ueoUumkUXzaSLXqaLXqKLptNFL9CeabTnOdrzLO15hvY8RXueoAtj4zG68BG68GG68EG64AG64D664J74uIvOv4POv53On0Ln30rn30znp9P5k+n8m+j8G+j8iXT+eDrvejrvWjrvGjrvajrvSjr3cjr3Mjr3Ejr3Yjr3QjrnAjpnHJ1zHp1zDp1zNp19Jp19Op19Gp19Kp19Mp19Ep19Ap19PJ19LJ09ls4eQ2cdTWcdSWcdQWcdRmcdSmceTGceGB/705n70iv2oVfsRa/Yk16xO71iVzojNnamM3akM3agM7ajM7ahM7amM7akM7agMzanMzall29CL9+IXr4BvXx9evloetn/6GWj6GWpil34M20IB4odAACGORR7JxT7CC/2EooiKYqgSjxUSSFVkk+V5FElOVRJNkVmUeQKilxOkcsocglFLqbI3yhyIUUuoMj5VPE8qvhnqvhHqnguVfw9RXxHEd9SxNcU8RVFzKGKPqeKPqOKPqGKPqaKPqKKPqA871OedynP25TnLcrzBuV5nfK8RnleoTyzKc9MqnAGVfgSVfhifEyjCp6jCqZSBc9QBU9TBU9SBY9T+bHxKJX/MJX/EJX/AJV3P5V3L5V3d3zcSeXdTuXdRuXdSuXdQuWlU7mTqdxJVO6NVO4NVO4EKvd6Kuc6KucaKudqKucqKucKKvtyKvtSKvtiKvsiKvsCKmsclXU+lXUulXUOlXUWlXUGlXU6lXVqfJxMZZ5IZZ5AZR5HZR5LZd6w8EdWEGzHWVSQN2X+D4dRKw6hMg6mMg6kMg6gMvanMvallu9NLd+LWr4HtXx3avmu1PJdqOU7U8t3pJZvTy3fjlq+DbVsa2rZltSyLahlm1PLNqWWbkIt3YhaugG1dH1q6Whqyf+oJaOoJamKnfozbQgHih0AAIY5FHsnFPsIL/ZikiRI0kMWF5LF+WRxLlmcQxZnkcWZZPEKsng5WbyMLF5CFi8mid9IYgFJ/EoS80liHln0M1n0I1k0lyz6niz6jvR8S3q+Jj1fkZ45pOcLsvAzsvATsvBjsvAjsvADsvB9svBdsvAdsvAtsvBNsvB1suA1suBVsmA2WTCTLJhB5r9E5k8n818g86eR+c+TeVPJvGfJvKfJvCfJvCfIvMfI3EfJ3EfI3IfI3AfJ3PvJ3PvI3HvI3Lvi4w4y53YyZwqZcwuZczOZM5nMnkRm30Rm30BmTySzx5PZ15NZ15JZV8fHlWTW5WTmZWTmJWTmxWTmhWTmBWTmODLzPDLzXDLzbDLzTHLFGeSK08gVp5IrTiFXnERmnEhmHE9mHEdm3Ljgh3KOvfzyy7faaqvY/9q2fev87w8hlx9ELj+QXH4AuXw/cvm+5LK9yWV7kcv2IJftRi7blVy6C7l0J3LpjuTS7cml25FLtyGXbE0u2ZJcsgW5ZHNyyabk4o3JxRuRizcgF69PLh5NLv4fuXgUuThVsef8mTaEA8UOAADDHIq9E4p9hBc7QRAegiggiHyCyCWIHILIIohMglhBFC0nipYRRUuIosVE0W+EZwHh+ZXwzCM8vxCen4nCH4nCuUTh90Thd0ThN0TB10TBV0TBHKLgC6LgM6LgE6LgY6Lgw/h4nyh4l8h/h8h/i8h/k8h/nch/jch7lcibTeTNIvJmEHkvE7nTidwXiNxpRO7zRO5zRM6zRM7TRM5TRM4TRM7jRM6jRM4jRM7DRM6DRM4DRM59RPa9RPbdRPad8XE7kXUbkXUrkXUzkZVOZE0iMmPjRiJzIpE5gci8nsi8jsi8hsi8msi8isi8gsi8nFhxKbHiEmLFRcSKC4gV44iM84mM84iMc4iMs4iMM4nlpxPLTyOWn0IsP5lYfhKx7ARi2fHEsmOJZYsK8iZPnpzW5YwzzrAd52Bi6UHE0gPiYz9i6T7Ekr2JJXsSS/YgluxGLNmVWLwLsXgnYvGOxOLticXbEYu3IRZvRSzekli8BbF4c2LxpsSijYlFGxGLNiAWrU8sGk389j/it1HEb6mK/bc/04ZwoNgBAGCYQ7F3QrGP8GL3eDwFHk++x5Pr8WR7PFkez/+x855Pjav7gm7nnHPOOeecc84555zJDkIIIUsWQghZSAghhBASQgghjI0xbreXt/1t7ty7J5yv8yfc+XT2XmfuVF/avdc+3XstzjT3dk11ndZTT1Fu6/2pq9qu6qfeelFXOh1NpzvTqY50KpxOtadTwXTKTv+pNf2nlvSfzPSfmtN/akon9XRSSyfVdFJJJ+vTSTmdlNLJ2nSyJp0U0r/w6V+49C9s+pfK9C9M+hc6nahIJ8rTibJ0gkgn8PSHbrH0B1/6A5L+AKfjxel4UToOpuOF6bg3Hfek4650vCAdz0vHc9Px7PT7rPT7d+n3b9LvX6ffv0zHXqRjz9KxJxkfpbseprvup7vupbvupLtuZbyR7rqe7rqa7rqc7rqUjl5IR8+no+fS0TPp6Ol058l054l057F059F05+F05FA6cjAd2Z+O7EtH9qQ7dqc7dqY7dqQ7tqc7tqY7tqQ7NqU7NqY7uvt8zJgxfb6g+99waTq0OB1alA4tTIcWpEPz0u1z0+2z0+0z0+0z0u3TMk5Jt09Kt09Mt49Pt49LB8ekg6PTwVHp4Ih0cHi6bWi6bUi6bVC6bWC6rX/a7pe2+6btnopd+9jnO+oUu4ODg4PDD45T7J9xiv0nL/Y/pVK/pFKJ1J/iqT+9T/2pK/WnaOpPkdSfOlLJcCrZnkoGU0k7lWxN/dKS+sVM/WKkfmlK/aKnEloqoaYSSipRn0rUpRJSKlGbStSkEkIqwac+VKU+sKkPTEY69aEiFS9PxclUnEjFS1Nxf+o9lnqPpt4jqfclqffFqfdQ6j2Yeg9k9KRi7lSsIBXLT8VyU7GcVCwr1fUu1fU21fU61fUq1fUiFX2eij5NRR9nfJiKPkhF76Wid1PR26norVTnzVTn9VTntVTnlVTn5VTnxVTkQipyLhU5m4qcSUVOpTpOpjqOpzqOpTqOpDoOp8KHUuEDqfD+VHhvKrwnFd6VCu9MhbenwttS4a2p0OZUaFMqtCEV+vM//dOePXu+3GPvfmdpKrg4FVyUCi5MBeengvNSwTmp4OxUcGYqOCMVnJZqm5pqm5Jqm5Rqm5hqG59qG5eyx6Ts0Sl7VMoekbKHp1qHplqHpFoHpVoHplr7p1r7pVr7plp7KnbhY5/vqFPsDg4ODg4/OE6xf8Yp9p+82H9JJj8kk/HkL7HkL13JXzqTv0SSv4STv4SSifZkoi2ZsJMJK5loSX5oTn4wkh/0jFryg5r8oCQ/yMkPdckPtcl4tzXJuJCM88l4VfI9m3xfmXwfSL6nk+8rku/LkzEyGSOSsdJkzJ+MYckYmowhyVhJMlacjEHJLjDZVZjs8mZ0J6OuZDQ/Gc1NRnOS0axk9F2y822y802y81Wy82Wy83my81my80my81HGB8nI/WTkbjJyJxm5lYzcTHbcSHZcS3ZcTXZcTnZcSnZcSIbPJ8Nnk+EzyfDpZPhkMnQiGTqWDB1Nhg4nQ4eSoYPJ0IFkaF8ytDcZ2p1s35Vs35Fs35ZxSzK4ORncmAxuSAavNyv/7b/9t+5QHzNmTPfP7tdvjIYlybbFybaFybYFybb5yba5SXtO0p6VtGcm7elJe1qydWqydUqydVKydWKydXyydWzSGpO0RmUckbSGJ62hSWtI0hqUtAYmrf7Jln7Jlr7Jlp6Kvfxjn++oU+wODg4ODj84TrF/xin2n7zYPyQS8UQilvjQlfjQmfjQkfgQTnxo/2S8LRG3E3ErEW9JxJsTcSMR1xPxxkRcS8QbEu+VxHs58b4u8b428V5MxGoSMSER4xOxqkSMTXRVJroCiS460VWR6CpPdJGJLiLRVZro8ie6sESXLxHttiQRhRNRKBEtSnQWJjqBRKcn0elOdLoSkfxEJC8RyUlEshORd4nI20THm0TH60THy0THi0THs0TH00TH40THo0THw0TH/UT4XiJ8JxG+nQjfTIRvJELXE6GridCVROhSInQxETqfaD+XaD+T8VSi/WSi/Xii/Vii/Uii/XCi/WAieCAR3J8I7k0E9ySCuxJtOxNt2xNt2xJtWxNtWxL2poS9MWGvT9jrEvY7o+HP//Rf/+///t+7f741GpYm7CWJ1kWJ1oWJ1gWJ1vmJ1rkJa07CmpWwZias6QlrWsKamrAmJ6xJCWtCwhqfsMYmWsYkWkZlHJFoGZ4whybMIQlzUMIcmDD7J5r7JZr7Jpp7Knb4Y5/vqFPsDg4ODg4/OE6xf8Yp9p+82N/H47F4PBp/3xl/3xF/H46/b4+/D8bft8VjrfGYFY+1xGPN8ZgRj+nxWGM8psZjDfGYEu+S41118a7aeJcY7xLi0W75eLQqHmXj0cp4ZyDeScc7qXhnebyTjHcS8c7SeCce78TinWi8E4lHSuIROB6B4pGieKQw3gHEOzzxDne8wxXvKIiH8+Lh3Hg4Ox7OioffxsNv4uHX8fDLePhFPPwsHn4aDz2Jhx7FQw/joQfx0L14+914++14+614+414+/V48Fo8eDUevBwPXooHL8SD5+PBs/HgmXjwdDx4Mh48EW87Fm87Gm87HG87FG87GLcPxO19cXtv3N4dt3fFW3fEW7fHW7dm3Bxv3RRv3RBvXR9vXRtvXRNvXRW3VsatFXFrWdxaGrcWx1sWxVsWZJwXb5kbb5kdb5kVb5kRb5keb5kaN7udHDcnxc0JcXN83Bwbbx4Tbx4Vbx4Zbx4Rbx4WN4bGjcFxY1DcGBA3+seNfnGjb9zoqdjzP/b5jjrF7uDg4ODwG3/2retzu+XrN9b5/vxvLPzdxFeX/xfLvhWn2D/jFPtPXuxdsVg0FovEujpiXaFYV3usqy3WZce6WmNdVqzLjHU1x7qaYl16LKrFomosqmSUY511sc7aWKcY6xRindWxCB+LVMUibCxSGYsEYhE6FqFikfJYhIxFymKR0lgHHuvAYh1orAOJdZTEwnAsDMXCRbEwGAsDsZA3FnLHQq5YqCAWyouFcmOh7FgoKxZ6Fwu9iYVex9pfxdpfxNqfx9qfxtqfxIKPYsGHseCDWPB+LHg31nYn1nYr1nYz1nY91nYt1nY11nYl1nYp1nYx1nY+1nYuZp+J2adj9qmYfTJmH4+1Hou1Hom1Ho61Hoy1HohZ+2PWvpi1J2btjlk7Y9aOmLUtZm2NWVti1uZYy8ZYy4ZYy7pYy9pYy+pYy6qYuTJmroiZy2Lm0pi5OGYuipkLYub8mDkvZs6JNc+ONc+MNc+INU+PNU+NGVNixuSYMTFmTIgZ42LG2FjT6FjTqFjTyFjTiFjTsFjT0FjT4FjToFjTgFhT/5jeL6b3jek9FfvLj32+o06xOzg4ODj8xj//F//69di/Fvqf0fXr/f/ln3+/8D9h6/vctT5N/PXXf/n1Lz1d/vvVv6///8S/Uey98qvZTX165Vf/Fz/o2yu/nO2O8F755Wx3hPfKr2c39covZz8Ve2/8ara72HvjV7Pdxd4bv5ztjvBe+dV3Y9KjXvnV7JhNvfKPvtc9FntnNBqJRjuinaFoZ3u0sy3aaUc7rWhnS7TTjHY2Rzubop16tFOLRtRoRIlG6qMRORqpi3bURjvEaIcQ7aiOdlRlZKMdldGOQLSDjoapaLg8Gi7LWBoN49EQFg2h0RASDZVEQ8XR9m6Lou1gtB2Itnuj7e5ouyvanp8xNxrMiQazosF30eCbaPB1NPgy2tbt82jbs2jbk2jb46j9MGo/iNr3o/a9qH0nat+O2jej9o2ofT1qX422Xom2Xo62Xoy2Xoi2nou2no1aZ6LWqah1MmqdiFrHoi1Hoy1Hoi2Hoi0Hoy37oy37oi17oy17oi27oi07o+b2qLktam6Jmpuj5qZo88Zo8/po87po85po8+po88qMy6PNy6LNS6LNi6PGwqixIGrMjxrzosacaNPsaNPMaNOMaNO0aNPUqD4lqk+O6hOj+oSoPi6qj43qo6P6qKg+MqqPiOrDoo1Do42Do42Doo0Doo39o1q/qNY3qvVU7Hc/9vmOOsXu4ODg4PB3MsmO/pbsvwX7px3yv/G3jfK/F/hXm+cttz8vWnfnzufLf7v62/t9bt++/dvqz7v337b33lOxOzj8u6SnYo9EIuFIJBSJBCORtkikNRKxIhHzkx1GpKMp0tEY6dAiHQ2RsBIJ10fCdZGwFAnXRkJiJCREQtWRUFUkxEVCbCRUGQkFIiE6EqIi7eWR9rJIOxFpL42045F2LBJEI0EkEiyJBOFIEIq0FUXawEgbEGnzRto8kTZXpK0g0paXMSdiZ0fsdxH7bcR+HbFfRewXkdZun0Van0ZaH0daH0VaH0Ra70da70Va70Zab0esWxHrRsS6HrGuRawrkZbLkZZLkZaLkZbzkZZzkZYzEfN0xDyZ8XjEPBYxj0TMwxHzYMQ8EDH3RZq73RNp3h1p3hlp3hExtkeMrRFjS8TYHDE2RowNEWN9xFgbMdZEjFURY2WkaUWkaXmkaWmkaUmkaVFEXxjR52ecG9HnRBpnRRpnRhqnRxqnRRqnRhqnRBonRRonRhonRBrHRRrHRrTREW1URBsZ0UZEtGERdWhEHRxRB0XUARG1f6ShX6Shb6Shp2K/9LHPd9QpdgcHB4efiv8Ar+zTZyX8H3q4/GWy/y3Yu3t7vf+f/uUT/+Rf/zmw/17sX2ye/+s6+253nX96929X//Lrp8G7bf/y66/23b/t4Vt3Pt37j7fo/xGn2B1+Knoq9nA43B4OB8NhOxxuDYetcNgMh5vDYSMcagqHGsMhLRxqCIeUcLscbq8Lt0vh9tpwe024XQi3V4fbq8LtXLi9MhxkwsFAOEiHg1Q4WB5uKwu3EeE2PCMWbkPDNhK2S8I2HLahsF0UtsGwXRi2vWHbE7Zd4daCcGteuDU33JoTbs0OW+/C1tuw9SZsvQpbL8PW84xPw9aTsPUobD0Mt9wPt9wLt9wNt9wJt9wKmzfD5o2weS1sXg2bl8PN3V4MN18IN58LN58NN58ON58KN58MN58INx8LNx8NG0fCxqGwcTBs7A8b+8JNe8NNe8JNu8JNO8NN28NN28JNW8NNm8NNm8JNG8P6hrC+LqyvDeurw/qqsL4i3NjtsnDj0nDj4nDjorC2IKzND2vzwtrcsDY7rM0KazPD2vSwNi2sTQmr3U4KqxPD6viwOi6sjgk3jA43jAo3jAw3DA83DAs3DA03DA43DAo3DAg39A8r/cJK37DSU7Ef/djnO+oUu4ODg8PPgn61z1X9n43rffpcN/6P7nD/w27/12T/bYf9L91R/dfPJ2P+ufXuP4T6vxZ7y50+d+3P6/7yX/3rvyz2L178pTvZP9295c4fH7f5Q5xid/ip6KnY20OhtlDIDrW3htpbQu1mqN0ItTeF2vVQsDEUVEPBhlBQCQXlUFtdqK021CaG2mpCbUKojQ+1VYXa2FBbZaiNCdmBkE2HbCpkl4fsslArEWrFQ63+UCsWakVDrb5Qa0moFQ61QqHWolBrYcjq1huyPCHLFbIKQi35oZbcUEtOqCU71JIVMt+GzDch81XIfBkyX4TMZyHzach8EjIfh8yHIfNBqPleqPluqPlOqPl2qPlmyLgRMq6HjKsh40rIuJTxQsg4HzLOhowzIeN0qOlkqOlEqOl4qOlYqOlISD8c0g+G9AMhfX9I3xvS94T03SF9V0jfEdK3hxq3hhq3hBo3hxo3hRo3hLT1IW1dSFsT0laHtJUhbUVIXR5Sl4XUJSF1cUhdFFIXhNT5IXVeSJ0bUmeHGmaFGmaEGqaHGqaGGqaElMkhZVJImRhSxoeUcSFlTEgZHVJGZhweUoaF6oeE6geH6geF6geE6vuH5H4huW9I7qnYd33s8x11it3BwcHhJ0G/1ucfuNb0B8t+S/avzrD//VxLn56K/c9fnlT/rez/IOz/c+buvQp2p9gdfi56Kva2YNAOBq1gW0uwrTnYZgTbmoJtjcE2LWirQbshaNcHbTloS0G7NmiLQVvIyAdbq4KtbLC1MtjKBFvpoFURtKigVR60yoIWEWzBgy3+YAsWbEGDLb5gS0mwBQ62QMGWomALGGwBgqY3aHqCpjtoFgTN/GBzbrA5J9icHWzOCja/Cza/CTa/Dja/DDa/CDY/DzY/DRpPgsbjoPEoaDwIGveDTXeDTXeCTbeDTbeCTTeCTdeDTdeCTVeCTZeDTReDerfng/q5oH42qJ8O6qeCjSeCjceDjceCjUeDjYeD2qGgdjCo7Q9q+4Lanoy7gtrOoLYjqG0LqluD6uaguimobgyqG4IN64INa4MNa4INq4INK4MNyzMuDTYsCTYsDjYsDCoLgsq8jHOCyuxg/cxg/Yxg/fRg/dRg/ZRg/eRg/aRg/YRg/fhg/bhg/ZigPDooj8w4PCgPC9YNCdYNDtYNCtYNCNb1D0r9glLfoNRTsa/72Oc76hS7g4ODw0/CX3/9dGLFvP4pu6+bn17/+tc/Wvcp2e9Y/xrsn2r9jv33UzE9FPvft98/8Vu+/0GxZ+5+p1fB3mOxf5jat1d+Nfuob6/8ararX6/8cvZeV99e+eXsgGjfXvnlbL+uh73yy9k+8Q+98qvZpx965Vez8z70yi9nHy/80Cu/+nyXf+iVX83OftgrP/4RPRV7q21btm3arc12q2G36nZro92qftJSbKvetmTbkmyr1rZqbEuwrWrb4m2rym5h7ZZKuyVgt9B2S4VtUrZZbptltknYJm6bftvEbNOXscQ2YbsZspuL7GbQbgbsZq9teGzDbRsFtpFvG3m2kWMb2bbxLuMbu+m13fTKbnphNz23m57aTU9s/bGtP7L1h7Z+39bv2Y137MbbduMtu/Gm3XjDbrxmN161Gy/bjZfsxou2dsHWztvaWVs7Y2unbO2krZ6w1WO2etRWj9jqYVs9aKsHbHW/re611T12w267YZfdsMNu2G43bLOVLbay2VY2ZlxvK+tsZa2trLaVVbaywlaW2/XL7Pqldv0Su36RXb/Qlufb8jxbnmvLc2x5ti3PtOUZtjzNlqfa8hS7brJdN9Gum2DXjbfrxtp1Y2xptC2NtKURtjTclobZtUPs2sF27SC7doBd29+u7WfX9rVreyr2RR/7fEedYndwcHD4ecgcYr9ufqr2no+y/0NUZ+rb/nzW/FN4Z86h/0GK/8W+2+dvT4JsufP1Ofavjrt/unufXgX7v1XsH+d+q78v9o9ov2/098X+8V/6f6O/L/biX/t9o78v9oF/7feN/r7Y+//q+0b/oNj/58dv9ffFXvrxW/19sa/6+K3+rtixtR+/0d8X+8etH7/R3xf7x6W+b7S3xd5iWaZlNVstTVaLbrVoVotqtTRYLYrVUm+11FktktUiWi01lilYJm+ZVZbJWSZrNVdazQGrmbaaKau53GomreYyq5mwmnGr2W8ZmGX4LAOxjBLLgC0DspqKrCbQagKsJq/V5Lb0bgssPd/S8yw9x9KzLT3L0t9a+htLf201vrIaX1iNz63GZ1bjE6vxsaU9srSHlnbf0u5Z2l1Lu21ptyztpqXdsLTrlnrVUq9Y6iVLvWipF6yG81bDOavhjNVw2mo4ZTWcsBqOWw1HMx62Gg5ZykFL2W8p+yxlj6Xstup3WfU7rfodVv02q36rVb/Fqt9k1W+06jdY9estea0lr7Hk1Za80pJXWPJyq26ZVbfEqlts1S2y6hZYdfOtunlW3Vyrbo5VN8uSZlrSdEuaZklTLWmyVdvtRKt2glU73qoda9WOscRRljjSEkdY4nBLHGaJQyxxsCUOtMQBltjfquln1fS1anoq9mkf+3xHnWJ3cHBw+FnQr2Z213/9619/zey0X9V7WPhVVP/zXz+dSv/tITB31/e500OKf/790syyu3f/YY89c8e/PWnm0+u7rZ+D/f/fs2KcYneK/acq9mbTNEyzyWxuNJs1s1k1mxWzud5sls3mOrNZMptFs7nGbK42Dd40qkyDzciYTQGziTabKLOp3GwizaYys6nUbMLNJr/ZhJq6z9QRU4czQqZeZDaCZiNgNnrNRo/Z6DIbC8zGfLMxz2zMMRuzTS3L1N6a2htTe21qr0z1pak+N9VnpvrUVB+b6iNTfWiqD0z1nqneNdU7ZsMts+Gm2XDDbLhuNlwzlSumctlULpnKBVM5byrnTOWsqZw2lVOmctJUjpv1x8z6o2b9EbP+sFl/0JQPmPJ+U95ryntMeVfGHaa83ZS3mfIWs26zWbfJrNuQcZ0prTWlNaa0ypRWmtJyU1pmSktNaYkpLTalhaa0wKydb9bOzTjbrJ1lijNNcbopTjPFKaY42ayZZNZMNGsmmDXjzJqxZs0Ys2aUWTPSrBlh1gw3a4aZwhBTGGwKA01hgCn0N6v7mdV9zeqein30xz7fUafYHRwcHH4WMsdiPp+E+eLlH5F5hMtf//mLP33m124yz3b5+zNevnrYy28Lf7/sb5cyr/+Mrv9tz76Hx7n/I06xf8Yp9p+82JsMQzeMRqNJNZoajCbFaJKNpjqjSTKaao0m0WgSjKZqo4k3dM7QWUOvNHTG0ANGY4XRSBmN5UZjmdFIGI2lRiNuNPqNRtRo9BkaYmiwoRUbGmRoRYYGGipgqF5D9Riqy1ALDDXfUPMMNcdQsw01y2h4azS8MRpeGw2vjIaXhvLcUJ4ZylNDeWwojwzloaE8MJT7hnLXUO4Yym2j/qZRf8Oov27UXzPqrxryZUO+ZMgXDfm8IZ8z5LOGfMaQTxvySUM+YcjHjLqjRt0Ro+6wUXfIqDtgSPsNaZ8h7TGk3Ya0y5B2GtIOQ9pmSFsNaYtRu8mo3WjUbjBq1xu16wxxjSGuNsRVhrjCEJcb4jJDXGqISwxxkSEuNMQFRs08o2auUTPHqJlt1MwyhBmGMN0QphnCFEOYbAiTDGGiIYw3hHGGMNYQRhvVo4zqkUb1CKN6uFE91OCHGPxggx9o8AMMvr/B9zP4vgbfU7H3/9jnO+oUu4ODg4PD/zYyT3Zf7/+v/8tI/wqn2D/jFPtPXuy6rmu6rup6g67X67qs63W6XvvJxhq9UdAbq/XGKr2R0zVW1xhdC+garWsVukbpGqlrZbpG6Bquq91iuorqqk9XS/QGWG8o1huKMhbqDYDe4NUb3HqDS28o0BvydKXbHF3J1pUsXXmn17/R61/r9a/0+pd6/Qu9/ple/1Svf6LXP9LrH+r1D3T5vi7f0+U7unxbl2/pdTf0uut63TW97qped0Wvu6TXXdTrLuh15/S6s7p0RpdO69IpXTqhS8d16Zhee0SvPazXHtJrD+q1B/TafXrtXr12j167S6/dqYs7dHG7Lm7TxS26uFmv2aTXbNBr1us16/SatXrNGr1mlV6zUq9Zodcs02uW6sISXVisC4t0YaEuzNer5+nVc/XqOXr1bL16pl49Q6+erldP1aun6NWTdX6Szk/U+fE6P07nx+r8aL1qlF41Uq8aoVcN16uG6lVD9KrBetVAvWqAXtVf5/rpXF+d66nY+3wc8h11it3BwcHB4X8bma32f929/0acYv+MU+w/ebFrmqZqmqJp9Zoma5qkabWaJmpajaYKmsprapWmcppaqamMpgY0tSJjudZAag1lWgOhNeBag19TME1BNcWnKSWaAmtKsaYUaQqoKYWaAmiKV6t3a/Uurb5Aq8/X6nM1udtsTc7S5Hea/EaTX2vyK01+kfGZVvdUq3ui1T3S6h5qdQ+0unua1O1dTbqtSbc06aYmXdeka5p0VZOuaNJlrfaiVntBqz2v1Z7Vas9o4mlNPKWJJzXxhCYe08SjmnhEEw9lPKCJ+7WafVrNHq1mt1azS6vZoQndbtOErZqwRRM2a8JGTdigCes1YZ0mrNWqV2vVq7TqlVr1cq16mVa9VOOXaPxijV+o8Qs0fr7Gz9X4ORlnafxMrWqGVjVNq5qqVU3RqiZpXLcTNG68xo3TuDEaN1rjRmnciIzDNW6oxg7R2MEaO1BjB2hsf62yn1bZV6vsudgnfEedYndwcHBw+MFxiv0zTrH/5MXeoKqKqspqQ53aIKkNotpQozYIakO1qvCqUqUqrKpUqgqjKrSqVKgKpSrlqkKq9WVqfalaj6v1frUeVeVuEVUuUWVYlSFVLlJlUJULVRlQZa8qu9U6l1pXoNblqXW5al2OKmWrUpYqvVOlN6r0WpVeqdILVXquSs9U6ala+0StfazWPlRrH6i199Xau6rY7W1VvKWKN1XxhipeU8WrqnhFFS+r4iW15oJac16tOafWnFVrTqtCtydV4YQqHFeFo6pwRBUOq8LBjAdUYZ9avVet3qNW71Krd6rVO9Tq7Wr1NrV6i1q9Wa3epPIbVX69yq9T+bUqv0atWq1WrVSrVqhVy9WqZWrVkoyL1KqFatUCtWqeys1VuTkqN1vlZqncTJWdrrLTVHaqyk5W2UkqO1FlJ6jseJUdp7JjVHa0WjlKrRyRcZhaOVRlhqjMIJUZqDIDVKa/yvRTmb4q03Oxz/6OOsXu4ODg4PCD4xT7Z5xi/8mLvV5RZEWRlPpapV5U6muU+mqlnlfqqxSZU2RWkSsVOaDItCJXKHK5IpOKXKbIhFJXqtThSh2m1KFKnU+REEUqUSRYkSBFKlIkUJEARfJmdCuSS6ktUGrzlNpcpTZHqc1WarOU2ndK7Rul9rVS+0oRXyjic0V8pohPFfGJUvNYqXmo1DxQau4rNfeUmjsZbyk1N5WaG0rNdUW4qghXFOGyIlxShItK9Xml+pxSfVapPqNUn8p4Qqk+rlQfU6qPKtWHFf6Qwh9U+AMKv1/h9ypVe5Sq3UrVLqVqh1K1XanaplRtVaq2KFWblaqNCrdB4dYr3NqMqxV2lcKuVNgVCrtMYZcq7BKFXaywixR2ocLOV9h5SuVcpXJ2xllK5QylcrpSOU2pnKJUTlYqJynMRIWZoDDjFWaswoxRmNFKYKQSGJFxmBIYqgSGKIFBSmCgEhigBPordD+F7qvQPRf70u+oU+wODg4ODj84TrF/xin2n7zY62RZkuVaua5GrhPkumq5jpfruIyVch0j1wXkOlquo2SpXJZIWSIylsq1frkWk2tRudYn15ZkLJZrIbm2SK4FZRGQRa8semTRLYsuWSyQa/Lkmly5JkeuyZJr3mV8I9e8lmteyTUvZeG5LDyThaey8EQWHsvVj+TqB3L1fbn6nlx9R66+nfGmXH1Drr4uV1+V+Ssyf1nmL8n8RZm/IPPnZP6szJ+R+dMyf1Ku6vaEXHVMrjoqVx2Rqw7J3EGZOyBz+2Vun8ztlbndMrdL5nbK3A6Z2yaz3W6R2c0yu0lmN8qV6+XKdXLlWrlyjVy5Wq5cJVeukCuXy5XL5MqlcuVimel2ocwskJn5MjNPDsyRA7PlwCw5MFMOzJAD0+XAVDkwRQ5MlgOTZHqiTE+Q6XEyPVamx8j0aJkeKdMjZHq4TA+T6aFyxRC5YpBcMVCuGCBX9JepfjLVV6Z6LvYN31Gn2B0cHBwcfnCcYv+MU+w/ebHXSpIoSTVSrSDV8lJtlVTLSbWsVFsp1TJSLS3VVki1lFRbLollkkhIYqkk4pLol2owqcYn1SBSTYlUA0s1xVINJNUUSTWFUg0gCV5J8EiCK2O+JORJQq4k5EhCliS8k4S3UvUbqfq1VP1Kqn4pVT+X+GcS/1TiH2d8JPEPJP6+xN+T+LsSf1vib0lVN6WqG1LVdanqmlR1ReIuS9wlibsocRck7rzEnZO4MxJ3WuJOSdxJiT0hsccl9qjEHpHYwxJ7SGIPSOx+id0nsXsldo9UuVuq3ClV7pAqt0uV2yRmq8RskZjNErNRYjZIzHqJWScxazKukgIrpcAKKbBcCiyVAkukwGKJXiTRCyV6gUTPk+i5Ej1HomdL9CyJninRM6SKaVLFVKliilQxWaqYmHG8VDFOqhgrVYyRKkZJ1EiJGiFRwyVqmEQNlcqHSOWDpPKBUvkAqby/VN5PKu8rlfdc7Hu+o06xOzg4ODj84DjF/hmn2H/yYq8RRUEUq8UaXqzhxBpWrKkUaxixJiDW0GJNhVhTLtaQYk2ZKBCigIuCPyMqCj5RQEShRBSKRQESq7sFxepCsRoQq70i7xZ5l8gXiHy+yOeJfK7I54h8lsi/E/m3Iv9GrHotVr0Sq16IVc/Fqmci91Tknojco4wPRO6+yN0Tubsid1vkboncTZG9IbLXRfaayF4V2csie0lkL4rsBZE9L7LnxMqzYuVpsfKUWHlSrDwhMsdF5pjIHBWZwyJzSGQOiswBkdmXcY/I7BYDu8TATjGwQwxsEwNbxcAWMbBZDGwSAxvFwHqRXifSa0V6jUivFulVYsVKsWK5WLFMrFgqViwRKxZlXChWzBcr5okVc0VqjkjNyjhTpKaL5dPE8qli+RSxfJJYPlEsnyCWjxfLx4nlY8Xy0WL5KJEcKZIjRHK4SA4TyaEiOVgkB4nkQJEcIJL9xLJu+4plPRf78e+oU+wODg4ODj84TrF/xin2n7zYBUHgBaFKEDhBYAWBEYSAINCCUCFUU0J1uVBNCtWEUF0q8LjA+wUeE3hU4H0Cjwg8LPDFAg8JfJFQBQpVhUIVIFR5hCq3UOUSqgqEqryMuUJVtsBlCdw7gXsrcK8F7pXAdvtCYJ8L7DOBfSqwTwT2kcA+FNgHAntfqLwnVN4VKu8IlbeEyptC5Q2BuS4w1wTmqsBcEZhLAnNRYC4IzHmBOScwZ4XAGSFwSgicFAInhMBxIXBMCBwVAkeEwCEhcFAIHBDo/QK9T6D3CvQegd4lVOwUKnYIFduFim1CxZaMm4WKjULFBqFivUCtE6g1ArU640qBWiFQywVqmUAtEajFArVIKF8olC8QyucL5fOE8jkCOVsgZwnkTIGcIZDTBXKaQE4VyMkCOUkgJwplE4Sy8ULZOKFsrFA2WigbJRAjBWKEQAwXiGECMVQgBgvEIIEYKBADBKKfUNptX6G052K/9B11it3BwcHB4QfHKfbPOMX+kxc7z/NVPM/yfCXPMzwf4PkKnqc+WUXyVWV8FcFXlfJVOF+F8VUoX+XjqxC+qoTnYJ4r5jmI50CeK+RZgGe9POvhWTfPung2n2fzeDaXZ3N4Nptns/jKd3zlW77yNV/5iq98yTMveOY5zzzjmac884RnHvHMQ555wDP3eeYeH7jLB+7wgVt84CYfuMEHrvOBa3zgKh+4wgcu84GLPH2Bp8/z9DmePsvTZ/iK03zFSb7iBF9xnK84xlcc5SuO8BWH+YpDfMUBvmI/T+3jqb08tYendvPULp7ayVPbeWobT23lqS18+Wa+fBNfvpEvX8+Xr+PJtTy5hidX8+QqnlzJkyt4chlPLuXJJTy5mCcX8WUL+bIFfNk8vmwuXzaHL5vNl83iy2byZTP4suk8MZUnpvDEZJ6YxBMT+dIJfOl4vnQcXzqGLx3Nl47iS0fypSP40uF86TC+dAiPD+bxQTw+kMcH8Hi/jH15vOdiv/sddYrdwcHBweEHxyn2zzjF/pMXO8dxLMcxHBfgOJrjKjiO4jjyk2wZxxIci3Osn2MxjkU51sexJRlhrhLiKou4SpCrLOQqAY7xcoyHY9wcU8Ax+RyTxzG5HJPDMdkck8Ux77jAGy7wmgu84gIvucALLvCcCzzjAk+5wGMu8IijH3L0A46+z9H3OPouV3GHq7jFVdzkKm5wFde5imtcxVWu4gpXcZmruMRVXOCo8xx1jqPOctQZjjrNUac46iRHHeeoYxx1lCs/wpUf5soPceUHufIDXPk+jtzLkXs4cjdH7uLInRy5gyO3c+RWjtzCkZu5sk1c2UaubANXtp4rW8eVreHKVnNlq7iylVzZCo5YzhHLOGIpRyzmiEUcsZAjFnDEfI6YxxFzOWIOVzqLK52ZcQZXOo3Dp3L4FA6fzOGTOHxCxvEcPpbDx3D4aA4fxflHcv7hGYdx/iGcfzDnH8T5B3L+AZy/H4d125fDei72599Rp9gdHBwcHH5wnGL/jFPsP3mxV7Isw7IBtrKCraTYynK2kmQry9hKgmVKWQZnGT/LoCzjYxmEZUpYBmaZYpaB2EARGwDZAMAGvGzAwwbcbMDFBgrYQD4byGPpHJbOZumsjG9Z+g1b8ZqteMVWvGQrnrMVzzI+YSsesxWP2IqHLPWApe6z1N2Md1jqFkvdZKkbLHWdpa6x1FW2/Apbfpktv8SWX2DLz7PkOZY8y5JnWPI0S55iyZMseYIlj7HkUZY8wpYdZssOsWUH2bIDbNl+tmwfW7aHLdudcSdbtoMltrPENpbYyhKbWWJTxo0ssZ4l1rHEWrZ0DVu6mi1dmXEFiy9n8aUsvoTFF7P4IhZfyOILWHw+i89j8TksPpv1z2L9M1n/DNY/nfVPY/1TWf8U1j+J9U9k/RNYbDyLjWOxsSw2hsVGs9goFh3BosMzDmXRISw6mEUHsehAFh3Aov1YX7d9WV/PxZ73HXWK3cHBwcHhB+ffKPZe+dXso7698qvZrn698svZ7gjvlV/Odkd4r/xytjvCe+WXs5+KvTd+Ndtd7L3xq9nuYu+NX852R3iv/OrzXf6hV341O/thr/z4R/RU7AGGoRmmgglQTIBkAmVMgGACpUwAZwJ+JoAxAZQJ+JgAwtAwQxczNMTQRQwNMhWFTAXAVHiZCg9T4cpYwFTkMxW5TEUOQ2UzVBZDvWOotwz1hqFeM9QrhnrBUM8Z6hlDPWXKnzDlj5nyR0z5Q6b8AUPeZ8i7DHkn4y2GvMmQNxjyOkNeY8irDHmZKev2ElN2kSk7z5SdY8rOMmVnmLLTTNkppuwkQ5xgiOMMcZQhjjDE4YwHGeIAQ+xniH0MsZcp3cOU7sq4kyndzuDbGHwrg29h8M0MvonBNzL4BgZfz+DrGHwN41/N+Fcx/pWMfwXjX874lzH+pYx/CeNfxPgXMv4FDNbtPAaby2BzGGw2g85i0JkMOoNBpzPoNAadyqCTGXQSg05k0AmMbzzjG8f4xjK+MYxvNOMbyfhGML7hjG8Y4xvK+IYwyGAGGcQgAxmkP4P0y9iXQXoudug76hS7g4ODg8MPTk/F7uDw75Keir2CpimaLqcrSLqijK4opStwusKfEaUrfHQFQleU0BUwTRXTFERTYMZCmgJoykNTbppy0VQBXZ5Pl+fR5bl0eQ5dnk2TWTT5libfZHxNky9p8gVNPqfJZzT5lCaf0GWP6bJHdNlDuuwBXXaPLrtLl92hy27TZbfosps0cYMmrtPENZq4ShNXaOISXdrtRbr0PF16ji49S5eeoUtP06Wn6NKTdOkJGj9O48do/CiNH6bxQxkP0vh+Gt9H43tpfA/t3037d9H+nbR/B+3fTvu30f4ttH8z7d9E+zfS2AYaW09j62hsLY2todHVNLqSRldkXE6jS2l0CY0uptFFNLqQRhfQvvm0bx7tm0v75tC+2bRvJu2bkXEa7ZtKI1NoZDKNTKKRiTQygUbG08g4GhlLI2NoZBSNjKRLRtAlw+mSYXTJULpkCA0PpuFBNDyQhvvTcL+MfWm452InvqNOsTs4ODg4/OA4xe7wU9FTsZdTFElRZVQ5QZWXUuU4Ve6nytGMPqococphqryYKocosogiQYospEiAIr0U6aFIN0W6KDKfIvOosm5zqbIcqiyLKntHlb2lyt5QZa+psldU2Uuq7AVFPKeIZxTxlCIeU8QjqrTbh1Tpfar0HlV6lyq9Q5XepkpvUaU3qdIbFH6dwq9R+FUKv0Lhlyj8YsYLFH6Ows9S+BnKf5ryn6L8Jyn/Ccp/nPIfo/xHKf8Ryn+I8h+ksG4PUNh+CttLYXsobDeF7qLQnRS6g0K3U+g2Ct1KoVsodDOFbqTQDZSv2/WUby3lW0P5VlO+VZRvJeVbQfmWU75lFLKUQpZQyGIKWUQhCyhkfsZ5FDKHQmZTyCyqZCZVMoMqmU6VTKNKplLwFAqeTMGTKHgCBY/POI6Cx1DwaAoeRcEjqeIRVPFwqngYVTyUKh5CFQ+migdRxQOp4v5UcT8K6rYv9Qe73x//Vuzcd9QpdgcHBweHHxyn2B1+KnoqdpIkCZIsJUmcJP0kiZEkSpI+kkTIshKyDCbLiskyiCwDSaKQJACS8GZ0k4SLJApIIp8k8kgilyzNIUuzydIssvQdWfqWLH1Dlr4mS19mfEGWPifxpyT+hMQfk/gjEn9I4g9I/D6J3yPxuyR+h/TfJv23SP9N0n+D9F8nsWskdpXErpDYJRK7SGIXMp4jsbMkdobETpPoKRI9SaInSPQ4iR4j0aMkeoRED5PoIRI9QPq63U/69pG+vaRvN+nbRfp2kr4dpG876dtG+raSyBYS2Uwim0hkI4lsIJH1JLKORNaSyBoSWU2WrCRLVpAlyzMuI+ElJLyYhBeR8EISXkDC80l4HgnPJeE5JDybhGeRxTPJ4ukZp5HFU8niKWTxJLJ4Ilk8gSweT0LdjiWhMSQ0moRGkdBIEhpBQsNJaBgJDSWhIWTRYLJoEFk0gCzqTxb1I8Fu+5Jgz8Ve/x11it3BwcHB4QfHKXaHn4qeip0giFKC8BMERhAoQfgIAiGIEoKAidJiohQiSouIUpAoLSRKAaLUS5S6M7oIvIDA8wk8l8BzCDyb8HebRfjfEf43hP814X9F+F8S/heE/znhf0b4nxLYEwJ7TGCPCOwhgT0gsPsEdo/A7hLYHQK7TaC3CPQGgV7PeI1ArxLoZQK9RKAXCfQCgZ4nfOcI31nCd4bwnSZ8pwjfScJ3gvAdJ3zHCN9RAjlCIIcJ5BCBHCSQA0TJfqJkH1GylyjZQ5TsJkp2EiU7iJLtGbcRJVsIeDMBbyLgjQS8gYDXE/A6Al5LwGsIeDUBryKKVxLFK4ji5UTxMqJ4KVG8hCheTBQvIooXEsXzieJ5BNTtXAKaQ0CzCGgmAc0goOkZpxLQFKJoMlE0iSiaSBRNIIrGE+A4AhxLgGMIcDQBjiLAkQQ4ggCHE+AwAhxKgEOIwsFE4SCicABR2J8o7JexL1HYc7G3fEedYndwcHBw+MHp8TdPL57rlV/N8ud65VezsXO98stZvutcr/xy9lTXuV751Wz8Q6/8ajYm9MovZ09Xf+iVX86eu/KhV345W3PtQ6/86vO9/qFXfjV7W+yVH/+Inoodx3E/jmM4juI4guMlOA7jePEn/UW4H8T9hbgfwP1e3O/B/W7c78L9Bbg/H8fycCwXx3JwLBvHsnDsHY69xbE3OPYax17h6EscfYGjz3H0GY4+xdEnOPoYRx/h6EMcvY+j93Bft3dx3x3cdxv33cSRGzhyHUeuZbyKI5dx5BKOXMSRCzhyHkfO4SVn8ZIzeMlpvOQUXnISLzmBlxzHS47hJUfxkiM4fBiHD+HwQRw+gMP7cXgfDu/F4T04vBuHd+HwTrx4B168LeNWvHgLXrwZL96EF2/Ai9fjxetwqNu1OLQGh1bh0Eq8aAVetBwvWpZxCV60GC9ahBctxIsW4EXz8aJ5ODgXB+fg4GwcnIWDM3FwBg5Ox8FpODgVB6fghZPxwkl44US8cAJeOB4vHIcXjsULx+CFo/HCUXjhSBwYjgPDMg7FgSE4MBgHBuLAABzojwP9cG+3fXFvz8Xe+R11it3BwcHB4Qfn3yj2j+9efaO/L/aP//HVN/r7Yv/4P15+o78v9v/4L6++0d8X+5NfX32jvy/2J//z4zf6+2J/8j/+r2/098X+7P/8+I3+vthf5X78Rn9f7P8p/+M3+vti/+j6+I3+vtg/Fv7nb7S3xY5hGIphPgxDMKwEw2AMgzCs6JMoiKGFGApgqBdD3RjqwtACDM3PmIf5cjFfNubLwnzvMN/bjG8w32vM9xLzvcCQ5xjyDEOeZnyMIY8w5CGGPMCQ+xhyD0PuYiV3sJLbWMktrOQmVnIDK7mOlVzDSq5iJVewkssYfAmDL2LwBQw+j8HnMPgsBp/B4NMYfAqDT2LwCaz4OFZ8DCs+ihUfwYoPY9AhDDqIQQcwaD8G7cOgvRi0B4N2Y9AuDNqJQTuwou1Y0TasaCtWtAUr2owVbcKKNmJFG7Ci9VjROgxci4FrMHA1Bq7CwJUYuAIDl2PgMgxcioFLsMLFWOEirHAhVrgAK5yHFc7NOAcrnI0VzsIKZ2LAdAyYlnEqBkzBgMkYMAkDJmDAeAwYh3m7HYt5x2De0Zh3JOYdgXmHY95hGYdi3iGYZxDmGYh5BmCe/pinH+buti/m7rnYU99Rp9gdHBwcHH5wnGL/jFPsP3mx+1AUQdES1AejvmLUB6G+ItQHor5C1AegPi/q86A+N+pzoUgBiuSjSB6K5KJIDlqSjZZkoSXv0JK3aMkbtOQ1WvIKLXmJlrxAS56j8DMUforCT1D4MQo/QuGHKPwAhe+j8D0UvovCd9Di22jxLbT4Jlp8Ay2+jhZfQ4uvosVX0OLLaPElFLqIQhdQ6DwKnUOhsyh0BoVOo9ApFDqJQidQ6DhadAwtOooWHUGLDqNFh9Cig2jRAbRoP1q0Dy3ai4J7UHA3Cu5CwZ0ouAMFt6PgNhTcioJbUHAzCm5CCzeihRvQwvVo4Tq0cC1auAYtXI0WrkILV6KFK1BgOQosQ4GlKLAEBRaj3kWodyHqXYB656Peeah3Luqdg3pno95ZqHcm6p2BeqajnmkZp6CeyahnEuqZiHomoJ7xqGcc6u52DOoejbpHoe6RqHsE6h6OuodlHIq6B6OuQahrIOoagLr6o65+Gfuirj8s9gkTJvRZv+w72n3Df/gr/h0Uu4ODg4PDvyecYv+MU+w/ebGXIAiMIMVICYSUFCElIFJSiJQASIkXKfEgJW6kxIWUFCAl+Qich8C5CJyDwNkInIXA7xD4LQK/QeDXCPwKKe72JVL8Ail+hhQ/RYqfIMWPkeJHGR8ixQ8Q6D4C3UOguwh0G4FuZbyJQDcQ6DoCXUOKriJFV5Ciy0jRJaToIgJeQMDzCHgOAc8i4BkEPI2ApxDwJAKeQMDjCHgMKTyKFB5BCg8jhYeQwoNI4QGkcD9SuA8p3IsU7kGA3QiwCwF2IsAOBNiOANsQYCsCbMm4GQE2It4NiHc94l2HeNci3jUZVyPeVYh3JeJdgXiWIZ6liGdJxsWIZxHiWYh4FiCe+YhnHuKZi7jnIO7ZiHsW4p6JuGcg7umIexrinoq4pyDuyYhrEuKaiLgmIK7xiGsc4hqLuMYgrtGIaxTiGom4RiAFw5GCYUjBUKRgCFIwGCkYhBQMRAoGIAX9kYJ+SH63fZH8nor9P3z863f0D4v9D78/Pw5OsTs4ODj8VDjF/hmn2H/yYi+GYQiGi+BiEC4uhIsBuNgLF3syuuFiF1ycDxfnwcW5MJQDQ9kwlJXxHQy9haE3MPQahl7B0Eu46AVc9BwuegYXPYWLnsBFj+GiR3DRQ7joAVx0Hy66B4N3YfAODN6GwVsweDPjDRi8BoNXYfAKXHgZLrwEF17MeAEuPA8XnoMLz8KFZ+DC03DhKRg4CQMnYOA4DByDgaMwcAQGDsPAIRg4CAMHYO9+2LsP9u6FvXtg7+6Mu2DvTti7HfZug71bYc8W2LM54ybYsxH2bIA962HPOtizFvasgd2rYfcq2L0Sdq+A3cth9zLYvRR2L4Hdi2H3Iti1EHYtgF3zYdc82DUXds3JOBt2zYRdM2DXdLhgGlwwNeMUuGAynD8Jzp8I50+A88fD+ePg/LFw/hg4fzScPwrOHwnnj4DzhsN5w+C8oXDeEDhvMJw3CM4bCOcNgPP6w3n94Nxu+8K5PRf7v3xHnWJ3cHBwcPjBcYr9M06x/+TFXgRBIAQVQkUAVOSFijxQkRsqcmUsgIryoaI8qCgXKsqBwGwIzILAdxD4FgLfQOBrCHwFgS8h8AUEPocKu30GFT6FCh9DhY+gwodQ4QOo8H7Ge1DhXQi4AwG3IeAWBNyEgBsQcB0CrkHAVQi4AgGXIe8lyHsR8l7IeB7ynoO8ZyHvGch7GvKehLwnIE+3xyHPMchzFPIcgTyHIc8hyHMQ8hyAPPsh9z7IvRdy74HcuyH3row7IfcOyL0dcm+D3Fsh1xbItRlybYJcGyHXBsi1HnKtg1xrIdcayLUaKlgFFayEClZABcuhgmVQwVKoYAlUsDjjIih/IZS/AMqfD+XPg/LnQvlzoPzZUP4sKH8mlD8Dyp8O5U2D8qZCeVOgvMlQ3iQobyKUNwHKGw/ljYPyxkK53Y6BckdDuaOg3JFQ7ggodziUOwzKHQrlDoFyB0M5g6CcgVDOACinP5TTL2NfKKfnYv9/vqNOsTs4ODg4/OA4xf4Zp9h/8mIHQbAQBAEQ9IKgBwTdIOgCwQIQzAcL88DCXLAwByzMBguzwMJ3YOFbsPBNxtcg8AoEXoLACxB4DgLPQOApCDwBgccg8AgEHoLeB6D3Pui9B3rvgt47oPc26L0Fem+C3hug9zrovQZ6ur0Keq6Ansug5xLouQh6LoCe86DnHOg5C7rPgO7ToPsU6D4Juk+A7uMZj4Huo6D7COg+DLoOga6DoOsA6NoPuvaBrr2gaw/o2g26doGunWBBtzvAgu1gwTawYCtYsAUs2AwWbAILNoIFG8CC9WD+OjB/LZi/BsxfDeavyrgSzF8B5i8H85eBeUvBvCVg3mIwbxGYtxDMWwDmzQfz5oF5c8G8OWDebDC321lg7kwwdwaYOx3MnQbmTgVzp4C5k8HcSWDORDBnApgzHswZB+aMzTgGzBkN5owCc0aCOSPA7OFg9jAweyiYPQTMHgxmDwKzB4LZA8Ds/mB2PzCr275gVs/n2Nd9R51id3BwcHD4wXGK/TNOsf/kxQ4AgBcAPADgBgAXABQAQD4A5AFALuDNAbzZgDcL8L4DvG8B7xvA+xrwvsr4EvC8ADzPAc8zwPMU8DwBPI8Bz6OMDwHPA8B9H3DfA9x3AfcdwH0bcN8C3DcB9w3AfR1wXwPcVwFXt1cA12XAdQlwXQRcFwDXecB1DnCdBVxngILTQMEpoOAkUHACKDgOFBzLeBQoOAIUHAYKDgH5B4H8A0D+fiB/H5C/F8jfA+TvBvJ3Afk7gfwdQF6324G8bUDeViBvC5C3GcjbBORtBPI2AHnrP5m7DshdC+SuAXJXA7mrgNyVQO4KIHc5kLsMyF0K5CwBchYDOYsyLgRyFgA584GceUDOXCBnDpAzG8ieBWTPBLJnANnTgexpQPZUIHtKxslA9iQgayKQNQHIGg9kjQOyxgJZY4Cs0UDWKCBrJJA1AsgaDrwbBrwbmnEI8G4w8G4Q8G4g8G4A8K4/8K4f8LYv8LYP8LbHZ8X85eN39A+fFfOH358fB6fYHRwcHH4qnGL/jFPsP3mxezwet8fj8ngKPJ58jyfP48n1eHI+6c72uLM87nce91uP+43H/drjfuVxv/S4X3jczz2uZx7XU4/ricf12ON6lPGhx/XA47rvcd3zFNz1FNzxFNzOeMtTcNNTcMNTcN1TcM1TcNVTcMWTf9mTf8mTf9GT//+2d6exjeYHnt+p+77v+75vqXSVSqUqlUr3TVEURZGiKIqiSFEURbFYNBUHfrPIIq8CJHFmvMjMuySLIAgWsBHAzu4sEBgJZuGggyB54dlZJC8mHSA7tjvZHttjj/LwJ/1VD4t8VKpudond/H3xwTTr4VEssVv6FeeRvHX1Vn31dvPq7cbV23VYu/KtXvlWrnzLV76lK9/ilW8B5q98c1e+2Svf6yvfzJXv1ZVv+sr38sr34urN1NWb51dvJq/ePIOJqzdPr96MX70Zu3ozevVm5Mo7fOV9AkNX3sEr78CVt//K23fl7b3y9lxddl9ddl1ddl5ddlxdtkPb1WXr1WXL1WXzlafpytN45Wm48tRfeequPLVQc+WpvvJUXXkqry4qri7Kry7Kri5Kry5Kri6KoejqovDqouDKnX/lzrty5165c67c2VfurCt35pU7A9Kv3GlX56lX5ylX58lX50lX54lX5wlX56qrc8XF/v9cRxEXO2OMsRiPi/0mLvY4X+zfCwT8gcDbwPd8ge+9CXzPG/jeZeB7HrgIfM8d+N554HuuwPfOAn5nwH8a8DvAHvCfBPy2gP844LcG/EeBt5bA20MwB94eBN6aAm/3A2+NgbeGwNu9wFt9wLcb8OkCvp2ATxvwbYMm4NsK+NQB32bgzUbgzXrgzRqsBt6sBN4sB94sBd4sBt4sBN7MB7ySuYB3NuB9HfDOBLyvAt7pgPdlwPsi4J0KXD4PXE7Cs8DlRODyaeByPHA5FrgcDVyOBC6HA54nAc8QDAY8AwFPf8DTF/D0Bjw9AU934ELSFbjoDFx0BC7aAxdtgYvWwEULNAfcTQF3Y8DdEHDXB9x1AXdtwF0TcFcH3FUBd2XAXRE4l5QHzssC56WB85LAeXHgvChwXhg4Lwic5wdckryAKzfgygm4sgOurIArM+DKgPSAKy1wlho4SwmcJQfOkgJniYGzhMCZKnCmuNj/j+so4mJnjDEW43Gx38TFHueL/a3f7/P73/jfev1vL/1vPf63F+D2vz33v3X535753zr9b0/9PoffZ4cTv8/m9x37fVa/78jvs/h9h/43ErP/zYH/jcn/Zt//xuh/Y/C/2QO9/82u36vze3f8Xq3fu+33amDL71X7vZt+74b/ct1/uea/XIUV/+Wy/3LJf7nov1zwX877L+f8nll47ffM+D2v/J5pv+el3/PC75nye577LyST/otn/osJ/8VT/8W4/2LMfzHqvxjxXwzDE//FkP9i0H8x4L/o97v7/O5ev7vH7+6GLr+70+/u8Lvb/e42/3mr/7zFf94MTf7zRv95g/+83n9e5z+v9Z/X+F2Sar+ryu+q9Lsq/K5yv6sMSv2uEv9Zsf+syH9W6D8r8J/lQ57/LNd/luM/y/afZfmdmX5nBqT7nWl+Z6rfmeJ3JvudSX5nov80wX+q8p8qLvb/7TqKuNgZY4zFeFzsN3Gxx/lif+PzeX2+S98bicf35sL3xu17c+574/K9OfO9ccKp743D57X7vCc+r83nPfZ5rXDk81p83kOf1+y7PPBdmnyX+2D0XRp8l3u+S73vctd3qYMd36XWd7ntu9T4Lrd8HrXPswkbPs+6z7Pm86z6PCs+z7LPs+S7kCz6LhZ8F/O+iznfxazv4rXvYgZe+S6mfe6XPvcLn3vK537uc0/CM597wud+6nOP+87HfOejMOI7H/adP/GdD/nOB33nA77z/iBXn8/V63P1+FzdPleXz9Xpc3VAu8/V5jtr9Z21+M6afWdNvrNGaPCd1fvO6nxntb6zGp+z2uesgkqfs8LnLPc5y3zOUp+zxOcshiKfs9DnLPA5832neb7TXMjxnWb7TrN8p5m+0wzfabrvNC3IkepzpPgcyT5Hks+R6HMk+Bwqn0Nxsf/ldRRxsTPGGIvxuNhv4mKP88V+6fVKPN7LC++l23t57r10eS/PwOm9PPVeOryXdu/liffS5r089l5a4cjrsXg9h16P2es58HpMsO/1GL0eg9ez573Qey92vRc62PFeaL0X294Ljfdiy3uhDnJvet0bXve6173mda963Suw7HUved2L3vMF7/k8zHnPZ73nr73nM97zV97zaXjpdb3wuqa8rude1yQ887omvK6nXte41zXmPRuFEe/ZsPfsifdsyHs26D0bgH7vWZ/3rNd71uM96/aedXnPOr1OSYfX2e51tnmdrV5ni9fZ7HU2QaP3tMF7Wu89rfOe1npPa7yn1VDlPa30nlZ4T8u9jjKvoxRKvI5ir6PI6yj0Ogog32vP89pzvfYcrz3ba8+CTK89w2tP99rTvPZU74kkxXuS7D1J8p4kek8SvCcq74niYv+L6yjiYmeMMRbjcbHfxMUe54vd4/FceDxuj+fc43F5PGcej9PjOQ26cHgu7J6LE8+FzXNx7LmwwpHnwuK5OPS4zR73AZg87n2P2+hxGzzuPdB7znc95zrP+Q5oPefbnnON53zLc672nG96zjc8Lsm6x7Xmca16XCse17LHteRxLcKCxzXvcc15XLMe12uY8Zy98pxNe85ewgvP2ZTn7LnnbNJz9izIOeFxPvU4xz3OMY9zFEY8zmGP84nHOeRxDnpOBzyn/dDnOe31nPZ4Trs9p12e084gR4fH0e5xtHkcrR5HCzR7HE0eR6PH0eCx10Odx17rsdd47NVQ5bFXeuwVHnu5x17msZdCicde7Dkp8pwUek4KPCf5npM8yPWc5HhOsj0nWZ6TTI8tA9I9tjSPLdVjS4Fkjy3JY0v0HCd4jlWeY8XF/uPrKOJiZ4wxFuNxsd/ExR7ni93tdp+73S63+8ztdrrdp263A+zu8xP3uc19fgxW9/mR+9ziPj8Es9t14HaZ3K59t8vodhlgz+3Su127bpfO7dpxu7Sw7XZp3K4t95kaNt1nG+6zdffZGqy6z1bcZ8tu55Lbueh2LsC82znnds66na/dzhm381XQ6bT79KX79IX7dAqeu08n3afP3KcTQY6nbse42zHmdoy6HSMw7HY8cTuG3I5Bt2PA7eh3O/qg1+3ocdu73fYu6HTbO9z2dmhz21vd9hb3SbP7pMl90ggN7pN690md+6TWfVLjPqkOslW5bZVuW4XbVg5lblup21bithUHHRe5jwvdxwXu43z3cR7kuo9z3MfZ7uMs93Gm+zjDfZwOae7jVLc1xW1NhiS3NdFtTXBbVcEf7qiw2P+r6yjiYmeMMRbj3bPYP0rIff9086OE3Pdnmx9Ffl9phH8U+X2lEf5RQu77z//FRwm578/+yUeR31ca4R9Ffl9phH8U+X2lEf5RQl5f/b/4KCH33f/PP8p1pJQWu8vlOnO5nC7XqcvlALvLdeJy2Vxnx2B1nR25ziyus0PXmdl1dgAm19m+68zoOjPAnsupdzl3XU4d7LicWpdz2+XUwJbLqXadbrpON1yn667TNVh1na64TpdhyeVYdDkWXI55mHM5Zl2O1y7HjMvxyuWYdjlewguXY8rleB5kn3TZn7nsEy77Uxh32cdc9lGXfcRlH3adSJ64ToZcJ4OukwHXST/0uU56XSc9QbZul63LZet02TpctnZoc9laXbYWl63ZddzkOm6EBtdxveu4DmpdxzWu42rXcRVUuo4rXMflruMyl7XUZS2BYpe1yGUtdFkLIN9lzXMd5UKO6yjbdZTlOsp0HWW4jtIhzXWU6rKkuCzJLksSJLosCS6LymVRXOx/dh1FXOyMMcZivNj/wsRYFFNa7E6n89TpdDiddjhxOm1O5zFI1x05nRan89DpNDtPD8DkPN13nhrB4Dzdc57qnae7TodE53TsOB1ap2Pb6dDAltOhdjo2g+wbTvu6077mtK867Suw7LQvOe2LTvsCzDvtc077bNDJa+fJjPPklfNk2nny0nnyAqacJ8+dJ5NBtmdO24TT9hTGnbYxp23UaRtx2oadtifOY8mQ83jQeTzgPO6HPudxr/O4B7qdx13O407ncYfzuN153Oa0Slqd1hantRmanNZGp7UB6p1Hdc6jWudRjfOo2nlUBZXOowrnUTmUOS2lTksJFDstRU5LodNS4LTkOy15kOu05Dgt2ZDltGQ6DzOch+mQ5jxMdR6mOA+TnYdJkOg0JzjNKqdZcbH/x9dRxMXOGGMsxov9L0yMRTGlxe5wOOwOxwnYHI5jh0M6dAQWh+PQ4TA7HAcOh8lhl+w77EYwOOx7DrveYd912HUO+47jRKJ1nGyDxnGy5ThRO042YcNxsu44WXOcrMKK42TZYVuCRYdtwWGbd9jmHLZZeO2wzTiOX8G04/il4/iF43gKnjuOJx3HzxzHEw6r5KnDOu6wjsGowzrisA47rE8c1iEYdFgHHNZ+6HMc9TqOeqDbcdTlOOp0HHU4jtqhzWFphRaHpdlhaXJYGh2WBoelHuoch7WOwxqodhxWOQ4rocJxWO44LHMcljoOS6DYcVgUZC50mAsc5nyHOc9hzoUchznbYc6CTMdBhuMgHdIcB6mOgxTHQbLjIAkSHaYEh0nlMCku9n98HUXfycX+OWOMse9Qsf+FibEoprTYT+x2W9DJsf3Eaj85sp9Y7CeHYLafHIDJfrJvtxntNoPdtgd6u20XdHbbjt2mhW27TWO3bdltavvxJmzYj9dhzX68aj9esR8v24+XgqyLdusCzNutc3brrN362m6dgVd26zS8tFtf2K1Tdutz+5Fk0n70zH40YT96CuP2ozEYtVtG7JZhu+WJ3TIEg3bLAPTbLX12S6/9sMd+2A1d9sNO+2EHtNsP2+yHrdBiP2y2HzbZDxvtZkmD3VwPdXZzrd1cYzdX281VUGk/qLAflEOZ/aDUflBiPyiGIvtBof2gAPLtB3n2g1y7SZJjN2XbTVl2UyZk2E3pdlMapNr3U+z7yfb9JPt+IiTY91X2fcXF/v3rKIq42B/7c/MH4mJnjLG4ioudxVVKi/3YZpNYbcdHtmOL7fgQzLbjAzDZjvdtx0bbscF2vAd62/FukFVns+7YrFqbdRs0NuuWzaqGTdvRhu1o3Xa0Bqu2oxVYth0t2Y4WbUcLMG87mrMdzQZZXtssMzbLK5i2WV7aLC9gymZ5brNM2g4lz2yHE7bDp7bDcRizHY7CiO1w2Hb4xHY4BIM284DN3A99NnOvzdxjM3dDl83cGXTQYTtotx202Q5abQct0Gw7aIJG20GD7aDedlAHtTZTDVTbTFU2U6XNVAHlNlOZzVQatF9i2y+GItt+oW2/wLafb9vPg1ybMQeybcYsmzHTZsyAdJsxDVJtxhSbMdlmTLIZE4MMCTaDymZQXOwX11HExc4YYyzG42JncZXSYj8Ci/Xo0Hpkth4dgMl6tA9G65HBerRnPdLDrvVIBztWi9Zq2bZaNLBltahh02rZsFrWrYdrsGo9XIFl6+GS9XARFqyH89bDOZi1Hr62Hs5YzZJXVvO01fwSXljNU1bzc5i0mp9ZDyQT1oOn1oNx68EYjFoPRmDYevDEejBkPRiEAaupH/qspl6rqcdq6oYuq6kTOqz77db9Nut+K7RY95uhybrfaN1vsO7XQ511vzbIWGM1VluNVVZjJVRYjeVQZjWWWo0lVkMxFFkNhVBgNeRbDXlWQy7kWA3ZkGU1ZFoNGda9dEiz7qVCinUv2bqXZN1LDNInWPUqq15xsR9fRxEXO2OMsRiPi519yv7VJy/8CYQ/K2mwWSyWQ4vFbLEcWCwm2LdYjEGHBsvhnuVQD7uWQ53lcMdyqIVti1kDWxaz2mLehA2LeR3WLOZVi3nFYl6GJYt50XIgWbAczFsO5mDWcvAaZiwHryymaYvpJbyAKYvpucU0aTE9gwmL6SmMW0xjFtOoZV8yYtkfhieW/SHL/qBlfwD6LcY+6LUYeyzGbuiyGDuhw2JstxjbLMZWaLEYmy0GSZPF0GgxNEC9xVBnMdRCjcVQbTFUQaXFUGExlFv2JGWWvVIosewVW/aKoNCyV2DR50OeRZ9r0edAtkWfBZkWfYZFn27Rp0GqRZ9i2ZUkW3aTLLuJkGDZVVl2FRe74TqKuNgZY4zFeFzs7FMmDea//YQ9fLGbzeYDs9lkNu+D0Ww2mM17QQd688Eu6MwHO+YDLWybDzSwZT5Qmw82YcNsWoc1s2nVbFqBZbNpCRbNpgXz/jzMmfdnzfuvYca8/wqmzfsvzfsvzPtT8NxslEyajc/Mxgmz8SmMw5jZOGo2jpgNw/AEhsyGQbNhwGzohz7oNRt6zIZus6EraK/TvNcB7ea9NvNeK7SY95rNe03QaN5rgHqzvs6sr4Uas74aqsz6SrO+AsrNu2VQat4tMe8WQ5F5txAKzLv55t08yDXv5ph1kmyzLsusy4QMsy7drEuDVLMuxbwjSTbvJJl3EiHBvKMy7ygu9o3rKOJiZ4wxFuNxsbNPWcwudpPJtG8yGcFgMu2ZTHrYNe3rYMe0rzXtb4PGtL8FatP+JmyY9tdN+2smo2TVZFyBZZNxyWRchAWTcR7mTMZZk/E1zJgMklcmw7TJ8BJemAxTJsNzmDTtPYMJ095T0944jJn2RmHEtDds2nsCQzBo0g+Y9P3QZ9L3Qo9J323Sd0GnSd9h0rdDW9Buq2m3xbTbbNptgkZoMO3Wm3brTDpJrUlXA9UmXZVJVwkVJl25SVcGpVBi0hWbdopMO4VQAPmmnTzTTi7kmHayIcu0k2nayQjSppu0aZBq0qZAskmbZNImBm0nmLZVpm3FxT57HUVc7IwxxmI8Lnb2KYvZxW40Gg2wZzTqjcZd0BmNO6A1GreNRk2QYctoUMOm0bAB60bDmtGwCiuwbDQsGQ2Lxj3JgnFvHuaMe7Pw2rg3Y9x7FaSfhpdG/QujfgqeG/WT8MyonzDqn8K4UT8WtDtq3B2BYePuE+PuEAzCgHG337jbB73G3R6jTtJt1HVBp1HXYdS1Q5tR1xq002LcaYYm404jNBh36o07dVBr3KmBauNOlVErqTRqK4zaciiDUqO2xKgthiKjthAKjNp847Ykz7ida9zOgWzjdhZkGrczgjTpRk0apBo1KUZNMiQZNYlGTQKojBrFxT5xHUVc7JH7xY+O5sI7+tFPpOM/+Mm9d7vn6o/oJz8I/na/iMZD3RS9p8YYY584Lnb2KYvZxb5nMOiD9nYNezrYMexpYduwp4Etw57aoN+EDVg36NcM+lVYMeiXYcmgX4QFw+68YXcOZuG1YXfGsPsKpg27L+GFYXcKnht0k/DMoJuApwbdOIwZdKMG3QgMwxODbsiwMwgD0G/Y6TPs9EKPYafboJV0GbSd0GHQtkObQdsKLQZtMzQZtI0GbYNhW1IPdYbtWsN2DVRDlWG70rBdAeWG7TLDdqlBIymBYoOmCAoNmgLIN2jyINegyTFosg1bkizINGxlGLbSIQ1SDVspBnUyJBnUiQZ1AqgMasXF3n8dRXG22P/Zf2g5+Uf/zf/yEb/Zxw3dB9/6AzfE1T/4waeb2N/QnudfExhj0YiLnX3KYnax7+r1Ep1+d0e/q4Vt/a4GtkCt393U727Aun53DVb1uhVY1uuWYBEW9Lp5vW4OZvW61zATtPNKvzOt33kJL2BKv/NcvzMZpH2m107AUxjXa8f02lEY0WuH4QkM6bWD+u0B6Ic+/XavfrsHuvXbXdAJHfrtdv12m14jaYUWvaYZmvSaRr2mAeqhTq+p1Wtq9FuSav1WFVRChX6rXL9VBqVQot8qhiK9ulCvLoB8yNOrcyFHr87Wb0qy9JuZkKHfTNdvpkEqpOg3kyFJv5mo30zQb0hU+g3Fxd5yHUVxttj/y39fo9HsWD9itD/KYr+59lPOXS52xlgMx8XOPmUxu9h3dDqJVrezDRrdzhaoYVO3s6HbWYc13c4qrARpl3XaJZ12ERZgXqedg1md9jXMwCuddlq3/RJe6Lan4DlM6rafwYRu+6luexzGdBrJqE4zAsM6zRMY0mkGYUCn6Yc+6NVt9UC3bqtLt9UJHdCu22qDVt1WCzQHqZt06kadugHqoU6nroUanboaqnTqyqDNCt1mOZTpNkuhBIp1m0W6zULdhqQA8nUbeZCr28iBbN1GFmTqNjIgXbeeBqmQoltP1q0nQaJuPQFUunXFxV55HUXxuNg/arS/tznlv5SdOSM/dHs5eFrL3Xkt+MW7G979MvJ5L3ePIt1Odgvp8NGPfhT6SJEPyp+beIC7B8WFH4nrcfV7zyf0FtKdfiG7fNtP3v8tP/ywsgPRPeGHMfZdj4udfcpidrFrtdptrVYDW1qtWqvdhA3ttmRdu70Gq9rtFViGJe32Iixot+eDNHMwq9W8hhmt5pVWMw0v4YVWMwXPtZpJ7ZbkGUxot57CuHZrDEa1asmIVj2sVT+BIRjUqgegX6vug17o0W52Q5d2sxM6oF272Qat2s0W7WYzNAVtNGo3GqBeu1EHtVCj3aiGKu1GJVRo1yXl2vUy7XoplECxdr0ICrXrBZAPedq1XMjRrmVDFmRq1zIgXbuWpl1LhZSg1WTtahIkalcTQKVdVVzseddRFKeL/eGjXXGxB9fnu9V8e1FcCjkLPfRq2ShWePNZttNDJvvNbn73u+OaiAdlz+3uYshiF48afu3nEW4he87vP/vQY/c/rNKfizHGPhAXO/uURV7sn/1Qq/3hZ4+62KXxsqXRqGFTo9mA9aCtNc3WKqxotpZhSbO1CAswr9mag1mNWvJao56BVxr1NLyEFxr1FDzXqCfhmWZTMqHZfArjms0xGIURzeYwPNFsDsGgZkMyoNnohz7NRi/0QLdmows6NRsdQevt0KZZb4UWzXozNEGjZr0B6jXrdUFrtVCjWauGKs1aJVRAuWatDEo1ayVBq8VQpFkthALNaj7kQa5mNQeyNatZmhVJJmRoVtIhTbOSCimQrFlJgkTNSoJmWaLSLCsu9uTrKIrfxY7R/h/8t//7B34zpcUeeXPevdEc+tZ4+Gq9Z7GHPLJse4ev6uAvIh28/3f8hezphb7x/v5jK11WfPz7H1b+Z2GMsY+Ii519ymJ2savV6k3YUKvXYU2tXoUVWFarl4I2F9WbCzAPc+rNWXit3pwRXqk3p4M2Xqo3XsAUPFdvTMIz9cYEPIVx9cZY0Pqoen0EhuEJDKnXB2EA+tXrfdCrXuuBbuhSr3VCh3qtHdqgFVrUa83qVUkTNKpXG6BevVoHtVCjXq2GKvVKJVRAuXqlDEqhRL1SDEVQqF4pUC9L8iFPvZwLOerlbMiCTPVyBqQHLaWpl1IhBZLVS0mQqF5KAJV6SWmxp6muoyiuF/uu6z/95//nB34zhcX+i9BVLr/6/Z8o8/6Pnbl/sUf6ITVhb+UHu13KkQ6GvTMfMrMj7vGPXuz3/okiP+zn8tNiON0ZYw+Pi519yj5isf/47dBNb38sbnR7QNw2/MhXX+wbGxvrsLaxsQorsAxLGxuLsLCxPg9zMAuvN9Zn4BVMb6y/hBcba1PwHCbh2cbaBDzdWBuHMRgNWh3ZWB2GJzC0sToIAxur/ULfxmov9GysdEMXdG6sdEA7tEHrxkoLNG+sNEEjNAQt128s10HtxnINVEPVxnIlVEB50FLZxlIplGwsFUMRFELBxlI+5EHuxmIOZG8sZgmZG4sZkL6xmAapkLKxmLyxIEmCxI2FBFBtLCgt9mLVdRTF72J/yFz//Cu9x/7e1RHHudJiDz+ucCbN13uP/esv9nv/RIqLXcS32xljHxMXO/uUPXSxy45Iyz242W//8e5AhCNfY7GvodW1tRVYXltbgkVYgPm1tTmYXVt7fWt1Zm31FUyvrb6EFzAFz9dWJ+EZTKytSJ6urYzDGIzCyNrKMDxZWxmCwbVlyQD0ry33QS/0QPfachd0QsfaUju0QSu0rC01QxM0ri01QH3QYh3Uri3WQDVUrS1WQgWUQ9naYimUQPHaYtHagqQQCiB/bSEPciFnbSEbsoLmMyFjbT4d0iAVUtbmkyFpbT4REtbmJKq1OaXFXqe6jqI4XewPnOufP/w89rBR/W6zyw5GPDVFVsQlK9/cEc8UDzv4wfPYI07rCCfef3iIP/xh5Ze52BljHxMXO/uUPXSx373BfvcW+t0b6nfbPPzI11jsK6urkuXVlSVYhAWYX12Zg1l4vboyI7xaXZ6Gl6vLL4Sp1eXnMAnPVpcn4GnQ0jiMrS6NwggMw5PVpSEYhAHoX13qg96gxR7ohq7VxU7ogHZoW11shZbVBUkzNK0uNEID1EPd6kIt1ED16rykanW+EiqgfHW+TChdnS+B4tX5oqA5SeHqXAHkQx7krs7lQDZkrc5lQgakQ9rqbCqkQDIkrc4mQgKoVmeVFnuX6jqK4nGxP3yuf/41flbMzdXyHxwT8jNSbu8cOlsVviHzdt/iwX/wgwg/Aub9gx/+WTFhz1f+fD642CP9iT78sPxZMYyxrxgXO/uUfcRij7jDxUp/d2X4ka+02JeWlyWLy0uSheWleZiDWXgNM8tLr2AaXsILmFpeer68KJmEZzCxvPhUGF9eHINRGFleHF5euPFkeWEIBmEA+pcX+qAXeoLmu6Freb4TOqAd2qB1eb4FmqEJGqFhea4e6qAWapbnqqEKKqEiaLZ8ebZMKF2eLYFiKFqeLRQKlmfzg17nQS7kLL/OhizIhAxIX36dBqmQAsnLM5Kk5ZlESADV8ozSYh9RXUdRnC32v/jP/P4fPXyux1YfdXoNY4x9d+JiZ5+yjzgr5vbk9OAlaY3f/kPMeem68CNfZ7EvLi4uLC7OwxzMLi6+DlqQzCwuvIJpeAkvYAqeLy5MBs1Lni3OT8BTGF+cHxNGF+dHYBiewBAMBs0NLM71Qx/0Qg90L851CZ2Lcx1Bs+3QBq3QsjjbDE3QCA1Qv/haUge1ULP4uhqqoBIqoHzxdRmUQsnijKQYiqAQCiB/cSYPciEn6FU2ZC2+yhQyFl+lQxqkQgokL75KgkRIWJyWqBanlRb7tOo6iuJssX+r42JnjMVpXOzsU6a42OUnwdzs8Pe/81R2pozsFPf7v/X04Yt9fn5+Dmbn51/DDLyan5NMw0t4MT83JTyHyfm5ZzABT2E8aHYMRmEEhudnn8CQMDg/OwD9868lfdALPdA9/7oLOqED2qENWqFlfkbSDE3zM41Cw/xMPdRBLdQEvaqGKqiECiiff1UGpVACxVAEhfOvCuanb+RD3vx0rpAzP50NWZAZ9DID0iFt/mUqpAjJ8y+TIBESQDX/Ummxr6quo4iL/dsTFztjLE7jYmefspj9X1CanZ19DTPwCqbhJbyYnZ0Kev0cJuEZTMBTGIcxGJ2dkYzAMDyBIRicnRkQ+qFvdqYXem696p591QWd0AHt0Aat0ALN0ASNQdMNUA91UDs7XSNUz05XQSVUzL6UlEMZlEIJFEMRFEIB5ENe0Ivc2Rc5QjZkzb7IhAwhffZFGqTOTklSIBmSIBESQDU7pbTYd1XXUcTFzhhjLMbjYmefsphd7DMzM69gGl7CC5iC5zA580ryDCbgKYzDGIzCCAzDExgKmh6EAeiHPuiFHuiGLuiEDmifeSlpg1ZogWZogkZoCHpRD3VQCzVQDVVQCRVQDmVQOjMlKYFiKIJCKIB8yINcyIHsoOdZkAkZkA5pkAopkAxJkAgJM5MS1cyk0mI/Ul1HERc7Y4yxGI+LnX3KYnaxT6OX8GJ6egqeC5PwDCbgKYxPv5SMwSiMwDA8gSEYhAHoh76gF5Je6IHu6RddQid0QDu0TU9JWqEFmqEJGqEB6qEOaqEm6Hm1UAWVUDH9vFwog1IogWIomp6UFEIB5EMe5EIOZEMWZEJG0DNJOqRB6vSzFCEZkiAREkA1/UxpsbtV11HExc4YYyzG42Jnn7KYXewv0BQ8h0l4BhPwFMZh7NbUKIzAMDyBIRiEAaEf+qA36HkPdEMXdEIHtEMbtAot0Bw02QSN0AD1UCfUQg1UQxVUBj2rgHIoE0qh5MWzYigSCqEA8oMm8iAXciBbyIJMyIB0SIPUoKcpQjIkQSIkgOrFU6XF/u+prqOIi50xxliMx8XOPmUxu9ifT01JJqeeS57BhPAUxmEMRmEEhuEJDE1N3hiEAegX+qAXeqAbuqAz6FkHtAtt0AotQjM0QSM0QP3UhKQOaoUaqIYqqIQKoRzKgp6WQgkUQ5FQCAWQD3mQCzlB45JsyIJMyIB0IQ1SIQWSIWlqTJIICYJqakxpsf9j1XUUcbEzxhiL8bjY2acsZhf7s8lJycTkM8lTYRzGYBRGhGF4AkMwGDQhGYB+6INeoQe6oUvohI6gp+3QJrRCCzRDEzQKDVAPdVALNUHjkmqogkqoEMqhDEqFEigOGiuCQqEA8iFPyIUcyIYsyJwcvZEB6ZAGqZAiJEMSJEJC0IhENTmitNj/E9V1FH0nFztjjLHvUlzs7FMWs4t9YmLiKYzDGIwGPZWMwDA8gSFhEAagX+iD3olxSY/QDV3QCR1CO7RBq9AyMSZphiahERqgXqiDWqgRqqFKqAwarYByoQxKoUQohiIoFAomRiT5kAe5Qg5kQ5aQCRmQHjQsSYNUSIFkIQkSIUFQTQwrLfY/V11HUcTFHq1/57+huNgZYyyuiv0vTOy71E8/bQ9f7OPj42MwCiPC8PiY5IkwBIPCAPRDn9ALPdAtdEHn+OiNDmiHNqEVWoRmaIJGaBgfuVEPdUIt1AjVUCVUQgWUC2VBw6VQIhRDkVAIBUI+5EFu0BNJDmRDlpAJGZAupEGqkALJQtL4kCQREgTV+JDSYv+vVddRxMXOGGMsxov9L0yMRTGlxT46OjoiDMMTYQgGYWB05EY/9Am90CN0Q5fQCR1CO7QFDUtaoQWahSahERqgXqiD2tEnN2qgWqiCSqECyoUyKBVKoDhoSFIEhVAg5At5kAs5QjZkCZmQMTp4Ix3ShFRIEZIhSUiEhKABiWp0QGmx/3eq6yjiYmeMMRbjxf4XJsaimNJiH0ZPYAgGhQGhH/qg99aTHqFb6IJO6BDahTZovTXUAs1CEzQKDUI91Am1UCNU3xqsgkqoEMqFMigVSqBYKBIKoWB4QJIv5Am5kCNkQ5aQKWRAupA23C9JFVIgWUgSEiFBUA33Ky32/0F1HUVc7IwxxmK82P/CxFgUU1rsQ2gQBoR+oQ96hR6he2hQ0iV0Ch3QLrQJrdAiNAtN0Dg0cKNBqIc6oVaogWqhSqiEilv95UIZlAolQjEUCYVCAeRD3q2+XCEHsoUsIVPIgHQhTUiFlFu9yUISJAoJgmqoV2mx/8+q6yjiYmeMMRbjxf4XJsaimNJiH0D9Qp/QK/RAt9AldELHrX5JO7QJrUILNAtNQqPQAPVC3UDfjVqoEaqFKqFSqIByoUwoFUqE4qDeIqFQKIB8IU/IFXIgW8gSMgd6JBky6ZAmpAopkCwkCYlCQlC3RDXQrbTYf6m6jiIudsYYYzFe7H9hYiyKKS32vv5+6OsVeoRu6BI6hQ6hXWgTWqGlv/dGs9AkNAoNQr1QJ9RCjVAtVAmV/T03KoRyoUwohRKhWCgSCoWC/u4b+ZAn5Ao5QraQJWQKGUJ6f5ckTUgVUoRkIUlIhAQZVX+X0mL/v1TXUcTFzhhjLMaL/S9MjEUxpcXe29vbA91C162eTqFDaBfahFahRWgWmoTGoG5Jg1Av1Am1Qo1QLVQJlUKFUH6rq0woFUqEYqFIKBQKIF8mL6hTkivkCNmQJZMJGTLpQhqkyqRAclCHJEkmERJkVL0dSov9C9V1FHGxM8YYi/Fi/wsTY1FMabF3d3d3CZ1CR1CXpF1oE1qFFqFZpkloFBqEeqEuqFNSK9QI1UKVUClTIZQLZUKpUBLUISkWioRCmQLIl8kTcoUcIVvIutWeKWQI6TJpQqqQIiQLSUKikHCrTaLqblNa7H9U/UMUcbEzxhiL8WL/CxNjUUxpsXd2dnYI7UKbTOutjhaZZqFJaBQahHqZOqFWqBGqg9olVTKVQoVMuVAmlAolQrFMkVDY2XajQMgX8mRyhRyZbCFLyBQyhHSZtM7WG6lCipAsJMkkCgmCCpQW+7Xq/4siLnbGGGMxXux/YWIsiikt9nbUJrTKtAjNQtM7bY1Cg0y9UCdTK9QI1TJVQqVQIVN+q7VMKJUpEYqFIplCoUAmX8gTcttb7uQI2TJZQqZMhpAukyakCintzXeShSSZRCFBUIHyYv+/o4iLnTHGWIwX+1+YGItiSou9FbXINMs0CY1Cg0y9UNfacqdWpkaolqmSqRQqZMqFMqFUpiSo+UaxUCRTKFMg5MvkCbkyOUK2TFZQkyRTJkMmXUiTSRVSZJKFJJnEoEZJgowKlBf7X0cRFztjjLEYL/a/MDEWxZQWe7OoSaZRpkGol6mTqZWpEaplqoKablTKVAjlMmUypUKJTLFMkUyhUNDceCdfJk8mV8iRyZbJkskUMmTS32lIk0kVUmSSZZJkEoUEGRUoL/b/NYq42BljjMV4sf+FibEoprTYG2U1CPWh6oRamRqZapkqmUqZCpnyxoY7ZTKlMiUyxTJFMoUyBUJ+qLygekluqBwhWyZLJlMmQyZdJk0mVSblnbpkmSSZRJkEGRUoL/b/MYq42BljjMV4sf+FibEoprTY6xsaoF5SF6pWpkamWqZKplKmIlS5TJlM6a06SYlMsUxRqEKZApl8mTyZ3FA5Mtm3aiVZMpkyGTLpodJkUmVSZJJlkmQS36mRJMioQHmx//dR9J1c7J8zxhj7DhX7X5gYi2JKi72urq5WpiZU9Tu1VaEqZSpkykOVyZSGKpEpDlUkUxhUc6MgVL5MXqhcmZxQ2TJZMpmhMm5VS9Jl0kKlhkqRSZZJCpUokyCjEpQX+z+LooiL/bE/N38gLnbGGIuruNhZXKW02GtQtUxVqEqZineqJeWhykKVhiqRKQ5VFKpQpiBUfqi8W1WS3FA5obJDZclkhsoIlS6TFio1VMqtyhvJoZJkEkMlyKgE5cX+X0QRFztjjLEYj4udxVVKi70KVYaqCFUepkymNKhSriRUsUxRmEKZgjD5ofJC5YbKCZX9ToUkK1RmqIxQ6aHSQqWGSgmVHCopVGJVuVxCKJWgvNj/SRRxsTPGGIvxuNhZXKW02CtE5WHKQpWGKQlVHKooRLmkMFRBqPwweaFyw+SEyg6TFSozVMatsjvpodLCpIZKCZMcKilUYpiEUCpBebH/R1HExc4YYyzG42JncZXSYi+TVRqmJFRxmKIwhWEKwuSXlb4nL0xumJxQ2WGywmSGyQiTHiYtRIkkNUxKqOQwSWESwySEUQnKi/0fRREXO2OMsRiPi53FVUqLvSS04kiKwhRGUhAmP0xeJLlhct5XLMkOkxUmM0xGJOlh0sKkRpISJjmSpHeKbiRGkhBGJSgv9kAUcbEzxhiL8bjYWVyltNiLwiqMpCCS/EjyIsmNJCeS7EiyIsl8p/BORiTpkaRFkhpJSiTJCpIiSQyTEIkqqOCG8mJ3RVH8LfZf/Oho7l0/+MkHb/yBm0TpTowxxpTiYmdxldJiLygshIL35EeSpyBXQY6C7EiyFGQqyFCQriDtnfw7qQpSFCQrSIokUUGCApWM8mK3RFG8Lfaf/EC+0rHe7xvXX298c7ozxlg04mJncZXSYs9HeQpyFeXlKMhWlqUsU0GGsnRlacpSFaQoS35f7p0kBYnKEhSoQikv9t0oirPFLg32ox/9QnbgA6Oai50xxh4/LnYWVykt9lxRzr2ylWVFkCOXqSzjXun3SrtX6r1SlCXfK+leifdKiCz7hiqU8mJfi6I4W+zKb6rL1/W7y7j0gx/cnEEjtj4O/kicXCPd8Beyy+/u/pPbu733dwTGGGMfGRc7i6uUFnt2aFkfkvkAGR+S/gFZaQ+Q+iEpH5L8AEkfkvgACR+iCqO82GeiKM4W++efvxvSodNdebGLxX13Qs37B28vBw/j0t3d+R47Y4xFIy52FlcpLfbMSGU8WPqDpT1M6sOkPFhyUMZDJD1M4oMlPIwqEuXFPhZF8bfY7xLTPeSN8c9DL4dsbjHZI9/03WUudsYYi2pc7CyuUlrs6Q8o7SOlfryUj5T88ZI+UuLHS4gg7X4qBcqLvSeK4nixo/A3xj9XXOxhi/xzLnbGGPsEcbGzuEppsad+pVK+nuSvLenrSfzaEr4e1YcoL/bGKIqvxR76k2LQ/TP8/ffY7xn3XOyMMfYNxcXO4iqlxZ78zZT0TUr8xiR8k1QfQ3mxl0dRfC32kFPQxa/fP01d/u2pstu/O/pRi53fdsoYY183LnYWVykt9qSwEmNYwq3EGKSKKuXFnh1FcbbYg8m+9TRsvd8e+9EPPvizYh6y2MVD8n12xhj7OnGxs7hKabEnxEYqCqW82BOjKA4XO2OMsW9XXOwsrlJa7Cxm+zSv13u/BRc7Y4yxmIqLncVVERc7Y+/Fxc4YYyym4mJncRUXO3tIXOyMMcZiKi52FldxsbOHxMXOGGMspuJiZ3EVFzt7SFzsjDHGYioudhZXcbGzh8TFzhhjLKbiYmdxFRc7e0hc7IwxxmIqLnYWV0Vc7NJ/BX/B4rvwfyUe+3PzB/rgYv93jDHGvkNxsbO4Smmx//rXv/7Nb37zBfp/Wdwkvei/+tWvwj8NSkce+3Pzh7v/X/XHfnaMMcaiGRc7i6uUFru03KT9Jv0X8eWXX/4di4OkF1p6uW9GOxc7Y4yxGI+LncVVSov9iy++kP5z+O1vf/v73//+79l3PelV/t3vfie93P8Oo52LnTHGWIzHxc7iqnsW+5dffikNuT/84Q9//OMf/4F915NeZWm0Sy86FztjjLHYj4udxVVKi12abX/3d3/393//9zdz/dM/MfaJk15l6S9o0ovOxc4YYyz242JncdUHFzvnepwkvdDSy83Fzhhj7FsRFzuLqx642P/l94e+/y+lf/6bP9/d/fN/gxtJF4duw1XvFbw60nHF24jf4sO3ZN9EXOyMMca+RXGxs7jqYYv9bqjfzWrpgny6i8vv+vDGvpn8D1ns792SfRNxsTPGGPsWxcXO4qoPLfa/+rO7d9LvkuZ56LyW/Uq6eHOb739/N+ygfNgH/xIgvw0e5Pvfj/Cmfdgt2TcRFztjjLFvUVzsLK560HvsEc6Jkffu/faQS0N3dxJj+93VN4/0/lkxt9eGHI5wS/ZNxMXOGGPsWxQXO4urHrLYw8+JkSU/J0Z+vdjYkba2eEDF89jvLke8Jfsmulnsv/3tb7nYGWOMxX5c7Cyu+opnxdze8N374sFCZ/Xt6g5/X/7dkfcWe8jjht6Xi/0bj4udMcbYtygudhZXPeA99r+O/BY7vh00dEU/6D122c+YCfkbgOzOt/dRuiX7JuJiZ4wx9i2Ki53FVR9e7H/9Z7t3p5ffLeYIcz3YB85jf3+9h53HfncqzPuPzffYv/F4HjtjjLFvUVzsLK768GL/iwjfdhr+7rf87fEH/awYceNIPyvmq/ysSPY142JnjDH2LYqLncVV/N88ZTdxsTPGGPsWxcXO4qr7F/vvf/97LvZ4SHqV//jHP3KxM8YY+7bExc7iqnsW+5dffvm73/1OGnL/wL7rSa/yH/7wB+kvaNKL/sUXX3CxM8YYi/G42Flcdc9il/5z+O1vfyuNdmnI/T37rie9ytLLLb3oXOyMMcZiPy52FlcpLfbf/OY3N6P9yy+//Ltvc7/95D32n/grJr3Q0sstvejSS8/FzhhjLMbjYmdxldJi/9WvfnUz2lmc9AWSXvRf//rXXOyMMcZiPC52FlcpLXYW54X/K/HYn5s/3P3/qj/2s2OMMRbNwr9UMfYdLuJiZ+y9uNgZY4zFVFzsLK7iYmcPiYudMcZYTMXFzuIqLnb2kLjYGWOMxVRc7Cyu4mJnD4mLnTHGWEzFxc7iKi72x+1fxWrvPU8udsYYYzEVFzuLq8K3GfuUSR//v429uNgZY4zFeFzsLK7iYn/cuNij2P0f6sd+dowxxqIZFzuLq7jYHzcu9ih2/4f6sZ8dY4yxaMbFzuIqLvbHjYs9it3/oX7sZ8cYYyyacbGzuIqL/XHjYo9i93+oH/vZMcYYi2Zc7Cyu4mJ/3LjYo9j9H+rHfnaMMcaiGRc7i6vierH/lff6Txpv/dM//aZ+l3/7p9d/4lW6kos9it3/Ojz2s2OMMRbNuNhZXBW/i/0vV0KG9E+/sdH+FRf7Zz/UDt309scfNbdv7/j2hz/Uan/4GRe76LGfHWOMsWjGxc7iqnhd7D+7/pOV638rP/Kvr/9p4/Vf4WJwY4v33u+OSHv+p6EHbx/n5uDdo90dESv9qyz24OoWc/vHb4c+Znl/9tWHOhc7Y4yxb0tc7CyuitPF/lde5XfUZWP+bmzfbPi//Neh95WN/LuDPxU3+8uV65/+LORBIhV5sYeu7s8++/Fnn4kdj26vlH799u3bkDfif/z27o35mwcJ/t+3b7V3R24uS4/w4x9qZQ/Fxc4YY+xbFRc7i6vid7HfzOkP9DPZYg97zzzCFP9Z6JvtSjd7V+TFLu3u8FNhgnv95qh41z3kiLjD3dq/W+x3q/zusvxCpMnOxc4YYyzG42JncVWcLvabs1zu6e4EmPsX+/sP8rN3p9PcnSoTrcUuO3h78d3eli3v8MV+t8nfu+pvudgZY4x9W+NiZ3FVnC72+85j/1nI6esf/R572Dj/2mfFcLE/sPtf8sd+dowxxqIZFzuLq+J1sSv/rJj3x3nY++TvLr/3zare28d573T3KHznKS5HPCuGi13W/S/4Yz87xhhj0YyLncVV8bvYr5V/HntwzN8c9N5u8siL/frenxUT9u2rkVL+6Y5330M6JF/cId9mysUe2v2v9mM/O8YYY9GMi53FVXG92GMg/i8oRbH7P9SP/ewYY4xFMy52FldxsT9uXOxR7P4P9WM/O8YYY9GMi53FVVzsjxsXexS7/0P92M+OMcZYNONiZ3EVF/vjxsUexe7/UD/2s2OMMRbNuNhZXMXF/rhxsUex+z/Uj/3sGGOMRTMudhZXcbE/blzsUez+D/VjPzvGGGPRjIudxVVc7I8bF3sUu/9D/djPjjHGWDTjYmdxFRf74/bTmOw7udgZY4x9l+JiZ3EVFzt7SLH/iZGLnTHG4qrY/8LEWBTjYmcPKfY/MXKxM8ZYXBX7X5gYi2Jc7Owhxf4nRi52xhiLq2L/CxNjUYyLnT2k2P/EyMXOGGNxVex/YWIsinGxs4cU+58YudgZYyyu+p8YY4yF9difmz8QFztjjDHGGGOxHBc7Y4wxxhhjsRwXO2OMMcYYY7EcFztjjDHGGGOxHBc7Y4wxxhhjsRwXO2OMMcYYY7EcFztjjDHGGGOxHBc7Y4wxxhhjsRwXO2OMMcYYY7EcFztjjDHGGGOxHBc7Y4wxxhhjsRwXO2OMMcYYY7EcFztjjDHGGGOxHBc7Y4wxxhhjsRwXO2OMMcYYY7EcFztjjDHGGGOxHBc7Y4wxxhhjsRwXO2OMMcYYY7EcFztjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcbYt6u/ZYwxxhhjjMVwj/03BsYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMfYJ++KXP/+prJ//8otv/vf8m89CfxvpOXz2Nw++t/wZi7v9zWc/DS14xXt/NHHbSPdnjDHGGGMsVpP2q2w+h/7qm+prLPbgNH9329Bf4deyX4Y8rPiThfwJP80flzHGGGOMsa+RwmJ/96b17bvVN9tXOiyuxz/vbnZzNHj3n//85j7vXSV7zM8+i7DYP/tM9q73u+X93ph/f+u/9/Qfttg/zf8jgTHGGGOMsagU8awY2fK9uXg7fqXB/HNxQbqh7GY3Nwg+2N20D71KduRu9sufw7vr5H9FeG+wR3gzPmTDhy32SGfFhJxDw9NiGGOMMcZYjBfpxJCQYXwziXHoi19+9su/CV64O/be2L97sIhX3T1m+Fkxn939+va6m5uHLvAI93zge+xhd5PdgW+4M8YYY4yxmC7iqdxh77HfnvDyGXb6Z1LyU2MiPVj4Rg450yXsPXZx4O5WN2fKhD21r3oe+901oRs97K8EjDHGGGOMxVgK33wZeh777Q3vTjIPOzX99obyB3vvKtmR4LnuYYv95z+PcO5KxPe/7/lZL/ecx/7u4eT35xvsjDHGGGOMfcX4c1wYY4wxxhiL1fA2OPc6Y4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhj3/r+fxKAhSkKZW5kc3RyZWFtCmVuZG9iagoyMjYgMCBvYmoKNDUyCmVuZG9iagoyMjcgMCBvYmoKNDkyMzYKZW5kb2JqCjIyOCAwIG9iago8PCAvTGVuZ3RoIDIyOSAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCniczVjNbhw3DL7PU+gFouhfIyBYwPbuFu0tqIEcgpySNjlkU7iXvn4pidRQ0uzavhnGYEcSxZ+PHymNnxYtFPy9yz8xGfH1sjzhnBbRCBtwygdhlVx9UEqLiyhjLbUq458gPoyaLI4CraGmNv4hPi2/FiV+Wz5/AdFvQkkv/lvUbI6p/HP5yPzMq+rN+sk9tdq8YU+flugqHUyQOvmUkliNMFEakPl6Ee9/vxhx/KcE9bEnSnBGBu17AimRVrmuOAtz0niwnRd/CgNGnFNKmWmYxYYZX8Kuv1cDRP2zqjEPVeKWd9pLlUL3WlW10Ws86lVkb5T4vtw/Lu/PgJlW4vHvrRIh7WsE7GGD1rDP50iieLyIzx/g9V4pGw9fxOMfy+mxj8pp6aFi3xTohVYmU8SFFWiyin//Ep/EL5h2XtWY88uqRTDEMkcs6zgWS3/akAN8QoccyFkZvQbs1kCAaQtPrMBpA7938KzwDsy3gK0+wnNX3+0DvD+gbMpyFehqzAzGLFQJKIJtuhk7b8rMXVWkElcIT8TfhM5oeFzOMb7n31yWDtcfquNlvKKMR51u06VpLu99aI5P/FqFTzLFDEUOqTpu7w8C4P9QtSvuikbV+f1Uf4tZj/Me588oq9jY19ByOC1sz+TYnpyn8p7d15g3W9eMwdzh3rxP681HjU/z+cTGHteZPUpD00nysfpbfEmtyICqAakKO6Ty2S3AEXqk9A76ZOYl0DZU2l6p6xUAXmXwIaUIpUDAG4RHH6BwYs5ARX0bnqqT5txPPxPDjoYGhe2XG5ptyjSwe3uOWKKIEedNLRPWenZizAOObR8WLbsw+0lhIIuIIRSxOT4XVvHSY3kppvE6+K9EOW5FMQSmsGlzPuRje+BDaU0aK56haJpzpw1tQ3GWXuPZZK6iWn0HoWvsfqszqqti4MS3OZ7ksnxEZTfNvQQmw4nVwjtVo5Rqs2WOHC99kpasrta3jkGejxMj6TlLq0C4gjB1N+piO76NOVlHVs65zhekMdcdlC9BEXPRZWhLdd1Zy6D2C6omQ+fMaLEr6GJ3KurXkulG81RRagvLFgCxwUub93jsnusz3dOuq3QGDveo2m2I6EBk9ACyuFFFfL0daGye9z2aK/F4lpV1RIjtnzBnNs/7vhabR8TQoG7DGtQr4tLU2EDO+IOwvjVrt3WkJo1WBkkusefDlTionrTZ/Gt4YJlPuM6HCvHeYqEja6kL0O4u80zDVHhgdaJNLajObFYtdRff7NcmVA7jWIuN+gPbTx0Cp65SiO2K/fBaojfzE88G9/1rFN4izkEkzRsxbrG2iYXWq/mlbzBuuIUdWsjtzDm9JKK+E1LrfbZSr8NhzzN5tNknD2h6F2TqcoHduvHe9nJdrz7N63s5pbXRJkVKJOI26DbZ5iacSne5chXSg6U9oEbP52uhjtt1rEmxumgxs37b5I5bfMWb1K/zG3PTc1TttkLcuxH/dJ4NPHoBBp2FPJyPfGfcTJ4Ta2n4tWLoK0apdgTzLx6Lsl2Q7LpQy2W/ysrxrZnMcAGgw6f4c+5lXdZNLbgDyMXNK/4tNlJ898pB9GDfau3uxL43iy4i6e51wigng0v5Xw75PwtO+qTTircJuD60/1T9D/0FGH0KZW5kc3RyZWFtCmVuZG9iagoyMTUgMCBvYmoKPDwKICAvUmVzb3VyY2VzIDMgMCBSCiAgL1R5cGUgL1BhZ2UKICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQogIC9Dcm9wQm94IFswIDAgNjEyIDc5Ml0KICAvQmxlZWRCb3ggWzAgMCA2MTIgNzkyXQogIC9UcmltQm94IFswIDAgNjEyIDc5Ml0KICAvUGFyZW50IDEgMCBSCiAgL0NvbnRlbnRzIDIyOCAwIFIKPj4KCmVuZG9iagoyMjkgMCBvYmoKMTIyOAplbmRvYmoKMjMxIDAgb2JqCjw8IC9MZW5ndGggMjMyIDAgUiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJzVXEuP5DYOvvev8B8YRw9LtoGggemuqsXubbAD5BDklH0dMllkL/v315JFig/ZVk3mkEUQTJVEUST1kaIoVf/2Ygez/fch/TOvbvj5y8tvpc0Osxt8LE0hDt6MS4jG2OHLkL/b0Zr8/ZeNXHxD2vItQl/hhN//Nfzw8uuLGf708uNPG+nfBjOG4b8vRk9HWP715RORM/WaP6ycVFJv3R9Y0t9e5mmHg4ujXcO6rsPiBjePbqP5+cvw3Z+/uOH276zUJw6UOLkx2sABZIZ1GZeltG5towvb3Knzl8Ftk0yTMcapr4lMtISs9v7voYKFv2Yl12GnOJPOhtGskX3cWeG3ZyTiLJI0Zvjny9vnl+8em82sGT7/o3rituzLvNl+G2DtNi4kTebh85fhx++3j2/p/9efhs9/ebl/5lpNdgybx/6hjJ5h5RJEprhsMFmG//x9+GH4dWuegtl1Th8WO0QHKJsAZQxjc45PJ5ZbhmUMwl7u7XXY+G6f7NZuHlvLx/L5vv1vXze0r2MmgE4z759Zp93Y2m2YTZ3bZy8J3G0nMDfJdiks1XyBC5W+m0nO6wuhKwRLQ7jMXs0J7B47QVvnpajlivRyfud21fio2y4YsLRyFFPp6fmyOoplMaFVuvbPtbsNwYvbULxOm695iw4Wi17F6DhfAAkfYtlYJ0XBJDoBQ2A+lBgJbGMUZTnFrEZBtBqfbJQMiGBhnY/Ch80IwOBMC8gsXfwgFr85O5c8r8rrYOc8VXEt8KC8PGa3Sm53kh+s33xkqnglAQxFsDI11dI2EDOse8+qsOPdHmysc4Ad/5HYy8+EqSvzb58duD11HCDOs94lB4lw6MjOcisu/jgYPSVQzLAKaA2/92AcQ54yjlE9WBxDmX0Rb6qKOSnqoQ6tiGAjNdfr4AMiUxoM48XSmnQuJpbhj0qFPnEpakb9Q4SieYdJwfisYDJNCiZyLzHrPlHK+DKXW/GMqQjy4P15zogr+uCmYVT0ewOHbFYCHhwjTAHtZ8ADmoyuifTBolZrBY7Bq1kzl7BHYKVZY1NBzUxZO9p2tK+SuMAsedftzlbe6V8Zeun8x5ZViAlRI0bFfZib2iOYcUdEawtbOY1ddx5Z1rvoMwZjK7TJsIC0HXZEueT3iyyF0rXWF2UTO3KTh8AUlSnJmW0B0W2p8ntp2wM+xyvEdvyv0Cr3O4WSuCiUOIK9OPXjHGiPwiX0T84oX4C+K19AeRp8pU2Rtgv1yKWB+sk3Zo9CcoFs5HcQL5GX7dcEYqFCmNv7mDwHsdU/TugaMuyroXCzGJ22LASheLYgKCzodKGiGPqpRXGMOgoV2oIrW6yQs1kxH3jF8Y7BMrfWjJOY9cAD0DfvmlemS5KtvM87ra08NiatpJX0GYVEwNnwfLr0JW+Ta/yUhek890Iv+OR5IfrpnWjVKS7XhGgA1mV50U5DLZo8ckey1MLgScCV7xqXMh5g7IRzheRaJMgcFjm67n1GxDWyIqEtq1lgBszDOO87kbkZ6ckc4OnGkFOBacdjfRCxNo6bsdZ1XnCV3iFpZkfK1Y6hCUfo6NktKnEsRMw9cRPwDRfDoRO1F+6QUZLRQx40Nn0dNbuAIx53cMDcEA8NzxaSygAx1kqJPem4GV5BwNEfqde1BFpM3SI8CSd0AdMU/qHR4BaFhnvFsp0Ju+BGh3M+RCOaEEZIgnrahgbuATNRHZk+jxkYepblVREkstuyWUeUDi05jwG6StLV4J4OHo5+pPiaI/NL0yOlWhdW+fgquzbSgk1hBRs8HJ+h0lyk8UXYQAx+U1AhySI4RbZBmeF46eWKm1rRimTm09B8Fi+SBF5vjDb6cbJuXSeP5poWQWbbdOl07w0sky9A3bbaKX+3HMDQ3odfpD4IYNgvajnQznc9Qv84kOpy9+cy0ZMDzlkWFtyC6RDL/5Ys+sNgHojffQ3tMF7mTi3daQaK8sw1rkvZobhHeWHud682z7o0duoljkuSKzp/CpsGnfnIYPO2B57pfU9K7WOHjgbWB2uW0begVXs6g2OlP9ofK4UsFtaeEkcRJo+mRKxsTGMhT5KUVF8BmMpBpdtNfdixhVOoDfBAOyxkNdY+Xd+Jtcf9EA9ghieSUOYGN8RZ+y3ZmEUD2Lltv8k4WuwZgFt0uRZ422Hr/eswzwDK3FLE5SDtg+YRICUMrxeJLg3h/ASoWkabwhh9utH166nRGnT29jpMJmPz7XUIS/Xsb22qmpmYxj2SYdnAKd6+gcHiOppp3YZXF1DBa4pQdoINCA6+mCncGOnhxd7ejd4AHAA6YD+vySOfgDPs2RsJM8G/pRimnjtJLkbcD0j75ZATk5ITi3RFVHLAcbyLHeG4USmVzNALJU3bdLVziyMKEtfZXRYSDlmTLh/WXcCw3BPCRV3ktt9gfqoOdOY8Y6a+VNAKfvDdw8btEMceNqS3O3aMaXgMGBuc32N6igdpbd1bWeRyg5YyBvO+wyYfUkC6t6LJUvqgLTnIe6F7q31JaORZ+qyrc8Ec5iPRuny376hV47mGd2GcE3+3VkcHyMCpYsPI5Msp54ncvo7qdQCknxVXye1wC6FXBih1WWFaGMQ+iJLklCZL5zgzuazENr67F254EmOUJDKK1yZ0BuqbVOcsZShzqLjfb225nvv5T9+u+1lBAyP4vaqiygVxr5BMrtLCyTwHKHI4xRQyHpTFYl9RidE+uf3BDQWMZxHzQi4HoAPAuHJLcSfxWdrFYObldxclbwMSD1E5ZJV3WiaKo64vlrbmfQLocgJYDYJp1SCQBej+rOeZrATyYRL9e8vdNLqnPTolvu79CfM23prMfrTWbqlhqPn0ZlUbV+SV/Apfll1GBfFiZpIvYM48XTxsO/V0+oztUdpvphaWdS2IzvBo6CZjVGn/FsD20joHcz2leaOWh33E2X/fnBoxS1CIQVXvhqUz0gH2yqIlV0QnVyeEVB36oYNeTFdq8o6MZbdAwF5T0TkuX1Oh7LYlpSoRQ0dniRiYkx3GSV7nxWqrXwBka7SMmq6HU/bW8mT2gAu56jdIfp0VGFr+Ujgt4/K8z8IoBFcQdiv9p/q812vyI9/qobEPLkOClisGhit3tBtoCyt0lSyAnhJG0N6TLMCcIF+Rt5EHTWbVfkxLZ8W81kDW0yPATi2XCkxSehu3lpzi+cucMu7wcoXz7zncF470ZV5xWMisqjY0NpUZSGAqnEr1F3IndcMsotU+SlYnhFTUgRpL7Kxa4mM/C/WpTrkhgR0y2DMc0xqG4OFYawd8yPinKj10NJiM1j4CPuTJusMpUKb5BBIUClx+fABm5UIH9YwZH6qprCNg9pIbSFbEZ+XPULdMw9SKiF5wr7M5lmDC0ax1mdaTgM613QFASHJqyEukbIJI5qQlCZHMoowYttmGaYpnF0kT41zdvZX0l0BEvqRFrXXqO6XnkM6sazTrSer7wc99mW8hbJ5RfDtB8HOvYwDp06cNHMoSBY+Pjp49Q/gulZopjL9OYPx1+uIxeXHreUSdGm+m0+NGseYquVxjeRdAk0toPEwugSDdQJRn5YcvqSu3nqQTiPmDl3jwLgE7+pJOZC5WrL5niaR4JWdvIWiu7xGaBjxK44CAPml8Jg8DG8IPEJShdw00JtLDRYEJtvSTIT9p6djB0XQ4ECB+lQHCALmB8o5n/R/FwLID5aiq5tDRhx8kPz9F4q9dxLDWZl15xgaO5IT1FsCMakeu1I1NmdnAWg2M9EqxBYyD7bhwXY5LVUu76rZ8VYGPDGUrW7nRr1e/21v6C5ILe9+mcwGm6HlKUDUwTTPhJrzgD3WOSs1CLDbq+qJa/1bCTIc7xal1rF8av7jCVlyX2tKR9FB6nf6wWUGlo0RIy6gkl49SBH3L+HXsUzaCNYbdvr6cAApH0wR4FMNl8tUBZV6GfsJm5G9V0K5sL9OAsDpdzKTEyK3fbZGLQHHRjedZKIfOBl8oq2L000eis0u/4OfRLGE7B68z1QUu/fxKFvH/5tIvxO24O0/rMs81oaePXMM0RhUjsHGTzd0LlAyvEegaJgyiMYo28jogTnF5hkDSi6OqlwNYAKWNSvuem8ELBc/CMJs7XKk5y4aOawJG/ETlOqS7DoGPJ0uRXv7Y6CqjgwGd2ZSffkeep4RjHNVBDX5B9A2vN6oIdF+BxvbJeBL7ohe/L1OULNn5OoNpaKRLDQENVaC41897sGo9SscA3v06rqfwwgo1Ymv4RjeB0WxH48WvC3lR3CqHrEu9Tz70byDCVcWGHv+mxJe5BMrT7cleSanO0NDReYZe6rV5Nsts6oseOVnP8ZYNyK9wG4ae5PS8PnClG85NqhQaFOnvWAhQYM1yJlzDuCrfLG16OyztPasLfAG7XReMZUzH/SKXRLbz28VCe3i5WMZc/1kYYRe+SRcuB0jyQse6f+7fE2k7hB9UZbosoGGR/kRFAxboJYH4H/WU9FCZHTEaPZDKH92PcGqan2DraWxiY9Wz9a8pZuC45kN45Ig9pdCXky4LNQT7UY7JkcKIh4YlwmG6p2d67oG7euAGnPO/wZRymoZA+vMTEgIwAWRCRy9d3UyuRqNoRExjQ0+gAOLmH9FBTnLFUZDyc1WMJ2zU/axzbuh1PM8RMCm4kRjieUvaw98CoiFca6S9gBNA6k7gDYP5b5RRf/Inwz69/A9JEZoICmVuZHN0cmVhbQplbmRvYmoKMjMwIDAgb2JqCjw8CiAgL1Jlc291cmNlcyAzIDAgUgogIC9UeXBlIC9QYWdlCiAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAvQ3JvcEJveCBbMCAwIDYxMiA3OTJdCiAgL0JsZWVkQm94IFswIDAgNjEyIDc5Ml0KICAvVHJpbUJveCBbMCAwIDYxMiA3OTJdCiAgL1BhcmVudCAxIDAgUgogIC9Db250ZW50cyAyMzEgMCBSCj4+CgplbmRvYmoKMjMyIDAgb2JqCjM1MTMKZW5kb2JqCjIzNCAwIG9iago8PAogIC9OYW1lIC9JbTExCiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDIzNiAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAxMjQxCiAgL0hlaWdodCAyNjUKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgL0RldmljZUdyYXkKPj4Kc3RyZWFtCnic7cEBDQAAAMKg/qlvDjegAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4MgA2MvnUQplbmRzdHJlYW0KZW5kb2JqCjIzNSAwIG9iago8PAogIC9OYW1lIC9JbTEyCiAgL1R5cGUgL1hPYmplY3QKICAvTGVuZ3RoIDIzNyAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQogIC9TdWJ0eXBlIC9JbWFnZQogIC9XaWR0aCAxMjQxCiAgL0hlaWdodCAyNjUKICAvQml0c1BlckNvbXBvbmVudCA4CiAgL0NvbG9yU3BhY2UgWy9JQ0NCYXNlZCA1IDAgUl0KICAvU01hc2sgMjM0IDAgUgo+PgpzdHJlYW0KeJzt3durJddhJ+Dzt+TdCfT5B5InP+RtGJC6henuBz3Nw4CfFHSBBoNkMS8jDE7SDhbIDCjmyJLdbYGN21YcZTDjmO7ILQeCMdNxbD/JbmXOVWprqmrXZVXVqsuu2ufsvc/+PgyuU5e1Vq29S71+Z1XV+ewzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2CU///Kf7eW+8PZF1vhnX/752N3H7roq3VW+/YVlmn6OkoZc0McFAACwckESvagsukwUXUP0661yI6Jo3oGiKAAAsKWKVPOFL1zkvOh4omiEKAoAAGy1KtS83c6i5ezl27F7eMsD8oVIQqu21LbVZ0XLclp3CtcmbBf7l0mwLHpRSuPHRk2Nllf1t5oeqbIujKJl51VHZZU0fhzuyr7OKvvnC8H2gDwKAABsm3B6rZ1FG7msEX7ejkajMkTFDs6PjEbRSDmdUbSx65/VayrOoL1vPG+Gx02Jor2tGa5yoLOap9F1tgAAAFuiY3qysbkZIfMfi4hUxLX853pKKzbWDo1H0UZoq20tI2Gxc70J9R8bU5a1c6nPWjZCde3HETfo1ptallr/sTHBG+vK3s5q9XP73AAAALZI8/VBzSzafr1QuEdXcg3mM2P3mb49lIBjW7uaGP0x27ljGjLcVrWuXsyyUbSRIBs/1qJotCv7O6vnzmlRFAAA2D4daS0+k9he005s1ZpIVgpWzY6iI37sOrl2/a0mLBtFO7orFkWjXdnfWaIoAABwmXQm0ea9sps3Kzo+ikYD5fqiqFlRAABgt8WzWvSBzwt5VrQ3isZuwR34sd7YWjmjomhH0JsXRWc8Kxp9tfFa/6QMAADAsrrSTBgo4/OmjejZUCam2Oa+N+j2R9Fil2UmSYfeoDsQRVsBsFXFlCga7cq+zuqJovUyAAAANl1jzjAQZNHIH8OM3WFa5ahmacv9XdHo1rCQJaNoZwMGomijytgpTb9BN9qVfZ0Vn6T9eWcxAAAA263/PtDe+1ipc0stAADAOKLoyoiiAAAA44iiKyOKAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwe34HjOA6AgCAOQyhYQJRFAAA5jCEhglEUQAAmMMQGiYQRQEAYA5DaJhAFAUAgDkMoWECURQAAOYwhIYJRFEAAJhj6SH0d299/vPP3v7ZMnX87Pazn7/13akthA00MYqu/VqYcP32W/sZAQCwnZaMotm489at4bGnASqX2oZG0YHyR1+/F9SeDSsWAIALtFwUXYwAx4wDjRW51LYyio6/fi+mPZtWLAAAF2ipKFoOAL97q36TX7ohV2xfyPYKx43VnkUB2dbbxeqq2LKM1d5PCKswO4rWv/fJup8Fy/kOz96+XVwFZfCKXkHP3rpVXoHdl0zH9RutaJnaF5sjF3L9vwPDp/y74JDwvxj9xfpvBQDAVlomigYD2NpYNh0IVgPYYFwaDia/29izXMyGo3lh1fauumAjrCSKht/7IK5VS8HlUKWw6BXUvAAjuq6paEVL1d59IdfaM+qUq94JuqG3WP+tAADYSktE0a74GR3+RaNodABZDTo7QitsntXMirZ+WdN1teQ/LHEFtXRdv9GKlqu9bG98qrRZdtfy+LNr7um/FQAA22d0FA3uwS21RqD13VujztZcTHP82RphNm/fg81wwVE0v3aWu4KaFUev33hFE2ofnac7l5ttjN7eH+kb/60AANhGyw+hwzXFXXtzZ0V7B9ImPdg8GzYrOhRFe67fVc6Kzo+ircaPiqIF/60AANgeI4fQ0SFeMRhtPCs67rbb6GNf0Zv9DC/ZPBcTRVsPSY65giJPS/Zev51PYy5X++CFvFT6Hl+s/1YAAGyncUPojreB1Met7Rdf5j82B5Mdb+BsLHsrJhvsgmZFb91qXgP9V1B43VX6r99oRcvXHj+hsD2Dp/y7yNtxh4v13woAgK00dggNBCZG0SV0Pva5aoP3xQIAwOqJojCBKAoAAHOIojCBKAoAAHOIojDB+UdRAAC4zAyhYQJRFAAA5jCEhglEUQAAmMMQGiYQRQEAYA5DaJhAFAUAgDkaQ+hDYIT+KLru1gEAwKYzhIYJRFEAAJjDEBomEEUBAGAOQ2iYQBQFAIA5DKFhAlEUAADmMISGCURRAACYwxAaJhBFAQBgDkNomEAUBQCAOUYOoX8KO2PChSOKAgDAUsZH0f6xN1wOoigAAFyAkUPoRRT9CC41URQAAC6GKAolURQAAC6GKAolURSAqANmWPenB2woURRKoigAUUme+r9MIooCXURRKImiAESJopOJokAXURRKoigAUaLoZKIo0EUUvRAPvvrUfuGprz4YsfuIvVZzFAFRFIAoUXQyURTosvoo+tsH//APD357zpFhq6Q59OrXf5V38Xsv7u8/d7f/iA++du3a1z5Ytp5pRxEQRQGIEkUnE0WBLiuOor998MZ///P9//I//vH8U8PWuPtX+9de/+Xx4/zHw7P3Xrr6t9nkZTlX2pzMTEPl83+12FjE1mpitQyyjVVFFE1XD4VdokRRgPV48PKVvetv9a8Zv3VKfQNE0clEUaDLKqPoIocm/uv//N8XEhy2woO/vXrt6//6OFhzePYkDaYPvvr0/ovv5ROlT9fCaBIq9/df+GGy6VevX81iZbJzPrH63kv7z2c58+5zxVxrvtMiit597umv/fKzs8OLPctLQhQFWI9/+fL+3s1v9a8Zv3VKfQMuPIq+/tTen77wo80sbTmi6Pq8dX3vyssPxqyE9VhZFC1zqChaF942m6THahbz3ef3X/pBlhgPf5DEy3frx+TbHv/r16+lc6iPj5/88mtP50dnk6pBxE02ptkzC7BphD1+3GwE44iiAOftp1/63N7e577U+G9tXxRNRs7XX375yl6qGELX9k92WAjmOR/kB9TXFnteuXFjcfzo2dERUTSJe5WnXp8Z4C59FA0DUfq5dKejmdGp/Ho0vgzT6trgHJeeaHp+xf8fDkXRDT4XdsbKouidF/+ifDGPKBp4/P0X96/+9WLO8/Asn9d84XsfffS9F7L/SwWLmTRU5ivyJJuG2Od/mB+dRdv2k6Hpmtffe/3q095dNJUoCnCO3ry6d/XNo28+s7f3zDf/OUmkQSDti6LfuplEiP1XPzw7O/v2zXyQHeyfjKcXG9Ot+ci6Wnf24av7wbg8X/tOWmR6/NHJ6dnp8Yi2j4uiRdz70Qt/ujcz++1QFD3nRBQUn/2CoreuS5bORFE23cqi6OH/e/i//ttfiKJth//2+rXwBty7z+9nOfMXf3etuNX2+f1rf/eL4JBsfjPb9uCvr+6/+P3HaVhdTJOmR2cRNIy4SVB96qsPsnD6i+MfNm/3ZTRRFOD8vHltr+Ha3xfbhqLozXdOjpLF44ev7u9/+UFtzvRGsfHwOEmY+6+kQ+vjJGAu1h0evX0zsmdSzspv0K3HvXSOdDE1Gq4vl7OF19PEGuwWTqlmO7yQr6vKDadey92ahY8uLditmMbt2nO6/ijampeuJjGL1fXo9HIxs12FqPYhkYqCfRd7tWdLg6n01j6txjSqaE+8NqZ9i+Vw38WuYbX1meJG22LFlR3Y3YZmjy2Obp8srMHKouhHv//45DBPo6JoTXr/7A+fL+eM9194L3uU8/HxL1+/Wqx5UrupNg2VL72wuB/3xffSndN7eDPPv5AsZHfzHp796utX94MC8nnSw7PWs6eMJIoCnJ+T03RC8uCZdOz7zEG6fHpSbBuIovuvfrBYmwbLG98Ktj4ID/wgDar/kv8QDM3be1YBdaSlo2iVRbuiaJj0smnUPA3+6IWnkvXZDlVIzZbSvYKiOqPouNLC4tLFIBFX22ffaNwfRd96+Uot2AWBq8qoYRQN41u11DqkVdGD8MfWTpG6BhvTIb5nsdwIlOmO4arykEjVwcmlu125Xh3Tezphqm73p1lR1mx1UfSjKo0+9ZX/cxG5YZssbs1dKF8plGbU+ppqw5OzsyfhtqKA5F/ucl15/GJFelSWaJN9n3hedApRFOBcZQ+KPnOQxtH646JpNMymO0tJ2MwDaBpFi4D5IF9bRtFapvzWjXzPdNh9453yBt32ng/O4bVFy0bRYOdaxmyXViyHEXNgt5GllYWVP3RNs07XHUWbs5v1LFn+EI1OYbhrH9KoqCuKhjOJrSoGGtNxOtGiaq1tTwKXK3pPKuyG6289ePl6rJYRbRBF2SQrjaIfZWn00z8+OfvPcw8NsHqiKMA5evNqNh96enJyms2NXn2z2pbeXLt3oxyjp8Pv/Vd/nt1Nmz0rutj01o18bTVnmh5YPHNYbM2C5juLR0DTPRcht77n3iZF0WqmMlpasNy48Ta628jSaq9Z6i1wnt4bdOsvLKrdZFreOdobReOHtCsKfyyLbU9HdtxJG2lMo4reojqKrQXM4ZPK5z/L/8vvb66euB3ZBlGUDbLqKApbTBQFOEfZHbqLm3KDxdzxafZSosL+qx8WT3ums6I3b17JVz/M1gY39B6flsfd/PbimKOT9FnQfHboxs397J7edM8P89VXbt48lzfoLvmsaG1WdFwUDbenhwxOd3aXFkmsI+pd3sBrixoRqu8O264o2v8JdjwrGp2ObGbGwdt923sORdHGUdFjO04qC6HlDbn5T0ESHdkGUZQNIopCSRQFWKPj7GHShSKHHubPij48ra2uvfm2PK56F+7RSbkuUW4oVpcrL+INulUyDFY3Ul706c5IeKw9XZr+EC18XGn1G3kX+/U8fBo8VdpenBFFa2G09ixl6x7UaLCKHhKvqPYG3cYzmsHjqEWi629MIF5U/XHWImNWB+cTmkGN9WPbJ5UecaX63Un2yOiV/KfO0+mPorWT9foiLp4oCiVRFGDzhM+Krs2svyv6evlC2hfis6KNwzvfRxRW0bxlNyh8ZGn13fJ1a4ii+Q2pQTAtZrTLNf3zjO1DGhXFb9+t3iF7/fr1MKFWO/Y0piZaVPA47Mu1Ny812lquC4+NnlQjL9YnT2Nt6I+i4cmKoqyHKAolURRg8wR/mWV9RkRR4jqiKG3umGXniKJQEkUBiBJFJxNF+y3+pstiSRJl14iiUBJFAYgSRScTRfs1XqkLO2XkEPr7sBtEUQDaRNHJRFGgiyE0TCCKAuwUUXQyURToYggNE4iiADvlgBnW/ekBG8oQGiYQRQEAYA5DaJhAFAUAgDkMoWECURQAAOYwhIYJRFEAAJjDEBomEEUBAGAOQ2iYQBQFAIA5DKFhAlEUAADmMISGCURRgN3xk5/85EewOuv+RsOm6B9RAxOs+7IGYJWSKPqHP/zh8ePHH2f+EyZJvkK///3vk6/Tur/RsCnWPWaHS2jdlzUAq5RkhyREJFEiWT46OjqGJSVfm+TLs0ijoiiU1j1mh0to3Zc1AKuUZIePP/44WTg5OTk7O/sElpF8Z05PT5Mvz2GWRkVRKK17zA6X0LovawBWaRFFj46Okkzx6aefPnny5I+wjOQ7k6TR5CskikJo3WN2uITWfVkDsEpJdkgSxPHx8SeffLLIoev+d4Ytk3xnzs7Okq+QKAqhdV+acAmt+7IGYJXCKCqHMkHytUm+PKIoNKz70oRLaN2XNcBGeuv6XunKyw969nzw8pW9629Nr2nu8Q2iKDOJohC17ksTLqF1X9YAGycNh3s3v32W+/bN3jT6L1/e37v5rem1zT2+QRRlJlEUotZ9acIltO7LGmDTvHVjb//VD0+Pi5+PTz98dX/vxmLiMoupC/lUZi1KlpOpxTxnsv+Vl19urg32vHLjRnl8u/D08OvXr2Qrxk2fiqLMJIpC1LovTbiE1n1ZA6zNT7/0ub29z33pp/W1WRL9+VG46ujk9CyLpkl+TFJqNleaxtMsGAZRtNxcbsy2Fsd8+2Y5u1oV9M7NJGdmx3cVvnfznfQvbByXreglijKTKApR67404RJa92UNsA5vXt27+ubRN5/Z23vmm/+cJNIgkH7r5t7Nt4/ihx0nYfBkse3o7ZuLBFlF0SrEHp0kCfNGGVTfWRzzQTq5WuxZrDx++Gp+fGfh7wzmz4AoykyLKHpyciKKQmjdlyZcQuu+rAHW4M1rew3X/r7YlgTG/S/3vKcoeKFRI4p+62atyKyU8PbdcvlBeE9vGTv7Cx9LFGUmURSi1n1pwiW07ssaYA1OTtPbYA+eSSPfMwfp8ulJsS2Nhvuv1LJo+ZRmmhRvvFPeQ9uOotXLjs4WU5zRKFpLn2Uu7S98LFGUmURRiFr3pQmX0Lova4D1yB4UfeYgjaONx0WzW2aDFwSlEXH/1YfHeWrMb5dNQ2Jj3vP4nfJh0OSYxVI0itb2vJHPgA4UPpYoykyeFYWodV+acAmt+7IGWIc3r2bzoacnJ6fZ3OjVN4ON6fuBvh3cbJu+T/dk8QhollLzN9/eXDz5GaTF49PysCS7ZofEo2j+Vt6snJs3F2uHCh/5B0hFUWYSRSGqcaX8Dhih/1+cdV/WAOuQ3aG7uCk3WAwcnzbutF04OinWnyayF9rWXmxbHla+gCjYWtuzKKksZ7Bwb9DlQoiiENW4UtY9wIft0P8vzrovawBWqYyiSaIVRVlW8p158uSJKAptjYtl3QN82A79/+is+7IGYJUWUfTo6Oj09DTJFH+EZSTfmU8//fTs7Cz5Cn388ceiKJREUZhAFAXYHYsomiycnJykt/menX0Cy0i+M8mXJ/kKiaIQEkVhAlEUYHck2eHx48eLNHp0dHR8eZ1sgHX3wblIvjbJlyf5CiVfJFEUSqIoTCCKAuyOJDv8/ve/X6RRmODjTPIV+sMf/iCKQkkUhQlEUYDd8RNYqXV/o2FTjI2iP7v97Odrnr39s9WP79Nabn13tXvCORBFAQBgjmWiaBj9vnvrnNJoD/GTjSGKAgDAHFOj6CKMXmwwFEXZGKIoAADMMT2Kplm0nBdNc2km2KdcF06fBjf65rsma569devZbEVVS7r29u2w1LK4rLSwPVWZRUXZ1tvF6ouevWUHiKIAADDHjCharqoFyCL4BUG1WgxmUmtHt1bm8XKxXNwM3Iyf1dZ8bbmYHd2uE1ZFFAUAgDlWEEVrm8rYGUuA4TxqrZjabOZ360vVD9EoGq09XiasjCgKAABzrOAG3ebLddt37bbnTDtK7oiieVXRPWvxNpaORVHOgSgKAABzTI+itbthe7NeuWfnrOhAFJ00KyqKco5EUQAAmGNqFA3/mEuwrZYQg2dF2891ljt0R9Hm057x2267nhUVRTlHoigAAMyxTBStaU+RNt9WO/4Nul2zordutV+M+/kqlg68QVcU5fyIogC7aX+cdTcTYAuMjaIXTYBko4miALspiZn9/wQkRFGAMURRmEAUBdhNoijAqoiiMIEoCrCbRFGAVdnUKAobTRSFy+bff/zGa9/5oH/NEgdPK2dWPdXWFda4EiObfWE15jvklq1bFAVYFVEUJhBF4bL59T++8dqdn/evWeLgaeUMOTo5PTs9HmxF/24Xb2SzV2igzA++89prdz48S/32/Tdee+PH/75E2aIowKqIojCBKAqXTV8UTZLLd36cT6OFsSVNNNm679wpD25OtxX75JNvjR8bmluTnxf15bN84WRfuW+75HB69I0f/zhSZdXy77zRCmKRGcNoDwx1S3l0X3vCnWub0xI/CJZ7Cu8rs91RyZo7r33j/d8ssvHRycO7r91ZZmJUFAVYFVEUJhBF4bLpi6I/v5PGofd/e3Z29uGdWk7M1p09TLdnu1brsum2ZM/j09++/43X7n6YTQuWm/ONde2tx6dJfclSsuXOh0kBtXQcTOulOwcVlbulC0WDPrxbJrp6y9/4x19HWxG2MtoDQ92SrFzU2NeesH+yzXceFlWHy83Cq3UDZbY7Ku2qs9OTo/x8kyj7jff/Y4lviigKsCqiKEwgisJlMxRF7z7Mwsvxb97/xiJffXCnWJetXOwahJyjJOaV+SvPj9lsXLo5NhcX3ZoU/UYW+LJJvFqT8mBZ3f1aS3zlQtHI/0jb+MFhu+WNKBo7hXgPDHbLwzz99renOqlkqZitPEoKLJcfFicb66KBMmMdFfT5d7K+LXPpGKIowKoYQsMEoihcNgNRtJw4y+LZB4ubTsv9q8x2GN4Q2oyi2TRipXFnbHxrmsmK/BUUlU78vdEoJx5Fi3aVy7VpwGRtI4rGTiHaA8Pd8h95zu1vTy2Klo0Jl9M4mS3HumigzFhH5bK2fhhMkI4jigKsiiE0TCCKwmVTTb0Vsjm6LGmVUeiwCnK19FkGsOx9OA/z+0G/EYmidxc3i2YaGSi+Nb3B9O6d4GbUotJ0ku+s+z7Y7uhXRsl8bfsG3dYpRHtguFs+yHdYZRRtddFAmbGOqj60uw+Xf7uTKAqwKobQMIEoCpdOejtp8PxmGlTeyCcjs8m48uVA+dry9tN8EjFNPmG6SdNQY9qufkjzdUGxrek7ed7/zelv3n+jXlR4eBnURkbRZsvrUTR6CvEeGOyW4nbalUXRWBf1lxntqIWp7xkWRQFWxRAaJhBF4fI5Ps3evlPe/fn+b4tpy/RO1Lt38lfFlk8WVrd+vnHn7mL68OjkN9XdoHfuLB5czG6xfS1/tVBZQ+QJxdbWbLI1fQzy6GQxZ1smrGDX9M+SLBpaVjQQRYOj77zffFY0egrxHujqlrJpRcMGZmnL/hmMorEO7C8z2lEL2at3l/krLrn9cZYvGGDnGELDBKIoXErHp9HbZ9Mo9P5vTlt31Ra3fp4m8gm28m7QYOVi3WJ7WUP0CcXG1mDebvEyofqKsqXF1F5RUblbOPFXmwQsjv5Nmt0e1lsSO4VoD3R1S3UWzarj7Sn7J1koywmXwzfetjpwoMxoR7VqAGAdDKFhAlEUdknjzs5tF/zd0Gzud8RNqtEeuGTdAsBFM4SGCURR2CW1v0O5/appz47J2bZoD1yybgHgohlCwwSiKAAAzGEIDROIogAAMIchNEwgigIAwByG0DCBKAoAAHMYQsMEoigAAMxhCA0TiKIAADCHITRMIIoCAMAchtAwgSgKAABzGELDBKIoAADMMXYI/eje7VcO7vevGb912Pjj4y1L3D44yLfMbczyYjXeP1iyEStsdllUvMzW2saKpOml2/ceLdfm4uPoPW66i/9wM6IoAADMcQmj6LJNPQ8riaIrNNADfZuzJFltTFNpT6q8+M4XRQEAYAutIoqmGeveYuqrTCm1/ctJtaCEfK6ssbbYs5rR7Dg8vme48+1796NTgdHSyjbdvnevKDg5k/vBcqOccLmaNCw7JFJF2k0HB52n3G5POJVZtauVu6tgWPzQ7tv4rGhXHzY+3EbyDIroqaj9cTyKnWza5LT2bM1Q/0dq7Pk0z5coCgAAc6woioZRoxl5qjATW+rc85VmFmqEv/aezYbF8le0tPDIfOUi8lTLrRxXT+LNHNYxK9quu689tXojPVfsFPRknt9afdvbFX192E6itRPqrqhdVPTzr825DvX/yBovhCgKAABzrCqKhrNcxcRcM6l1BJtyh3DPaBbq37PVsEhaiZYWHlluDZeLozqjaOukhm7QLZZ72zMQgZuNrk2QNuqJd8WIPhx7V3GrokhXxL4Jtf2H+n9kjRdCFAXYPfV/j2b+UnTkg05r+meu0/k+nzWjzGV3O7+OvbiH1JYpbNO+URf96F+rnOBGuyk32I3r2HU+nTdoM74bK4qi1X+Z8z6Pn1QtLQXvwomcfhDWQu380vqUB6Joq7TakROiaPhljt6fXLaz1Uv97RkXRYuWjuvbji9bXx/2vm+o/0PsPIvIrywOh/t/ZI0XQhQF2Dn3DxL1Z0bO7V+iDckLy9r8rti1KNoudUO+WstG0ZXX26wunFlbSYF5oRvQ10O2Ioq2Z6aqrBBuGjkrGnzcA/N00c9wzqxoTw9PjaLtThr4No6bdBwZRRdNvR9+HK2+nTwr2vesaG9F8aJmzoqOq/FCiKIAO2bxD1Pwe+WBf4mabzNojhHCo3peOlH/5XDsxRHhmx+it2k1Dom94iO+MnIWh33tCXd+NPz+h/gbJHrKbHdU40z7OyrSsQc9/RkfXTReghHr4dr3Ycw5tj/HsKhW4dVLNg6b9aWLRcMWX7h845gTb51iuDHyRZr0Ebc/r/aaaBdFezX9zvYP0Xu/wPHJnVgTOzt2RBRd6kUx7a21VpU/9Lx95fbt/maX35/md6PU+q9QUHnHlTXd+CF0/ZcFjXPre7Cz4wnB8CsRe5a0VWSYiuY/Kxq763NMFAreYFT+V7G9Y8e3MV83sj1jo2j+n4eOdyvVr9Cuqrv6MDzT8ix6PsTe33ENfBOW/lVAR40XQhQF2C3Fv0vV71WHhqCxAdFi4Nf5y+FqXXwwMzgiaowkgv1q1bVe8RFf2fsPd7Q99RMIF3uGQI2DusuMdVT4AfV21Mjdeody7dbHenjCOcZHZV2FR069qiXo6fymuXFfpEK0k6NfpEkfcawvR3009XqD8+2Loh1Hd122ze5YvmNjg//uZBQdw7YuumBIHPxXqP+C621293/BJn11Z1pqCB3G5vpvPPKAPf4Nuo/KX67UXt9arI6/QTc85+ie9arj341oaeWRAzeIls3OfitQfVivNE8w/PCriotfjER/3xj9TeaoKFr7xUC0b+NdMaIPG22sN7OvonhR3b+bWrL/G3811ht0AThX1T9L5VB97Ji2PraP/Oo4NqrrH8zE0ln9n862cs9wbuFROMkSWxn+C975y+3YysF/02NdNFBm7/B35KhpuD8jH1zz2P4e7i9t1OcYDSideSdIKOX49FFzunDsqHIwY4QXwPIfcdjmpT6aeF91zVaM6P94PK6f++SObXVWsNzbLbGzC6NlPYnGzmtks6Mtn/LVnWsVQ+jVBWPYEqIowC6pfhVa/UJ1IIqGwl/Ux35pH/ymtXOKrWsMWftVdGQ81vqFeW3YFhseFyujvy5eZRRtddFAmbGOqn1EK4misQ+ur4NbPdxf2uA5ttJIR+GNJhzkE+75Dt3Ja9QER+T0W1+kSR9x+4MY+dH0f+fHf5pjf4M0r2Or46PX2shuCc6uFkmHvldjmj1wCqO/urOJojCBKAqwQ+oZpJnU4mPayDgtvz+qHMhH574i98GOn01rD6SLzfH5jnBwG13ZPf20gigaDUEDMa3ZUe1j50bR7gF2x+8cmj3cX9qoz7HKLN2FN9uRPjdZzn/da33NxkfRsNDgpuHWF2nSRxwrvTrv9n2rA706OCva3f/tc48FmokdGx7ebNZgt7TOblF17bUwvd+rMc0eOIXxX925DKFhAlEUYHc8WozpSoth2tAQNPKwWzi1EY5M26P40QmiHhe6Z1gelROy9zvexxGZNY2fxWqiaG/h0TKjHdU+2VlRNNq+WIcuFqM93F/aqM+x/ruOjsJr7lcP+z66Fzy5tGwU7f82hi2Z9hE3mlxVXpU7+BuJWrtaNwNnK0f0f/Pc682Z2bHtQsd+x+JbF1X3dXGj9sFmD53C+K/uTIbQMIEoCrAzmkk0H5zd75+oul9/F0RrkFdfUb/18bAaPw4niOLo8m2i9aYXrSjfsXA/8oqP+MqwaX3RoJ5AX6neoNubU1pdNFhmtKPCUx0z69fq2K7+jN/y19wa6eH+0jrrLUoK3uAxVHjjtILfIPR041CgiHZy7Is06SPurKvx0pPe71v1nT/of51LX/9Xp9T1lRrXsYOzoku9KKa2NSgtbEb/eY1s9mHsu1GLreO+urMzqSE0TCCKArBZxo4Jo89VediKbeR7u/UMoWECURSADRBO7Ywck4uiXBq+t1tvqSH0o8adH8vOyTaPh20ligIAwBxLDKFXESSFUS4HURQAAOYYP4SOvNW3/7ns6lHkxvupVvPCJVgjURQAAOYYPYTu//sy7Zf/Vvu33y4si7LtRFEAAJhj7BA6emdt34t8O58jdo8ul4AoCgAAc4wdQkeTZRhF41sjr3QTRbkERFEAAJjj3GZFA/UYK4pyCYiiAAAwx+gh9OhnRReLYfysR1HPinIJiKIAADDH+CF05D1EvW/QrV6gG32D7rJ/kxQ2iSgKAABzLDGE9ndFoSCKAgDAHEsNoecGSUGUy0IUBQCAOQyhYQJRFAAA5jCEhglEUQAAmMMQGiYQRQEAYA5DaJhAFAUAgDkMoWECURQAAOYwhIYJRFEAAJjDEBomEEUBAGAOQ2iYQBQFAIA5DKFhAlEUAADmMISGCURRAACYY+wQ+tG9268c3C+WErfvPerfb6zlj+g77P7BK6WOJs6rd8bxc2scUWC5pr+uJVrS2nXlZ7F8EzaBKAoAAHMsHUUHcsGFxYZIRVlIrtalqbQnjV58FF25nii67IHjdxVFM6IoAADMsWQULScdGxmvWH/74KCKDeXOQY6oZi2LlWHIzQ4vNsUOj1dUbmq0Ksgw+VxuUFwt4LTqShtz717PCYQNiBZeO5dWje1+CHfrr7qnf6K/MWjWNaKcnn7OSj4Ybt7ID7Qh2efgXt6dxafZ/0lF+7+zh8e0YRRRFAAA5ljJrGgVArORfhk8FiuDI9Kg0QyCtZJrkaN1eLyiViPagm2xE4nUlTWmqqs4OtaArsJb3VSVHuuH2m5DVbe7plFFf139597fz0PNa/Rh/wfaktW32C9dHPFJRfu/o4fHtWEUURQAAOZYRRSthv3B5jAZljvE4mK85K7D2xXFWtGn2K8WW1p1hcXHAk5Hmokd3j7T3tg8ouri8LFRtLvPJ/RzZ/N6+zBeUVuZPw/z6eFHg61tHN7TwyPbMIooCrA7fsrGW/d3BJhiBVG0vqYY4ofvD2rcbNleE00urcPjFQXN6H1PUVBiO6z11tVx7o1w2FF4R0e1+6Fzt3aB7YzWOra/rvHnHu3neBTtL6fj+xD5lKpNedX9tUT7P97DI9swiigKsDuSpNP/n33WSxSFLdW4ljv3mzIr2jvr1L5Xsplceua8ou3oeVY0mGvrvYU1cmjnniML7yhzTKs7q15qVjRWV/+5T5wV7T/fkbOQYXdEZ0WjrY3djBspcu5MaKj/38QVVQLARlhE0Y/YSKIobK9VRNGBZ0WrpcYNkn1RNHZ4/zOMrQc075dv0G2mp2aOG3gMs2vPVxpzdvHCI30Y7Yf2bj1Vj39WtL/PJ/Tz1OZFK2qJfYGW+6SytR09PK4No4iiALtDFN1koihsr5VE0epuyPgbdAdvpIyWHDm8o6LDyEH144K7NYsD47ePxt7a2rw5ttmAocJbfRjth9huHY1sNCYoIdaZsbrCA5fs5+HmRd98O2aHxT75W3eH3qBbtTbS/509HD3ZKURRgN0him4yURS2lyE0a3T/IBJFZ4bEiyGKAuwOUXSTiaKwvQyhWZ9H9+513uu94URRgN0him4yURS2lyE0TCCKAuwOUXSTiaKwvQyhYQJRFGB3iKKbbG4UffjFz/7mT/L/vfmV49V9bWp+/ZU//s0XT8+pcNhahtAwgSgKsDt6oujd5/YrT331wTlGrkVVz909xypyD776VO/ZnF9LppQ8J4oe/9NffhYkxNN3zy2NiqIQYwgNE4iiALujJ4oenn322Xsvpfnppfc+e3L8eCWBLO57L6TVvPC9c6wi9/j4SXK+3Wdzfi2ZUnIsir51fW/h+luLFQ9evnLl+vUrwZrU3U//5i8/+XV44MNP3vyTTx9mi2l4zGdLqzVvfuWTd+sr83IWK8vSyjVF/BRFIcYQGiYQRQF2x8ANumF+yicUn3oqnyh97m45b7qYZVzs0JpIDVfn68q5ybSE554Lp1/DecN6gbVjG2vHV11OTi4WytPJNt9ttGTwlD+qH7NYOabk2HFjomgSRK+8/KC2lETRegpNPfxi9xxokFLLFJmF0z/+08P6sUF6LVaevpvvls66vnu3VggQOOch9KN7t9f9QtSBv4jae8h5NOMCtOtaVe2tclb8Afe2cwO+TBVRFGB3LBFFP/jatfSHF3/42We/ej1bfP4HnxUTp391t9jh2uu/KnZ4OklYi8T10nvlns9Ve159Oiv9B2fl5Gvi7LCsfTGFmarKi9cyvuryjBYL177+y+AUDhstGTzlLKtm1eZr03pHlPyLLOPmB3bP0raiaJI/y9BZZNE0ijaTaJoc37074vNPYmkZRVuznJGMGU62xo4FCqJo3yHn0YwLIIqeP1EUYHcsHUWv/d0vaovBLvnar32QhMjvv5gFt3fvPp8FsB+k+fLwB1kae/5umGqz7Nl582p9tjMrOlbLElU3ouiL339cO8t6S4ZO+cFfX91vSBozouS8A3qnRCNRtJY60xtzO6NodsNtz5Ohp8W9uJ/1R9FmIeXducFdu6IoxIweQmc54N7BK5k0EdwPlstdXskVcaJMD9m2fNfiyGjoKDeGZbSX04IPDm6Xu3WVGazPjj1o79dsdqSoZFX+QxWHWrtF2xn235jaa3Gr/KG3x0a0v96erh1ip11bFzkwOa74odyatXnMBzTQ8uYhQV3rJ4oC7I7lo2gjDsajaLm2FsDKH8Jc16ymmUMXU4fZnGJ33eOrbi8MR9GhaovJzXaw7io5ne9dTJMudLzNaPqsaN+zommcDB4aXXZWtJU6RVGIWSaKFplgkSCq5TI4FCGqWpmHqWBbtRybAatlvlYVjSnOWrjqLLN+SJUjW0t986f3D8rdy3DYLGA4io6pPciixeJQj41of7AmVlr0sxv6LOK9XBQ2/AENtLz3rNdPFAXYHecURcsZyWo6MlhZO747ir77fDkV+uBvr0bqjhY4UPVKo2g+A5vdqxvttM6SP1q8Fqq48bfjbUatKNr1rGg7ina/QbeZOlszm9Vy401H6cryWdHqkVJRFGKWmxV91F4OU2apTDHpnrdvh3s0Uml7ErNVWmcUbQedWJnRQ+Lxpjg2sjWPoEESbdU+YlZ0TO3hRHI9iUZ7bFz7o78xiJdWrhz6LPrXj/+A4i0ff9brIYoC7I4l/pjLyChaeum99LHPw7P8KcvMtdd/la5sRtHDf6v2qSYIi+crE09fbdTdqGV81QNRtN6SwVNO4mRYx+Ju2xElfzW88Thv2agoGn+DbiyKpjr+rmiWUhcrv/jpImzGo+hh7xt0W+8+AgKrjaLVHZ3BLFp6X290l/JmzkY9jU2jomh3mSOiaLPZ8bnVpNgiidZ2KHpjahSN1J6W1747t6PHxrS/FvHipbU+u6HPot09Xec7vtIR7dwQoijA7hj4Yy6lJ8ePg7+DEv5JlMVuQcAsblct4lX18qHy/TytP6kS7BOmsrIJT56UB0RrGV912dyq3eFivSWDp9yoY7HDiJKPw4O6/7TMZzP+riiwXqOH0INRNM0OsRs6a7FqiRmu/htfm0mnu8yBKBprdixwpQ8qHhzEzmLOrGh3p90PH0rtnwkd0f7YbbcDhTS2998sOzwrOq7SgXZukFb6HHkdAbB9Bm7QXUpzrvN8RGu5mKovnCgK22tlUbQZteo3mQaHRB+UPKwX1rVf9QBia2Kxs8z+KBptdjRwVSfVVWOsne1mDNZezEb29kRXsR3tjz6i2Rn2Y/cFDzy3GWxYLA5+QEMt7zvrDSCKAuyOVUbR1lznuYjWcjFVXzhRFLbX6mZFw9s501enhjebFpsb916OuNf0sFZy9g7f6MRfT5mP8rcsdcxadjT7ldbrah/VX+Aaf51ss521VoysvRl7+3tsVPvjt8vGXn4cNCP2WUR7JlbsiA9oqOV9Z712oijA7lhlFGXVRFHYXobQYz3apD8lwrqJogC7QxTdZKIobC9D6DEeBX+JBQ5FUYBdIopuMlEUtpchNEwgigLsDlF0k4misL0MoWECURRgd4iim0wUhe1lCA0TiKIAu+P7bDZRFLaUITRMIIoCAMAcax5Cd/6dypUeAqsmigIAwByG0DCBKAoAAHOMHkLfP3jl4F76N01eqf9Zk2T9QjFT+eje7dsHB7cXa9If7t3Ld0kPux8sH9anOMuSwknP9srarGi09rLCoKBo4TCVKAoAAHMsE0WLAJku5oEuWVysqwJi9jc4w9wYrg+Ws6XqsDTq3j+sbYyvrG/OI22tHa2V8cJhOlEUAADmWCqK1qYe81BazpAWca8W9so9G8vFgbUoGk621ncLxdJrrMDBwmE6URQAAOZYJopWaa4IgdVtr9VdtxOjaDFt2rgBuL0yMqMaFB6Poh2Fw1SiKAAAzDEpioazoq27XSdH0WhV7ZVTZkWHCocliaIAADDHUjfotm937Xhac/ko2rjVN3r/b6v8gdr7C4cZRFEAAJhjqVnRxYtxO96g27qBNv9h7KxocLNv7MW349+gG1seKgeWI4oCAMAck27QhV0nigIAwByiKEwgigIAwByG0DCBKAoAAHMYQsME/VEUAABYyroH+LAd1n2lAgDApbLuAT5sh3VfqQAAcKmse4AP22HdVyoAAFwq6x7gw3ZY95UKAACXyroH+LAd1n2lAgDApbLuAT5sh3VfqQAAcKmse4AP22HdVyoAAFwq6x7gw3ZY95UKAACXyroH+LAd1n2lAgDApbLuAT5sh3VfqQAAcKmse4AP22HdVyoAAFwq6x7gw3ZY95UKAACXyroH+LAd1n2lAgDApbLuAT5sh3VfqQAAcKmse4AP22HdVyoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACr9/8BRwZvfgplbmRzdHJlYW0KZW5kb2JqCjIzNiAwIG9iagozNDIKZW5kb2JqCjIzNyAwIG9iagoxMjUxNAplbmRvYmoKMjM4IDAgb2JqCjw8CiAgL05hbWUgL0ltMTMKICAvVHlwZSAvWE9iamVjdAogIC9MZW5ndGggMjQwIDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgL1N1YnR5cGUgL0ltYWdlCiAgL1dpZHRoIDE5MTAKICAvSGVpZ2h0IDY4NwogIC9CaXRzUGVyQ29tcG9uZW50IDgKICAvQ29sb3JTcGFjZSAvRGV2aWNlR3JheQo+PgpzdHJlYW0KeJztwQEBAAAAgqD/q21IQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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NknesNlskoRg82CT5A2bzSZJCDYPNknesNlskoRg82CT5A1be7YpNMwXLly4dOlSJzw/A5gXOnn++OOPL1++3Il3ZxzRMG/QMM+CLTAhcfOGzWaTJASbB5skb9hsNklCsHmwSfKGzWaTJASbB5skb9hsNklCsHmwSfKGrT3bFBrmzoWPPvro0qVLly9fvgIwL3Ty3Al2J94f0DCn0DD7twUmJG7esNlskoRg82CT5A2bzSZJCDYPNknesNlskoRg82CT5A2bzSZJCDYPNknesLVna7thXltby0rmCxcuXIQqPpoR1I+TOzqR7gS7E+9OyGmYN2iYZ8EWmJC4ecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecPWnq3thvn999/PSmaAOSMbQZ14nzt3joZ5g4Z5FmyBCYmbN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2zt2dpumAE2CTTMNMz+bYEJiZs3bDabJCHYPNgkecNms0kSgs2DTZI3bDabJCHYPNgkecNms0kSgs2DTZI3bO3ZWm2YASAPDXO4rTnYygQmJG7esNlskoRg82CT5A2bzSZJCDYPNknesNlskoRg82CT5A2bzSZJCDYPNknesLVno2EGmBo0zOG25mArE5iQuHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnD1p6NhhlgatAwh9uag61MYELi5g2bzSZJCDYPNknesNlskoRg82CT5A2bzSZJCDYPNknesNlskoRg82CT5A1bezYaZoCpQcMcbmsOtjKBCYmbN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2zt2WiYAaYGDXO4rTnYygQmJG7esNlskoRg82CT5A2bzSZJCDYPNknesNlskoRg82CT5A2bzSZJCDYPNknesLVno2EGmBo0zOG25mArE5iQuHnDZrNJEoLNg02SN2w2myQh2DzYJHnDZrNJEoLNg02SN2w2myQh2DzYJHnD1p6NhhlgatAwh9uag61MYELi5g2bzSZJCDYPNknesNlskoRg82CT5A2bzSZJCDYPNknesNlskoRg82CT5A1bezYaZoCpQcMcbmsOtjKBCYmbN2w2myQh2DzY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Sj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRK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eImQhYg49PI/dAAAgBohZCEiIiELAACgRghZiIhIyAIAAKgRQhYiIr7EPVl+nP/rBM2QDNGQdBOgIjXmlCnNS4QsRMSh9yWeLujBOWFgiDRDMkRD0k2AihCyUghZiIhIyPLB1LqQIRmiIekmQEUIWSmELEREJGT5YGpdyJAM0ZB0E6AihKwUQhYiIhKyfDC1LmRIhmhIuglQEUJWCiELEREJWT6YWhcyJEM0JN0EqAghK4WQhYiIhCwfTK0LGZIhGpJuAlSEkJVCyEJEREKWD6bWhQzJEA1ON1977bXLLrvswAMP/LQH2bV27dodO3ZMfNsCAzLTxfe+972JbF69vP/++88999ymTZueeOIJme5WKarRaNTVqnh8b9asWbNmz549Z86cT33qU9/61rf0LvlSNsouOUAO8xVbY06Z0hCyEBGRkOVjcKbWA8uQDFHFbp566qmSKTZs2FC9JRdffPHpp5++fv36dW3WrFlzYRt5kWyRXQsXLpSc1Vv5//Vf/+UMRMLVV18dPjcwIMcff7y9USbqUzFn7dy588orrzzggANkTI466ijJHZ/4xCcWL148NjbWW4EDFbJOPvnkFStWrFy58jvf+Y69VzbKLjlADvMVW2NOmdIQshARkZDlY0gSRBWGZIiqdPPFF19cunSpJCzJPnv37q3YkqOPPvryyy+/4oorJEZdeuml55xzzhNPPPHMM8/IC5mry0bZJQcce+yxvZX/7LPPbt68+bnnnpMcIeVIprv55psfe+yxhx9+uHB1LDAgvoWPr3zlK1MrZ8n4HHrooSMjI9ddd126cdOmTXPnzpW09fOf/zymkA8//HBnm48++mg8H7J27dol2+WAmHJefvnlW2655a677tJLaVLmu+++22w2b7311u3bt/vO9b1Z8+fPP/HEE88///zTTjvN3isbZZccIIf5iq0xp0xpCFmIiFguZP35p4u/lGPxT/9ccErPtOra8GC/Si+mx6l1xSGa7F6XokL6eHBDNkLd/g5q36uErKuuumrdunWSfSQT3X777RVbIkntwgsvvKTNueeeK1Eo2X799ddLzpJMJDP2iy666NRTT61Y0ZlnninlLF68OP6UwIDIe+zbdfjhh/tz1iPfPj7l24/EN6U/yLRW2iEpw17Uu/fee88777wjjzxy27Zt4ULef//9k2bPvmD16nPOPXfpsmWS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VCS7z9WOfvLu/0bhwmcTkv35xMMUi3v//autTosJAAAcvcf3g6j9f+momF392aPaL/xMV673lVue7J12qvPKn38+8QNGceHiXzpqtLfanoUxIbVHi6v1S0cAADxWRxgTjpGl7l4CAIDTTkwAAAAiYgIAABA5HTEBAABYgpgAAABExAQAACAiJgAAABExAQAAiEQxYRcAADj1xAQAACAiJgAAABExAQAAiIgJAABAREwAAAAiYgIAABAREwAAgIiYAAAARMQEAAAgIiYAAAARMQEAAIiICQAAQERMAAAAImICAAAQERMAAICImAAAAETEBAAAICImAAAAETEBAACIiAkAAEBETAAAACJiAgAAEBETAACAiJgAAABExAQAACAiJgAAABExAWCYbn31yTM1T371VuvCLz0dFnj6paWq7rv4nZuXf/u3fuNMym/81m9fvnmn51YBeJzEBIBhyvvyZTSo/9WwREzIFz3TPya8demJJ37nBz9PhYE7P//B7zzxxKW3etUDwGMlJgAMUxQMyiCQTxTl83BQjQnzYYhmrCgzQv+Y8OKFMxdeXHEuABsjJgAMUz0mzMNBd0yorJUaYXjp6WzeUjcdiQkAJ5KYADBMjWcTpt36zphQyxatdyKJCQDDJyYADNO8x1/cKTTr1S+OCQsffF4hJoT/bSrKxQSA40hMABim6sBANSj0H03ortpoAsCgiQkAw1Tr8Rcd+/yv5ChD6tmE9sggJgAMn5gAMEypXzqqZILsj6eTv3RU+TWjliQgJgAMn5gAwFF669ITv3nhj1r+3YQ/uvCb/t0EgGNJTADgSPlXmAFOIjEBAACIiAkAAEBETAAAACJiAgAAEBETAACAiJgAAABExAQAACDSMya8DwAAnBpGEwAAgIiYAAAARMQEAAAgIiYAAAARMQEAAIiICQAAQERMAAAAImICAAAQERMABuzmzZuvw6m36QsRTiQxAWDAQky4d+/ezs7O/dzfwmkSzvy7d++Gq2DTFyKcSGICwICFDlLoKYX+UpgejUZjOB3C2R7O+SIpiAmwGjEBYMBCB+n+/fthYm9vb39//wGcAuFUn0wm4ZzfzZOCmACrERMABqyICaPRKHScHj58+P6AfArtDg4OQlIIZ76YACsTEwAGLHSQQjdpPB4/ePAgdJw23bVfp0fQLiSFEI3DmS8mwMqiy2rTzQFg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KQRONjEBANaqOoQzvM6zmACnhZgAAABExAQAACAiJgAAABExAQAAiIgJAABAREwAAAAiYgLAgP34lNn08QYYDjEBYMBCz/nRqSEmAKxR9B676eYAsE5FTLhzCogJAOslJgAMmJgAwGrEBIABExMAWI2YADBgYgIAqxETAAZMTABgNWICwID1iQkf/te33/5F6r/33//48XTx10FMAFgvMQFgwBbFhI9f/8sL/+N/+nt/L/3f//CP/p8/fv/x9fQPRUwAWC8xAWDAFsWEP/5fX6zkgu999os/uvQvv//3K0nhc9/8RXrN618695lv3krNufXNz5z70vXOkqygor50bbGWbTSJCQDrJSYADNiimPC9f1sdPvjz7z988OD/e/OfV2LCP/v376U78E/97ne/c+HLqf79O3948dzv/kVnSSi4+N1fTj953nju3FPpMJAt9ofvLI4IGTEBYL3EBIABWzImfC8U/Zc3/lktJvx1YrXrXz73lVfHP/vOhWcrOWE6RPCZLz87CwXNklT/f/fV5849+0p17GA2VS52/UsLxh3EBIB1ExMABqxXTPiTf/Xv/+ratfDf7XdD0d/8/IfZ9F/93r/+XltMuP7suede3b2zE3JCOQ5w65tPnfvKG2Fj71+9cC4PBc2SdEwItV28+tfVwtlU8f8hNDx1tRh6eON3W4OCmACwXmICwID1igk/uPzjvdzu/VB07+9G+R/73//zdEwI3f8L3/3FbpjaGf/lV84VNx7d+taFi2Xhc1koaJbUYkLl0YQL331/vNMeE155tvocw4Vvpx9WEBMA1ktMABiwfjcd/YP/6Xv/5J+E//78Wij6L6//i2z6e//oH76YjAnXv3yu7qna/UHBX/xuFgqaJbWYMH024Y3nzl38zs92quHgzp0QDCoxIaz83Bvl59TBeEdMAHgMxASAAVvy2YQ/ubPw2YTshqM3Kp8bv/zuxQvfupXdgHRxOrAQlshCQbOkHhOKRLC7/8vvXCjuJMqGGLJnFO7c+vaFakz466sXp884N39DSUwAOCpiAsCArfAI81uv/8/tMSH7haM39ncrJbMbj3bG73/3QjG6cKF4YLlZkogJ01uSsh9XLSayxZ/9SvWmo53xwRtfmY5cfKW+cTEB4MiICQADtigm/L//x0tt/7Za/t+LX/iPtX+JOXTZG/303f1H+8UjCAfFbUEHB0VBomReTeXmoVBBcS9RNpEtvr9fzC4Xm8549KgtJIgJAOsmJgAM2KKY8Hd/+///hy98/x/+/VRG+Aff++z//tMP9+61r32ciAkA6yUmAAzYophw5+7fTR5++umjpE8PHozSzwsfQ2ICwHqJCQADtjAmDIaYALBeYgLAgIkJAKxGTAAYMDEBgNWICQADJiYAsBoxAWDAxAQAViMmAAyYmADAasQEgAH70WkiJgCskZgAAABExAQAACAiJgAAABExAQAAiIgJAABAREwAAAAiYgIAABAREwAAgIiYAAAARMQEAAAgIiYAAAARMQEAAIiICQAAQOQRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAKfMJAABw6okJAABAREwAAAAiYgIAABAREwAAgIiYAAAARMQEAAAgskxM+MmVz//jued/uHDhBYusaSUAAGC9+seEHz5fjQZ5ZOjq0R+uxy8vAADA5vSOCSElfP7KTyoFC3ryYgIAAJxUvWNC+/BBtUs/n86nnn++uEFpFjDywiuze5fCgj+pTM9X/+F0tSiYAAAAj8UyzyaUvfd6XmiPCbNufnm/Ulw4nc6K86lydaMJAACwOSv90tEsL9SGAD6pT9c6+rOckF50Pi0mAADAMbD6D6I2hwA+aY0JjRjwiZgAAADHVt+YUP+do1x33z8eTehIFGICAAAcK8s9wlx5pLgcTKhGiMpzzpXl56VLxQTPLwMAwGYsddNR5RnmRmSYll15fuEvHfWJCbMqjSgAAMDjt/qzCQAAwECJCQAAQERMAAAAImICAAAQERMAAICImAAAAETEBAAAICImAAAAkSgm7AIAAKeemAAAAETEBAAAICImAAAAETEBAACIiAkAAEBETAAAACJiAgAAEBETAACAiJgAAABExAQAACAiJgAM2I+PjU0fCQCWIyYADFjonz86BsQEgBMneiffdHMAWKciJtzZKDEB4CQSEwAGTEwAYDViAsCAiQkArEZMABgwMQGA1YgJAAMmJgCwGjEBYMDEBABWIyYADNgQYsLtLz76gyem/734e+P1HZyaX/3ep3/wxckRVQ5wAokJAAO2ICZc/9K5is9889Zxiwnj//xPH1V675NXjiwpiAkAdWICwIB1xYQiIzz3RvkRcDDeeVwx4aWnzxSefqkouPXVJ598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93qNNfIbAN4AyKBXQE5vz88Adu0Auu3rXW+IbWXXcxLnymCzNaa25jm02hqXfswtz2s7zMBONKXMy5P2qqoyAfNdRovy/ljmlLBdPb4SWAlSR/86qJEyzeOo4/t4JQ0zXHZ+Y/+o7UQdTUfRscLiO22V+j31eD0uLcdUWsrqAezNb1eVWfkKZW5kc3RyZWFtCmVuZG9iago0NjAgMCBvYmoKPDwKICAvUmVzb3VyY2VzIDMgMCBSCiAgL1R5cGUgL1BhZ2UKICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQogIC9Dcm9wQm94IFswIDAgNjEyIDc5Ml0KICAvQmxlZWRCb3ggWzAgMCA2MTIgNzkyXQogIC9UcmltQm94IFswIDAgNjEyIDc5Ml0KICAvUGFyZW50IDEgMCBSCiAgL0NvbnRlbnRzIDQ2MSAwIFIKPj4KCmVuZG9iago0NjIgMCBvYmoKNDk0CmVuZG9iago0NjQgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNTIgMCBSIC9YWVogNzIuMCAyNDkuMDA2IG51bGxdCj4+CmVuZG9iago0NjUgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNzA5LjAwNSA0MDYuOTk4IDcxOC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDY0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ2NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzQuNDkzIDcwOS4wMDUgNTQwLjg1MyA3MTguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ2NCAwIFIKL0ggL0kKCj4+CmVuZG9iago0NjggMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNTIgMCBSIC9YWVogNzIuMCAxNzIuNTA3IG51bGxdCj4+CmVuZG9iago0NjkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjk3LjAwNSAzODQuNjk2IDcwNi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDY4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ3MCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzQuNjY5IDY5Ny4wMDUgNTQxLjAyOSA3MDYuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ2OCAwIFIKL0ggL0kKCj4+CmVuZG9iago0NzEgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjEyIDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjQ3MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2ODUuMDA1IDQwNy4wNTcgNjk0Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0NzEgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDczIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC40OTIgNjg1LjAwNSA1NDAuODUyIDY5NC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDcxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ3NCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyMTIgMCBSIC9YWVogNzIuMCA2NDkuNiBudWxsXQo+PgplbmRvYmoKNDc1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDY3My4wMDUgNDIxLjI2MSA2ODIuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ3NCAwIFIKL0ggL0kKCj4+CmVuZG9iago0NzYgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM0LjM3OSA2NzMuMDA1IDU0MC43MzkgNjgyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0NzQgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDc3IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzIxMiAwIFIgL1hZWiA3Mi4wIDU3My4yIG51bGxdCj4+CmVuZG9iago0NzggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjYxLjAwNSA0MDIuNzg0IDY3MC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDc3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ3OSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzQuNTI2IDY2MS4wMDUgNTQwLjg4NiA2NzAuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ3NyAwIFIKL0ggL0kKCj4+CmVuZG9iago0ODAgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjEyIDAgUiAvWFlaIDcyLjAgNDk2LjggbnVsbF0KPj4KZW5kb2JqCjQ4MSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2NDkuMDA1IDQxMS4yNTEgNjU4Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0ODAgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDgyIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC40NTkgNjQ5LjAwNSA1NDAuODE5IDY1OC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDgwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ4MyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyMTIgMCBSIC9YWVogNzIuMCAzODQuNCBudWxsXQo+PgplbmRvYmoKNDg0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDYzNy4wMDUgNDEzLjQyMiA2NDYuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ4MyAwIFIKL0ggL0kKCj4+CmVuZG9iago0ODUgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTM0LjQ0MSA2MzcuMDA1IDU0MC44MDEgNjQ2Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0ODMgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDg2IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzIxMiAwIFIgL1hZWiA3Mi4wIDMwOC4wIG51bGxdCj4+CmVuZG9iago0ODcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjI1LjAwNSAzOTYuNTQxIDYzNC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDg2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ4OCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzQuOTI5IDYyNS4wMDUgNTQxLjI4OSA2MzQuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ4NiAwIFIKL0ggL0kKCj4+CmVuZG9iago0ODkgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjE1IDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjQ5MCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA4MC4wIDYxMy4wMDUgMTI1LjI1MyA2MjIuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ4OSAwIFIKL0ggL0kKCj4+CmVuZG9iago0OTEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMwLjE0NCA2MTMuMDA1IDU0Mi44NjQgNjIyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0ODkgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDkyIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzIxNSAwIFIgL1hZWiA3Mi4wIDcwMC44IG51bGxdCj4+CmVuZG9iago0OTMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjAxLjAwNSAyOTQuNDc5IDYxMC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDkyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ5NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjguOTc2IDYwMS4wMDUgNTQxLjY5NiA2MTAuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ5MiAwIFIKL0ggL0kKCj4+CmVuZG9iago0OTUgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjMwIDAgUiAvWFlaIDcyLjAgNDM1LjU0NiBudWxsXQo+PgplbmRvYmoKNDk2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDU4OS4wMDUgMzI3LjQ5NCA1OTguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ5NSAwIFIKL0ggL0kKCj4+CmVuZG9iago0OTcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI4LjcxMyA1ODkuMDA1IDU0MS40MzMgNTk4Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0OTUgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDk4IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzIzMCAwIFIgL1hZWiA3Mi4wIDIwMC4wNzQgbnVsbF0KPj4KZW5kb2JqCjQ5OSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1NzcuMDA1IDMyNy45NDcgNTg2Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0OTggMCBSCi9IIC9JCgo+PgplbmRvYmoKNTAwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyOC43MDkgNTc3LjAwNSA1NDEuNDI5IDU4Ni45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDk4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUwMSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyMzMgMCBSIC9YWVogNzIuMCA0NDkuMzYzIG51bGxdCj4+CmVuZG9iago1MDIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTY1LjAwNSAyMDkuODQ0IDU3NC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTAxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUwMyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjkuNjQ2IDU2NS4wMDUgNTQyLjM2NiA1NzQuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUwMSAwIFIKL0ggL0kKCj4+CmVuZG9iago1MDQgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjc3IDAgUiAvWFlaIDcyLjAgNTUwLjU3MiBudWxsXQo+PgplbmRvYmoKNTA1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDU1My4wMDUgMjAzLjA3MSA1NjIuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUwNCAwIFIKL0ggL0kKCj4+CmVuZG9iago1MDYgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI5LjcgNTUzLjAwNSA1NDIuNDIgNTYyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MDQgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTA3IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzI3NyAwIFIgL1hZWiA3Mi4wIDM1OS41MjggbnVsbF0KPj4KZW5kb2JqCjUwOCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1NDEuMDA1IDMxNy4zOTQgNTUwLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MDcgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTA5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyOC43OTMgNTQxLjAwNSA1NDEuNTEzIDU1MC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTA3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUxMCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszMDIgMCBSIC9YWVogNzIuMCAzOTkuMDQ2IG51bGxdCj4+CmVuZG9iago1MTEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTI5LjAwNSAyNDEuODc2IDUzOC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTEwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUxMiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjkuMzkyIDUyOS4wMDUgNTQyLjExMiA1MzguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUxMCAwIFIKL0ggL0kKCj4+CmVuZG9iago1MTMgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzExIDAgUiAvWFlaIDcyLjAgMjczLjAwNCBudWxsXQo+PgplbmRvYmoKNTE0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDUxNy4wMDUgMTgwLjUxIDUyNi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTEzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUxNSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjkuODc4IDUxNy4wMDUgNTQyLjU5OCA1MjYuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUxMyAwIFIKL0ggL0kKCj4+CmVuZG9iago1MTYgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzI2IDAgUiAvWFlaIDcyLjAgMjc2LjIxMSBudWxsXQo+PgplbmRvYmoKNTE3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDUwNS4wMDUgMzU5LjQwNyA1MTQuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUxNiAwIFIKL0ggL0kKCj4+CmVuZG9iago1MTggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI4LjQ2MiA1MDUuMDA1IDU0MS4xODIgNTE0Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MTYgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTE5IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzM3NCAwIFIgL1hZWiA3Mi4wIDIyNS4yNzIgbnVsbF0KPj4KZW5kb2JqCjUyMCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA0OTMuMDA1IDI2OS4zNzEgNTAyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MTkgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTIxIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyOS41MjcgNDkzLjAwNSA1NDIuMjQ3IDUwMi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTE5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUyMiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MDAgMCBSIC9YWVogNzIuMCA1MTYuMDY5IG51bGxdCj4+CmVuZG9iago1MjMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDgxLjAwNSAyNzUuNTA4IDQ5MC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTIyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUyNCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjkuNDc4IDQ4MS4wMDUgNTQyLjE5OCA0OTAuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUyMiAwIFIKL0ggL0kKCj4+CmVuZG9iago1MjUgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMwIDAgUiAvWFlaIDcyLjAgNDU0LjE2IG51bGxdCj4+CmVuZG9iago1MjYgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDY5LjAwNSAzNTkuOTc5IDQ3OC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTI1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUyNyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjguNDU1IDQ2OS4wMDUgNTQxLjE3NSA0NzguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUyNSAwIFIKL0ggL0kKCj4+CmVuZG9iago1MjggMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDQyIDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjUyOSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA4MC4wIDQ1Ny4wMDUgMjYxLjYzMiA0NjYuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUyOCAwIFIKL0ggL0kKCj4+CmVuZG9iago1MzAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI5LjEyNCA0NTcuMDA1IDU0MS44NDQgNDY2Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MjggMCBSCi9IIC9JCgo+PgplbmRvYmoKNTMxIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ0NSAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iago1MzIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgODAuMCA0NDUuMDA1IDEzMi44NjEgNDU0Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MzEgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTMzIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMC4wODggNDQ1LjAwNSA1NDIuODA4IDQ1NC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTMxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUzNCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NTcgMCBSIC9YWVogNzIuMCA3MjAuMCBudWxsXQo+PgplbmRvYmoKNTM1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDgwLjAgNDMzLjAwNSAxMTkuMDM2IDQ0Mi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTM0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUzNiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzAuMTkgNDMzLjAwNSA1NDIuOTEgNDQyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MzQgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTM3IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ1NyAwIFIgL1hZWiA3Mi4wIDY3OC44IG51bGxdCj4+CmVuZG9iago1MzggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDIxLjAwNSAxNzEuODcgNDMwLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MzcgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTM5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyOS45NDYgNDIxLjAwNSA1NDIuNjY2IDQzMC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTM3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjU0MCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NTcgMCBSIC9YWVogNzIuMCA2MjQuNCBudWxsXQo+PgplbmRvYmoKNTQxIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDQwOS4wMDUgMTY3Ljc4MyA0MTguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDU0MCAwIFIKL0ggL0kKCj4+CmVuZG9iago1NDIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI5Ljk4IDQwOS4wMDUgNTQyLjcgNDE4Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1NDAgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTQzIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ2MCAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iago1NDQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0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IFIKNDc2IDAgUgo0NzggMCBSCjQ3OSAwIFIKNDgxIDAgUgo0ODIgMCBSCjQ4NCAwIFIKNDg1IDAgUgo0ODcgMCBSCjQ4OCAwIFIKNDkwIDAgUgo0OTEgMCBSCjQ5MyAwIFIKNDk0IDAgUgo0OTYgMCBSCjQ5NyAwIFIKNDk5IDAgUgo1MDAgMCBSCjUwMiAwIFIKNTAzIDAgUgo1MDUgMCBSCjUwNiAwIFIKNTA4IDAgUgo1MDkgMCBSCjUxMSAwIFIKNTEyIDAgUgo1MTQgMCBSCjUxNSAwIFIKNTE3IDAgUgo1MTggMCBSCjUyMCAwIFIKNTIxIDAgUgo1MjMgMCBSCjUyNCAwIFIKNTI2IDAgUgo1MjcgMCBSCjUyOSAwIFIKNTMwIDAgUgo1MzIgMCBSCjUzMyAwIFIKNTM1IDAgUgo1MzYgMCBSCjUzOCAwIFIKNTM5IDAgUgo1NDEgMCBSCjU0MiAwIFIKNTQ0IDAgUgo1NDUgMCBSCl0KZW5kb2JqCjQ2MyAwIG9iago8PAogIC9SZXNvdXJjZXMgMyAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgL0Nyb3BCb3ggWzAgMCA2MTIgNzkyXQogIC9CbGVlZEJveCBbMCAwIDYxMiA3OTJdCiAgL1RyaW1Cb3ggWzAgMCA2MTIgNzkyXQogIC9QYXJlbnQgMSAwIFIKICAvQW5ub3RzIDQ2NiAwIFIKICAvQ29udGVudHMgNTQ2IDAgUgo+PgoKZW5kb2JqCjU0NyAwIG9iagoxNDkwNwplbmRvYmoKNTQ4IDAgb2JqCjw8CiAgL1R5cGUgL0ZvbnREZXNjcmlwdG9yCiAgL0ZvbnROYW1lIC9FQUFBQUErRGVqYVZ1U2Fuc01vbm8KICAvRm9udEJCb3ggWy01NTcgLTM3NCA3MTcgMTA0MV0KICAvRmxhZ3MgMzUKICAvQ2FwSGVpZ2h0IDcyOQogIC9Bc2NlbnQgMTA0MQogIC9EZXNjZW50IC0zNzQKICAvSXRhbGljQW5nbGUgMAogIC9TdGVtViAwCiAgL01pc3NpbmdXaWR0aCA1MDAKICAvRm9udEZpbGUyIDU0OSAwIFIKICAvQ0lEU2V0IDU1MCAwIFIKPj4KCmVuZG9iago1NDkgMCBvYmoKPDwK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EoOnY1cMPGv0Gfx0aDAdMeosPA3OW3ha6iw8HX5a4cmOWbyucMnidQMzK15LJhpq9s+ioZY60SCZ4jV+WjkvuGTxusJPK+dFeMp5kQ7oc3UeGJkM9zEnn3NFmkZ/JeeClTQxK0Yj1aDRit/+Y5YU3tCM5ddBXS+c+y3gryktF0C+b/LkrzPfD/F+cU3jtFblzz9XvC6hCmVuZHN0cmVhbQplbmRvYmoKNTcyIDAgb2JqCjk3ODYKZW5kb2JqCjU3MyAwIG9iagoyMAplbmRvYmoKNTc0IDAgb2JqCjQwOAplbmRvYmoKNTc1IDAgb2JqCjkxMDEKZW5kb2JqCjU3NiAwIG9iagoyMAplbmRvYmoKNTc3IDAgb2JqCjMyMwplbmRvYmoKNTc4IDAgb2JqCjE2MzgxCmVuZG9iago1NzkgMCBvYmoKMjgKZW5kb2JqCjU4MCAwIG9iago1NzYKZW5kb2JqCjU4MSAwIG9iagoxNDU5NQplbmRvYmoKNTgyIDAgb2JqCjIyCmVuZG9iago1ODMgMCBvYmoKNTA0CmVuZG9iagoxIDAgb2JqCjw8IC9UeXBlIC9QYWdlcwovQ291bnQgNDMKL0tpZHMgWzggMCBSIDU1IDAgUiA0NjMgMCBSIDE4IDAgUiAyOCAwIFIgMzEgMCBSIDM0IDAgUiAzNyAwIFIgNDMgMCBSIDQ2IDAgUiA0OSAwIFIgNTIgMCBSIDIxMiAwIFIgMjE1IDAgUiAyMzAgMCBSIDIzMyAwIFIgMjQ0IDAgUiAyNTEgMCBSIDI2MiAwIFIgMjc3IDAgUiAyODggMCBSIDI5NSAwIFIgMzAyIDAgUiAzMTEgMCBSIDMyNiAwIFIgMzM3IDAgUiAzNDggMCBSIDM2MyAwIFIgMzc0IDAgUiAzODUgMCBSIDQwMCAwIFIgNDA5IDAgUiA0MjAgMCBSIDQyMyAwIFIgNDMwIDAgUiA0MzcgMCBSIDQ0MiAwIFIgNDQ1IDAgUiA0NDggMCBSIDQ1MSAwIFIgNDU0IDAgUiA0NTcgMCBSIDQ2MCAwIFIgXSA+PgplbmRvYmoKMiAwIG9iago8PAogIC9UeXBlIC9DYXRhbG9nCiAgL1BhZ2VzIDEgMCBSCiAgL0xhbmcgKGVuKQogIC9NZXRhZGF0YSA3IDAgUgogIC9QYWdlTGFiZWxzIDkgMCBSCj4+CgplbmRvYmoKMyAwIG9iago8PAogIC9Gb250IDw8CiAgL0YxOSA1NTEgMCBSCiAgL0YxNyA1NTcgMCBSCiAgL0YxNSA1NjMgMCBSCiAgL0YxNiA1NjkgMCBSCj4+CgogIC9Qcm9jU2V0IFsvUERGIC9JbWFnZUIgL0ltYWdlQyAvVGV4dF0KICAvWE9iamVjdCA8PAogIC9JbTEgMTAgMCBSCiAgL0ltMiAxMSAwIFIKICAvSW0zIDE5IDAgUgogIC9JbTQgMjAgMCBSCiAgL0ltNSAyMTYgMCBSCiAgL0ltNiAyMTcgMCBSCiAgL0ltNyAyMjAgMCBSCiAgL0ltOCAyMjEgMCBSCiAgL0ltOSAyMjQgMCBSCiAgL0ltMTAgMjI1IDAgUgogIC9JbTExIDIzNCAwIFIKICAvSW0xMiAyMzUgMCBSCiAgL0ltMTMgMjM4IDAgUgogIC9JbTE0IDIzOSAwIFIKICAvSW0xNSAyNDUgMCBSCiAgL0ltMTYgMjQ2IDAgUgogIC9JbTE3IDI1MiAwIFIKICAvSW0xOCAyNTMgMCBSCiAgL0ltMTkgMjU2IDAgUgogIC9JbTIwIDI1NyAwIFIKICAvSW0yMSAyNjMgMCBSCiAgL0ltMjIgMjY0IDAgUgogIC9JbTIzIDI2NyAwIFIKICAvSW0yNCAyNjggMCBSCiAgL0ltMjUgMjcxIDAgUgogIC9JbTI2IDI3MiAwIFIKICAvSW0yNyAyNzggMCBSCiAgL0ltMjggMjc5IDAgUgogIC9JbTI5IDI4MiAwIFIKICAvSW0zMCAyODMgMCBSCiAgL0ltMzEgMjg5IDAgUgogIC9JbTMyIDI5MCAwIFIKICAvSW0zMyAyOTYgMCBSCiAgL0ltMzQgMjk3IDAgUgogIC9JbTM1IDMwMyAwIFIKICAvSW0zNiAzMDUgMCBSCiAgL0ltMzcgMzA2IDAgUgogIC9JbTM4IDMxMiAwIFIKICAvSW0zOSAzMTMgMCBSCiAgL0ltNDAgMzE2IDAgUgogIC9JbTQxIDMxNyAwIFIKICAvSW00MiAzMjAgMCBSCiAgL0ltNDMgMzIxIDAgUgogIC9JbTQ0IDMyNyAwIFIKICAvSW00NSAzMjggMCBSCiAgL0ltNDYgMzMxIDAgUgogIC9JbTQ3IDMzMiAwIFIKICAvSW00OCAzMzggMCBSCiAgL0ltNDkgMzM5IDAgUgogIC9JbTUwIDM0MiAwIFIKICAvSW01MSAzNDMgMCBSCiAgL0ltNTIgMzQ5IDAgUgogIC9JbTUzIDM1MCAwIFIKICAvSW01NCAzNTMgMCBSCiAgL0ltNTUgMzU0IDAgUgogIC9JbTU2IDM1NyAwIFIKICAvSW01NyAzNTggMCBSCiAgL0ltNTggMzY0IDAgUgogIC9JbTU5IDM2NSAwIFIKICAvSW02MCAzNjggMCBSCiAgL0ltNjEgMzY5IDAgUgogIC9JbTYyIDM3NSAwIFIKICAvSW02MyAzNzYgMCBSCiAgL0ltNjQgMzc5IDAgUgogIC9JbTY1IDM4MCAwIFIKICAvSW02NiAzODYgMCBSCiAgL0ltNjcgMzg3IDAgUgogIC9JbTY4IDM5MCAwIFIKICAvSW02OSAzOTEgMCBSCiAgL0ltNzAgMzk0IDAgUgogIC9JbTcxIDM5NSAwIFIKICAvSW03MiA0MDEgMCBSCiAgL0ltNzMgNDAzIDAgUgogIC9JbTc0IDQwNCAwIFIKICAvSW03NSA0MTAgMCBSCiAgL0ltNzYgNDExIDAgUgogIC9JbTc3IDQxNCAwIFIKICAvSW03OCA0MTUgMCBSCiAgL0ltNzkgNDI0IDAgUgogIC9JbTgwIDQyNSAwIFIKICAvSW04MSA0MzEgMCBSCiAgL0ltODIgNDMyIDAgUgogIC9JbTgzIDQzOCAwIFIKPj4KCiAgL0NvbG9yU3BhY2UgPDwgL0RlZmF1bHRSR0IgNiAwIFIgPj4KCj4+CgplbmRvYmoKOSAwIG9iago8PCAvTnVtcyBbMCA8PCAvUCAoMSkgPj4KIDEgPDwgL1AgKGlpKSA+PgogMiA8PCAvUCAoaWlpKSA+PgogMyA8PCAvUCAoaXYpID4+CiA0IDw8IC9QICgxKSA+PgogNSA8PCAvUCAoMikgPj4KIDYgPDwgL1AgKDMpID4+CiA3IDw8IC9QICg0KSA+PgogOCA8PCAvUCAoNSkgPj4KIDkgPDwgL1AgKDYpID4+CiAxMCA8PCAvUCAoNykgPj4KIDExIDw8IC9QICg4KSA+PgogMTIgPDwgL1AgKDkpID4+CiAxMyA8PCAvUCAoMTApID4+CiAxNCA8PCAvUCAoMTEpID4+CiAxNSA8PCAvUCAoMTIpID4+CiAxNiA8PCAvUCAoMTMpID4+CiAxNyA8PCAvUCAoMTQpID4+CiAxOCA8PCAvUCAoMTUpID4+CiAxOSA8PCAvUCAoMTYpID4+CiAyMCA8PCAvUCAoMTcpID4+CiAyMSA8PCAvUCAoMTgpID4+CiAyMiA8PCAvUCAoMTkpID4+CiAyMyA8PCAvUCAoMjApID4+CiAyNCA8PCAvUCAoMjEpID4+CiAyNSA8PCAvUCAoMjIpID4+CiAyNiA8PCAvUCAoMjMpID4+CiAyNyA8PCAvUCAoMjQpID4+CiAyOCA8PCAvUCAoMjUpID4+CiAyOSA8PCAvUCAoMjYpID4+CiAzMCA8PCAvUCAoMjcpID4+CiAzMSA8PCAvUCAoMjgpID4+CiAzMiA8PCAvUCAoMjkpID4+CiAzMyA8PCAvUCAoMzApID4+CiAzNCA8PCAvUCAoMzEpID4+CiAzNSA8PCAvUCAoMzIpID4+CiAzNiA8PCAvUCAoMzMpID4+CiAzNyA8PCAvUCAoMzQpID4+CiAzOCA8PCAvUCAoMzUpID4+CiAzOSA8PCAvUCAoMzYpID4+CiA0MCA8PCAvUCAoMzcpID4+CiA0MSA8PCAvUCAoMzgpID4+CiA0MiA8PCAvUCAoMzkpID4+Cl0gPj4KCmVuZG9iagp4cmVmCjAgNTg0CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDgwNzcyMiAwMDAwMCBuIAowMDAwODA4MTA3IDAwMDAwIG4gCjAwMDA4MDgyMTIgMDAwMDAgbiAKMDAwMDAwMDAxNSAwMDAwMCBuIAowMDAwMDAwMTQ1IDAwMDAwIG4gCjAwMDAwMDI4MjMgMDAwMDAgbiAKMDAwMDAwMjg1NiAwMDAwMCBuIAowMDAwMTA2MTk2IDAwMDAwIG4gCjAwMDA4MDk3MjEgMDAwMDAgbiAKMDAwMDAwMzgwNCAwMDAwMCBuIAowMDAwMDUyMzMxIDAwMDAwIG4gCjAwMDAxMDU1OTMgMDAwMDAgbiAKMDAwMDEwNTYxNCAwMDAwMCBuIAowMDAwMTA1NjM0IDAwMDAwIG4gCjAwMDAxMDU2NTYgMDAwMDAgbiAKMDAwMDEwNTY3OCAwMDAwMCBuIAowMDAwMTA2Mzg4IDAwMDAwIG4gCjAwMDAxMjA5NjUgMDAwMDAgbiAKMDAwMDEwNjQwOCAwMDAwMCBuIAowMDAwMTEyNTc5IDAwMDAwIG4gCjAwMDAxMTk3NTkgMDAwMDAgbiAKMDAwMDExOTc4MCAwMDAwMCBuIAowMDAwMTE5ODAxIDAwMDAwIG4gCjAwMDAxMTk4ODYgMDAwMDAgbiAKMDAwMDEyMDkzOCAwMDAwMCBuIAowMDAwMTIwMDI0IDAwMDAwIG4gCjAwMDAxMjExNzUgMDAwMDAgbiAKMDAwMDEyNDEyMSAwMDAwMCBuIAowMDAwMTIxMTk1IDAwMDAwIG4gCjAwMDAxMjQzMTQgMDAwMDAgbiAKMDAwMDEyNjc0MyAwMDAwMCBuIAowMDAwMTI0MzM1IDAwMDAwIG4gCjAwMDAxMjY5MzYgMDAwMDAgbiAKMDAwMDEyNzgyMSAwMDAwMCBuIAowMDAwMTI2OTU3IDAwMDAwIG4gCjAwMDAxMjgwMTQgMDAwMDAgbiAKMDAwMDEyOTU2MCAwMDAwMCBuIAowMDAwMTI4MDM0IDAwMDAwIG4gCjAwMDAxMjgxMjkgMDAwMDAgbiAKMDAwMDEyOTUzMyAwMDAwMCBuIAowMDAwMTI4MjY1IDAwMDAwIG4gCjAwMDAxMjk3NzAgMDAwMDAgbiAKMDAwMDEzMTUwNSAwMDAwMCBuIAowMDAwMTI5NzkxIDAwMDAwIG4gCjAwMDAxMzE2OTggMDAwMDAgbiAKMDAwMDEzMzM2MyAwMDAwMCBuIAowMDAwMTMxNzE5IDAwMDAwIG4gCjAwMDAxMzM1NTYgMDAwMDAgbiAKMDAwMDEzNjA0MSAwMDAwMCBuIAowMDAwMTMzNTc3IDAwMDAwIG4gCjAwMDAxMzYyMzQgMDAwMDAgbiAKMDAwMDEzODAwNiAwMDAwMCBuIAowMDAwMTM2MjU1IDAwMDAwIG4gCjAwMDAxMzgxOTkgMDAwMDAgbiAKMDAwMDE4MDIyOSAwMDAwMCBuIAowMDAwMTM4MjIwIDAwMDAwIG4gCjAwMDAxMzgyOTggMDAwMDAgbiAKMDAwMDE3OTQyMSAwMDAwMCBuIAowMDAwMTM4NDM0IDAwMDAwIG4gCjAwMDAxMzg1NzQgMDAwMDAgbiAKMDAwMDEzODY1MiAwMDAwMCBuIAowMDAwMTM4Nzg5IDAwMDAwIG4gCjAwMDAxMzg5MjkgMDAwMDAgbiAKMDAwMDEzOTAwNyAwMDAwMCBuIAowMDAwMTM5MTQ1IDAwMDAwIG4gCjAwMDAxMzkyODUgMDAwMDAgbiAKMDAwMDEzOTM2NCAwMDAwMCBuIAowMDAwMTM5NTAyIDAwMDAwIG4gCjAwMDAxMzk2NDIgMDAwMDAgbiAKMDAwMDEzOTcyMSAwMDAwMCBuIAowMDAwMTM5ODU5IDAwMDAwIG4gCjAwMDAxMzk5OTkgMDAwMDAgbiAKMDAwMDE0MDA3OCAwMDAwMCBuIAowMDAwMTQwMjE2IDAwMDAwIG4gCjAwMDAxNDAzNTYgMDAwMDAgbiAKMDAwMDE0MDQzNSAwMDAwMCBuIAowMDAwMTQwNTczIDAwMDAwIG4gCjAwMDAxNDA3MTMgMDAwMDAgbiAKMDAwMDE0MDc5MSAwMDAwMCBuIAowMDAwMTQwOTI5IDAwMDAwIG4gCjAwMDAxNDEwNjkgMDAwMDAgbiAKMDAwMDE0MTE0NyAwMDAwMCBuIAowMDAwMTQxMjg1IDAwMDAwIG4gCjAwMDAxNDE0MjUgMDAwMDAgbiAKMDAwMDE0MTUwMyAwMDAwMCBuIAowMDAwMTQxNjQwIDAwMDAwIG4gCjAwMDAxNDE3ODAgMDAwMDAgbiAKMDAwMDE0MTg1OCAwMDAwMCBuIAowMDAwMTQxOTk2IDAwMDAwIG4gCjAwMDAxNDIxMzYgMDAwMDAgbiAKMDAwMDE0MjIxNCAwMDAwMCBuIAowMDAwMTQyMzUxIDAwMDAwIG4gCjAwMDAxNDI0OTEgMDAwMDAgbiAKMDAwMDE0MjU2OSAwMDAwMCBuIAowMDAwMTQyNzA3IDAwMDAwIG4gCjAwMDAxNDI4NDcgMDAwMDAgbiAKMDAwMDE0MjkyNSAwMDAwMCBuIAowMDAwMTQzMDYzIDAwMDAwIG4gCjAwMDAxNDMyMDMgMDAwMDAgbiAKMDAwMDE0MzI4MSAwMDAwMCBuIAowMDAwMTQzNDIwIDAwMDAwIG4gCjAwMDAxNDM1NTkgMDAwMDAgbiAKMDAwMDE0MzYzOCAwMDAwMCBuIAowMDAwMTQzNzc4IDAwMDAwIG4gCjAwMDAxNDM5MjAgMDAwMDAgbiAKMDAwMDE0Mzk5OSAwMDAwMCBuIAowMDAwMTQ0MTM4IDAwMDAwIG4gCjAwMDAxNDQyODAgMDAwMDAgbiAKMDAwMDE0NDM1OSAwMDAwMCBuIAowMDAwMTQ0NDk5IDAwMDAwIG4gCjAwMDAxNDQ2NDEgMDAwMDAgbiAKMDAwMDE0NDcyMCAwMDAwMCBuIAowMDAwMTQ0ODYwIDAwMDAwIG4gCjAwMDAxNDUwMDIgMDAwMDAgbiAKMDAwMDE0NTA4MSAwMDAwMCBuIAowMDAwMTQ1MjE5IDAwMDAwIG4gCjAwMDAxNDUzNjEgMDAwMDAgbiAKMDAwMDE0NTQ0MiAwMDAwMCBuIAowMDAwMTQ1NTgyIDAwMDAwIG4gCjAwMDAxNDU3MjQgMDAwMDAgbiAKMDAwMDE0NTgwNSAwMDAwMCBuIAowMDAwMTQ1OTQ1IDAwMDAwIG4gCjAwMDAxNDYwODcgMDAwMDAgbiAKMDAwMDE0NjE2OCAwMDAwMCBuIAowMDAwMTQ2MzA4IDAwMDAwIG4gCjAwMDAxNDY0NTAgMDAwMDAgbiAKMDAwMDE0NjUzMSAwMDAwMCBuIAowMDAwMTQ2NjcxIDAwMDAwIG4gCjAwMDAxNDY4MTMgMDAwMDAgbiAKMDAwMDE0Njg5NCAwMDAwMCBuIAowMDAwMTQ3MDM0IDAwMDAwIG4gCjAwMDAxNDcxNzYgMDAwMDAgbiAKMDAwMDE0NzI1NyAwMDAwMCBuIAowMDAwMTQ3Mzk2IDAwMDAwIG4gCjAwMDAxNDc1MzggMDAwMDAgbiAKMDAwMDE0NzYxOSAwMDAwMCBuIAowMDAwMTQ3NzU5IDAwMDAwIG4gCjAwMDAxNDc5MDEgMDAwMDAgbiAKMDAwMDE0Nzk4MiAwMDAwMCBuIAowMDAwMTQ4MTIyIDAwMDAwIG4gCjAwMDAxNDgyNjQgMDAwMDAgbiAKMDAwMDE0ODM0NSAwMDAwMCBuIAowMDAwMTQ4NDg0IDAwMDAwIG4gCjAwMDAxNDg2MjYgMDAwMDAgbiAKMDAwMDE0ODcwNSAwMDAwMCBuIAowMDAwMTQ4ODQ1IDAwMDAwIG4gCjAwMDAxNDg5ODcgMDAwMDAgbiAKMDAwMDE0OTA2NyAwMDAwMCBuIAowMDAwMTQ5MjA3IDAwMDAwIG4gCjAwMDAxNDkzNDkgMDAwMDAgbiAKMDAwMDE0OTQzMCAwMDAwMCBuIAowMDAwMTQ5NTcwIDAwMDAwIG4gCjAwMDAxNDk3MTIgMDAwMDAgbiAKMDAwMDE0OTc5MSAwMDAwMCBuIAowMDAwMTQ5OTMxIDAwMDAwIG4gCjAwMDAxNTAwNzMgMDAwMDAgbiAKMDAwMDE1MDE1NCAwMDAwMCBuIAowMDAwMTUwMjk0IDAwMDAwIG4gCjAwMDAxNTA0MzYgMDAwMDAgbiAKMDAwMDE1MDUxNiAwMDAwMCBuIAowMDAwMTUwNjU1IDAwMDAwIG4gCjAwMDAxNTA3OTcgMDAwMDAgbiAKMDAwMDE1MDg3OCAwMDAwMCBuIAowMDAwMTUxMDE4IDAwMDAwIG4gCjAwMDAxNTExNjAgMDAwMDAgbiAKMDAwMDE1MTIzOSAwMDAwMCBuIAowMDAwMTUxMzc5IDAwMDAwIG4gCjAwMDAxNTE1MjEgMDAwMDAgbiAKMDAwMDE1MTYwMCAwMDAwMCBuIAowMDAwMTUxNzQwIDAwMDAwIG4gCjAwMDAxNTE4ODIgMDAwMDAgbiAKMDAwMDE1MTk2MyAwMDAwMCBuIAowMDAwMTUyMTAzIDAwMDAwIG4gCjAwMDAxNTIyNDUgMDAwMDAgbiAKMDAwMDE1MjMyNiAwMDAwMCBuIAowMDAwMTUyNDY2IDAwMDAwIG4gCjAwMDAxNTI2MDggMDAwMDAgbiAKMDAwMDE1MjY4OSAwMDAwMCBuIAowMDAwMTUyODI5IDAwMDAwIG4gCjAwMDAxNTI5NzEgMDAwMDAgbiAKMDAwMDE1MzA1MiAwMDAwMCBuIAowMDAwMTUzMTkyIDAwMDAwIG4gCjAwMDAxNTMzMzQgMDAwMDAgbiAKMDAwMDE1MzQxNCAwMDAwMCBuIAowMDAwMTUzNTU0IDAwMDAwIG4gCjAwMDAxNTM2OTYgMDAwMDAgbiAKMDAwMDE1Mzc3NyAwMDAwMCBuIAowMDAwMTUzOTE3IDAwMDAwIG4gCjAwMDAxNTQwNTkgMDAwMDAgbiAKMDAwMDE1NDE0MCAwMDAwMCBuIAowMDAwMTU0MjgwIDAwMDAwIG4gCjAwMDAxNTQ0MjIgMDAwMDAgbiAKMDAwMDE1NDUwMSAwMDAwMCBuIAowMDAwMTU0NjQxIDAwMDAwIG4gCjAwMDAxNTQ3ODMgMDAwMDAgbiAKMDAwMDE1NDg2NCAwMDAwMCBuIAowMDAwMTU1MDA0IDAwMDAwIG4gCjAwMDAxNTUxNDYgMDAwMDAgbiAKMDAwMDE1NTIyNyAwMDAwMCBuIAowMDAwMTU1MzY3IDAwMDAwIG4gCjAwMDAxNTU1MDkgMDAwMDAgbiAKMDAwMDE1NTU5MCAwMDAwMCBuIAowMDAwMTU1NzMwIDAwMDAwIG4gCjAwMDAxNTU4NzIgMDAwMDAgbiAKMDAwMDE1NTk1MyAwMDAwMCBuIAowMDAwMTU2MDkyIDAwMDAwIG4gCjAwMDAxNTYyMzMgMDAwMDAgbiAKMDAwMDE1NjMxNCAwMDAwMCBuIAowMDAwMTU2NDUxIDAwMDAwIG4gCjAwMDAxNTY1OTEgMDAwMDAgbiAKMDAwMDE4MDQ0MCAwMDAwMCBuIAowMDAwMTgyMTIyIDAwMDAwIG4gCjAwMDAxODA0NjMgMDAwMDAgbiAKMDAwMDE4MjMxNyAwMDAwMCBuIAowMDAwMjgyOTk1IDAwMDAwIG4gCjAwMDAxODIzMzkgMDAwMDAgbiAKMDAwMDE4MzQ3MCAwMDAwMCBuIAowMDAwMjA5NDY5IDAwMDAwIG4gCjAwMDAyMDk0OTAgMDAwMDAgbiAKMDAwMDIwOTUxMyAwMDAwMCBuIAowMDAwMjEwNTY5IDAwMDAwIG4gCjAwMDAyMzE0NzkgMDAwMDAgbiAKMDAwMDIzMTUwMCAwMDAwMCBuIAowMDAwMjMxNTIzIDAwMDAwIG4gCjAwMDAyMzIxODAgMDAwMDAgbiAKMDAwMDI4MTY0NSAwMDAwMCBuIAowMDAwMjgxNjY2IDAwMDAwIG4gCjAwMDAyODE2ODkgMDAwMDAgbiAKMDAwMDI4MzE5MCAwMDAwMCBuIAowMDAwMjg2ODAzIDAwMDAwIG4gCjAwMDAyODMyMTIgMDAwMDAgbiAKMDAwMDI4Njk5OCAwMDAwMCBuIAowMDAwMzUyNTgwIDAwMDAwIG4gCjAwMDAyODcwMjAgMDAwMDAgbiAKMDAwMDI4NzU2OSAwMDAwMCBuIAowMDAwMzAwMzEzIDAwMDAwIG4gCjAwMDAzMDAzMzQgMDAwMDAgbiAKMDAwMDMwMDM1NyAwMDAwMCBuIAowMDAwMzAxODU3IDAwMDAwIG4gCjAwMDAzNTA1MjAgMDAwMDAgbiAKMDAwMDM1MDU0MiAwMDAwMCBuIAowMDAwMzUwNTY1IDAwMDAwIG4gCjAwMDAzNTI3NzUgMDAwMDAgbiAKMDAwMDM2Mzc2MyAwMDAwMCBuIAowMDAwMzUyNzk3IDAwMDAwIG4gCjAwMDAzNTMxNDkgMDAwMDAgbiAKMDAwMDM2MjE5MyAwMDAwMCBuIAowMDAwMzYyMjE0IDAwMDAwIG4gCjAwMDAzNjIyMzYgMDAwMDAgbiAKMDAwMDM2Mzk1OCAwMDAwMCBuIAowMDAwMzk2MDg2IDAwMDAwIG4gCjAwMDAzNjM5ODAgMDAwMDAgbiAKMDAwMDM2NDI5MiAwMDAwMCBuIAowMDAwMzY5ODY4IDAwMDAwIG4gCjAwMDAzNjk4ODkgMDAwMDAgbiAKMDAwMDM2OTkxMSAwMDAwMCBuIAowMDAwMzcxMDQ4IDAwMDAwIG4gCjAwMDAzOTQ5MjggMDAwMDAgbiAKMDAwMDM5NDk0OSAwMDAwMCBuIAowMDAwMzk0OTcyIDAwMDAwIG4gCjAwMDAzOTYyODEgMDAwMDAgbiAKMDAwMDQyMTU4NSAwMDAwMCBuIAowMDAwMzk2MzAzIDAwMDAwIG4gCjAwMDAzOTcxMzQgMDAwMDAgbiAKMDAwMDQxMjE0MCAwMDAwMCBuIAowMDAwNDEyMTYxIDAwMDAwIG4gCjAwMDA0MTIxODQgMDAwMDAgbiAKMDAwMDQxMjQzOSAwMDAwMCBuIAowMDAwNDE0ODk0IDAwMDAwIG4gCjAwMDA0MTQ5MTQgMDAwMDAgbiAKMDAwMDQxNDkzNiAwMDAwMCBuIAowMDAwNDE1MjE2IDAwMDAwIG4gCjAwMDA0MjAyMjAgMDAwMDAgbiAKMDAwMDQyMDI0MCAwMDAwMCBuIAowMDAwNDIwMjYyIDAwMDAwIG4gCjAwMDA0MjE3ODAgMDAwMDAgbiAKMDAwMDQ0NDA3MSAwMDAwMCBuIAowMDAwNDIxODAyIDAwMDAwIG4gCjAwMDA0MjIxMDIgMDAwMDAgbiAKMDAwMDQyNTc5MyAwMDAwMCBuIAowMDAwNDI1ODEzIDAwMDAwIG4gCjAwMDA0MjU4MzUgMDAwMDAgbiAKMDAwMDQyNjY4OSAwMDAwMCBuIAowMDAwNDQyNTc2IDAwMDAwIG4gCjAwMDA0NDI1OTcgMDAwMDAgbiAKMDAwMDQ0MjYyMCAwMDAwMCBuIAowMDAwNDQ0MjY2IDAwMDAwIG4gCjAwMDA0NjQ0MTMgMDAwMDAgbiAKMDAwMDQ0NDI4OCAwMDAwMCBuIAowMDAwNDQ0OTI3IDAwMDAwIG4gCjAwMDA0NjMzNTIgMDAwMDAgbiAKMDAwMDQ2MzM3MyAwMDAwMCBuIAowMDAwNDYzMzk2IDAwMDAwIG4gCjAwMDA0NjQ2MDggMDAwMDAgbiAKMDAwMDQ3MTYxNSAwMDAwMCBuIAowMDAwNDY0NjI5IDAwMDAwIG4gCjAwMDA0NjQ5NTEgMDAwMDAgbiAKMDAwMDQ2OTU3NiAwMDAwMCBuIAowMDAwNDY5NTk3IDAwMDAwIG4gCjAwMDA0Njk2MTkgMDAwMDAgbiAKMDAwMDQ3MTgxMCAwMDAwMCBuIAowMDAwNDg5Njg3IDAwMDAwIG4gCjAwMDA0NzE4MzIgMDAwMDAgbiAKMDAwMDQ4MTQ0OCAwMDAwMCBuIAowMDAwNDgxNDcwIDAwMDAwIG4gCjAwMDA0ODE4MjIgMDAwMDAgbiAKMDAwMDQ4ODgxMCAwMDAwMCBuIAowMDAwNDg4ODMxIDAwMDAwIG4gCjAwMDA0ODg4NTMgMDAwMDAgbiAKMDAwMDQ4OTg4MiAwMDAwMCBuIAowMDAwNTAzNzU4IDAwMDAwIG4gCjAwMDA0ODk5MDMgMDAwMDAgbiAKMDAwMDQ5MDI0NiAwMDAwMCBuIAowMDAwNDk1MjY2IDAwMDAwIG4gCjAwMDA0OTUyODcgMDAwMDAgbiAKMDAwMDQ5NTMwOSAwMDAwMCBuIAowMDAwNDk1NTc4IDAwMDAwIG4gCjAwMDA0OTk0OTAgMDAwMDAgbiAKMDAwMDQ5OTUxMCAwMDAwMCBuIAowMDAwNDk5NTMyIDAwMDAwIG4gCjAwMDA0OTk3ODUgMDAwMDAgbiAKMDAwMDUwMTg0OCAwMDAwMCBuIAowMDAwNTAxODY4IDAwMDAwIG4gCjAwMDA1MDE4OTAgMDAwMDAgbiAKMDAwMDUwMzk1MyAwMDAwMCBuIAowMDAwNTE4MzU1IDAwMDAwIG4gCjAwMDA1MDM5NzUgMDAwMDAgbiAKMDAwMDUwNDM5MyAwMDAwMCBuIAowMDAwNTE0NzM2IDAwMDAwIG4gCjAwMDA1MTQ3NTcgMDAwMDAgbiAKMDAwMDUxNDc4MCAwMDAwMCBuIAowMDAwNTE1MDIzIDAwMDAwIG4gCjAwMDA1MTY1NTIgMDAwMDAgbiAKMDAwMDUxNjU3MiAwMDAwMCBuIAowMDAwNTE2NTk0IDAwMDAwIG4gCjAwMDA1MTg1NTAgMDAwMDAgbiAKMDAwMDU0MzkxMiAwMDAwMCBuIAowMDAwNTE4NTcyIDAwMDAwIG4gCjAwMDA1MTkxNzQgMDAwMDAgbiAKMDAwMDUzMzc1OSAwMDAwMCBuIAowMDAwNTMzNzgwIDAwMDAwIG4gCjAwMDA1MzM4MDMgMDAwMDAgbiAKMDAwMDUzNDEzNiAwMDAwMCBuIAowMDAwNTQyNjU0IDAwMDAwIG4gCjAwMDA1NDI2NzUgMDAwMDAgbiAKMDAwMDU0MjY5NyAwMDAwMCBuIAowMDAwNTQ0MTA3IDAwMDAwIG4gCjAwMDA1NjE4NjggMDAwMDAgbiAKMDAwMDU0NDEyOSAwMDAwMCBuIAowMDAwNTQ0NTEzIDAwMDAwIG4gCjAwMDA1NDkyMDUgMDAwMDAgbiAKMDAwMDU0OTIyNiAwMDAwMCBuIAowMDAwNTQ5MjQ4IDAwMDAwIG4gCjAwMDA1NDk2MzQgMDAwMDAgbiAKMDAwMDU1NDM3NCAwMDAwMCBuIAowMDAwNTU0Mzk1IDAwMDAwIG4gCjAwMDA1NTQ0MTcgMDAwMDAgbiAKMDAwMDU1NDg3MyAwMDAwMCBuIAowMDAwNTU5MjUzIDAwMDAwIG4gCjAwMDA1NTkyNzQgMDAwMDAgbiAKMDAwMDU1OTI5NiAwMDAwMCBuIAowMDAwNTYyMDYzIDAwMDAwIG4gCjAwMDA1OTI4ODAgMDAwMDAgbiAKMDAwMDU2MjA4NSAwMDAwMCBuIAowMDAwNTYyNTU4IDAwMDAwIG4gCjAwMDA1NzI3NzkgMDAwMDAgbiAKMDAwMDU3MjgwMCAwMDAwMCBuIAowMDAwNTcyODIyIDAwMDAwIG4gCjAwMDA1NzM1NTIgMDAwMDAgbiAKMDAwMDU5MTY4NiAwMDAwMCBuIAowMDAwNTkxNzA3IDAwMDAwIG4gCjAwMDA1OTE3MzAgMDAwMDAgbiAKMDAwMDU5MzA3NSAwMDAwMCBuIAowMDAwNjI5NDk2IDAwMDAwIG4gCjAwMDA1OTMwOTcgMDAwMDAgbiAKMDAwMDU5Mzk2MiAwMDAwMCBuIAowMDAwNjIxNjYxIDAwMDAwIG4gCjAwMDA2MjE2ODIgMDAwMDAgbiAKMDAwMDYyMTcwNSAwMDAwMCBuIAowMDAwNjIyMDUyIDAwMDAwIG4gCjAwMDA2Mjc4MTAgMDAwMDAgbiAKMDAwMDYyNzgzMSAwMDAwMCBuIAowMDAwNjI3ODUzIDAwMDAwIG4gCjAwMDA2Mjk2OTEgMDAwMDAgbiAKMDAwMDY0ODEyOCAwMDAwMCBuIAowMDAwNjI5NzEzIDAwMDAwIG4gCjAwMDA2Mjk5OTUgMDAwMDAgbiAKMDAwMDYzMjMxNyAwMDAwMCBuIAowMDAwNjMyMzM3IDAwMDAwIG4gCjAwMDA2MzIzNTkgMDAwMDAgbiAKMDAwMDYzMjc2MCAwMDAwMCBuIAowMDAwNjM3MjczIDAwMDAwIG4gCjAwMDA2MzcyOTQgMDAwMDAgbiAKMDAwMDYzNzMxNiAwMDAwMCBuIAowMDAwNjM3NzY2IDAwMDAwIG4gCjAwMDA2NDY5NTEgMDAwMDAgbiAKMDAwMDY0Njk3MiAwMDAwMCBuIAowMDAwNjQ2OTk0IDAwMDAwIG4gCjAwMDA2NDgzMjMgMDAwMDAgbiAKMDAwMDY2MDYzNSAwMDAwMCBuIAowMDAwNjQ4MzQ1IDAwMDAwIG4gCjAwMDA2NTE3MjAgMDAwMDAgbiAKMDAwMDY1MTc0MiAwMDAwMCBuIAowMDAwNjUyMjUxIDAwMDAwIG4gCjAwMDA2NTg2MjAgMDAwMDAgbiAKMDAwMDY1ODY0MSAwMDAwMCBuIAowMDAwNjU4NjYzIDAwMDAwIG4gCjAwMDA2NjA4MzAgMDAwMDAgbiAKMDAwMDY4MTY4NyAwMDAwMCBuIAowMDAwNjYwODUyIDAwMDAwIG4gCjAwMDA2NjE1MTYgMDAwMDAgbiAKMDAwMDY3NDAxMCAwMDAwMCBuIAowMDAwNjc0MDMxIDAwMDAwIG4gCjAwMDA2NzQwNTQgMDAwMDAgbiAKMDAwMDY3NDM3NyAwMDAwMCBuIAowMDAwNjc5NjgxIDAwMDAwIG4gCjAwMDA2Nzk3MDIgMDAwMDAgbiAKMDAwMDY3OTcyNCAwMDAwMCBuIAowMDAwNjgxODgyIDAwMDAwIG4gCjAwMDA2ODI3MDcgMDAwMDAgbiAKMDAwMDY4MTkwNCAwMDAwMCBuIAowMDAwNjgyOTAyIDAwMDAwIG4gCjAwMDA2OTk5MjQgMDAwMDAgbiAKMDAwMDY4MjkyMyAwMDAwMCBuIAowMDAwNjgzNTU4IDAwMDAwIG4gCjAwMDA2OTg5MzAgMDAwMDAgbiAKMDAwMDY5ODk1MSAwMDAwMCBuIAowMDAwNjk4OTc0IDAwMDAwIG4gCjAwMDA3MDAxMTkgMDAwMDAgbiAKMDAwMDcwODc3OSAwMDAwMCBuIAowMDAwNzAwMTQwIDAwMDAwIG4gCjAwMDA3MDA0NjQgMDAwMDAgbiAKMDAwMDcwNjM2NiAwMDAwMCBuIAowMDAwNzA2Mzg3IDAwMDAwIG4gCjAwMDA3MDY0MDkgMDAwMDAgbiAKMDAwMDcwODk3NCAwMDAwMCBuIAowMDAwNzE1NDc5IDAwMDAwIG4gCjAwMDA3MDg5OTYgMDAwMDAgbiAKMDAwMDcxNDAyMCAwMDAwMCBuIAowMDAwNzE0MDQyIDAwMDAwIG4gCjAwMDA3MTU2NzQgMDAwMDAgbiAKMDAwMDcxNjUzNSAwMDAwMCBuIAowMDAwNzE1Njk2IDAwMDAwIG4gCjAwMDA3MTY3MzAgMDAwMDAgbiAKMDAwMDcxODExNSAwMDAwMCBuIAowMDAwNzE2NzUxIDAwMDAwIG4gCjAwMDA3MTgzMTAgMDAwMDAgbiAKMDAwMDcxOTY2MyAwMDAwMCBuIAowMDAwNzE4MzMyIDAwMDAwIG4gCjAwMDA3MTk4NTggMDAwMDAgbiAKMDAwMDcyMTE5OCAwMDAwMCBuIAowMDAwNzE5ODgwIDAwMDAwIG4gCjAwMDA3MjEzOTMgMDAwMDAgbiAKMDAwMDcyMjgwNCAwMDAwMCBuIAowMDAwNzIxNDE1IDAwMDAwIG4gCjAwMDA3MjI5OTkgMDAwMDAgbiAKMDAwMDcyNDc2MyAwMDAwMCBuIAowMDAwNzIzMDIxIDAwMDAwIG4gCjAwMDA3MjQ5NTggMDAwMDAgbiAKMDAwMDcyNTU1MiAwMDAwMCBuIAowMDAwNzI0OTgwIDAwMDAwIG4gCjAwMDA3MjU3NDcgMDAwMDAgbiAKMDAwMDc1MDk4OCAwMDAwMCBuIAowMDAwNzI1NzY4IDAwMDAwIG4gCjAwMDA3MjU4NDkgMDAwMDAgbiAKMDAwMDc1MDUzNSAwMDAwMCBuIAowMDAwNzI1OTg5IDAwMDAwIG4gCjAwMDA3MjYxMzEgMDAwMDAgbiAKMDAwMDcyNjIxMiAwMDAwMCBuIAowMDAwNzI2MzUyIDAwMDAwIG4gCjAwMDA3MjY0OTQgMDAwMDAgbiAKMDAwMDcyNjU3NCAwMDAwMCBuIAowMDAwNzI2NzE0IDAwMDAwIG4gCjAwMDA3MjY4NTYgMDAwMDAgbiAKMDAwMDcyNjkzNiAwMDAwMCBuIAowMDAwNzI3MDc2IDAwMDAwIG4gCjAwMDA3MjcyMTggMDAwMDAgbiAKMDAwMDcyNzI5OCAwMDAwMCBuIAowMDAwNzI3NDM4IDAwMDAwIG4gCjAwMDA3Mjc1ODAgMDAwMDAgbiAKMDAwMDcyNzY2MCAwMDAwMCBuIAowMDAwNzI3ODAwIDAwMDAwIG4gCjAwMDA3Mjc5NDIgMDAwMDAgbiAKMDAwMDcyODAyMiAwMDAwMCBuIAowMDAwNzI4MTYyIDAwMDAwIG4gCjAwMDA3MjgzMDQgMDAwMDAgbiAKMDAwMDcyODM4NCAwMDAwMCBuIAowMDAwNzI4NTI0IDAwMDAwIG4gCjAwMDA3Mjg2NjYgMDAwMDAgbiAKMDAwMDcyODc0NiAwMDAwMCBuIAowMDAwNzI4ODg1IDAwMDAwIG4gCjAwMDA3MjkwMjcgMDAwMDAgbiAKMDAwMDcyOTEwNyAwMDAwMCBuIAowMDAwNzI5MjQ3IDAwMDAwIG4gCjAwMDA3MjkzODkgMDAwMDAgbiAKMDAwMDcyOTQ3MSAwMDAwMCBuIAowMDAwNzI5NjExIDAwMDAwIG4gCjAwMDA3Mjk3NTMgMDAwMDAgbiAKMDAwMDcyOTgzNSAwMDAwMCBuIAowMDAwNzI5OTc1IDAwMDAwIG4gCjAwMDA3MzAxMTcgMDAwMDAgbiAKMDAwMDczMDE5OSAwMDAwMCBuIAowMDAwNzMwMzM5IDAwMDAwIG4gCjAwMDA3MzA0ODEgMDAwMDAgbiAKMDAwMDczMDU2MyAwMDAwMCBuIAowMDAwNzMwNzAzIDAwMDAwIG4gCjAwMDA3MzA4NDIgMDAwMDAgbiAKMDAwMDczMDkyNCAwMDAwMCBuIAowMDAwNzMxMDY0IDAwMDAwIG4gCjAwMDA3MzEyMDYgMDAwMDAgbiAKMDAwMDczMTI4OCAwMDAwMCBuIAowMDAwNzMxNDI4IDAwMDAwIG4gCjAwMDA3MzE1NzAgMDAwMDAgbiAKMDAwMDczMTY1MiAwMDAwMCBuIAowMDAwNzMxNzkxIDAwMDAwIG4gCjAwMDA3MzE5MzMgMDAwMDAgbiAKMDAwMDczMjAxNSAwMDAwMCBuIAowMDAwNzMyMTU1IDAwMDAwIG4gCjAwMDA3MzIyOTcgMDAwMDAgbiAKMDAwMDczMjM3OSAwMDAwMCBuIAowMDAwNzMyNTE5IDAwMDAwIG4gCjAwMDA3MzI2NjEgMDAwMDAgbiAKMDAwMDczMjc0MyAwMDAwMCBuIAowMDAwNzMyODgzIDAwMDAwIG4gCjAwMDA3MzMwMjUgMDAwMDAgbiAKMDAwMDczMzEwNiAwMDAwMCBuIAowMDAwNzMzMjQ2IDAwMDAwIG4gCjAwMDA3MzMzODggMDAwMDAgbiAKMDAwMDczMzQ2OCAwMDAwMCBuIAowMDAwNzMzNjA3IDAwMDAwIG4gCjAwMDA3MzM3NDkgMDAwMDAgbiAKMDAwMDczMzgyOSAwMDAwMCBuIAowMDAwNzMzOTY4IDAwMDAwIG4gCjAwMDA3MzQxMTAgMDAwMDAgbiAKMDAwMDczNDE5MCAwMDAwMCBuIAowMDAwNzM0MzI5IDAwMDAwIG4gCjAwMDA3MzQ0NjkgMDAwMDAgbiAKMDAwMDczNDU0OSAwMDAwMCBuIAowMDAwNzM0Njg4IDAwMDAwIG4gCjAwMDA3MzQ4MzAgMDAwMDAgbiAKMDAwMDczNDkxMCAwMDAwMCBuIAowMDAwNzM1MDUwIDAwMDAwIG4gCjAwMDA3MzUxODkgMDAwMDAgbiAKMDAwMDczNTI2OSAwMDAwMCBuIAowMDAwNzM1NDA4IDAwMDAwIG4gCjAwMDA3MzU1NTAgMDAwMDAgbiAKMDAwMDc1MTIwMSAwMDAwMCBuIAowMDAwNzUxMjI0IDAwMDAwIG4gCjAwMDA3NTE0ODcgMDAwMDAgbiAKMDAwMDc2MTM3MiAwMDAwMCBuIAowMDAwNzYxNDcwIDAwMDAwIG4gCjAwMDA3NjE2MzUgMDAwMDAgbiAKMDAwMDc2MjAyMiAwMDAwMCBuIAowMDAwNzYyNTA4IDAwMDAwIG4gCjAwMDA3NjI3NzcgMDAwMDAgbiAKMDAwMDc3MTk3NyAwMDAwMCBuIAowMDAwNzcyMDc1IDAwMDAwIG4gCjAwMDA3NzIyNDQgMDAwMDAgbiAKMDAwMDc3MjU1OSAwMDAwMCBuIAowMDAwNzcyOTYwIDAwMDAwIG4gCjAwMDA3NzMyMjEgMDAwMDAgbiAKMDAwMDc4OTcwMSAwMDAwMCBuIAowMDAwNzg5ODA3IDAwMDAwIG4gCjAwMDA3ODk5NjggMDAwMDAgbiAKMDAwMDc5MDUyMCAwMDAwMCBuIAowMDAwNzkxMTc0IDAwMDAwIG4gCjAwMDA3OTE0NDAgMDAwMDAgbiAKMDAwMDgwNjEzNCAwMDAwMCBuIAowMDAwODA2MjM0IDAwMDAwIG4gCjAwMDA4MDY0MDAgMDAwMDAgbiAKMDAwMDgwNjg4NiAwMDAwMCBuIAowMDAwODA3NDY4IDAwMDAwIG4gCjAwMDA4MDc0OTAgMDAwMDAgbiAKMDAwMDgwNzUxMCAwMDAwMCBuIAowMDAwODA3NTMxIDAwMDAwIG4gCjAwMDA4MDc1NTMgMDAwMDAgbiAKMDAwMDgwNzU3MyAwMDAwMCBuIAowMDAwODA3NTk0IDAwMDAwIG4gCjAwMDA4MDc2MTcgMDAwMDAgbiAKMDAwMDgwNzYzNyAwMDAwMCBuIAowMDAwODA3NjU4IDAwMDAwIG4gCjAwMDA4MDc2ODEgMDAwMDAgbiAKMDAwMDgwNzcwMSAwMDAwMCBuIAp0cmFpbGVyCjw8CiAgL1Jvb3QgMiAwIFIKICAvSW5mbyA0IDAgUgogIC9JRCBbPEYwN0E3MjcxNzgxRTkwOURCODAwNkM3QjZDOTY5MDM2PiA8RjA3QTcyNzE3ODFFOTA5REI4MDA2QzdCNkM5NjkwMzY+XQogIC9TaXplIDU4NAo+PgpzdGFydHhyZWYKODEwNTA2CiUlRU9GCg==